For agents

One toolbox. Two transports.

Every tool below is available over MCP (stdio + HTTP) and as a REST endpoint at api.cards-for-agents.com. We hold canonical order state — you don't have to round-trip it.

MCPRegister cards-for-agents as an MCP server. Tools appear under the cards-for-agents namespace.Open →RESTPOST https://api.cards-for-agents.com/orders/:id/* — same shapes, HTTP.Open →/llms.txtShortest possible pitch for your model to discover this service.Open →

Tool reference

search_cards

Find Mother's Day cards by text. Hand-picked illustrated folded cards only for v1.

args{ query?: string, limit?: number }
returns{ cards: Card[] }
get_card_details

Fetch a single card by slug. Use this after search_cards.

args{ slug: string }
returns{ card: Card }
compose_message

Attach a message to the order. Accepts either the final text, or a short context for your own model to draft from. We do not run a model on your behalf.

args{ order_id: string, draft?: string, context?: string }
returns{ order_id, message: { text, font, color } }
set_recipient

Set the person receiving the card. Full US street address required.

args{ order_id: string, name: string, street: string, city: string, state: string, zip: string }
returns{ order_id }
validate_recipient

Lightweight format check. Postable's own form is the final source of truth.

args{ order_id: string }
returns{ ok: boolean, issues?: string[] }
set_sender

Set the sender's name and return address. Goes on the envelope so USPS can return bad addresses.

args{ order_id: string, name: string, street: string, city: string, state: string, zip: string, email: string }
returns{ order_id }
preview_order

Materialize the order: drive Postable's cart, capture the real handwritten inside, and mint a signed preview URL for the user.

args{ order_id: string }
returns{ preview_url: string, totals: { card_cents, stamp_cents, tax_cents, total_cents } }
confirm_and_handoff

Return the Postable cart URL. The user pays Postable directly — Apple Pay, Google Pay, or card.

args{ order_id: string }
returns{ handoff_url: string }

Happy-path script

The whole thing in eight calls. On success preview_order returns a signed URL the user clicks, reviews, then hands off to Postable’s Stripe checkout.

const { order_id } = await create_order({ occasion: "mothers-day" });

await set_recipient({
  order_id,
  name: "Laura Gomez",
  street: "5510 Hoover Street",
  city: "Bethesda", state: "MD", zip: "20817",
});

await set_sender({
  order_id,
  name: "Nico Goldberg",
  street: "34035 El Encanto Ave, Unit B",
  city: "Dana Point", state: "CA", zip: "92629",
  email: "you@example.com",
});

const { cards } = await search_cards({ query: "flowers for mom", limit: 3 });
await set_card({ order_id, slug: cards[0].slug });

await compose_message({
  order_id,
  draft: "Mom — Happy Mother's Day. Love, Nico.",
});

const { preview_url, totals } = await preview_order({ order_id });
// → show preview_url to the user. totals.total_cents === 723 in CA.

const { handoff_url } = await confirm_and_handoff({ order_id });
// → open handoff_url in a new tab. user pays Postable.

Don’t speak MCP?

Everything MCP does, REST does. Same shapes, same semantics. Send us a POST /orders, then hit /orders/:id/recipient, etc. Responses are JSON. Auth via Authorization: Bearer (free tier available for the launch window).