Skip to main content
Glama
sapn95
by sapn95

epost-mcp

Read, download and archive your Swiss ePost digital letterbox — over the documented public API, with browser automation as a fallback.

npm   CI   node   licence


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 3

A 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 drives

Session / 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_login and after every successful tool call, the server re-saves state.json, keeping the cached session fresh.

  • epost_login opens 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 run epost_login again.

First-time / after-expiry flow:

  1. Call epost_status. If it returns login_required

  2. …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.

  3. Use epost_list_letters, epost_download_letter, etc. headlessly.

Security: ~/.epost-mcp/state.json contains 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 with EPOST_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:

  1. Log in to app.epost.ch with SwissID as usual.

  2. In the same browser, open https://login.epost.ch/auth/realms/klara/account/AuthenticationSet/update password, and set one. A SwissID login has no password of its own, which is the whole point of this step.

  3. Store it: security add-generic-password -a epost -s epost-mcp-api-password -w -U-w with no value prompts, so the password never reaches your shell history or a process listing. (or set EPOST_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

Gescannter Brief for every scan

a real description ("Invoice from …") and documentTypes

Storage listing

48 cards at a time, scrolled

every document in one call

Archiving

two-step folder sheet

one PATCH

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 cached

Measured end to end: 19 seconds, one fingerprint, no password and no SMS code. Two things have to be in place:

  1. 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.

  2. 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 reports true. 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 with EPOST_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.com

epost_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::WebauthnVendorNotAllowed

It 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.js

Or 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

epost_status

{ status: "ok" | "login_required" }

epost_login

wait_seconds (optional, default 300)

Opens a visible window and drives the SwissID chain up to the Touch ID prompt. { status, browser, message }

epost_settings

Resolved browser + why, Touch ID capability, paths, whether the account e-mail is set

epost_list_letters

limit (optional, API only)

{ transport, count, letters[] }, newest first. Over the API a letter carries id, a real sender description, documentTypes and read; over the browser fallback sender, title, date, dates and a preview. truncated: true when the window was filled

epost_download_letter

output_dir (required); index or letter_id (API only)

{ saved }, written 0600YYYY-MM-DD_ePost_<letter id>.pdf over the API, _<index>.pdf over the browser fallback, which has no id to name it by. An index is a position in a list that renumbers itself after every store, so two calls a day apart can mean two different letters

epost_download_all

output_dir (string)

{ count, saved[] } — every letter downloaded

epost_store_letter

folder (required); exactly one of index, title, letter_id

Archive: takes the letter out of the inbox into that Storage folder. Not a delete. { stored, folder } — or { status: "refused" } when the portal would not accept the folder sheet, which it signals by leaving it open and nothing else. A title is matched against the first 200 letters only, so on a longer inbox it is refused rather than guessed at; a refusal from the service itself is reported however the letter was addressed, and not retried through the portal

epost_search

keyword; location (ALL|INBOX|STORAGE), limit

Full-text search inside the letters. API only — the portal offers nothing like it.

epost_get_letter

letter_id

One letter: sender description, document types, dates, read status

epost_unread_count

{ unread }

epost_set_read_status

letter_ids[], status (READ|UNREAD)

Mark letters read or unread. accepted counts the ids that were sent: the endpoint answers with an empty 204 and never names the ones it recognised, so an id that no longer exists is counted too

epost_list_deleted

Trash, with days remaining before permanent removal

epost_restore_letter

letter_id

Restore a deleted letter to the inbox

epost_delete_letter

letter_id, confirm: true

⚠️ Moves a letter to the trash. Gated behind confirm; to file something away use epost_store_letter instead

epost_download_thumbnail

letter_id, output_path

Thumbnail image — eyeball a document without fetching the PDF

epost_list_storage

{ folders[], companyFolders[] } — your Custom folders kept apart from the branded ones the service maintains, which the move sheet will never accept as a destination. Over the API a folder carries its id; the browser fallback adds myDocuments and url

epost_list_storage_documents

folder_id, limit (API only); scroll_all (browser)

{ transport, count, documents[] }. storedIn is the folders a document is in, null when it is in none, and absent when membership could not be established — three different answers. scroll_all:true lazy-loads every card on the browser path

epost_read_storage_document

exactly one of index, title, letter_id (API only); folder_id (API only) scopes the lookup; limit (API only); output_dir (optional)

Opens one Storage document: real sender/subject, document type, date, amount, folder — and saves the PDF when output_dir is given. The only way to classify an archived document, since the card list only ever says "Gescannter Brief". Over the API the document is resolved against at most limit of Storage (default 1000), and a lookup that misses says whether that window came back full rather than calling the document missing. Over the portal it is { status: "refused" } when the viewer never opened, rather than a metadata scan of the page behind it.

epost_create_folder

name (string)

{ created } — or { status: "refused", reason } for a name the portal will not take, which it signals by leaving the dialog open with its complaint in it

epost_move_to_folder

folder (required); index or title; remove_from (optional)

Files a Storage document into a folder. remove_from unticks the old folder in the same sheet — the only way to empty one. { status: "refused" } when the sheet is still standing once the portal has had its say

epost_unfile_from_folder

folder (required); index or title

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-container also 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

EPOST_TRANSPORT

auto

auto | api | browser. A pin is enforced both ways: pinned to api, a browser-only tool is refused rather than quietly redirected

EPOST_API_PASSWORD

keychain epost-mcp-api-password

Password for the password grant. Secret.

EPOST_API_KEY

keychain epost-mcp-api-key

Sent as X-API-KEY, instead of or alongside the password. Secret.

EPOST_SWISSID_USER

keychain epost-mcp-swissid-user

Account e-mail: the API username, and what the login fills in

EPOST_BROWSER

first signed system browser found

chrome | chrome-canary | edge | brave | chromium | absolute path. EPOST_CHROMIUM is accepted as the older name for it

EPOST_STATE

~/.epost-mcp/state.json

Cached session (storageState). Secret, written 0600

EPOST_PROFILE

~/.epost-mcp/profile

Persistent browser profile. It holds the same session in Chromium's own store, so it is just as secret; created 0700

EPOST_API_BASE

https://api.epost.ch

API host — overridable for tests

EPOST_APP_URL

https://app.epost.ch

Portal base — overridable for tests

EPOST_DEBUG

unset

1 traces the login steps on stderr

EPOST_WAIT_SCALE

1

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 (0, 1] is read as a typo and ignored, and no scaled pause goes below 25 ms, because a pause of nothing is a yield rather than a pause. Meant for the test suite, which drives a local DOM fixture that has nothing to repaint

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). Run epost_login and complete SwissID; the session is re-cached. If it keeps happening immediately, delete ~/.epost-mcp/state.json and log in fresh.

  • epost_login window never appears. epost_login is 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 set EPOST_CHROMIUM to 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-run epost_list_letters first 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)

  1. chromium.launchPersistentContext(EPOST_PROFILE, …) with acceptDownloads: true and locale: 'de-CH', and the cookies from state.json are 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, while state.json keeps the session cookies, which a persistent profile drops when the browser closes. Running on storageState alone is what made every expiry cost the full two-factor dance again.

  2. Navigating to app.epost.ch follows the KLARA/SwissID SSO redirect chain onto the dashboard (or a visible login form if the session died).

  3. The letterbox is opened by clicking the Digital Letterbox label (URL then contains DigitalLetterboxOverview).

  4. Letters are div.letter-wrapper elements. 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-tags

The 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-mcp

Provenance 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 changed

Runs 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 tools
epost_create_folderC

Create a new custom folder in the ePost Storage area.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYes
letter_idYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
output_dirYes

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexNo
letter_idNoinstead of index; needs the public API
output_dirYes

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
letter_idYes
output_pathYes

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
letter_idYes

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines1/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNohow many to fetch over the API (default 200)

TDQS

A3.6/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
folder_idNolimit to one folder (API only)
scroll_allNobrowser fallback: load every card first

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
wait_secondsNohow long to keep the window open (default 300, minimum 30 — a SwissID redirect chain takes longer than that on its own)

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexNo
titleNo
folderYes
remove_fromNofolder to drop in the same step (re-file)

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexNo
titleNo
folder_idNo
letter_idNo
output_dirNosave the PDF here as well

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
letter_idYes

TDQS

C2.7/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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_set_read_statusC

Mark letters READ or UNREAD by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYes
letter_idsYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexNo
titleNo
folderYesexisting Storage folder to file it into
letter_idNoAPI letter id (preferred — indices shift)

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexNo
titleNo
folderYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

  1. 21 tool updatesv0.11.0
    • First observedepost_create_folder
    • First observedepost_delete_letter
    • First observedepost_download_all
    • First observedepost_download_letter
    • First observedepost_download_thumbnail
    • First observedepost_get_letter
    • First observedepost_list_deleted
    • First observedepost_list_letters
    • First observedepost_list_storage
    • First observedepost_list_storage_documents
    • First observedepost_login
    • First observedepost_move_to_folder
    • First observedepost_read_storage_document
    • First observedepost_restore_letter
    • First observedepost_search
    • First observedepost_set_read_status
    • First observedepost_settings
    • First observedepost_status
    • First observedepost_store_letter
    • First observedepost_unfile_from_folder
    • First observedepost_unread_count

TDQS

A3.7/5.0

Scored across 21 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables browsing, retrieving, and downloading meeting recordings and transcripts from Grain via browser automation, bypassing the need for enterprise API access.
    2
    Apache 2.0
  • A
    license
    A
    quality
    C
    maintenance
    MCP 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.
    21
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Exposes Gmail inbox actions (list, archive, label) as MCP tools via a browser extension and local bridge, without requiring the Gmail API or OAuth.
    89 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables 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.
    7
    1
    MIT