Premier Letters
Send real pen-written letters, cards and postcards: quote, preview, order and track by mail.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"mcp": {
"url": "https://www.premierletters.com/api/mcp"
}
}
}Remote endpoints
https://www.premierletters.com/api/mcpstreamable-httpWhat it can do
Tool inventory
Tools (12)
🟢connect_account(email, agent_name, mode)
Get a Premier Letters API key without the user copying one by hand. Pass the user's email and your name; we email them a link to approve (they can sign up from it if they have no account). Then call check_connection with the returned request_id and poll_secret every 10-30 seconds until it returns the api_key (returned once). Show the returned user_code to the user so they can match it on the approval page. No account or key needed to call this.
Input Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "The account owner's email address. The approval link is sent here."
},
"agent_name": {
"type": "string",
"description": "Your name as the user will see it, 1-80 characters: letters, digits, spaces and . , ' & ( ) - _ only (no links), e.g. \"Claude\"."
},
"mode": {
"type": "string",
"enum": [
"live",
"test"
],
"description": "Key mode. Defaults to \"live\"."
}
},
"required": [
"email",
"agent_name"
]
}🟢check_connection(request_id, poll_secret)
Check whether the user approved a connect_account request. Returns status pending, denied, expired or claimed, or, exactly once, status approved with the api_key. Poll every 10-30 seconds.
Input Schema
{
"type": "object",
"properties": {
"request_id": {
"type": "string",
"description": "request_id from connect_account."
},
"poll_secret": {
"type": "string",
"description": "poll_secret from connect_account."
}
},
"required": [
"request_id",
"poll_secret"
]
}🟢get_pricing(char_count, letter_count, mailing_option, paper_type, product_type, ...)
Get a live price quote for a Premier Letters order. Pass char_count (or letter_count for a rough estimate) plus optional mailing_option and paper_type to get a per-piece and total price, in cents. No account needed. Orders under 5 pieces carry a $0.99 per-piece handling fee (included in total_cents), waived when paid from a prepaid balance. Pass output_mode (printed_bw / printed_color) to quote a printed letter body instead of a pen-written one, and envelope_output_mode to quote a printed envelope.
Input Schema
{
"type": "object",
"properties": {
"char_count": {
"type": "number",
"description": "Length of the letter message in characters. Longer letters cost more (character meter)."
},
"letter_count": {
"type": "number",
"description": "Number of recipients / pieces. Defaults to 1."
},
"mailing_option": {
"type": "string",
"enum": [
"we_mail",
"you_mail_stamped",
"you_mail_no_stamp"
],
"description": "Delivery option. Defaults to \"we_mail\" (we write, stamp, and mail it for you)."
},
"paper_type": {
"type": "string",
"enum": [
"standard",
"premium"
],
"description": "Paper quality. Defaults to \"standard\"."
},
"product_type": {
"type": "string",
"enum": [
"letter",
"card",
"a7",
"postcard",
"card_5x7",
"postcard_5x7",
"a4",
"a5",
"a6"
],
"description": "Product type (letter, card, postcard, etc). Informational only — does not change pricing components beyond envelope inclusion."
},
"output_mode": {
"type": "string",
"enum": [
"handwritten",
"printed_bw",
"printed_color"
],
"description": "Defaults to \"handwritten\". printed_bw / printed_color print the letter body instead of pen-writing it; the envelope stays hand-addressed unless envelope_output_mode is set."
},
"envelope_output_mode": {
"type": "string",
"enum": [
"printed_bw",
"printed_color"
],
"description": "Omit (or null) for a hand-addressed envelope, the default. printed_bw / printed_color print the envelope instead."
}
}
}🟢list_handwriting_styles
List available handwriting styles (fonts) for a letter order. Use the returned "id" as options.handwriting_style / handwriting_style when creating an order or previewing.
Input Schema
{
"type": "object",
"properties": {}
}🟢list_templates(search, favorites_only, sort)
List the authenticated user's saved letter templates.
Input Schema
{
"type": "object",
"properties": {
"search": {
"type": "string",
"description": "Filter templates by name or content substring."
},
"favorites_only": {
"type": "boolean",
"description": "Only return favorited templates."
},
"sort": {
"type": "string",
"enum": [
"recent",
"most_used",
"name"
],
"description": "Sort order. Defaults to \"recent\"."
}
}
}🟡verify_address(address_line1, address_line2, city, state, zip)
Verify and standardize a US mailing address via USPS. Use before create_order to catch typos and get the USPS-standardized form.
Input Schema
{
"type": "object",
"properties": {
"address_line1": {
"type": "string",
"description": "Street address"
},
"address_line2": {
"type": "string",
"description": "Apt/suite/unit (optional)"
},
"city": {
"type": "string"
},
"state": {
"type": "string",
"description": "Two-letter US state code"
},
"zip": {
"type": "string",
"description": "5-digit or ZIP+4 postal code"
}
},
"required": [
"address_line1",
"city",
"state",
"zip"
]
}🟡preview_letter(message, handwriting_style, product_type, recipient)
Render a preview of a handwritten letter (as an SVG image) and get its price, before creating an order. Does not save anything.
Input Schema
{
"type": "object",
"properties": {
"message": {
"type": "string",
"description": "The letter text to render."
},
"handwriting_style": {
"type": "string",
"description": "Font UUID from list_handwriting_styles. Defaults to the house font."
},
"product_type": {
"type": "string",
"description": "Product slug: letter, card, postcard, etc. Defaults to \"letter\"."
},
"recipient": {
"type": "object",
"description": "Optional recipient info, used only to personalize {{merge fields}} in the message before rendering.",
"properties": {
"first_name": {
"type": "string"
},
"last_name": {
"type": "string"
}
}
}
},
"required": [
"message"
]
}🟡create_order(message, recipients, options, payment, skip_invalid, ...)
Create and pay for a Premier Letters order — a real, handwritten letter mailed via USPS. Requires a Premier Letters API key. Use get_pricing or preview_letter first to confirm the price. For payment, "card_on_file" charges the caller's saved card immediately, "balance" pays from the prepaid account balance (no small-order handling fee; fails with insufficient_balance when short), or "checkout_session" returns a checkout_url for the human to complete payment in a browser. Envelope return address: an explicit no_return_address_ack: true always wins; otherwise a supplied return_address, else the account default. With neither address, set no_return_address_ack: true to send without one.
Input Schema
{
"type": "object",
"properties": {
"message": {
"type": "string",
"description": "The letter text. Supports {{first_name}}, {{last_name}}, {{greeting}} merge fields per-recipient."
},
"recipients": {
"type": "array",
"description": "One or more recipients. At least one is required unless options.product_type is a letter/card with no envelope.",
"items": {
"type": "object",
"properties": {
"first_name": {
"type": "string"
},
"last_name": {
"type": "string"
},
"address_line1": {
"type": "string"
},
"address_line2": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"zip": {
"type": "string"
},
"custom_fields": {
"type": "object"
}
}
}
},
"options": {
"type": "object",
"description": "handwriting_style, paper_type, product_type, mailing_option, authenticity_preset, include_letter, include_envelope, copies, output_mode (\"handwritten\" default, or \"printed_bw\" / \"printed_color\" to print the letter body) and envelope_output_mode (null default = hand-addressed, or \"printed_bw\" / \"printed_color\") — see /openapi.json for the full field list."
},
"payment": {
"type": "object",
"properties": {
"method": {
"type": "string",
"enum": [
"card_on_file",
"checkout_session",
"balance"
],
"description": "Defaults to \"checkout_session\"."
},
"return_url": {
"type": "string"
}
}
},
"skip_invalid": {
"type": "boolean",
"description": "When true, invalid recipients are skipped instead of failing the whole order."
},
"return_address": {
"type": "object",
"description": "Return address written on the envelope. Omit to use the account's default return address. Required unless the account has a default or no_return_address_ack is true. An explicit no_return_address_ack: true always wins; otherwise a supplied return_address, else the account default. name, address_line1, city, state and zip are required unless return_address_partial_ok is true.",
"properties": {
"name": {
"type": "string"
},
"company": {
"type": "string"
},
"address_line1": {
"type": "string"
},
"address_line2": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string",
"description": "2-letter US state code."
},
"zip": {
"type": "string",
"description": "5-digit ZIP or ZIP+4."
}
}
},
"return_address_partial_ok": {
"type": "boolean",
"description": "Send return_address exactly as written although it is incomplete: at least one of name, company, address_line1, city, state, zip. Only the filled lines print (a name alone is fine). Without it an incomplete return_address is refused."
},
"no_return_address_ack": {
"type": "boolean",
"description": "Send with no return address at all. An explicit no_return_address_ack: true always wins; otherwise a supplied return_address, else the account default. Undeliverable mail is then destroyed."
},
"idempotency_key": {
"type": "string",
"description": "Client-supplied key (1–255 chars). Repeating a call with the same key returns the original order instead of creating a second one. Always set this when you might retry."
}
},
"required": [
"message"
]
}🟢get_order_status(order_id)
Get an order's status, delivery/tracking summary, and per-recipient mail status.
Input Schema
{
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "The order UUID returned by create_order."
}
},
"required": [
"order_id"
]
}🟢list_orders(limit, status)
List the authenticated user's recent orders.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "Max orders to return (1-100). Defaults to 20."
},
"status": {
"type": "string",
"description": "Optional status filter (pending_payment, paid, in_production, mailed, delivered, cancelled, refunded)."
}
}
}🟡get_balance
Get the authenticated account's prepaid balance (balance_cents) and the top-up rules: minimum and maximum top-up, bonus tiers and suggested amounts. Orders paid with payment.method "balance" skip the small-order handling fee. Use create_topup_link to add funds.
Input Schema
{
"type": "object",
"properties": {}
}🟡create_topup_link(amount_cents)
Create a Stripe Checkout link that adds prepaid credit (plus any bonus tier) to the authenticated account. Give checkout_url to the human to pay in a browser; the balance updates once they pay (check with get_balance). amount_cents must be a whole number between min_cents and max_cents from get_balance.
Input Schema
{
"type": "object",
"properties": {
"amount_cents": {
"type": "integer",
"description": "Amount to add, in cents (e.g. 5000 for $50.00)."
}
},
"required": [
"amount_cents"
]
}Recommended Prompts
list_handwriting_stylesget_pricinglist_handwriting_stylesget_pricingget_pricinglist_handwriting_stylesCommunity
Evidence