epost-mcp
The epost-mcp server provides an MCP interface to the Swiss ePost digital letterbox, using the public API where available and browser automation as a fallback.
Session & Authentication: Check login status, perform SwissID login (including passkey support) with cached sessions, and view resolved server configuration.
Letter Reading & Searching: List inbox letters with details (sender, date, status), get detailed info on a specific letter, full-text search across inbox and storage, check unread count, and mark letters read/unread.
Downloading: Download individual letters or all letters as PDFs, and download thumbnail images.
Storage & Archiving: Archive letters non-destructively into storage folders; list storage folders and documents; read storage document metadata and optionally download PDFs; create new folders; move documents between folders with optional removal from source; unfile documents from folders (if multiple memberships).
Trash Management: List deleted letters with days until permanent deletion, restore letters, and delete letters (with confirmation required).
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@epost-mcplist all my scanned letters"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
epost-mcp
Read, download and archive your Swiss ePost digital letterbox — over the documented public API, with browser automation as a fallback.
Unofficial. Not affiliated with ePost or Swiss Post. It speaks their documented public API where it can and falls back to driving the web portal where it cannot — that fallback is inherently fragile, since portal updates break selectors without warning. Use it for your own letterbox and respect the provider's terms of service.
An MCP server for the Swiss ePost digital letterbox (app.epost.ch). It lets an MCP client (Claude Code, Claude Desktop, …) list and download your scanned letters and do basic housekeeping in the ePost Storage area — folders and moving documents.
ePost does publish a public API for the Digital Letterbox, and a private tenant can use it — see Transport below. That is the preferred path: no browser, no session, and letters arrive with a real sender description. Browser automation via Playwright remains for the few things the API does not cover.
How a call gets answered
Two ways in, and the server picks per call rather than per session — so the
same conversation can read a letter over the API and archive it in the browser
without you arranging anything. EPOST_TRANSPORT pins that choice if you would
rather it did not move.
flowchart TD
C["MCP client<br/>(Claude Code, Claude Desktop, …)"] -->|"stdio JSON-RPC"| S["epost-mcp"]
S --> T{"EPOST_TRANSPORT"}
T -->|"api — pinned"| A
T -->|"browser — pinned"| B
T -->|"auto (default)"| D{"Does this call<br/>reach for a page?"}
D -->|"no"| A["REST call to api.epost.ch"]
D -->|"yes — and only then<br/>is a browser launched"| B["Playwright drives<br/>app.epost.ch"]
K1["account password<br/>keychain: epost-mcp-api-password"] -->|"password grant"| KC["Keycloak token"]
KC -.->|"Authorization: Bearer"| A
K2["API key<br/>keychain: epost-mcp-api-key"] -.->|"X-API-KEY"| A
A --> E[("ePost<br/>Digital Letterbox")]
B --> E
subgraph disk["on disk — a live letterbox session, and secret"]
P["Chromium profile<br/>~/.epost-mcp/profile"]
ST["storageState<br/>~/.epost-mcp/state.json"]
end
disk -.->|"seeds the context"| B
B -.->|"state.json re-saved after<br/>every successful call"| ST
L["epost_login<br/>visible window, one Touch ID"] -.->|"fills state.json once"| ST
classDef pin fill:#fff4e5,stroke:#d9822b
classDef store fill:#fdecea,stroke:#c0392b
class T,D pin
class P,ST store
style disk fill:#fbfbfb,stroke:#999,stroke-dasharray: 4 3A pin is enforced both ways. Pinned to api, a browser-only tool is refused
rather than quietly redirected — the point of pinning is knowing what ran.
Related MCP server: dropscan-mcp
Prerequisites
Node.js ≥ 20.19
A Chromium managed by Playwright
A Swiss ePost account with the Scanning-Service, reachable via SwissID
git clone https://github.com/sapn95/epost-mcp.git
cd epost-mcp
npm install
npx playwright install chromium # downloads the browser Playwright drivesSession / login model
The hard part of ePost automation is the login. This server keeps you logged in so you do not re-authenticate on every call or every restart:
The SwissID/ePost session is cached as a Playwright storageState file at
~/.epost-mcp/state.json(49 cookies incl. the KLARA/Keycloak SSO cookies).On startup the server loads that file, so a previously logged-in session is reused across server restarts.
After a successful
epost_loginand after every successful tool call, the server re-savesstate.json, keeping the cached session fresh.epost_loginopens a visible (headed) browser window so you complete the SwissID login (incl. 2FA) yourself. Every other tool runs headless.SwissID sessions are short-lived. When the session expires, tools return
login_required— just runepost_loginagain.
First-time / after-expiry flow:
Call
epost_status. If it returnslogin_required……call
epost_login. A browser window opens on app.epost.ch. Complete the SwissID login until you see your dashboard / the letterbox. The session is then cached to~/.epost-mcp/state.json.Use
epost_list_letters,epost_download_letter, etc. headlessly.
Security:
~/.epost-mcp/state.jsoncontains live session cookies for your ePost/SwissID account. Treat it like a password. It is git-ignored in this repo and must never be committed, shared, or synced to a cloud folder. Delete it to force a fresh login. Override its location withEPOST_STATE.
Transport: the public API, with the browser as fallback
ePost publishes a REST API for the Digital Letterbox, and a private tenant can use it — which is easy to miss, because the developer portal is written for business clients. The API is preferred for everything it covers; browser automation runs only when it cannot serve a call.
Set it up once:
Log in to app.epost.ch with SwissID as usual.
In the same browser, open
https://login.epost.ch/auth/realms/klara/account/→ Authentication → Set/update password, and set one. A SwissID login has no password of its own, which is the whole point of this step.Store it:
security add-generic-password -a epost -s epost-mcp-api-password -w -U—-wwith no value prompts, so the password never reaches your shell history or a process listing. (or setEPOST_API_PASSWORD). The account e-mail comes from the same place as before.
Documented at How to access the letterbox public APIs with a private tenant.
Why it is worth it
Measured against the same account:
Browser | API | |
List the inbox | tens of seconds, needs a live session | ~2s, no session at all |
What a letter says |
| a real |
Storage listing | 48 cards at a time, scrolled | every document in one call |
Archiving | two-step folder sheet | one |
That second row is the one that matters: the portal renders every scan with the same title, so an archived document could not be classified without opening it. The API has carried the sender all along.
What the API does not do
There is no endpoint to move a document that is already in Storage between
folders. PATCH /letters/{id}/archive is inbox → folder only and answers 400
for anything already archived — the documentation says so explicitly. Re-filing
therefore falls back to the browser.
A useful division follows from that: the browser acts, the API checks. The
move itself is not verified for you — epost_move_to_folder reports what the
portal accepted, not what it ended up holding. Run
epost_list_storage_documents afterwards and the API says which document id is
in which folder, which matters because Storage cards show only a date, and dates
repeat.
Auth: two schemes, both supported
The API documents an API key and Bearer auth, and this server does both.
Password grant (what the private-tenant guide describes):
POST /core/latest/tenants {username, password} -> tenant_id, company_id
POST /core/latest/token {username, password, grant_type=password,
tenant_id, company_id} -> access_token (600s)
GET /epost/v2/letters Authorization: Bearer …It re-authenticates a minute before expiry rather than tracking refresh tokens: the password is already at hand, so a refresh buys nothing.
API key, as an alternative or in addition:
# -w with no value prompts, so the key stays out of shell history and argv
security add-generic-password -a epost -s epost-mcp-api-key -w -U
# or: export EPOST_API_KEY=<key>Sent as X-API-KEY. A key on its own is a complete credential — the password
grant is then skipped entirely, which is the simpler setup if you have one. When
both are configured the key travels alongside the token, matching the portal's
own examples.
epost_settings reports which of the two are in play.
Choosing the transport
EPOST_TRANSPORT is auto by default: the API answers whatever it can, the
browser takes the rest. Pin it to api or browser to diagnose a result, or to
force the browser for the one thing only it can do.
Login: one fingerprint, nothing else
epost_login drives every step of the SwissID chain that does not need a human
and stops at the only one that does — the biometric prompt:
app.epost.ch → login.epost.ch clicks "Login mit SwissID"
→ login-email fills your account e-mail, "Weiter"
→ confirm-passkey "Weiter" → macOS asks for Touch ID ← you
→ app.epost.ch, authenticated; session cachedMeasured end to end: 19 seconds, one fingerprint, no password and no SMS code. Two things have to be in place:
A passkey on your SwissID account, created normally in Safari or Chrome (
account.swissid.ch→ Login-Einstellungen). Apple's authenticator is accepted; see the note below for why a software one is not.A signed browser. Playwright's bundled Chromium is an unsigned test build and reports
isUserVerifyingPlatformAuthenticatorAvailable() === false, so Touch ID is never offered and SwissID falls back to password + SMS. Installed Google Chrome reportstrue. The server therefore prefers a signed system browser automatically —chrome,chrome-canary,edge,brave, in that order — and falls back to the bundled Chromium. Override withEPOST_BROWSER.
Tell it which account to fill in, either way:
security add-generic-password -a epost -s epost-mcp-swissid-user \
-w 'you@example.com' -U # or: export EPOST_SWISSID_USER=you@example.comepost_settings prints what was resolved — browser, passkey capability, paths,
and whether the account e-mail is configured. Run it first if a login surprises
you.
Why the login is not fully unattended
Everything except the biometric prompt is driven. That is the ceiling, not a shortcoming of the implementation: a passkey cannot be used without genuine user presence.
The tempting shortcut — a software passkey through Chrome's WebAuthn virtual authenticator, so the server could sign the login itself — was built, tried, and removed. SwissID rejects software authenticators outright:
POST /api-login/authenticate/webauthn-register -> 400
ERROR::WebauthnVendorNotAllowedIt was removed rather than kept "just in case": it could never work against the one service this server talks to, and it wrote an exportable private key into the login keychain — a standing risk in exchange for nothing.
Register in Claude Code
Use an absolute path to index.js:
claude mcp add epost --scope user -- node /absolute/path/to/epost-mcp/index.jsOr add it directly to ~/.claude.json:
{
"mcpServers": {
"epost": {
"command": "node",
"args": ["/absolute/path/to/epost-mcp/index.js"]
}
}
}(Claude Desktop uses the same shape in its claude_desktop_config.json.)
Tools
Tool | Params | Returns |
| — |
|
|
| Opens a visible window and drives the SwissID chain up to the Touch ID prompt. |
| — | Resolved browser + why, Touch ID capability, paths, whether the account e-mail is set |
|
|
|
|
|
|
|
|
|
|
| Archive: takes the letter out of the inbox into that Storage folder. Not a delete. |
|
| Full-text search inside the letters. API only — the portal offers nothing like it. |
|
| One letter: sender description, document types, dates, read status |
| — |
|
|
| Mark letters read or unread. |
| — | Trash, with days remaining before permanent removal |
|
| Restore a deleted letter to the inbox |
|
| ⚠️ Moves a letter to the trash. Gated behind |
|
| Thumbnail image — eyeball a document without fetching the PDF |
| — |
|
|
|
|
| exactly one of | Opens one Storage document: real sender/subject, document type, date, amount, folder — and saves the PDF when |
|
|
|
|
| Files a Storage document into a folder. |
|
| Removes a folder membership. Only works while the document is in more than one folder (see below). |
Notes on the Storage tools
The Storage area (LetterStorage) has auto Companies folders (grouped by
sender, e.g. ePost / la Mobilière), your Custom folders, and the master
My Documents (N) list. epost_list_storage returns your Custom folders and
the My-Documents count; epost_list_storage_documents enumerates the individual
documents (each only exposes a date + a Stored in <folder> tag once filed).
Archiving a letter (epost_store_letter)
Store in the card menu is a two-step action: it opens a Select a folder
sheet carrying its own Store button, greyed out until a folder is ticked. That is
why a folder argument is required — without one the sheet cannot commit, and
stopping after the first click archives nothing while leaving an invisible
overlay that swallows every later click.
Three things inside that sheet make a folder that is plainly there look absent, all of them handled now but worth knowing if it ever regresses:
.brand-containeralso matches the letter cards behind the sheet, so the lookup has to be scoped to the sheet element.The tiles sit in a horizontally scrolling strip, so filtering on visibility drops every folder off to the right.
Folder names must be compared NFC-normalised: a name with an umlaut is NFC on one side and NFD on the other, and a byte-exact compare never matches.
ePost folders are additive labels, not physical locations. My Documents
always lists every document; filing simply adds a folder membership (a document
can belong to several folders at once). epost_move_to_folder reflects this: it
opens the document's … menu → Move → ticks the target folder → confirms, and
is idempotent — a no-op if the document is already in that folder, and it
never removes an existing membership. Two consequences worth knowing:
Filing bumps a document to the top of the Last used order, so re-list before addressing the next document by
index(indices shift after a move).The portal's Move sheet will not commit an empty folder set, so a document that is in exactly one folder cannot be returned to "unfiled" through this flow — you can only re-file it elsewhere (or delete it) in the ePost UI. In other words, filing is effectively one-way; get the target right first.
Environment variables
Variable | Default | Purpose |
|
|
|
| keychain | Password for the password grant. Secret. |
| keychain | Sent as |
| keychain | Account e-mail: the API username, and what the login fills in |
| first signed system browser found |
|
|
| Cached session (storageState). Secret, written |
|
| Persistent browser profile. It holds the same session in Chromium's own store, so it is just as secret; created |
|
| API host — overridable for tests |
|
| Portal base — overridable for tests |
| unset |
|
|
| Scales the fixed pauses that let the portal repaint, and nothing else — no timeout is derived from it. Only shortens: anything that is not a finite number in |
The browser is resolved in that order deliberately: an installed, signed browser
first, because only that one can reach the platform authenticator, and only then
Playwright's own Chromium and the Playwright cache
(~/Library/Caches/ms-playwright/chromium-*). epost_settings reports which was
chosen and why.
Troubleshooting
Tools return
login_required. The cached session expired (SwissID sessions are short-lived). Runepost_loginand complete SwissID; the session is re-cached. If it keeps happening immediately, delete~/.epost-mcp/state.jsonand log in fresh.epost_loginwindow never appears.epost_loginis the only tool that runs headed. If nothing opens, another instance may hold the browser — stop other MCP clients using this server, then retry.Chromium not found. Run
npx playwright install chromium, or setEPOST_CHROMIUMto the executable path, e.g. on macOS:~/Library/Caches/ms-playwright/chromium-<build>/chrome-mac/Chromium.app/Contents/MacOS/Chromium.Download does not trigger. The server clicks the portal's Download File button and captures the browser download event. If it times out, ePost likely changed the letter-detail layout; the button is matched by its visible text and
[aria-label="Download File"]. Re-runepost_list_lettersfirst to confirm the letterbox is reachable.Selectors broke after an ePost release. This automation tracks the live DOM (
div.letter-wrapper, Digital Letterbox, Go to Storage, Download File). Portal changes can break it; open an issue.
How it works (internals)
chromium.launchPersistentContext(EPOST_PROFILE, …)withacceptDownloads: trueandlocale: 'de-CH', and the cookies fromstate.jsonare then added on top. Both halves are needed: the profile keeps what a fresh context throws away, notably SwissID's "this device is known" state, whilestate.jsonkeeps the session cookies, which a persistent profile drops when the browser closes. Running onstorageStatealone is what made every expiry cost the full two-factor dance again.Navigating to
app.epost.chfollows the KLARA/SwissID SSO redirect chain onto the dashboard (or a visible login form if the session died).The letterbox is opened by clicking the Digital Letterbox label (URL then contains
DigitalLetterboxOverview).Letters are
div.letter-wrapperelements. Downloads iterate on the same page: click letter → Download File → save → Escape back to the list.
Releasing
Published from CI with npm Trusted Publishing (OIDC) — there is no npm token anywhere: no secret to store, rotate or leak. npm recommends this over an automation token, and is restricting tokens that bypass 2FA.
One-time setup per package, on npmjs.com -> the package -> Settings -> Trusted Publisher:
Field | Value |
Organization or user | sapn95 |
Repository | epost-mcp |
Workflow filename | release.yml |
Allowed actions | npm publish |
The workflow filename must match exactly. That is deliberate: it stops any other workflow in the repo from publishing under your name.
Then every release is one command:
npm version patch && git push --follow-tagsThe tag triggers the release workflow: it upgrades npm (trusted publishing needs
= 11.5.1 and Node >= 22.14), refuses a tag whose version disagrees with package.json, runs the gate, and publishes with a signed provenance statement.
If the publish fails with 404
npm notice publish Signed provenance statement ... from GitHub Actions
npm error 404 Not Found - PUT https://registry.npmjs.org/epost-mcpProvenance was signed, so OIDC worked — the registry simply does not accept this workflow as a publisher yet. That means the trusted publisher is not configured, or the repository / workflow name does not match. npm answers 404 rather than 403 so as not to reveal whether the package exists. It is not a credential problem: there is no credential, by design.
Checks
npm run gate # lint + smoke + hygiene + tests with coverage enforced
npm test # just the tests
npm run mutate # mutation-test the lines this branch changedRuns exactly what CI runs, offline and without credentials: a syntax check, the protocol smoke test and the hygiene scan.
The smoke test completes the MCP handshake over stdio and asserts the things that have actually broken here — a server version drifting from package.json, a tool in the dispatcher but missing from the tool list (or advertised and unhandled), a required property absent from a schema, and descriptions too thin to choose a tool from. The hygiene scan refuses secrets, tracked session files and personal identifiers.
npm run mutate asks a different question from the rest: not "do the tests
pass" but "would they notice if a guard were removed". StrykerJS deletes one
piece of behaviour at a time and reruns the suite; anything that survives is
something no assertion is watching. It found eleven real gaps in the sibling
pingen-mcp after model review rounds had stopped turning anything up.
Only the lines a branch changed, because a whole-file pass here means driving a
real browser once per mutant and costs most of a day. npm run mutate:all does
the whole file if you have the time; stryker.config.json explains every
setting that is not a default, including why incremental mode is off.
License
MIT © sapn95 — see LICENSE.
Available Tools
21 toolsepost_create_folderC
Create a new custom folder in the ePost Storage area.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and description lacks details on side effects (e.g., duplicate behavior, permissions, return value). Only states the action without behavioral context.
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?
Single sentence that is concise and to the point. Could be slightly expanded for clarity, but no unnecessary words.
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 simple tool with one required param and no output schema, the description provides basic purpose but lacks operational completeness (e.g., error handling, idempotency).
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 only parameter 'name' has no description in schema (0% coverage) and the description does not add any constraints or format details (e.g., length, uniqueness).
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?
Clearly states verb 'Create', resource 'new custom folder', and location 'ePost Storage area'. Distinguishes from sibling tools like epost_move_to_folder and epost_list_storage.
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?
No guidance on when to use this tool versus alternatives like epost_move_to_folder. No prerequisites (e.g., login required) or exclusions mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_delete_letterA
DESTRUCTIVE: move a letter to the trash. Requires confirm:true. Prefer epost_store_letter to archive something — deleting is not how you tidy an inbox.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | ||
| letter_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description must fully disclose behavior. 'DESTRUCTIVE' suggests irreversible but 'move to trash' implies reversible; ambiguous. Requires confirm:true but doesn't clarify side effects or permissions.
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?
Two concise sentences, front-loaded with 'DESTRUCTIVE'. No wasted words.
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?
No output schema or annotations; description omits whether deletion is reversible (sibling epost_restore_letter exists). Could explain restoration options or consequences.
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 has 0% description coverage; description only mentions 'confirm:true' without explaining the boolean's role or letter_id format. Fails to compensate for missing schema details.
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?
Clearly states the tool moves a letter to the trash, using 'DESTRUCTIVE' to indicate nature. Distinct from sibling epost_store_letter for archiving.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use for deletion and advises preferring epost_store_letter for archiving. Notes required confirm:true.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_download_allB
Download every letter in the letterbox to output_dir. Returns the saved paths.
| Name | Required | Description | Default |
|---|---|---|---|
| output_dir | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It only states the action and output but does not disclose behavioral traits such as whether it overwrites existing files, authentication requirements, rate limits, or error handling. This is insufficient for a bulk download operation.
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 a single sentence that immediately states the action and return value. It is front-loaded and contains no unnecessary words, making it efficient.
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 tool that downloads all letters, the description is too brief. It does not explain behavior on network failures, partial downloads, duplicate handling, or performance implications. No output schema exists to clarify the return value structure. Additional details are needed to ensure safe and effective use.
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 has no descriptions for the single parameter 'output_dir' (0% coverage). The description adds minimal meaning by mentioning 'to output_dir', but does not specify format, permissions, or how the directory is used. More detail is needed to compensate for the lack of schema descriptions.
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 clearly states the tool downloads every letter from the letterbox to a specified directory and returns the saved paths. The verb 'Download' and resource 'every letter' are specific, and it distinguishes from sibling tools like 'epost_download_letter' that handle single 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?
No guidance is given on when to use this tool versus alternatives (e.g., epost_download_letter), or any prerequisites or limitations. The description lacks context for appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_download_letterB
Download one letter to output_dir, addressed by list index or by letter_id. Returns the saved path (YYYY-MM-DD_ePost_.pdf), written 0600.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | ||
| letter_id | No | instead of index; needs the public API | |
| output_dir | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, and the description only mentions the return path format and a cryptic 'written 0600'. It does not disclose side effects, authentication needs, or error conditions, leaving the agent uninformed about important behavioral traits.
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?
Two sentences with no extraneous words. The core action is front-loaded, and the return format is specified concisely.
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 lack of annotations and output schema, the description is too minimal. It omits critical context like prerequisite steps (e.g., listing letters), error handling, and file overwrite behavior, making it insufficient for reliable agent use.
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 description adds minimal value beyond the schema: it explains that index and letter_id are alternatives, but does not describe the index's origin or format, and output_dir lacks any explanation. With only 33% schema coverage, the description fails to compensate adequately.
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 clearly states the tool downloads one letter to a specified directory, with two addressing methods (index or letter_id). It distinguishes itself from sibling tools like epost_download_all and epost_get_letter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use index vs letter_id, nor alternatives. No exclusionary context or when-not scenarios are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_download_thumbnailB
Save the thumbnail image of a letter — useful to eyeball a document without fetching the whole PDF.
| Name | Required | Description | Default |
|---|---|---|---|
| letter_id | Yes | ||
| output_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It states 'Save' (a write operation) but omits details about file format, size limits, overwrite behavior, or authentication needs. Minimal transparency beyond the basic 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 a single sentence, concise and to the point. No unnecessary words, and it conveys the essential purpose.
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 no output schema, no annotations, and minimal parameter info, the description leaves many aspects unclear (e.g., return value, error handling). It is insufficient for an agent to fully understand the tool's behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description adds no explanation for the parameters 'letter_id' and 'output_path'. The names are somewhat self-explanatory, but the description should have clarified their purpose and format.
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 clearly states the verb ('Save') and the resource ('thumbnail image of a letter'). It also provides a use case that distinguishes it from siblings like 'epost_download_letter' (fetching full PDF).
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 description gives a clear context: 'useful to eyeball a document without fetching the whole PDF.' This implicitly suggests when to use it, but it does not explicitly exclude scenarios or name alternatives, though siblings list includes the full download tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_get_letterB
Get one letter by its id, with the sender description, document types, dates and read status.
| Name | Required | Description | Default |
|---|---|---|---|
| letter_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It does not disclose behavioral traits like whether the operation is read-only, requires authentication, or has any side effects. The description only states what it returns, not how it behaves.
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 a single, concise sentence (18 words) that efficiently communicates the core purpose. It earns its place with no superfluous information, though it could benefit from minor structuring (e.g., bullet points for included fields).
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 tool has only one parameter and no output schema, the description is minimally adequate. It covers what the tool returns but does not explain the output structure, error handling, or relationship to other tools in the e-post system. For a simple retrieval tool, it meets basic needs but lacks completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description should explain the parameter. It only says 'its id' without clarifying the format, source, or constraints of the letter_id. The schema lists it as a required string with no description, so the tool adds little semantic value.
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 clearly states that the tool retrieves one letter by its ID, specifying the included details (sender description, document types, dates, read status). This distinguishes it from siblings like epost_list_letters which lists multiple 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?
No explicit guidance on when to use this tool versus alternatives. The description does not mention prerequisites, such as needing the letter_id from another tool, nor does it advise against using it for bulk operations. Siblings exist (e.g., epost_search, epost_list_letters) but no comparison is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_list_deletedB
Letters in the trash, with the days remaining before they are permanently removed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full responsibility for behavioral disclosure. It reveals the output contains days remaining but omits any mention of authentication requirements, side effects, or pagination. This is insufficient for a tool expected to be invoked by an AI agent.
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 a single sentence of 12 words with no redundancy. Every word contributes meaning, achieving maximum conciseness.
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 tool has no parameters, no output schema, and no annotations, the description provides the core purpose but lacks details on sorting, scope (user-specific or global), or whether the list is exhaustive. It is minimally adequate but not fully 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?
There are zero parameters, and schema coverage is 100%, so the description adds value by explaining what the tool returns (deleted letters with days remaining). Baseline for zero parameters is 4, and the description fulfills that.
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 'Letters in the trash, with the days remaining before they are permanently removed' clearly indicates the tool lists deleted letters and shows retention time. It distinguishes from sibling tools like epost_list_letters (active letters) and epost_delete_letter (deletion action), though the verb is implied 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?
No guidance is provided on when to use this tool versus alternatives such as epost_list_letters or epost_restore_letter. The description gives no context for decision-making.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_list_lettersA
List the letters currently in the digital letterbox (index, id, sender, title, date, read). Over the API at most limit are returned and the reply says so when that window was filled.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | how many to fetch over the API (default 200) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It mentions the limit behavior and fields returned, but does not explain pagination, authentication requirements, read-only nature, or whether it returns all letters (including read/unread).
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 two sentences long, front-loads the core purpose, and each sentence adds value. No unnecessary words.
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?
The description includes the fields returned and limit behavior, which is sufficient for a simple list tool. However, it could better differentiate from siblings by noting that it lists current (not deleted) letters.
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% with a description for the limit parameter. The description adds a note about the limit behavior, which adds slight context but does not significantly improve upon 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?
The description clearly states the action 'List' and the resource 'letters currently in the digital letterbox', and lists the returned fields. This distinguishes it from siblings like epost_list_deleted and epost_search.
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 description mentions the limit behavior but does not explicitly state when to use this tool versus alternatives like epost_search or epost_list_deleted. No exclusion criteria or typical use cases are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_list_storageA
List the user's custom folders (name + document count) in the ePost Storage area plus the unsorted My-Documents count.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, but the description transparently indicates a read-only listing operation with no side effects. It accurately describes the output (folder names, document counts) without contradicting any structured data.
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 a single sentence that conveys all necessary information without redundancy. It is front-loaded with the main action and specific details, making it efficient and easy to parse.
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 no output schema, the description fully explains what the tool returns: custom folders with name and document count, plus the unsorted My-Documents count. This is sufficient for an agent to understand the tool's output without additional context.
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 input schema has no parameters, so the description cannot add parameter meaning beyond what exists. Baseline of 4 is appropriate as there is nothing to document.
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 explicitly states the tool lists custom folders with name and document count, plus the My-Documents count. It uses specific verbs ('list') and resources ('custom folders', 'My-Documents count'), making the purpose clear and distinct from generic listing.
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?
No explicit guidance on when to use this tool versus alternatives like epost_list_storage_documents or epost_list_letters. However, the sibling list suggests a potential distinction between listing storage structure vs. content, but this is not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_list_storage_documentsB
List the documents in Storage. Over the API each carries a real description ("Invoice from ...") and documentTypes; over the browser fallback only a date and the folder tag. Pass folder_id to list one folder, scroll_all for the browser path.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| folder_id | No | limit to one folder (API only) | |
| scroll_all | No | browser fallback: load every card first |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries full burden. It reveals behavioral differences between API and browser fallback (descriptions vs. date/tag). However, it does not state read-only nature, permissions, or pagination/limits. Adds some value but missing depth.
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?
Two sentences, front-loaded with purpose, no redundancy. Could be more structured by explicitly listing parameters, but it is concise and readable.
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 three parameters and no output schema or annotations, the description omits default behavior (listing all documents when folder_id omitted) and does not explain the limit parameter's purpose. The distinction between API and browser fallback is helpful but incomplete.
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 67%. The description adds meaning for folder_id and scroll_all beyond schema, but limit (missing schema description) remains unexplained. Two of three parameters benefit; one is overlooked.
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 clearly states the tool lists documents in Storage, with a specific verb and resource. It distinguishes between API and browser fallback behaviors but does not explicitly differentiate from sibling tools like epost_list_storage or epost_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?
The description provides parameter-level guidance (use folder_id for one folder, scroll_all for browser path) but lacks high-level when-to-use advice compared to siblings like epost_search or epost_list_storage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_loginA
Open a VISIBLE browser window and drive the whole SwissID login except the biometric prompt: it goes to SwissID, fills the account e-mail and requests the passkey, so you only confirm with Touch ID. Falls back to a normal manual login. Caches the session afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
| wait_seconds | No | how long to keep the window open (default 300, minimum 30 — a SwissID redirect chain takes longer than that on its own) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors: visible browser, credential filling, passkey request, manual fallback, session caching. Without annotations, it provides sufficient transparency. It does not mention potential side effects like leaving the browser open, but the wait_seconds parameter mitigates this.
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 mostly concise, packing all essential information into two sentences. The first sentence is slightly long but front-loads the main action. No extraneous 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?
Given the complexity of a login automation tool with multiple steps (browser, credentials, fallback, caching), the description covers all aspects sufficiently. No output schema is needed, and the parameter is well-documented.
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 parameter description in the schema already explains wait_seconds. The tool description adds value by explaining the reason for the minimum (SwissID redirect chain), which aids agent understanding.
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 clearly states the tool automates SwissID login by opening a visible browser, filling email, requesting passkey, and handling fallback. It distinguishes itself from sibling tools (which are post-login operations) and uses specific verbs like 'open' and 'drive'.
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 description implicitly indicates when to use (automating login except biometric prompt) and mentions fallback behavior. It lacks an explicit statement of when not to use (e.g., if manual login is preferred), but the context among siblings makes the usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_move_to_folderA
File a Storage document into a custom folder (addressed by index in the loaded My-Documents list, or by a text substring such as a date). Pass remove_from to re-file: the old folder is unticked in the same sheet, which is the only way to empty a folder that holds the document's only membership. ePost documents can belong to several folders, so this ADDS the folder membership: it is idempotent (no-op if already filed there) and removes nothing unless remove_from says which. Note: filing a document bumps it to the top of the "Last used" order, so re-list before addressing the next one by index.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | ||
| title | No | ||
| folder | Yes | ||
| remove_from | No | folder to drop in the same step (re-file) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavioral traits: idempotent (no-op if already filed), adds folder membership without removal unless remove_from is specified, and notes the side effect of bumping the document's position. No contradictions with structured data.
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 a single paragraph that front-loads the main action and gradually provides details. At about 100 words, it is fairly concise, though some phrasing like 'unticked in the same sheet' could be simplified. Overall, every sentence adds value without redundancy.
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 tool is a mutation with no output schema, the description covers the core behavior, parameters, and side effects. It doesn't detail return values or error scenarios, but that is acceptable. The sibling list provides context for when this tool is appropriate.
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 only 25% (only remove_from has a description), so the description carries the burden. It explains the meaning of all four parameters: index as position in list, title as substring, folder as target, remove_from as old folder to drop. This compensates well for the lack of schema descriptions.
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 clearly states it files a Storage document into a custom folder, specifying the action, resource, and method of addressing (by index or substring). It distinguishes itself from sibling tools like epost_create_folder and epost_unfile_from_folder by explaining it adds membership and is idempotent.
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?
Provides concrete usage context: how to address (index or substring), how to re-file using remove_from, and notes that filing bumps the document to top of 'Last used' order, requiring re-listing before next index. However, it does not explicitly state when not to use this tool or suggest alternatives beyond the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_read_storage_documentA
Open one Storage document and report what the portal knows about it: the real sender/subject line, document type, date, amount and current folder. The card list only ever shows "Gescannter Brief", so this is the only way to classify an archived document. Pass output_dir to also save the PDF.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | ||
| title | No | ||
| folder_id | No | ||
| letter_id | No | ||
| output_dir | No | save the PDF here as well |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It describes the tool as reading/reporting information, implying read-only, but does not explicitly state side effects, permissions, or rate limits. The optional PDF saving is a side effect noted.
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?
Two efficient sentences: first states core function and outputs, second explains rationale and optional parameter. No wasted words.
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?
Despite good purpose clarity, the description lacks parameter usage guidance, return format, and explicit behavioral traits. For a tool with 5 undocumented parameters and no output schema, more detail is needed to be 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 coverage is 20% (only output_dir described). Description adds no guidance on how to identify the document (index, title, folder_id, letter_id are unexplained). It only repeats the output_dir purpose.
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?
Description clearly states it opens a storage document and reports specific fields (sender, subject, type, date, amount, folder). It distinguishes from siblings by noting the card list only shows 'Gescannter Brief' and this tool is the only way to classify archived documents.
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?
Description implies when to use (to classify archived documents) by stating it's the only way. It mentions the optional output_dir parameter for saving PDF, but does not explicitly state when not to use or compare alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_restore_letterC
Restore a deleted letter back to the inbox.
| Name | Required | Description | Default |
|---|---|---|---|
| letter_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only says 'restore' but doesn't specify side effects, what happens if the letter_id is invalid or already restored, or any state changes. The description is insufficient for safe usage.
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 a single sentence, which is concise, but it is too minimal to provide sufficient value. It is not verbose, but could be structured to include more context without losing conciseness.
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 simple tool with one parameter and no output schema, the description should adequately cover behavior. However, it lacks information on return values, error cases, and prerequisites, making it incomplete for an AI agent to invoke reliably.
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 sole parameter 'letter_id' is not explained beyond the schema. With 0% schema description coverage, the description should have added meaning, such as what format the ID is or how to obtain it. No extra semantics provided.
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 clearly states the action (restore) and resource (deleted letter) and specifies the target location (inbox). It distinguishes itself from sibling tools like epost_delete_letter and epost_list_deleted.
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?
No guidance on when to use this tool compared to siblings. For example, it doesn't mention prerequisites like the letter must be deleted first, or that it's the inverse of epost_delete_letter. The description lacks usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_searchA
Full-text search across your letters — keywords are matched inside the letter content, not just the metadata. Optionally limit to the inbox or to Storage. API only; there is no equivalent in the portal automation.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| keyword | Yes | ||
| location | No | default ALL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must cover behavioral traits. It describes the search behavior and optional location filtering, but doesn't mention whether it's read-only, pagination, or any 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?
Two concise sentences that front-load the purpose and add essential detail about scope and API-only nature, with no wasted words.
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 3-parameter tool with no output schema, the description covers the core search functionality and optional filters. Could mention return format, but overall adequate.
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 only 33% (location has description). The description adds value by clarifying keyword matches content (vs metadata) and location limits to inbox/storage, but doesn't explain the limit parameter.
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 clearly states the tool does full-text search across letters, matching keywords in content rather than metadata, which is specific and distinguishes it from other listing tools.
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 description mentions 'API only; no equivalent in portal automation', giving context that it's an API-specific operation. However, it doesn't explicitly state when to use this versus sibling tools like epost_list_letters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_set_read_statusC
Mark letters READ or UNREAD by id.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | ||
| letter_ids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It states the tool marks letters read/unread, implying state change, but does not disclose side effects, required permissions, rate limits, or behavior for non-existent letters.
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?
Single sentence of 5 words, highly concise and front-loaded. Lacks structured details but achieves brevity without wasted words.
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 no output schema, no annotations, and 2 parameters, the description is too minimal. It does not explain return behavior, error conditions, or what happens on success/failure. Incomplete for a 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 0%. The description adds no meaning beyond the schema: 'by id' is redundant with the 'letter_ids' parameter. The 'status' parameter is only defined by its enum values in 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?
The description 'Mark letters READ or UNREAD by id.' clearly states the action (mark), the resource (letters), and the specific states (READ/UNREAD). It distinguishes this tool from siblings like epost_unread_count (count only) and epost_status (likely different).
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?
No usage guidelines provided. The description does not indicate when to use this tool versus alternatives, nor does it mention prerequisites (e.g., login required) or context for setting read vs unread status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_settingsA
Show the resolved configuration: which browser is driven and why, whether it can use Touch ID passkeys, the profile/state paths, and whether the SwissID account e-mail is configured.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses what information is shown but does not explicitly state it is read-only or mention any side effects, authentication needs, or rate limits. The description is adequate but could be improved.
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 a single sentence, concise and well-structured, front-loading the purpose and listing specifics without extraneous words.
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 no output schema, the description should compensate. It lists the types of information but does not specify the output format or structure, leaving some uncertainty. For a simple info tool, it is partially 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?
With zero parameters and 100% schema coverage, the description adds meaning by explaining what the tool outputs. Baseline is 4, and the description provides clear detail on the configuration fields, earning a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool shows the resolved configuration and lists specific items like browser driver, Touch ID capability, paths, and email config. It is distinct from sibling tools which perform actions like login 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?
No explicit guidance on when or when not to use this tool. It is implied for configuration inspection, but no alternatives or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_statusA
Check whether the ePost session is alive (ok) or an interactive SwissID login is needed (login_required).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses the return values ('ok' or 'login_required') and implies a read-only operation, but does not explicitly state it is non-destructive or idempotent. Additional context like 'This operation does not modify any data' would improve transparency.
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 a single sentence of 16 words, front-loading the purpose. Every word is meaningful with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple status-check tool with no parameters and no output schema, the description is complete. It explains what the tool checks and the two possible return values, sufficient for an agent to understand its behavior.
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 no parameters (empty input schema, 100% coverage). Per scoring rules, baseline is 4 for zero parameters. The description adds no parameter information, which is acceptable given no parameters exist.
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 clearly states the tool checks ePost session status, returning 'ok' or 'login_required'. It specifies the resource (ePost session) and the action (check), distinguishing it from sibling tools like epost_login or epost_unread_count.
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 description provides no guidance on when to use this tool versus alternatives, such as suggesting it be called before other ePost operations to verify session validity. There is no mention of prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_store_letterA
Archive a letter into a Storage folder (the "Store" action): keeps the document, this is not a delete. A target folder is REQUIRED — Store opens a "Select a folder" sheet and will not commit without one. Address the letter by index in the inbox list, or by a text substring such as a date; indices shift after each store, so re-list between calls.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | ||
| title | No | ||
| folder | Yes | existing Storage folder to file it into | |
| letter_id | No | API letter id (preferred — indices shift) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It discloses the action is non-destructive, requires a folder, and addresses methods with index shift warning. Lacks details on permissions, error handling, or side effects, but adequate for a simple archival 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?
Three sentences with no redundancy. Front-loaded with core action and key differentiator (not a delete). Every sentence adds value.
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 no output schema and 4 parameters (1 required), the description covers the main behavior, identification methods, and a crucial behavioral warning (index shift). Could mention error handling or what happens if letter not found, but overall complete for intended use.
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?
Adds meaningful context beyond the input schema: clarifies that folder is required, explains how to identify letters via index or title substring, and notes indices shift. The schema covers 50% of parameters; description compensates well.
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?
Clearly states it archives a letter into a Storage folder (the 'Store' action), emphasizes it is not a delete, and distinguishes from sibling tools like epost_delete_letter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear instructions on how to address a letter (by index or substring) and warns that indices shift after each store, recommending re-listing. Does not explicitly state when not to use or compare to alternatives, but context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_unfile_from_folderA
Remove a Storage document from a folder. NOTE: the portal will not commit an empty folder set, so this only works when the document is in more than one folder; to empty a folder that holds the document's only membership, use epost_move_to_folder with remove_from instead.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | ||
| title | No | ||
| folder | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description fully responsible. It discloses the core operation and the limitation about empty folder sets. However, it does not mention side effects, success behavior, or permissions needed. Some behavioral gaps remain.
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?
Two concise sentences, front-loaded with the core purpose, followed by a necessary note. No redundant or irrelevant 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?
Given no annotations or output schema, the description fails to explain parameter semantics, leaving uncertainty about how to specify the document. The alternative tool mention helps, but overall completeness is moderate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description explains none of the three parameters (index, title, folder). The folder parameter is implied but not clarified. The agent cannot determine how to identify the document (by index, title, or both).
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?
Clearly states 'Remove a Storage document from a folder,' using a specific verb and resource. The note distinguishes from the sibling tool epost_move_to_folder by explaining when to use which, providing clear differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when the tool works (document in more than one folder) and when not (single folder membership). Provides an explicit alternative: use epost_move_to_folder with remove_from instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
epost_unread_countB
How many unread letters are in the inbox.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears the full burden of behavioral disclosure. However, it only states the tool returns a count, with no mention of authentication requirements, side effects, rate limits, or the format of the return value. For a read operation, these details are missing.
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 a single sentence, front-loaded, and contains no superfluous words. It could benefit from adding brief context without becoming verbose, but it achieves efficient communication of the core purpose.
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 no output schema and no annotations, the description is the sole source of information. It fails to specify what format the count is returned in, whether it requires being logged in (sibling epost_login suggests authentication), and if it's scoped to the current user. This lack of completeness could confuse an AI agent.
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?
There are no parameters, so schema coverage is trivially 100%. The description does not need to add parameter meaning, but it also does not explain what the tool returns or how to interpret the result. Baseline 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 clearly states the tool returns the count of unread letters in the inbox. It uses a specific resource (unread letters) and scope (inbox), and implicitly distinguishes itself from sibling tools like epost_list_letters which list the actual 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?
No guidance is provided on when to use this tool versus alternatives. For example, it does not mention that for detailed unread letter info, one should use epost_list_letters with a filter. The description gives no when-not or alternative suggestions.
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.
21 tool updates
v0.11.0- First observed
epost_create_folder - First observed
epost_delete_letter - First observed
epost_download_all - First observed
epost_download_letter - First observed
epost_download_thumbnail - First observed
epost_get_letter - First observed
epost_list_deleted - First observed
epost_list_letters - First observed
epost_list_storage - First observed
epost_list_storage_documents - First observed
epost_login - First observed
epost_move_to_folder - First observed
epost_read_storage_document - First observed
epost_restore_letter - First observed
epost_search - First observed
epost_set_read_status - First observed
epost_settings - First observed
epost_status - First observed
epost_store_letter - First observed
epost_unfile_from_folder - First observed
epost_unread_count
TDQS
Scored across 21 tools
Each tool has a clearly distinct purpose: inbox management (list, download, delete, etc.), storage operations (folders, documents), session status, and search. No two tools overlap in function; even similar operations like download_letter and read_storage_document are differentiated by context (inbox vs. storage) and output format.
All tools follow the consistent pattern 'epost_' + verb or verb phrase in snake_case. Examples: epost_list_letters, epost_download_all, epost_move_to_folder. No mixing of conventions; the naming is predictable and readable.
With 21 tools, the server covers the full scope of ePost management—inbox, storage, search, settings, and login—without being bloated. Each tool serves a necessary function, and the number is appropriate for the domain.
The tool surface covers the complete lifecycle for both inbox and storage: CRUD operations on letters and folders, read status management, search, archival, and trash handling. No obvious gaps; essential actions like unread count, settings, and login are included.
Maintenance
Related MCP Connectors
The agentic layer of letters. Agents send real printed mail worldwide, German compliance built in.
Automate any website: discover, run and create browser scripts that work behind logins.
Stealth web browser for agents: search, fetch, click, download and type in persistent MCP sessions.
Manage Gmail end-to-end: search, read, send, draft, label, and organize threads. Automate workflow…
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables browsing, retrieving, and downloading meeting recordings and transcripts from Grain via browser automation, bypassing the need for enterprise API access.2Apache 2.0
- AlicenseAqualityCmaintenanceMCP server for the Dropscan postal-mail-to-email API. It enables reading and managing physical mail items, including listing, downloading scans, and (when explicitly enabled) executing actions like forwarding or destroying letters.21MIT
- AlicenseNot gradedqualityCmaintenanceExposes Gmail inbox actions (list, archive, label) as MCP tools via a browser extension and local bridge, without requiring the Gmail API or OAuth.89 npmMIT
- AlicenseAqualityCmaintenanceEnables interaction with Outlook Web through its internal API, supporting email search, folder listing, email retrieval, read state changes, calendar events, and reply drafts without Microsoft Graph or COM.71MIT