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.
76 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
npx mcp-swissThat'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:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.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-swissThat'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
- Open Cursor Settings
- Go to Features → MCP Servers
- Click + Add new global MCP server
- Paste the JSON config above
# 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. The universal config:
{
"command": "npx",
"args": ["-y", "mcp-swiss"]
}This works with any MCP-compatible client — just plug it in.
docker pull vikramgorla/mcp-swissUse 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 DesktopFor 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-swissBy default, mcp-swiss loads all 21 modules (76 tools). For better token efficiency, load only the modules you need:
{
"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 | 81% |
outdoor |
weather, avalanche, hiking, earthquakes, dams, snow | 19 | 75% |
business |
companies, geodata, post, energy, statistics, snb | 24 | 67% |
citizen |
parliament, voting, holidays, news | 17 | 77% |
minimal |
transport | 5 | 93% |
full |
all 21 modules (default) | 76 | — |
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 |
76 tools across 21 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_address |
Companies registered at an address |
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 |
🏛️ Parliament (9 tools) — OpenParlData.ch
| 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 |
Current avalanche bulletin with danger levels and PDF links |
list_avalanche_regions |
All 22 Swiss avalanche warning regions |
| Tool | Description |
|---|---|
list_air_quality_stations |
All 14 NABEL monitoring stations |
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 |
|---|---|
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 |
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 |
# 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.jsnpm testWe welcome contributions! mcp-swiss follows a strict PR-based workflow to keep the codebase clean and CI always green.
-
CONTRIBUTING.md— full contributor guide:- Development setup (clone, install, build, test)
- Branch model (develop / main / feature branches)
- Hard workflow rules (no direct pushes, always PRs, regular merge only)
- Adding a new module (step-by-step with code templates)
- Integration checklist (all files to update)
- Code standards (TypeScript, no
any, 50K response limit, zero API keys)
-
RELEASING.md— release process for maintainers:- Step-by-step release workflow
- Pre-release checklist
- Version strategy (minor for features, patch for fixes)
- Post-release verification
- CI/CD workflow reference (
ci.yml,release.yml,beta.yml,mcp-registry.yml)
- Node.js 20+
- No API keys or accounts needed
MIT — see LICENSE