AgentMade Print on Demand
Server Details
Print on demand for AI agents. No sign-up. Picture, words or logo on a tee, hoodie or tote.
- Status
- Healthy
- Uptime
- 100.0% over 22 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- alexmensak/agentmade-print-on-demand
- GitHub Stars
- 0
TDQS
Scored across 9 tools
Each tool has a clearly distinct purpose: search_products and get_product differ by browse-vs-detail, get_order vs track_order differ by status-vs-shipment-tracking, and quote/purchase/validate_artwork/create_mockup/cancel_order each own a unique step in the flow. Descriptions reinforce the boundaries so misselection is unlikely.
The set follows a clean verb_noun pattern (cancel_order, create_mockup, get_order, get_product, search_products, track_order, validate_artwork). Only purchase and quote are single-word verbs, a minor deviation that stays readable.
Nine tools map neatly onto the print-on-demand lifecycle (discover, validate, price, order, track, cancel, preview), with no filler or redundancy. Well-scoped for the domain.
The surface covers the full order lifecycle from product search through validation, quoting, purchasing, tracking and cancellation, plus mockups. Minor gap: no list-orders/account tool for retrieving prior orders, though the single-order flow is otherwise complete.
Available Tools
9 toolscancel_orderCancel an orderADestructiveIdempotentInspect
Cancel an order. Unpaid: closes the payment link; nothing is charged. Paid and not yet in production: cancels and refunds in full. In production or shipped: cannot be cancelled; the error gives the reason. A second call on a cancelled order is safe.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | ||
| order_id | Yes | order_id returned by purchase. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| total | Yes | |
| status | Yes | |
| payment | Yes | |
| order_id | Yes | A bearer key: whoever has it can read and cancel the order. Do not share it publicly. |
| quote_id | Yes | |
| timeline | Yes | |
| next_step | Yes | What the agent should do next, in plain language. |
| order_url | Yes | The order page. The person sees the status there. |
| shipments | Yes | |
| destination | Yes | While address_needed: the quoted destination. |
| status_reason | Yes | |
| address_needed | Yes | True when purchase had no street address: the person enters it on the order page before paying. |
| delivery_estimate_business_days | Yes | Null when the order ended (cancelled, refunded, rejected, expired or delivered). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint and idempotentHint, yet the description adds real substance beyond them: the financial side effects (nothing charged vs. full refund), the failure mode and that the error carries the reason, and the reinforcement that a repeat call on an already-cancelled order is safe. This is the kind of consequence-level detail an agent needs for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action and then ordered by the states an agent will encounter. There is no filler and every clause carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is unnecessary, and the description fully covers the behavioral contract: preconditions, side effects, error semantics, and idempotency. Nothing an agent needs in order to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%, and the description compensates for none of the gap: it never mentions order_id or reason. The undocumented 'reason' string (maxLength 500) is left entirely unexplained in both schema and description, so the agent must guess its purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Cancel an order') and then enumerates the exact outcomes by order state, so an agent immediately knows what the tool does. It is unambiguously distinct from read-oriented siblings like get_order, track_order, and get_product.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit when/when-not decision table: unpaid orders close the payment link, paid-but-not-in-production orders are cancelled and refunded, and orders in production or shipped cannot be cancelled at all. This tells the agent precisely the conditions under which calling the tool is appropriate versus futile.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_mockupCreate a preview mockupAIdempotentInspect
Render a preview PNG of the artwork on the product in the chosen colour and placement. style flat draws the placement; style packshot uses a product photo with the exact print at real size, or gives the flat preview with a note when no photo exists. Returns mockup_url, blank_image_url and image_prompt (an optional text prompt for an illustration of a person who wears the product; such an image is an illustration, not the exact print). Optional.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | ||
| color | Yes | Product colour, e.g. "black". | |
| style | No | flat: quick placement drawing. packshot: product photo with the exact print at real size (where a product photo exists). | flat |
| preset | No | Named position inside the placement, e.g. "center_chest", "left_chest", "full_front". Defaults to the placement default. | |
| top_mm | No | Distance from the top of the print area to the top of the artwork. | |
| left_mm | No | Distance from the left edge of the print area. Default: horizontally centred. | |
| width_mm | No | Exact printed width of the visible artwork in millimetres. Height follows the aspect ratio. | |
| height_mm | No | Maximum printed height in millimetres. | |
| placement | No | Print location on the product, e.g. "front" or "back". See get_product for the list. | front |
| artwork_id | Yes | ||
| product_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| style | Yes | |
| summary | Yes | |
| mockup_url | Yes | PNG preview of the exact print on the product. |
| image_prompt | Yes | A prompt for your own image model, to make an illustration from mockup_url. |
| blank_image_url | Yes | |
| validation_status | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: the packshot degradation to a flat preview with a note when no product photo exists, and the caveat that image_prompt yields an illustration of a person rather than the exact print. It does not say whether anything is persisted or how long rendering takes, keeping it at 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core is front-loaded in three dense sentences that each carry information about rendering, style behaviour and outputs. The orphaned trailing fragment "Optional." is ambiguous, adds no clear meaning, and slightly undercuts an otherwise tight structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 11 parameters, an output schema, and annotation coverage, the description supplies what the structured fields cannot: the style trade-offs, the no-photo fallback, and the interpretation of the returned prompt. Missing are any prerequisites or ordering relative to validate_artwork and purchase, plus clarification of the dangling "Optional.", so it is not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 73% and the schema already documents colour, style, preset and the mm offsets. The description still adds meaning by distinguishing the two style enum values beyond the schema text ("flat draws the placement" vs "packshot uses a product photo with the exact print at real size") and by flagging the person-illustration nuance for image_prompt. Geographic/positioning parameters are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource: "Render a preview PNG of the artwork on the product in the chosen colour and placement." That clearly separates it from siblings like validate_artwork or get_product, which do not produce an image. It does not explicitly name a sibling to route against, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the two style modes (flat vs packshot) and the packshot fallback when no photo exists, which implies how to choose between them. However, it never states when this tool should be invoked in the workflow (e.g. after validate_artwork, before purchase), and the trailing fragment "Optional." gives no actionable condition. Usage is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_orderGet order statusCRead-onlyIdempotentInspect
Current order status (AWAITING_PAYMENT, PAID, SUBMITTED, IN_PRODUCTION, SHIPPED, DELIVERED or an exception state), next_step in plain language, the payment link while unpaid, shipments and a timeline.
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | order_id returned by purchase. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| total | Yes | |
| status | Yes | |
| payment | Yes | |
| order_id | Yes | A bearer key: whoever has it can read and cancel the order. Do not share it publicly. |
| quote_id | Yes | |
| timeline | Yes | |
| next_step | Yes | What the agent should do next, in plain language. |
| order_url | Yes | The order page. The person sees the status there. |
| shipments | Yes | |
| destination | Yes | While address_needed: the quoted destination. |
| status_reason | Yes | |
| address_needed | Yes | True when purchase had no street address: the person enters it on the order page before paying. |
| delivery_estimate_business_days | Yes | Null when the order ended (cancelled, refunded, rejected, expired or delivered). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already fully declare the safety profile (readOnlyHint, idempotentHint, non-destructive, closed-world), so the description need not repeat that. It does add real context about the returned content — the exact status enum values, plain-language next_step, and a payment link only while unpaid — which helps an agent read the result, though this is largely return-value narrative.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with no padding, and it opens with the most important concept (current order status). It loses a point for being a verbless fragment whose content is return-value detail an agent may not need before deciding to call the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description did not need to enumerate return fields, and it spends its entire budget doing exactly that. The genuinely missing piece — how this differs from track_order and when to prefer each — is absent, leaving the definition adequate but incomplete for a multi-sibling order domain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter with 100% schema description coverage ('order_id returned by purchase.'), so the schema already carries the semantics. The description adds nothing about the parameter; per the high-coverage baseline this is a 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is a noun phrase enumerating what the response contains (status states, next_step, payment link, shipments, timeline) rather than stating a verb+resource purpose. An agent can infer retrieval of a single order's state, but nothing distinguishes it from the sibling track_order, which likely reports overlapping shipment information.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance at all — no statement of when to call get_order versus track_order, cancel_order, or purchase. The clause 'the payment link while unpaid' hints at a use case but is a return-value note, not routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_productGet product detailsBRead-onlyIdempotentInspect
Full details for one product: colours with hex codes and product photos (images: url, view, style, alt; empty when none yet; ai_generated marks AI photos), sizes, variant ids, print placements with the print area in mm, placement presets (for example center_chest, left_chest, full_front, full_back), materials and artwork guidance.
| Name | Required | Description | Default |
|---|---|---|---|
| product_id | Yes | Product id from search_products, e.g. "tee-heavyweight". |
Output Schema
| Name | Required | Description |
|---|---|---|
| brand | Yes | |
| model | Yes | |
| sizes | Yes | Size values to pass as size. |
| title | Yes | |
| colors | Yes | |
| category | Yes | |
| variants | Yes | |
| image_url | Yes | A product photo, or null when none is approved yet. |
| next_step | Yes | What the agent should do next, in plain language. |
| placements | Yes | |
| product_id | Yes | Use in get_product, validate_artwork and quote. |
| description | Yes | |
| size_chart_cm | Yes | |
| artwork_guidance | Yes | |
| decoration_method | Yes | |
| printed_in_regions | Yes | Regions where this product is printed, e.g. ["EU", "US"]. |
| production_business_days | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the full safety profile (readOnly, idempotent, openWorld=false, non-destructive), so the descriptor's job is supplementary. It adds a small behavioral note ('empty when none yet', 'ai_generated marks AI photos'), but most of the text restates return-value shape that the output schema already carries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the opening clause, and the field list is dense but informative. The parenthetical image sub-fields (url, view, style, alt) push it toward output-schema territory, making it slightly over-packed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, complete annotations, and a fully described single parameter, the definition covers what an agent needs to call it correctly. The missing piece is usage guidance – when to reach for this vs search_products or quote – but for a simple read it is close to sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and schema description coverage is 100% – the schema already explains product_id with an example. The description adds no additional syntax, format, or sourcing guidance beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Full details for one product') and goes further by enumerating the fields returned. It implicitly contrasts with the listing-oriented search_products, but never names a sibling to route the agent explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, prerequisites, or alternatives are given. The agent must infer that this is the detail-fetch follow-up to search_products from the parameter hint alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purchasePlace the order and get the payment linkAIdempotentInspect
Turn a quote into an order. Needs quote_id, the full recipient address (it must match the quoted destination) and rights_attestation=true. contact_email is the payer's own email, never the gift recipient's. Returns order_id and payment.url: the order page where the person pays by card, Apple Pay or Google Pay. Nothing is printed until the payment is confirmed. Idempotent per quote_id.
| Name | Required | Description | Default |
|---|---|---|---|
| orders | No | Many parcels with one payment: one quote_id and one recipient per parcel. Not live yet: call purchase once per quote_id for now. | |
| quote_id | No | quote_id returned by quote, for one parcel. Set quote_id or orders, not both. | |
| recipient | No | Shipping address. Country, state and postal code must match the quote destination. Send the full address when you have it. If you cannot collect the street address, send only country_code, postal_code (and state_code for US, CA and AU): the person then enters the address on the order page before paying. Required with quote_id. | |
| gift_message | No | Short message for the packing slip of a gift. Not printed yet: the answer says so. | |
| contact_email | No | Email of the payer, for the order confirmation and the payment receipt. Not the recipient's email: for a gift, the recipient must not see the price. Optional. | |
| rights_attestation | Yes | Must be true: confirms the customer owns or is licensed to print all submitted artwork, and that it is not prohibited content. | |
| payment_capabilities | No | Payment methods the calling agent can use. "hosted_checkout" = a link that the person opens to pay by card, Apple Pay or Google Pay. Always supported. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| notes | Yes | |
| total | Yes | |
| status | Yes | |
| payment | Yes | |
| order_id | Yes | A bearer key: whoever has it can read and cancel the order. Do not share it publicly. |
| quote_id | Yes | |
| timeline | Yes | |
| next_step | Yes | What the agent should do next, in plain language. |
| order_url | Yes | The order page. The person sees the status there. |
| shipments | Yes | |
| destination | Yes | While address_needed: the quoted destination. |
| status_reason | Yes | |
| address_needed | Yes | True when purchase had no street address: the person enters it on the order page before paying. |
| delivery_estimate_business_days | Yes | Null when the order ended (cancelled, refunded, rejected, expired or delivered). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real value beyond annotations: 'Nothing is printed until the payment is confirmed' and the payment-link flow (card/Apple Pay/Google Pay) are behavioral facts not in the structured fields. The idempotency statement refines idempotentHint=true by scoping it per quote_id. The openWorldHint and destructiveHint=false are left unelaborated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: the core action leads, followed by required inputs, the email nuance, the return value, and the payment-confirmation constraint. Every sentence carries information and none is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the return mention (order_id, payment.url) is bonus rather than required, and the description covers preconditions, payment flow, and printing timing. The multi-order 'orders' array path is left entirely to the schema, which is acceptable but slightly thins the guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter, including the contact_email and address-matching rules the description restates. The description adds little param-level meaning beyond what the schema carries, so the baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Turn a quote into an order') and positions it relative to the quote sibling that must precede it. An agent can immediately tell this is the quote-to-order conversion step, distinct from quote, get_order, or cancel_order.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear preconditions (needs quote_id, address must match quoted destination, rights_attestation=true) and clarifies the contact_email vs recipient email distinction. It implies the quote-first workflow but never explicitly names quote as the required predecessor or states when NOT to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quoteGet a delivered price quoteAInspect
Price printed items delivered to one destination. Returns quote_id, the total that the payer pays (products, shipping and VAT where AgentMade collects it), what is not included, the delivery estimate and the expiry. Needs artwork_id values from validate_artwork. Charges nothing. For a destination where orders are not open, the quote is for information only.
| Name | Required | Description | Default |
|---|---|---|---|
| buyer | No | Only for a company purchase with an invoice. Business checkout is not open yet: the quote charges destination VAT. | |
| items | Yes | ||
| speed | No | Shipping speed. Only standard is offered now; express returns a note and a standard quote. | standard |
| purpose | No | What the order is for. Set it only if the user already said it. Do not ask for it. | |
| ship_to | Yes | Destination. country_code is required; postal_code and state_code improve shipping accuracy. | |
| currency | No | ISO 4217 currency of the payer, e.g. "USD". Optional. The quote states the currency that it uses. | |
| deliver_by | No | Date by which the parcel should arrive, e.g. "2026-12-20". The quote is never refused because of it: if the estimate is later, the quote says so. | |
| preference | No | How AgentMade picks the manufacturing route: fewest_packages (default: fewest parcels, then best price among the fastest routes), cheapest, or fastest. | fewest_packages |
Output Schema
| Name | Required | Description |
|---|---|---|
| tax | Yes | |
| items | Yes | |
| notes | Yes | Things to tell the user before purchase. |
| status | Yes | |
| totals | Yes | total_minor is the full amount that the payer pays. Show total_formatted to the user. products_minor and shipping_minor are before VAT; tax_minor is the VAT included in the total, or 0 when tax is not collected. |
| ship_to | Yes | |
| currency | Yes | |
| packages | Yes | |
| quote_id | Yes | Use in purchase before expires_at. |
| shipping | Yes | |
| next_step | Yes | What the agent should do next, in plain language. |
| expires_at | Yes | |
| assumptions | Yes | |
| package_count | Yes | |
| purchase_open | Yes | False when this destination does not take orders yet or the quote expired. Then do not call purchase. |
| delivery_estimate_dates | Yes | Calendar dates (YYYY-MM-DD) for the delivery estimate. Tell the user these dates. |
| delivery_estimate_business_days | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-destructive and non-idempotent, and the description adds genuinely non-obvious behavior: it charges nothing, the quote expires, and it degrades to information-only for closed destinations. It does not cover rate limits or whether expired quotes are reusable, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, each load-bearing (scope, return fields, prerequisite, no charge, closed-destination caveat), with the core purpose and the 'charges nothing' reassurance front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the description still usefully names the key returned fields, plus the no-charge and expiry semantics an agent needs to set user expectations. For an 8-param nested tool with enums, this is close to complete; only the ordering relationship with purchase is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 88%, with detailed inline docs for items, artwork, ship_to and each enum, so the schema already carries the parameter burden. The description only re-states the artwork_id -> validate_artwork linkage and the VAT-collection nuance, adding little that the schema does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Price printed items delivered to one destination') and immediately distinguishes itself from the purchase sibling with 'Charges nothing'. The scope (single destination, delivered pricing) is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear prerequisite workflow ('Needs artwork_id values from validate_artwork'), which routes the agent to the correct upstream sibling. It also carves out the informational-only case when orders aren't open, but never explicitly says to call this before purchase, leaving the primary sequencing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_productsSearch printable productsARead-onlyIdempotentInspect
Use this when the user wants their own picture, words or logo printed on a T-shirt, hoodie, sweatshirt or tote bag and delivered, as a gift or for themselves. Finds products by free text, category, colour and size. Returns product_id, image_url (a product photo, or null), colours, sizes and print placements. No account needed. Not for mugs, posters, caps, stickers or embroidery.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | Only products available in this size, e.g. "XL". | |
| color | No | Only products available in this colour, e.g. "black". | |
| query | No | Free-text description, e.g. "heavyweight black t-shirt" or "hoodie". | |
| category | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| count | Yes | |
| products | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, non-destructive and non-open-world behaviour, so the safety profile is covered. The description adds genuinely new context: the exact return fields (product_id, image_url possibly null, colours, sizes, print placements) and the no-auth requirement. It stops short of disclosing pagination or result-count limits, which matters for a search tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: trigger first, then capability, then return shape, then constraints. The return-field enumeration duplicates the tool's output schema, which is a small redundancy in an otherwise tight four-sentence description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool with an output schema, this covers everything an agent needs: when to invoke it, what it filters on, what comes back, and what it does not cover. Nothing required for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The sentence 'Finds products by free text, category, colour and size' maps cleanly onto the four parameters, and schema coverage is 75%, so the schema already does most of the work with examples for size, color and query. No extra syntax, matching behaviour or guidance on how the filters combine is added, so this is baseline territory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Finds products') and immediately scopes it to custom-printed apparel (T-shirt, hoodie, sweatshirt, tote bag). The trailing exclusion list ('Not for mugs, posters, caps, stickers or embroidery') separates it from get_product and other catalogue siblings without the agent needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit trigger ('Use this when the user wants their own picture, words or logo printed ... and delivered'), then gives an explicit when-not list of excluded product types. It also notes 'No account needed', removing an auth prerequisite question. Only the absence of a named sibling alternative keeps this just shy of ideal, but the intent routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
track_orderTrack shipmentBRead-onlyIdempotentInspect
Carrier, tracking number and tracking link for each shipment of an order, and the delivery estimate.
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | order_id returned by purchase. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| order_id | Yes | |
| next_step | Yes | What the agent should do next, in plain language. |
| order_url | Yes | |
| shipments | Yes | |
| tracking_available | Yes | |
| delivery_estimate_business_days | Yes | Null when the order ended (cancelled, refunded, rejected, expired or delivered). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, idempotentHint=true, destructiveHint=false and a closed-world scope, so the safety profile is fully covered. The description contributes only the fact that results are per-shipment (an order can have multiple) — useful granularity, but it does not cover error behavior for unknown order_ids or the empty-shipment case.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tight sentence with no filler, and the returned fields are front-loaded. The comma-heavy fragment structure ('...of an order, and the delivery estimate') slightly obscures that this is an action, but there is no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single fully documented required parameter, an output schema covering return values, and annotations covering safety semantics, the description is nearly complete for this simple retrieval tool. Only error/empty-result behavior is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema description coverage ('order_id returned by purchase'), the schema carries the semantic load, so baseline 3 applies. The description text never mentions order_id or how to source it, adding nothing beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact payload (carrier, tracking number, tracking link, delivery estimate) scoped to each shipment of an order, which is specific enough to distinguish it from get_order or purchase. It lacks an explicit verb ('Get/Retrieve'), reading as a bare noun phrase, but the resource and scope are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus siblings like get_order (order status/details) or cancel_order. An agent must infer that this is the post-purchase tracking lookup; no prerequisites, alternatives, or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_artworkUpload and validate artworkAInspect
Upload artwork and check that it prints well on one product placement. Send exactly one of: artwork with svg (markup, best for text and logos), base64 (a PNG, JPEG or SVG file up to about 2 MB, no data: prefix) or url (a public HTTPS link to the file); file (a file object from your client); or upload_link:true when you cannot send the file in this call. Returns artwork_id and PASS/WARN/FAIL checks: print size in mm, resolution (DPI), print and safe area, transparent background, contrast with the product colour. For photos and AI images use preset center_chest. Use the artwork_id in quote.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | A file that your client gives you as a file object (for example in ChatGPT). | |
| size | No | Garment size, e.g. "XL". Print areas can differ by size; without it the smallest size is checked. | |
| color | No | Product colour, for the contrast check. | |
| preset | No | Named position inside the placement, e.g. "center_chest", "left_chest", "full_front". Defaults to the placement default. | |
| top_mm | No | Distance from the top of the print area to the top of the artwork. | |
| artwork | No | New artwork to upload: exactly one of svg, base64 or url. | |
| left_mm | No | Distance from the left edge of the print area. Default: horizontally centred. | |
| width_mm | No | Exact printed width of the visible artwork in millimetres. Height follows the aspect ratio. | |
| height_mm | No | Maximum printed height in millimetres. | |
| placement | No | Print location on the product, e.g. "front" or "back". See get_product for the list. | front |
| artwork_id | No | Re-validate artwork uploaded earlier, or validate the file of an upload link. | |
| product_id | Yes | Product to print on. | |
| upload_link | No | Set true when you cannot send the file in this call. The answer gives an artwork_id and a one-time upload_url: upload with curl, or give the link to the person. Then call validate_artwork with the artwork_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| artwork | No | |
| next_step | Yes | What the agent should do next, in plain language. |
| artwork_id | No | Only in the upload_link answer: the reserved id for the file. |
| expires_at | No | |
| upload_url | No | Only in the upload_link answer: the one-time upload link. |
| validation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnly=false, destructive=false, openWorld=true, idempotent=false) already signal a non-destructive but externally-touching write. The description adds real behavioral context beyond them: the PASS/WARN/FAIL check set, the returned artwork_id, the ~2 MB size ceiling, and the two-step upload_link flow with a one-time upload_url. It does not mention permissions, rate limits, or whether a re-validation with artwork_id overwrites prior state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the one-of input constraint, followed by return semantics and usage hints; every sentence carries information. It is dense and the semicolon-chained input list is slightly cramped, but there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter tool with nested objects and an output schema, the description covers the input-mode decision, size limits, preset positioning, the deferred-upload flow, and the summary of returned checks. With the output schema present, it need not detail return values further, and nothing an agent needs to invoke this correctly seems missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, giving a baseline of 3, and the description adds meaning the schema cannot express: the mutual-exclusion rule across artwork.svg/base64/url within the nested object, the no-data:-prefix and size caveats, and the concrete preset example (center_chest for photos and AI images). It is above baseline, though size/color/placement units and defaults are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb pair and resource – 'Upload artwork and check that it prints well on one product placement' – and the rest of the text clarifies the validation scope (print size, DPI, print/safe area, transparency, contrast). An agent can distinguish this from siblings like create_mockup or quote without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit input-selection rules ('Send exactly one of: svg, base64 or url; file; or upload_link:true') and states when-not conditions (base64 only for files up to ~2 MB, upload_link only 'when you cannot send the file in this call'), plus downstream routing ('Use the artwork_id in quote'). It never compares against sibling tools such as create_mockup, so tool-level alternatives are left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
- First observed
cancel_order - First observed
create_mockup - First observed
get_order - First observed
get_product - First observed
purchase - First observed
quote - First observed
search_products - First observed
track_order - First observed
validate_artwork
Related MCP Connectors
Print-on-demand catalog, listings, and fulfillment for AI agents.
Put any picture on a shirt, hoodie, cap, tumbler or tote; get the link where the person buys it.
Shop all-over print cotton tees with your AI agent: search, cart, promos, checkout. Human pays.
- mcpOAuthai.crayonz
Design custom apparel from chat: AI art on tees and hoodies, then a checkout link to buy.
Related MCP Servers
AlicenseBqualityAmaintenanceRun a custom-merchandise store end to end from an AI agent: generate designs, build products with mockups and margin-safe pricing, list them on Shopify, WooCommerce, Wix and TikTok Shop, and route orders to Printful, Printify or Gelato for fulfillment.1291,571 npmMIT
OpenPrints MCPofficial
AlicenseNot gradedqualityDmaintenanceEnables AI agents to browse products, upload designs, place print orders, track shipments, and manage account balance via natural language.2 npmMIT- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to run a print-on-demand store by creating products on Printify, pricing from production cost, publishing to Shopify and its sales channels, and generating ad creative from mockups.1ISC
- AlicenseAqualityCmaintenanceSimple and free publishing of content on the web for AI Agents27,661 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.