# Agent Letter Desk: full facts for AI agents > Your AI writes the letter. We put it in the post. A remote MCP server that prints and mails paper letters for the user of an AI agent, in the name of the signed-in account holder. Test mode: no letter goes into the mail, and no money is charged. ## What it does The agent writes the letter with the user. The server does what an agent cannot do reliably: it binds the sender to the account holder, checks the letter (placeholders, example addresses, sensitive numbers, abuse), lays it out for the post of the recipient country, renders a PDF preview, quotes the price, sends the letter once, and reports its status. The server does not write letters and gives no legal advice. Letter guides give example letters based on official samples (US credit report disputes and cancellations, Austrian and German cancellations, EU withdrawal forms in each official language). ## Connect - MCP server URL: `https://agentletterdesk.com/mcp` - Transport: Streamable HTTP. - Protocol versions: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05, 2024-10-07. - Authorization: OAuth 2.1 with PKCE (S256). Clients register by a Client ID Metadata Document or by dynamic client registration. Metadata: `https://agentletterdesk.com/.well-known/oauth-protected-resource/mcp` and `https://agentletterdesk.com/.well-known/oauth-authorization-server`. - Scopes: `letters.read` (read tools) and `letters.write` (prepare_letter, send_letter, cancel_letter). The user can grant read-only access; a write tool then answers HTTP 403 insufficient_scope. - Sign-in: the user signs in on our page, enters a name once and approves the access. You sign in with your e-mail address or your Google account. - Claude: Settings › Connectors › Add custom connector, paste the URL. ChatGPT: Plugins › Add › Add custom MCP server, paste the URL, choose OAuth. Meta Muse: not available yet. ## Steps for every letter 1. Connect to the MCP server at https://agentletterdesk.com/mcp (Streamable HTTP). It uses OAuth 2.1: the user signs in on our page and approves the access. 2. Call get_account first. The sender of every letter is the account holder. Use the default sender address. 3. Write the letter with the user. Ask the user for every name, number, date and address. Do not use placeholders or example values. 4. Call prepare_letter. It checks the letter, lays it out and returns a PDF preview link and the price. 5. Show the user the preview link, the recipient, the postal service and the price. Say so when the route has no proof of delivery. 6. Wait for the user’s clear yes. Do not call send_letter in the same answer as prepare_letter. 7. Call send_letter with the letter_id, the recipient name, the price and the number of enclosures that the user approved. 8. Give the user the status and the tracking number. Call cancel_letter if the user wants to stop the letter before printing. ## Tools - `get_account`: The sender name, e-mail and saved sender addresses, and whether the app may write (read_write or read_only). - `list_letters`: The account's letters, newest first: status, recipient, postal service, price and tracking number. - `list_letter_types`: Letter guides (example letters based on official samples) and the postal services per country. - `list_recipients`: Verified recipient addresses, each with its source and date (US credit bureaus; Austrian and German companies). - `prepare_letter`: Checks, lays out and prices a letter. Returns the PDF preview link, the price and an enclosure link. Sends nothing. - `send_letter`: Mails a prepared letter. Needs the letter_id, the recipient name, the price and the number of enclosures that the user approved. - `get_letter_status`: The status of one letter: the preview and price while it is prepared; stage and tracking after sending. - `cancel_letter`: Cancels a prepared letter at once, or a sent letter before printing. ## Rules the server enforces - `send_letter` accepts only a `letter_id` from `prepare_letter`, before its quote expires (12 hours). - The send must carry the quoted price (`PRICE_MISMATCH` otherwise), the recipient name of the preview (`DETAILS_CHANGED`) and the number of enclosures (`ENCLOSURES_CHANGED`). - An account holder's `send_letter` less than 10 seconds after `prepare_letter` gets `SEND_TOO_EARLY` with `wait_seconds`. Nothing is mailed. Approval takes a person. - Each letter is sent once (`ALREADY_SENT`, `SEND_IN_PROGRESS`). The same letter to the same recipient again is `DUPLICATE_LETTER`, unless the user asks for a copy (`allow_duplicate`). - Placeholders (`[…]`, `{{…}}`, ``, `XXX`) are refused (`PLACEHOLDER`), and so are example addresses. Ask the user for the real value. - The sender name is the account holder's name. Another name is `SENDER_NOT_ACCOUNT_HOLDER`. - The PDF is rendered again at send time and must match the preview (`PREVIEW_CHANGED` otherwise). - Every letter and enclosure passes a content check (`CONTENT_REFUSED`). If the check cannot run, nothing is prepared (`SERVICE_UNAVAILABLE`). - Limits: at most 3 letters from one sender to one recipient in 30 days, 10 sends per account per day. - After a timeout the outcome is unknown, not "not sent": call `send_letter` again with the same `letter_id`. Never tell the user that nothing was mailed unless the server says so. - `cancel_letter` stops a prepared letter at once and a sent letter only before printing (`TOO_LATE` otherwise). ## Routes The recipient's country decides the postal service. 31 destinations. Prices below are test prices for one page; `prepare_letter` quotes the exact price of each letter (in Europe it depends on the page count). A letter to the United States needs a sender in the United States; a letter to Europe can come from any of 33 countries (EU, IS, LI, NO, CH, GB, US). Undeliverable letters in Europe are destroyed by the post. | Recipient in | Postal service | Proof | Business days | Test price | | --- | --- | --- | --- | --- | | United States (US) | USPS Certified Mail with electronic return receipt | Tracking and the recipient’s signature | 3–5 | $14.99 | | Belgium (BE) | bpost: Registered Standard (legal mailing receipt) | Tracking and proof of delivery, no signature | 1–2 | €13.90 | | Germany (DE) | Deutsche Post: Einschreiben Einwurf | Tracking and proof of delivery, no signature | 1 | €6.90 | | Spain (ES) | Correos: Carta Certificada (with receipt) | Tracking and the recipient’s signature | 2–4 | €9.90 | | Austria (AT) | Austrian Post: Premium Brief | No tracking, no proof of delivery | 1 | €4.90 | | Luxembourg (LU) | bpost / Post Luxembourg: Economy Letter | No tracking, no proof of delivery | 2–3 | €4.90 | | Netherlands (NL) | PostNL: Standaard | No tracking, no proof of delivery | 1–2 | €4.90 | | Switzerland (CH) | Swiss Post: A Mail | No tracking, no proof of delivery | 1 | €4.90 | | United Kingdom (GB) | Royal Mail: 1st Class | No tracking, no proof of delivery | 1 | €6.90 | | Bulgaria (BG) | DHL: International priority letter | No tracking, no proof of delivery | 3–5 | €4.90 | | Croatia (HR) | DHL: International priority letter | No tracking, no proof of delivery | 3–5 | €4.90 | | Cyprus (CY) | DHL: International priority letter | No tracking, no proof of delivery | 6–10 | €4.90 | | Czechia (CZ) | DHL: International priority letter | No tracking, no proof of delivery | 2–4 | €4.90 | | Denmark (DK) | DHL: International priority letter | No tracking, no proof of delivery | 3–6 | €4.90 | | Estonia (EE) | DHL: International priority letter | No tracking, no proof of delivery | 3–7 | €4.90 | | Finland (FI) | DHL: International priority letter | No tracking, no proof of delivery | 3–7 | €4.90 | | France (FR) | DHL: International priority letter | No tracking, no proof of delivery | 3–7 | €4.90 | | Greece (GR) | DHL: International priority letter | No tracking, no proof of delivery | 7–11 | €4.90 | | Hungary (HU) | DHL: International priority letter | No tracking, no proof of delivery | 2–5 | €4.90 | | Ireland (IE) | DHL: International priority letter | No tracking, no proof of delivery | 3–5 | €5.90 | | Italy (IT) | DHL: International priority letter | No tracking, no proof of delivery | 2–5 | €4.90 | | Latvia (LV) | DHL: International priority letter | No tracking, no proof of delivery | 3–5 | €4.90 | | Lithuania (LT) | DHL: International priority letter | No tracking, no proof of delivery | 2–5 | €4.90 | | Malta (MT) | DHL: International priority letter | No tracking, no proof of delivery | 8–10 | €6.90 | | Norway (NO) | DHL: International priority letter | No tracking, no proof of delivery | 3–7 | €4.90 | | Poland (PL) | DHL: International priority letter | No tracking, no proof of delivery | 2–5 | €4.90 | | Portugal (PT) | DHL: International priority letter | No tracking, no proof of delivery | 2–5 | €4.90 | | Romania (RO) | DHL: International priority letter | No tracking, no proof of delivery | 4–9 | €4.90 | | Slovakia (SK) | DHL: International priority letter | No tracking, no proof of delivery | 2–5 | €4.90 | | Slovenia (SI) | DHL: International priority letter | No tracking, no proof of delivery | 2–6 | €4.90 | | Sweden (SE) | DHL: International priority letter | No tracking, no proof of delivery | 3–6 | €4.90 | Routes with proof also offer a standard letter without proof: Belgium €4.90, Germany €4.90, Spain €4.90. ## Server instructions (as the MCP server sends them) ```text Agent Letter Desk prints and mails a paper letter for the user, in the name of the account holder. Rule: call send_letter only after the user approved this letter, its recipient and its price. Do not call send_letter in the same answer as prepare_letter. Sending costs money and cannot be undone. Test system: every letter is a test letter. No letter goes into the mail. No money is charged. Do not offer a real send. Postal service by recipient country: - US: USPS Certified Mail, return receipt. US sender only. - BE DE ES: registered mail with proof, or standard. - AT CH GB LU NL: local post, no tracking, no proof. - BG CY CZ DK EE FI FR GR HR HU IE IT LT LV MT NO PL PT RO SE SI SK: DHL priority, no tracking, no proof, 2–11 days. - Tell the user when there is no proof. Other countries: not available. Steps: 1. Call get_account. Use the default address as sender. Do not ask for an address that the account has. 2. Call list_letter_types with the recipient country. If a guide agrees, ask the user for each fact in facts_to_collect. Call list_recipients for verified addresses. 3. Write the letter with the user, in the language of the recipient country. Ask the user for each name, number, date, amount and address. Do not use example values. 4. Call prepare_letter. It gives a PDF preview link, the price and an enclosure link. 5. Enclosures: give the user the enclosure link. Only the user can upload. Then call get_letter_status for the new preview and price. 6. Show the user the text, recipient, preview link, price and postal service. Wait for the reply of the user. 7. After clear approval, call send_letter. 8. Give the user the tracking number, if any. cancel_letter stops a letter before printing. A change: call prepare_letter again with replaces_letter_id. PROVIDER_UNAVAILABLE: call send_letter again with the same letter_id. The server refuses threats, harassment, letters in another person's name, and fake notices from a court or an authority. No legal advice. ``` ## Privacy Letter text, addresses and enclosures stay on the server only until the letter reaches a final state (sent, failed, unresolved, expired, cancelled), then they are deleted. No PDF is stored. Logs never hold letter text, sign-in codes, e-mail or postal addresses. The content check runs on Cloudflare Workers AI. US letters go to PostGrid. European letters go to Pingen. ## Test mode Letters go to the test systems of the print and mail partners, which never print or mail them. No money is charged. Tracking numbers are test values. ## Links - Website: https://agentletterdesk.com/ - Privacy policy: https://agentletterdesk.com/privacy - Terms of the test: https://agentletterdesk.com/terms - Support: https://agentletterdesk.com/support - Imprint: https://agentletterdesk.com/imprint (Sara Meindl, Perchtoldsdorf, Austria) - Contact: support@agentletterdesk.com