swiss-food-safety-mcp
This server connects AI models to official Swiss Federal Food Safety and Veterinary Office (BLV) open data via 11 read-only tools β no authentication required.
π¨ Food Recalls & Public Warnings β Fetch live BLV product recalls and health warnings from the RSS feed.
π Dataset Discovery β Browse all 28 BLV open datasets on opendata.swiss (CKAN API) and retrieve detailed metadata, resource URLs, formats, and licence info for specific datasets.
π Animal Disease Surveillance β Search notifiable animal disease cases since 1991, filterable by canton, disease name, and year range.
π Animal Health Statistics β Access annual animal health indicators across Switzerland.
π₯© Food Control Inspection Results β Review cantonal food inspection outcomes and violation rates by canton and year.
π Veterinary Antibiotic Usage β Analyse antibiotic consumption trends in animal medicine (ISABV data) by species and year.
π¦ Avian Influenza Monitoring β Access wild bird H5N1/HPAI surveillance data with geolocation, filterable by canton and year.
π§ Children's Nutrition Survey β Explore Swiss children's nutrient intake data (menuCH-Kids) by nutrient type and age group.
πΏ Pesticide Register β Search approved or revoked pesticide products and active ingredients in Switzerland.
π¬ Meat Inspection Statistics β Review slaughterhouse inspection counts and condemnation rates by animal type and year.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@swiss-food-safety-mcpWhich BLV food warnings are currently active?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
π¨π Part of the Swiss Public Data MCP Portfolio
swiss-food-safety-mcp
π English | Deutsch
MCP server connecting AI models to Swiss Federal Food Safety and Veterinary Office (BLV) open data β food recalls, animal disease surveillance, food control results, antibiotic usage, children's nutrition surveys and the pesticide register. No authentication required.
Overview
swiss-food-safety-mcp gives AI assistants like Claude direct access to official Swiss food safety and veterinary data from the Federal Food Safety and Veterinary Office (BLV / Bundesamt fΓΌr Lebensmittelsicherheit und VeterinΓ€rwesen). It provides 11 tools covering food recalls, animal disease surveillance, food control results, antibiotic usage in veterinary medicine, nutrition surveys for children, and the pesticide register.
All data comes from official Swiss federal sources (opendata.swiss, lindas.admin.ch, news.admin.ch). No API keys or authentication are required.
This server follows the No-Auth-First philosophy and is part of a Swiss public sector MCP portfolio.
Anchor demo query: "Are there any current BLV food warnings relevant to Zurich school canteens β and which notifiable animal diseases are currently reported in the canton?"
Demo
β More use cases by audience β
Related MCP server: parlament-mcp
Features
π¨ Public warnings & recalls β Live RSS feed of BLV product recalls and health warnings
π Animal disease surveillance β Notifiable animal diseases since 1991 (InfoSM) via the LINDAS SPARQL cube
π¦ Avian influenza monitoring β Wild bird surveillance data with geodata
π₯© Food control results β Cantonal food inspection results and violation rates
π Antibiotic usage veterinary β ISABV data on antibiotic use in animal medicine
π§ Children's nutrition survey β menuCH-Kids questionnaire tallies (answer counts, not nutrient intake)
πΏ Pesticide register β Swiss approved pesticide products and active ingredients
π Dataset discovery β Browse all 28 BLV datasets on opendata.swiss via CKAN API
π Dual transport β stdio (Claude Desktop) + Streamable HTTP (cloud/Render.com)
π£οΈ Bilingual β English-first documentation, German secondary
Prerequisites
Python 3.11+
uvoruvx(recommended) β install uv
Installation
Using uvx (recommended β no install needed)
uvx swiss-food-safety-mcpUsing uv
uv tool install swiss-food-safety-mcp
swiss-food-safety-mcpFrom source
git clone https://github.com/malkreide/swiss-food-safety-mcp
cd swiss-food-safety-mcp
uv sync
uv run swiss-food-safety-mcpQuickstart
Add to claude_desktop_config.json:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"swiss-food-safety": {
"command": "uvx",
"args": ["swiss-food-safety-mcp"]
}
}
}Try it immediately in Claude Desktop:
"Which BLV food warnings are currently active?"
"Are there any notifiable animal diseases reported in Zurich canton this year?"
Other MCP Clients (Cursor, Windsurf, VS Code + Continue)
{
"mcpServers": {
"swiss-food-safety": {
"command": "uvx",
"args": ["swiss-food-safety-mcp"]
}
}
}Cloud Deployment (Streamable HTTP)
For use via claude.ai in the browser (e.g. on managed workstations without local software):
# Loopback only (default) β safe for local testing:
swiss-food-safety-mcp --http
# Server runs on 127.0.0.1:8002
# External exposure (e.g. behind the Render TLS proxy):
swiss-food-safety-mcp --http --host 0.0.0.0β οΈ The HTTP transport binds to
127.0.0.1by default. Pass--host 0.0.0.0only when external exposure is intended. SetBLV_MCP_ALLOWED_ORIGINS(comma-separated, no wildcard) to permit browser clients; it defaults tohttps://claude.ai.
Render.com (recommended):
Push/fork the repository to GitHub
On render.com: New Web Service β connect GitHub repo
Set the start command to:
swiss-food-safety-mcp --http --host 0.0.0.0In claude.ai under Settings β MCP Servers, add:
https://your-app.onrender.com/mcp
Docker:
docker build -t swiss-food-safety-mcp .
docker run -p 8002:8002 swiss-food-safety-mcp
# or, with explicit CPU/memory limits:
docker compose upThe image is a non-root, multi-stage build; the container already binds
0.0.0.0 and includes a healthcheck. docker-compose.yml additionally caps
CPU and memory.
π‘ "stdio for the developer laptop, Streamable HTTP for the browser."
π§ Configuration β every runtime setting is overridable via
BLV_MCP_*environment variables (BLV_MCP_HTTP_HOST,BLV_MCP_HTTP_PORT,BLV_MCP_ALLOWED_ORIGINS,BLV_MCP_TIMEOUT,BLV_MCP_OTEL_ENDPOINT, β¦). Outbound requests are restricted to Swiss federal hosts (*.admin.ch,opendata.swiss). Optional OpenTelemetry tracing: install withpip install swiss-food-safety-mcp[otel]and setBLV_MCP_OTEL_ENDPOINT.
Available Tools
Tool | Description | Data Source |
| Current food recalls & health warnings | news.admin.ch RSS |
| Browse all 28 BLV open datasets | opendata.swiss CKAN |
| Dataset details & resource URLs | opendata.swiss CKAN |
| Notifiable animal diseases since 1991 | LINDAS SPARQL ( |
| Annual animal health statistics | opendata.swiss CSV/JSON |
| Cantonal food inspection results | opendata.swiss CSV |
| Veterinary antibiotic usage (ISABV) | opendata.swiss CSV |
| Wild bird avian influenza surveillance | opendata.swiss CSV |
| menuCH-Kids: questionnaire tallies (not nutrient intake) | opendata.swiss CSV |
| Swiss approved pesticide register | opendata.swiss XML |
| Slaughterhouse inspection statistics | opendata.swiss CSV/JSON |
Example Queries
Query | Tool |
"Which BLV food warnings are currently active?" |
|
"Are there animal diseases in Zurich canton in 2024?" |
|
"What is the avian influenza situation in Switzerland 2024?" |
|
"What do Swiss children actually eat?" |
|
"Which copper-based pesticides are approved in Switzerland?" |
|
Architecture
βββββββββββββββββββ βββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββ
β Claude / AI ββββββΆβ Swiss Food Safety MCP ββββββΆβ Swiss Federal Open Data β
β (MCP Host) βββββββ (MCP Server) βββββββ β
βββββββββββββββββββ β β β opendata.swiss (CKAN/CSV) β
β 11 Tools Β· No Auth β β lindas.admin.ch (SPARQL) β
β Stdio | Streamable HTTP β β news.admin.ch (RSS/XML) β
βββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββSynergies with Related MCP Servers
Combination | Use Case |
| Geo-mapped animal disease risk near school locations |
| Link recalls to food law (Lebensmittelgesetz) |
| Nutrition data Γ socioeconomics by school district |
| Swiss children's nutrition vs. OECD benchmarks |
Project Structure
swiss-food-safety-mcp/
βββ src/
β βββ swiss_food_safety_mcp/
β βββ __init__.py # Package metadata
β βββ server.py # All tools, resources, prompts
βββ tests/
β βββ __init__.py
β βββ test_server.py # Unit tests (no live API calls)
βββ .github/
β βββ workflows/
β βββ ci.yml # Python 3.11β3.13 matrix
βββ pyproject.toml # hatchling build, uv-compatible
βββ CHANGELOG.md
βββ CONTRIBUTING.md # Contribution guide (English)
βββ CONTRIBUTING.de.md # Contribution guide (German)
βββ SECURITY.md # Security policy (English)
βββ SECURITY.de.md # Security policy (German)
βββ LICENSE # MIT
βββ README.md # This file (English)
βββ README.de.md # German versionData Sources
Source | Description | Format |
28 open datasets | CSV, JSON, Parquet, SPARQL, XML | |
Swiss linked data SPARQL endpoint | RDF/SPARQL | |
BLV public warnings & recalls | RSS/XML | |
BLV website (DE/FR/IT/EN) | HTML |
All data is open government data (OGD) under Creative Commons with attribution requirement.
Known Limitations
RSS feed: Limited to the most recent BLV publications; no historical archive
Pesticide register: XML parsing may be slow for queries returning large result sets
CKAN datasets: Opendata.swiss rate limits apply under heavy usage
Animal disease data: Canton-level filtering depends on data completeness in the source
Datasets are pinned, not searched: each data tool names its dataset slug and the resource that carries the data (see
DATENQUELLENinserver.py). A keyword search takes the first hit and therefore falls back silently onto something plausible β that is howblv_get_animal_health_statscame to return antibiotics data, and howblv_get_food_control_resultscame to return a code list out of a dataset whose 26 resources include 18 of them.scripts/record_fixtures.pyre-measures the pinned pairs on every run; a renamed dataset now fails loudly.Children's nutrition is questionnaire tallies, not nutrient intake: the only menuCH-Kids dataset published on opendata.swiss carries answer counts (
Geschlecht, Sprachregion, Altersgruppe, Frage, Antwort, Anzahl). The docstring previously promised nutrient intake against dietary recommendations and offered "Energie", "Zucker", "Eisen" as filter examples β those matched nothing and returned an empty list. Adult food-consumption data exists as a separate dataset that this server does not cover.The SPARQL-to-CSV fallback is gone. It could never work: the one CSV resource of the fallback dataset is a ZIP file declared as
format: CSV. With the endpoint corrected the fallback is also unnecessary β and a fallback that hides a broken query is worse than none.
Safety & Limits
Read-only: All tools perform HTTP GET requests only β no data is written, modified, or deleted.
No personal data: The APIs return aggregated public health and food safety statistics. No personally identifiable information is processed or stored by this server.
Rate limits: opendata.swiss CKAN and lindas.admin.ch SPARQL are public APIs; use
limitand filtering parameters conservatively. The server enforces a 30-second timeout per request.Data freshness: RSS warnings reflect the latest BLV publications at query time. Statistical datasets (animal diseases, food control, antibiotics) are updated periodically by the BLV. No caching is performed by this server.
Terms of service: Data is subject to the ToS of each source β opendata.swiss, lindas.admin.ch, news.admin.ch. BLV data is published under Creative Commons with attribution.
No guarantees: This server is a community project, not affiliated with the BLV or the Swiss federal administration. Availability depends on upstream APIs.
Deployment & Scaling
This server is Phase 1 β read-only (see ROADMAP.md): all
11 tools are read-only queries with no write surface.
Run it as a single instance. The Streamable HTTP transport keeps
per-session state, so horizontal scaling would require Mcp-Session-Id sticky
routing at the load balancer plus a shared session store β neither is
implemented, by design, for a server of this scope. A single Render instance
(or one container) is the supported deployment; docker-compose.yml sets
explicit CPU/memory limits for self-hosting.
Testing
# Unit + contract tests (no network) β this is what CI runs
PYTHONPATH=src pytest tests/ -m "not live"
# All tests including live API checks
PYTHONPATH=src pytest tests/
# Re-measure which dataset and resource each tool hits
PYTHONPATH=src python scripts/record_fixtures.py54 tests β 53 offline, 1 live.
Why the fixtures are recorded rather than written
A hand-written mock encodes its author's assumption and therefore cannot refute it: production code and fixture come from the same head, the same hour, the same reading of the docs. Where both are wrong, both are wrong together β and the suite stays green.
This repo had it in pure form. Every mocked CKAN resource was named
"name": "CSV". On opendata.swiss the same field reads Food establishments 2025 or Food establishments codelist administrative measures β and that
difference alone decided whether a tool returned inspection results or a code
legend. The mocks could not express the distinction, so no test could fail on
it.
What is recorded is therefore the selection: for each tool, the pinned
dataset slug, the resource that was hit, and that file's header line. The
header is the object of the exercise β it separates data from a legend, and it
shows whether the BOM and the delimiter were handled. PROVENANCE.md names the
source, the date, the selection rule and the SHA-256 for each file.
Two of the recorded measurements are controls: an invented path under
lindas.admin.ch (POST 404, so the 404 on /sparql is real) and an invented
class in the fsvo namespace (0 instances, so the previously queried foag
class genuinely does not exist). Without them each measurement would only show
what we received. The recorder aborts if a control stops discriminating, if a
pinned resource disappears, if a header line is empty or starts with a BOM, or
if one of the findings is superseded.
MCP Protocol Version
The protocol version is negotiated at the initialize handshake by the SDK,
not chosen by this server. The revision it is built and audited against is
2025-11-25, which is LATEST_PROTOCOL_VERSION in the pinned mcp
release that fastmcp brings in.
tests/test_protocol_version.py holds three things against each other: this
line, that SDK constant, and the revision a real handshake against the server
object actually returns. An SDK bump that changes the revision therefore fails
CI instead of drifting silently.
The sister servers in this portfolio pin a pair of revisions β a handshake
ceiling and a modern one β because mcp 2.x serves two protocol eras over the
same server. fastmcp 3.x pins mcp 1.x, where mcp.types.version does not
exist and one revision is the whole story. test_das_sdk_kennt_hier_nur_eine_aera
is tied to the SDK rather than to this paragraph and fails the day an upgrade
brings the two-era constants in.
Changelog
See CHANGELOG.md
Contributing
See CONTRIBUTING.md
Security
See SECURITY.md for the security policy and how to report a vulnerability.
License
MIT License β see LICENSE
Author
Hayal Oezkan Β· github.com/malkreide
Credits & Related Projects
Data: opendata.swiss / BLV β Federal Food Safety and Veterinary Office (BLV)
Protocol: Model Context Protocol β Anthropic / Linux Foundation
Related: zurich-opendata-mcp β MCP server for Zurich city open data
Portfolio: Swiss Public Data MCP Portfolio
Installation
Run via uv's uvx β no clone or manual install needed. Add to your MCP client config (mcpServers for Claude Desktop, Cursor and Windsurf; use a top-level servers key for VS Code in .vscode/mcp.json):
{
"mcpServers": {
"swiss-food-safety-mcp": {
"command": "uvx",
"args": [
"swiss-food-safety-mcp"
]
}
}
}Available Tools
11 toolsblv_get_animal_health_statsARead-onlyIdempotent
Annual animal health statistics from BLV (opendata.swiss CSV/JSON).
Use case: track year-over-year animal health indicators across Switzerland.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Filter by year (e.g. 2023). None returns all available years. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the agent knows the tool is safe and idempotent. The description adds minimal behavioral context (annual statistics, public data), but does not disclose potential quirks like rate limits or data freshness. With annotations covering safety, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the main purpose and a practical use case. Every word adds value, and there is no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema and only one optional parameter, the description is mostly complete. It specifies the data source and use case. However, it could briefly mention that data is aggregated or provide a default behavior hint, but for a simple tool this is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% coverage with a clear description for the 'year' parameter: 'Filter by year (e.g. 2023). None returns all available years.' The description mentions 'year-over-year' but does not add new semantic meaning beyond what the schema provides. Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves annual animal health statistics from BLV, specifying the source (opendata.swiss) and format (CSV/JSON). The name and description together distinguish it from sibling tools like blv_get_antibiotic_usage_vet or blv_get_avian_influenza, which focus on different data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes a direct use case: 'track year-over-year animal health indicators across Switzerland,' which helps the agent understand when to apply the tool. However, it does not explicitly mention when not to use it or provide alternatives, but the clear context compensates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blv_get_antibiotic_usage_vetARead-onlyIdempotent
Veterinary antibiotic usage data from the Swiss ISABV monitoring system.
Use case: analyse antibiotic consumption trends by livestock species, e.g. for antimicrobial-resistance reporting.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Filter by year (e.g. 2022). None = all years. | |
| animal_species | No | Filter by species (e.g. "Rind", "Schwein", "GeflΓΌgel"). Empty = all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description's additional mention of the data source is helpful but does not disclose other behavioral traits like rate limits or pagination. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the tool's purpose, and wastes no words. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With optional parameters, existing output schema, and annotations covering safety, the description provides sufficient context by mentioning the data source and use case. It is adequate for an agent to understand when and how to use the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters. The description adds the context of 'livestock species' but does not provide new meaning beyond the schema's own descriptions. Baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool provides veterinary antibiotic usage data from the Swiss ISABV monitoring system, with a specific use case for analyzing consumption trends. It implicitly distinguishes from sibling tools that cover other health or food control data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear use case (antimicrobial-resistance reporting) but does not explicitly state when not to use or suggest alternatives among siblings. The context is clear enough for an agent to select this tool for antibiotic data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blv_get_avian_influenzaARead-onlyIdempotent
Wild bird avian influenza (H5N1 / HPAI) surveillance data with geodata.
Use case: locate and date wild-bird avian influenza detections, optionally narrowed to one canton.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Filter by year (e.g. 2024). None = all. | |
| canton | No | Two-letter canton code (e.g. "ZH"). Empty = all Switzerland. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, covering safety and idempotency. The description adds that data includes geodata and detection dates, which is useful but not extensive. Since annotations already handle behavioral transparency, the description provides adequate but minimal extra context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, consisting of two short sentences that front-load the core purpose and then state the use case. Every word adds value, and there is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 optional parameters, complete schema descriptions, existing annotations, and an output schema), the description is sufficiently complete. It covers the data source, content, and primary use case without needing to detail output fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100% with clear descriptions for both parameters (year and canton). The description reinforces the canton parameter by mentioning 'optionally narrowed to one canton' but adds no new meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves wild bird avian influenza (H5N1/HPAI) surveillance data with geodata, specifying the subject (avian influenza), source (wild birds), and nature (surveillance with geodata). This distinguishes it from siblings like blv_get_animal_health_stats which cover other animal health topics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides a use case: 'locate and date wild-bird avian influenza detections, optionally narrowed to one canton.' It does not list when not to use or offer alternatives, but the sibling tools are sufficiently distinct that no further guidance is needed. The granularity of 'optionally narrowed' clarifies when the canton parameter is useful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blv_get_dataset_infoARead-onlyIdempotent
Detailed metadata and resource URLs for a specific BLV dataset.
Use case: obtain the concrete download URLs and formats of a dataset found via blv_list_datasets, including its open-data licence.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_name | Yes | CKAN dataset name/slug (from blv_list_datasets). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and openWorld hints, so the description doesn't need to restate safety. It adds value by describing the output content (metadata, URLs, formats, license) and the relationship to another tool, providing context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, and no extraneous text. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existence of an output schema (so return values are documented), the description is complete: it covers what the tool does, when to use it, and the key input. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already describes the parameter as 'CKAN dataset name/slug (from blv_list_datasets).' The description reiterates this without adding new semantic detail, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it provides 'detailed metadata and resource URLs' for a BLV dataset, using a specific verb (retrieve) and resource (dataset info). It distinguishes itself from sibling tools that focus on specific data types by mentioning it is for general dataset info, and explicitly ties to blv_list_datasets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear use case: obtain download URLs and formats after finding a dataset via blv_list_datasets. While it doesn't explicitly state when not to use it, the sibling context and the mention of the prerequisite tool provide adequate guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blv_get_food_control_resultsARead-onlyIdempotent
Cantonal food inspection results and violation rates (Lebensmittelkontrolle).
Use case: compare inspection volumes and violation rates between cantons or across years.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Filter by year. None = all available. | |
| limit | No | Maximum rows to return (default 100). | |
| canton | No | Two-letter canton abbreviation (e.g. "ZH"). Empty = all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, and openWorldHint, which cover safety and idempotency. The description adds minimal behavioral context (returns results and violation rates) but does not contradict annotations. With annotations present, the description's contribution is adequate but not extensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loads the purpose, and contains zero redundant or unnecessary words. It is highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (not shown but noted) and 3 simple parameters fully documented in the schema, the description covers the essential purpose and use case. It does not require additional information about return values or complex behavior, making it complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers all 3 parameters with descriptions (canton, year, limit), achieving 100% coverage. The tool description does not add any additional meaning beyond what is already in the schema, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'food inspection results and violation rates' and provides a use case for comparison across cantons or years. While it is specific, it does not explicitly differentiate from sibling tools beyond the domain (food control vs. animal health, etc.), but the name and context make it clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes a 'use case' that suggests when to use the tool (comparing inspection volumes and violation rates), but it does not mention when not to use it or provide explicit alternatives among siblings. This is an implied guidance, not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blv_get_meat_inspection_statsARead-onlyIdempotent
Slaughterhouse meat inspection statistics (Fleischuntersuchung).
Use case: review slaughter counts and condemnation rates by animal type and year.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Filter by year (e.g. 2023). None = all. | |
| animal_type | No | Filter by animal type (e.g. "Rind", "Schwein", "GeflΓΌgel"). Empty = all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint, idempotentHint, and openWorldHint. The description adds behavioral detail by naming the specific outputs (slaughter counts and condemnation rates), which helps the agent understand what data to expect without needing to parse the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loading the tool's purpose and immediately following with a concrete use case. Every sentence adds value, no redundant text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (2 optional parameters) and the presence of an output schema and comprehensive annotations, the description is complete enough for an agent to understand the tool's role and retrieve the expected data. The only minor gap is absence of example values for year or animal_type.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the schema already documents both parameters (year and animal_type). The description merely echoes these in its use case, adding no extra meaning beyond what the schema provides. A score of 3 is appropriate as the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as providing slaughterhouse meat inspection statistics, specifying 'slaughter counts and condemnation rates by animal type and year.' This distinguishes it from sibling tools like blv_get_animal_health_stats or blv_get_antibiotic_usage_vet, which focus on different data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the use case as reviewing slaughter counts and condemnation rates, giving clear context for when to use the tool. However, it does not explicitly mention when not to use it or suggest alternative tools for non-matching queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blv_get_nutrition_data_childrenARead-onlyIdempotent
Swiss national children's nutrition survey data (menuCH-Kids).
Use case: examine children's nutrient intake by age group against dietary recommendations.
| Name | Required | Description | Default |
|---|---|---|---|
| nutrient | No | Filter by nutrient name (e.g. "Energie", "Zucker", "Eisen"). Empty = all. | |
| age_group | No | Filter by age group (e.g. "6-9", "10-12"). Empty = all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, and openWorldHint. The description adds valuable context about the specific dataset (menuCH-Kids) and the intended use case, going beyond the annotations without contradicting them. It does not detail behavioral traits like pagination or data size, but the annotations cover safety and idempotency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is highly concise, consisting of two short sentences that front-load the resource name and use case. Every word adds value, with no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (2 optional parameters, no required, has output schema), the description fully contextualizes the tool. It specifies the dataset (Swiss national survey), the domain (children's nutrition), and the use case (comparison against recommendations). The presence of an output schema eliminates the need to describe return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with both parameters fully described in the input schema. The description does not add any additional meaning or syntax details beyond what the schema provides, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it provides Swiss national children's nutrition survey data (menuCH-Kids) and specifies the use case of examining nutrient intake by age group against recommendations. It is distinct from all sibling tools, which cover animal health, antibiotics, etc., with no overlap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear use case (examine children's nutrient intake by age group against dietary recommendations) but does not explicitly state when not to use or mention alternatives. However, no sibling tool serves a similar purpose, so the context is sufficient for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blv_get_public_warningsARead-onlyIdempotent
Current BLV food recalls and public health warnings (live RSS feed).
Use case: answer questions about food safety alerts currently active in Switzerland, e.g. "which products have been recalled recently?".
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of items to return (default 20, max 50). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, open-world. Description adds 'live RSS feed' and 'currently active', clarifying that results change over time. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. Front-loaded with purpose followed by use case. Ideal structure for an AI agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Simple tool with one parameter and output schema; description covers purpose, scope, source, and use case. Could mention update frequency but not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%; description adds no additional meaning for the 'limit' parameter beyond its schema description. Baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb 'get' with specific resource 'public warnings', scope 'Switzerland' and topic 'food recalls'. Distinguishes from siblings which cover animal health, nutrition, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit use case example ('which products have been recalled recently?') and context 'current BLV food recalls and public health warnings'. No negative guidance, but sibling differentiation makes confusion unlikely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blv_list_datasetsARead-onlyIdempotent
Browse all BLV open datasets on opendata.swiss (CKAN API).
Use case: discover which datasets exist before drilling into one with blv_get_dataset_info, or to map a topic to a concrete dataset slug.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum datasets to return (default 28 = all BLV datasets). | |
| search | No | Optional keyword filter on title/notes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, openWorldHint. Description adds CKAN source and use case but no extra behavioral traits beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences, no wasted words; front-loaded with purpose and use case.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With output schema present and only two optional parameters, description covers all necessary context for agent usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for limit and search. Description adds no extra parameter meaning beyond what schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Browse all BLV open datasets' and distinguishes from sibling blv_get_dataset_info by framing use case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'discover which datasets exist before drilling into one with blv_get_dataset_info', providing when/why to use and alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blv_search_animal_diseasesARead-onlyIdempotent
Search notifiable animal disease cases in Switzerland since 1991 (InfoSM).
Use case: report on disease occurrence by canton and year, e.g. "were there avian influenza cases in Bern in 2024?".
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results (default 50). | |
| canton | No | Two-letter canton abbreviation (e.g. "ZH", "BE"). Empty = all cantons. | |
| disease | No | Disease name filter (partial match, e.g. "Maul", "Vogelgrippe"). Empty = all. | |
| year_to | No | End year (default 2024). | |
| year_from | No | Start year (default 2020). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint. The description adds useful context (data from 1991, InfoSM source) without contradicting annotations. Could add pagination or result details but not required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: the first defines the tool, the second gives a concrete use case. No wasted words, front-loaded with essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's scope (search notifiable diseases since 1991), typical use case, and parameters. Output schema exists to describe return values. Could mention whether results are aggregated or individual cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with each parameter described. The description adds no additional parameter meaning beyond what the schema already provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches notifiable animal disease cases in Switzerland since 1991 (InfoSM) and provides a concrete use case with example query. It distinguishes from siblings like blv_get_avian_influenza which is more specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly indicates the use case (report disease occurrence by canton and year) and gives an example, but does not mention when not to use or compare to alternative sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blv_search_pesticide_productsARead-onlyIdempotent
Search the Swiss approved pesticide register (Pflanzenschutzmittelverzeichnis).
Use case: check whether a plant-protection product or active ingredient is approved (or revoked) in Switzerland.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results (default 50). | |
| status | No | Authorization status β "bewilligt" (approved), "widerrufen" (revoked), or "". | bewilligt |
| product_name | No | Filter by product name (partial match). Empty = all. | |
| active_ingredient | No | Filter by active ingredient, e.g. "Kupfer", "Glyphosat". Empty = all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint, idempotentHint, openWorldHint) already convey key behavioral traits. Description adds context about searching a register but does not introduce new behavioral details beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, no fluff. Purpose and use case are front-loaded, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given rich annotations, full schema coverage, and presence of an output schema, the description is complete and sufficient for understanding the tool's purpose and usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions for all parameters. The description does not add extra meaning beyond the schema, so baseline score is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'Search' and specific resource 'Swiss approved pesticide register', and provides a concrete use case. It distinctly differentiates from sibling tools which focus on animal health, food control, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is clearly stated, and the tool's role is obvious given sibling diversity. However, no explicit when-not-to-use or alternative tools are mentioned, which is a minor gap.
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. Dates show when Glama detected each change.
11 tool updates
v1.1.0- First observed
blv_get_animal_health_stats - First observed
blv_get_antibiotic_usage_vet - First observed
blv_get_avian_influenza - First observed
blv_get_dataset_info - First observed
blv_get_food_control_results - First observed
blv_get_meat_inspection_stats - First observed
blv_get_nutrition_data_children - First observed
blv_get_public_warnings - First observed
blv_list_datasets - First observed
blv_search_animal_diseases - First observed
blv_search_pesticide_products
TDQS
Each tool targets a distinct data source or operation (e.g., animal health stats, antibiotic usage, avian influenza, food control results, pesticide search). There is no overlap in purpose; even the two disease-related tools (blv_get_avian_influenza and blv_search_animal_diseases) differ in scopeβwild bird surveillance vs. notifiable diseases. An agent can clearly select the correct tool.
All tools follow a consistent 'blv_{verb}_{noun}' pattern in snake_case. Verbs are predictable: 'get' for retrieving specific datasets/stats, 'list' for browsing available datasets, 'search' for querying registries. No mixing of styles or vague verbs.
With 11 tools, the server covers a broad spectrum of Swiss food safety data (animal health, food control, pesticides, nutrition, warnings) without being overwhelming. Each tool addresses a clear need, and the number feels well-scoped for the domain.
The tool set provides comprehensive coverage for the BLV's food safety and veterinary data: statistics, surveillance, inspections, warnings, and registry searches. Minor gaps exist (e.g., no tool for foodborne outbreak data or food contact materials), but core workflows like tracking recalls, comparing inspection results, and querying registries are fully supported.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Unlock the power of food transparency with our Open Food Facts MCP server. Easily look up any food
opendata.swiss MCP β Switzerland's federal open-data portal (CKAN catalogue).
AI governance MCP server for EU AI Act compliance and jurisdiction verification
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
Related MCP Servers
- AlicenseAqualityAmaintenanceMCP server connecting AI models to SRG SSR public APIs β weather, TV/radio metadata, program guide and Swiss votations/elections since 1900.151MIT
- AlicenseAqualityAmaintenanceAn MCP server connecting AI models to the Swiss Federal Parliament via the Curia Vista OData API, enabling queries of motions, votes, members, sessions, and debate transcripts without authentication.7MIT
- AlicenseBqualityAmaintenanceAn MCP server providing AI-powered access to Open Data from the City of Zurich, enabling queries to 900+ datasets, real-time environmental and mobility data, geodata, parliamentary proceedings, and more.268MIT
- AlicenseBqualityDmaintenanceMCP server exposing all major Swiss official public APIs as native tools for any MCP-compatible AI agent.3416MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/malkreide/swiss-food-safety-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server