Check print-ready PDFs for free and order professional printing: flyers, cards, posters, apparel.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
A printsi guest key, which owns your files and orders. Free, no sign-up: POST https://printsi-api-live.magnus-ahmad.workers.dev/v1/guests returns one. Not needed to browse the catalogue.
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.
Check a delivery address: the contiguous US + DC, or Hong Kong; no PO boxes or military addresses.
Delivery address: a JSON file, inline JSON, or - for stdin. As an object: US {name, line1, city, state, postal_code}; Hong Kong {name, line1, district, area, phone, email, country: "HK"}.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http printsi https://printsi-api-live.magnus-ahmad.workers.dev/mcp
Headers
Authorization (optional, not in the config above): A printsi guest key, which owns your files and orders. Free, no sign-up: POST https://printsi-api-live.magnus-ahmad.workers.dev/v1/guests returns one. Not needed to browse the catalogue.Check a delivery address: the contiguous US + DC, or Hong Kong; no PO boxes or military addresses.
| Argument | Type | Description |
|---|---|---|
| ship_to* | object | Delivery address: a JSON file, inline JSON, or - for stdin. As an object: US {name, line1, city, state, postal_code}; Hong Kong {name, line1, district, area, phone, email, country: "HK"}. |
{
"type": "object",
"required": [
"ship_to"
],
"properties": {
"ship_to": {
"type": "object",
"description": "Delivery address: a JSON file, inline JSON, or - for stdin. As an object: US {name, line1, city, state, postal_code}; Hong Kong {name, line1, district, area, phone, email, country: \"HK\"}.",
"additionalProperties": true
}
},
"additionalProperties": false
}What printsi can print, where it delivers, and which operations exist. No credential needed.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Free preflight: checks a PDF against a product's print requirements and returns previews with issues marked. Creates no order and needs no address or payment; the file is stored for the check.
| Argument | Type | Description |
|---|---|---|
| pdf* | string | The print-ready PDF, as an https URL it can be downloaded from (at most 32 MB), or the id (fil_…) of a file sent before. |
| fold | string | number | Filter by fold. |
| size | string | number | Filter by size. |
| sides | string | number | Filter by sides. |
| stock | string | number | Filter by stock. |
| finish | string | number | Filter by finish. |
| option | array | Filter by any option, as key=value. Repeatable. |
| product* | string | number | Product id or alias, e.g. flyer. |
| all_issues | boolean | Return every issue instead of up to 3 per code. |
| orientation | string | number | Filter by orientation. |
{
"type": "object",
"required": [
"pdf",
"product"
],
"properties": {
"pdf": {
"type": "string",
"description": "The print-ready PDF, as an https URL it can be downloaded from (at most 32 MB), or the id (fil_…) of a file sent before."
},
"fold": {
"type": [
"string",
"number"
],
"description": "Filter by fold."
},
"size": {
"type": [
"string",
"number"
],
"description": "Filter by size."
},
"sides": {
"type": [
"string",
"number"
],
"description": "Filter by sides."
},
"stock": {
"type": [
"string",
"number"
],
"description": "Filter by stock."
},
"finish": {
"type": [
"string",
"number"
],
"description": "Filter by finish."
},
"option": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter by any option, as key=value. Repeatable."
},
"product": {
"type": [
"string",
"number"
],
"description": "Product id or alias, e.g. flyer."
},
"all_issues": {
"type": "boolean",
"description": "Return every issue instead of up to 3 per code."
},
"orientation": {
"type": [
"string",
"number"
],
"description": "Filter by orientation."
}
},
"additionalProperties": false
}Send feedback about printsi: what worked, what didn't, what you wish it did. Goes straight to the people building it.
| Argument | Type | Description |
|---|---|---|
| order | string | number | The order it's about (ord_…), if any. |
| rating | string | number | Optional 1–5. |
| message* | string | number | The feedback (10–4000 characters). |
{
"type": "object",
"required": [
"message"
],
"properties": {
"order": {
"type": [
"string",
"number"
],
"description": "The order it's about (ord_…), if any."
},
"rating": {
"type": [
"string",
"number"
],
"description": "Optional 1–5."
},
"message": {
"type": [
"string",
"number"
],
"description": "The feedback (10–4000 characters)."
}
},
"additionalProperties": false
}Cancel an unpaid order. A paid order has gone to the printer and can't be canceled.
| Argument | Type | Description |
|---|---|---|
| order* | string | Order id (ord_…). |
| reason | string | number | Why, for the record. |
{
"type": "object",
"required": [
"order"
],
"properties": {
"order": {
"type": "string",
"description": "Order id (ord_…)."
},
"reason": {
"type": [
"string",
"number"
],
"description": "Why, for the record."
}
},
"additionalProperties": false
}Create an unpaid draft order with quotes: uploads and checks the PDF, validates the address and returns a quote per shipping method. Nothing is bought; use order_purchase for that.
| Argument | Type | Description |
|---|---|---|
| qty* | string | number | Quantity; must be one the product offers. |
| file* | string | Print-ready PDF, as an https URL it can be downloaded from (at most 32 MB), or the id (fil_…) of a file sent before. |
| fold | string | number | Filter by fold. |
| note | string | number | Your note, kept on the order. |
| size | string | number | Filter by size. |
| sides | string | number | Filter by sides. |
| stock | string | number | Filter by stock. |
| finish | string | number | Filter by finish. |
| option | array | Filter by any option, as key=value. Repeatable. |
| pickup | string | number | Collect from a pickup point instead of door delivery: a pkp_… id from `pickup-points`, "nearest", or "door" to switch back. |
| product* | string | number | Product id or alias, e.g. flyer. |
| ship_to* | object | Delivery address: a JSON file, inline JSON, or - for stdin. As an object: US {name, line1, city, state, postal_code}; Hong Kong {name, line1, district, area, phone, email, country: "HK"}. |
| max_total | string | number | Budget in the order's currency (USD, in the US and Hong Kong), e.g. 450; quotes above it are flagged. |
| client_ref | string | number | Your reference; re-running create with the same one returns the same order. |
| deliver_by | string | number | Deadline (YYYY-MM-DD); used to rank quotes, never a guarantee. |
| orientation | string | number | Filter by orientation. |
{
"type": "object",
"required": [
"file",
"product",
"qty",
"ship_to"
],
"properties": {
"qty": {
"type": [
"string",
"number"
],
"description": "Quantity; must be one the product offers."
},
"file": {
"type": "string",
"description": "Print-ready PDF, as an https URL it can be downloaded from (at most 32 MB), or the id (fil_…) of a file sent before."
},
"fold": {
"type": [
"string",
"number"
],
"description": "Filter by fold."
},
"note": {
"type": [
"string",
"number"
],
"description": "Your note, kept on the order."
},
"size": {
"type": [
"string",
"number"
],
"description": "Filter by size."
},
"sides": {
"type": [
"string",
"number"
],
"description": "Filter by sides."
},
"stock": {
"type": [
"string",
"number"
],
"description": "Filter by stock."
},
"finish": {
"type": [
"string",
"number"
],
"description": "Filter by finish."
},
"option": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter by any option, as key=value. Repeatable."
},
"pickup": {
"type": [
"string",
"number"
],
"description": "Collect from a pickup point instead of door delivery: a pkp_… id from `pickup-points`, \"nearest\", or \"door\" to switch back."
},
"product": {
"type": [
"string",
"number"
],
"description": "Product id or alias, e.g. flyer."
},
"ship_to": {
"type": "object",
"description": "Delivery address: a JSON file, inline JSON, or - for stdin. As an object: US {name, line1, city, state, postal_code}; Hong Kong {name, line1, district, area, phone, email, country: \"HK\"}.",
"additionalProperties": true
},
"max_total": {
"type": [
"string",
"number"
],
"description": "Budget in the order's currency (USD, in the US and Hong Kong), e.g. 450; quotes above it are flagged."
},
"client_ref": {
"type": [
"string",
"number"
],
"description": "Your reference; re-running create with the same one returns the same order."
},
"deliver_by": {
"type": [
"string",
"number"
],
"description": "Deadline (YYYY-MM-DD); used to rank quotes, never a guarantee."
},
"orientation": {
"type": [
"string",
"number"
],
"description": "Filter by orientation."
}
},
"additionalProperties": false
}The order's history: revisions, checks, quotes and status changes.
| Argument | Type | Description |
|---|---|---|
| order* | string | Order id (ord_…). |
{
"type": "object",
"required": [
"order"
],
"properties": {
"order": {
"type": "string",
"description": "Order id (ord_…)."
}
},
"additionalProperties": false
}Orders you own, plus orders this machine holds tokens for.
| Argument | Type | Description |
|---|---|---|
| limit | string | number | Maximum to return (default 20). |
| status | string | number | active, all, or a status. |
{
"type": "object",
"required": [],
"properties": {
"limit": {
"type": [
"string",
"number"
],
"description": "Maximum to return (default 20)."
},
"status": {
"type": [
"string",
"number"
],
"description": "active, all, or a status."
}
},
"additionalProperties": false
}Request a purchase of a quote. Charges nothing: returns an approval link for the user to review and pay on Stripe's page. The card is held, and charged only once the printer accepts.
| Argument | Type | Description |
|---|---|---|
| order* | string | Order id (ord_…). |
| quote* | string | number | The quote to buy (qte_…), usually recommended_quote_id. |
| max_total | string | number | Refuse if the total is above this, in the order's currency (USD, e.g. 450). |
{
"type": "object",
"required": [
"order",
"quote"
],
"properties": {
"order": {
"type": "string",
"description": "Order id (ord_…)."
},
"quote": {
"type": [
"string",
"number"
],
"description": "The quote to buy (qte_…), usually recommended_quote_id."
},
"max_total": {
"type": [
"string",
"number"
],
"description": "Refuse if the total is above this, in the order's currency (USD, e.g. 450)."
}
},
"additionalProperties": false
}Get fresh quotes for the order as it stands (e.g. after quotes expired).
| Argument | Type | Description |
|---|---|---|
| order* | string | Order id (ord_…). |
{
"type": "object",
"required": [
"order"
],
"properties": {
"order": {
"type": "string",
"description": "Order id (ord_…)."
}
},
"additionalProperties": false
}An order's status, spec, file check, address and quotes.
| Argument | Type | Description |
|---|---|---|
| order* | string | Order id (ord_…). |
| include | string | number | Extra detail, e.g. issues. |
{
"type": "object",
"required": [
"order"
],
"properties": {
"order": {
"type": "string",
"description": "Order id (ord_…)."
},
"include": {
"type": [
"string",
"number"
],
"description": "Extra detail, e.g. issues."
}
},
"additionalProperties": false
}Change an order's file, options, quantity, address, deadline or budget. Content changes re-check and re-quote.
| Argument | Type | Description |
|---|---|---|
| qty | string | number | New quantity. |
| file | string | Replacement PDF, as an https URL it can be downloaded from (at most 32 MB), or the id (fil_…) of a file sent before. |
| fold | string | number | Filter by fold. |
| note | string | number | Your note, kept on the order. |
| size | string | number | Filter by size. |
| order* | string | Order id (ord_…). |
| sides | string | number | Filter by sides. |
| stock | string | number | Filter by stock. |
| finish | string | number | Filter by finish. |
| option | array | Filter by any option, as key=value. Repeatable. |
| pickup | string | number | Collect from a pickup point instead of door delivery: a pkp_… id from `pickup-points`, "nearest", or "door" to switch back. |
| product | string | number | Change the product. |
| ship_to | object | Delivery address: a JSON file, inline JSON, or - for stdin. As an object: US {name, line1, city, state, postal_code}; Hong Kong {name, line1, district, area, phone, email, country: "HK"}. |
| max_total | string | number | Budget in the order's currency (USD, in the US and Hong Kong), e.g. 450; quotes above it are flagged. |
| deliver_by | string | number | Deadline (YYYY-MM-DD); used to rank quotes, never a guarantee. |
| orientation | string | number | Filter by orientation. |
{
"type": "object",
"required": [
"order"
],
"properties": {
"qty": {
"type": [
"string",
"number"
],
"description": "New quantity."
},
"file": {
"type": "string",
"description": "Replacement PDF, as an https URL it can be downloaded from (at most 32 MB), or the id (fil_…) of a file sent before."
},
"fold": {
"type": [
"string",
"number"
],
"description": "Filter by fold."
},
"note": {
"type": [
"string",
"number"
],
"description": "Your note, kept on the order."
},
"size": {
"type": [
"string",
"number"
],
"description": "Filter by size."
},
"order": {
"type": "string",
"description": "Order id (ord_…)."
},
"sides": {
"type": [
"string",
"number"
],
"description": "Filter by sides."
},
"stock": {
"type": [
"string",
"number"
],
"description": "Filter by stock."
},
"finish": {
"type": [
"string",
"number"
],
"description": "Filter by finish."
},
"option": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter by any option, as key=value. Repeatable."
},
"pickup": {
"type": [
"string",
"number"
],
"description": "Collect from a pickup point instead of door delivery: a pkp_… id from `pickup-points`, \"nearest\", or \"door\" to switch back."
},
"product": {
"type": [
"string",
"number"
],
"description": "Change the product."
},
"ship_to": {
"type": "object",
"description": "Delivery address: a JSON file, inline JSON, or - for stdin. As an object: US {name, line1, city, state, postal_code}; Hong Kong {name, line1, district, area, phone, email, country: \"HK\"}.",
"additionalProperties": true
},
"max_total": {
"type": [
"string",
"number"
],
"description": "Budget in the order's currency (USD, in the US and Hong Kong), e.g. 450; quotes above it are flagged."
},
"deliver_by": {
"type": [
"string",
"number"
],
"description": "Deadline (YYYY-MM-DD); used to rank quotes, never a guarantee."
},
"orientation": {
"type": [
"string",
"number"
],
"description": "Filter by orientation."
}
},
"additionalProperties": false
}Wait until the order reaches a state. Exits 9 on timeout; call again to keep waiting.
| Argument | Type | Description |
|---|---|---|
| for | string | number | Target: quoted, change, paid, accepted, shipped, ready_for_pickup, delivered. |
| order* | string | Order id (ord_…). |
| timeout | number | Seconds to wait, at most 120 (default 25). |
{
"type": "object",
"required": [
"order"
],
"properties": {
"for": {
"type": [
"string",
"number"
],
"description": "Target: quoted, change, paid, accepted, shipped, ready_for_pickup, delivered."
},
"order": {
"type": "string",
"description": "Order id (ord_…)."
},
"timeout": {
"type": "number",
"description": "Seconds to wait, at most 120 (default 25)."
}
},
"additionalProperties": false
}Pickup points (lockers, shops) near a street address, closest first, where the printer offers them.
| Argument | Type | Description |
|---|---|---|
| limit | string | number | How many to list (1–20, default 5). |
| ship_to* | object | Delivery address: a JSON file, inline JSON, or - for stdin. As an object: US {name, line1, city, state, postal_code}; Hong Kong {name, line1, district, area, phone, email, country: "HK"}. |
{
"type": "object",
"required": [
"ship_to"
],
"properties": {
"limit": {
"type": [
"string",
"number"
],
"description": "How many to list (1–20, default 5)."
},
"ship_to": {
"type": "object",
"description": "Delivery address: a JSON file, inline JSON, or - for stdin. As an object: US {name, line1, city, state, postal_code}; Hong Kong {name, line1, district, area, phone, email, country: \"HK\"}.",
"additionalProperties": true
}
},
"additionalProperties": false
}List product families.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Options, defaults, quantities and file requirements for one product.
| Argument | Type | Description |
|---|---|---|
| qty | string | number | Check a quantity against what the printer offers (needs a region, or a size that implies one). |
| fold | string | number | Filter by fold. |
| size | string | number | Filter by size. |
| sides | string | number | Filter by sides. |
| stock | string | number | Filter by stock. |
| finish | string | number | Filter by finish. |
| option | array | Filter by any option, as key=value. Repeatable. |
| region | string | number | Only this region's options, quantities and file rules: US or HK. |
| product* | string | Product id or alias, e.g. flyer or brochure. |
| orientation | string | number | Filter by orientation. |
{
"type": "object",
"required": [
"product"
],
"properties": {
"qty": {
"type": [
"string",
"number"
],
"description": "Check a quantity against what the printer offers (needs a region, or a size that implies one)."
},
"fold": {
"type": [
"string",
"number"
],
"description": "Filter by fold."
},
"size": {
"type": [
"string",
"number"
],
"description": "Filter by size."
},
"sides": {
"type": [
"string",
"number"
],
"description": "Filter by sides."
},
"stock": {
"type": [
"string",
"number"
],
"description": "Filter by stock."
},
"finish": {
"type": [
"string",
"number"
],
"description": "Filter by finish."
},
"option": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter by any option, as key=value. Repeatable."
},
"region": {
"type": [
"string",
"number"
],
"description": "Only this region's options, quantities and file rules: US or HK."
},
"product": {
"type": "string",
"description": "Product id or alias, e.g. flyer or brochure."
},
"orientation": {
"type": [
"string",
"number"
],
"description": "Filter by orientation."
}
},
"additionalProperties": false
}File a support ticket when something went wrong (a check, an order, payment, or printsi itself). With --order, the order's history is attached. A person reads every ticket; replies go to the email that paid for the order.
| Argument | Type | Description |
|---|---|---|
| object | Where to reply when there's no order (the user's own address, only with their permission). As an object: US {name, line1, city, state, postal_code}; Hong Kong {name, line1, district, area, phone, email, country: "HK"}. | |
| order | string | number | The order it's about (ord_…), if any. |
| message* | string | number | What happened and what you expected (10–4000 characters). Include error codes and request ids. |
| subject | string | number | One-line summary (defaults to the message's first line). |
| category | string | number | One of: order_problem, check_problem, payment, bug, question, other. |
{
"type": "object",
"required": [
"message"
],
"properties": {
"email": {
"type": "object",
"description": "Where to reply when there's no order (the user's own address, only with their permission). As an object: US {name, line1, city, state, postal_code}; Hong Kong {name, line1, district, area, phone, email, country: \"HK\"}.",
"additionalProperties": true
},
"order": {
"type": [
"string",
"number"
],
"description": "The order it's about (ord_…), if any."
},
"message": {
"type": [
"string",
"number"
],
"description": "What happened and what you expected (10–4000 characters). Include error codes and request ids."
},
"subject": {
"type": [
"string",
"number"
],
"description": "One-line summary (defaults to the message's first line)."
},
"category": {
"type": [
"string",
"number"
],
"description": "One of: order_problem, check_problem, payment, bug, question, other."
}
},
"additionalProperties": false
}Tickets and feedback you've filed.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}A ticket's status, our replies and the resolution.
| Argument | Type | Description |
|---|---|---|
| ticket* | string | Ticket id (tkt_…). |
{
"type": "object",
"required": [
"ticket"
],
"properties": {
"ticket": {
"type": "string",
"description": "Ticket id (tkt_…)."
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 15, 2026.