# vikramgorla/mcp-swiss [Health: Active]

**Category:** 📊 Data Platforms  
**Repository:** https://github.com/vikramgorla/mcp-swiss  
**GitHub Stars:** 22  
**npm Downloads (last month):** 706  
**Views:** 2  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/vikramgorla-mcp-swiss

## Description
68 tools for Swiss open data: transport, weather, geodata, companies, parliament, and more. Zero API keys required.

## Tools
Capabilities this server exposes over MCP:

- **search_stations** — Search for Swiss public transport stations/stops by name or coordinates
- **get_connections** — Get train/bus connections between two Swiss locations
- **get_departures** — Get live departures from a Swiss transport station
- **get_arrivals** — Get live arrivals at a Swiss transport station
- **get_nearby_stations** — Find Swiss public transport stations near given coordinates
- **get_weather** — Get current weather conditions at a Swiss MeteoSwiss station (e.g. BER=Bern, ZUE=Zürich, LUG=Lugano)
- **list_weather_stations** — List all available MeteoSwiss weather stations in Switzerland
- **get_weather_history** — Get historical weather data for a Swiss station
- **get_water_level** — Get current river or lake water level and temperature at a Swiss hydrological station
- **list_hydro_stations** — List all available BAFU hydrological monitoring stations (rivers and lakes) in Switzerland
- **get_water_history** — Get historical river/lake water level data for a Swiss hydrological station
- **geocode** — Convert a Swiss address or place name to coordinates (swisstopo)
- **reverse_geocode** — Convert coordinates to a Swiss address (swisstopo)
- **search_places** — Search Swiss place names, localities, mountains, and geographic features
- **get_solar_potential** — Get rooftop solar energy potential for a location in Switzerland
- **identify_location** — Identify geographic features and data layers at a specific Swiss location
- **get_municipality** — Get information about a Swiss municipality by name
- **search_companies** — Search Swiss company registry (ZEFIX) by name, canton, or legal form
- **get_company** — Get full details of a Swiss company by its ZEFIX internal ID (ehraid). Use search_companies first to find the ehraid — it is returned in company search results.
- **search_companies_by_address** — Search Swiss companies registered at a specific address or locality
- **list_cantons** — List all Swiss cantons with their codes
- **list_legal_forms** — List all Swiss company legal forms (AG, GmbH, etc.)
- **get_public_holidays** — Get Swiss public holidays for a given year, optionally filtered by canton (e.g. ZH, BE, GE). Returns national and canton-specific holidays.
- **get_school_holidays** — Get Swiss school holidays for a given year, optionally filtered by canton. Returns holiday periods (start/end dates) by canton.
- **is_holiday_today** — Check whether today is a Swiss public holiday, optionally for a specific canton. Returns the holiday name if it is one.
- **search_parliament_business** — Search Swiss Parliament political affairs — bills, motions, interpellations, postulates, questions, and initiatives. Uses OpenParlData.ch full-text search across the Federal Assembly (Bundesversammlung).
- **get_parliament_members** — List current or past Swiss Parliament members (National Council and Council of States). Filter by canton or party.
- **get_parliament_votes** — Get voting results for a specific parliamentary affair (Geschäft). Returns all recorded votes for the given affair ID from OpenParlData.
- **get_session_schedule** — Get upcoming and recent Swiss parliament sessions (Sessionen). Shows session names, dates and types.
- **search_parliament_speeches** — Get debate speeches and contributions for a specific parliamentary affair. Returns speaker info and speech details.
- **get_politician_interests** — Get declared interests and mandates of a Swiss parliament member — board memberships, consulting roles, organizations.
- **search_cantonal_affairs** — Search political affairs across Swiss cantonal parliaments (Kantonsräte). Covers all 26 cantons via OpenParlData.
- **get_parliamentary_documents** — Get official documents for a parliamentary affair — reports, committee opinions, federal council statements.
- **get_committee_meetings** — Get Swiss parliament committee/commission meeting schedule. Optionally filter by committee group ID.
- **get_avalanche_bulletin** — Get the current Swiss avalanche danger bulletin from SLF (WSL Institute for Snow and Avalanche Research). Returns current bulletin URLs, danger level descriptions, and links to the interactive map. The bulletin is published daily at ~08:00 and updated at ~17:00 Swiss time (October–May).
- **list_avalanche_regions** — List all Swiss avalanche warning regions as defined by SLF/EAWS. Returns region IDs, names, cantons, and typical elevations. Use region IDs with get_avalanche_bulletin.
- **list_air_quality_stations** — List all official Swiss NABEL (Nationales Beobachtungsnetz für Luftfremdstoffe) air quality monitoring stations operated by BAFU/EMPA. Returns station codes, names, cantons, coordinates, and environment types.
- **get_air_quality** — Get information about a Swiss NABEL air quality monitoring station, including location, environment type, Swiss legal limits (LRV), and a direct link to the BAFU live data portal. Use station codes from list_air_quality_stations (e.g. BER=Bern, ZUE=Zürich, LUG=Lugano).
- **lookup_postcode** — Look up a Swiss postcode (PLZ) to get locality name, canton, and coordinates. Source: Swiss federal geodata (swisstopo).
- **search_postcode** — Search Swiss postcodes by city or locality name. Returns all PLZ entries matching the name. Source: Swiss federal geodata (swisstopo).
- **list_postcodes_in_canton** — List all Swiss postcodes (PLZ) in a given canton. Accepts 2-letter canton codes (ZH, BE, GR…) or full names. Source: Swiss federal geodata (swisstopo).
- **track_parcel** — Generate a Swiss Post parcel tracking URL for a given tracking number. Swiss Post does not provide a public tracking API, so this returns the official tracking page URL to open in a browser.
- **get_electricity_tariff** — Get Swiss electricity tariff (price in Rappen/kWh) for a municipality from ElCom (Swiss Federal Electricity Commission). Returns total price and price breakdown by component (energy, grid, taxes). Valid years: 2011–2026.
- **compare_electricity_tariffs** — Compare Swiss electricity tariffs across multiple municipalities side-by-side. Returns prices sorted from cheapest to most expensive. Useful for relocation decisions or cost analysis.
- **search_municipality_energy** — Search for Swiss municipality IDs needed for electricity tariff lookup. Returns BFS municipality numbers for use with get_electricity_tariff and compare_electricity_tariffs.
- **get_population** — Get Swiss population data from the Federal Statistical Office (FSO/BFS). Returns population figures for Switzerland, a canton, or all cantons. Data source: BFS STATPOP (permanent resident population).
- **search_statistics** — Search Swiss Federal Statistical Office (BFS/OFS/UST) datasets on opendata.swiss. Returns matching dataset titles, IDs, and descriptions.
- **get_statistic** — Fetch details and resource links for a specific BFS/OFS dataset by its opendata.swiss identifier. Use search_statistics first to find dataset IDs.
- **list_currencies** — List all currencies available from the Swiss National Bank (SNB) for CHF exchange rate data. Returns currency codes, names, and regions.
- **get_exchange_rate** — Get the current CHF exchange rate for a currency from the Swiss National Bank (SNB). Returns the latest monthly average rate and currency details.
- **get_exchange_rate_history** — Get historical CHF exchange rates for a currency from the Swiss National Bank (SNB). Returns monthly average rates with optional date filtering. Without date range, returns the most recent 90 months.
- **get_waste_collection** — Get upcoming waste collection dates for a Zurich city ZIP code. Returns the next scheduled pickups sorted by date. Currently covers Zurich city only (ZIP codes 8001–8099). Powered by OpenERZ (openerz.metaodi.ch).
- **list_waste_types** — List all supported waste collection types for Zurich city. Returns each type with its description and local name. Currently covers Zurich city only (ZIP codes 8001–8099). Powered by OpenERZ (openerz.metaodi.ch).
- **get_waste_calendar** — Get a full monthly waste collection calendar for a Zurich city ZIP code. Returns all collection events grouped by date for the given month. Currently covers Zurich city only (ZIP codes 8001–8099). Powered by OpenERZ (openerz.metaodi.ch).
- **get_swiss_news** — Get the latest Swiss news headlines from SRF (Schweizer Radio und Fernsehen). Returns top news articles with title, description, link, and publication date.
- **search_swiss_news** — Search Swiss news headlines from SRF by keyword. Searches across all available news categories and returns matching articles.
- **get_voting_results** — Get results of Swiss popular votes (Volksabstimmungen) from Basel-Stadt open data. Returns vote title, date, yes/no counts, yes percentage, and eligible voters. Covers national and cantonal votes since 2021.
- **search_votes** — Search Swiss popular votes by keyword in the vote title (e.g. 'Initiative', 'Klimaschutz', 'CO2', 'AHV'). Returns matching votes with yes/no results.
- **get_vote_details** — Get detailed breakdown of a specific Swiss popular vote, including per-district results for Basel-Stadt (Basel city, Riehen, Bettingen, and overseas voters).
- **search_dams** — Search Swiss dams and reservoirs under federal supervision by name. Searches both dam names and reservoir names. Returns dam type, height, crest length, reservoir volume, purpose, canton, and year built. Data source: Swiss Federal Office of Energy (SFOE) via swisstopo BGDI.
- **get_dams_by_canton** — List all Swiss dams under federal supervision in a given canton. Returns up to 20 dams with basic details. Data source: Swiss Federal Office of Energy (SFOE) via swisstopo BGDI.
- **get_dam_details** — Get full technical details of a specific Swiss dam by name. Returns all available fields: dam type, height, crest length, crest level, reservoir name, impoundment volume, storage level, purpose, operation dates, federal supervision start, and canton. Data source: Swiss Federal Office of Energy (SFOE) via swisstopo BGDI.
- **get_trail_closures** — Get current Swiss hiking trail closures and detours from the official ASTRA/Schweizer Wanderwege dataset. Filter by closure reason (e.g. Steinschlag, Bauarbeiten, Hangrutsch) or type (closure, detour). If no parameters are given, returns all active closures. Data source: swisstopo ch.astra.wanderland-sperrungen_umleitungen.
- **get_trail_closures_nearby** — Find Swiss hiking trail closures and detours near a given GPS coordinate. Converts WGS84 coordinates to Swiss LV95 and queries the swisstopo identify endpoint. Returns closures within the specified radius.
- **get_property_price_index** — Get the Swiss Residential Property Price Index (SWRPI) — official BFS data. Baseline Q4 2019 = 100. Returns quarterly index values tracking Swiss property prices since 2009. Covers all properties, single-family houses, and apartments separately.
- **search_real_estate_data** — Search opendata.swiss for Swiss real estate and housing datasets. Finds datasets about property prices, rents, housing construction, vacancy rates, and more. Returns dataset names, descriptions, and resource download URLs.
- **get_rent_index** — Get the Swiss Consumer Price Index (CPI/LIK), which tracks cost of living including residential rents. Baseline December 1982 = 100. Published monthly by BFS. For property purchase prices, use get_property_price_index instead.
- **get_traffic_count** — Get traffic volume at an ASTRA counting station in Switzerland by location name (e.g. 'Gotthard', 'Zürich', 'Genf'). Returns daily and weekday traffic counts, heavy vehicle percentage, and measurement year.
- **get_traffic_by_canton** — List ASTRA traffic counting stations in a Swiss canton. Returns up to 20 stations with traffic data.
- **get_traffic_nearby** — Find ASTRA traffic counting stations near a geographic coordinate in Switzerland. Returns nearby stations with traffic volume data.
- **get_recent_earthquakes** — Get recent seismic events in and around Switzerland from the Swiss Seismological Service (SED) at ETH Zürich. Returns earthquakes and optionally quarry blasts, sorted by most recent first.
- **get_earthquake_details** — Get full details for a specific seismic event by its SED (Swiss Seismological Service) event ID. Use event IDs returned by get_recent_earthquakes or search_earthquakes_by_location.
- **search_earthquakes_by_location** — Search for earthquakes near a geographic location using the Swiss Seismological Service (SED) FDSN API. Useful for finding seismic activity near a Swiss city, landmark, or custom coordinates.
- **get_snow_conditions** — Get current snow conditions across Switzerland from SLF (WSL Institute for Snow and Avalanche Research). Returns snow depth and new snow (24h) for IMIS stations, sorted by snow depth. Filter by canton or minimum altitude. Data updated daily.
- **list_snow_stations** — List all SLF snow measurement stations in Switzerland (IMIS automatic stations and manual study plots). Returns station code, name, altitude, canton, and type. Sorted by elevation descending.
- **get_snow_measurements** — Get detailed snow and weather measurements for a specific SLF station. IMIS stations return 30-min data (snow depth, temperature, humidity, wind, radiation). Study plots return daily data (snow depth, new snow, water equivalent). Use list_snow_stations to find station codes.

## Claude Desktop Quick Installation
Install path detected from listing signals. Uses `npx` (confidence: high):

```json
"mcpServers": {
  "mcp-swiss": {
    "command": "npx",
    "args": ["-y","mcp-swiss"]
  }
}
```

## Documentation & README

<div align="center">

<img src="https://raw.githubusercontent.com/vikramgorla/mcp-swiss/HEAD/assets/icon.svg" width="120" height="120" alt="mcp-swiss" />

# mcp-swiss

**Swiss open data for AI — zero config, zero API keys**

[![npm](https://img.shields.io/npm/v/mcp-swiss.svg?style=flat-square)](https://www.npmjs.com/package/mcp-swiss)
[![CI](https://img.shields.io/github/actions/workflow/status/vikramgorla/mcp-swiss/ci.yml?style=flat-square&label=CI)](https://github.com/vikramgorla/mcp-swiss/actions/workflows/ci.yml)
[![License](https://img.shields.io/badge/license-MIT-blue?style=flat-square)](https://opensource.org/licenses/MIT)
[![MCP](https://img.shields.io/badge/MCP-compatible-D52B1E?style=flat-square)](https://modelcontextprotocol.io)
[![Downloads](https://img.shields.io/npm/dm/mcp-swiss.svg?style=flat-square)](https://www.npmjs.com/package/mcp-swiss)
[![Stars](https://img.shields.io/github/stars/vikramgorla/mcp-swiss?style=flat-square)](https://github.com/vikramgorla/mcp-swiss)
[![Node](https://img.shields.io/node/v/mcp-swiss?style=flat-square)](https://nodejs.org)
[![.mcpb](https://img.shields.io/badge/.mcpb-One--Click_Install-D52B1E?style=flat-square)](https://github.com/vikramgorla/mcp-swiss/releases/latest/download/mcp-swiss.mcpb)
[![Claude Desktop](https://img.shields.io/badge/Claude_Desktop-Install-D52B1E?style=flat-square&logo=anthropic&logoColor=white)](https://github.com/vikramgorla/mcp-swiss/releases/latest/download/mcp-swiss.mcpb)

[Install](#installation) · [Tools](#tools) · [Demo](#demo-prompts) · [Data Sources](#data-sources)

</div>

---

`mcp-swiss` is a [Model Context Protocol](https://modelcontextprotocol.io) 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
```

---

## Installation

### Quick Start

```bash
npx mcp-swiss
```

That's it. No API keys, no `.env` files, no accounts. Pick your client below and paste the config.

---

### One-Click Install (.mcpb)

`.mcpb` bundles work with Claude Desktop and any MCP Bundle-compatible app.

[**⬇ Download mcp-swiss.mcpb**](https://github.com/vikramgorla/mcp-swiss/releases/latest/download/mcp-swiss.mcpb)

[![Install in Claude Desktop](https://img.shields.io/badge/Install_in_Claude_Desktop-D52B1E?style=for-the-badge&logo=anthropic&logoColor=white)](https://github.com/vikramgorla/mcp-swiss/releases/latest/download/mcp-swiss.mcpb)

Open the downloaded file — your app handles the rest. No config editing, no terminal, no API keys.

---

### Claude Desktop

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`

```json
{
  "mcpServers": {
    "swiss": {
      "command": "npx",
      "args": ["-y", "mcp-swiss"]
    }
  }
}
```

Restart Claude Desktop after saving.

---

### Claude Code (CLI)

```bash
claude mcp add swiss -- npx -y mcp-swiss
```

That's it — Claude Code will use it in your next session.

---

### Cursor

> Requires Cursor 0.45.6+

**Option A: Project config** — create `.cursor/mcp.json` in your project root:

```json
{
  "mcpServers": {
    "swiss": {
      "command": "npx",
      "args": ["-y", "mcp-swiss"]
    }
  }
}
```

**Option B: Global config** — create `~/.cursor/mcp.json`:

```json
{
  "mcpServers": {
    "swiss": {
      "command": "npx",
      "args": ["-y", "mcp-swiss"]
    }
  }
}
```

**Option C: Via Cursor Settings UI**
1. Open Cursor Settings
2. Go to **Features → MCP Servers**
3. Click **+ Add new global MCP server**
4. Paste the JSON config above

---

### VS Code (GitHub Copilot)

#### One-click Install

[<img src="https://img.shields.io/badge/VS_Code-Install_Server-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white" alt="Install in VS Code">](https://insiders.vscode.dev/redirect?url=vscode%3Amcp%2Finstall%3F%257B%2522name%2522%253A%2522swiss%2522%252C%2522command%2522%253A%2522npx%2522%252C%2522args%2522%253A%255B%2522-y%2522%252C%2522mcp-swiss%2522%255D%257D)
[<img src="https://img.shields.io/badge/VS_Code_Insiders-Install_Server-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white" alt="Install in VS Code Insiders">](https://insiders.vscode.dev/redirect?url=vscode-insiders%3Amcp%2Finstall%3F%257B%2522name%2522%253A%2522swiss%2522%252C%2522command%2522%253A%2522npx%2522%252C%2522args%2522%253A%255B%2522-y%2522%252C%2522mcp-swiss%2522%255D%257D)

#### CLI Install

```bash
# 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"]}'
```

#### Manual Config

Add to your VS Code User Settings (JSON) — press `Ctrl+Shift+P` → `Preferences: Open User Settings (JSON)`:

```json
{
  "mcp": {
    "servers": {
      "swiss": {
        "command": "npx",
        "args": ["-y", "mcp-swiss"]
      }
    }
  }
}
```

Or add to `.vscode/mcp.json` in your workspace (shareable with your team):

```json
{
  "servers": {
    "swiss": {
      "command": "npx",
      "args": ["-y", "mcp-swiss"]
    }
  }
}
```

---

### Windsurf

Add to `~/.codeium/windsurf/model_config.json`:

```json
{
  "mcpServers": {
    "swiss": {
      "command": "npx",
      "args": ["-y", "mcp-swiss"]
    }
  }
}
```

---

### Cline (VS Code)

Open VS Code `settings.json` and add:

```json
{
  "cline.mcpServers": {
    "swiss": {
      "command": "npx",
      "args": ["-y", "mcp-swiss"]
    }
  }
}
```

---

### Any MCP Client

`mcp-swiss` uses **stdio transport** and requires no environment variables. The universal config:

```json
{
  "command": "npx",
  "args": ["-y", "mcp-swiss"]
}
```

This works with any MCP-compatible client — just plug it in.

### Docker

```bash
docker pull vikramgorla/mcp-swiss
```

Use with any MCP client that supports Docker-based servers. The container uses stdio transport:

```bash
# Run directly (stdio)
docker run -i vikramgorla/mcp-swiss

# Use with Claude Desktop
```

For Claude Desktop, update your config to use Docker:

```json
{
  "mcpServers": {
    "swiss": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "vikramgorla/mcp-swiss"]
    }
  }
}
```

Also available on GitHub Container Registry:

```bash
docker pull ghcr.io/vikramgorla/mcp-swiss
```

---

## Module Filtering

By default, mcp-swiss loads all 21 modules (76 tools). For better token efficiency, load only the modules you need:

### Select specific modules
```json
{
  "mcpServers": {
    "swiss": {
      "command": "npx",
      "args": ["-y", "mcp-swiss", "--modules", "transport,weather"]
    }
  }
}
```

### Use presets
```json
{
  "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`

---

## Demo Prompts

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` |

---

## Tools

> 76 tools across 21 modules. Full specifications: [`docs/tool-specs.md`](https://github.com/vikramgorla/mcp-swiss/blob/HEAD/docs/tool-specs.md) · Machine-readable: [`docs/tools.schema.json`](https://github.com/vikramgorla/mcp-swiss/blob/HEAD/docs/tools.schema.json)

### 🚆 Transport (5 tools)

| 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 |

### 🌤️ Weather & Hydrology (6 tools)

| 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 |

### 🗺️ Geodata / swisstopo (6 tools)

| 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 |

### 🏢 Companies / ZEFIX (5 tools)

| 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 |

### 🎄 Holidays (3 tools)

| 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](https://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 |

### 🏔️ Avalanche (2 tools)

| Tool | Description |
|------|-------------|
| `get_avalanche_bulletin` | Current avalanche bulletin with danger levels and PDF links |
| `list_avalanche_regions` | All 22 Swiss avalanche warning regions |

### 💨 Air Quality (2 tools)

| Tool | Description |
|------|-------------|
| `list_air_quality_stations` | All 14 NABEL monitoring stations |
| `get_air_quality` | Station info, Swiss legal limits (LRV), and BAFU data links |

### 📮 Swiss Post (4 tools)

| 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 |

### ⚡ Energy Prices (3 tools)

| 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 |

### 📊 Statistics / BFS (3 tools)

| 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 |

### 🏦 SNB Exchange Rates (3 tools)

| 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 |

### ♻️ Recycling / Waste Collection (3 tools)

| 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) |

### 📰 Swiss News (2 tools)

| 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 |

### 🗳️ Voting (3 tools)

| 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 |

### 🌊 Dams & Reservoirs (3 tools)

| 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) |

### 🥾 Hiking / Trail Closures (2 tools)

| Tool | Description |
|------|-------------|
| `get_trail_closures` | Swiss trail closures and hiking alerts from swisstopo |
| `get_trail_closures_nearby` | Trail closures near given coordinates |

### 🏠 Real Estate (3 tools)

| 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 |

### 🚗 Traffic / ASTRA (3 tools)

| 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 |

### 🌍 Earthquakes / SED (3 tools)

| 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 |

### ❄️ Snow Conditions / SLF (3 tools)

| 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 |

---

## Data Sources

All official Swiss open data — no API keys required:

| Source | Data | Docs |
|--------|------|------|
| [transport.opendata.ch](https://transport.opendata.ch) | SBB, PostBus, trams | [API docs](http://transport.opendata.ch/docs.html) |
| [api.existenz.ch](https://api.existenz.ch) | MeteoSwiss weather + BAFU hydrology | [API docs](https://api.existenz.ch) |
| [api3.geo.admin.ch](https://api3.geo.admin.ch) | swisstopo federal geodata | [API docs](https://api3.geo.admin.ch/api/doc.html) |
| [zefix.admin.ch](https://www.zefix.admin.ch) | Federal company registry | [Swagger](https://www.zefix.admin.ch/ZefixREST/swagger-ui.html) |
| [openholidaysapi.org](https://openholidaysapi.org) | Swiss public & school holidays | [API docs](https://openholidaysapi.org/swagger) |
| [OpenParlData.ch](https://openparldata.ch) | Swiss Parliament data — federal & cantonal (CC BY 4.0) | [API docs](https://api.openparldata.ch/documentation) |
| [whiterisk.ch](https://whiterisk.ch) / [aws.slf.ch](https://aws.slf.ch) | SLF/WSL avalanche bulletins | [SLF](https://www.slf.ch/en/avalanche-bulletin-and-snow-situation.html) |
| [geo.admin.ch](https://api3.geo.admin.ch) — BAFU/NABEL | Swiss air quality monitoring stations | [BAFU NABEL](https://www.bafu.admin.ch/bafu/en/home/topics/air/state/data/nabel.html) |
| [geo.admin.ch](https://api3.geo.admin.ch) — swisstopo | Swiss postcodes (Amtliches Ortschaftenverzeichnis) | [geo.admin.ch](https://api3.geo.admin.ch/api/doc.html) |
| [strompreis.elcom.admin.ch](https://strompreis.elcom.admin.ch) | ElCom electricity tariffs by municipality | [ElCom](https://www.elcom.admin.ch/elcom/en/home.html) |
| [pxweb.bfs.admin.ch](https://www.pxweb.bfs.admin.ch) + [opendata.swiss](https://opendata.swiss) | BFS population statistics (STATPOP) + datasets | [BFS](https://www.bfs.admin.ch/bfs/en/home/statistics/population.html) |
| [data.snb.ch](https://data.snb.ch) | Swiss National Bank CHF exchange rates | [SNB data portal](https://data.snb.ch/en) |
| [openerz.metaodi.ch](https://openerz.metaodi.ch) | Zurich waste collection calendar (OpenERZ) | [OpenERZ](https://openerz.metaodi.ch) |
| [srf.ch](https://www.srf.ch) | SRF Swiss news headlines | [SRF](https://www.srf.ch/news) |
| [data.bs.ch](https://data.bs.ch) | Basel-Stadt popular vote results | [Open Data BS](https://data.bs.ch) |
| [geo.admin.ch](https://api3.geo.admin.ch) — SFOE | Swiss federal dam registry | [SFOE](https://www.bfe.admin.ch) |
| [geo.admin.ch](https://api3.geo.admin.ch) — swisstopo | Swiss trail closures and hiking alerts | [swisstopo](https://www.swisstopo.admin.ch) |
| [pxweb.bfs.admin.ch](https://www.pxweb.bfs.admin.ch) | BFS property prices + rent index | [BFS housing](https://www.bfs.admin.ch/bfs/en/home/statistics/construction-housing.html) |
| [geo.admin.ch](https://api3.geo.admin.ch) — ASTRA | Traffic counting stations + daily volumes | [ASTRA](https://www.astra.admin.ch) |
| [arclink.ethz.ch](http://arclink.ethz.ch) | Swiss Seismological Service earthquakes (SED/ETH) | [SED](http://www.seismo.ethz.ch) |
| [measurement-api.slf.ch](https://measurement-api.slf.ch/public/api) | SLF snow depth + measurements (IMIS + study plots, CC BY 4.0) | [SLF](https://www.slf.ch) |

---

## Development

```bash
# 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
```

### Testing

```bash
npm test
```

---

## Contributing

We welcome contributions! mcp-swiss follows a strict PR-based workflow to keep the codebase clean and CI always green.

### Quick links

- **[`CONTRIBUTING.md`](https://github.com/vikramgorla/mcp-swiss/blob/HEAD/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`](https://github.com/vikramgorla/mcp-swiss/blob/HEAD/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`)

---

## Requirements

- Node.js 20+
- No API keys or accounts needed

## License

MIT — see [LICENSE](https://github.com/vikramgorla/mcp-swiss/blob/HEAD/LICENSE)

