Listed from the MCP registry; nobody on Odel publishes it.
Swiss open data MCP server. 94 tools, zero API keys. Transport, weather, geodata, catalogue.
Runs on your machine from its package; the steps are below.
At most: only reads or looks up information.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted โ your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
npx -y mcp-swiss
MCP client config
{
"mcpServers": {
"switzerland-mcp": {
"command": "npx",
"args": [
"-y",
"mcp-swiss"
]
}
}
}Swiss open data for AI โ zero config, zero API keys
Install ยท Tools ยท Demo ยท Data Sources
mcp-swiss is a Model Context Protocol server that gives any AI assistant direct access to Swiss open data โ trains, weather, rivers, maps, and companies.
94 tools. No API keys. No registration. No server to run. Just npx mcp-swiss.
๐ Transport โ SBB, PostBus, trams, live departures, journey planning
๐ค๏ธ Weather โ MeteoSwiss live conditions + historical data
๐ Hydrology โ BAFU river & lake levels (great for Aare swimming!)
๐บ๏ธ Geodata โ swisstopo geocoding, solar potential, geographic layers
๐ข Companies โ ZEFIX federal registry, all 700K+ Swiss companies
๐ Holidays โ Swiss public & school holidays by canton
๐๏ธ Parliament โ Bills, votes, members, speeches, cantonal affairs (OpenParlData.ch)
๐๏ธ Avalanche โ SLF danger bulletins and warning regions
๐จ Air Quality โ NABEL stations, Swiss legal limits (LRV)
๐ฎ Swiss Post โ Postcode lookup and parcel tracking
โก Energy โ Electricity tariffs by municipality (ElCom)
๐ Statistics โ Population, demographics, BFS datasets
๐ฆ SNB Rates โ Swiss National Bank CHF exchange rates, historical data
โป๏ธ Recycling โ Zurich city waste collection calendar (OpenERZ)
๐ฐ Swiss News โ SRF news headlines and keyword search
๐ณ๏ธ Voting โ Swiss popular vote results (Basel-Stadt open data)
๐ Dams โ Swiss federal dam registry (SFOE/swisstopo)
๐ฅพ Hiking โ Swiss trail closures and hiking alerts (swisstopo)
๐ Real Estate โ Swiss property prices, rent index, housing data (BFS)
๐ Traffic โ ASTRA counting stations, daily volumes
๐ Earthquakes โ Swiss Seismological Service (SED/ETH Zรผrich), FDSN API
โ๏ธ Snow โ SLF snow depth, stations, and measurements
๐ฟ Pollen โ MeteoSwiss pollen concentrations at the published stations
๐ Buildings โ Federal register of buildings and dwellings (GWR)
๐ Catalogue โ opendata.swiss dataset search, metadata, and downloads
๐ก๏ธ Meteo OGD โ SwissMetNet stations and measurements (STAC CSV)
๐งญ Map layers โ geo.admin layer search, identify, and attribute find
๐ SBB Data โ station passengers, punctuality, and step-free access
npx mcp-swiss
That's it. No API keys, no .env files, no accounts. Pick your client below and paste the config.
.mcpb bundles work with Claude Desktop and any MCP Bundle-compatible app.
Open the downloaded file โ your app handles the rest. No config editing, no terminal, no API keys.
Edit your config file:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json~/.config/Claude/claude_desktop_config.json{
"mcpServers": {
"swiss": {
"command": "npx",
"args": ["-y", "mcp-swiss"]
}
}
}
Restart Claude Desktop after saving.
claude mcp add swiss -- npx -y mcp-swiss
That's it โ Claude Code will use it in your next session.
Requires Cursor 0.45.6+
Option A: Project config โ create .cursor/mcp.json in your project root:
{
"mcpServers": {
"swiss": {
"command": "npx",
"args": ["-y", "mcp-swiss"]
}
}
}
Option B: Global config โ create ~/.cursor/mcp.json:
{
"mcpServers": {
"swiss": {
"command": "npx",
"args": ["-y", "mcp-swiss"]
}
}
}
Option C: Via Cursor Settings UI
# VS Code
code --add-mcp '{"name":"swiss","command":"npx","args":["-y","mcp-swiss"]}'
# VS Code Insiders
code-insiders --add-mcp '{"name":"swiss","command":"npx","args":["-y","mcp-swiss"]}'
Add to your VS Code User Settings (JSON) โ press Ctrl+Shift+P โ Preferences: Open User Settings (JSON):
{
"mcp": {
"servers": {
"swiss": {
"command": "npx",
"args": ["-y", "mcp-swiss"]
}
}
}
}
Or add to .vscode/mcp.json in your workspace (shareable with your team):
{
"servers": {
"swiss": {
"command": "npx",
"args": ["-y", "mcp-swiss"]
}
}
}
Add to ~/.codeium/windsurf/model_config.json:
{
"mcpServers": {
"swiss": {
"command": "npx",
"args": ["-y", "mcp-swiss"]
}
}
}
Open VS Code settings.json and add:
{
"cline.mcpServers": {
"swiss": {
"command": "npx",
"args": ["-y", "mcp-swiss"]
}
}
}
mcp-swiss uses stdio transport and requires no environment variables. Upstream calls time out after 30 seconds (MCP_SWISS_TIMEOUT_MS overrides that) and retry once on a dropped connection or a rate limit. The universal config:
{
"command": "npx",
"args": ["-y", "mcp-swiss"]
}
This works with any MCP-compatible client โ just plug it in.
docker pull vikramgorla/mcp-swiss
Use with any MCP client that supports Docker-based servers. The container uses stdio transport:
# Run directly (stdio)
docker run -i vikramgorla/mcp-swiss
# Use with Claude Desktop
For Claude Desktop, update your config to use Docker:
{
"mcpServers": {
"swiss": {
"command": "docker",
"args": ["run", "-i", "--rm", "vikramgorla/mcp-swiss"]
}
}
}
Also available on GitHub Container Registry:
docker pull ghcr.io/vikramgorla/mcp-swiss
stdio is still the default. For a local HTTP client, run:
npx mcp-swiss --http
That listens on 127.0.0.1:3000 and serves MCP at POST /mcp (also GET and DELETE) plus GET /health. --port, --host, PORT, HOST, and MCP_TRANSPORT=http are the other switches.
A bind that is not loopback (127.0.0.1, localhost, or ::1) refuses to start unless both MCP_AUTH_TOKEN and MCP_ALLOWED_HOSTS are set. Sessions are capped (MCP_MAX_SESSIONS, default 64) and idle ones expire. This is the transport half of #64. It does not deploy a hosted instance.
By default, mcp-swiss loads all 27 modules (94 tools). The full tools/list schema is about 9,300 tokens (37,011 characters). For a smaller startup list, load only the modules you need.
Search, then execute. The server lists three meta-tools instead of every schema (about 330 tokens versus about 9,300):
{
"mcpServers": {
"swiss": {
"command": "npx",
"args": ["-y", "mcp-swiss", "--discovery"]
}
}
}
MCP_SWISS_MODE=discovery and --mode discovery do the same thing. swiss_search_tools finds tools by keyword or module and returns their input schemas. swiss_call_tool checks those arguments, then runs the tool. swiss_list_modules is the catalog. The default, with no flag, is still the full tool list.
{
"mcpServers": {
"swiss": {
"command": "npx",
"args": ["-y", "mcp-swiss", "--modules", "transport,weather"]
}
}
}
{
"mcpServers": {
"swiss": {
"command": "npx",
"args": ["-y", "mcp-swiss", "--preset", "commuter"]
}
}
}
| Preset | Modules | Tools | Token Savings |
|---|---|---|---|
commuter | transport, weather, holidays | 14 | 83% |
outdoor | weather, avalanche, hiking, earthquakes, dams, snow, pollen | 22 | 74% |
business | companies, geodata, post, energy, statistics, snb, gwr | 27 | 68% |
citizen | parliament, voting, holidays, news | 17 | 80% |
minimal | transport | 5 | 94% |
full | all 27 modules (default) | 94 | โ |
Combine preset + modules: --preset commuter --modules parliament
List available: npx mcp-swiss --list-modules or npx mcp-swiss --list-presets
Once connected, try asking your AI:
| Prompt | What it uses |
|---|---|
| "Next 5 trains from Zรผrich HB to Geneva" | get_connections |
| "Is the Aare in Bern warm enough to swim?" | get_water_level |
| "Weather in Lugano vs Zรผrich today" | get_weather |
| "Find blockchain companies registered in Zug" | search_companies |
| "Solar potential of Bundesplatz 3, Bern" | geocode + get_solar_potential |
| "Live departures from Bern HB" | get_departures |
| "What rivers are near Thun?" | list_hydro_stations + get_water_level |
| "Plan my Saturday: train to Interlaken, check weather" | Multiple tools chained |
| "Is next Monday a holiday in Zรผrich?" | get_public_holidays |
| "What did the Swiss parliament vote on recently?" | search_parliament_business |
| "What's the avalanche danger level in the Bernese Alps?" | get_avalanche_bulletin |
| "What's the postcode for Zermatt?" | search_postcode |
| "Track my Swiss Post parcel 99.12.345678.12345678" | track_parcel |
| "How much does electricity cost in Zรผrich vs Basel?" | search_municipality_energy + compare_electricity_tariffs |
| "What's the population of canton Zug?" | get_population |
94 tools across 27 modules. Full specifications:
docs/tool-specs.mdยท Machine-readable:docs/tools.schema.json
| Tool | Description |
|---|---|
search_stations | Find stations/stops by name or location |
get_connections | Journey planner between any two points |
get_departures | Live departures from a station |
get_arrivals | Live arrivals at a station |
get_nearby_stations | Stations near coordinates |
| Tool | Description |
|---|---|
get_weather | Current conditions at a MeteoSwiss station |
list_weather_stations | All ~160 MeteoSwiss stations with metadata |
get_weather_history | Historical weather data (up to 32 days) |
get_water_level | River/lake level + temperature (BAFU) |
list_hydro_stations | All 400+ hydrological monitoring stations |
get_water_history | Historical hydrology data |
| Tool | Description |
|---|---|
geocode | Swiss address โ coordinates |
reverse_geocode | Coordinates โ Swiss address |
search_places | Swiss place names, mountains, lakes, features |
get_solar_potential | Rooftop solar irradiation at a location |
identify_location | All geographic data layers at a point |
get_municipality | Municipality info by name |
| Tool | Description |
|---|---|
search_companies | Search by name, canton, legal form |
get_company | Full company details by ZEFIX ehraid |
search_companies_by_locality | Companies seated in a commune or town (ZEFIX has no street search) |
list_cantons | All 26 Swiss cantons |
list_legal_forms | AG, GmbH, and all Swiss legal forms |
| Tool | Description |
|---|---|
get_public_holidays | Swiss public holidays by year, optionally filtered by canton |
get_school_holidays | School holiday periods by year and canton |
is_holiday_today | Quick check if today is a public holiday |
| Tool | Description |
|---|---|
search_parliament_business | Search federal political affairs (bills, motions, questions) |
get_parliament_members | List parliament members by canton, party, or activity |
get_parliament_votes | Voting results for a specific affair |
get_session_schedule | Upcoming/recent parliament sessions |
search_parliament_speeches | Debate speeches for an affair |
get_politician_interests | Declared interests and mandates of a member |
search_cantonal_affairs | Search across 26 cantonal parliaments |
get_parliamentary_documents | Official documents for an affair |
get_committee_meetings | Committee/commission meeting schedule |
| Tool | Description |
|---|---|
get_avalanche_bulletin | Live SLF bulletin: danger level, problems, advice for a region or coordinate |
list_avalanche_regions | The 135 SLF/EAWS warning regions |
| Tool | Description |
|---|---|
list_air_quality_stations | All 16 NABEL monitoring stations, plus any code the live layer adds |
get_air_quality | Station info, Swiss legal limits (LRV), and BAFU data links |
| Tool | Description |
|---|---|
lookup_postcode | PLZ โ locality, canton, coordinates |
search_postcode | City name โ matching postcodes |
list_postcodes_in_canton | All postcodes in a canton |
track_parcel | Generate Swiss Post tracking URL for a parcel |
| Tool | Description |
|---|---|
get_electricity_tariff | Electricity tariff by municipality with component breakdown |
compare_electricity_tariffs | Compare electricity prices across municipalities |
search_municipality_energy | Find municipality ID for tariff lookup |
| Tool | Description |
|---|---|
get_population | Population by canton or municipality from BFS STATPOP |
search_statistics | Search BFS datasets on opendata.swiss |
get_statistic | Fetch detailed dataset information |
| Tool | Description |
|---|---|
list_currencies | List all currencies available from the Swiss National Bank (SNB) |
get_exchange_rate | Get the current CHF exchange rate for any currency |
get_exchange_rate_history | Get historical monthly CHF exchange rates with date filtering |
| Tool | Description |
|---|---|
get_waste_collection | Next waste collection dates by Zurich ZIP code and waste type |
list_waste_types | List all supported waste types with descriptions |
get_waste_calendar | Full waste collection calendar for a ZIP code (upcoming dates) |
| Tool | Description |
|---|---|
get_swiss_news | Latest Swiss headlines from SRF by category (Switzerland/international/economy) |
search_swiss_news | Search SRF news by keyword across all categories |
| Tool | Description |
|---|---|
get_voting_results | Swiss popular vote results from Basel-Stadt open data |
search_votes | Search popular votes by keyword (German/French/Italian) |
get_vote_details | Detailed per-district breakdown of a specific vote |
| Tool | Description |
|---|---|
search_dams | Search Swiss federal dams by name or keyword |
get_dams_by_canton | List all federal dams in a canton |
get_dam_details | Detailed info on a specific dam (height, volume, purpose) |
| Tool | Description |
|---|---|
get_trail_closures | Swiss trail closures and hiking alerts from swisstopo |
get_trail_closures_nearby | Trail closures near given coordinates |
| Tool | Description |
|---|---|
search_buildings | Find buildings in the federal register (GWR) by address and return EGIDs |
get_building | Full building record by EGID: year, floors, heating, parcel, entrances, dwellings |
buildings_near | Buildings nearest a WGS84 point, closest first |
| Tool | Description |
|---|---|
get_property_price_index | Swiss property price index (BFS Immo-Monitoring) |
search_real_estate_data | Search BFS real estate datasets on opendata.swiss |
get_rent_index | Swiss rent index and housing cost data from BFS |
| Tool | Description |
|---|---|
get_traffic_count | Traffic counting station data (ASTRA) โ daily volumes and heavy traffic share |
get_traffic_by_canton | List ASTRA traffic counting stations filtered by canton |
get_traffic_nearby | Find traffic counting stations near given coordinates |
| Tool | Description |
|---|---|
get_recent_earthquakes | Recent seismic events in/around Switzerland from the Swiss Seismological Service (SED) at ETH Zรผrich |
get_earthquake_details | Full details for a specific seismic event by SED event ID |
search_earthquakes_by_location | Earthquakes near given coordinates with configurable radius, time range, and limit |
| Tool | Description |
|---|---|
get_snow_conditions | Current snow depth and new snow (24h) across Switzerland from SLF IMIS stations, filterable by canton/altitude |
list_snow_stations | All 307 SLF snow measurement stations (IMIS automatic + manual study plots) |
get_snow_measurements | Detailed snow and weather measurements for a specific SLF station |
| Tool | Description |
|---|---|
get_pollen_current | Current hourly pollen concentrations at a published MeteoSwiss station |
get_pollen_daily | Daily pollen averages over a configurable range |
list_pollen_stations | Published MeteoSwiss pollen stations (the list is no longer a frozen 16) |
| Tool | Description |
|---|---|
search_opendata | Search the opendata.swiss catalogue (CKAN) by keyword, optionally limited to one publisher |
get_opendata_dataset | Metadata for one dataset: publisher, description, keywords, and a short resource summary |
list_opendata_resources | Download links and services for a dataset, with an optional format filter |
| Tool | Description |
|---|---|
list_ogd_stations | Stations in a MeteoSwiss OGD STAC collection (SwissMetNet by default, plus precipitation, climate, phenology, and totaliser networks) |
get_ogd_recent | Latest measurements for one station, parsed from the now/recent CSV asset |
get_ogd_history | Historical measurements for a date range, parsed from the historical or recent CSV assets |
| Tool | Description |
|---|---|
search_map_layers | Search or list layers in the geo.admin ech MapServer catalogue |
identify_map_layer | Features at a WGS84 point on one layer, keeping the current version of time-series layers |
find_map_features | Find features on one layer by attribute value |
| Tool | Description |
|---|---|
get_station_passengers | Average daily, weekday, and weekend boardings and alightings at an SBB station |
get_station_punctuality | Previous-day arrival and departure punctuality, delays, and cancellations |
get_station_accessibility | Platform length and rail-free (step-free) access |
All official Swiss open data โ no API keys required:
| Source | Data | Docs |
|---|---|---|
| transport.opendata.ch | SBB, PostBus, trams | API docs |
| api.existenz.ch | MeteoSwiss weather + BAFU hydrology | API docs |
| api3.geo.admin.ch | swisstopo federal geodata | API docs |
| zefix.admin.ch | Federal company registry | Swagger |
| openholidaysapi.org | Swiss public & school holidays | API docs |
| OpenParlData.ch | Swiss Parliament data โ federal & cantonal (CC BY 4.0) | API docs |
| whiterisk.ch / aws.slf.ch | SLF/WSL avalanche bulletins | SLF |
| geo.admin.ch โ BAFU/NABEL | Swiss air quality monitoring stations | BAFU NABEL |
| geo.admin.ch โ swisstopo | Swiss postcodes (Amtliches Ortschaftenverzeichnis) | geo.admin.ch |
| strompreis.elcom.admin.ch | ElCom electricity tariffs by municipality | ElCom |
| pxweb.bfs.admin.ch + opendata.swiss | BFS population statistics (STATPOP) + datasets | BFS |
| data.snb.ch | Swiss National Bank CHF exchange rates | SNB data portal |
| openerz.metaodi.ch | Zurich waste collection calendar (OpenERZ) | OpenERZ |
| srf.ch | SRF Swiss news headlines | SRF |
| data.bs.ch | Basel-Stadt popular vote results | Open Data BS |
| geo.admin.ch โ SFOE | Swiss federal dam registry | SFOE |
| geo.admin.ch โ swisstopo | Swiss trail closures and hiking alerts | swisstopo |
| pxweb.bfs.admin.ch | BFS property prices + rent index | BFS housing |
| geo.admin.ch โ ASTRA | Traffic counting stations + daily volumes | ASTRA |
| arclink.ethz.ch | Swiss Seismological Service earthquakes (SED/ETH) | SED |
| measurement-api.slf.ch | SLF snow depth + measurements (IMIS + study plots, CC BY 4.0) | SLF |
| data.geo.admin.ch | MeteoSwiss pollen concentrations (16 automatic stations, CC BY) | MeteoSwiss |
| api3.geo.admin.ch | Federal map layers: search, identify, and attribute find | geo.admin API |
| data.geo.admin.ch STAC | MeteoSwiss OGD station measurements (CSV assets, CC BY) | MeteoSwiss open data |
| ckan.opendata.swiss | National open data catalogue (datasets and resources) | opendata.swiss |
| data.sbb.ch | SBB station passengers, punctuality, and platform accessibility | SBB Open Data |
# Clone
git clone https://github.com/vikramgorla/mcp-swiss.git
cd mcp-swiss
# Install deps
npm install
# Build
npm run build
# Run in dev mode
npm run dev
# Test with MCP Inspector
npx @modelcontextprotocol/inspector node dist/index.js
npm test
We welcome contributions! mcp-swiss follows a strict PR-based workflow to keep the codebase clean and CI always green.
CONTRIBUTING.md โ full contributor guide:
any, 50K response limit, zero API keys)RELEASING.md โ release process for maintainers:
ci.yml, release.yml, beta.yml, mcp-registry.yml)MCP_SWISS_TIMEOUT_MS โ per-request upstream timeout in milliseconds (default 30000)MIT โ see LICENSE