Skip to main content
Glama
Gastaan

Swiss Grounding MCP

by Gastaan

Swiss Grounding MCP

An MCP server that gives AI assistants authoritative, cited, jurisdiction-correct answers about Switzerland — from federal, cantonal and municipal sources, in German, French, Italian, Romansh and English. Built for the Swisscom Swiss Grounding MCP challenge (Swiss AI Weeks, Zurich 2026).

  • No API keys, no accounts. Everything is public Swiss open data or official web pages.

  • 13 read-only tools, one response contract, citations on every result.

  • Honest by design: asks back only for missing essentials (e.g. the municipality), says clearly when something is not covered or not in Switzerland, never fills gaps from memory.

  • Runs locally over stdio or as a Streamable HTTP service (/mcp, /health).

Quick start

Requires uv (it installs Python 3.13 automatically).

git clone https://github.com/Gastaan/swiss-grounding-mcp && cd swiss-grounding-mcp
uv sync                                                  # installs dependencies
uv run swiss-grounding-mcp                               # stdio (for local MCP clients)
uv run swiss-grounding-mcp --transport http --port 8000  # HTTP: http://localhost:8000/mcp
curl localhost:8000/health

The prebuilt data (municipality register, health premiums, search index) ships in the repository; the first start unpacks the index (~1 s). Nothing else to download or configure.

Docker:

docker build -t swiss-grounding-mcp .
docker run -p 8000:8000 swiss-grounding-mcp               # http://localhost:8000/mcp

Related MCP server: mcp-i14y

Connect an MCP client

Use absolute paths. Replace /path/to/swiss-grounding-mcp with your clone.

OpenCode (opencode.json):

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "swiss": {"type": "local", "command": ["uv", "run", "--directory", "/path/to/swiss-grounding-mcp", "swiss-grounding-mcp"], "enabled": true},
    "swiss-http": {"type": "remote", "url": "http://localhost:8000/mcp", "enabled": false}
  }
}

Claude Code:

claude mcp add swiss -- uv run --directory /path/to/swiss-grounding-mcp swiss-grounding-mcp
claude mcp add --transport http swiss-http http://localhost:8000/mcp

Claude Desktop (claude_desktop_config.json; give the full path to uv, e.g. from which uv):

{"mcpServers": {"swiss": {"command": "/full/path/to/uv", "args": ["run", "--directory", "/path/to/swiss-grounding-mcp", "swiss-grounding-mcp"]}}}

VS Code (.vscode/mcp.json):

{"servers": {"swiss": {"type": "stdio", "command": "uv", "args": ["run", "--directory", "/path/to/swiss-grounding-mcp", "swiss-grounding-mcp"]}}}

Cursor (.cursor/mcp.json):

{"mcpServers": {"swiss": {"command": "uv", "args": ["run", "--directory", "/path/to/swiss-grounding-mcp", "swiss-grounding-mcp"]}}}

Any client that speaks MCP over stdio or Streamable HTTP works. Tested with Claude Code, OpenCode, the MCP Inspector CLI and the FastMCP client, including the legacy initialize handshake (protocol 2025-06-18) and the stateless 2026-07-28 protocol. The server sends usage instructions.

Coverage (declared scope)

Topic

Geography

Source (authority)

Freshness / reference period

Procedures, rules, fees, deadlines — permits & migration, moving & registration, taxes, social insurance (AHV/IV), unemployment, driving licences & vehicles, customs & parcels, schools, housing, voting, civil status…

Federal (ch.ch in de/fr/it/rm/en, federal offices, AHV/IV, arbeit.swiss), cantonal portals of 23 cantons (see limitations), 12 largest cities

Full-text index of 10,630 official pages / 46,952 passages, plus live reading of any official page

Index built 2026-09-25, refreshed weekly; read_official_page fetches live text

Federal law — any act and article, current consolidated version

Federal

Fedlex (Federal Chancellery)

Live; version in force today

Mandatory health insurance premiums (cheapest offers per municipality, age, deductible, model)

All 2,110 municipalities (premium regions)

FOPH premium open data (same data as priminfo.admin.ch)

2026 premiums; 2027 added when FOPH publishes them (end of September)

School holidays and public holidays

All 26 cantons; municipality level where published (e.g. Scuol, Zürich)

OpenHolidays (aggregated official lists), EDK list, municipality website

2025–2027

Waste collection dates

City of Zürich (by postcode), Basel/Riehen/Bettingen (by address), St. Gallen (by street); by collection zone: Winterthur, Uster, Wetzikon, Dübendorf, Horgen, Wädenswil, Adliswil, Thalwil and 13 more

Municipal open data (ERZ Zürich via OpenERZ, data.bs.ch, daten.stadt.sg.ch)

Live, next 120 days

Public transport connections and departure boards

All of Switzerland

Official timetable (opentransportdata.swiss via transport.opendata.ch)

Live

Federal popular votes — upcoming subjects, results (national + canton)

Federal

FSO vote-day open data, Federal Chancellery

Live

Mortgage reference interest rate (rents); SNB exchange rates

Federal

BWO; Swiss National Bank

Live (cached 6 h)

Company registration — UID, legal seat, commercial register and VAT status

All of Switzerland

Federal UID register (FSO)

Live

Place facts — municipality, canton, BFS number, postcodes, population, official website

All 2,110 municipalities, 26 cantons

BFS register & STATPOP, swisstopo, Wikidata (websites)

Population 2025; register 2026-09-25

Current weather measurements

Nearest MeteoSwiss automatic station

MeteoSwiss open data

Live (10-minute values)

Not covered / limitations

  • Anything outside Switzerland — e.g. the German Rundfunkbeitrag in Konstanz. The server says so.

  • Cantons GR, BL and SH block or do not serve text to automated clients, so their cantonal pages are not in the index (ch.ch and federal pages still apply; read_official_page reports the block honestly). VS and TI are only partially indexed.

  • Municipal web pages are indexed only for the 12 largest cities; for other municipalities the server returns the official website and can read a given page live.

  • Cantonal law texts, individual tax calculations and weather forecasts are not provided.

  • Waste calendars exist only where municipalities publish open data (list above); elsewhere the server says so and links the municipality.

  • School holidays come from OpenHolidays, which aggregates official lists; the official EDK list and the municipality site are cited alongside for verification.

  • Search is keyword-based (SQLite FTS5/BM25 over all national languages); it works best with the key nouns of the question, in any national language.

Tools

Tool

Use it for

search_official_info

"How do I…", rules, deadlines, fees — verbatim excerpts from official pages, filtered to federal + the given canton/municipality

read_official_page

Live text of an official page (allowlisted Swiss government domains only), focused on given words

swiss_federal_law

Federal law articles (SR number or abbreviation such as OR/CO, ZGB, SVG, AIG)

health_insurance_premiums

Cheapest KVG/LAMal premiums

swiss_holidays

School or public holidays

waste_collection

Next collection dates by waste type

public_transport

Connections and departures

federal_votes

Next vote subjects or results

swiss_rates

Reference interest rate, SNB exchange rates

company_register

Company lookup by name or UID

swiss_place_info

Municipality facts, population, website

current_weather

Latest MeteoSwiss measurements

swiss_coverage

The scope above, for the assistant

Response contract

Every tool returns the same JSON object (as structuredContent with an outputSchema, and as text):

{
  "status": "ok | needs_context | not_covered | not_found | source_error",
  "summary": "One factual sentence, ending with 'Source: <publisher> – <url>'",
  "data": {"...": "tool-specific facts"},
  "citations": [{"title": "", "url": "", "publisher": "", "level": "federal|cantonal|municipal|semi-official|community",
                 "jurisdiction": "CH | CH-VD | CH-VD-5586", "retrieved_at": "", "valid_for": "", "excerpt": "verbatim"}],
  "missing_context": [{"field": "municipality", "question": "…", "options": ["Buchs (ZH)", "Buchs (SG)"]}],
  "guidance": "what the assistant should do next"
}
  • needs_context — ask the user exactly summary (e.g. which municipality; which of three Buchs).

  • not_covered — outside Switzerland or outside the declared scope; the assistant should say so.

  • not_found / source_error — nothing found / source unreachable; never answer from memory.

  • Places can be given as the user wrote them: Genf, Ginevra, Genève, Schuls → Scuol, 8003, Zurich 8003, Bahnhofstrasse 1, Zürich. Ambiguous names return options; foreign places are flagged.

  • Invalid arguments are returned with isError: true and a readable message.

Configuration

Variable

Default

Meaning

SGM_RESPECT_ROBOTS

true

Respect robots.txt of every website fetched (RFC 9309, via Protego). Set false to disable.

SGM_RESPECT_TERMS

true

Only use sources whose terms allow automated access (e.g. zefix.ch's web backend is not used; the official UID web service is).

SGM_OFFLINE

false

Serve from cache only, never hit the network.

SGM_CACHE_DIR

~/.cache/swiss-grounding-mcp

HTTP response cache.

SGM_HTTP_TIMEOUT

15

Seconds per upstream request.

SGM_MIN_INTERVAL

0.5

Minimum seconds between requests to the same host.

SGM_USER_AGENT

browser-compatible string identifying SwissGroundingMCP/<version> (+repo URL)

Sent with every request.

SGM_TRANSPORT, HOST, PORT

stdio, 0.0.0.0, 8000

Same as --transport/--host/--port.

SGM_LOG_LEVEL

INFO

Logs go to stderr: one line per tool call (tool, status, bytes, ms) and per upstream fetch.

No credentials are required.

Source etiquette, caching, resilience

  • robots.txt is checked per host and cached for 24 h; an unreachable robots.txt (5xx) means "disallow". Documented APIs (geo.admin.ch, Fedlex SPARQL, SNB, OpenHolidays, transport.opendata.ch, open-data portals) are called as APIs; website pages always go through the robots check.

  • Requests to the same host are paced (SGM_MIN_INTERVAL), identify the project in the User-Agent, and are cached on disk with per-source TTLs (timetables 1 min, votes 10 min, rates 6 h, pages 6–24 h, law 7 days). Expired entries are never served except in SGM_OFFLINE mode.

  • Upstream failures become status: "source_error" with the official link; no stack traces reach the model.

  • read_official_page only accepts recognised Swiss government domains (admin.ch, ch.ch, 26 cantons, 2,100+ municipal websites, bodies with a legal mandate), which also prevents SSRF.

Data and refresh

File (in src/swiss_grounding_mcp/data/)

Built by

Contents

places.json

scripts/build_places.py

2,110 municipalities: BFS number, canton, district, premium region, postcodes, localities, population, website, holiday region

premiums_<year>.csv.gz, premium_meta_<year>.json

scripts/build_premiums.py 2026 2027

Official FOPH premium table, insurer and plan names, municipality restrictions

index.sqlite.gz

scripts/build_index.py

FTS5 index of official pages (robots.txt respected, per-host pacing)

uv run --group build python scripts/build_places.py
uv run --group build python scripts/build_premiums.py 2026 2027
uv run --group build python scripts/build_index.py      # ~20 min cold, a few minutes when cached

.github/workflows/refresh-data.yml rebuilds everything weekly and opens a pull request.

Architecture

MCP client ──stdio / Streamable HTTP──▶ server.py (FastMCP, 13 tools, one ToolResult contract)
                                          │
      places.py (register, exonyms, postcodes, geocoding) · authorities.py (domain → level/jurisdiction)
                                          │
  sources/  search (FTS5 index + live pages) · fedlex · premiums · holidays · waste · transport
            votes · economy · companies · weather
                                          │
                  http.py: robots.txt · per-host pacing · disk cache with TTL

Python 3.13, fastmcp 4 (on the official mcp 2.x SDK), httpx, protego, trafilatura, SQLite FTS5. Adding a source = one module in sources/ returning ToolResult, plus one decorated function in server.py.

Testing

uv run pytest -q              # offline: MCP contract, place resolution, premiums, honesty rules
uv run pytest -q -m live      # live checks against every real source
uv run ruff check src scripts tests
npx -y -p node@22 -p @modelcontextprotocol/inspector -- mcp-inspector --cli http://127.0.0.1:8000/mcp -- --method tools/list

End-to-end with real MCP clients and LLMs (mirrors the evaluation: 2 clients × 2 LLMs):

OPENAI_API_KEY=... uv run python scripts/e2e_eval.py    # Claude Code (sonnet, haiku) + OpenCode (gpt-5.4-mini, gpt-4.1-mini)

It runs eval/questions.json — the 5 published sample questions plus 11 more (de/fr/it/rm/en, including ask-back, out-of-scope and not-covered cases) — and writes eval/results/<date>.md.

Latest end-to-end results (2026-09-25, eval/results/2026-09-25T0159.md)

Client + LLM

Pass (content + citation)

Content correct

Published samples

Avg tool calls

Avg seconds

Claude Code + Sonnet

14/16

14/16

5/5

1.2

12

Claude Code + Haiku

14/16

15/16

5/5

0.9

11

OpenCode + gpt-5.4-mini

13/16

15/16

4/5

1.4

9

OpenCode + gpt-4.1-mini

13/16

14/16

5/5

1.0

7

Remaining misses, honestly reported: some answers are correct but name the source without the URL (Q8, one S3 run); two answers to the parcel-VAT question (Q12) reach the right conclusion with the travellers' allowance instead of the CHF 5 parcel rule; and a general non-Swiss question (Q15, "capital of Australia") is answered from model knowledge without calling any tool — a server cannot intercept questions it is never asked (the published non-Swiss sample S5, Konstanz, passes in all four).

License

Code: MIT. Data retrieved from the sources remains under their terms (Swiss open government data, mostly "open use, must provide the source"); every answer carries its source.

Available Tools

13 tools
company_registerCompany register (UID)A
Read-onlyIdempotent

Check whether a company is registered: UID, legal seat, commercial register and VAT status, from the federal UID register.

ParametersJSON Schema
NameRequiredDescriptionDefault
name_or_uidYesCompany name or UID (CHE-123.456.789).

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
statusYes
summaryYes
guidanceNo
citationsNo
missing_contextNo

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful context about the data source and returned fields, but does not disclose additional behavioral details such as error cases or whether the result is a simple boolean or full record. This is adequate but not exceptional.

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?

A single, front-loaded sentence communicates the action, the resource, the specific data fields, and the authoritative source. There is no filler or redundant phrasing.

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 one-parameter, read-only, idempotent lookup tool with a high-coverage schema and an output schema present, the description conveys all needed selection and invocation information. The source is named, and annotations cover safety and behavior, leaving no critical gap.

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%, and the parameter description already explains that name_or_uid accepts a company name or UID format. The tool description adds little beyond echoing 'UID' and the general purpose, so it does not significantly enhance what the schema already provides. 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 states a specific verb ('check'), a resource ('whether a company is registered'), and the exact data points returned (UID, legal seat, commercial register, VAT status). It clearly singles out the federal UID register, making it easy to distinguish from sibling tools like search_official_info or swiss_place_info.

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 scope is clear: this tool is specifically for checking Swiss company registration via the federal UID register. Although it does not explicitly name excluded alternatives, the domain is narrow and distinct from the other Swiss information tools, so an agent can infer when it should be selected.

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

current_weatherCurrent weather (MeteoSwiss)A
Read-onlyIdempotent

Latest measured weather (temperature, humidity, precipitation, wind) at the MeteoSwiss station nearest to a Swiss municipality. Measurements only, no forecasts.

ParametersJSON Schema
NameRequiredDescriptionDefault
placeNoMunicipality, postcode, address or canton as the user said it, in any language (e.g. 'Lugano', '8003', 'Genf', 'Bahnhofstrasse 1, Zürich').
languageNoLanguage of the user's question.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
statusYes
summaryYes
guidanceNo
citationsNo
missing_contextNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds that it returns measured data only (no forecasts) and clarifies the source (MeteoSwiss station) and the selection criterion (nearest to a Swiss municipality). This adds context beyond annotations without contradicting them.

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?

A single, information-dense sentence that front-loads the core purpose and immediately clarifies the scope and limitation. No wasted words, and the structure is 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?

The tool has an output schema, so return format is covered. The description explains what data it returns, where it comes from, and what it doesn't do. With annotations handling safety and the schema handling parameters, nothing essential is missing for an agent to use it correctly.

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?

The input schema has 100% description coverage for both parameters, including examples for 'place' and an enum with default for 'language'. The description adds no additional parameter-specific meaning, which is acceptable since the schema already fully documents them. 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 latest measured weather (temperature, humidity, precipitation, wind) at the MeteoSwiss station nearest to a Swiss municipality. It also explicitly notes 'Measurements only, no forecasts,' which sharply distinguishes it from any forecast tool. No sibling covers weather, so this is unambiguous.

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?

The description provides a clear context: for current measured weather at a Swiss location. It explicitly excludes forecasts ('Measurements only, no forecasts'), which tells the agent when not to use this tool. While it doesn't name an alternative, none exists among siblings, so the guidance is sufficient.

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

federal_votesFederal votesA
Read-onlyIdempotent

Subjects of the next federal popular vote, or official results of a past vote.

ParametersJSON Schema
NameRequiredDescriptionDefault
placeNoCanton to add its result, optional.
languageNoLanguage of the user's question.de
vote_dateNoISO date of a vote; omit for the next vote (or the latest if none is scheduled).

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
statusYes
summaryYes
guidanceNo
citationsNo
missing_contextNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds the dual-mode behavior (subjects for next vote vs. results for past vote), which is not in annotations. It does not disclose any other behavioral traits like data freshness or error handling, but given the strong annotation coverage, this is adequate.

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, well-structured sentence that front-loads the two primary outcomes. There is no filler or repetition; every word contributes to the purpose.

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?

With a complete schema (100% param descriptions), an output schema, and strong annotations, the description adequately covers the tool's purpose. It mentions the key distinction between future subjects and past results, which is the main contextual nuance. It does not need to detail return structure since an output schema exists.

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?

The schema provides full descriptions for all three parameters (place, language, vote_date) with 100% coverage. The description does not add any additional parameter semantics beyond what the schema already conveys, so a baseline of 3 is appropriate.

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 states the tool's core function: returning subjects of the next federal popular vote or official results of a past vote. It clearly identifies the resource (federal votes) and the two operational modes. It does not explicitly distinguish from siblings, but the sibling list (transport, weather, law) makes the purpose distinct enough.

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 implies when to use the tool: when a user asks about federal vote subjects or results. However, it does not explicitly mention alternatives or exclusions, such as 'use search_official_info for other federal topics'. The usage context is clear from the description but not formally stated.

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

health_insurance_premiumsHealth insurance premiums (KVG/LAMal)A
Read-onlyIdempotent

Cheapest mandatory basic health insurance premiums (Grundversicherung, assurance de base, assicurazione di base — every plan here is basic insurance) for a municipality, age and deductible, from the official FOPH premium data (same data as priminfo.admin.ch).

ParametersJSON Schema
NameRequiredDescriptionDefault
ageNoAge of the insured person.
yearNoPremium year; default current year.
placeNoMunicipality, postcode, address or canton as the user said it, in any language (e.g. 'Lugano', '8003', 'Genf', 'Bahnhofstrasse 1, Zürich').
franchiseNoDeductible in CHF (adults 300-2500, children 0-600). Omit to get the cheapest offer for every deductible.
accident_coverNoInclude accident cover (default no: employees are insured by their employer).
insurance_modelNoOnly if the user explicitly asks for one insurance model. Leave empty to compare all models (the cheapest is usually an alternative model).

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
statusYes
summaryYes
guidanceNo
citationsNo
missing_contextNo

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds meaningful context beyond these: it names the official FOPH data source, says it matches priminfo.admin.ch, and stresses that every plan is basic insurance, preventing confusion with supplementary coverage. No contradiction with annotations.

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 that front-loads the core purpose and includes useful clarifications (language synonyms, basic-insurance-only scope, official source). It is slightly dense with parentheticals but every element earns its place with no filler.

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?

With a full output schema, complete parameter descriptions, and safety annotations, the tool definition is largely self-sufficient. The description adds the data source and scope boundary. Minor details like data freshness or result-count behavior are not addressed, but they are not critical given the existing structured information.

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 100%, so the parameters are fully documented in structured form. The description restates the key filters (municipality, age, deductible) but adds no constraints or format details beyond what the schema already provides. A 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 identifies the resource: the cheapest mandatory basic health insurance premiums, scoped by municipality, age, and deductible, from official FOPH data. Though the verb is implicit, the action and domain are unambiguous and clearly distinct from the other Swiss-related tools in the sibling list.

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

Usage Guidelines3/5

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

The description states what the tool returns and clarifies that only basic insurance is included, which implies when to use it. However, it does not explicitly contrast it with sibling tools such as swiss_rates or search_official_info, nor does it state when not to use it. Usage guidance is implied rather than explicit.

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

public_transportPublic transport timetableA
Read-onlyIdempotent

Swiss public transport connections or next departures (official timetable data).

ParametersJSON Schema
NameRequiredDescriptionDefault
whenNoISO date-time (Europe/Zurich), e.g. 2026-10-01T08:30; default now.
limitNo
originNoDeparture station or place, e.g. 'Zürich HB'.
arrivalNoInterpret `when` as arrival time.
destinationNoDestination; omit for a departure board.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
statusYes
summaryYes
guidanceNo
citationsNo
missing_contextNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare read-only, non-destructive, idempotent behavior, so the description only needs to add value beyond those hints. It adds that the data is 'official timetable data' and that the tool supports two modes, which is useful context about the result nature. No contradiction with annotations.

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?

One sentence with no filler; the geographic scope, data source, and dual modes are front-loaded. It is as concise as possible while giving the essential purpose.

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?

For a read-only query tool with an output schema and well-documented optional parameters, the description is nearly complete: it names the domain, scope, and modes. A small gap is not explicitly instructing when to use 'connections' vs 'next departures', but the schema's destination parameter covers this.

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 80%, so the schema carries most parameter documentation; the description does not repeat or add parameter-level detail. The one undocumented parameter (limit) is adequately constrained by min/max/default in the schema, so this is acceptable.

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 names a specific resource ('Swiss public transport') and the two main operations ('connections or next departures'), making the tool's purpose immediately recognizable. It lacks an explicit verb such as 'search' or 'get' and does not explicitly contrast with sibling tools, but no other sibling covers public transport.

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 implies when to use the tool: whenever a user needs Swiss public transport connections or a departure board. It does not state exclusions or compare with alternatives such as swiss_place_info or swiss_coverage, so usage guidance is inferred rather than explicit.

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

read_official_pageRead an official pageA
Read-onlyIdempotent

Fetch the current text of an official Swiss page (live, respecting robots.txt) and return the passages around focus. Only official Swiss domains are allowed.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesURL on an official Swiss domain (admin.ch, ch.ch, a cantonal or municipal site), typically from search_official_info.
focusNoWords to focus on, e.g. 'délai 12 mois'.
max_charsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
statusYes
summaryYes
guidanceNo
citationsNo
missing_contextNo

TDQS

A4/5.0
Behavior4/5

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

The description adds meaningful behavioral context beyond the annotations: it mentions the tool is 'live, respecting robots.txt', which is not covered by readOnlyHint or idempotentHint. It also clarifies the output behavior (passages around focus). While it doesn't discuss rate limits or error handling, the annotations already cover safety, and the added details are useful. No contradiction with annotations.

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, with the primary action and restriction front-loaded. Every phrase serves a purpose: it states the action, the live/robots.txt behavior, the focus-passage output, and the domain restriction. No fluff or 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 that an output schema exists, the description does not need to detail return values. It covers the tool's purpose, the key behavioral nuance (robots.txt), and the focus mechanism. The only minor gap is the lack of explicit guidance on error cases or what happens when the URL is not on an official domain, but these are not critical for an agent to call the tool correctly.

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 67% (url and focus have descriptions, max_chars does not). The description adds value for the 'focus' parameter by explaining it is used to return surrounding passages, which complements the schema's example. However, it does not explain 'max_chars' or its constraints, and the description does not fully compensate for the missing schema description on that parameter.

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 'Fetch', the resource 'official Swiss page', and the specific behavior of returning passages around a focus word. It also imposes a domain restriction, which distinguishes it from generic web-fetch tools and sibling tools like search_official_info. The purpose is unmistakable.

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 does not explicitly state when to use this tool versus alternatives, nor does it name any sibling tool. It implies usage for reading a specific official page (since it says 'typically from search_official_info' in the parameter schema, but not in the main description). The guidance is implicit, relying on the agent to infer that this is for fetching a known URL rather than searching.

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

search_official_infoSearch official Swiss informationA
Read-onlyIdempotent

Full-text search over official Swiss web pages: ch.ch (all languages), federal offices, the 26 cantons and large cities. Use for procedures, rules, deadlines, fees and "how do I…" questions (permits, moving, taxes, social insurance, driving licences, customs, schools, housing, voting). Give place to restrict results to federal + that canton/municipality. Returns verbatim excerpts with URLs.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
placeNoMunicipality, postcode, address or canton as the user said it, in any language (e.g. 'Lugano', '8003', 'Genf', 'Bahnhofstrasse 1, Zürich').
queryYesKey words of the question, ideally in the language of the source (e.g. 'permis de conduire étranger échanger').
languageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
statusYes
summaryYes
guidanceNo
citationsNo
missing_contextNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover readOnly/idempotent/destructive safety, and the description adds substantive behavioral context: it scopes place-based filtering ('federal + that canton/municipality') and reveals the output shape ('Returns verbatim excerpts with URLs'). This goes beyond what annotations and schema alone convey.

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 compact, front-loaded with the core purpose, and each sentence adds useful detail (scope, use cases, place behavior, output format). No 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?

With an output schema present and rich annotations, the description covers the main operational points: scope, use cases, place filtering, and output format. It omits details like pagination and rate limits, but for a read-only search tool with output schema, this is near-complete. It could still benefit from an explicit pointer to sibling tools (e.g., swiss_federal_law) for law-specific queries.

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 only 50%, so the description should help clarify parameters. It adds meaning for `place` by explaining its filtering effect. It does not mention `limit` or `language` behavior, and the schema already documents `query`, `place`, and `language`. The description's extra value is moderate.

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 states a specific verb ('Full-text search') and a precise resource ('official Swiss web pages: ch.ch, federal offices, the 26 cantons and large cities'), making the tool's purpose immediately clear. It does not explicitly name sibling tools to distinguish from, so it stops short of a 5.

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 explicitly says 'Use for procedures, rules, deadlines, fees and "how do I…" questions' and lists concrete example topics. This gives clear context for when the tool is appropriate, though it does not state when not to use it or name alternatives.

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

swiss_coverageWhat this server coversA
Read-onlyIdempotent

List the topics, geography, sources and freshness this server covers, and what it does not. Call this only when unsure whether a question is in scope.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
statusYes
summaryYes
guidanceNo
citationsNo
missing_contextNo

TDQS

A4.7/5.0
Behavior4/5

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

The annotations already convey read-only, idempotent, and open-world behavior, so the description's burden is low. It adds value by specifying which coverage dimensions the tool reports and explicitly mentioning that it also states what is not covered, which helps set expectations about the response.

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 short sentences carry the full meaning: the first states what the tool lists, the second states precisely when to call it. There is no filler, and the key scoping guidance is front-loaded.

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 parameterless coverage tool with rich annotations and an output schema, the description is complete. It tells the agent what to expect from the tool and when to use it, leaving no meaningful gap for selection or invocation.

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 zero parameters, so the description cannot add parameter-level meaning. The baseline for parameterless tools is 4, and the description correctly focuses on what information the tool returns instead of inputs.

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 names a specific verb ('List') and a concrete resource: the server's coverage across topics, geography, sources, and freshness. It also explicitly states what the tool does not cover, which clearly differentiates it from the domain-specific sibling tools.

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?

The description gives an explicit condition for use: 'Call this only when unsure whether a question is in scope.' This tells the agent exactly when to invoke this meta-coverage tool and implies that confident, in-scope questions should go to the relevant sibling tools instead.

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

swiss_federal_lawSwiss federal law (Fedlex)A
Read-onlyIdempotent

Quote federal law from the official consolidated text on Fedlex (version currently in force), with article links. Federal law only; cantonal law is not included.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoTitle words to find an act, or (with sr_number) a topic to find the relevant articles, e.g. 'Kündigungsfrist'.
articleNoArticle number, e.g. '335c', '42'.
languageNoLanguage of the user's question.de
sr_numberNoSR number or abbreviation: '220' or 'OR'/'CO', 'ZGB'/'CC', 'SVG', 'VZV', 'AIG', 'KVG', 'AHVG', 'MWSTG'…

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
statusYes
summaryYes
guidanceNo
citationsNo
missing_contextNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the tool's safety profile is clear. The description adds valuable behavioral context beyond annotations by specifying the source is the official consolidated text, that it is the version currently in force, and that article links will be included.

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 carry substantial, non-redundant information: source, version, output feature, and scope limitation. Nothing is wasted, and the key purpose is front-loaded.

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 full input schema, the presence of an output schema, and the annotation set, the description covers the essential context: what source is used, which version, and what the output includes. It is not exhaustive about edge cases or parameter combinations, but the structured fields already handle those, so the description is complete enough for an agent to invoke the tool correctly.

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 100%, so the baseline is 3 even though the tool description adds no detailed parameter semantics. The description's mention of 'article links' and 'federal law' loosely maps to the article and sr_number/query parameters, but it does not materially enrich the schema's parameter explanations.

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 operation ('Quote federal law'), the specific source ('official consolidated text on Fedlex'), the version ('currently in force'), and a distinctive output feature ('with article links'). It also distinguishes itself from broader legal or informational tools by explicitly limiting scope to federal law and excluding cantonal law.

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 provides clear context for when to use the tool: quoting federal law from Fedlex. The 'Federal law only; cantonal law is not included' statement gives an explicit when-not-to-use boundary. It does not name alternative sibling tools, so it falls short of a 5, but the usage scope is more than merely implied.

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

swiss_holidaysSchool and public holidaysB
Read-onlyIdempotent

School holidays by canton or municipality, or public holidays, for a year.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoSchool holidays or public holidays.school
yearNoCalendar year; default current year.
placeNoMunicipality, postcode, address or canton as the user said it, in any language (e.g. 'Lugano', '8003', 'Genf', 'Bahnhofstrasse 1, Zürich').
languageNoLanguage of the user's question.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
statusYes
summaryYes
guidanceNo
citationsNo
missing_contextNo

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds no behavioral details beyond the schema, such as data coverage limitations or how conflicts between place and year are resolved. No contradiction with annotations exists.

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, compact sentence that front-loads the core resource and its main scoping dimensions. Every word earns its place, and there is no redundant restating of the title or parameter names.

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?

For a read-only query tool with a rich output schema and complete parameter documentation, the description is sufficient for selection and invocation. A minor gap is that it does not clarify whether 'place' only applies to school holidays or also to public holidays, but this is not critical given the schema context.

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?

The schema covers 100% of parameters with detailed descriptions, so the baseline is 3. The description adds only a slight mapping by saying 'canton or municipality' for place and 'public holidays' for kind, which is already reflected in the schema text. No new semantic meaning is added.

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 states the resource (school/public holidays) and the key scoping dimensions (place, year), which clearly distinguishes it from all sibling tools. It lacks an explicit verb like 'get' or 'list', but the intent is unmistakable and the title reinforces the subject.

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?

There is no explicit guidance on when to use this tool versus alternatives, or any exclusions. The use case is implied by the name and description, but the description does not state 'use this when the user asks for holidays' or mention any sibling it replaces or complements.

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

swiss_place_infoSwiss place factsA
Read-onlyIdempotent

Resolve a Swiss place to its official municipality: BFS number, canton, district, postcodes, permanent resident population (latest BFS figure) and official website. Use for "how many people live in X", "which canton is X in", or to find a municipality's website.

ParametersJSON Schema
NameRequiredDescriptionDefault
placeNoMunicipality, postcode, address or canton as the user said it, in any language (e.g. 'Lugano', '8003', 'Genf', 'Bahnhofstrasse 1, Zürich').

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
statusYes
summaryYes
guidanceNo
citationsNo
missing_contextNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safe read-only nature is covered. The description adds useful behavioral context: it returns the 'latest BFS figure' and resolves to 'official municipality' data, clarifying that results are standardized and current. It does not discuss edge cases like ambiguous place names, but the annotation coverage lowers the burden.

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 and every part earns its place: a clear capability statement, an explicit list of returned fields, and concrete example use cases. It is front-loaded with the core action and output list before the usage examples.

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 single-optional-parameter lookup tool with a rich parameter schema, an output schema, and safety annotations, the description covers what the tool does, what it returns, and when to invoke it. Nothing essential is missing for an agent to select and call it correctly.

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 100%, and the parameter's schema already explains accepted forms ('Lugano', '8003', 'Genf', 'Bahnhofstrasse 1, Zürich') and languages. The tool description adds no new parameter-level meaning beyond what the schema provides, so 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?

Description states a specific action ('Resolve a Swiss place to its official municipality') and a concrete resource, then enumerates the exact outputs: BFS number, canton, district, postcodes, population, and website. It also gives representative queries, making the tool's purpose unmistakable and distinguishing it from sibling tools like search_official_info.

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 explicitly lists trigger questions: 'how many people live in X', 'which canton is X in', and finding a municipality's website, which tells an agent when to use it. It does not explicitly state when not to use it or name alternatives, but the provided use cases are sufficient for a single-purpose lookup tool.

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

swiss_ratesReference interest rate and exchange ratesA
Read-onlyIdempotent

Current mortgage reference interest rate for rents (BWO) or SNB CHF exchange rates.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesMortgage reference rate for rents (BWO), or SNB exchange rate.
currencyNoFor exchange_rate: EUR, USD, GBP…
languageNoLanguage of the user's question.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
statusYes
summaryYes
guidanceNo
citationsNo
missing_contextNo

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds modest value by stating the data is current and sourced via BWO/SNB, but it does not describe pagination, units, or any time-dependence beyond the word 'Current'.

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?

A single front-loaded sentence that covers both data modes with no filler. Every word contributes to the agent's ability to choose the right kind.

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?

For a simple read-only lookup with a full output schema and complete parameter schema, this description is sufficient. The only minor gap is that 'BWO' is not expanded in the description itself, though the schema's kind description also uses the acronym.

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 100%, so the schema documents all three parameters. The description adds the BWO/SNB context but essentially restates what the kind parameter's description already contains, so it provides no significant extra parameter semantics.

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 identifies the tool as providing two specific data products: the current BWO mortgage reference rate and SNB CHF exchange rates. It lacks an explicit retrieval verb, but 'Current ... or ...' makes the query intent clear and the two modes are distinct.

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 clearly separates the two use cases (reference interest rate vs exchange rate), which tells an agent when to select this tool. It does not mention when not to use it, but none of the sibling tools covers this data domain, so exclusion guidance is less critical.

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

waste_collectionWaste collection datesA
Read-onlyIdempotent

Next waste collection dates (cardboard, paper, household waste, green waste…) from municipal open data. Needs the municipality; some cities also need postcode or street (the tool will say).

ParametersJSON Schema
NameRequiredDescriptionDefault
placeNoMunicipality, postcode, address or canton as the user said it, in any language (e.g. 'Lugano', '8003', 'Genf', 'Bahnhofstrasse 1, Zürich').
streetNoStreet (and number) if the user gave one.
from_dateNoISO date to start from; default today.
waste_typeNoe.g. Karton/carton/cartone, Papier, Kehricht, Grüngut, Metall. Omit for all types.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
statusYes
summaryYes
guidanceNo
citationsNo
missing_contextNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering safety. The description adds behavioral context beyond that: it mentions the tool may request additional input ('the tool will say') and specifies the data source ('municipal open data'), which is not in annotations. This is useful supplementary information.

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, compact sentence that front-loads the core function and then gives a concise usage note. Every word serves a purpose, 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?

Given the tool's simplicity (4 optional, well-documented parameters, output schema present, safety annotations), the description is complete. It covers what the tool returns, what input is needed, and how it handles missing information. No critical operational detail is missing.

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%, so the baseline is 3. The description adds value by clarifying that a municipality is effectively required ('Needs the municipality') and that additional parameters may be needed conditionally, which is not captured in the schema's optional flags. This supplements the parameter documentation meaningfully.

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 states a specific verb ('Next waste collection dates') and resource (municipal waste data), and lists example waste types. It clearly differentiates from sibling tools like public_transport or current_weather, which address entirely different domains.

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 says 'Needs the municipality' and notes that some cities need postcode or street, giving practical input requirements. It does not explicitly name alternatives or state when not to use it, but the tool name and sibling context make the intended use obvious. Slight gap in explicit exclusion guidance.

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. 13 tool updatesv0.1.0
    • First observedcompany_register
    • First observedcurrent_weather
    • First observedfederal_votes
    • First observedhealth_insurance_premiums
    • First observedpublic_transport
    • First observedread_official_page
    • First observedsearch_official_info
    • First observedswiss_coverage
    • First observedswiss_federal_law
    • First observedswiss_holidays
    • First observedswiss_place_info
    • First observedswiss_rates
    • First observedwaste_collection

TDQS

A4.1/5.0

Scored across 13 tools

Disambiguation5/5

Each tool addresses a clearly distinct domain (e.g., transport, legal texts, health premiums, weather, company registry). The only related pair is search_official_info and read_official_page, but one is for finding pages and the other for reading specific content, so no ambiguity.

Naming Consistency4/5

All tools use lowercase with underscores, but they mix prefixes ('swiss_' vs none) and verb/alNoun patterns (e.g., 'public_transport' vs 'search_official_info'). Still, the naming is readable and follows a consistent snake_case convention, so minor deviations do not cause confusion.

Tool Count5/5

With 13 tools, the server covers a broad range of Swiss official information without being excessive. Each tool serves a distinct purpose and fits the stated goal of Swiss grounding, making the count appropriate.

Completeness5/5

The server covers major Swiss information domains: transport, official search, laws, health insurance, holidays, waste, votes, rates, companies, and weather. It also includes a coverage tool to handle out-of-scope queries, mitigating potential gaps. The lifecycle is appropriate for a read-only grounding server.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Connects AI assistants to the Swiss I14Y Interoperability Platform, enabling natural language exploration of government datasets, APIs, codelists, and public services.
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    A production-minded Agentic RAG backend for informational guidance about Swiss immigration and administrative procedures, using only official Swiss government sources with evidence metadata.
    1
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides AI assistants with citable access to Bernese laws (BSG) and administrative court rulings (Verwaltungsgericht Bern) via search, retrieval by number, and article extraction.
    MIT