MCP Server

Sendpaper

io.github.ryan-tish/sendpaper
Commerce & Retail Public & reachable MCP 2025-11-25

What this MCP does

Creates, prices, pays for, cancels, and tracks printed postcard and letter orders mailed within the United States.

cancel_order
Cancel an unpaid order
Cancel an order that has not been paid yet. Paid orders can be cancelled by emailing support before they are printed.
Destructive Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['order_id'], 'properties': {'order_id': {'type': 'string'}}}
create_letter
Create a letter
Create a printed letter order (up to 3 pages, 8.5x11, mailed in a #10 envelope) and get a payment link. Mails only after the user pays.
Open world
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['to', 'from', 'content'], 'properties': {'to': {'type': 'object', 'required': ['name', 'line1', 'city', 'state', 'zip'], 'properties': {'zip': {'type': 'string', 'pattern': '^\\d{5}(-\\d{4})?$'}, 'city': {'type': 'string', 'maxLength': 40, 'minLength': 2}, 'name': {'type': 'string', 'maxLength': 60, 'minLength': 1, 'description': 'Recipient or sender full name'}, 'line1': {'type': 'string', 'maxLength': 64, 'minLength': 3, 'description': 'Street address'}, 'line2': {'type': 'string', 'maxLength': 64, 'description': 'Apartment, suite, unit'}, 'state': {'type': 'string'}, 'company': {'type': 'string', 'maxLength': 60}}}, 'from': {'type': 'object', 'required': ['name', 'line1', 'city', 'state', 'zip'], 'properties': {'zip': {'type': 'string', 'pattern': '^\\d{5}(-\\d{4})?$'}, 'city': {'type': 'string', 'maxLength': 40, 'minLength': 2}, 'name': {'type': 'string', 'maxLength': 60, 'minLength': 1, 'description': 'Recipient or sender full name'}, 'line1': {'type': 'string', 'maxLength': 64, 'minLength': 3, 'description': 'Street address'}, 'line2': {'type': 'string', 'maxLength': 64, 'description': 'Apartment, suite, unit'}, 'state': {'type': 'string'}, 'company': {'type': 'string', 'maxLength': 60}}, 'description': 'Return address; printed on the mail piece'}, 'content': {'type': 'object', 'required': ['body'], 'properties': {'body': {'type': 'string', 'maxLength': 9000, 'minLength': 1, 'description': 'Full letter text. Plain text; blank lines separate paragraphs.'}, 'font': {'enum': ['serif', 'sans'], 'type': 'string', 'default': 'serif'}}}, 'customer_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': 'Where to send the receipt and status updates'}, 'idempotency_key': {'type': 'string', 'maxLength': 120}}}
create_postcard
Create a postcard
Create a postcard order (4x6 or 6x9) and get a payment link. The front is an image URL or a big headline; the back carries the message and addresses. Mails only after the user pays.
Open world
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['to', 'from', 'content'], 'properties': {'to': {'type': 'object', 'required': ['name', 'line1', 'city', 'state', 'zip'], 'properties': {'zip': {'type': 'string', 'pattern': '^\\d{5}(-\\d{4})?$'}, 'city': {'type': 'string', 'maxLength': 40, 'minLength': 2}, 'name': {'type': 'string', 'maxLength': 60, 'minLength': 1, 'description': 'Recipient or sender full name'}, 'line1': {'type': 'string', 'maxLength': 64, 'minLength': 3, 'description': 'Street address'}, 'line2': {'type': 'string', 'maxLength': 64, 'description': 'Apartment, suite, unit'}, 'state': {'type': 'string'}, 'company': {'type': 'string', 'maxLength': 60}}}, 'from': {'type': 'object', 'required': ['name', 'line1', 'city', 'state', 'zip'], 'properties': {'zip': {'type': 'string', 'pattern': '^\\d{5}(-\\d{4})?$'}, 'city': {'type': 'string', 'maxLength': 40, 'minLength': 2}, 'name': {'type': 'string', 'maxLength': 60, 'minLength': 1, 'description': 'Recipient or sender full name'}, 'line1': {'type': 'string', 'maxLength': 64, 'minLength': 3, 'description': 'Street address'}, 'line2': {'type': 'string', 'maxLength': 64, 'description': 'Apartment, suite, unit'}, 'state': {'type': 'string'}, 'company': {'type': 'string', 'maxLength': 60}}, 'description': 'Return address; printed on the mail piece'}, 'size': {'enum': ['4x6', '6x9'], 'type': 'string', 'default': '4x6'}, 'content': {'type': 'object', 'required': ['message'], 'properties': {'message': {'type': 'string', 'maxLength': 600, 'minLength': 1, 'description': 'Handwritten-style message on the back'}, 'front_theme': {'enum': ['ink', 'sky', 'sunset', 'forest'], 'type': 'string', 'default': 'ink', 'description': 'Color theme for a text-only front'}, 'front_headline': {'type': 'string', 'maxLength': 60, 'description': "Big text for the front if there is no image, e.g. 'Happy birthday, Sam!'"}, 'front_image_url': {'type': 'string', 'maxLength': 2000, 'description': 'https URL of a photo or design for the front (JPG or PNG)'}}}, 'customer_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': 'Where to send the receipt and status updates'}, 'idempotency_key': {'type': 'string', 'maxLength': 120}}}
get_order
Check an order
Get the status of a postcard or letter order by id (ord_...).
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['order_id'], 'properties': {'order_id': {'type': 'string'}}}
get_pricing
Get prices
List mail products and prices (USD, printing + USPS First-Class postage included, US addresses only).
Read only
Input schema
{'type': 'object', 'properties': {}}
pay_order
Pay for an order
Pay for an unpaid order with a Stripe shared payment token (spt_…) the user approved, scoped to at least the order amount in USD. On success the order is paid and goes to print. Use only after the user approved the purchase.
Open world Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['order_id', 'shared_payment_token'], 'properties': {'order_id': {'type': 'string'}, 'shared_payment_token': {'type': 'string', 'description': 'Stripe shared payment token, spt_…'}}}
Added
cancel_order
Oct. 4, 2026, 2:40 a.m.
Added
get_order
Oct. 4, 2026, 2:40 a.m.
Added
pay_order
Oct. 4, 2026, 2:40 a.m.
Added
create_letter
Oct. 4, 2026, 2:40 a.m.
Added
create_postcard
Oct. 4, 2026, 2:40 a.m.
Added
get_pricing
Oct. 4, 2026, 2:40 a.m.