Agent Letter Desk
Server Details
Your AI writes letters. We send them as real post to 31 countries, with status and e-mail updates.
- Status
- Healthy
- Uptime
- 17.4% over 26 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 18 tools
Most tools split cleanly along resource (letter vs. card) and lifecycle stage (list → prepare → send), but cancel_letter and withdraw_order both stop a paid letter and refund the full price before printing, and only careful reading of the descriptions reveals which to pick. get_card_view is an explicitly 'do not call' internal tool that adds noise to the selection surface. The letter/card and prepare/send pairs are otherwise well separated.
Every name is snake_case verb_noun (prepare_letter, send_card, get_letter_status, list_recipients, cancel_letter), with no camelCase or bare-noun outliers. The verb prefixes (get/list/prepare/send/cancel/delete/save/update/withdraw) map consistently to read, draft, execute, and mutate actions.
18 tools for a domain covering letters, cards, batches, addresses, preferences, support, and refunds is defensible, with most tools earning their place. It sits slightly above the comfortable 3-15 range, and get_card_view (documented as never to be called) is a tool that earns no place at all.
The core lifecycle is well covered: guides and recipients → prepare → preview/status → send, plus cancellation, withdrawal, address CRUD, preferences, and support. Gaps exist around orders and payments: there is no tool to list orders or invoices, or to check the payment/charge state of a prepared batch beyond what prepare_* and send_* return.
Available Tools
18 toolscancel_letterBrief vor dem Druck stornierenADestructiveIdempotentInspect
Use this when the user wants to stop a letter of this service. A prepared letter is cancelled at once; nothing was sent or charged. If this tool cancels a paid letter, we refund the full price. A sent letter is cancelled only if the print partner has not started to print it; otherwise the result is TOO_LATE. This tool does not cancel a contract. To cancel a contract (Kündigung), prepare a letter with prepare_letter. Also a greeting card. For a whole batch or card batch, give batch_id: every item not printed yet is cancelled. One item of a prepared batch leaves it: the batch needs a new approval.
| Name | Required | Description | Default |
|---|---|---|---|
| batch_id | No | The batch_id from prepare_letter with recipients. Cancels every letter of the batch that is not printed yet. Then do not give letter_id. | |
| letter_id | No | The letter_id from prepare_letter, for one letter. For a whole batch, give batch_id instead. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| letters | No | |
| outcome | No | |
| batch_id | No | |
| letter_id | No | |
| transaction_state | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint/idempotentHint, and the description adds real semantics beyond them: prepared letters are cancelled instantly with nothing sent or charged, paid letters are fully refunded, printed letters cannot be cancelled, and removing one item from a batch invalidates the batch approval. The destructive consequences are spelled out precisely, with no contradiction of the annotations.
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 the core purpose and the cancellation outcomes, then alternatives, then batch mechanics. A few fragments ('Also a greeting card.') are abrupt and slightly slowing, but almost every sentence carries an operational fact.
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 and the description still names the key failure result (TOO_LATE), which is the main thing an agent must handle. Coverage of refunds, contract vs. letter, and batch edge cases is thorough; only the terse greeting-card remark is left ambiguous.
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% and already documents both ids and their formats, so the baseline is 3; the description earns more by adding the mutual-exclusion rule ('Then do not give letter_id') and the batch-approval consequence of cancelling a single item, which the schema does not state.
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 ('stop a letter of this service', 'cancelled') and immediately disambiguates from the sibling concern it is most likely confused with: 'This tool does not cancel a contract.' An agent can separate it from prepare_letter/send_letter 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?
Explicit when-to-use plus alternatives: contracts are cancelled by preparing a letter with prepare_letter instead, and batch scope is selected by passing batch_id. It also gives the exclusion condition (already printed → TOO_LATE) that tells the agent when the call will not succeed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contact_supportSupport kontaktierenAInspect
Use this when the user has a problem or a question that our support team must answer. Topics: letters, cards, orders, payments and the account. Do not use it to write or mail a letter. Sends the user's message by e-mail to our support team. The user gets a copy by e-mail. Returns a ticket number. Send a message only after the user agreed to its text. If the message is about one letter or order, give its id in reference. Do not put passwords or payment card numbers in the message.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | The message of the user, in the user's words. 1 to 2000 characters. Say what happened and what the user wants. | |
| category | Yes | What the message is about. order_payment: an order, a payment or a refund. | |
| reference | No | Optional. A letter_id, batch_id or order_id of this account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| answer | Yes | How and when we answer. |
| ticket | Yes | The ticket number, for example ALD-7KQ2MX. Tell it to the user. |
| answer_to | Yes | The masked e-mail address of the account. Our answer goes there. |
| copy_sent | Yes | True when the user got a copy of the message by e-mail. |
| next_step | Yes | |
| reference | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag a non-read-only, open-world, non-idempotent call; the description adds real context on top: the message is e-mailed to support, the user receives a copy, a ticket number comes back, and secrets (passwords, card numbers) must not be included. It stops short of stating whether a failed send or a retry produces a duplicate ticket, which matters for a non-idempotent tool.
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-loads the when-to-use clause, then behavior, then constraints, each as one short sentence with no filler. Every statement (topics, exclusion, confirmation, reference, secret handling) carries actionable information.
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?
Covers trigger, scope, side effects, consent requirement, and the return value (ticket number), and an output schema exists for the full return shape. Nothing needed to invoke it correctly is missing for a 3-parameter mutation 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 coverage is 100%, so the baseline is 3; the description still adds decision logic beyond the schema — attach a reference only when the message concerns a single letter or order, and keep the message in the user's own words without credentials. That is genuine routing guidance rather than restatement.
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 action (sends the user's message by e-mail to the support team), the outcome (returns a ticket number), and explicitly distinguishes itself from the nearest sibling domain ("Do not use it to write or mail a letter"). An agent can tell this apart from send_letter/prepare_letter without inspecting schemas.
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 the triggering condition (user has a problem or question support must answer), enumerates covered topics, names an explicit exclusion, and adds prerequisites (only send after the user agreed to the text). Alternative routing is covered by the write/mail exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_card_pictureKartenbild erstellen (2 Entwürfe)AInspect
Use this to make the picture for the front of a greeting card. Our picture tool makes 2 drafts, or 1 draft from photos. Each draft is shown as the printed card front. First ask the open questions of get_card_options brief, in one message. Give subjects with roles (an age only if the user gave it), never names. Give photos_decision in every call. Without it, the result is needs_answer: ask the user, then call again. Do not send health details or other sensitive details. Nothing is mailed or charged.
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | Optional. A style id from get_card_options. Show the user the styles of get_card_options brief. The user chooses. Default: "loose-botanical-watercolour". With photo_design_id, use a style from get_card_options (picture_tool.photo_styles). Default then: "loose-watercolour-portrait". | |
| words | No | Optional. The exact words in the picture, for example "Happy 70th, Ruth". At most 40 characters. Use the words of the user. Without words, the picture has no text. No emojis. The card font cannot print them. | |
| details | Yes | 1 to 3 personal details from the user for the motif: the place, the action, a hobby. For example: "her rose garden", "on a sled", "a village in the Alps". Ask the user. Do not invent details. Give who is in the picture in subjects. | |
| language | No | Give the language of the conversation, for example en or de. The upload page and the order page use this language. Without it, the pages use the language of the account. | |
| occasion | No | Optional. The occasion: christmas, birthday, baby, thank-you, condolence, wedding, anniversary, get-well, housewarming, retirement, other. Default: "other". | |
| subjects | No | Who and what the picture shows, at most 8. One entry for each person and each pet, not one for a group. Each: kind (person, pet, object or place) and role, for example "the mother", "a boy", "the family dog". age only if the user gave it, in any form ("15", "about 70"). photo: the number of the photo that shows it, in upload order. from_photo false: drawn without a photo. Never a name. | |
| refine_of | No | For other drafts of the same card: the brief_id of the earlier drafts. | |
| scene_mode | No | Only with photos. "photo": repaint the one photo as it is, in the style. "new": put the people and pets into a new scene from details. Several single photos: "new". | |
| style_source | No | Optional. "user": the user chose the style. "proposed": you chose it, for example after "you decide". | |
| photo_design_id | No | Optional. The design_id of the user's photo upload. The user picks up to 5 photos at the upload link and ticks the one box. Then use a style from picture_tool.photo_styles. | |
| photos_decision | No | Required. The answer to the photo question. "uploaded": the user uploaded photos; give photo_design_id too. "declined": draw the people and pets without photos. "not_needed": the picture shows no real people and no pets. | |
| photo_design_ids | No | Optional. For one picture from 2 to 5 photos: the design_ids of the user's photos, in order. Each photo comes from an upload with the one box ticked. Do not give photo_design_id too. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| next_step | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare a non-destructive, non-open-world, non-idempotent creation operation. The description adds useful behavior beyond that: it makes two drafts or one from photos, each draft is shown as the printed card front, a missing photos_decision returns needs_answer, and nothing is mailed or charged.
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 purpose and the key workflow. It is generally efficient, though it repeats draft-count and photo/style details that also appear in the schema.
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 12 parameters and an output schema, the description covers the critical preconditions, privacy restriction, and failure mode. It leaves detailed parameter workflows such as refine_of and scene_mode to the schema, which is acceptable because coverage is complete.
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 the baseline is 3. The description still adds important meaning for subjects (use roles, include age only if the user gave it, never names) and photos_decision (required in every call; its absence produces needs_answer), plus it routes style selection through get_card_options.
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: make the picture for the front of a greeting card. It also clarifies the output form (2 drafts, or 1 draft from photos) and distinguishes itself from get_card_options by telling the agent to ask that tool's questions first.
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 workflow guidance: first ask the open questions of get_card_options in one message, always include photos_decision, and treat needs_answer as a signal to ask the user and call again. It does not explicitly compare this tool to prepare_card or send_card, so it stops short of full alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_addressAbsenderadresse löschenADestructiveIdempotentInspect
Use this when the user wants to remove a saved sender address. Deletes it from the account. Delete an address only after the user asks for it. If it was the default address, the most recently used address becomes the default. A prepared letter keeps its own copy of the sender address. The server does not save a deleted address again.
| Name | Required | Description | Default |
|---|---|---|---|
| sender_address_id | Yes | The sender_address_id from get_account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes | |
| account_url | Yes | |
| sender_addresses | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint and idempotentHint annotations, the description explains important consequences: default-address reassignment, the fact that a prepared letter keeps its own copy, and that the server will not save the deleted address again. This materially improves the agent's understanding of the operation's side effects.
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 usage condition, then the action and key behavioral consequences. Each sentence carries distinct, useful information with no 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?
Given the single required parameter, full schema coverage, existing output schema, and destructive annotations, the description covers the important behavioral details an agent needs. Nothing critical is missing for correct invocation.
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 the schema already explains that sender_address_id comes from get_account. The description does not add parameter-level meaning beyond that, so the baseline score of 3 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: remove a saved sender address and delete it from the account. It is clearly distinguishable from the sibling save_address tool and does not merely restate the title.
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 usage context ('when the user wants to remove a saved sender address') and an explicit guardrail ('only after the user asks for it'). It does not name a specific alternative sibling tool, so it falls just short of full when/when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accountAbsenderkontoARead-onlyIdempotentInspect
Use this when the user wants to mail a letter, an Einschreiben or US Certified Mail: it returns the sender of the letter. The sender is always the account holder. Returns the name, the e-mail, the saved sender addresses (one is the default), the preferences and the unread letter updates. If the account has no saved address, ask the user for it. Then call save_address. The unread updates cover greeting cards too.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| account | Yes | |
| sender_addresses | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, non-destructive profile, and the description adds useful context: the sender is always the account holder, what account data is returned, and how to handle a missing saved address. It does not discuss permissions or rate limits, but those are less critical here given the annotations.
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 primary use case and stays focused on account retrieval plus the missing-address branch. It is slightly longer than necessary because the greeting-card note about unread updates is tangential, but there is no serious waste.
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 a rich output schema, full annotation coverage, and no input parameters, the description is complete enough: it explains the trigger, returned data, and the empty-address fallback path. Nothing essential to correct invocation 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?
The tool has zero parameters, so there are no parameter semantics for the description to clarify. The baseline for zero-parameter tools applies.
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: it returns the sender/account-holder details for mailing use cases. It distinguishes the tool from save_address by explicitly routing missing-address cases there, so an agent can identify its role among siblings.
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 an explicit trigger: use when the user wants to mail a letter, Einschreiben, or US Certified Mail. It also provides the fallback workflow: if no saved address exists, ask the user and then call save_address.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_card_optionsGrußkarten-OptionenARead-onlyInspect
Use this when the user wants to mail a greeting card by post: Christmas, birthday, wedding, anniversary, baby, thank-you and condolence cards to people in the United States. Returns the card format, the picture brief (shape, minimum size, style and the questions for the user), the text front option, the message limit, the price, the Christmas order dates and an upload link for the picture. Call it first. Then call create_card_picture: our picture tool makes the picture. Nothing is prepared or charged.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | Give the language of the conversation, for example en or de. The upload page and the order page use this language. Without it, the pages use the language of the account. | |
| upload_purpose | No | Optional. What the user uploads at upload_url. "reference": photos for our picture tool. "print": one finished picture, printed as it is. Without it, the page offers photos and a finished picture. |
Output Schema
| Name | Required | Description |
|---|---|---|
| price | Yes | |
| format | Yes | |
| image_brief | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description adds real value beyond them with 'Nothing is prepared or charged', which tells the agent this is a pure information step distinct from prepare_card/send_card. The disclosed return contents (including the upload link and Christmas order dates) further describe what the agent will get back. It stops short of describing pagination or error conditions, but for a static-options lookup that is a minor gap.
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 trigger condition is front-loaded, the payload list is compact, and the workflow instruction comes last where an agent will act on it. The enumeration of card occasions and payload fields is slightly dense but each item is decision-relevant, and there is no 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?
With an output schema present, the return-value recap is technically redundant, but here it doubles as guidance on what the agent can hand back to the user, and the 'call it first / then create_card_picture' ordering covers the multi-tool flow. Combined with the no-charge assurance, an agent has enough to invoke this correctly without consulting siblings.
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 both parameters are enums with self-explanatory schema text (language, upload_purpose with 'reference' vs 'print'). The description only alludes to the upload link and picture brief, adding no syntax or defaulting detail beyond what the schema already states, so the baseline 3 applies.
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 names a concrete verb+resource ('get card options' for mailing a greeting card by post) and enumerates the returned payload: card format, picture brief, text-front option, message limit, price, Christmas order dates and upload link. It also scopes the offering (Christmas, birthday, wedding, anniversary, baby, thank-you, condolence cards to people in the United States), which separates it from the letter-related siblings.
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 explicit entry conditions ('Use this when the user wants to mail a greeting card by post') and hard sequencing ('Call it first. Then call create_card_picture'), which routes the agent through the correct multi-step flow. What is missing is an explicit exclusion, e.g. that letters use list_letter_types or that non-US recipients are out of scope, so the when-not case must be inferred from the scope sentence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_card_viewKartenvorschau-Daten (nur für die Vorschau)ARead-onlyIdempotentInspect
Only the card preview view calls this tool. Do not call it. It returns how the first card of a prepared card batch is drawn.
| Name | Required | Description | Default |
|---|---|---|---|
| batch_id | Yes | The batch_id from prepare_card. |
Output Schema
| Name | Required | Description |
|---|---|---|
| view | Yes | |
| batch_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds the critical non-obvious trait: this is an internal tool reserved for the card preview view. It also scopes the result to the first card only, not the whole batch. It does not say why the restriction exists or what happens if it is called anyway.
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, with the most decision-relevant information ('Do not call it') placed up front, followed by scope and return meaning. No 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?
An output schema exists, annotations cover safety, and the one parameter is fully described in-schema. The description supplies the only thing an agent still needs: that this tool is off-limits and why it exists.
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% and the single batch_id parameter is documented in-schema with its UUID pattern and its origin ('from prepare_card'). The description adds nothing about the parameter, so baseline 3 applies.
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 names the specific resource (the rendering of the first card of a prepared card batch) and the verb (returns), so an agent can distinguish it from prepare_card or get_card_options. The phrasing 'how the first card ... is drawn' is slightly vague about whether this is a layout/render preview versus card data, which keeps it from 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 explicit negative guidance — 'Only the card preview view calls this tool. Do not call it.' — which is a rare and unambiguous when-not statement. It stops short of naming what an agent should call instead for card preview data, so it is clear context without a full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_letter_statusBrief verfolgenARead-onlyIdempotentInspect
Use this when the user asks if a letter was mailed, handed to the post or delivered. Returns the status of one letter: ready, sending, unknown, sent, failed, unresolved, expired, cancelled or not_mailed. A prepared letter: the preview link, the enclosures and the page count. A sent letter: the stage at the print partner, the tracking number, the events, their dates (handed_over_at, delivered_at, returned_at) and a record of the send. Also a greeting card. For a batch, give batch_id: the result shows each item with its status, stage and tracking number.
| Name | Required | Description | Default |
|---|---|---|---|
| batch_id | No | The batch_id from prepare_letter with recipients. Returns the status of every letter of the batch. Then do not give letter_id. | |
| letter_id | No | The letter_id from prepare_letter, for one letter. For a whole batch, give batch_id instead. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| letters | No | |
| batch_id | No | |
| letter_id | No | |
| returned_at | No | When the post reported the letter undeliverable or returned. Null otherwise. |
| delivered_at | No | When the post recorded the delivery. Null without a delivery record. |
| handed_over_at | No | When the post had the letter: the first event at or after the handover. Null until the post's event exists. May be later than the real handover if that event is missing. |
| recipient_name | No | |
| transaction_state | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered and the description is consistent with it. Beyond that it discloses the status vocabulary and which tracking fields appear per state (handed_over_at, delivered_at, returned_at), which is useful, but it duplicates return-value content the output schema already carries rather than adding behavioral context such as refresh/polling timing or what an 'unknown'/'unresolved' status implies for retries.
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 usage trigger is front-loaded and the mode split (single vs batch) is clear, with no filler sentences. It is somewhat long because it enumerates return fields that the output schema already defines, which is the only real waste.
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 read-only status tool with an output schema and fully documented parameters, the description covers the intent, the status vocabulary, the two modes and the conditional fields. The remaining gap is that both parameters are optional, so the definition never says what the tool returns or whether it errors when neither letter_id nor batch_id is given.
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% and both parameters already document themselves, including the 'then do not give letter_id' exclusivity note. The description reinforces only batch_id ('For a batch, give batch_id') and never mentions letter_id in prose, nor does it explain what happens when neither optional parameter is supplied. Baseline 3 is appropriate where 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 (returns the status of one letter, or a whole batch) and anchors it to the user intent ('asks if a letter was mailed, handed to the post or delivered'). It also enumerates the possible statuses and the returned payload shape, so an agent can tell it apart from list_letters or get_card_view 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?
The opening sentence gives a concrete when-to-use trigger, and the closing sentence explains the routing between the single-letter mode (letter_id) and the batch mode ('For a batch, give batch_id'). It never names an alternative sibling such as list_letters for bulk listing without status, so there is no explicit exclusion rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_lettersMeine BriefeARead-onlyIdempotentInspect
Use this when the user asks about earlier letters by post or Einschreiben, for example which letters went out last month. Returns the letters of the user, newest first: status, recipient, postal service, price, tracking number, the latest event, handed_over_at, delivered_at and returned_at. has_unseen_updates marks a letter with events that you did not read. Call get_letter_status for its events. Greeting cards are in it (purpose greeting_card). Each batch item has its batch_id; batches sums up each batch.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many letters. Default 10. |
Output Schema
| Name | Required | Description |
|---|---|---|
| letters | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state readOnly/idempotent/non-destructive/closed-world, so the description's added value is the ordering guarantee ('newest first'), the returned field set, and the semantics of has_unseen_updates as an unread-events marker. It stops short of saying whether reading the list itself clears that flag, which is the one behavioral question an agent might still have.
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 the usage trigger, then the payload, then cross-references; nearly every sentence carries signal. The greeting-card and batch asides are terse but slightly clipped in phrasing ('batches sums up each batch'), which costs a bit of polish rather than length.
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 single-filter list tool with an output schema, the description covers trigger, ordering, field inventory, and sibling routing. Remaining gaps are minor: no pagination/truncation guidance and no note on whether the read affects has_unseen_updates.
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?
Only one parameter (limit), and the schema already documents it at 100% coverage including default and maximum. The description adds nothing about paging or what happens when the limit truncates a large letter history, so baseline 3 applies.
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 (list/returns) plus resource (letters of the user), with an explicit trigger context ('user asks about earlier letters by post or Einschreiben'). It also distinguishes itself from the sibling that reads details: 'Call get_letter_status for its events.'
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 a concrete when-to-use example ('which letters went out last month') and routes the agent to get_letter_status for event timelines, so the split between list and detail tools is explicit. It also clarifies that greeting cards appear in results, preventing a wrong assumption about the dataset.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_letter_typesBrief-Leitfäden findenARead-onlyIdempotentInspect
Use this when the user needs a formal letter by post: a cancellation (Kündigung) or a withdrawal (Widerruf, Rücktritt). Returns letter guides: an example letter based on an official sample, the facts to ask the user, verified recipients and notes for the user. With a country: its guides, postal services and prices. Without: an index with prices. Letters without a guide are possible, for example a defect notice to a landlord, a complaint (Beschwerde) or a GDPR access request.
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | The recipient country. Gives the full guides for it and its postal services with prices. | |
| guide_id | No | Optional. One guide in full. |
Output Schema
| Name | Required | Description |
|---|---|---|
| guides | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe, idempotent, closed read, so the description is free to add the parts not in metadata: what the response contains (sample-based example letter, the facts to ask the user, verified recipients, notes) and the branch that yields postal services/prices versus a price index. No auth or pagination notes, but nothing contradicts the annotations.
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 the activation condition, then return contents, then the with/without-country branch, then the exception. Dense but every clause carries routing or payload information; only the country-branch sentence slightly overlaps the schema.
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 an output schema exists, the description does not need to enumerate return fields yet still characterizes them usefully, and both optional parameters' effects are explained. A mention of the sibling tools this is paired with (e.g. prepare_letter) is the only notable omission.
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 baseline is 3, but the description adds real semantics: 'With a country: its guides, postal services and prices. Without: an index with prices' explains the optionality of country in behavioral terms rather than just restating the enum. guide_id is only covered by the schema.
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 concrete verb and resource ('find letter guides' / returns letter guides) plus the scope of use cases (Kündigung, Widerruf/Rücktritt). It implicitly separates itself from list_letters and prepare_letter by describing the guide content, but no sibling is named, so routing still requires a small inference.
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 when the user needs a formal letter by post: a cancellation or a withdrawal' gives an explicit activation condition, and the closing sentence gives a de-selection condition (letters without a guide, e.g. defect notice, Beschwerde, GDPR request). It stops short of naming the alternative tool to use in that case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_recipientsEmpfängeradresse findenARead-onlyIdempotentInspect
Use this when a letter goes to a known company: it returns verified postal addresses, each with the page where it was read and the date. An address that we could not confirm again is marked unverified, with a note. Covers phone companies, energy suppliers, the broadcasting fee (Rundfunkbeitrag), TV and fitness studios in Austria and Germany. For other recipients (landlord, insurer, authority), use the address in the user's contract, order, invoice or a letter from the recipient.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional. Words for the company: a brand, a part of the name or a category, for example Telekom, McFIT, gym, Fitnessstudio, Strom, energy or GEZ. Each word is matched on its own. | |
| country | No | Optional. Only recipients in this country. | |
| purpose | No | Optional. Only recipients for this purpose. |
Output Schema
| Name | Required | Description |
|---|---|---|
| recipients | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds the meaningful behavioral detail: results are verified addresses with provenance (page and date), and stale entries are flagged 'unverified' with a note. It does not say what an empty or unmatched query returns, but the verification-status semantics are genuinely additive.
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 short sentences, front-loaded with the trigger condition, then result semantics, then scope, then the exclusion. Every sentence earns its place, though the coverage list and the exclusion could be tightened into one clause.
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?
Output schema exists and annotations cover the safety profile, so the description only needed to cover selection context and provenance semantics, which it does. The one gap is that all three parameters are optional yet the description never says what a call with no filters returns.
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 each parameter is already documented with examples and enum meanings; the description only implicitly echoes the query and country dimensions via the company-category and Austria/Germany lists. Baseline 3 applies when the schema carries the weight and the description adds nothing operational beyond it.
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 ('returns verified postal addresses') plus what each result carries: the page where it was read and the date. It also scopes the domain (Austrian/German phone, energy, Rundfunkbeitrag, TV and fitness companies), which separates it from siblings like save_address, delete_address or list_letters.
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?
Opens with an explicit trigger ('Use this when a letter goes to a known company') and an explicit non-trigger, routing other recipients (landlord, insurer, authority) to the user's contract, order, invoice or recipient letter. Nothing is left to inference about when this lookup is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_cardGrußkarte vorbereiten (kostenlose Vorschau)AInspect
Use this when the user wants to mail a greeting card to people in the US. Give the design_id of the uploaded picture or a short front_text, the message and 1 to 20 recipients, each with an optional greeting name and message. For more recipients, call it again with batch_id (at most 100 cards in a batch). Ask the user for the date of the occasion, if it has one. Give it as occasion_date. Returns the batch, the price, each card and the notes. Nothing is mailed or charged. Do not use it for e-mail or e-cards.
| Name | Required | Description | Default |
|---|---|---|---|
| message | No | Required, unless each recipient has its own message. The message inside the card, written with the user. Use {first_name} for the greeting name of each recipient, for example "Dear {first_name},". No other field. It must fit the card: see message.max_chars in get_card_options. Always end the message with the closing and the name of the sender, as the user signs. Put the closing and the name on two lines. For example: "Love," and then "Tom". Write the name as text, not as a field. Put the greeting, each paragraph, the closing and the name on separate lines. Use a real line break between them. In English, start each paragraph with a capital letter. The card sets each part in its own style. No emojis. The card font cannot print them. | |
| batch_id | No | Optional. The batch_id from an earlier prepare_card. Use it to add up to 20 more recipients to that card batch. Do not use it after send_card or after the user ordered the batch. Give the same design_id or front_text, front_style and sender_address_id. The batch then gets a new batch_sha256 and a new total. The user must approve the whole batch again. | |
| language | No | Give the language of the conversation, for example en or de. The upload page and the order page use this language. Without it, the pages use the language of the account. | |
| design_id | No | For a picture front: the design_id of the chosen draft from create_card_picture, or of the user's own picture from the upload link. Give design_id or front_text, not both. | |
| front_text | No | A short text for the front, for example "Merry Christmas". Use it when you cannot make a picture. At most 40 characters on 1 to 3 lines. No fields. No emojis. The card font cannot print them. Give design_id or front_text, not both. | |
| recipients | Yes | 1 to 20 recipients in the United States. Each gets the same card. A recipient without its own message gets message. | |
| reprint_of | No | Optional. Use it only when get_letter_status or list_letters shows resend_offer with state available for a card, or when the user has our e-mail about a free reprint. Give the letter_id or the Card ID of that card (for example 3F2A-9C1B-77D0). Give one recipient: the same recipient as on that card. Give the same sender_address_id. Do not give batch_id. Write the message with the user again. The price is 0. | |
| front_style | No | Optional, only with front_text. "classic": Off-white card with dark green text. "winter": Deep blue card with off-white text. Default: "classic". | |
| occasion_date | No | Optional. The date of the occasion as YYYY-MM-DD, for example 2026-12-25. One date for the batch. We compare it with the latest delivery day and say if the card arrives in time. Leave it out for a card after the occasion. With batch_id, leave it out to keep the date of the batch. | |
| sender_address_id | No | Optional. A saved address from get_account for the sender. A US address is the return address. Default: the default address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cards | Yes | |
| price | Yes | |
| status | Yes | |
| batch_id | Yes | |
| card_count | Yes | |
| batch_sha256 | Yes | |
| transaction_state | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark this as non-read-only but non-destructive, and the description supplies the crucial context the annotations cannot: 'Nothing is mailed or charged' (a free preview that creates a batch) and that a re-batched call produces a new batch_sha256 requiring re-approval. These are exactly the behavioral traits an agent needs before invoking a mutating-but-not-finalizing tool.
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?
A single front-loaded paragraph: use case first, then inputs, then return values, then the exclusion. It is dense but every sentence carries distinct information (returns, nothing charged, e-card exclusion). Minor room to tighten the input enumeration since the schema covers it.
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?
Covers what it returns ('the batch, the price, each card and the notes'), the no-charge guarantee, the batch-growth path, and the negative scope, and an output schema exists to carry return structure. Nothing an agent needs 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?
Schema coverage is 100% and already documents every field in depth, so the baseline is low. The description still adds meaning beyond the schema by stating the batch_id re-call workflow and the 'at most 100 cards in a batch' ceiling, which the schema does not state, plus the design_id-vs-front_text either/or.
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?
Opens with a specific condition-of-use verb phrase ('mail a greeting card to people in the US') and names the resource and scope. It explicitly excludes e-mail and e-cards, which cleanly separates it from send_card and prepare_letter siblings without opening either 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 when-to-use ('when the user wants to mail a greeting card'), when-not ('Do not use it for e-mail or e-cards'), and the branching path for volume ('For more recipients, call it again with batch_id'). The schema further routes to create_card_picture, get_card_options, and get_account, so alternatives are discoverable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_letterBrief vorbereiten (kostenlose Vorschau)AInspect
Use this when the user wants to send a paper letter by post: a Brief, an Einschreiben or US Certified Mail. Examples: a Mängelanzeige to a landlord, an objection (Einspruch, Widerspruch), a DSGVO-Auskunft, a Widerruf, a Kündigung, a reply to a letter. Use it also when the user wants to send or schicken a letter to a person: birthday, thanks, greetings. When the user asks for a letter text, offer to mail it. Returns a PDF preview. Nothing is mailed or charged. Do not use it for e-mail or chat messages.
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | Optional. A ready look for layout personal or address_sheet: elegant, warm, playful, simple or classic. Use it when the user wants a nice personal letter but names no fonts. elegant: script head, serif text, a line. warm: handwriting head, serif text, a heart. playful: script head, handwriting text, a star. simple: sans, no decoration. classic: serif, a branch. font_head, font_body or decoration, if you give them, replace that part of the style. Not for layout business. Without layout, a style makes the letter personal, and the server may still choose the address sheet. Do not add layout personal only because of a style: then the free automatic address sheet is off. Tell the user the style in the user's language (elegant, herzlich/warm, verspielt/playful, schlicht/simple, klassisch/classic). | |
| layout | No | Optional. The look of the letter. business: a letterhead with the sender. personal: no letterhead, for letters to friends and family. address_sheet: page 1 holds only the address, the text starts on page 2 (the price follows the pages). Without layout, the server picks one from the purpose and the recipient. The result names the layout. Use layout only when the user asks for another one. For a personal letter, offer the address sheet. The letter then has no address block. The result says its price. Without layout, a personal letter of 2 or more pages gets the address sheet when the price stays the same. | |
| sender | No | Optional. The sender address, if the account has no saved address or the user wants another one. The name is always the account holder's name. Answers come back to this address. To keep the address for later letters, call save_address. | |
| closing | No | Optional. Only the closing words, for example "Sincerely,". The server adds the name. The default agrees with the language of the letter. For a personal letter, give a closing that suits the person, for example "Alles Liebe" or "Love,". | |
| purpose | Yes | What the letter is for. cancellation: ends a contract (Kündigung). withdrawal: withdraws from a contract (Widerruf, Rücktritt). complaint: complains about a product, a service or a person (Beschwerde). request: asks for information, data or an action (Anfrage, GDPR access request). demand: demands a payment, a refund or a performance (Mahnung, deposit refund, demand letter). notice: tells the recipient a fact (Mängelanzeige, change of address). other: also every personal letter to friends or family (birthday, thank-you, love letter), and also an objection to a decision (Einspruch, Widerspruch). Use other if no other value agrees. | |
| subject | No | Optional. One line, at least 3 characters or one emoji. business: a bold subject line above the salutation, without emoji. Give one for a letter to a landlord, a company or an authority. personal and address_sheet: a heading at the top of the letter (address_sheet: on the address page only), for example "Für Sara". Give it only when the user asks for a heading. The heading may hold up to 3 emoji. They print in black and white. Do not repeat the heading's emoji as the decoration. A long heading prints as the first line of the text instead: over about 55 characters on A4, over about 23 on a personal US letter. The result says so in heading. Without a subject, a personal letter shows the sender's initials (a monogram). | |
| language | No | Optional. The language of the letter, for the default salutation, closing and date. Default: the language of the recipient country. | |
| font_body | No | Optional. Only when the user asks for it. The font of the text: sans, serif, hand or script. For handwriting, use hand. Use script only for a short letter. The address always prints in sans. Default: the layout's font. | |
| font_head | No | Optional. Only when the user asks for it. The font of the heading or monogram: sans, serif, display, hand or script. Only for layout personal and address_sheet: a business letter has no heading and ignores font_head. Default: the layout's font. | |
| recipient | No | The recipient address, if there is no recipient_id. Use the address in the contract, the order, the invoice or a letter from the recipient. | |
| resend_of | No | Optional. Use it only when get_letter_status or list_letters shows resend_offer with state available: the letter_id of the letter that came back. The server sends the same letter again free of charge to the corrected address. The server does not keep the text of a sent letter. Give the text, layout, font_head, font_body, font_sender, decoration, signature, show_date, text_size, page_break_before and language of that letter again. The new letter must have the same number of pages. Use the recipient_id and postal_service from resend_offer. | |
| show_date | No | Optional. Only for layout personal or address_sheet. These letters have no date line. Set show_date true only when the user wants the date. | |
| signature | No | Optional. Only for layout personal or address_sheet. The sign-off name under the closing, for example "dein Thomas" or "Mama". Max 40 characters. Without it, the account holder's name prints. The letter head always shows the account holder's name. | |
| text_size | No | Optional. Only when the user asks for it, or to fit a long personal letter on fewer pages. small, normal or large. Only for layout personal and address_sheet. Use large when the reader sees badly or is very old. Without text_size, a letter that runs a little onto one more page gets small. The result says so. | |
| decoration | No | Optional. Only when the user asks for it. A small black-and-white decoration: heart, branch, line, star, or one emoji, for example 🎄 or 🌻. Only for layout personal or address_sheet. Flags and joined emoji cannot print. Do not repeat an emoji of the heading as the decoration. | |
| paragraphs | Yes | The letter text, one string for each paragraph. A line break in a paragraph starts a new line. Emoji print in black and white. Flags cannot print. Joined emoji (a family) print as separate figures. You can use Markdown: **bold**, *italic*, lists with '- ' or '1. ', headings with '#' or '##', quotes with '> '. '---' prints a line. A list needs at least 2 items. Links, images and tables print as plain text. Write \ before a mark to print it as typed. Do not include the addresses, the date, the salutation, the closing or the name at the end: the server adds them. We mail the letter soon after the approval. We cannot mail it on a later date. For a later date, offer a reminder in the user's AI app; then prepare the letter on that day. German letter: after a salutation with a comma (Germany), start the first paragraph with a small letter, for example "hiermit". After a salutation with "!" (the Austrian default), start with a capital letter, for example "Hiermit". A noun or a name keeps its capital. We refuse a full Social Security number or card number: give only the last 4 digits. Do not put health data or other sensitive data about another person, or their offences, in a letter. Exceptions: that person agreed. The user acts for that person. The letter goes only to that person. The letter claims or defends a right. The letter reports an offence to an authority. The user's own data is allowed, except in letters to the United States. If you are not sure, ask the user one question. Do not refuse a letter only because it names an illness. US letters: do not include health data or other sensitive data (religion, ethnic origin, sexual orientation, union membership, political views, genetic or biometric data). Do not include a full bank or card account number; the last 4 digits are OK. Tell the user. | |
| recipients | No | Optional. The same letter to 2 to 10 recipients (up to 100 after the account's first letter reached the post) in one country, with one postal service. Each item has recipient_id or recipient, and an optional salutation. Then do not give recipient_id or recipient. The text is the same for every recipient. Only the salutation can differ. Do not use placeholders. A batch has no enclosures. | |
| salutation | No | Optional. The default agrees with the language of the letter and is formal. For a personal letter, give a salutation that suits the person, for example "Liebe Oma," or "Dear Sara,". | |
| font_sender | No | Optional. Only when the user asks for it. The font of the sender line under the heading: sans or serif. Only for layout personal and address_sheet. Default: serif when the text is serif, else sans. | |
| recipient_id | No | A recipient_id from list_recipients. Use it when one exists. Then do not give recipient. | |
| postal_service | No | Optional. Default: registered for a letter to a company, landlord, insurer or authority; standard for a personal letter (purpose other, layout personal or address_sheet). Where list_letter_types has no registered letter, the default is standard. Use another postal service only if the user wants it. For a letter with a deadline, keep registered. registered: a registered letter (US: Certified Mail with return receipt; BE, DE, ES). What it records differs by country: see postal_services in list_letter_types. In BE and DE, the record alone is not proof of delivery. standard: a standard letter; only the handover to the post is recorded. standard_next_day (AT and DE only): a standard letter that usually arrives on the next business day, at a higher price. In AT, standard takes 2–3 business days. In DE, standard takes 2–3 business days. If the user wants a standard letter to AT and DE, tell the user both prices and delivery times. Let the user choose. If the user does not choose, use standard. For a standard letter with a deadline, recommend standard_next_day. Tell the user the service name in the user's language (name_user). If a registered letter is not available yet, say so. Do not tell the user to mail the letter themselves. | |
| page_break_before | No | Optional. The paragraphs that start a new page (0-based indexes into paragraphs). Use it when the user wants text on its own page, for example a poem on page 2. Use this instead of blank lines. Index 0: page 1 holds only the letterhead and the address. | |
| sender_address_id | No | Optional. A saved address from get_account. Without sender and sender_address_id, the default address is used. | |
| replaces_letter_id | No | Optional. If the user changed a prepared letter: the letter_id of the old letter. The server cancels the old letter. For each field that you do not give, the new letter keeps the value of the old letter: the layout, only if the user chose it (a personal look with a decoration or a head font stays personal); font_head, font_body and font_sender, if the user chose them; the decoration, unless the new layout is business; signature, show_date and a text_size the user chose carry (personal and address_sheet letters only). The new letter keeps the postal service unless you give one. With a style, the old fonts and decoration do not carry. signature, show_date and text_size still carry. The server decides an automatic text size again. To remove the old sign-off, give signature as an empty string. These do not carry: the enclosures, subject, closing, language and page_break_before. Give them again. The user must upload the enclosures again. | |
| not_employment_or_lease_termination | No | Optional. Use it only after the error NEEDS_HANDWRITTEN_SIGNATURE asks for it. Set it to true only if the user confirmed that the letter is not the kind of letter that the error names. Never set it when the user wants to send that kind of letter. Never set it without the user. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fonts | No | The fonts as printed, defaults included. head is null for a business letter. |
| price | Yes | |
| sender | Yes | |
| status | Yes | |
| heading | No | The top of a personal letter. heading: the subject (address_sheet: on page 1; see heading_where). heading_in_text: the subject did not fit and prints as the first text line. monogram: the sender's initials. Null: business. |
| letters | No | |
| preview | Yes | |
| batch_id | No | |
| letter_id | No | |
| recipient | No | |
| decoration | No | The decoration as printed: a name or one emoji. Null: none. |
| handover_by | No | The latest handover to the post if the user orders now, not the earliest: date (YYYY-MM-DD), meaning latest_day, and text in the user's language ("at the latest … (usually sooner)"). Absent when nothing is mailed. |
| letter_text | Yes | |
| letter_count | No | |
| address_check | No | |
| heading_where | No | address_sheet only: the page of the heading, in words. |
| postal_service | Yes | |
| transaction_state | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, and the description adds the crucial behavioral facts that go beyond them: output is a PDF preview, nothing is mailed and nothing is charged. It stops short of describing the approval/send step that must follow before anything actually goes out, which is the main behavioral gap for a preparation tool.
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?
Six short sentences, front-loaded with the core trigger, then examples, then the preview/no-charge guarantee, then the exclusion. Every sentence adds a distinct decision fact; nothing repeats the name or title.
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 25-parameter tool with an output schema and fully documented parameters, the description covers purpose, scope, cost/send side effects and exclusions adequately. It omits notable behaviors implemented via parameters (multi-recipient batches, resend_of, replaces_letter_id, content-refusal rules), though those are documented in the schema.
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% across 25 parameters, so the schema carries all field-level meaning. The description adds no parameter guidance at all (no mention of required purpose/paragraphs, sender vs recipient, style/layout interplay); baseline 3 applies 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?
The description gives a specific verb+resource (prepare a paper letter for post) and enumerates the concrete letter types (Mängelanzeige, Einspruch, Kündigung, personal letters). It implicitly separates itself from send_letter with 'Returns a PDF preview. Nothing is mailed or charged,' but never names the sibling, so the routing is inferable rather than explicit.
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 when-to-use with a rich set of real examples, an explicit trigger ('When the user asks for a letter text, offer to mail it'), and an explicit exclusion ('Do not use it for e-mail or chat messages'). An agent can decide invocation without opening the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_addressAbsenderadresse speichernADestructiveIdempotentInspect
Use this when the user gives their postal address for letters, or wants to change a saved sender address. Adds a sender address to the account, or changes a saved address (with sender_address_id). Save an address only after the user gave it or agreed to it. Returns the saved address and all saved addresses. The sender name is always the name of the account holder. Only the user can change the name, on the account page.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | The postal address of the user. Leave out the name: the server uses the name of the account. | |
| default | No | Optional. true: this address becomes the default sender address. The first saved address is always the default. | |
| sender_address_id | No | Optional. A sender_address_id from get_account: the server changes this address. Without it, the server adds the address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| address | Yes | |
| outcome | Yes | |
| account_url | Yes | |
| address_check | Yes | |
| sender_addresses | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds real context: saving with an id overwrites a saved address, addresses are only stored after user consent, and 'The sender name is always the name of the account holder.' It still doesn't say what happens to fields omitted during an update, which matters for a destructive-hinted mutation.
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 trigger sentence is front-loaded and the rest is short and dense. The trailing sentence about only the user changing the name on the account page is user-interface trivia that competes with the operational guidance for attention.
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 and full schema coverage, the description covers the essentials: purpose, consent gating, add-versus-overwrite semantics, and the account-name override. Only the effect of a partial overwrite of an existing address is left unexplained for a nested three-parameter mutation 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%, so the baseline is 3. The description explains the add-versus-change meaning of sender_address_id and the name-is-account-holder rule, but both points are already spelled out in the schema property descriptions, so added value over structured data is marginal.
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 plus the two modes: 'Adds a sender address to the account, or changes a saved address (with sender_address_id)'. The add-versus-change split also separates it from delete_address and get_account in the sibling list.
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?
Opens with an explicit trigger ('Use this when the user gives their postal address for letters, or wants to change a saved sender address') and adds a consent precondition: 'Save an address only after the user gave it or agreed to it.' It routes the agent to get_account to obtain a sender_address_id, but never names delete_address as the tool to use for removal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_cardFreigegebene Grußkarten sendenADestructiveIdempotentInspect
Mails the greeting cards of a batch from prepare_card. It costs the approved total. It cannot be undone after printing starts. Use it only after the user approved the picture, the message, each recipient and the total price, in a later answer than prepare_card. Give batch_id, batch_sha256, confirmed_count, recipient_names and confirmed_price_cents. Refuses a changed batch, a changed price and a second send. If distinct_messages is more than 1, give confirmed_distinct_messages. ORDER_REQUIRED: give the user the order_url. Do not call send_card again.
| Name | Required | Description | Default |
|---|---|---|---|
| batch_id | Yes | The batch_id from prepare_card. | |
| batch_sha256 | Yes | The batch_sha256 from prepare_card. | |
| allow_duplicate | No | Set to true only if the user clearly wants a second card to a recipient who got the same card before. | |
| confirmed_count | Yes | The number of cards that the user approved. | |
| recipient_names | Yes | The name of each recipient that the user approved, as in prepare_card. | |
| confirmed_price_cents | Yes | The total price in cents that the user approved: price.amount_cents from prepare_card. | |
| confirmed_distinct_messages | No | The number of different messages that the user saw and approved: distinct_messages from prepare_card. Required when it is more than 1. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| batch_id | No | |
| transaction_state | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, openWorld=true and idempotent=true; the description adds the operationally critical context of cost ('costs the approved total') and irreversibility ('cannot be undone after printing starts'). The stated refusal of a second send and of changed batch/price is consistent with idempotentHint and gives the agent a clear recovery path.
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?
Dense and front-loaded: purpose, cost, irreversibility, preconditions, then instructions. A few phrases are cryptically terse ('ORDER_REQUIRED: give the user the order_url'), and 'Refuses... a second send' partially duplicates 'Do not call send_card again'.
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, money-spending action this covers preconditions, refusal behavior, the confirmation handshake, and the follow-up requirement to surface order_url. With an output schema available and full schema coverage, nothing essential 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 the schema already defines every parameter including the conditional distinct_messages rule and allow_duplicate. The description mostly restates which values to pass ('Give batch_id, batch_sha256, confirmed_count...') rather than adding new meaning, so the baseline 3 applies.
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 ('mails the greeting cards of a batch') and anchors it to a named sibling ('from prepare_card'), so an agent can tell it apart from prepare_card and the letter tools. The irreversible-after-printing scope is stated in the same opening block.
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 preconditions ('only after the user approved the picture, the message, each recipient and the total price, in a later answer than prepare_card'), explicit refusal cases, and an explicit terminal instruction ('Do not call send_card again'). Nothing is left to inference about when this tool should fire.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_letterFreigegebenen Brief per Post sendenADestructiveIdempotentInspect
Mails a prepared letter by post. Use it only for a free resend (resend_of, price 0). For every other letter the user orders on the order page: give the user the order_url. Do not call this tool for a letter with an order_url. Call it only after the user approved the preview and the recipient, in a later answer than prepare_letter. Cannot be undone after printing.
| Name | Required | Description | Default |
|---|---|---|---|
| batch_id | No | The batch_id from prepare_letter with recipients. Sends every letter of the batch. Then do not give letter_id. | |
| letter_id | No | The letter_id from prepare_letter, for one letter. For a batch, give batch_id instead. | |
| batch_sha256 | No | For a batch: the batch_sha256 from prepare_letter. | |
| recipient_name | No | The name of the recipient that the user approved, as in prepare_letter. For one letter only. | |
| allow_duplicate | No | Set to true only if the user clearly wants a second copy of a letter that was already sent. | |
| confirmed_count | No | For a batch: the number of letters that the user approved. | |
| recipient_names | No | For a batch: the name of each recipient that the user approved, as in prepare_letter. | |
| confirmed_enclosures | No | The number of enclosures in the preview that the user approved. 0 if the letter has no enclosures. | |
| confirmed_price_cents | Yes | The price in cents that the user approved. It must be the price from prepare_letter (0 for a free resend). For a batch: the total price. |
Output Schema
| Name | Required | Description |
|---|---|---|
| charge | Yes | |
| counts | No | |
| status | Yes | |
| letters | No | |
| batch_id | No | |
| letter_id | No | |
| status_emails | No | True when the user gets status e-mails for these letters. |
| transaction_state | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the description's 'Cannot be undone after printing' adds the crucial timing detail rather than restating the flag, and it layers on the human-approval gate and the zero-price constraint. It does not cover the batch-vs-single execution path or error behavior, which keeps it off a 5.
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?
Very short and front-loaded: purpose first, then the qualification, then the alternative, then the precondition and the irreversibility warning. Every sentence carries a distinct constraint; 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?
With 9 parameters, rich annotations, and an output schema, the description covers the decision-critical parts: eligibility, the bypass route, and the approval gate. Batch handling and the allow_duplicate escape hatch are only in the schema, a minor gap for an otherwise complete definition.
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% and the field descriptions already explain batch_id/letter_id exclusivity, the sha256, and confirmed_price_cents. The tool description adds only the framing that the confirmed price is 0 for a resend, which the schema also states, so this is the baseline-3 case where 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 ('Mails a prepared letter by post') and immediately bounds the scope to free resends, which separates it cleanly from prepare_letter and send_card. An agent knows what this does and what it does not do 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?
Gives explicit when-to-use (free resend via resend_of, price 0), explicit when-not ('Do not call this tool for a letter with an order_url'), an alternative action (hand the user the order_url), and a sequencing precondition (only after the user approved preview and recipient, in a later answer than prepare_letter). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_preferencesBrief-Einstellungen ändernAIdempotentInspect
Use this when the user wants pages and e-mails in English or German, or wants e-mails about letters on or off. Changes the preferences of the account: the language of pages and e-mails for the user (en or de), and e-mails about the status of letters (on or off). Change a preference only after the user asks for it. Returns all preferences. get_account also shows them.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | Optional. en: English. de: German. | |
| email_updates | No | Optional. true: the user gets an e-mail when a letter goes to the post or cannot be delivered. false: no such e-mails. |
Output Schema
| Name | Required | Description |
|---|---|---|
| account_url | Yes | |
| preferences | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=true, destructive=false and openWorld=false, so the safety profile is covered. The description adds real value on top: it discloses the return behavior ('Returns all preferences') and imposes a consent prerequisite (only after the user asks), which the annotations do not express.
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 the usage trigger, and the closing pointer to get_account is well placed. There is mild redundancy: the first sentence's 'pages and e-mails in English or German' is restated almost verbatim by the second sentence's field enumeration, so one sentence could be trimmed.
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 two-parameter, zero-required mutation tool with an output schema and full annotation coverage, the description is nearly complete: it states the mutation target, the consent rule, and the read alternative. The only material gap is whether a partial update (one field supplied) is permitted and what happens to the unspecified preference, which matters given both parameters are optional.
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 both properties carry enum descriptions ('en: English. de: German.' / 'true: the user gets an e-mail when a letter goes to the post...'), so the description's restatement of 'en or de' and 'on or off' adds nothing beyond structured data. The one thing it could clarify and does not is whether omitting a field leaves that preference untouched. Baseline 3 applies.
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 ('Changes the preferences of the account') and enumerates exactly which two preferences it touches: page/e-mail language (en/de) and letter-status e-mails (on/off). It also distinguishes itself from the read path by noting 'get_account also shows them', so an agent can route between writing and reading preferences without opening either 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?
The opening sentence gives concrete user-intent triggers ('user wants pages and e-mails in English or German, or wants e-mails about letters on or off') and adds a meaningful constraint: 'Change a preference only after the user asks for it.' The alternative for viewing preferences (get_account) is named, though the description never states a 'do not use when' condition or that omitted parameters remain unchanged.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
withdraw_orderVon einer bezahlten Briefbestellung zurücktretenADestructiveIdempotentInspect
Use this when the user wants to withdraw from a paid letter order of this service ("Vertrag widerrufen"). This tool does not write a withdrawal letter to another company. For that, use prepare_letter. Until the post has the letter, the server refunds the full price. The server also stops the letter if it can. After the post has the letter, the right of withdrawal has ended. First call it without confirm. Show the result to the user. Then call it again with confirm true. The user gets an e-mail.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | true only after the user confirmed the withdrawal. false: show what happens. | |
| batch_id | No | The batch_id of a paid batch. Withdraws from every letter of the batch. Then do not give letter_id. | |
| letter_id | No | The letter_id of the paid letter. For every letter of a batch, give batch_id instead. |
Output Schema
| Name | Required | Description |
|---|---|---|
| batch_id | No | |
| order_id | Yes | |
| letter_id | No | |
| withdrawn | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description explains refund behavior, that the server tries to stop the letter, when the withdrawal right ends, the two-step confirm process, and that the user receives an e-mail. This adds substantial operational context for a destructive, externally visible action.
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 purpose and the key alternative, then proceeds through consequences and the confirmation workflow. Every sentence carries useful operational information.
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 withdrawal tool with refund and timing implications, the description covers the important prerequisites, consequences, and confirmation flow. An output schema exists, so return-value details need not be repeated.
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. The description adds meaningful semantics for confirm by explaining that the first call should omit it and the second should set it to true after user confirmation.
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: withdrawing from a paid letter order of this service. It also explicitly distinguishes this tool from prepare_letter, which is used to write a withdrawal letter to another company.
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 explicit when-to-use guidance, a clear when-not-to-use case, and names the alternative tool prepare_letter. It also specifies the required two-step confirmation workflow.
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.
2 tool updates
- Changed
create_card_picture7 fields changed- changed
Input schema / properties / details / descriptionPrevious value: -"1 to 3 personal details from the user for the motif. For example: \"Aunt Ruth loves her rose garden\", \"a beagle called Biscuit\", \"a village in the Alps\". Ask the user. Do not invent details."New value: +"1 to 3 personal details from the user for the motif: the place, the action, a hobby. For example: \"her rose garden\", \"on a sled\", \"a village in the Alps\". Ask the user. Do not invent details. Give who is in the picture in subjects." - added
Input schema / properties / photos_decisionAdded value: +{ + "description": "Required. The answer to the photo question. \"uploaded\": the user uploaded photos; give photo_design_id too. \"declined\": draw the people and pets without photos. \"not_needed\": the picture shows no real people and no pets.", + "enum": [ + "uploaded", + "declined", + "not_needed" + ], + "type": "string" +} - added
Input schema / properties / refine_ofAdded value: +{ + "description": "For other drafts of the same card: the brief_id of the earlier drafts.", + "maxLength": 64, + "type": "string" +} - added
Input schema / properties / scene_modeAdded value: +{ + "description": "Only with photos. \"photo\": repaint the one photo as it is, in the style. \"new\": put the people and pets into a new scene from details. Several single photos: \"new\".", + "enum": [ + "photo", + "new" + ], + "type": "string" +} - changed
Input schema / properties / style / descriptionPrevious value: -"Optional. A style id from get_card_options. get_card_options lists the styles by family. Propose 2 styles from different families to the user. The user chooses. Default: \"loose-botanical-watercolour\". With photo_design_id, use a style from get_card_options (picture_tool.photo_styles). Default then: \"loose-watercolour-portrait\"."New value: +"Optional. A style id from get_card_options. Show the user the styles of get_card_options brief. The user chooses. Default: \"loose-botanical-watercolour\". With photo_design_id, use a style from get_card_options (picture_tool.photo_styles). Default then: \"loose-watercolour-portrait\"." - added
Input schema / properties / style_sourceAdded value: +{ + "description": "Optional. \"user\": the user chose the style. \"proposed\": you chose it, for example after \"you decide\".", + "enum": [ + "user", + "proposed" + ], + "type": "string" +} - added
Input schema / properties / subjectsAdded value: +{ + "description": "Who and what the picture shows, at most 8. One entry for each person and each pet, not one for a group. Each: kind (person, pet, object or place) and role, for example \"the mother\", \"a boy\", \"the family dog\". age only if the user gave it, in any form (\"15\", \"about 70\"). photo: the number of the photo that shows it, in upload order. from_photo false: drawn without a photo. Never a name.", + "items": { + "properties": { + "age": { + "maxLength": 30, + "type": "string" + }, + "from_photo": { + "type": "boolean" + }, + "kind": { + "enum": [ + "person", + "pet", + "object", + "place" + ], + "type": "string" + }, + "photo": { + "maximum": 5, + "minimum": 1, + "type": "integer" + }, + "role": { + "maxLength": 60, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "kind", + "role" + ], + "type": "object" + }, + "maxItems": 8, + "type": "array" +}
- Changed
get_card_options1 field changed- added
Input schema / properties / upload_purposeAdded value: +{ + "description": "Optional. What the user uploads at upload_url. \"reference\": photos for our picture tool. \"print\": one finished picture, printed as it is. Without it, the page offers photos and a finished picture.", + "enum": [ + "reference", + "print" + ], + "type": "string" +}
18 tool updates
- First observed
cancel_letter - First observed
contact_support - First observed
create_card_picture - First observed
delete_address - First observed
get_account - First observed
get_card_options - First observed
get_card_view - First observed
get_letter_status - First observed
list_letter_types - First observed
list_letters - First observed
list_recipients - First observed
prepare_card - First observed
prepare_letter - First observed
save_address - First observed
send_card - First observed
send_letter - First observed
update_preferences - First observed
withdraw_order
Related MCP Connectors
Send real paper letters from AI chat: print, envelope, postage, delivery. Pay per letter.
Let AI agents prepare, review, pay for, and send real letters and postcards.
Write, preview and mail real letters and postcards to US addresses from your AI app.
Send real handwritten postcards, letters, notecards and gift cards from your AI assistant, preview every piece and its price first, and track QR scan results.
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.-
- AlicenseAqualityCmaintenanceSend real physical postcards worldwide via AI agents. Supports single and bulk send (up to 500 recipients), balance checking, delivery tracking, and volume pricing from $0.72/card.5237 npm5MIT
- AlicenseNot gradedqualityBmaintenanceHosted remote MCP server that lets AI agents compose, price, send, and track real physical letters worldwide.1MIT
- AlicenseAqualityCmaintenanceEnables 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.478 npm1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.