Print and Mail Company

Print and mail real letters worldwide from the EU, incl. registered mail. Quote, compose, send.

我该使用它吗

质量与安全性

B
描述质量
100%
模式完整度
86%
命名质量
97%
投毒风险
40%
权限匹配度
100%
协议合规性
100%

发现(4)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool description contains URL to non-standard domain在 send_letter 中
  • LOWTool description contains role marker that could confuse chat models在 send_letter 中
  • INFOTool description contains placeholder or incomplete text在 get_letter 中

基于对工具定义和协议合规性的自动分析。

上下文开销

~6,583token 数(工具定义)
~3.4 KB典型响应大小
对注意力有显著影响(占 128k 上下文窗口的 5.14%)

这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。

安装

一键安装

将以下内容添加到你的 `claude_desktop_config.json` 文件中:

{
  "mcpServers": {
    "printandmailcompany": {
      "url": "https://printandmailcompany.com/mcp"
    }
  }
}

远程端点

https://printandmailcompany.com/mcpstreamable-http

它能做什么

工具清单

工具(14)

🟢 只读🟡 写入🔴 删除⚪ 未知
🟢get_price_quote(pages, country, postal_code, duplex, color, ...)

Use this when the user asks what it costs to send a physical letter by post (snail mail), including a registered letter. Returns the exact total incl. Luxembourg VAT (for a signed-in EU business customer with a confirmed VAT number: excl. VAT under the reverse charge), the line items, the envelope, the postal size class and zone and the typical delivery time for a page count, destination country and print options. Letters are printed and posted in Luxembourg, France, Belgium or Germany, so the sender can be anywhere in the world. Note: registered mail is international registered mail with tracking and signature on delivery; "certified" letters, Einschreiben, lettre recommandée and carta certificada mean this here (not a US certified-mail product). Works without sign-in. Set currency to get the total in USD, GBP or CHF (ECB rate plus currency margin). Does not cover email, fax, parcels or postcards.

输入模式

{
  "type": "object",
  "properties": {
    "pages": {
      "type": "integer",
      "minimum": 1,
      "maximum": 250,
      "description": "Number of pages in the PDF, a whole number from 1 to 250, e.g. 2."
    },
    "country": {
      "type": "string",
      "minLength": 2,
      "maxLength": 2,
      "description": "Destination country as an ISO 3166-1 alpha-2 code, e.g. DE, FR or US (list_destinations lists them all)."
    },
    "postal_code": {
      "description": "Destination postcode, e.g. 07001. Optional: it only changes the price for the Spanish and Portuguese islands and enclaves (Balearic and Canary Islands, Ceuta, Melilla, Madeira, Azores).",
      "type": "string",
      "maxLength": 16
    },
    "duplex": {
      "default": false,
      "description": "true = print on both sides of the paper (fewer sheets, so a lighter letter); false = one side only. Default false.",
      "type": "boolean"
    },
    "color": {
      "default": "bw",
      "description": "\"bw\" = black and white, \"color\" = colour printing (costs more per page). Default \"bw\".",
      "type": "string",
      "enum": [
        "bw",
        "color"
      ]
    },
    "envelope": {
      "description": "\"DL\" (220×110 mm, letter folded twice), \"C5\" (229×162 mm, folded once) or \"C4\" (324×229 mm, flat). Omit to use the smallest envelope that holds the sheets (recommended); one too small for the page count is refused.",
      "type": "string",
      "enum": [
        "DL",
        "C5",
        "C4"
      ]
    },
    "registered": {
      "default": false,
      "description": "true = registered mail: tracking number and signature on delivery, for an extra fee (also what \"certified\" letters, Einschreiben, lettre recommandée and carta certificada mean here; not a US certified-mail product). false = ordinary mail. Default false.",
      "type": "boolean"
    },
    "currency": {
      "default": "EUR",
      "description": "Currency for the total: \"EUR\", \"USD\", \"GBP\" or \"CHF\". Prices are set in EUR; for USD, GBP or CHF the result adds the total converted at the ECB rate plus a currency margin. Default \"EUR\".",
      "type": "string",
      "enum": [
        "EUR",
        "USD",
        "GBP",
        "CHF"
      ]
    }
  },
  "required": [
    "pages",
    "country"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢list_destinations(country)

Use this when the user asks whether a letter can be posted to a country, or which countries can be reached. Without country: all destination countries with their postage zone. With country: that country's zone, the price of a 1-page standard and registered letter, and the typical delivery time. Works without sign-in. Letters only, no parcels.

输入模式

{
  "type": "object",
  "properties": {
    "country": {
      "description": "ISO 3166-1 alpha-2 code of one country, e.g. DE: returns its zone, 1-page prices and delivery time. Omit to list every destination country.",
      "type": "string",
      "minLength": 2,
      "maxLength": 2
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢check_pdf_margins(pdf_url, pdf_base64)

Use this when the user has a PDF they want printed and posted and it should be checked first: verifies the page size (A4 or US Letter) and the required free margin on every side, and lists the pages that need changes. We print on the paper size uploaded (printed_on): A4 on A4, US Letter on US Letter (for a recipient outside the US, Canada and US territories the user may choose A4 instead when sending); a PDF mixing A4 and US Letter pages is printed on A4, its Letter pages centred at 100 % or scaled down slightly when content comes close to the edge (us_letter_note, pages[].scale_percent). Decide by compliant: all_pages_a4 is false for a US Letter PDF, which is printable. Accepts a public https URL or base64. The file is not stored and nothing is sent. Works without sign-in. To fix a failing PDF, upload it with upload_document and use fix_document_margins.

输入模式

{
  "type": "object",
  "properties": {
    "pdf_url": {
      "description": "Public https URL of the PDF (A4 or US Letter pages), e.g. https://example.com/letter.pdf. Pass pdf_url or pdf_base64.",
      "type": "string",
      "format": "uri"
    },
    "pdf_base64": {
      "description": "The PDF file as base64 (a data:application/pdf;base64, prefix is fine), for files up to about 3 MB. Pass pdf_url or pdf_base64. Larger files: pass pdf_url, or use create_upload_link.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴compose_letter(sender, recipient, subject, body, language, ...)

Use this when the user wants to write a new paper letter from text and post it, for example to cancel a contract, subscription or membership by letter, file a complaint or objection, or send a formal notice, by ordinary or registered mail. Renders an A4 letter (DIN 5008 layout: sender block with the user's own name and address, recipient, place and date, subject, body, closing, signature) that passes the print check, and creates a draft with the exact price. Nothing is sent or charged: show the user the draft and the total, ask for confirmation, then call send_letter. The sender can live in any country. Body supports paragraphs (blank line), '- ' bullets, '1. ' lists and **bold**. Needs the user's account.

输入模式

{
  "type": "object",
  "properties": {
    "sender": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 60,
          "description": "The user's full name, e.g. Max Mustermann."
        },
        "company": {
          "description": "The user's company or organisation, e.g. Example GmbH. Optional.",
          "type": "string",
          "maxLength": 60
        },
        "line1": {
          "type": "string",
          "minLength": 1,
          "maxLength": 60,
          "description": "Street and house number, or PO box, e.g. Hauptstraße 5."
        },
        "line2": {
          "description": "Optional extra address line: c/o, apartment, floor or building, e.g. Apt 4B.",
          "type": "string",
          "maxLength": 60
        },
        "postal_code": {
          "description": "Postcode / ZIP code, e.g. 10115 or 94105. Required in countries that use postcodes.",
          "type": "string",
          "maxLength": 16
        },
        "city": {
          "type": "string",
          "minLength": 1,
          "maxLength": 50,
          "description": "City or town, e.g. Berlin."
        },
        "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). Optional in the sender block.",
          "type": "string",
          "maxLength": 50
        },
        "country": {
          "type": "string",
          "minLength": 2,
          "maxLength": 2,
          "description": "Country as an ISO 3166-1 alpha-2 code, e.g. DE, FR or US."
        },
        "email": {
          "description": "The user's email address, printed in the sender block, e.g. [email protected]. Optional.",
          "type": "string",
          "format": "email",
          "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
        },
        "phone": {
          "description": "The user's phone number, printed in the sender block, e.g. +49 30 1234567. Optional.",
          "type": "string",
          "maxLength": 40
        }
      },
      "required": [
        "name",
        "line1",
        "city",
        "country"
      ],
      "description": "The user's own name and address (any country), printed in the letter's sender block (the envelope always shows our return address)"
    },
    "recipient": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 60,
          "description": "Recipient's name: a person, or a department such as Customer Service when writing to a company, e.g. Erika Mustermann."
        },
        "company": {
          "description": "Recipient's company or organisation, e.g. Example GmbH. Optional.",
          "type": "string",
          "maxLength": 60
        },
        "line1": {
          "type": "string",
          "minLength": 1,
          "maxLength": 60,
          "description": "Street and house number, or PO box, e.g. Hauptstraße 5."
        },
        "line2": {
          "description": "Optional extra address line: c/o, apartment, floor or building, e.g. Apt 4B.",
          "type": "string",
          "maxLength": 60
        },
        "postal_code": {
          "description": "Postcode / ZIP code, e.g. 10115 or 94105. Required in countries that use postcodes.",
          "type": "string",
          "maxLength": 16
        },
        "city": {
          "type": "string",
          "minLength": 1,
          "maxLength": 50,
          "description": "City or town, e.g. Berlin."
        },
        "region": {
          "description": "State, province or region. Required for recipients 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 (without it the draft is refused: INVALID_ADDRESS, fields.region); omit where addresses have none, e.g. DE, FR or GB. The code in US, CA, AU and BR, e.g. CA (California) or ON (Ontario); elsewhere the name or its usual abbreviation, e.g. Madrid (ES) or RM (Rome, IT).",
          "type": "string",
          "maxLength": 50
        },
        "country": {
          "type": "string",
          "minLength": 2,
          "maxLength": 2,
          "description": "Country as an ISO 3166-1 alpha-2 code, e.g. DE, FR or US."
        }
      },
      "required": [
        "name",
        "line1",
        "city",
        "country"
      ],
      "description": "Recipient's postal address, printed in the letter's address field and on the envelope. Ask the user for missing fields."
    },
    "subject": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "Subject line printed above the body, e.g. Cancellation of my contract no. 12345 (up to 200 characters)."
    },
    "body": {
      "type": "string",
      "minLength": 1,
      "maxLength": 20000,
      "description": "Letter text including the salutation (e.g. 'Dear Sir or Madam,'), without closing or signature. Blank line = new paragraph; '- ' bullets, '1. ' numbered lists and **bold** work. Up to 20,000 characters."
    },
    "language": {
      "default": "en",
      "description": "Language of the letter as an ISO 639-1 code, e.g. en, de, fr, es, pt, it or nl; sets the date format and the default closing. Default \"en\".",
      "type": "string",
      "minLength": 2,
      "maxLength": 5
    },
    "place": {
      "description": "Place printed before the date, usually the user's city, e.g. Berlin. Optional.",
      "type": "string",
      "maxLength": 60
    },
    "date": {
      "description": "Date of the letter as an ISO date (YYYY-MM-DD), e.g. 2026-10-08. Default: today.",
      "type": "string"
    },
    "closing": {
      "description": "Closing phrase, e.g. 'Kind regards'. Default: the usual closing in the letter's language.",
      "type": "string",
      "maxLength": 200
    },
    "signature": {
      "description": "Name printed under the closing, e.g. Max Mustermann. Default: the sender's name.",
      "type": "string",
      "maxLength": 80
    },
    "references": {
      "description": "Up to 5 reference lines printed above the subject, e.g. [\"Customer no. 12345\", \"Contract no. 987\"]. Optional.",
      "maxItems": 5,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 120
      }
    },
    "duplex": {
      "default": false,
      "description": "true = print on both sides of the paper (fewer sheets, so a lighter letter); false = one side only. Default false.",
      "type": "boolean"
    },
    "color": {
      "default": "bw",
      "description": "\"bw\" = black and white, \"color\" = colour printing (costs more per page). Default \"bw\".",
      "type": "string",
      "enum": [
        "bw",
        "color"
      ]
    },
    "envelope": {
      "description": "\"DL\" (220×110 mm, letter folded twice), \"C5\" (229×162 mm, folded once) or \"C4\" (324×229 mm, flat). Omit to use the smallest envelope that holds the sheets (recommended); one too small for the page count is refused.",
      "type": "string",
      "enum": [
        "DL",
        "C5",
        "C4"
      ]
    },
    "registered": {
      "default": false,
      "description": "true = registered mail: tracking number and signature on delivery, for an extra fee (also what \"certified\" letters, Einschreiben, lettre recommandée and carta certificada mean here; not a US certified-mail product). false = ordinary mail. Default false. Often wanted for cancellations and deadlines.",
      "type": "boolean"
    }
  },
  "required": [
    "sender",
    "recipient",
    "subject",
    "body"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡upload_document(pdf_url, pdf_base64, file_name)

Use this when the user already has a PDF (public https URL or base64) that should be printed and posted. Stores the file in the user's account, runs the print check (A4 or US Letter, free margins; printed_on says the paper: US Letter PDFs are printed on US Letter, a PDF mixing A4 and US Letter pages on A4, see us_letter_note; decide by compliant, as all_pages_a4 is false for a US Letter PDF) and returns document_id for create_letter. If the check fails, call fix_document_margins or ask the user for a corrected file. For a file on the user's own device, use create_upload_link instead. Sends nothing. Needs the user's account.

输入模式

{
  "type": "object",
  "properties": {
    "pdf_url": {
      "description": "Public https URL of the PDF (A4 or US Letter pages), e.g. https://example.com/letter.pdf. Pass pdf_url or pdf_base64.",
      "type": "string",
      "format": "uri"
    },
    "pdf_base64": {
      "description": "The PDF file as base64 (a data:application/pdf;base64, prefix is fine), for files up to about 3 MB. Pass pdf_url or pdf_base64. Larger files: pass pdf_url, or use create_upload_link.",
      "type": "string"
    },
    "file_name": {
      "description": "Name to store the file under, e.g. cancellation.pdf. Default: the name from the URL, or \"document.pdf\".",
      "type": "string",
      "maxLength": 120
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴fix_document_margins(document_id, mode)

Use this when an uploaded PDF fails the print check because content is too close to the edge or pages are neither A4 nor US Letter. mode "shrink" (default) scales the affected pages down slightly and centres them on their paper (US Letter for a US Letter PDF, else A4); nothing is lost. mode "crop" keeps pages at 100 % and removes everything inside the margin band, so that content is NOT printed (pages of other sizes are first fitted onto A4). The US Letter pages of a mixed PDF that already fit on A4 keep their placement. The original upload is kept; calling again with the other mode replaces the earlier fix. If content touches the edge, ask the user which mode they prefer and tell them what changed. Not possible once the letter is paid. Needs the user's account.

输入模式

{
  "type": "object",
  "properties": {
    "document_id": {
      "type": "string",
      "description": "document_id returned by upload_document or compose_letter, e.g. doc_2h7k9m4q8x1v3c6b0n5p."
    },
    "mode": {
      "default": "shrink",
      "description": "\"shrink\" = scale pages down slightly, nothing lost; \"crop\" = keep 100 % size and cut off everything inside the margin (that content is not printed). Default \"shrink\".",
      "type": "string",
      "enum": [
        "shrink",
        "crop"
      ]
    }
  },
  "required": [
    "document_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡create_upload_link

Use this when the user wants to post a PDF that is on their own device and cannot be passed as a URL or base64. Creates a private upload page (valid 60 minutes); give the URL to the user, and once they have uploaded, pass upload_id to create_letter. Sends nothing. Needs the user's account.

输入模式

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡create_letter(document_id, upload_id, recipient, duplex, color, ...)

Use this when the user has an uploaded PDF (document_id, or upload_id from create_upload_link) and a recipient address and wants it posted by ordinary or registered mail; registered mail is international registered mail with tracking and signature on delivery; "certified" letters, Einschreiben, lettre recommandée and carta certificada mean this here (not a US certified-mail product). Creates a draft with the exact total in the user's currency. Nothing is sent or charged; call send_letter only after the user confirms. Every envelope carries our company return address, so the user's own address belongs in the document. A US Letter PDF to a recipient outside the US, Canada and US territories needs the user's paper choice (paper_size, same price): without it the draft says paper_choice_required. Needs the user's account.

输入模式

{
  "type": "object",
  "properties": {
    "document_id": {
      "description": "The PDF to post: document_id from upload_document or compose_letter, e.g. doc_2h7k9m4q8x1v3c6b0n5p. Pass document_id or upload_id.",
      "type": "string"
    },
    "upload_id": {
      "description": "upload_id from create_upload_link, once the user has uploaded the PDF on that page. Pass document_id or upload_id.",
      "type": "string"
    },
    "recipient": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 60,
          "description": "Recipient's name: a person, or a department such as Customer Service when writing to a company, e.g. Erika Mustermann."
        },
        "company": {
          "description": "Recipient's company or organisation, e.g. Example GmbH. Optional.",
          "type": "string",
          "maxLength": 60
        },
        "line1": {
          "type": "string",
          "minLength": 1,
          "maxLength": 60,
          "description": "Street and house number, or PO box, e.g. Hauptstraße 5."
        },
        "line2": {
          "description": "Optional extra address line: c/o, apartment, floor or building, e.g. Apt 4B.",
          "type": "string",
          "maxLength": 60
        },
        "postal_code": {
          "description": "Postcode / ZIP code, e.g. 10115 or 94105. Required in countries that use postcodes.",
          "type": "string",
          "maxLength": 16
        },
        "city": {
          "type": "string",
          "minLength": 1,
          "maxLength": 50,
          "description": "City or town, e.g. Berlin."
        },
        "region": {
          "description": "State, province or region. Required for recipients 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 (without it the draft is refused: INVALID_ADDRESS, fields.region); omit where addresses have none, e.g. DE, FR or GB. The code in US, CA, AU and BR, e.g. CA (California) or ON (Ontario); elsewhere the name or its usual abbreviation, e.g. Madrid (ES) or RM (Rome, IT).",
          "type": "string",
          "maxLength": 50
        },
        "country": {
          "type": "string",
          "minLength": 2,
          "maxLength": 2,
          "description": "Country as an ISO 3166-1 alpha-2 code, e.g. DE, FR or US."
        }
      },
      "required": [
        "name",
        "line1",
        "city",
        "country"
      ],
      "description": "Recipient's postal address, printed on the envelope. Ask the user for missing fields."
    },
    "duplex": {
      "default": false,
      "description": "true = print on both sides of the paper (fewer sheets, so a lighter letter); false = one side only. Default false.",
      "type": "boolean"
    },
    "color": {
      "default": "bw",
      "description": "\"bw\" = black and white, \"color\" = colour printing (costs more per page). Default \"bw\".",
      "type": "string",
      "enum": [
        "bw",
        "color"
      ]
    },
    "envelope": {
      "description": "\"DL\" (220×110 mm, letter folded twice), \"C5\" (229×162 mm, folded once) or \"C4\" (324×229 mm, flat). Omit to use the smallest envelope that holds the sheets (recommended); one too small for the page count is refused.",
      "type": "string",
      "enum": [
        "DL",
        "C5",
        "C4"
      ]
    },
    "registered": {
      "default": false,
      "description": "true = registered mail: tracking number and signature on delivery, for an extra fee (also what \"certified\" letters, Einschreiben, lettre recommandée and carta certificada mean here; not a US certified-mail product). false = ordinary mail. Default false.",
      "type": "boolean"
    },
    "paper_size": {
      "description": "Only for a US Letter PDF to a recipient outside US, CA, PR, VI, GU, AS, MP (the US, Canada and US territories): \"a4\" = shrink to A4 (recommended), \"us_letter\" = keep US Letter. Ask the user; same price. Ignored otherwise (A4 PDFs print on A4, US Letter PDFs to those countries on US Letter). No default: omit until the user has chosen.",
      "type": "string",
      "enum": [
        "a4",
        "us_letter"
      ]
    }
  },
  "required": [
    "recipient"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴send_letter(letter_id, confirm, user_accepted_terms, paper_size)

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. Posts paper letters only: no email, fax or parcels. Needs the user's account.

输入模式

{
  "type": "object",
  "properties": {
    "letter_id": {
      "type": "string",
      "description": "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."
    },
    "confirm": {
      "type": "boolean",
      "const": true,
      "description": "Must be true: the user explicitly confirmed sending this letter (recipient, content and total price)."
    },
    "user_accepted_terms": {
      "type": "boolean",
      "const": true,
      "description": "Must be true: the user agreed to the Terms and to the immediate start of printing."
    },
    "paper_size": {
      "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. No default: omit unless the user has chosen.",
      "type": "string",
      "enum": [
        "a4",
        "us_letter"
      ]
    }
  },
  "required": [
    "letter_id",
    "confirm",
    "user_accepted_terms"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢get_letter(letter_id, reference)

Use this when the user asks about a letter they created here: status (draft, paid, in_production, printed, posted, cancelled, returned), tracking number for registered mail, and price. Look up by letter_id or reference (PM-XXXXXX). Changes nothing. Needs the user's account.

输入模式

{
  "type": "object",
  "properties": {
    "letter_id": {
      "description": "letter_id from create_letter, compose_letter or list_letters, e.g. ltr_8f3k2m9q4x7v1c6b0n5p. Pass letter_id or reference.",
      "type": "string"
    },
    "reference": {
      "description": "The letter's reference as shown to the user, format PM-XXXXXX, e.g. PM-7K3QH9. Pass letter_id or reference.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢list_letters(limit, status)

Use this when the user wants to see their recent letters, optionally filtered by status. Returns status, recipient, price and tracking number per letter. Changes nothing. Needs the user's account.

输入模式

{
  "type": "object",
  "properties": {
    "limit": {
      "default": 10,
      "description": "How many letters to return, newest first: a whole number from 1 to 50. Default 10.",
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    },
    "status": {
      "description": "Only letters with this status, e.g. draft or posted. Omit for letters in any status.",
      "type": "string",
      "enum": [
        "draft",
        "paid",
        "in_production",
        "printed",
        "posted",
        "cancelled",
        "returned"
      ]
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴cancel_letter(letter_id)

Use this when the user wants to stop a letter they created here: cancels a draft, or a paid letter that has not gone into production yet, and returns the amount to the user's credit. Letters already printed or posted cannot be recalled. This cancels our letter, not a contract the user has with someone else (for that, compose_letter writes the cancellation letter). Ask the user before cancelling. Needs the user's account.

输入模式

{
  "type": "object",
  "properties": {
    "letter_id": {
      "type": "string",
      "description": "letter_id of the letter to cancel, from create_letter, compose_letter or list_letters, e.g. ltr_8f3k2m9q4x7v1c6b0n5p. Only drafts and paid letters not yet in production can be cancelled."
    }
  },
  "required": [
    "letter_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢get_balance

Use this when the user asks how much prepaid credit they have, or to check before sending that the credit covers a letter. Returns the credit, the account currency and the minimum top-up. Changes nothing. Needs the user's account.

输入模式

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡create_topup_link(letter_id)

Use this when the user needs to add credit, or to pay one specific draft letter by card. Returns a link to the payment page on printandmailcompany.com; give it to the user, who pays there. The assistant cannot pay, and calling this tool charges nothing. Needs the user's account.

输入模式

{
  "type": "object",
  "properties": {
    "letter_id": {
      "description": "letter_id of a draft, e.g. ltr_8f3k2m9q4x7v1c6b0n5p: the link then pays that letter by card. Omit for a link to add prepaid credit.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

社区

评价此服务器

证据

最近观测

已验证未记录版本14 个工具