Agent skill that turns any AI into a direct mail machine. One MCP tool call mails a physical handwritten postcard (real pen-and-ink, USPS 3-5 day delivery, $4.99 per card). Works with Claude Desktop, Cursor, Claude Code, OpenClaw, n8n, LangChain, and any MCP-compatible client.
Two tools with clear, actionable descriptions and comprehensive input schemas. send_postcard has excellent parameter documentation (16 fields with types, descriptions, and constraints). generate_message is simpler but well-described. Both tools declare their risk profile (IRREVERSIBLE vs READ_ONLY). Naming follows verb_noun convention. Main gaps: output schemas are not documented in the source; error handling guidance is minimal; no pagination or batch variants despite potential for multi-card workflows.
Generate a personalized postcard message using AI (if Cloudflare AI is configured) or return a prompt template for manual composition. Useful for composing messages before calling send_postcard.
Send a physical handwritten postcard to a US mailing address. Postals prints it with real robotic handwriting (pen and ink) and mails it via USPS. Delivery in 3-5 business days. Cost: $4.99 per card. Provide the recipient's address, a message (max 400 chars), and optionally an image URL for the card front. If no image is provided, uses the configured default card.
Output schemas not documented. LLMs cannot infer what send_postcard returns (e.g., postcard_id, tracking_url, cost, delivery_date). Downstream tools or agent reasoning cannot chain on missing response fields.
Error handling lacks recovery guidance. Code throws generic errors ('Fulfillment API error', 'Image upload returned no image ID') without actionable next steps. LLMs cannot self-correct or retry intelligently.
No idempotency key validation or documentation in send_postcard schema. While code implements in-memory idempotency caching (24h TTL), the parameter description does not explain the retry semantics or cache behavior to the LLM.
Daily spend limit (POSTALS_DAILY_LIMIT) is enforced server-side but not exposed as a tool parameter or discoverable capability. Agents cannot query remaining budget or adjust limits dynamically.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | <=2025-11-25 | v2 |
generate_message lacks output schema documentation. Does it return a string, a structured object with tone/recipient/sender fields, or a prompt template? LLMs cannot plan downstream send_postcard calls without knowing the response format.