Print on demand for AI agents. No sign-up. Picture, words or logo on a tee, hoodie or tote.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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.
order_id returned by purchase.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
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.
| Argument | Type | Description |
|---|---|---|
| reason | string | |
| order_id* | string | order_id returned by purchase. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"order_id"
],
"properties": {
"reason": {
"type": "string",
"maxLength": 500
},
"order_id": {
"type": "string",
"description": "order_id returned by purchase."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| size | string | |
| color* | string | Product colour, e.g. "black". |
| style | string | flat: quick placement drawing. packshot: product photo with the exact print at real size (where a product photo exists). |
| preset | string | Named position inside the placement, e.g. "center_chest", "left_chest", "full_front". Defaults to the placement default. |
| top_mm | number | Distance from the top of the print area to the top of the artwork. |
| left_mm | number | Distance from the left edge of the print area. Default: horizontally centred. |
| width_mm | number | Exact printed width of the visible artwork in millimetres. Height follows the aspect ratio. |
| height_mm | number | Maximum printed height in millimetres. |
| placement | string | Print location on the product, e.g. "front" or "back". See get_product for the list. |
| artwork_id* | string | |
| product_id* | string |
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.
| Argument | Type | Description |
|---|---|---|
| order_id* | string | order_id returned by purchase. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"order_id"
],
"properties": {
"order_id": {
"type": "string",
"description": "order_id returned by purchase."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| product_id* | string | Product id from search_products, e.g. "tee-heavyweight". |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"product_id"
],
"properties": {
"product_id": {
"type": "string",
"description": "Product id from search_products, e.g. \"tee-heavyweight\"."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| orders | array | 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 | string | quote_id returned by quote, for one parcel. Set quote_id or orders, not both. |
| recipient | object | 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 | string | Short message for the packing slip of a gift. Not printed yet: the answer says so. |
| contact_email | string | 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* | boolean | Must be true: confirms the customer owns or is licensed to print all submitted artwork, and that it is not prohibited content. |
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.
| Argument | Type | Description |
|---|---|---|
| buyer | object | Only for a company purchase with an invoice. Business checkout is not open yet: the quote charges destination VAT. |
| items* | array | |
| speed | string | Shipping speed. Only standard is offered now; express returns a note and a standard quote. |
| purpose | string | What the order is for. Set it only if the user already said it. Do not ask for it. |
| ship_to* | object | Destination. country_code is required; postal_code and state_code improve shipping accuracy. |
| currency | string | ISO 4217 currency of the payer, e.g. "USD". Optional. The quote states the currency that it uses. |
| deliver_by | string | 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. |
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.
| Argument | Type | Description |
|---|---|---|
| size | string | Only products available in this size, e.g. "XL". |
| color | string | Only products available in this colour, e.g. "black". |
| query | string | Free-text description, e.g. "heavyweight black t-shirt" or "hoodie". |
| category | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"size": {
"type": "string",
"description": "Only products available in this size, e.g. \"XL\"."
},
"color": {
"type": "string",
"description": "Only products available in this colour, e.g. \"black\"."
},
"query": {
"type": "string",
"maxLength": 200,
"description": "Free-text description, e.g. \"heavyweight black t-shirt\" or \"hoodie\"."
},
"category": {
"enum": [
"t-shirt",
"long-sleeve",
"sweatshirt",
"hoodie",
"tote-bag"
],
"type": "string"
}
}
}Carrier, tracking number and tracking link for each shipment of an order, and the delivery estimate.
| Argument | Type | Description |
|---|---|---|
| order_id* | string | order_id returned by purchase. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"order_id"
],
"properties": {
"order_id": {
"type": "string",
"description": "order_id returned by purchase."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| file | object | A file that your client gives you as a file object (for example in ChatGPT). |
| size | string | Garment size, e.g. "XL". Print areas can differ by size; without it the smallest size is checked. |
| color | string | Product colour, for the contrast check. |
| preset | string | Named position inside the placement, e.g. "center_chest", "left_chest", "full_front". Defaults to the placement default. |
| top_mm | number | Distance from the top of the print area to the top of the artwork. |
| artwork | object | New artwork to upload: exactly one of svg, base64 or url. |
| left_mm | number | Distance from the left edge of the print area. Default: horizontally centred. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"artwork_id",
"product_id",
"color"
],
"properties": {
"size": {
"type": "string"
},
"color": {
"type": "string",
"description": "Product colour, e.g. \"black\"."
},
"style": {
"enum": [
"flat",
"packshot"
],
"type": "string",
"default": "flat",
"description": "flat: quick placement drawing. packshot: product photo with the exact print at real size (where a product photo exists)."
},
"preset": {
"type": "string",
"description": "Named position inside the placement, e.g. \"center_chest\", \"left_chest\", \"full_front\". Defaults to the placement default."
},
"top_mm": {
"type": "number",
"maximum": 1000,
"minimum": 0,
"description": "Distance from the top of the print area to the top of the artwork."
},
"left_mm": {
"type": "number",
"maximum": 1000,
"minimum": 0,
"description": "Distance from the left edge of the print area. Default: horizontally centred."
},
"width_mm": {
"type": "number",
"maximum": 1000,
"description": "Exact printed width of the visible artwork in millimetres. Height follows the aspect ratio.",
"exclusiveMinimum": 0
},
"height_mm": {
"type": "number",
"maximum": 1000,
"description": "Maximum printed height in millimetres.",
"exclusiveMinimum": 0
},
"placement": {
"type": "string",
"default": "front",
"description": "Print location on the product, e.g. \"front\" or \"back\". See get_product for the list."
},
"artwork_id": {
"type": "string"
},
"product_id": {
"type": "string"
}
}
}| payment_capabilities | array | 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. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"rights_attestation"
],
"properties": {
"orders": {
"type": "array",
"items": {
"type": "object",
"required": [
"quote_id",
"recipient"
],
"properties": {
"quote_id": {
"type": "string",
"description": "quote_id returned by quote."
},
"recipient": {
"type": "object",
"required": [
"name",
"address1",
"city",
"postal_code",
"country_code"
],
"properties": {
"city": {
"type": "string",
"maxLength": 60,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Full name of the recipient."
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "Recipient email, for carrier delivery notices only. Never used for receipts. For a gift, leave it empty unless the recipient agrees."
},
"phone": {
"type": "string",
"maxLength": 30
},
"company": {
"type": "string",
"maxLength": 100
},
"address1": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Street and house number."
},
"address2": {
"type": "string",
"maxLength": 100,
"description": "Apartment, floor, etc."
},
"state_code": {
"type": "string",
"maxLength": 10,
"description": "State or province code. Required for US, CA and AU."
},
"postal_code": {
"type": "string",
"maxLength": 20,
"minLength": 1
},
"country_code": {
"type": "string",
"maxLength": 2,
"minLength": 2,
"description": "ISO 3166-1 alpha-2 country code, e.g. CZ, DE, US."
}
},
"description": "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."
}
}
},
"maxItems": 50,
"minItems": 2,
"description": "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": {
"type": "string",
"description": "quote_id returned by quote, for one parcel. Set quote_id or orders, not both."
},
"recipient": {
"type": "object",
"required": [
"postal_code",
"country_code"
],
"properties": {
"city": {
"type": "string",
"maxLength": 60,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Full name of the recipient."
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "Recipient email, for carrier delivery notices only. Never used for receipts. For a gift, leave it empty unless the recipient agrees."
},
"phone": {
"type": "string",
"maxLength": 30
},
"company": {
"type": "string",
"maxLength": 100
},
"address1": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Street and house number."
},
"address2": {
"type": "string",
"maxLength": 100,
"description": "Apartment, floor, etc."
},
"state_code": {
"type": "string",
"maxLength": 10,
"description": "State or province code. Required for US, CA and AU."
},
"postal_code": {
"type": "string",
"maxLength": 20,
"minLength": 1
},
"country_code": {
"type": "string",
"maxLength": 2,
"minLength": 2,
"description": "ISO 3166-1 alpha-2 country code, e.g. CZ, DE, US."
}
},
"description": "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": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Short message for the packing slip of a gift. Not printed yet: the answer says so."
},
"contact_email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "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": {
"type": "boolean",
"const": true,
"description": "Must be true: confirms the customer owns or is licensed to print all submitted artwork, and that it is not prohibited content."
},
"payment_capabilities": {
"type": "array",
"items": {
"enum": [
"hosted_checkout",
"x402",
"mpp"
],
"type": "string"
},
"default": [
"hosted_checkout"
],
"description": "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."
}
}
}| preference |
| string |
| How AgentMade picks the manufacturing route: fewest_packages (default: fewest parcels, then best price among the fastest routes), cheapest, or fastest. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"items",
"ship_to"
],
"properties": {
"buyer": {
"type": "object",
"required": [
"company_name"
],
"properties": {
"vat_id": {
"type": "string",
"maxLength": 20,
"description": "EU or UK VAT number with the country prefix, e.g. \"DE123456789\"."
},
"company_name": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Registered company name for the invoice."
}
},
"description": "Only for a company purchase with an invoice. Business checkout is not open yet: the quote charges destination VAT."
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"product_id",
"color",
"size",
"artwork"
],
"properties": {
"size": {
"type": "string",
"description": "Size, e.g. \"XL\". For one-size products use \"ONE SIZE\" (\"ONE\" also works)."
},
"color": {
"type": "string",
"description": "Colour id or name, e.g. \"black\"."
},
"artwork": {
"type": "array",
"items": {
"type": "object",
"required": [
"artwork_id"
],
"properties": {
"preset": {
"type": "string",
"description": "Named position inside the placement, e.g. \"center_chest\", \"left_chest\", \"full_front\". Defaults to the placement default."
},
"top_mm": {
"type": "number",
"maximum": 1000,
"minimum": 0,
"description": "Distance from the top of the print area to the top of the artwork."
},
"left_mm": {
"type": "number",
"maximum": 1000,
"minimum": 0,
"description": "Distance from the left edge of the print area. Default: horizontally centred."
},
"width_mm": {
"type": "number",
"maximum": 1000,
"description": "Exact printed width of the visible artwork in millimetres. Height follows the aspect ratio.",
"exclusiveMinimum": 0
},
"height_mm": {
"type": "number",
"maximum": 1000,
"description": "Maximum printed height in millimetres.",
"exclusiveMinimum": 0
},
"placement": {
"type": "string",
"default": "front",
"description": "Print location on the product, e.g. \"front\" or \"back\". See get_product for the list."
},
"artwork_id": {
"type": "string",
"description": "artwork_id returned by validate_artwork."
}
}
},
"maxItems": 4,
"minItems": 1,
"description": "One entry per print placement. Each placement may appear once per item."
},
"quantity": {
"type": "integer",
"default": 1,
"maximum": 50,
"minimum": 1
},
"product_id": {
"type": "string",
"description": "Product id from search_products, e.g. \"tee-heavyweight\"."
}
}
},
"maxItems": 10,
"minItems": 1
},
"speed": {
"enum": [
"standard",
"express"
],
"type": "string",
"default": "standard",
"description": "Shipping speed. Only standard is offered now; express returns a note and a standard quote."
},
"purpose": {
"enum": [
"gift",
"personal",
"group",
"work",
"event",
"sample"
],
"type": "string",
"description": "What the order is for. Set it only if the user already said it. Do not ask for it."
},
"ship_to": {
"type": "object",
"required": [
"country_code"
],
"properties": {
"city": {
"type": "string",
"maxLength": 60
},
"state_code": {
"type": "string",
"maxLength": 10
},
"postal_code": {
"type": "string",
"maxLength": 20
},
"country_code": {
"type": "string",
"maxLength": 2,
"minLength": 2
}
},
"description": "Destination. country_code is required; postal_code and state_code improve shipping accuracy."
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "ISO 4217 currency of the payer, e.g. \"USD\". Optional. The quote states the currency that it uses."
},
"deliver_by": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "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": {
"enum": [
"fewest_packages",
"cheapest",
"fastest"
],
"type": "string",
"default": "fewest_packages",
"description": "How AgentMade picks the manufacturing route: fewest_packages (default: fewest parcels, then best price among the fastest routes), cheapest, or fastest."
}
}
}| width_mm | number | Exact printed width of the visible artwork in millimetres. Height follows the aspect ratio. |
| height_mm | number | Maximum printed height in millimetres. |
| placement | string | Print location on the product, e.g. "front" or "back". See get_product for the list. |
| artwork_id | string | Re-validate artwork uploaded earlier, or validate the file of an upload link. |
| product_id* | string | Product to print on. |
| upload_link | boolean | 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. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"product_id"
],
"properties": {
"file": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "Client file id."
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string",
"format": "uri",
"description": "Temporary HTTPS link to the file."
}
},
"description": "A file that your client gives you as a file object (for example in ChatGPT)."
},
"size": {
"type": "string",
"description": "Garment size, e.g. \"XL\". Print areas can differ by size; without it the smallest size is checked."
},
"color": {
"type": "string",
"description": "Product colour, for the contrast check."
},
"preset": {
"type": "string",
"description": "Named position inside the placement, e.g. \"center_chest\", \"left_chest\", \"full_front\". Defaults to the placement default."
},
"top_mm": {
"type": "number",
"maximum": 1000,
"minimum": 0,
"description": "Distance from the top of the print area to the top of the artwork."
},
"artwork": {
"type": "object",
"properties": {
"svg": {
"type": "string",
"minLength": 1,
"description": "Inline SVG markup. Best for logos and text."
},
"url": {
"type": "string",
"format": "uri",
"description": "Public HTTPS URL of a PNG, JPEG or SVG file."
},
"base64": {
"type": "string",
"minLength": 1,
"description": "Base64-encoded PNG, JPEG or SVG file contents, no data: prefix. Only for files up to about 2 MB; for larger files use url, file or upload_link."
},
"filename": {
"type": "string",
"maxLength": 200
}
},
"description": "New artwork to upload: exactly one of svg, base64 or url."
},
"left_mm": {
"type": "number",
"maximum": 1000,
"minimum": 0,
"description": "Distance from the left edge of the print area. Default: horizontally centred."
},
"width_mm": {
"type": "number",
"maximum": 1000,
"description": "Exact printed width of the visible artwork in millimetres. Height follows the aspect ratio.",
"exclusiveMinimum": 0
},
"height_mm": {
"type": "number",
"maximum": 1000,
"description": "Maximum printed height in millimetres.",
"exclusiveMinimum": 0
},
"placement": {
"type": "string",
"default": "front",
"description": "Print location on the product, e.g. \"front\" or \"back\". See get_product for the list."
},
"artwork_id": {
"type": "string",
"description": "Re-validate artwork uploaded earlier, or validate the file of an upload link."
},
"product_id": {
"type": "string",
"description": "Product to print on."
},
"upload_link": {
"type": "boolean",
"const": true,
"description": "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."
}
}
}