smhi-mcp
MCP server that provides real-time weather data, forecasts, and historical weather information from SMHI (Swedish Meteorological and Hydrological Institute) for any location in Sweden.
README
SMHI MCP Server
A Model Context Protocol (MCP) server that provides Swedish weather data through SMHI's open APIs, deployed as a Cloudflare Worker.
π€οΈ Features
- Real-time Weather Data: Access current weather conditions from SMHI weather stations
- Weather Forecasts: Get detailed forecasts for any location in Sweden
- Station Search: Find weather stations by name using fuzzy matching
- Multi-Resolution Data: Access hourly, daily, and monthly weather data
- Historical Data: Query past weather records with pagination and date filtering
- MCP Protocol: Full compatibility with Claude and other MCP clients
- Serverless: Runs on Cloudflare Workers with global edge deployment
- No API Keys Required: Uses SMHI's free open data APIs
- Smart Caching: Multi-level caching with Cloudflare Cache API and R2 storage for optimal performance
- Rate Limiting: Built-in request rate limiting to respect SMHI API limits
π Live Demo
Deployed Server: https://smhi-mcp.hakan-3a6.workers.dev
π Available Tools (19 Total)
Snowmobile Conditions Tools
| Tool | Description | Parameters |
|---|---|---|
list_snowmobile_conditions |
List weather stations for snowmobile conditions by region with capability info | None |
get_station_temperature |
Get latest temperature reading from a specific station | station_id (string) |
get_station_snow_depth |
Get latest snow depth reading from a specific station | station_id (string) |
get_weather_forecast |
Get weather forecast for coordinates | lat (number), lon (number) |
Legacy Tools (Deprecated)
| Tool | Description | Parameters |
|---|---|---|
list_temperature_stations |
[DEPRECATED] Use list_snowmobile_conditions instead |
None |
list_snow_depth_stations |
[DEPRECATED] Use list_snowmobile_conditions instead |
None |
Multi-Resolution Data Tools
| Tool | Description | Parameters |
|---|---|---|
get_station_precipitation |
Get precipitation data with multiple resolutions | station_id, parameter (5=daily, 7=hourly, 14=15min, 23=monthly), period |
get_temperature_multi_resolution |
Get temperature data with multiple resolutions | station_id, parameter (1=hourly, 2=daily-mean, 19=min, 20=max, 22=monthly), period |
get_station_metadata |
Get detailed station metadata and available periods | station_id, parameter |
Historical Data & Pagination
| Tool | Description | Parameters |
|---|---|---|
get_historical_data |
Get historical data with pagination and date filtering | station_id, parameter, period, limit, cursor, reverse, fromDate, toDate |
list_all_temperature_stations |
Get all temperature stations with pagination | cursor (optional) |
list_all_snow_depth_stations |
Get all snow depth stations with pagination | cursor (optional) |
list_all_precipitation_stations |
Get all precipitation stations with pagination | parameter, cursor |
Station Search Tools
| Tool | Description | Parameters |
|---|---|---|
search_stations_by_name |
Search stations by name within a specific parameter type | query, parameter (1=temp, 5=precip, 8=snow), limit, threshold, active_only |
search_stations_by_name_multi_param |
Search stations by name across all parameter types | query, limit, threshold, active_only |
Search Parameters Details
query(required): Station name to search for (fuzzy matching)parameter(search_stations_by_name only): Parameter type filter1= Temperature stations5= Daily precipitation stations7= Hourly precipitation stations8= Snow depth stations
limit(optional, default: 10): Maximum number of results to returnthreshold(optional, default: 0.3): Minimum similarity score (0.0-1.0) for fuzzy matchingactive_only(optional, default: true): Only return stations with recent data activity
π οΈ Quick Start
Option 1: Use the Deployed Server
Connect your MCP client to: https://smhi-mcp.hakan-3a6.workers.dev
Option 2: Deploy Your Own
# Clone the repository
git clone https://github.com/yourusername/smhi-mcp.git
cd smhi-mcp
# Install dependencies
npm install
# Create R2 bucket for caching (required)
wrangler r2 bucket create smhi-historical-data
# Deploy to Cloudflare Workers
npm run deploy
Option 3: Local Development
# Start local development server
npm run dev
# The server will be available at http://localhost:8787
π‘ MCP Protocol Examples
Initialize Connection
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {}
}
}
List Available Tools
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list"
}
Get Weather Forecast (Stockholm)
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "get_weather_forecast",
"arguments": {
"lat": 59.3293,
"lon": 18.0686
}
}
}
List Snowmobile Conditions Stations
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "list_snowmobile_conditions",
"arguments": {}
}
}
Get Station Temperature
{
"jsonrpc": "2.0",
"id": 5,
"method": "tools/call",
"params": {
"name": "get_station_temperature",
"arguments": {
"station_id": "159880"
}
}
}
Search for Weather Stations
{
"jsonrpc": "2.0",
"id": 5,
"method": "tools/call",
"params": {
"name": "search_stations_by_name_multi_param",
"arguments": {
"query": "Stockholm",
"limit": 5,
"threshold": 0.3,
"active_only": true
}
}
}
Get Historical Data with Pagination
{
"jsonrpc": "2.0",
"id": 6,
"method": "tools/call",
"params": {
"name": "get_historical_data",
"arguments": {
"station_id": "159880",
"parameter": "1",
"period": "corrected-archive",
"limit": 20,
"fromDate": "2024-01-01",
"toDate": "2024-01-31"
}
}
}
π§ͺ Testing
Using cURL
# Test MCP initialization
curl -X POST -H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "initialize", "params": {"protocolVersion": "2024-11-05", "capabilities": {}}}' \
https://smhi-mcp.hakan-3a6.workers.dev
# List snowmobile conditions stations
curl -X POST -H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": {"name": "list_snowmobile_conditions", "arguments": {}}}' \
https://smhi-mcp.hakan-3a6.workers.dev
# Test weather forecast for Stockholm
curl -X POST -H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": 4, "method": "tools/call", "params": {"name": "get_weather_forecast", "arguments": {"lat": 59.3293, "lon": 18.0686}}}' \
https://smhi-mcp.hakan-3a6.workers.dev
# Search for weather stations
curl -X POST -H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": 5, "method": "tools/call", "params": {"name": "search_stations_by_name_multi_param", "arguments": {"query": "Stockholm", "limit": 3}}}' \
https://smhi-mcp.hakan-3a6.workers.dev
Using Make Commands
# Run built-in tests
make test-mcp
make test-forecast
make test-stations
ποΈ Architecture
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β MCP Client β β Cloudflare β β SMHI APIs β
β (Claude) βββββΊβ Worker βββββΊβ (opendata) β
β β β (smhi-mcp) β β β
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
The server acts as a bridge between MCP clients and SMHI's weather APIs:
- MCP Client sends JSON-RPC requests
- Cloudflare Worker processes requests and calls SMHI APIs
- SMHI APIs provide real-time weather data
- Worker formats response according to MCP protocol
β‘ Performance & Caching
The server implements a multi-level caching strategy for optimal performance:
Cloudflare Cache API
- Current weather data: 15 minutes TTL
- Weather forecasts: 30 minutes TTL
- Station metadata: 1 week TTL
- Historical data: 24 hours TTL
R2 Storage (CSV Data)
- Standard CSV files: 24 hours TTL
- Recent year data: 1 hour TTL (more volatile)
- Historical data (>2 years): 1 week TTL (stable)
Rate Limiting
- 30 requests per minute maximum to respect SMHI API limits
- Automatic request throttling with user-friendly error messages
Configuration Requirements
# wrangler.toml - R2 bucket for CSV caching
[[r2_buckets]]
binding = "HISTORICAL_DATA"
bucket_name = "smhi-historical-data"
π Data Sources
All weather data comes from SMHI (Swedish Meteorological and Hydrological Institute):
- Observations API: Real-time weather station data
- Forecast API: Weather predictions up to 10 days
- Station Metadata: Information about monitoring stations
Sample Weather Stations
| Station ID | Name | Location | Note |
|---|---|---|---|
| 159880 | Arvidsjaur | Northern Sweden | Temperature & precipitation |
| 155960 | TΓ€rnaby/Hemavan | Mountain region | Temperature data |
| 155940 | MosekΓ€lla/Hemavan | Mountain region | Same location, different parameter names |
| 132170 | Storlien-Storvallen | Norwegian border | Alpine weather station |
| 188850 | KatterjΓ₯kk/RiksgrΓ€nsen | Arctic region | Northernmost station |
Note: Some stations have different names depending on the parameter type. Use search_stations_by_name_multi_param to find stations across all data types.
Active Filtering: By default, search tools only return stations with recent data activity. Set active_only: false to include all stations, including inactive ones.
π§ Configuration
Required Configuration
The worker requires an R2 bucket for CSV caching:
# wrangler.toml - Required R2 configuration
[[r2_buckets]]
binding = "HISTORICAL_DATA"
bucket_name = "smhi-historical-data"
Optional Environment Variables
# wrangler.toml - Optional configuration
[env.production.vars]
# Add public configuration here
# Optional secrets for authentication
[[env.production.secrets]]
API_KEY = "your-api-key-for-auth"
Authentication (Optional)
To enable API key authentication, set the API_KEY secret:
wrangler secret put API_KEY
π Development Commands
# Install dependencies
make install
# Start development server
make dev
# Deploy to Cloudflare
make deploy
# View logs
make logs
# Show deployment status
make status
# Run tests
make test-mcp
Modular Architecture
The codebase has been refactored into a modular structure:
src/
βββ api/ # SMHI API integration
βββ config/ # Constants and configuration
βββ data/ # Station data and presets
βββ handlers/ # WebSocket and SSE handlers
βββ mcp/ # MCP protocol server
βββ middleware/ # Rate limiting and middleware
βββ services/ # Weather data services
βββ tools/ # MCP tool definitions
βββ utils/ # Caching and utility functions
π Claude Integration
To use this server with Claude:
- Desktop App: Add the server URL in Claude's MCP settings
- API: Include the server in your MCP client configuration
- Custom Integration: Use the JSON-RPC protocol directly
Example Claude conversations:
You: "Show me weather stations for snowmobile conditions"
Claude: "Let me get the snowmobile conditions monitoring stations for you."
[Uses list_snowmobile_conditions]
Claude: "Here are 18 weather stations organized by region for snowmobile conditions. The Arctic/Mountain region has KatterjΓ₯kk/RiksgrΓ€nsen with both temperature and snow depth data..."
You: "What's the current temperature in Arvidsjaur?"
Claude: "Let me check the current temperature in Arvidsjaur for you."
[Uses get_station_temperature with station_id "159880"]
Claude: "The current temperature in Arvidsjaur is 15.8Β°C."
You: "Find weather stations near Stockholm"
Claude: "Let me search for weather stations near Stockholm."
[Uses search_stations_by_name_multi_param with query "Stockholm"]
Claude: "I found several weather stations near Stockholm, including Stockholm A (98230) and Stockholm-Observatoriekullen (98210)."
You: "Show me temperature data for MosekΓ€lla from January 2024"
Claude: "Let me search for MosekΓ€lla and get the temperature data."
[Uses search_stations_by_name_multi_param with query "MosekΓ€lla"]
[Uses get_historical_data with station_id "155940", fromDate "2024-01-01", toDate "2024-01-31"]
Claude: "Found MosekΓ€lla (station 155940) - here's the temperature data for January 2024..."
π€ Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Development Setup
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes
- Test locally:
npm run dev - Deploy and test:
npm run deploy - Submit a pull request
π License
This project is open source and available under the MIT License.
π Related Projects
- Model Context Protocol - The protocol specification
- SMHI Open Data - Weather data source
- Cloudflare Workers - Serverless platform
π Support
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- SMHI API Docs: SMHI Open Data Portal
Built with β€οΈ for the MCP ecosystem | Powered by SMHI Open Data | Deployed on Cloudflare Workers
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.