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.
Tool reference
search_cardsFind Mother's Day cards by text. Hand-picked illustrated folded cards only for v1.
get_card_detailsFetch a single card by slug. Use this after search_cards.
compose_messageAttach 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.
set_recipientSet the person receiving the card. Full US street address required.
validate_recipientLightweight format check. Postable's own form is the final source of truth.
set_senderSet the sender's name and return address. Goes on the envelope so USPS can return bad addresses.
preview_orderMaterialize the order: drive Postable's cart, capture the real handwritten inside, and mint a signed preview URL for the user.
confirm_and_handoffReturn the Postable cart URL. The user pays Postable directly — Apple Pay, Google Pay, or card.
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).