PaperAgent — Send Physical Mail
Server Details
Mail one-off USPS letters from ChatGPT or Claude after you approve the preview and price. US only.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 8 tools
Each tool targets a distinct action: address validation, draft creation, preview, update, sending, status lookup, listing, and pricing. The read-only tools (get_pricing, preview_draft, list_letters, get_letter_status) could superficially overlap, but descriptions explicitly distinguish the catalog-level price list from a draft's quote and a single letter's status from the account list. No two tools appear to do the same thing.
All eight names follow the same verb_noun snake_case pattern (create_draft, preview_draft, update_draft, send_letter, get_letter_status, get_pricing, list_letters, validate_address). Verb choice is also semantically consistent across the lifecycle. No mixed conventions or casing.
Eight tools map cleanly onto a single well-bounded workflow (validate → draft → preview → update → send → status/list, plus pricing). Every tool earns its place with no redundant or filler operations. The count is squarely in the well-scoped range.
The surface covers the full mail lifecycle: address validation, draft CRUD (create/update/preview), sending, status, listing, and pricing. Minor gaps exist, such as no way to delete or discard an unused draft and no explicit cancel/refund path after an order is created. These are workable omissions but leave small dead ends.
Available Tools
8 toolscreate_draftCreate a Letter DraftAInspect
Create a draft of a physical letter to be printed on paper and mailed through USPS, and return its draft_id, page count and total price. A letter is at most 6 printed pages, at the same price whatever its length: up to 3 pages print one-sided, 4 to 6 print on both sides. Write the body to fit, or split a longer document into two letters, because a body that renders to 7 or more pages is refused rather than trimmed. This is NOT email, fax or text message — nothing reaches the recipient electronically, and the only way this letter arrives is on paper in an envelope. The body is plain text or Markdown. The draft freezes the content and the price for 24 hours and costs nothing; no paper is printed and no postage is bought until send_letter is called. US domestic addresses only. Call preview_draft next so the user can see the letter and the total.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Who the letter is mailed to. | |
| tier | No | Defaults to standard. Call get_pricing first and pass a tier it lists: standard is a plain First-Class letter. certified, certified_err, proof_of_mailing and registered are other products the current price card may not sell, and a tier it does not sell is refused, not substituted — so do not describe one to the user until get_pricing has listed it. | |
| colour | No | Omit this. The current price card prints every letter black & white, so passing true is refused rather than billed — call get_pricing for what it does sell. The field remains because letters priced on an older card carry it. | |
| body_file | No | A file the user attached, as the host delivers it. Not accepted yet — create_draft refuses an attachment and asks for the letter as body_markdown text. | |
| body_markdown | Yes | The text of the letter, as plain text or Markdown. It must render to 6 printed pages or fewer — roughly 2,400 words of body text. | |
| from_address_id | No | Omit this. The account's own verified return address is used by default; only pass an id the account holder gave you. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | The next call to make. Read it before answering the user. |
| tier | Yes | The product this draft is priced as, as passed to create_draft or update_draft. |
| quote | Yes | A priced letter. State total.display to the user before sending, and pass total.amount_cents as confirm_total_cents. |
| draft_id | Yes | Pass this to preview_draft, update_draft and send_letter. |
| expires_at | Yes | ISO 8601 instant the draft is deleted. Nothing is charged if it expires. |
| page_count | Yes | Printed pages, as counted by the renderer. Never more than 6 — a longer body is refused. |
| tier_title | Yes | What the price card in force calls that product, such as Standard. Use this name when you tell the user what they are buying. |
| sheet_count | Yes | Sheets of paper this letter is printed on: one page per sheet, one side each, up to 3 pages; a letter of 4 to 6 pages is printed on both sides, so it is never more than 3 sheets. |
| included_pages | Yes | Printed pages the headline price covers. This draft is priced at that total up to this many pages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: the 24-hour freeze, zero cost, no print/postage until send_letter, the 7+ page hard refusal (refused, not trimmed), and refusal-not-substitution for unsupported tiers and colour. These are exactly the side-effect and failure-mode facts an agent needs for a non-destructive-but-stateful create.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, outputs, then constraints and next step, and nearly every sentence carries operational weight. The non-electronic point is made twice ("nothing reaches the recipient electronically" plus "the only way this letter arrives is on paper"), which is mild redundancy in an otherwise dense description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter nested-object tool with an output schema, it covers required inputs, sizing limits, pricing rules, unsupported fields, address scope, and the follow-up call. An output schema exists, so return-value details are correctly left to it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds real meaning the schema lacks: page-count pricing behaviour, the one-sided vs duplex threshold, the ~2,400 word guidance, and the fact that body_file is currently rejected. Tier and colour semantics largely duplicate schema text, capping it below 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource (create a physical letter draft) and states its output artifacts (draft_id, page count, total price). It also explicitly distinguishes itself from send_letter and preview_draft, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing rules: call get_pricing before choosing a tier, call preview_draft next, split over-long documents into two letters, US domestic addresses only. It also states when-not (not email/fax/text) and which fields to omit (colour, from_address_id).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_letter_statusGet Letter StatusARead-onlyIdempotentInspect
Return the current state of one letter: where it is, the date it goes to USPS, and the estimated delivery date. USPS does not scan plain First-Class letters at delivery, so a Standard letter ends at an expected delivery date and never reports delivery — do not tell the user a letter arrived unless the status itself says so. This creates nothing and mails nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| letter_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| tier | Yes | |
| scans | Yes | |
| status | Yes | Where the letter is. expected_delivery is the last state a standard or proof-of-mailing letter reaches; only certified tiers ever reach delivered. |
| payment | Yes | |
| livemode | Yes | False for sandbox letters, which are never mailed. |
| letter_id | Yes | |
| mail_date | Yes | The calendar date (YYYY-MM-DD, New York time) this piece goes to USPS. |
| created_at | Yes | |
| disclosure | Yes | Say this to the user whenever an expected delivery date is shown. |
| description | Yes | One sentence for the user about where this letter is. |
| cancelled_at | Yes | |
| delivered_at | No | Certified tiers only, and absent entirely for the tiers USPS does not scan. |
| tracking_url | No | Direct USPS tracking link. Share it with the user when available. |
| tracking_number | No | USPS Certified Mail tracking number, present once the operator saves it. |
| delivery_confirmation | Yes | False for every tier USPS does not scan at delivery. Never claim otherwise. |
| expected_delivery_estimate | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), so the bar is lower, and the description clears it by disclosing a non-obvious domain behavior: USPS does not scan First-Class letters at delivery, so a Standard letter terminates at an expected date and never reports arrival. 'This creates nothing and mails nothing' is somewhat redundant with readOnlyHint but usefully reinforces it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what is returned, then the delivery-confirmation caveat, then the safety clarification. Every sentence carries distinct information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be restated, and annotations cover the safety profile. For a single-parameter read tool, the description supplies everything an agent needs to call it correctly and to report its result honestly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single letter_id parameter, so the description carries the burden and adds no format, source, or validity guidance for it. It only establishes that the identifier refers to a single letter; the param name is self-explanatory enough that this is marginally adequate rather than a failure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource with scope: 'Return the current state of one letter', plus the exact data points returned (location, USPS date, estimated delivery). The phrase 'one letter' implicitly separates it from list_letters, but no sibling is named explicitly, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear interpretation rule ('do not tell the user a letter arrived unless the status itself says so') and scoping ('one letter'), which implies when to reach for it. However, it never states when to prefer this over list_letters or how to obtain a letter_id, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pricingGet Letter PricingARead-onlyIdempotentInspect
Return the published price list for mailing physical letters through USPS: the products on sale, what each one costs, how many pages it covers, and when sales tax applies. Amounts are in US cents. Every letter is one of these prices — there is no volume discount, no per-page charge and no colour printing — so quote the tier total and say New York sales tax is added, whatever the destination. Call this before telling a user what a letter will cost. This creates nothing and mails nothing.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| tax | Yes | |
| tiers | Yes | |
| add_ons | Yes | |
| country | Yes | |
| version | Yes | |
| currency | Yes | |
| page_rules | Yes | |
| effective_from | Yes | |
| volume_pricing | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, and closed-world behavior, but the description adds critical pricing semantics: amounts are in US cents, there is no volume discount, no per-page charge, no colour printing, and New York sales tax is always added regardless of destination. It also reinforces safety with 'This creates nothing and mails nothing.'
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then packs pricing rules and quoting guidance into compact sentences with no wasted text. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the zero-parameter schema, rich annotations, and an output schema that covers return structure, the description is complete. It closes the key remaining gaps: pricing rules, tax behavior, and the instruction to call before quoting costs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. The description adds no parameter-specific details because none exist, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: return the published USPS letter price list. It details exactly what the list contains (products, costs, page coverage, sales tax applicability), so an agent can distinguish it from all sibling tools immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to call this tool before telling a user what a letter will cost, and then instructs how to quote the result (tier total plus New York sales tax). No sibling tool offers pricing, so no alternative routing is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_lettersList LettersARead-onlyIdempotentInspect
Return this account's letters, newest first, with the status, mail date and total for each. Use this to answer questions about what has already been sent. This creates nothing, changes nothing and mails nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Defaults to 20. | |
| starting_after | No | The next_cursor from the previous call, to read the following page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| letters | Yes | |
| has_more | Yes | |
| next_cursor | Yes | Pass this back as starting_after for the next page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered structurally. The description still adds useful domain context: result ordering, the fields present on each item, and an explicit guarantee that nothing is mailed — a meaningful assurance given siblings like send_letter exist. It does not describe pagination behavior beyond what the cursor parameter implies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what is returned before the usage hint and the safety disclaimer. No filler and nothing repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return structure need not be spelled out, and the annotations fully cover the safety profile. Purpose, usage context, ordering and the no-side-effect guarantee are all present for a simple two-parameter list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: 'limit' documents its default of 20 and 'starting_after' explains it takes the next_cursor from the previous call. The description adds no further parameter meaning, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return this account's letters') plus the ordering ('newest first') and the per-item fields returned ('status, mail date and total'). The line 'Use this to answer questions about what has already been sent' and the negative framing 'creates nothing, changes nothing and mails nothing' separate it from the mutating siblings like create_draft and send_letter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this to answer questions about what has already been sent' gives a clear use context, and the closing sentence implicitly excludes the create/send paths. It stops short of naming the closest alternative (get_letter_status for a single letter) or stating when-not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_draftPreview a Letter DraftAIdempotentInspect
Return a link to the rendered PDF of a draft together with its page count and current total price. Refreshes the stored price quote when pricing has changed. Use this to show the user exactly what will be printed and exactly what it costs before calling send_letter. The total in the response is the number send_letter requires as confirm_total_cents. This does not create an order or mail a letter.
| Name | Required | Description | Default |
|---|---|---|---|
| draft_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| tier | Yes | The product this draft is priced as, as passed to create_draft. |
| quote | Yes | A priced letter. State total.display to the user before sending, and pass total.amount_cents as confirm_total_cents. |
| draft_id | Yes | |
| expires_at | Yes | |
| page_count | Yes | |
| tier_title | Yes | What the price card in force calls that product, such as Standard. Use this name when you tell the user what they are buying. |
| preview_url | Yes | A time-limited link to the exact PDF that will be printed. Give it to the user; it dies with the draft. |
| requirements | Yes | What the user is agreeing to: how USPS requires the envelope to be printed, and what this particular letter is. State these to the user before calling send_letter. |
| included_pages | Yes | Printed pages the headline price covers. This draft is priced at that total up to this many pages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds behavior beyond the annotations: it discloses a side effect ('Refreshes the stored price quote when pricing has changed') and explicitly negates the dangerous actions ('does not create an order or mail a letter'). This explains why readOnlyHint is false, which the annotations alone cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the return contract, then the pricing side effect, then usage, then the negative scope. Each sentence earns its place, though the return-value sentence is somewhat dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained, yet the description usefully links the returned total to send_letter's confirm_total_cents. For a single-parameter preview tool, nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With one required parameter and 0% schema description coverage, the description carries the burden but never describes draft_id's format or where it comes from. The context makes the meaning inferable, but there is no added parameter-level detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return a link to the rendered PDF of a draft') plus the two satellite outputs (page count, total price). It also distinguishes itself from send_letter, so an agent can tell the preview step apart from the send step without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it 'before calling send_letter' to show the user what will be printed and what it costs, giving clear sequencing. It does not discuss alternatives such as get_pricing or when a preview could be skipped, so it stops just short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_letterSend a Physical Letter (USPS)ADestructiveIdempotentInspect
Create an order for a real, physical letter through the United States Postal Service. It returns a payment link; no paper is printed, postage is bought, or letter is mailed until payment completes. Use this whenever the user asks to mail, post, send by post, or physically send a letter, notice, or document to a street address. This is NOT email — use an email tool for email. US domestic addresses only. Requires a draft_id from create_draft and confirm_total_cents matching the current quote. The letter becomes irreversible once we print it.
| Name | Required | Description | Default |
|---|---|---|---|
| draft_id | Yes | The draft_id returned by create_draft or preview_draft. | |
| idempotency_key | Yes | A key you generate once for this send. Retrying with the same draft_id and the same key returns the original letter instead of mailing a second one. | |
| confirm_total_cents | Yes | The exact total.amount_cents from the current quote, including sales tax. Say the total out loud to the user first; if it does not match the live quote this call fails and no letter is sent. |
Output Schema
| Name | Required | Description |
|---|---|---|
| quote | Yes | A priced letter. State total.display to the user before sending, and pass total.amount_cents as confirm_total_cents. |
| status | Yes | The current letter status, including on an idempotent replay. Nothing is printed or mailed until payment completes. |
| message | Yes | What to tell the user. Relay the link and the total. |
| order_id | Yes | |
| letter_id | Yes | |
| checkout_url | Yes | Give this link to the user. The letter is mailed once payment completes. Null when this call replayed a send whose payment has already completed — there is then nothing to pay and nothing to relay. |
| mail_date_estimate | Yes | The calendar date (YYYY-MM-DD, New York time) this piece goes to USPS if the payment lands before that day’s 14:30 cutoff. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, and openWorldHint=true, and the description reinforces rather than contradicts them while adding context the annotations cannot convey: the call only returns a payment link, no paper is printed or postage bought until payment completes, and the operation becomes irreversible at print time. It also discloses a failure mode (quote mismatch aborts the send) and the domestic-address restriction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded: action and artifact first, then the payment-link caveat, then usage triggers, then the email exclusion and address scope, then prerequisites and the irreversibility warning. Every sentence contributes a distinct fact and no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, open-world mutation with an output schema (which removes any need to describe return payloads), the description covers prerequisites, cost-confirmation flow, domestic scope, irreversibility, and the not-an-email distinction. Nothing an agent needs in order to decide and call correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already fully documented in the schema, including the idempotency-key reuse behavior and the confirm_total_cents match requirement. The description largely restates these ('confirm_total_cents matching the current quote', 'requires a draft_id from create_draft') and adds only the linkage to create_draft as genuinely new meaning. Baseline 3 is appropriate when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create an order for a real, physical letter through the United States Postal Service') and immediately scopes it against the obvious confusable sibling by declaring 'This is NOT email — use an email tool for email.' An agent can distinguish this from create_draft, preview_draft, or an email tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('whenever the user asks to mail, post, send by post, or physically send a letter'), an exclusion ('This is NOT email'), a geographic limit ('US domestic addresses only'), and hard prerequisites (a draft_id from create_draft, a confirm_total_cents matching the live quote). This is exactly the when/when-not/alternatives coverage the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_draftUpdate a Letter DraftAInspect
Change the recipient, body, tier or colour of a draft that has not been sent, and re-price it. Returns a new page count and a new quote, so the previous total is void — state the new total to the user before sending. The 6-printed-page maximum applies to the new body as well: a replacement that renders to 7 or more pages is refused and the draft is left as it was. This creates nothing and mails nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | A complete US postal address. US domestic addresses only. | |
| tier | No | Which product to buy. Call get_pricing first and pass a tier it lists: standard is a plain First-Class letter. certified, certified_err, proof_of_mailing and registered are other products the current price card may not sell, and a tier it does not sell is refused rather than substituted — so do not describe one to the user until get_pricing has listed it. | |
| colour | No | Omit this. The current price card prints black & white only; true is refused. | |
| draft_id | Yes | The draft_id returned by create_draft. | |
| body_markdown | No | Replaces the whole letter text. It must render to 6 printed pages or fewer — roughly 2,400 words of body text. | |
| from_address_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | The next call to make. Read it before answering the user. |
| tier | Yes | The product this draft is priced as, as passed to create_draft or update_draft. |
| quote | Yes | A priced letter. State total.display to the user before sending, and pass total.amount_cents as confirm_total_cents. |
| draft_id | Yes | Pass this to preview_draft, update_draft and send_letter. |
| expires_at | Yes | ISO 8601 instant the draft is deleted. Nothing is charged if it expires. |
| page_count | Yes | Printed pages, as counted by the renderer. Never more than 6 — a longer body is refused. |
| tier_title | Yes | What the price card in force calls that product, such as Standard. Use this name when you tell the user what they are buying. |
| sheet_count | Yes | Sheets of paper this letter is printed on: one page per sheet, one side each, up to 3 pages; a letter of 4 to 6 pages is printed on both sides, so it is never more than 3 sheets. |
| included_pages | Yes | Printed pages the headline price covers. This draft is priced at that total up to this many pages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only assert destructiveHint=false and readOnlyHint=false), the description discloses the re-pricing consequence ('previous total is void'), the 6-page constraint and its enforcement ('a replacement that renders to 7 or more pages is refused and the draft is left as it was'), and that partial failure leaves state intact. That is exactly the kind of behavioral detail annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and followed by consequence, constraint, and scope boundary. Nothing is redundant and each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the return values need no explanation, yet the description still flags the new page count and quote. Combined with annotations and complete nested schema coverage, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (83%), so the baseline is 3, but the description goes past the schema by tying the body param to the 6-printed-page refusal rule and its state-preservation behavior, and by reinforcing that the new quote must be surfaced to the user before sending.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Change the recipient, body, tier or colour of a draft') and scopes it to one 'that has not been sent'. It also names the editable fields, so an agent can distinguish it from create_draft, send_letter and preview_draft without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context — a draft that has not been sent — and closes the 'creates/mails' door ('This creates nothing and mails nothing'), which implicitly routes send_letter and create_draft to their own tools. It does not, however, explicitly name those alternatives or state when-not to use it in those words.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_addressValidate a US Postal AddressARead-onlyIdempotentInspect
Check a US postal address and return it in the normalized form the envelope will be printed with, plus any warnings. The address is checked against the Google Address Validation service, which receives the address and nothing else. Use this before create_draft whenever the address came from a person rather than from an earlier tool result. Requires a complete street address: this does not look up, append or find an address from a name, and it does not handle addresses outside the United States. This creates nothing and mails nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | A complete US postal address. US domestic addresses only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| address | Yes | Null when USPS could not answer about the address at all. |
| message | Yes | The sentence to act on. Read it before answering the user. |
| corrections | Yes | What USPS changed. Tell the user if it corrected anything material. |
| deliverable | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds real context beyond them: the address is sent to the Google Address Validation service and nothing else (a privacy disclosure), and 'this creates nothing and mails nothing' reassures about side effects. It stops short of saying what an invalid/unverifiable address yields beyond 'warnings' or whether the call can fail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with purpose, then usage, then scope limits. Each sentence carries information, though 'This creates nothing and mails nothing' partially overlaps with the destructiveHint=false annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the safety profile is covered by annotations. The description supplies the remaining essentials: correct usage ordering, the external dependency, and the US-only/complete-address boundary conditions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every nested field (name, line1, line2, state, postal_code) is documented in the schema, so the baseline is 3. The description's 'requires a complete street address' and 'does not look up... from a name' mostly restate the required list plus behavior, adding little syntax or format detail beyond the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check a US postal address') and describes the outcome ('return it in the normalized form the envelope will be printed with, plus any warnings'), which distinguishes it from every sibling. An agent can tell this apart from create_draft or get_letter_status without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'Use this before create_draft whenever the address came from a person rather than from an earlier tool result' names both the alternative and the selecting condition. It also names when-not-to-use by exclusion: no lookup from a name, no non-US addresses.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
- First observed
create_draft - First observed
get_letter_status - First observed
get_pricing - First observed
list_letters - First observed
preview_draft - First observed
send_letter - First observed
update_draft - First observed
validate_address
Publisher details
- Operator
- PaperAgent · Publisher source
- Operator website
- https://paperagent.dev
- Vendor relationship
- First-party
- Documentation
- https://paperagent.dev/docs
- Trust center
- Not available
- Restrictions
- US addresses only. Letter tools need sign-in with an email code, and each letter is paid by card before it is printed.
Related MCP Connectors
Mails paper letters that your AI writes with you: US Certified Mail and 30 European countries.
Let AI agents prepare, review, pay for, and send real letters and postcards.
Let AI agents prepare, review, pay for, and send real letters and postcards.
Send a USPS Certified Mail letter to any US address from ChatGPT, Claude or Grok. The assistant prepares the letter and hands back a review link; a person reads it, checks the recipient, pays and authorizes. Nothing is printed, mailed or charged without that approval. $16.17 with the electronic return receipt, $13.18 without. No subscription, and no account needed to see a price. Docs: https://piloxa.com/send-a-certified-letter-online
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to prepare, price, review, pay for, and send real physical letters and postcards via a hosted MCP server.-
- AlicenseNot gradedqualityBmaintenanceEnables agents to create and pay for physical postcards and letters, returning print previews and Stripe checkout links, with human review before USPS First-Class mailing to US addresses.MIT
- AlicenseNot gradedqualityBmaintenanceHosted remote MCP server that lets AI agents compose, price, send, and track real physical letters worldwide.1MIT
- AlicenseAqualityDmaintenanceEnables AI agents to send physical letters and postcards to over 200 countries using Solana cryptocurrency for payment. It provides tools for generating mail quotes, managing wallet balances, and automating physical correspondence directly through the Model Context Protocol.448 npm1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.