MCP server for Claude Desktop / Claude Web providing integration with Printify print-on-demand platform for managing shops, products, catalog, images, and orders.
The Printify MCP server demonstrates solid definition quality with consistent naming conventions, reasonable descriptions, and proper JSON Schema for all 16 tools. Tool names follow verb_noun patterns (list_*, get_*, create_*, update_*, delete_*, publish_*, upload_*, submit_*) which are clear and self-documenting. All tools have descriptions between 50-350 characters, falling within the production baseline (p10=34, p90=392). All parameters include type definitions and descriptions. However, several tools have underdeveloped schemas with generic 'object' types for complex data (create_product, update_product, publish_product, upload_image), and output schemas are not documented. Error handling is present but basic, the @handle_errors decorator returns error dicts but lacks recovery guidance or actionable next steps for LLMs. The server lacks tool annotations (readOnlyHint, destructiveHint, idempotentHint despite having clearly marked risk levels), which would improve protocol compliance and LLM planning. Parameter descriptions could be more actionable (e.g., create_product 'data' param is vague, what are the exact required fields?). Overall, this is a well-structured server that would benefit from schema refinement, tool annotations, and better error messaging.
Create a new product. Requires title, blueprint_id, print_provider_id, variants, and print_areas.
Delete a product from the shop.
Get details for a specific blueprint including available images and description.
Get detailed order information including line items and shipping status.
List print providers available for a specific blueprint.
Get detailed product info including mockup image URLs. Key fields: 'visible' (active on channel), 'external' (sales channel reference with listing id), 'is_locked' (locked during publish). A product with 'external.id' is published to the channel.
Vague object schemas for complex inputs. Tools like create_product, update_product, publish_product, and upload_image accept a generic 'data' or 'contents' object parameter without documenting required/optional fields, nested structure, or constraints. This forces LLMs to guess field names and types, increasing error rates.
No output schemas documented. Tools return responses but the structure of results (fields, types, pagination hints) is not specified. LLMs cannot predict what data they'll receive, forcing them to parse responses reactively. The Printify API likely returns complex nested objects, but the descriptions do not explain which fields are included or their types.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 79 | 2026-07-28+ | v2 |
| 2026-03-09 | C | 64 | - | v1 |
Get details for a specific shop by ID.
List variants (sizes, colors) for a blueprint and print provider combination.
List all available product blueprints (templates) from Printify catalog.
List orders in a shop. Supports pagination. If shop_id is omitted, uses the default shop.
List products in a shop. Supports pagination. If shop_id is omitted, uses the default shop. Note on publish status: There is no 'is_published' field. To determine if a product is published to a sales channel, check: (1) 'external' object exists and has an 'id' = listed on the channel, (2) 'visible' = true means the listing is active/visible on the channel.
List all Printify shops in your account.
Publish a product to sales channels. Data should specify which fields to publish (title, description, images, variants, tags).
Send an order to production. This action cannot be undone.
Update an existing product's properties.
Upload an image to Printify. Provide either a URL or base64-encoded contents.
Missing tool annotations. The server explicitly marks tool risk levels (READ_ONLY, WRITE, DESTRUCTIVE, IRREVERSIBLE) but does not expose these via MCP tool annotations (readOnlyHint, destructiveHint, idempotentHint). This prevents MCP clients from understanding operation safety and planning accordingly.
Insufficient error guidance. The @handle_errors wrapper in src/tools/_error_handler.py returns error status codes and messages but does not provide recovery actions. When an LLM receives 'Product not found', it has no hint whether to call list_products() or ask the user for clarification.
Sparse parameter descriptions in mutation tools. update_product describes 'data' as 'Updated product data' (23 chars) but does not explain which fields are mutable, what values they accept, or which are required. Similarly, publish_product's 'data' param lacks detail on what 'publishing configuration' means or which fields to include.
No confirmation/dry-run for irreversible operations. submit_order and delete_product are marked IRREVERSIBLE and DESTRUCTIVE but accept no dry_run or confirm_before_execute parameters. An LLM could accidentally submit an order or delete a product without safeguards.