Skip to main content
Glama
malkreide

swiss-food-safety-mcp

by malkreide

🇨🇭 Part of the Swiss Public Data MCP Portfolio

swiss-food-safety-mcp

Version License: MIT Python 3.11+ MCP Data Source No Auth Required CI

🌐 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

Demo: Claude using blv_get_public_warnings and blv_search_animal_diseases → 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+

  • uv or uvx (recommended) — install uv


Installation

uvx swiss-food-safety-mcp

Using uv

uv tool install swiss-food-safety-mcp
swiss-food-safety-mcp

From source

git clone https://github.com/malkreide/swiss-food-safety-mcp
cd swiss-food-safety-mcp
uv sync
uv run swiss-food-safety-mcp

Quickstart

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.1 by default. Pass --host 0.0.0.0 only when external exposure is intended. Set BLV_MCP_ALLOWED_ORIGINS (comma-separated, no wildcard) to permit browser clients; it defaults to https://claude.ai.

Render.com (recommended):

  1. Push/fork the repository to GitHub

  2. On render.com: New Web Service → connect GitHub repo

  3. Set the start command to: swiss-food-safety-mcp --http --host 0.0.0.0

  4. In 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 up

The 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 with pip install swiss-food-safety-mcp[otel] and set BLV_MCP_OTEL_ENDPOINT.


Available Tools

Tool

Description

Data Source

blv_get_public_warnings

Current food recalls & health warnings

news.admin.ch RSS

blv_list_datasets

Browse all 28 BLV open datasets

opendata.swiss CKAN

blv_get_dataset_info

Dataset details & resource URLs

opendata.swiss CKAN

blv_search_animal_diseases

Notifiable animal diseases since 1991

LINDAS SPARQL (/query)

blv_get_animal_health_stats

Annual animal health statistics

opendata.swiss CSV/JSON

blv_get_food_control_results

Cantonal food inspection results

opendata.swiss CSV

blv_get_antibiotic_usage_vet

Veterinary antibiotic usage (ISABV)

opendata.swiss CSV

blv_get_avian_influenza

Wild bird avian influenza surveillance

opendata.swiss CSV

blv_get_nutrition_data_children

menuCH-Kids: questionnaire tallies (not nutrient intake)

opendata.swiss CSV

blv_search_pesticide_products

Swiss approved pesticide register

opendata.swiss XML

blv_get_meat_inspection_stats

Slaughterhouse inspection statistics

opendata.swiss CSV/JSON

Example Queries

Query

Tool

"Which BLV food warnings are currently active?"

blv_get_public_warnings

"Are there animal diseases in Zurich canton in 2024?"

blv_search_animal_diseases

"What is the avian influenza situation in Switzerland 2024?"

blv_get_avian_influenza

"What do Swiss children actually eat?"

blv_get_nutrition_data_children

"Which copper-based pesticides are approved in Switzerland?"

blv_search_pesticide_products


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)     │
                        └─────────────────────────────┘     └──────────────────────────────┘

Combination

Use Case

swiss-food-safety-mcp + zurich-opendata-mcp

Geo-mapped animal disease risk near school locations

swiss-food-safety-mcp + fedlex-mcp

Link recalls to food law (Lebensmittelgesetz)

swiss-food-safety-mcp + swiss-statistics-mcp

Nutrition data × socioeconomics by school district

swiss-food-safety-mcp + global-education-mcp

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 version

Data Sources

Source

Description

Format

opendata.swiss/BLV

28 open datasets

CSV, JSON, Parquet, SPARQL, XML

lindas.admin.ch/sparql

Swiss linked data SPARQL endpoint

RDF/SPARQL

news.admin.ch RSS

BLV public warnings & recalls

RSS/XML

blv.admin.ch

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 DATENQUELLEN in server.py). A keyword search takes the first hit and therefore falls back silently onto something plausible — that is how blv_get_animal_health_stats came to return antibiotics data, and how blv_get_food_control_results came to return a code list out of a dataset whose 26 resources include 18 of them. scripts/record_fixtures.py re-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 limit and 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.py

54 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

This server speaks spec 2026-07-28 natively. It runs fastmcp 4.x, which pins mcp 2.x, and that SDK serves two protocol eras over the same server object:

Era

Revision

How a client reaches it

modern

2026-07-28

server/discover, metadata in _meta.io.modelcontextprotocol/*

handshake (legacy)

2025-11-25

the classic initialize exchange

A current client gets 2026-07-28; one that has not moved yet falls back to the handshake and still gets every tool. Neither revision is chosen by this server — the SDK negotiates, and the pin records which pair that negotiation is allowed to produce.

The modern era is not just a higher number. It has no initialize handshake and no InitializeResult: Client.initialize() raises there, and the server metadata comes from server/discover instead. A check that still measured initialize_result.protocolVersion would therefore be testing only the legacy half while reporting a pass for both.

tests/test_protocol_version.py measures each era over its own path rather than comparing constants to one another: it pins both revisions against LATEST_MODERN_VERSION / LATEST_HANDSHAKE_VERSION, connects a real client in each mode, asserts the structural absence of InitializeResult in the modern one, and checks that both eras list the same tools. test_das_sdk_fuehrt_weiterhin_zwei_aeren guards the other direction — a downgrade back to mcp 1.x would otherwise reduce half of those assertions to an import error nobody reads.

The transport allow-list moved with the SDK: Mcp-Method, Mcp-Name and MCP-Protocol-Version are the routing headers spec 2026-07-28 mirrors into HTTP, and mcp.shared.inbound now reads them, so CORS lists them. Mcp-Param-* is deliberately still absent — the spec mints those only for parameters a tool marks with x-mcp-header, and no tool here does.


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


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 tools
blv_get_animal_health_statsBlv Get Animal Health StatsB
Read-onlyIdempotent

Annual animal health statistics from BLV (opendata.swiss CSV/JSON).

Use case: track year-over-year animal health indicators across Switzerland.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoFilter by year (e.g. 2023). None returns all available years.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint and idempotentHint, so the safety profile is covered. The description adds the data source and format (opendata.swiss CSV/JSON), which is modest extra context, but says nothing about refresh cadence, coverage limits, or rate/auth behavior. With annotations carrying the safety burden, this is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the resource and followed by the use case. No padding, though the second sentence is thin enough that it borders on filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations cover the mutation profile. The remaining gap is sibling differentiation and any note on data scope/cadence, which an agent in a crowded blv_* toolset would need.

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 single 'year' parameter is fully documented in-schema ('None returns all available years'). The description adds no parameter detail beyond that, so the baseline 3 applies.

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?

States a specific resource ('annual animal health statistics from BLV') with a clear source attribution. However, it does not distinguish itself from several sibling tools that also return animal-health data (blv_get_avian_influenza, blv_get_meat_inspection_stats, blv_get_antibiotic_usage_vet), so an agent cannot tell from the description alone whether this is the aggregate overview or a subtopic.

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 'Use case: track year-over-year animal health indicators across Switzerland' line implies when the tool is useful, but it gives no explicit when-not and names no alternative sibling for narrower topics. Selection guidance is left to inference.

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_vetBlv Get Antibiotic Usage VetA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoFilter by year (e.g. 2022). None = all years.
animal_speciesNoFilter by species (e.g. "Rind", "Schwein", "Geflügel"). Empty = all.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 and idempotentHint, so the safety profile is covered. The description contributes provenance (Swiss ISABV monitoring system), which helps the agent judge data trustworthiness, but says nothing about filtering behavior, pagination, or data freshness.

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 that are front-loaded with the data source and immediately followed by the use case. No filler, no repetition of the schema, and nothing that could be trimmed without losing information.

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?

An output schema exists, so return values need no explanation, and the schema documents both filters fully. What the description supplies (source, use case) plus annotations is nearly sufficient; only the lack of routing guidance among sibling BLV tools leaves a 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 description coverage is 100% with only two optional filters (year, animal_species), so the schema already carries full parameter meaning, including the empty/None = all semantics. The description adds nothing beyond the schema, making the baseline 3 correct.

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?

States a specific resource (veterinary antibiotic usage data) and its provenance (Swiss ISABV monitoring system), which is a clear verb+resource statement. It does not explicitly distinguish itself from siblings such as blv_get_animal_health_stats, but the resource is narrow enough that an agent can identify it.

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?

Gives an explicit use case (analysing antibiotic consumption trends by livestock species for AMR reporting), which implies when to reach for it. However, it names no alternatives and offers no when-not guidance, so selection against the ten sibling BLV tools is left to inference.

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

blv_get_avian_influenzaBlv Get Avian InfluenzaA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoFilter by year (e.g. 2024). None = all.
cantonNoTwo-letter canton code (e.g. "ZH"). Empty = all Switzerland.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint and idempotentHint, so the safety profile is covered. The description adds useful domain context (H5N1/HPAI surveillance, geodata, canton scope), but says nothing about freshness, coverage windows, or pagination; a 3 is appropriate given annotations carry most of 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?

Two short, front-loaded lines: the resource is stated first, then the use case. Every sentence earns its place and nothing is padded.

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, the description need not explain return values, and the two filter params are fully documented. Annotations cover safety; the only mild gap is the absence of sibling routing or data-freshness 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?

Schema description coverage is 100%, so both parameters (year, canton) are fully documented in the schema with defaults and examples. The description adds no parameter-level syntax or format detail beyond that, so the baseline 3 applies.

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 (locate/date) and resource (wild bird avian influenza H5N1/HPAI surveillance data), and adds the geodata dimension that distinguishes it from generic disease-search siblings. It does not explicitly name which sibling to use instead, so it falls 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 'Use case' line clearly states when to reach for this tool and notes the optional canton narrowing. There is no guidance on when NOT to use it or which sibling (e.g. blv_search_animal_diseases) to prefer for other disease lookups.

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

blv_get_dataset_infoBlv Get Dataset InfoA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataset_nameYesCKAN dataset name/slug (from blv_list_datasets).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds genuinely useful content context by naming what comes back (concrete download URLs, formats, open-data licence), which goes beyond what the annotations convey, though it says nothing about auth or rate limits.

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, front-loaded with the purpose and followed by the use case. No filler 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?

For a single-parameter read tool with an output schema and full annotations, the description supplies purpose, workflow placement, and return-content expectations. Nothing essential is missing, though a note on identifier format expectations from the list tool would fully close the loop.

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 single parameter is fully documented as a CKAN slug sourced from blv_list_datasets. The description's 'specific BLV dataset' phrasing adds no syntax or format detail beyond the schema, so the baseline 3 applies.

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?

States a specific verb+resource (retrieves detailed metadata and resource URLs for a specific BLV dataset) and explicitly names the sibling blv_list_datasets as the discovery path. An agent can distinguish it from the other blv_* tools without opening the schema.

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 'Use case' line explicitly frames the tool as the follow-up to blv_list_datasets for obtaining download URLs, formats, and licence. It clearly conveys when to reach for it, though it does not spell out when-not to use it or name any competing alternative.

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_resultsBlv Get Food Control ResultsA
Read-onlyIdempotent

Cantonal food inspection results and violation rates (Lebensmittelkontrolle).

Use case: compare inspection volumes and violation rates between cantons or across years.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoFilter by year. None = all available.
limitNoMaximum rows to return (default 100).
cantonNoTwo-letter canton abbreviation (e.g. "ZH"). Empty = all.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safe-read profile is covered by structured data. The description adds no behavioral context beyond that — nothing about row caps, result completeness, or what the openWorld external dependency implies.

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, no filler, with the resource identified first and the use case second. Every sentence earns its place.

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?

An output schema exists, so return-value description is unnecessary, and all three optional parameters are documented in the schema. The remaining gap is sibling differentiation against the other BLV statistics tools, which the description never addresses.

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%: year, limit and canton each carry their own description including default semantics ('None = all available', 'Empty = all'). The description adds no syntax or filtering detail beyond the schema, so the baseline 3 applies.

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 concrete resource — cantonal food inspection results and violation rates (Lebensmittelkontrolle) — so the agent knows exactly what domain data it returns. It does not, however, distinguish itself from the closest sibling blv_get_meat_inspection_stats, leaving the agent to infer the boundary from the names alone.

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 explicit 'Use case: compare inspection volumes and violation rates between cantons or across years' sentence tells the agent when this tool is the right pick. It offers no exclusions or named alternatives, so the redirection burden falls entirely on the sibling names.

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_statsBlv Get Meat Inspection StatsA
Read-onlyIdempotent

Slaughterhouse meat inspection statistics (Fleischuntersuchung).

Use case: review slaughter counts and condemnation rates by animal type and year.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoFilter by year (e.g. 2023). None = all.
animal_typeNoFilter by animal type (e.g. "Rind", "Schwein", "Geflügel"). Empty = all.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered by structured data. The description adds the subject matter (slaughter counts and condemnation rates) but says nothing about data source, freshness, or aggregation behavior 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the resource and followed by the use case; no filler. Slightly thin rather than verbose, so a 4 rather than a 5.

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 only two optional, fully-documented params, an output schema present, and annotations covering the read-only behavior, the description supplies enough to call the tool correctly. Only usage routing against siblings is left unaddressed.

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% with clear param docs (year, animal_type, both defaulting to 'all'), so the baseline is 3. The phrase 'by animal type and year' mirrors the schema without adding syntax or format detail.

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?

States a specific verb and resource ('meat inspection statistics' / Fleischuntersuchung) and names the concrete metrics (slaughter counts, condemnation rates), which differentiates it from generic siblings like blv_get_animal_health_stats. It does not explicitly contrast with any sibling, so it falls 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 Guidelines3/5

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

The 'Use case' sentence gives implied guidance about when to reach for this tool, but offers no when-not conditions, prerequisites, or named alternatives among the many sibling stat tools.

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_childrenBlv Get Nutrition Data ChildrenA
Read-onlyIdempotent

Swiss national children's nutrition survey — questionnaire tallies (menuCH-Kids).

Use case: how often each answer was given, broken down by sex, language region and age group.

NOT nutrient intake. The docstring here promised "nutrient intake by age group against dietary recommendations" and named "Energie", "Zucker", "Eisen" as filter examples. The only menuCH-Kids dataset published on opendata.swiss is the questionnaire, and it carries answer counts: Geschlecht, Sprachregion, Altersgruppe, Frage, Antwort, Anzahl. Measured on 2026-08-08. A filter on "Eisen" therefore matched nothing and returned an empty list — indistinguishable from "no such data for this age group".

Nutrient intake for adults exists as a separate dataset (menuch_lebensmittelkonsum); this tool does not cover it, and inventing a mapping would be worse than the missing feature.

ParametersJSON Schema
NameRequiredDescriptionDefault
age_groupNoFilter by age group as the source spells it (e.g. "10bis13").
answer_codeNoFilter by question or answer code (e.g. "c09B_12", "a78").

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior5/5

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

Annotations only cover safety (read-only, idempotent, open-world); the description adds the operational trap that a non-matching filter like 'Eisen' silently returns an empty list indistinguishable from 'no data for this age group', and enumerates the actual returned columns. That is exactly the kind of failure-mode disclosure annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence is well front-loaded, but a large share of the text is meta-commentary arguing with a docstring ('The docstring here promised...', 'inventing a mapping would be worse than the missing feature') rather than operational guidance for the agent. Useful content, but not every sentence earns its place for a two-optional-filter read tool.

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?

An output schema exists so return values need no explanation, yet the description still names the returned fields, and it flags the misleading name and the empty-result ambiguity. The only gap is that it never points to the sibling tools for discovering or cross-referencing other BLV datasets.

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 both parameters carry examples ('10bis13', 'c09B_12'), so the schema already does the heavy lifting. The description only illustrates filter behavior via the 'Eisen' anecdote and adds no syntax or format detail beyond the schema. Baseline 3 applies.

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 opening line states the specific resource and scope ('Swiss national children's nutrition survey — questionnaire tallies (menuCH-Kids)') and explicitly corrects what the name/title wrongly implies by ruling out nutrient intake. It stops short of distinguishing itself from the ten sibling blv_* dataset tools (e.g. blv_list_datasets, blv_get_dataset_info) that an agent might otherwise pick for discovery.

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?

Gives a concrete use case ('how often each answer was given, broken down by sex, language region and age group') and rules out the adjacent case by noting that adult nutrient intake lives in a separate dataset this tool does not cover. It does not, however, name which sibling to call instead or state the condition for choosing it.

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

blv_get_public_warningsBlv Get Public WarningsA
Read-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?".

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of items to return (default 20, max 50).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds one useful trait beyond them: the data is a live RSS feed, implying freshness and no server-side filtering. No information on ordering, pagination, or update frequency though.

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?

Front-loaded with the core statement, followed by a compact use case. Both sentences earn their place, though the use-case sentence slightly restates the purpose already implied by the first.

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?

An output schema exists, so return-value explanation is not needed, and the description covers source and scope adequately for a one-parameter read tool. Minor gaps (result ordering, whether the feed can be empty) remain but are not critical.

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 single 'limit' parameter is fully documented in the schema (default 20, max 50). The description adds nothing about the parameter, so the baseline 3 applies.

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?

States a specific resource (BLV food recalls and public health warnings) and an explicit currency qualifier (current, live RSS feed). It is clear what the tool retrieves, though it does not explicitly distinguish itself from other food/health-data siblings like blv_get_food_control_results or blv_search_animal_diseases.

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 'Use case' line gives a clear triggering scenario with a concrete example question ('which products have been recalled recently?'), which is enough to route the agent here for food-safety-alert questions. It stops short of naming when NOT to use it or pointing to an alternative sibling.

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

blv_list_datasetsBlv List DatasetsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum datasets to return (default 28 = all BLV datasets).
searchNoOptional keyword filter on title/notes.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint and idempotentHint, so the safety profile is covered. The description adds the CKAN backend detail, which is mildly useful for anticipating response shape, but says nothing about pagination, response volume, or rate limits. Adequate but not rich 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, tightly front-loaded: what it does first, then the routing use case. Every clause earns its place with 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?

An output schema exists, so return values need not be explained, and the description covers purpose and routing for a simple two-param listing tool. It could still note that the default limit returns the full BLV set, but nothing essential is missing.

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 both parameters (limit, search) are fully documented in the schema. The description adds no parameter syntax or semantics beyond that, so the baseline 3 applies.

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?

States a specific verb ('Browse') and resource ('all BLV open datasets on opendata.swiss'), plus the backing API (CKAN). It is immediately distinguishable from blv_get_dataset_info, which is the drill-in sibling.

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

Usage Guidelines5/5

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

Explicitly frames the use case: discover datasets before drilling into one with blv_get_dataset_info, or map a topic to a dataset slug. The alternative is named along with the condition that selects it.

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

blv_search_animal_diseasesBlv Search Animal DiseasesA
Read-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?".

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results (default 50).
cantonNoTwo-letter canton abbreviation (e.g. "ZH", "BE"). Empty = all cantons.
diseaseNoDisease name filter (partial match, e.g. "Maul", "Vogelgrippe"). Empty = all.
year_toNoEnd year (default 2024).
year_fromNoStart year (default 2020).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already establish readOnly, idempotent and open-world behavior, so the safety profile is covered. The description adds genuine data-provenance context (InfoSM source, coverage back to 1991), but says nothing about pagination, result limits, or return shape beyond what the output schema presumably carries.

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, front-loaded with the core purpose and then a single illustrative use case. No filler 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?

With annotations, full schema coverage and an existing output schema, the definition supplies what an agent needs: scope, source, and a usage example. The only gap is sibling differentiation, which is minor given the descriptive name and the adequate surrounding 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?

Schema description coverage is 100%, so all five parameters (limit, canton, disease, year_from, year_to) are fully documented in the schema itself. The description adds no parameter-level meaning beyond that, making the baseline 3 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?

States a specific verb and resource ("Search notifiable animal disease cases") plus scope (Switzerland, since 1991, InfoSM). Clear, but it never distinguishes itself from plausible siblings like blv_get_avian_influenza, which an agent might reasonably reach for instead.

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

Usage Guidelines4/5

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

Provides a concrete use case (reporting disease occurrence by canton and year) with a worked example, which gives clear invocation context. It stops short of naming alternatives or stating when not to use this tool over sibling disease/avian-influenza 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_productsBlv Search Pesticide ProductsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results (default 50).
statusNoAuthorization status — "bewilligt" (approved), "widerrufen" (revoked), or "".bewilligt
product_nameNoFilter by product name (partial match). Empty = all.
active_ingredientNoFilter by active ingredient, e.g. "Kupfer", "Glyphosat". Empty = all.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety and repeatability profile is covered elsewhere. The description adds the useful detail that results can include revoked as well as approved products, but says nothing about pagination, ordering, or rate limits. With annotations carrying the main burden, this is adequate but thin.

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, zero filler, with the resource identity front-loaded and the use case immediately after. Nothing is repeated from the title or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is a simple read-only filtered search with a fully documented schema and an output schema, so return values need not be explained. Purpose and use case are covered; only minor operational detail (result ordering, whether status "" means all statuses) is left implicit.

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 all four parameters (limit, status, product_name, active_ingredient) are already documented in the schema, including the enum-like status values and the German examples. The description mentions active ingredients and approval status conceptually but adds no syntax or format meaning beyond the schema. Baseline 3 applies.

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?

States a specific verb (Search) and a precisely named resource (the Swiss approved pesticide register / Pflanzenschutzmittelverzeichnis), plus the domain use case of approval checking. This is unmistakably distinct from every sibling tool (animal diseases, food control, avian influenza, etc.), so an agent can route to it without opening the schema.

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 "Use case" line tells the agent exactly which question this tool answers: whether a plant-protection product or active ingredient is approved or revoked in Switzerland. It does not name any alternative tool or state exclusions, so it stops short of the 5-level bar, but the intended context is clear.

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. 1 tool updatev1.2.0
    • Changedblv_get_nutrition_data_children3 fields changed
      • changedInput schema / properties / age_group / description
        Previous value: -"Filter by age group (e.g. \"6-9\", \"10-12\"). Empty = all."New value: +"Filter by age group as the source spells it (e.g. \"10bis13\")."
      • addedInput schema / properties / answer_code
        Added value: +{
        +  "default": "",
        +  "description": "Filter by question or answer code (e.g. \"c09B_12\", \"a78\").",
        +  "type": "string"
        +}
      • removedInput schema / properties / nutrient
        Removed value: -{
        -  "default": "",
        -  "description": "Filter by nutrient name (e.g. \"Energie\", \"Zucker\", \"Eisen\"). Empty = all.",
        -  "type": "string"
        -}
  2. 11 tool updatesv1.1.0
    • First observedblv_get_animal_health_stats
    • First observedblv_get_antibiotic_usage_vet
    • First observedblv_get_avian_influenza
    • First observedblv_get_dataset_info
    • First observedblv_get_food_control_results
    • First observedblv_get_meat_inspection_stats
    • First observedblv_get_nutrition_data_children
    • First observedblv_get_public_warnings
    • First observedblv_list_datasets
    • First observedblv_search_animal_diseases
    • First observedblv_search_pesticide_products

TDQS

A3.9/5.0

Scored across 11 tools

Disambiguation4/5

Most tools target distinct data sources and actions, but there is some overlap among animal-health tools (blv_search_animal_diseases, blv_get_animal_health_stats, blv_get_avian_influenza) that could lead to misselection. The descriptions help differentiate them, but avian influenza is a subset of notifiable diseases, creating a mild ambiguity.

Naming Consistency5/5

All tools use a consistent blv_verb_noun pattern with snake_case and clear verbs (get, list, search). This makes the set predictable and easy to scan.

Tool Count5/5

With 11 tools, the set is well-scoped for a national food safety data server. Each tool covers a distinct dataset or query type, and none appear redundant or trivial.

Completeness4/5

The tool surface broadly covers recalls, datasets, animal health, inspections, pesticides, and nutrition, but there is a notable gap: adult nutrient intake data exists separately yet is not covered. The children's nutrition tool also only returns questionnaire tallies, which may surprise agents expecting intake data.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers