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.
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"
]
}
}
}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 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.3412MIT
Related MCP Connectors
opendata.swiss MCP β Switzerland's federal open-data portal (CKAN catalogue).
Hosted MCP server exposing US hospital procedure cost data to AI assistants
This MCP server provides seamless access to Malaysia's government open data, including datasets, wβ¦
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