{
  "markdown": "# 🌦️ MeteoSwiss LLM Tools\n\n[![License: CC0-1.0](https://img.shields.io/badge/license-CC0--1.0-blue)](LICENSE)\n[![npm: meteoswiss-mcp](https://img.shields.io/npm/v/meteoswiss-mcp?label=npm%3A%20meteoswiss-mcp)](https://www.npmjs.com/package/meteoswiss-mcp)\n[![Docker](https://img.shields.io/badge/Docker-ghcr.io-blue)](https://ghcr.io/eins78/meteoswiss-mcp)\n[![live](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fmeteoswiss-mcp.ars.is%2Fhealth&query=%24.version&label=live&color=brightgreen)](https://meteoswiss-mcp.ars.is/)\n[![next](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fmeteoswiss-mcp-demo-test.cloud.kiste.li%2Fhealth&query=%24.version&label=next&color=lightgrey)](https://meteoswiss-mcp-demo-test.cloud.kiste.li/)\n[![Cursor Directory](https://img.shields.io/badge/Cursor_Directory-Add_to_Cursor-blue)](https://cursor.directory/plugins/meteoswiss-llm-tools)\n\nSwiss weather data for AI assistants — powered by [MeteoSwiss Open Government Data (OGD)](https://opendatadocs.meteoswiss.ch/), the same data behind the MeteoSwiss app and website. Free, no API key required.\n\n**[meteoswiss-mcp.ars.is](https://meteoswiss-mcp.ars.is/)** — try the hosted service instantly, no setup needed.\n\nThis repo is also a working answer to a design question: **how should you give AI agents access to a public dataset?** It implements the same MeteoSwiss data access twice — as an [agent skill](packages/meteoswiss-skills/) (markdown instructions plus bash scripts, no server) and as an [MCP server](packages/meteoswiss-mcp/) (structured tools, fuzzy matching, caching, hosted). The two approaches are compared honestly in the [skill vs. MCP case study](docs/skill-vs-mcp.md).\n\nA third piece, [meteoswiss-forecast-evals](packages/meteoswiss-forecast-evals/), demonstrates eval-driven interface design: a [promptfoo](https://promptfoo.dev/) suite measuring how well 13 LLMs read the forecast JSON, which settled a real design decision — local-time timestamps beat UTC, with hour-level lookups scoring ~100% vs. ~0%.\n\nWhat the tools provide:\n\n- **Multi-day forecasts** for ~6000 Swiss locations (postal codes, stations, place names)\n- **Real-time measurements** from ~300 stations (~160 full weather + ~140 precipitation-only), updated every 10 minutes\n- **Station discovery** by name, canton, or GPS coordinates\n- **Pollen monitoring** from ~15 stations across Switzerland\n- **Climate series** from the National Basic Climatic Network (NBCN), going back decades\n- **MeteoSwiss website** search and content retrieval\n\n## What this repo demonstrates\n\n- **An agent skill** — teach an agent to fetch open data directly with `curl`/`awk`/`jq`: ~630 lines of markdown and bash, zero infrastructure. → [packages/meteoswiss-skills](packages/meteoswiss-skills/)\n- **An MCP server** — the same data as structured, validated tools with fuzzy station matching, geocoding, TTL-tiered caching, a real test suite, Docker, and a hosted instance. → [packages/meteoswiss-mcp](packages/meteoswiss-mcp/)\n- **Eval-driven interface design** — treat tool output as an interface for a language model, and measure its legibility before shipping. → [packages/meteoswiss-forecast-evals](packages/meteoswiss-forecast-evals/)\n\nRead the comparison: **[Skill vs. MCP Server: Two Ways to Give AI Agents the Same Data](docs/skill-vs-mcp.md)**.\n\n## Choose your approach\n\nBoth approaches answer the same weather questions. Which to install depends on your agent:\n\n| | [MCP Server](packages/meteoswiss-mcp/) | [Agent Skill](packages/meteoswiss-skills/) |\n|---|---|---|\n| **What it is** | Standalone server exposing 7 structured tools via MCP | Markdown instructions + 5 bash scripts the agent runs directly |\n| **Works with** | Claude Desktop, Claude.ai, Cursor, any MCP client | Claude Code, Cursor, any agent with shell access |\n| **Coverage** | Forecasts, current weather, stations, pollen, climate series, website search | Forecasts, current weather, stations, pollen |\n| **Extras** | Fuzzy matching, geocoding, caching, DE/FR/IT prompts, structured JSON | No server, no Node.js — just `curl`, `awk`, `jq` |\n| **Size** | ~6.6k lines TypeScript, tested in CI | ~630 lines markdown + bash |\n| **Install** | One-liner (hosted), npm, or Docker | Plugin marketplace, Skills CLI, or symlink |\n\nFull comparison — parity matrix, engineering trade-offs, context cost, when to choose which: [docs/skill-vs-mcp.md](docs/skill-vs-mcp.md).\n\n### MCP server — quickstart\n\nUse the hosted instance (no installation):\n\n```bash\n# Claude Code\nclaude mcp add meteoswiss https://meteoswiss-mcp.ars.is/mcp\n```\n\nFor **Cursor**, install from the [Cursor Directory](https://cursor.directory/plugins/meteoswiss-llm-tools) or add manually via Settings → MCP.\n\nOr self-host with Docker:\n\n```bash\ndocker run -p 3000:3000 ghcr.io/eins78/meteoswiss-mcp:latest\n```\n\nSee the [meteoswiss-mcp README](packages/meteoswiss-mcp/README.md) for Claude Desktop setup, environment variables, and full documentation.\n\n### Agent skill — quickstart\n\nInstall via the Claude Code plugin marketplace:\n\n```bash\n/plugin marketplace add eins78/meteoswiss-llm-tools\n/plugin install meteoswiss-skills@meteoswiss-marketplace\n```\n\nOr with the [Skills CLI](https://github.com/anthropics/skills):\n\n```bash\npnpx skills add https://github.com/eins78/meteoswiss-llm-tools.git#packages/meteoswiss-skills --global --agent claude-code --all\n```\n\nSee the [meteoswiss-skills README](packages/meteoswiss-skills/README.md) for manual installation and details.\n\n## Available tools (MCP server)\n\n| Tool | Description |\n|------|-------------|\n| `meteoswissLocalForecast` | Multi-day forecasts by postal code, station, or place name |\n| `meteoswissCurrentWeather` | Real-time measurements (temperature, wind, humidity, pressure) |\n| `meteoswissStations` | Search station network by name, canton, or coordinates |\n| `meteoswissPollenData` | Pollen concentration data from monitoring stations |\n| `meteoswissClimateData` | NBCN climate series — temperature, precipitation, sunshine, and climate indicators going back decades |\n| `search` | Search MeteoSwiss website content (DE, FR, IT, EN) |\n| `fetch` | Fetch full content from MeteoSwiss pages |\n\n## Example questions\n\nWorks with both approaches — just ask in any of Switzerland's four languages:\n\n- \"What's the weather forecast for Zurich this week?\"\n- \"Wie wird das Wetter in Bern morgen?\"\n- \"Quelle est la météo à Genève?\"\n- \"Che tempo fa a Lugano?\"\n\n## Packages\n\n| Package | Version | Description |\n|---------|---------|-------------|\n| [`meteoswiss-mcp`](packages/meteoswiss-mcp/) | [![npm](https://img.shields.io/npm/v/meteoswiss-mcp)](https://www.npmjs.com/package/meteoswiss-mcp) | MCP server with structured tools, fuzzy matching, and geocoding |\n| [`meteoswiss-skills`](packages/meteoswiss-skills/) | 1.0.0 | Agent skill — direct HTTP access, no server needed |\n| [`meteoswiss-forecast-evals`](packages/meteoswiss-forecast-evals/) | — | LLM eval suite for the forecast JSON format (standalone, not a workspace member) |\n\n## Documentation\n\n- [Skill vs. MCP case study](docs/skill-vs-mcp.md) — the honest comparison of the two approaches\n- [Eval results: forecast JSON comprehension](packages/meteoswiss-forecast-evals/docs/results/2026-07-09-forecast-json-comprehension.md) — the local-time-vs-UTC sweep\n- [MCP server user guide](packages/meteoswiss-mcp/docs/user-guide.md)\n- [Documentation index](docs/README.md)\n\n## Development\n\n```bash\ngit clone https://github.com/eins78/meteoswiss-llm-tools.git\ncd meteoswiss-llm-tools\nnvm use && pnpm install\n```\n\nSee each package's README for package-specific commands. The repo uses [changesets](https://github.com/changesets/changesets) for versioning.\n\nManual, point-in-time test reports (e.g. live MCP tool test passes) live in `docs/test-reports/`.\n\n## Data source\n\nAll weather data comes from [MeteoSwiss Open Government Data (OGD)](https://opendatadocs.meteoswiss.ch/) — the official free data offering from Switzerland's Federal Office of Meteorology and Climatology. The same data powers the MeteoSwiss app and website.\n\n## License\n\n[CC0-1.0](LICENSE) — public domain\n",
  "bytes": 8090,
  "sha": "2c49d2c9aa6e6ee9cd5345bc99002d22c2081e1308316533c2d0cde7c749d1ca",
  "repo_slug": "eins78/meteoswiss-llm-tools",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_eins78_meteoswiss_mcp_62d63afd/readme"
}