Skip to content

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.

Deletes · 4Final · 2

21 tools: 4 can delete or cancel things, 2 do something that can't be undone and 15 only read.

Scanned Oct 21, 2026

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/mcp

Findings

Matches of fixed checks, with the text they matched.

2 warn
  • The server marks "printful_calculate_shipping_rates" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true}; The input addresses people (input.recipient): what it sends cannot be taken back.

    What this check looks for
  • The server marks "printful_estimate_order_costs" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true}; The input addresses people (input.recipient): what it sends cannot be taken back.

    What this check looks for

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".

      Matched text

      annotations: {"readOnlyHint":true}; The input addresses people (input.recipient): what it sends cannot be taken back.

      What this check looks for
    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".

      Matched text

      annotations: {"readOnlyHint":true}; The input addresses people (input.recipient): what it sends cannot be taken back.

      What this check looks for
    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/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.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.