Skip to main content
Glama

Send letter (charges credit)

send_letter
Destructive

Use this when the user has explicitly confirmed a specific draft letter (recipient, content and total price) and wants it printed and posted. Pays the letter from the user's prepaid credit and releases it to print; it can be cancelled with cancel_letter only until production starts. Only call this after that confirmation and after the user agreed to the Terms (https://printandmailcompany.com/en/legal/terms) and to printing starting immediately (which ends the consumer right of withdrawal once printed). If credit is too low, the result contains a payment link for the user; the assistant cannot pay. A US Letter PDF to a recipient outside the US, Canada and US territories needs paper_size (ask the user: shrink to A4, recommended, or keep US Letter; same price); without it the call fails with PAPER_CHOICE_REQUIRED and nothing is charged. While the account has no sender details (the user's REAL full name, no alias, and postal address) the call fails with SENDER_DETAILS_REQUIRED and nothing is charged: ask the user for them and call send_letter again with them as sender (saved to the account before paying; once the account has them, the saved details are used). Posts paper letters only: no email, fax or parcels. Needs the user's account.

Input Schema

NameRequiredDescriptionDefault
senderNoThe user's own sender details: their REAL full name (first and last name, not an alias, nickname or pseudonym) and postal address, any country. Optional: needed only while the account has no sender details yet (SENDER_DETAILS_REQUIRED); they are then checked and saved to the account before paying. Once the account has them, the saved details are used and this is not saved (the user changes them in Settings → Your details). The user's saved sender details (name and postal address) are printed on the back of the envelope as the sender (their company name and business address instead, if the account has business details).
confirmYesMust be true: the user explicitly confirmed sending this letter (recipient, content and total price).
letter_idYesletter_id of the draft the user confirmed, from create_letter or compose_letter, e.g. ltr_8f3k2m9q4x7v1c6b0n5p. Sending charges its total to the user's prepaid credit.
paper_sizeNoThe user's choice for a US Letter PDF to a recipient outside the US, Canada and US territories: "a4" = shrink to A4 (recommended), "us_letter" = keep US Letter. Same price. Saved on the draft before paying; ignored for other letters. No default: omit unless the user has chosen.
user_accepted_termsYesMust be true: the user agreed to the Terms and to the immediate start of printing.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / sender / description
      Previous value: -"The user's own sender details: their REAL full name (first and last name, not an alias, nickname or pseudonym) and postal address, any country. Optional: needed only while the account has no sender details yet (SENDER_DETAILS_REQUIRED); they are then checked and saved to the account before paying. Once the account has them, the saved details are used and this is not saved (the user changes them in Settings → Your details)."New value: +"The user's own sender details: their REAL full name (first and last name, not an alias, nickname or pseudonym) and postal address, any country. Optional: needed only while the account has no sender details yet (SENDER_DETAILS_REQUIRED); they are then checked and saved to the account before paying. Once the account has them, the saved details are used and this is not saved (the user changes them in Settings → Your details). The user's saved sender details (name and postal address) are printed on the back of the envelope as the sender (their company name and business address instead, if the account has business details)."
  2. Changed1 schema field changed
    • changedInput schema / properties / sender / description
      Previous value: -"The user's own sender details: their REAL full name (first and last name, not an alias, nickname or pseudonym) and postal address, any country. Optional: needed only while the account has no sender details yet (SENDER_DETAILS_REQUIRED); they are then checked and saved to the account before paying, kept on record and never printed on the envelope or in the letter. Once the account has them, the saved details are used and this is not saved (the user changes them in Settings → Your details)."New value: +"The user's own sender details: their REAL full name (first and last name, not an alias, nickname or pseudonym) and postal address, any country. Optional: needed only while the account has no sender details yet (SENDER_DETAILS_REQUIRED); they are then checked and saved to the account before paying. Once the account has them, the saved details are used and this is not saved (the user changes them in Settings → Your details)."
  3. Changed1 schema field changed
    • addedInput schema / properties / sender
      Added value: +{
      +  "description": "The user's own sender details: their REAL full name (first and last name, not an alias, nickname or pseudonym) and postal address, any country. Optional: needed only while the account has no sender details yet (SENDER_DETAILS_REQUIRED); they are then checked and saved to the account before paying, kept on record and never printed on the envelope or in the letter. Once the account has them, the saved details are used and this is not saved (the user changes them in Settings → Your details).",
      +  "properties": {
      +    "city": {
      +      "description": "City or town, e.g. Berlin.",
      +      "maxLength": 50,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "company": {
      +      "description": "The user's company or organisation, e.g. Example GmbH. Optional.",
      +      "maxLength": 60,
      +      "type": "string"
      +    },
      +    "country": {
      +      "description": "Country as an ISO 3166-1 alpha-2 code, e.g. DE, FR or US.",
      +      "maxLength": 2,
      +      "minLength": 2,
      +      "type": "string"
      +    },
      +    "line1": {
      +      "description": "Street and house number, or PO box, e.g. Hauptstraße 5.",
      +      "maxLength": 60,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "line2": {
      +      "description": "Optional extra address line: c/o, apartment, floor or building, e.g. Apt 4B.",
      +      "maxLength": 60,
      +      "type": "string"
      +    },
      +    "name": {
      +      "description": "The user's full name: their REAL first and last name, not an alias, nickname or pseudonym, e.g. Anna Schmidt.",
      +      "maxLength": 60,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "postal_code": {
      +      "description": "Postcode / ZIP code, e.g. 10115 or 94105. Required in countries that use postcodes.",
      +      "maxLength": 16,
      +      "type": "string"
      +    },
      +    "region": {
      +      "description": "State, province or region where the user's country has one in addresses, e.g. CA (California, US), ON (Ontario, CA) or Madrid (ES). Required for addresses in AE, AS, AU, BR, CA, CN, CO, CR, ES, FM, HK, HN, ID, IN, IQ, IT, JM, JP, KN, KR, KY, MH, MP, MX, NR, PF, PG, PW, RU, SO, SV, TW, US, VE, VI, VN when this block is saved as the user's sender details (an account without them yet: SENDER_DETAILS_REQUIRED, fields.region); otherwise optional.",
      +      "maxLength": 50,
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "name",
      +    "line1",
      +    "city",
      +    "country"
      +  ],
      +  "type": "object"
      +}
  4. Changed4 schema fields changed
    • changedInput schema / properties / confirm / description
      Previous value: -"Must be true: the user explicitly confirmed sending this letter"New value: +"Must be true: the user explicitly confirmed sending this letter (recipient, content and total price)."
    • addedInput schema / properties / letter_id / description
      Added value: +"letter_id of the draft the user confirmed, from create_letter or compose_letter, e.g. ltr_8f3k2m9q4x7v1c6b0n5p. Sending charges its total to the user's prepaid credit."
    • changedInput schema / properties / paper_size / description
      Previous value: -"The user's choice for a US Letter PDF to a recipient outside the US, Canada and US territories: \"a4\" = shrink to A4 (recommended), \"us_letter\" = keep US Letter. Same price. Saved on the draft before paying; ignored for other letters."New value: +"The user's choice for a US Letter PDF to a recipient outside the US, Canada and US territories: \"a4\" = shrink to A4 (recommended), \"us_letter\" = keep US Letter. Same price. Saved on the draft before paying; ignored for other letters. No default: omit unless the user has chosen."
    • changedInput schema / properties / user_accepted_terms / description
      Previous value: -"Must be true: the user agreed to the Terms and to the immediate start of printing"New value: +"Must be true: the user agreed to the Terms and to the immediate start of printing."
  5. Changed1 schema field changed
    • addedInput schema / properties / paper_size
      Added value: +{
      +  "description": "The user's choice for a US Letter PDF to a recipient outside the US, Canada and US territories: \"a4\" = shrink to A4 (recommended), \"us_letter\" = keep US Letter. Same price. Saved on the draft before paying; ignored for other letters.",
      +  "enum": [
      +    "a4",
      +    "us_letter"
      +  ],
      +  "type": "string"
      +}
  6. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructive, non-idempotent and open-world, but the description goes well beyond them: credit is debited, the letter is released to print and is only cancellable until production begins, and two failure modes are named with the guarantee that nothing is charged. It also discloses the withdrawal-right consequence of immediate printing and the pre-payment persistence of sender details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The preamble is front-loaded with the core trigger, followed by consequences, then failure modes. Every sentence carries operational information, though the paper_size and sender passages are dense parenthetical run-ons that could be split for faster scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a five-parameter, nested-object, credit-charging mutation with no output schema, it covers triggers, side effects, cancellation window, error codes and return-path behaviour (payment link). An agent has everything needed to call it correctly and to recover from both documented failures.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline is a 3, but the description adds real meaning: paper_size only applies to US Letter PDFs to recipients outside the US/Canada/territories, has no default and is saved on the draft before paying, and sender is only needed while the account has none. It explains the interaction between parameters and account state rather than restating field text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('printed and posted' a confirmed draft letter) together with the exact precondition (explicit user confirmation of recipient, content and total price). It is clearly distinguished from the sibling tools that create drafts (create_letter, compose_letter) and from cancel_letter, which is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-call ('only after that confirmation and after the user agreed to the Terms'), explicit when-not (a cancellation window that ends when production starts, routed to cancel_letter), and explicit exclusions ('no email, fax or parcels'). It also tells the agent not to attempt payment itself when credit is low.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.