Printful MCP by usefulapi
by usefulapi.io · remote · no sign-in to list tools · v1.16.3 · published by io.usefulapi
Browse the Printful catalog, orders, shipping quotes and stats, and create draft orders and mockups.
21 tools: 4 can delete or cancel things, 2 do something that can't be undone and 15 only read.
Scanned Oct 21, 2026
- Deletes or cancels4Claude Code: deny: see these tools
- Can't be undone2Claude Code: ask: see these tools
- Changes things0Claude Code: ask
- Only reads15Claude Code: allow: see these tools
2 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http printful https://printful.usefulapi.io/mcpFindings
Matches of fixed checks, with the text they matched.
The server marks "printful_calculate_shipping_rates" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true}; The input addresses people (input.recipient): what it sends cannot be taken back.
The server marks "printful_estimate_order_costs" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true}; The input addresses people (input.recipient): what it sends cannot be taken back.
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
21 tools
Deletes or cancels 4Claude Code: deny
printful_add_fileAdd a print file to the File Library from a public URL (PNG/JPG recommended).No findings
Why it is in this group
- The name "printful_add_file" says "add": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Add a print file to the File Library from a public URL (PNG/JPG recommended). If a file with the same URL already exists it is returned instead. Processing is async — poll printful_get_file until status is ok. Printful: POST /files.
Annotations the server declares
- title: Add a file to the File Library
- destructiveHint: true
printful_create_draft_orderCreate an order as a DRAFT — nothing is charged or produced.No findings
Why it is in this group
- The name "printful_create_draft_order" says "create": a word for a change.
- The input addresses people (input.recipient): what it sends cannot be taken back.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Create an order as a DRAFT — nothing is charged or produced. It must be confirmed later in the Printful dashboard, where the charge is shown. Each item needs one of variant_id (+ files), sync_variant_id, external_variant_id, warehouse_product_variant_id or product_template_id (+ variant_id). Printful: POST /orders (never with confirm).
Annotations the server declares
- title: Create a draft order
- destructiveHint: true
printful_create_mockup_taskStart generating product mockups for a design on a catalog product — returns a task_key; poll printful_get_mockup_task for the images.No findings
Why it is in this group
- The name "printful_create_mockup_task" says "create": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Start generating product mockups for a design on a catalog product — returns a task_key; poll printful_get_mockup_task for the images. Heavily rate-limited (about 10/min for established stores, 2/min for new ones). Printful: POST /mockup-generator/create-task/{id}.
Annotations the server declares
- title: Create a mockup generation task
- destructiveHint: true
printful_update_draft_orderChange a DRAFT order (unsubmitted orders only) — send only the fields to change.No findings
Why it is in this group
- The name "printful_update_draft_order" says "update": a word for a change.
- The input addresses people (input.recipient): what it sends cannot be taken back.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Change a DRAFT order (unsubmitted orders only) — send only the fields to change. CAUTION: if you send `items`, it replaces the list: existing items not included (by id or external_id) are removed. The order stays a draft; nothing is charged. Printful: PUT /orders/{id} (never with confirm).
Annotations the server declares
- title: Update a draft order
- destructiveHint: true
Can't be undone 2Claude Code: ask
printful_calculate_shipping_ratesQuote the shipping options (method id, name, rate, delivery-day estimate) for a set of items to an address.1 finding
Why it is in this group
- The input addresses people (input.recipient): what it sends cannot be taken back.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "printful_calculate_shipping_rates" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true}; The input addresses people (input.recipient): what it sends cannot be taken back.
Description, as the server wrote it Quote the shipping options (method id, name, rate, delivery-day estimate) for a set of items to an address. Only country_code is required (plus state_code for US/CA/AU). Changes nothing. Printful: POST /shipping/rates.
Annotations the server declares
- title: Calculate shipping rates
- readOnlyHint: true
printful_estimate_order_costsPrice an order WITHOUT creating it: item, print, shipping and tax costs, plus retail totals.1 finding
Why it is in this group
- The input addresses people (input.recipient): what it sends cannot be taken back.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "printful_estimate_order_costs" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true}; The input addresses people (input.recipient): what it sends cannot be taken back.
Description, as the server wrote it Price an order WITHOUT creating it: item, print, shipping and tax costs, plus retail totals. Same item shape as printful_create_draft_order. Changes nothing. Printful: POST /orders/estimate-costs.
Annotations the server declares
- title: Estimate order costs
- readOnlyHint: true
Only reads 15Claude Code: allow
printful_get_catalog_productFetch one catalog product with ALL its variants (size, color, variant_id, price, stock).No findings
Why it is in this group
- The name "printful_get_catalog_product" says "get": a word for reading.
Description, as the server wrote it Fetch one catalog product with ALL its variants (size, color, variant_id, price, stock). Use the variant_id values when quoting shipping or building an order. Printful: GET /products/{id}.
Annotations the server declares
- title: Get a catalog product
- readOnlyHint: true
printful_get_catalog_variantFetch one catalog variant and its parent product.No findings
Why it is in this group
- The name "printful_get_catalog_variant" says "get": a word for reading.
Description, as the server wrote it Fetch one catalog variant and its parent product. Printful: GET /products/variant/{id}.
Annotations the server declares
- title: Get a catalog variant
- readOnlyHint: true
printful_get_fileFetch one File Library entry — processing status (ok / waiting / failed), dimensions, DPI and preview URLs.No findings
Why it is in this group
- The name "printful_get_file" says "get": a word for reading.
Description, as the server wrote it Fetch one File Library entry — processing status (ok / waiting / failed), dimensions, DPI and preview URLs. Poll this after printful_add_file. Printful: GET /files/{id}.
Annotations the server declares
- title: Get a file
- readOnlyHint: true
printful_get_mockup_taskCheck a mockup-generation task: status (pending / completed / failed) and, when done, the mockup image URLs per placement and variant.No findings
Why it is in this group
- The name "printful_get_mockup_task" says "get": a word for reading.
Description, as the server wrote it Check a mockup-generation task: status (pending / completed / failed) and, when done, the mockup image URLs per placement and variant. Printful: GET /mockup-generator/task.
Annotations the server declares
- title: Get a mockup task result
- readOnlyHint: true
printful_get_orderFetch one order: status, recipient, items, costs, and shipments with carrier and tracking links — the answer to 'where is my order?'.No findings
Why it is in this group
- The name "printful_get_order" says "get": a word for reading.
Description, as the server wrote it Fetch one order: status, recipient, items, costs, and shipments with carrier and tracking links — the answer to 'where is my order?'. Printful: GET /orders/{id}.
Annotations the server declares
- title: Get an order
- readOnlyHint: true
printful_get_printfilesList the print areas (placements) and required print-file pixel sizes/DPI for each variant of a catalog product — what a design must match before mockups or orders.No findings
Why it is in this group
- The name "printful_get_printfiles" says "get": a word for reading.
Description, as the server wrote it List the print areas (placements) and required print-file pixel sizes/DPI for each variant of a catalog product — what a design must match before mockups or orders. DTG is assumed unless technique is given. Printful: GET /mockup-generator/printfiles/{id}.
Annotations the server declares
- title: Get printfile specs for a product
- readOnlyHint: true
printful_get_statisticsSales, costs, profit and order-count reports for a period of at most 6 months.No findings
Why it is in this group
- The name "printful_get_statistics" says "get": a word for reading.
Description, as the server wrote it Sales, costs, profit and order-count reports for a period of at most 6 months. Printful: GET /reports/statistics.
Annotations the server declares
- title: Get store statistics
- readOnlyHint: true
printful_get_store_productFetch one product of a Manual-order / API store with all its Sync Variants — catalog variant, print files, retail price.No findings
Why it is in this group
- The name "printful_get_store_product" says "get": a word for reading.
Description, as the server wrote it Fetch one product of a Manual-order / API store with all its Sync Variants — catalog variant, print files, retail price. For a Shopify, Etsy, WooCommerce or other integrated store use printful_get_sync_product instead. Printful: GET /store/products/{id}.
Annotations the server declares
- title: Get a store product (Manual/API store)
- readOnlyHint: true
printful_get_sync_productFetch one product imported from an integrated store (Shopify, Etsy, WooCommerce…) with all its Sync Variants — catalog variant, print files, retail price, sync status.No findings
Why it is in this group
- The name "printful_get_sync_product" says "get": a word for reading.
Description, as the server wrote it Fetch one product imported from an integrated store (Shopify, Etsy, WooCommerce…) with all its Sync Variants — catalog variant, print files, retail price, sync status. Ids come from printful_list_sync_products. Printful: GET /sync/products/{id}.
Annotations the server declares
- title: Get a synced product (integrated store)
- readOnlyHint: true
printful_list_catalog_categoriesList Printful's catalog categories (T-shirts, Mugs, Posters…) with their ids and parent ids — the filter for printful_list_catalog_products.No findings
Why it is in this group
- The name "printful_list_catalog_categories" says "list": a word for reading.
Description, as the server wrote it List Printful's catalog categories (T-shirts, Mugs, Posters…) with their ids and parent ids — the filter for printful_list_catalog_products. Printful: GET /categories.
Annotations the server declares
- title: List catalog categories
- readOnlyHint: true
printful_list_catalog_productsList the blank products Printful can print on (id, title, brand, model, variant count, print-file placements), optionally filtered by category.No findings
Why it is in this group
- The name "printful_list_catalog_products" says "list": a word for reading.
Description, as the server wrote it List the blank products Printful can print on (id, title, brand, model, variant count, print-file placements), optionally filtered by category. Printful: GET /products.
Annotations the server declares
- title: List catalog products
- readOnlyHint: true
printful_list_ordersList the store's orders, newest first, optionally by status (draft, pending, failed, canceled, inprocess, onhold, partial, fulfilled, archived).No findings
Why it is in this group
- The name "printful_list_orders" says "list": a word for reading.
Description, as the server wrote it List the store's orders, newest first, optionally by status (draft, pending, failed, canceled, inprocess, onhold, partial, fulfilled, archived). Printful: GET /orders.
Annotations the server declares
- title: List orders
- readOnlyHint: true
printful_list_store_productsList the Sync Products in a Manual-order / API store.No findings
Why it is in this group
- The name "printful_list_store_products" says "list": a word for reading.
Description, as the server wrote it List the Sync Products in a Manual-order / API store. For a Shopify, Etsy, WooCommerce or other integrated store use printful_list_sync_products instead. Printful: GET /store/products.
Annotations the server declares
- title: List store products (Manual/API store)
- readOnlyHint: true
printful_list_storesList the stores this token can reach (id, name, platform type).No findings
Why it is in this group
- The name "printful_list_stores" says "list": a word for reading.
Description, as the server wrote it List the stores this token can reach (id, name, platform type). A cheap way to confirm the token works, and where to find the store_id an ACCOUNT-level token needs. Printful: GET /stores.
Annotations the server declares
- title: List stores
- readOnlyHint: true
printful_list_sync_productsList the products Printful has imported from an integrated store (Shopify, Etsy, WooCommerce…), with how many variants are synced.No findings
Why it is in this group
- The name "printful_list_sync_products" says "list": a word for reading.
Description, as the server wrote it List the products Printful has imported from an integrated store (Shopify, Etsy, WooCommerce…), with how many variants are synced. Filter by status=unsynced to find products that still need a design or catalog variant. Printful: GET /sync/products.
Annotations the server declares
- title: List synced products (integrated store)
- readOnlyHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 1.16.3. Values in angle brackets are yours to fill in.
claude mcp add --transport http printful https://printful.usefulapi.io/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__printful__printful_list_stores",
"mcp__printful__printful_list_catalog_categories",
"mcp__printful__printful_list_catalog_products",
"mcp__printful__printful_get_catalog_product",
"mcp__printful__printful_get_catalog_variant",
"mcp__printful__printful_list_store_products",
"mcp__printful__printful_get_store_product",
"mcp__printful__printful_list_sync_products",
"mcp__printful__printful_get_sync_product",
"mcp__printful__printful_list_orders",
"mcp__printful__printful_get_order",
"mcp__printful__printful_get_file",
"mcp__printful__printful_get_printfiles",
"mcp__printful__printful_get_mockup_task",
"mcp__printful__printful_get_statistics"
],
"ask": [
"mcp__printful__printful_calculate_shipping_rates",
"mcp__printful__printful_estimate_order_costs"
],
"deny": [
"mcp__printful__printful_create_draft_order",
"mcp__printful__printful_update_draft_order",
"mcp__printful__printful_add_file",
"mcp__printful__printful_create_mockup_task"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as printful. Review it before you use it.