search_stations
Search public transport stations/stops by name or coordinates
xytypequeryio.github.vikramgorlaPublished by GitHub account vikramgorlav0.9.0Updated Nov 3, 2026
Swiss open data MCP server. 94 tools, zero API keys. Transport, weather, geodata, catalogue.
Switzerland MCP 🇨🇭's local MCP server; no sign-in required; STDIO; 94 tools.
No AI overview yet: these facts come from the registry entry and the server itself.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Follow the launch instructions in the repository.
Swiss open data for AI — zero config, zero API keys
[npm] [CI] [License] [MCP] [Downloads] [Stars] [Node] [.mcpb] [Claude Desktop] [MCP Registry] [Awesome MCP Servers] [Glama]
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.
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.jsonRestart Claude Desktop after saving.
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:
Option B: Global config — create ~/.cursor/mcp.json:
Option C: Via Cursor Settings UI
[Install in VS Code] [Install in VS Code Insiders]
Add to your VS Code User Settings (JSON) — press Ctrl+Shift+P → Preferences: Open User Settings (JSON):
Or add to .vscode/mcp.json in your workspace (shareable with your team):
Add to ~/.codeium/windsurf/model_config.json:
Open VS Code settings.json and add:
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:
This works with any MCP-compatible client — just plug it in.
Use with any MCP client that supports Docker-based servers. The container uses stdio transport:
For Claude Desktop, update your config to use Docker:
Also available on GitHub Container Registry:
stdio is still the default. For a local HTTP client, run:
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):
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.
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:
94 tools across 27 modules. Full specifications:
docs/tool-specs.md· Machine-readable:docs/tools.schema.json
All official Swiss open data — no API keys required:
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
Source: README.md at commit c12e6e5
Search public transport stations/stops by name or coordinates
xytypequeryTrain/bus connections between two locations
torequireddatefromrequiredtimelimitisArrivalTimeLive departures from a station
limitstationrequireddatetimeLive arrivals at a station
limitstationrequireddatetimeStations near coordinates
xrequiredyrequiredlimitdistanceCurrent weather at a MeteoSwiss station. For past dates use get_weather_history
stationrequiredList MeteoSwiss weather station codes
Takes no parameters.
Historical weather readings for a MeteoSwiss station. Only the last 32 days are available
stationrequiredend_daterequiredresolutionstart_daterequiredCurrent river/lake level and temperature at a BAFU hydro station
stationrequiredList BAFU hydro station IDs (rivers, lakes)
Takes no parameters.
Historical river/lake levels for a BAFU hydro station. Only the last 32 days are available
stationrequiredend_daterequiredresolutionstart_daterequiredAddress or place name to WGS84 coordinates (swisstopo)
addressrequiredWGS84 coordinates to address (swisstopo)
latrequiredlngrequiredSearch place names, localities, mountains, geographic features
queryrequiredRooftop solar potential at a location
latrequiredlngrequiredGeographic features and swisstopo data layers at a location
latrequiredlngrequiredlayersMunicipality info by name
namerequiredSearch the ZEFIX commercial register by company name, optionally filtered by canton/legal form
namerequiredlimitcantonlegal_formFull company details by ZEFIX ehraid (from search_companies)
ehraidrequiredCompanies whose registered seat is in a commune/town. ZEFIX has no street-address search
namelimitlocalityrequiredList cantons with codes
Takes no parameters.
List company legal forms (AG, GmbH, ...) with the ids used by search_companies
Takes no parameters.
Public holidays for a year, national and cantonal
yearrequiredcantonSchool holiday periods for a year, by canton
yearrequiredcantonWhether today is a public holiday
cantonFull-text search of federal parliament affairs (bills, motions, interpellations, postulates, questions, initiatives). For cantonal parliaments use search_cantonal_affairs
limitqueryrequiredFederal parliament members (National Council, Council of States), filterable by canton/party
limitpartyactivecantonRecorded votes on a parliamentary affair (Geschäft)
affair_idrequiredUpcoming and recent federal parliament sessions
limitDebate speeches on a parliamentary affair
limitaffair_idrequiredDeclared interests and mandates (boards, consulting roles) of a federal parliament member
person_idrequiredSearch affairs in a cantonal parliament (Kantonsrat), all 26 cantons
limitquerycantonrequiredOfficial documents (reports, committee opinions, Federal Council statements) for a parliamentary affair
limitaffair_idrequiredFederal parliament committee meeting schedule
limitgroup_idLive SLF avalanche bulletin: danger level (1-5), avalanche problems with aspect and elevation, validity and advice text, for one warning region, a coordinate, or all of Switzerland. Outside the winter season it reports that no bulletin is in force
latlondateregionlanguageThe 135 SLF/EAWS avalanche warning regions (id, name, canton) for get_avalanche_bulletin
cantonsearchList NABEL air-quality monitoring stations (BAFU/Empa)
Takes no parameters.
NABEL station info: location, environment type, legal limits (LRV) and a link to BAFU live data (no measurements returned)
stationrequiredLocality, canton and coordinates for a postcode (PLZ)
postcoderequiredPostcodes (PLZ) for a city/locality name
city_namerequiredList postcodes (PLZ) in a canton
cantonrequiredSwiss Post tracking page URL for a tracking number (no live status: there is no public tracking API)
tracking_numberrequiredElCom electricity tariff (Rp./kWh) for a municipality, with component breakdown
yearcategorymunicipalityrequiredCompare electricity tariffs across 2–20 municipalities
yearcategorymunicipalitiesrequiredFind municipality BFS numbers for the electricity tariff tools
namerequiredPermanent resident population (BFS STATPOP) for Switzerland, a canton or all cantons
yearcantonSearch BFS datasets on opendata.swiss
limitqueryrequiredDetails and resource links for a BFS dataset by opendata.swiss ID (from search_statistics)
dataset_idrequiredList currencies with SNB CHF exchange rates
Takes no parameters.
Latest SNB monthly-average CHF exchange rate for a currency
currencyrequiredHistorical SNB monthly-average CHF exchange rates (default: last 90 months)
tofromcurrencyrequiredUpcoming waste collection dates for a ZIP code. Zurich city only (8001–8099, OpenERZ)
ziprequiredtypelimitList waste collection types. Zurich city only (OpenERZ)
Takes no parameters.
Monthly waste collection calendar for a ZIP code. Zurich city only (8001–8099, OpenERZ)
ziprequiredyearmonthLatest SRF news headlines
limitcategoryKeyword search in current SRF headlines (all categories)
limitqueryrequiredPopular vote (Volksabstimmung) results as counted in Basel-Stadt: national and cantonal votes since 2021
yearlimitSearch popular votes by title keyword (Basel-Stadt results)
limitqueryrequiredPer-district Basel-Stadt results (Basel, Riehen, Bettingen, abroad) for one vote. Give vote_title and/or date
datevote_titleSearch federally supervised dams by dam or reservoir name (SFOE)
queryrequiredFederally supervised dams in a canton
limitcantonrequiredFull technical details of one dam by name
namerequiredCurrent hiking trail closures and detours (ASTRA/Schweizer Wanderwege)
typelimitreasonHiking trail closures and detours near a WGS84 point
latrequiredlonrequiredradiusBFS residential property price index (IMPI), quarterly since 2017Q1, Q4 2019 = 100
tofromtypeSearch opendata.swiss for real-estate/housing datasets (prices, rents, construction, vacancies)
limitqueryrequiredBFS consumer price index (CPI/LIK, incl. rents), monthly, Dec 1982 = 100. Not a dedicated rent index; for purchase prices use get_property_price_index
yearlimitASTRA traffic counting station volumes by location name
locationrequiredASTRA traffic counting stations in a canton (max 20)
cantonrequiredASTRA traffic counting stations near a WGS84 point
latrequiredlonrequiredradiusRecent earthquakes in and around Switzerland (SED, ETH Zürich)
dayslimitmin_magnitudeinclude_blastsFull details of one seismic event by SED event ID
event_idrequiredEarthquakes within a radius of a WGS84 point (SED)
latrequiredlonrequireddayslimitradius_kmmin_magnitudeCurrent snow depth and 24h new snow at SLF IMIS stations, deepest first
limitcantonmin_altitudeList SLF snow stations (IMIS automatic, manual study plots)
typelimitcantonMeasurements for one SLF station: IMIS 30-min snow/weather data, or study-plot daily snow data
typestation_coderequiredLatest hourly pollen concentrations (alder, birch, hazel, beech, ash, oak, grasses) at a MeteoSwiss station
stationrequiredDaily average pollen concentrations at a MeteoSwiss station
daysstationrequiredList MeteoSwiss pollen stations
cantonFind buildings in the federal buildings register (GWR/RegBL) by address; gives EGIDs for get_building
limitaddressrequiredFull GWR record of one building by EGID: construction, floors, areas, heating/hot-water system and energy source, parcel (EGRID), entrances, dwellings
egidrequiredmax_dwellingsGWR buildings nearest a WGS84 point (small radius), with EGIDs
latrequiredlonrequiredlimitradiusSearch the Swiss open data catalogue (opendata.swiss) for datasets. Returns titles, publishers, and dataset ids. Optional organization slug narrows results to one publisher (e.g. bundesamt-fur-statistik-bfs). Source: opendata.swiss CKAN API.
limitqueryrequiredorganizationGet metadata for one opendata.swiss dataset by its catalogue name or UUID. Includes the publisher, description, keywords, and a short resource summary. Use list_opendata_resources for the full download list.
dataset_idrequiredList downloadable resources (files and services) for an opendata.swiss dataset. Optional format filter such as CSV, JSON, or WMS.
limitformatdataset_idrequiredList MeteoSwiss Open Government Data stations from a STAC collection on data.geo.admin.ch. Defaults to SwissMetNet automatic weather stations (smn). Other station collections: smn-precip, smn-tower, nime, nbcn, nbcn-precip, obs, phenology, tot. Filter by canton or a name/code search.
limitquerycantoncollectionGet the latest MeteoSwiss OGD measurements for one station by reading the STAC CSV asset (10-minute/hourly 'now' file when available, otherwise the recent file). Times are Swiss local time. Use list_ogd_stations for codes such as BER, SMA, LUG.
limitstationrequiredcollectionparametersgranularityGet historical MeteoSwiss OGD measurements for one station and date range by parsing the STAC CSV assets. Daily data defaults to the smaller recent/historical files. Hourly history is limited to 14 days because decade files are large. Times are Swiss local time (no offset).
limitstationrequiredend_daterequiredcollectionparametersstart_daterequiredgranularitySearch or list layers in the geo.admin ech MapServer catalogue (all federal geospatial layers). Returns layer ids that identify_map_layer and find_map_features accept. Without a query, returns the first page of layers alphabetically.
limitownerqueryIdentify geo.admin features at a WGS84 point on one ech MapServer layer. Use search_map_layers to find the layer id. Historical time-series layers keep only the current feature unless include_historical is true.
latrequiredlngrequiredlanglayerrequiredlimittoleranceinclude_historicalFind geo.admin features on one ech MapServer layer by an attribute value. Identify a point first if you need the attribute names. Example: layer ch.swisstopo.swissboundaries3d-gemeinde-flaeche.fill, search_field gemname, search_text Bern.
layerrequiredlimitcontainssearch_textrequiredsearch_fieldrequiredinclude_historicalPassenger counts for an SBB station from the data.sbb.ch frequency dataset. Returns average daily, weekday, and weekend boardings and alightings (Ein- und Aussteigende). Newest year first.
yearlimitstationrequiredcontainsPunctuality for an SBB stop on the previous operating day (ist-daten-sbb target vs actual times). Returns stop counts, arrival and departure delay counts, cancellations, and a short sample of delayed arrivals. A stop is delayed when SBB flags it, which is generally a delay of about three minutes or more.
linelimitstationrequiredcontainsPlatform accessibility for an SBB station: platform number, length, type, and whether access is rail-free (step-free). Source: data.sbb.ch platform dataset.
limitstationrequiredcontains90% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
🚆 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 accessnpx mcp-swiss{ "mcpServers": { "swiss": { "command": "npx", "args": ["-y", "mcp-swiss"] } }}claude mcp add swiss -- npx -y mcp-swiss{ "mcpServers": { "swiss": { "command": "npx", "args": ["-y", "mcp-swiss"] } }}{ "mcpServers": { "swiss": { "command": "npx", "args": ["-y", "mcp-swiss"] } }}# VS Codecode --add-mcp '{"name":"swiss","command":"npx","args":["-y","mcp-swiss"]}'
# VS Code Insiderscode-insiders --add-mcp '{"name":"swiss","command":"npx","args":["-y","mcp-swiss"]}'{ "mcp": { "servers": { "swiss": { "command": "npx", "args": ["-y", "mcp-swiss"] } } }}{ "servers": { "swiss": { "command": "npx", "args": ["-y", "mcp-swiss"] } }}{ "mcpServers": { "swiss": { "command": "npx", "args": ["-y", "mcp-swiss"] } }}{ "cline.mcpServers": { "swiss": { "command": "npx", "args": ["-y", "mcp-swiss"] } }}{ "command": "npx", "args": ["-y", "mcp-swiss"]}docker pull vikramgorla/mcp-swiss# Run directly (stdio)docker run -i vikramgorla/mcp-swiss
# Use with Claude Desktop{ "mcpServers": { "swiss": { "command": "docker", "args": ["run", "-i", "--rm", "vikramgorla/mcp-swiss"] } }}docker pull ghcr.io/vikramgorla/mcp-swissnpx mcp-swiss --http{ "mcpServers": { "swiss": { "command": "npx", "args": ["-y", "mcp-swiss", "--discovery"] } }}{ "mcpServers": { "swiss": { "command": "npx", "args": ["-y", "mcp-swiss", "--modules", "transport,weather"] } }}{ "mcpServers": { "swiss": { "command": "npx", "args": ["-y", "mcp-swiss", "--preset", "commuter"] } }}# Clonegit clone https://github.com/vikramgorla/mcp-swiss.gitcd mcp-swiss
# Install depsnpm install
# Buildnpm run build
# Run in dev modenpm run dev
# Test with MCP Inspectornpx @modelcontextprotocol/inspector node dist/index.jsnpm test