{
  "markdown": "<div align=\"center\">\n\n<img src=\"assets/icon.svg\" width=\"120\" height=\"120\" alt=\"mcp-swiss\" />\n\n# mcp-swiss\n\n**Swiss open data for AI — zero config, zero API keys**\n\n[![npm](https://img.shields.io/npm/v/mcp-swiss.svg?style=flat-square)](https://www.npmjs.com/package/mcp-swiss)\n[![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)\n[![License](https://img.shields.io/badge/license-MIT-blue?style=flat-square)](https://opensource.org/licenses/MIT)\n[![MCP](https://img.shields.io/badge/MCP-compatible-D52B1E?style=flat-square)](https://modelcontextprotocol.io)\n[![Downloads](https://img.shields.io/npm/dm/mcp-swiss.svg?style=flat-square)](https://www.npmjs.com/package/mcp-swiss)\n[![Stars](https://img.shields.io/github/stars/vikramgorla/mcp-swiss?style=flat-square)](https://github.com/vikramgorla/mcp-swiss)\n[![Node](https://img.shields.io/node/v/mcp-swiss?style=flat-square)](https://nodejs.org)\n[![.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)\n[![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)\n\n[Install](#installation) · [Tools](#tools) · [Demo](#demo-prompts) · [Data Sources](#data-sources)\n\n</div>\n\n---\n\n`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.\n\n**76 tools. No API keys. No registration. No server to run. Just `npx mcp-swiss`.**\n\n```\n🚆 Transport    — SBB, PostBus, trams, live departures, journey planning\n🌤️ Weather      — MeteoSwiss live conditions + historical data\n🌊 Hydrology    — BAFU river & lake levels (great for Aare swimming!)\n🗺️ Geodata      — swisstopo geocoding, solar potential, geographic layers\n🏢 Companies    — ZEFIX federal registry, all 700K+ Swiss companies\n🎄 Holidays     — Swiss public & school holidays by canton\n🏛️ Parliament   — Bills, votes, members, speeches, cantonal affairs (OpenParlData.ch)\n🏔️ Avalanche    — SLF danger bulletins and warning regions\n💨 Air Quality  — NABEL stations, Swiss legal limits (LRV)\n📮 Swiss Post   — Postcode lookup and parcel tracking\n⚡ Energy       — Electricity tariffs by municipality (ElCom)\n📊 Statistics   — Population, demographics, BFS datasets\n🏦 SNB Rates    — Swiss National Bank CHF exchange rates, historical data\n♻️ Recycling    — Zurich city waste collection calendar (OpenERZ)\n📰 Swiss News   — SRF news headlines and keyword search\n🗳️ Voting       — Swiss popular vote results (Basel-Stadt open data)\n🌊 Dams         — Swiss federal dam registry (SFOE/swisstopo)\n🥾 Hiking       — Swiss trail closures and hiking alerts (swisstopo)\n🏠 Real Estate  — Swiss property prices, rent index, housing data (BFS)\n🚗 Traffic      — ASTRA counting stations, daily volumes\n🌍 Earthquakes  — Swiss Seismological Service (SED/ETH Zürich), FDSN API\n```\n\n---\n\n## Installation\n\n### Quick Start\n\n```bash\nnpx mcp-swiss\n```\n\nThat's it. No API keys, no `.env` files, no accounts. Pick your client below and paste the config.\n\n---\n\n### One-Click Install (.mcpb)\n\n`.mcpb` bundles work with Claude Desktop and any MCP Bundle-compatible app.\n\n[**⬇ Download mcp-swiss.mcpb**](https://github.com/vikramgorla/mcp-swiss/releases/latest/download/mcp-swiss.mcpb)\n\n[![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)\n\nOpen the downloaded file — your app handles the rest. No config editing, no terminal, no API keys.\n\n---\n\n### Claude Desktop\n\nEdit your config file:\n- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`\n- **Windows:** `%APPDATA%\\Claude\\claude_desktop_config.json`\n- **Linux:** `~/.config/Claude/claude_desktop_config.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"swiss\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-swiss\"]\n    }\n  }\n}\n```\n\nRestart Claude Desktop after saving.\n\n---\n\n### Claude Code (CLI)\n\n```bash\nclaude mcp add swiss -- npx -y mcp-swiss\n```\n\nThat's it — Claude Code will use it in your next session.\n\n---\n\n### Cursor\n\n> Requires Cursor 0.45.6+\n\n**Option A: Project config** — create `.cursor/mcp.json` in your project root:\n\n```json\n{\n  \"mcpServers\": {\n    \"swiss\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-swiss\"]\n    }\n  }\n}\n```\n\n**Option B: Global config** — create `~/.cursor/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"swiss\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-swiss\"]\n    }\n  }\n}\n```\n\n**Option C: Via Cursor Settings UI**\n1. Open Cursor Settings\n2. Go to **Features → MCP Servers**\n3. Click **+ Add new global MCP server**\n4. Paste the JSON config above\n\n---\n\n### VS Code (GitHub Copilot)\n\n#### One-click Install\n\n[<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)\n[<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)\n\n#### CLI Install\n\n```bash\n# VS Code\ncode --add-mcp '{\"name\":\"swiss\",\"command\":\"npx\",\"args\":[\"-y\",\"mcp-swiss\"]}'\n\n# VS Code Insiders\ncode-insiders --add-mcp '{\"name\":\"swiss\",\"command\":\"npx\",\"args\":[\"-y\",\"mcp-swiss\"]}'\n```\n\n#### Manual Config\n\nAdd to your VS Code User Settings (JSON) — press `Ctrl+Shift+P` → `Preferences: Open User Settings (JSON)`:\n\n```json\n{\n  \"mcp\": {\n    \"servers\": {\n      \"swiss\": {\n        \"command\": \"npx\",\n        \"args\": [\"-y\", \"mcp-swiss\"]\n      }\n    }\n  }\n}\n```\n\nOr add to `.vscode/mcp.json` in your workspace (shareable with your team):\n\n```json\n{\n  \"servers\": {\n    \"swiss\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-swiss\"]\n    }\n  }\n}\n```\n\n---\n\n### Windsurf\n\nAdd to `~/.codeium/windsurf/model_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"swiss\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-swiss\"]\n    }\n  }\n}\n```\n\n---\n\n### Cline (VS Code)\n\nOpen VS Code `settings.json` and add:\n\n```json\n{\n  \"cline.mcpServers\": {\n    \"swiss\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-swiss\"]\n    }\n  }\n}\n```\n\n---\n\n### Any MCP Client\n\n`mcp-swiss` uses **stdio transport** and requires no environment variables. The universal config:\n\n```json\n{\n  \"command\": \"npx\",\n  \"args\": [\"-y\", \"mcp-swiss\"]\n}\n```\n\nThis works with any MCP-compatible client — just plug it in.\n\n### Docker\n\n```bash\ndocker pull vikramgorla/mcp-swiss\n```\n\nUse with any MCP client that supports Docker-based servers. The container uses stdio transport:\n\n```bash\n# Run directly (stdio)\ndocker run -i vikramgorla/mcp-swiss\n\n# Use with Claude Desktop\n```\n\nFor Claude Desktop, update your config to use Docker:\n\n```json\n{\n  \"mcpServers\": {\n    \"swiss\": {\n      \"command\": \"docker\",\n      \"args\": [\"run\", \"-i\", \"--rm\", \"vikramgorla/mcp-swiss\"]\n    }\n  }\n}\n```\n\nAlso available on GitHub Container Registry:\n\n```bash\ndocker pull ghcr.io/vikramgorla/mcp-swiss\n```\n\n---\n\n## Module Filtering\n\nBy default, mcp-swiss loads all 21 modules (76 tools). For better token efficiency, load only the modules you need:\n\n### Select specific modules\n```json\n{\n  \"mcpServers\": {\n    \"swiss\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-swiss\", \"--modules\", \"transport,weather\"]\n    }\n  }\n}\n```\n\n### Use presets\n```json\n{\n  \"mcpServers\": {\n    \"swiss\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-swiss\", \"--preset\", \"commuter\"]\n    }\n  }\n}\n```\n\n| Preset | Modules | Tools | Token Savings |\n|--------|---------|-------|---------------|\n| `commuter` | transport, weather, holidays | 14 | 81% |\n| `outdoor` | weather, avalanche, hiking, earthquakes, dams, snow | 19 | 75% |\n| `business` | companies, geodata, post, energy, statistics, snb | 24 | 67% |\n| `citizen` | parliament, voting, holidays, news | 17 | 77% |\n| `minimal` | transport | 5 | 93% |\n| `full` | all 21 modules (default) | 76 | — |\n\nCombine preset + modules: `--preset commuter --modules parliament`\n\nList available: `npx mcp-swiss --list-modules` or `npx mcp-swiss --list-presets`\n\n---\n\n## Demo Prompts\n\nOnce connected, try asking your AI:\n\n| Prompt | What it uses |\n|--------|-------------|\n| *\"Next 5 trains from Zürich HB to Geneva\"* | `get_connections` |\n| *\"Is the Aare in Bern warm enough to swim?\"* | `get_water_level` |\n| *\"Weather in Lugano vs Zürich today\"* | `get_weather` |\n| *\"Find blockchain companies registered in Zug\"* | `search_companies` |\n| *\"Solar potential of Bundesplatz 3, Bern\"* | `geocode` + `get_solar_potential` |\n| *\"Live departures from Bern HB\"* | `get_departures` |\n| *\"What rivers are near Thun?\"* | `list_hydro_stations` + `get_water_level` |\n| *\"Plan my Saturday: train to Interlaken, check weather\"* | Multiple tools chained |\n| *\"Is next Monday a holiday in Zürich?\"* | `get_public_holidays` |\n| *\"What did the Swiss parliament vote on recently?\"* | `search_parliament_business` |\n| *\"What's the avalanche danger level in the Bernese Alps?\"* | `get_avalanche_bulletin` |\n| *\"What's the postcode for Zermatt?\"* | `search_postcode` |\n| *\"Track my Swiss Post parcel 99.12.345678.12345678\"* | `track_parcel` |\n| *\"How much does electricity cost in Zürich vs Basel?\"* | `search_municipality_energy` + `compare_electricity_tariffs` |\n| *\"What's the population of canton Zug?\"* | `get_population` |\n\n---\n\n## Tools\n\n> 76 tools across 21 modules. Full specifications: [`docs/tool-specs.md`](docs/tool-specs.md) · Machine-readable: [`docs/tools.schema.json`](docs/tools.schema.json)\n\n### 🚆 Transport (5 tools)\n\n| Tool | Description |\n|------|-------------|\n| `search_stations` | Find stations/stops by name or location |\n| `get_connections` | Journey planner between any two points |\n| `get_departures` | Live departures from a station |\n| `get_arrivals` | Live arrivals at a station |\n| `get_nearby_stations` | Stations near coordinates |\n\n### 🌤️ Weather & Hydrology (6 tools)\n\n| Tool | Description |\n|------|-------------|\n| `get_weather` | Current conditions at a MeteoSwiss station |\n| `list_weather_stations` | All ~160 MeteoSwiss stations with metadata |\n| `get_weather_history` | Historical weather data (up to 32 days) |\n| `get_water_level` | River/lake level + temperature (BAFU) |\n| `list_hydro_stations` | All 400+ hydrological monitoring stations |\n| `get_water_history` | Historical hydrology data |\n\n### 🗺️ Geodata / swisstopo (6 tools)\n\n| Tool | Description |\n|------|-------------|\n| `geocode` | Swiss address → coordinates |\n| `reverse_geocode` | Coordinates → Swiss address |\n| `search_places` | Swiss place names, mountains, lakes, features |\n| `get_solar_potential` | Rooftop solar irradiation at a location |\n| `identify_location` | All geographic data layers at a point |\n| `get_municipality` | Municipality info by name |\n\n### 🏢 Companies / ZEFIX (5 tools)\n\n| Tool | Description |\n|------|-------------|\n| `search_companies` | Search by name, canton, legal form |\n| `get_company` | Full company details by ZEFIX `ehraid` |\n| `search_companies_by_address` | Companies registered at an address |\n| `list_cantons` | All 26 Swiss cantons |\n| `list_legal_forms` | AG, GmbH, and all Swiss legal forms |\n\n### 🎄 Holidays (3 tools)\n\n| Tool | Description |\n|------|-------------|\n| `get_public_holidays` | Swiss public holidays by year, optionally filtered by canton |\n| `get_school_holidays` | School holiday periods by year and canton |\n| `is_holiday_today` | Quick check if today is a public holiday |\n\n### 🏛️ Parliament (9 tools) — [OpenParlData.ch](https://openparldata.ch)\n\n| Tool | Description |\n|------|-------------|\n| `search_parliament_business` | Search federal political affairs (bills, motions, questions) |\n| `get_parliament_members` | List parliament members by canton, party, or activity |\n| `get_parliament_votes` | Voting results for a specific affair |\n| `get_session_schedule` | Upcoming/recent parliament sessions |\n| `search_parliament_speeches` | Debate speeches for an affair |\n| `get_politician_interests` | Declared interests and mandates of a member |\n| `search_cantonal_affairs` | Search across 26 cantonal parliaments |\n| `get_parliamentary_documents` | Official documents for an affair |\n| `get_committee_meetings` | Committee/commission meeting schedule |\n\n### 🏔️ Avalanche (2 tools)\n\n| Tool | Description |\n|------|-------------|\n| `get_avalanche_bulletin` | Current avalanche bulletin with danger levels and PDF links |\n| `list_avalanche_regions` | All 22 Swiss avalanche warning regions |\n\n### 💨 Air Quality (2 tools)\n\n| Tool | Description |\n|------|-------------|\n| `list_air_quality_stations` | All 14 NABEL monitoring stations |\n| `get_air_quality` | Station info, Swiss legal limits (LRV), and BAFU data links |\n\n### 📮 Swiss Post (4 tools)\n\n| Tool | Description |\n|------|-------------|\n| `lookup_postcode` | PLZ → locality, canton, coordinates |\n| `search_postcode` | City name → matching postcodes |\n| `list_postcodes_in_canton` | All postcodes in a canton |\n| `track_parcel` | Generate Swiss Post tracking URL for a parcel |\n\n### ⚡ Energy Prices (3 tools)\n\n| Tool | Description |\n|------|-------------|\n| `get_electricity_tariff` | Electricity tariff by municipality with component breakdown |\n| `compare_electricity_tariffs` | Compare electricity prices across municipalities |\n| `search_municipality_energy` | Find municipality ID for tariff lookup |\n\n### 📊 Statistics / BFS (3 tools)\n\n| Tool | Description |\n|------|-------------|\n| `get_population` | Population by canton or municipality from BFS STATPOP |\n| `search_statistics` | Search BFS datasets on opendata.swiss |\n| `get_statistic` | Fetch detailed dataset information |\n\n### 🏦 SNB Exchange Rates (3 tools)\n\n| Tool | Description |\n|------|-------------|\n| `list_currencies` | List all currencies available from the Swiss National Bank (SNB) |\n| `get_exchange_rate` | Get the current CHF exchange rate for any currency |\n| `get_exchange_rate_history` | Get historical monthly CHF exchange rates with date filtering |\n\n### ♻️ Recycling / Waste Collection (3 tools)\n\n| Tool | Description |\n|------|-------------|\n| `get_waste_collection` | Next waste collection dates by Zurich ZIP code and waste type |\n| `list_waste_types` | List all supported waste types with descriptions |\n| `get_waste_calendar` | Full waste collection calendar for a ZIP code (upcoming dates) |\n\n### 📰 Swiss News (2 tools)\n\n| Tool | Description |\n|------|-------------|\n| `get_swiss_news` | Latest Swiss headlines from SRF by category (Switzerland/international/economy) |\n| `search_swiss_news` | Search SRF news by keyword across all categories |\n\n### 🗳️ Voting (3 tools)\n\n| Tool | Description |\n|------|-------------|\n| `get_voting_results` | Swiss popular vote results from Basel-Stadt open data |\n| `search_votes` | Search popular votes by keyword (German/French/Italian) |\n| `get_vote_details` | Detailed per-district breakdown of a specific vote |\n\n### 🌊 Dams & Reservoirs (3 tools)\n\n| Tool | Description |\n|------|-------------|\n| `search_dams` | Search Swiss federal dams by name or keyword |\n| `get_dams_by_canton` | List all federal dams in a canton |\n| `get_dam_details` | Detailed info on a specific dam (height, volume, purpose) |\n\n### 🥾 Hiking / Trail Closures (2 tools)\n\n| Tool | Description |\n|------|-------------|\n| `get_trail_closures` | Swiss trail closures and hiking alerts from swisstopo |\n| `get_trail_closures_nearby` | Trail closures near given coordinates |\n\n### 🏠 Real Estate (3 tools)\n\n| Tool | Description |\n|------|-------------|\n| `get_property_price_index` | Swiss property price index (BFS Immo-Monitoring) |\n| `search_real_estate_data` | Search BFS real estate datasets on opendata.swiss |\n| `get_rent_index` | Swiss rent index and housing cost data from BFS |\n\n### 🚗 Traffic / ASTRA (3 tools)\n\n| Tool | Description |\n|------|-------------|\n| `get_traffic_count` | Traffic counting station data (ASTRA) — daily volumes and heavy traffic share |\n| `get_traffic_by_canton` | List ASTRA traffic counting stations filtered by canton |\n| `get_traffic_nearby` | Find traffic counting stations near given coordinates |\n\n### 🌍 Earthquakes / SED (3 tools)\n\n| Tool | Description |\n|------|-------------|\n| `get_recent_earthquakes` | Recent seismic events in/around Switzerland from the Swiss Seismological Service (SED) at ETH Zürich |\n| `get_earthquake_details` | Full details for a specific seismic event by SED event ID |\n| `search_earthquakes_by_location` | Earthquakes near given coordinates with configurable radius, time range, and limit |\n\n### ❄️ Snow Conditions / SLF (3 tools)\n\n| Tool | Description |\n|------|-------------|\n| `get_snow_conditions` | Current snow depth and new snow (24h) across Switzerland from SLF IMIS stations, filterable by canton/altitude |\n| `list_snow_stations` | All 307 SLF snow measurement stations (IMIS automatic + manual study plots) |\n| `get_snow_measurements` | Detailed snow and weather measurements for a specific SLF station |\n\n---\n\n## Data Sources\n\nAll official Swiss open data — no API keys required:\n\n| Source | Data | Docs |\n|--------|------|------|\n| [transport.opendata.ch](https://transport.opendata.ch) | SBB, PostBus, trams | [API docs](http://transport.opendata.ch/docs.html) |\n| [api.existenz.ch](https://api.existenz.ch) | MeteoSwiss weather + BAFU hydrology | [API docs](https://api.existenz.ch) |\n| [api3.geo.admin.ch](https://api3.geo.admin.ch) | swisstopo federal geodata | [API docs](https://api3.geo.admin.ch/api/doc.html) |\n| [zefix.admin.ch](https://www.zefix.admin.ch) | Federal company registry | [Swagger](https://www.zefix.admin.ch/ZefixREST/swagger-ui.html) |\n| [openholidaysapi.org](https://openholidaysapi.org) | Swiss public & school holidays | [API docs](https://openholidaysapi.org/swagger) |\n| [OpenParlData.ch](https://openparldata.ch) | Swiss Parliament data — federal & cantonal (CC BY 4.0) | [API docs](https://api.openparldata.ch/documentation) |\n| [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) |\n| [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) |\n| [geo.admin.ch](https://api3.geo.admin.ch) — swisstopo | Swiss postcodes (Amtliches Ortschaftenverzeichnis) | [geo.admin.ch](https://api3.geo.admin.ch/api/doc.html) |\n| [strompreis.elcom.admin.ch](https://strompreis.elcom.admin.ch) | ElCom electricity tariffs by municipality | [ElCom](https://www.elcom.admin.ch/elcom/en/home.html) |\n| [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) |\n| [data.snb.ch](https://data.snb.ch) | Swiss National Bank CHF exchange rates | [SNB data portal](https://data.snb.ch/en) |\n| [openerz.metaodi.ch](https://openerz.metaodi.ch) | Zurich waste collection calendar (OpenERZ) | [OpenERZ](https://openerz.metaodi.ch) |\n| [srf.ch](https://www.srf.ch) | SRF Swiss news headlines | [SRF](https://www.srf.ch/news) |\n| [data.bs.ch](https://data.bs.ch) | Basel-Stadt popular vote results | [Open Data BS](https://data.bs.ch) |\n| [geo.admin.ch](https://api3.geo.admin.ch) — SFOE | Swiss federal dam registry | [SFOE](https://www.bfe.admin.ch) |\n| [geo.admin.ch](https://api3.geo.admin.ch) — swisstopo | Swiss trail closures and hiking alerts | [swisstopo](https://www.swisstopo.admin.ch) |\n| [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) |\n| [geo.admin.ch](https://api3.geo.admin.ch) — ASTRA | Traffic counting stations + daily volumes | [ASTRA](https://www.astra.admin.ch) |\n| [arclink.ethz.ch](http://arclink.ethz.ch) | Swiss Seismological Service earthquakes (SED/ETH) | [SED](http://www.seismo.ethz.ch) |\n| [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) |\n\n---\n\n## Development\n\n```bash\n# Clone\ngit clone https://github.com/vikramgorla/mcp-swiss.git\ncd mcp-swiss\n\n# Install deps\nnpm install\n\n# Build\nnpm run build\n\n# Run in dev mode\nnpm run dev\n\n# Test with MCP Inspector\nnpx @modelcontextprotocol/inspector node dist/index.js\n```\n\n### Testing\n\n```bash\nnpm test\n```\n\n---\n\n## Contributing\n\nWe welcome contributions! mcp-swiss follows a strict PR-based workflow to keep the codebase clean and CI always green.\n\n### Quick links\n\n- **[`CONTRIBUTING.md`](CONTRIBUTING.md)** — full contributor guide:\n  - Development setup (clone, install, build, test)\n  - Branch model (develop / main / feature branches)\n  - Hard workflow rules (no direct pushes, always PRs, regular merge only)\n  - Adding a new module (step-by-step with code templates)\n  - Integration checklist (all files to update)\n  - Code standards (TypeScript, no `any`, 50K response limit, zero API keys)\n\n- **[`RELEASING.md`](RELEASING.md)** — release process for maintainers:\n  - Step-by-step release workflow\n  - Pre-release checklist\n  - Version strategy (minor for features, patch for fixes)\n  - Post-release verification\n  - CI/CD workflow reference (`ci.yml`, `release.yml`, `beta.yml`, `mcp-registry.yml`)\n\n---\n\n## Requirements\n\n- Node.js 20+\n- No API keys or accounts needed\n\n## License\n\nMIT — see [LICENSE](LICENSE)\n",
  "bytes": 22237,
  "sha": "2720730498c93190ff4e599d056fa74352a8e9799b8659919b01d17d7c6bcb08",
  "repo_slug": "vikramgorla/mcp-swiss",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_vikramgorla_swiss_06f6dc8b/readme"
}