meteo-swiss-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@meteo-swiss-mcpShow me the total rainfall for Zurich in the next 48 hours."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Swiss Weather MCP Server
A Model Context Protocol (MCP) server that exposes Swiss weather forecast data as callable tools. It fetches data from the official MeteoSwiss meteodata-lab, caches it locally, and serves predictions such as rainfall, sunshine, temperature, etc. The prediction data is from the ICON-CH2-EPS forecast system that produces data for up to 5 days ahead.
Additionally there is also an MCP client that can be run to test the server using the stdio transport.
Note: This project is not an official MeteoSwiss product. All forecast data are from the MeteoSwiss Open Data portal. Source: MeteoSwiss
Table of Contents
Related MCP server: wetter-mcp-server
Project Structure
swiss-weather-mcp/
├── src/swiss_weather_mcp/
│ ├── server.py # MCP server
│ ├── predictions.py # Data fetching logic
│ └── client.py # MCP client (optional)
├── tests/swiss_weather_mcp/ # Pytest suite
├── .github/workflows/ # CI and release pipelines
├── docs/ # Documentation
├── pyproject.toml # Project metadata and dependencies
├── uv.lock # Pinned, reproducible dependency set
├── .env # NOMINATIM_USER_AGENT (not committed)
└── DockerfileCaches live outside the project, under your OS's standard cache directory (see Installation).
Quick Start
1. Installation
Install the server globally to run it anywhere on your system:
uv tool install swiss-weather-mcp2. Configuration
Create a .env file with your Nominatim user agent (see Configuration):
echo 'NOMINATIM_USER_AGENT="YourWeatherMCPServer/1.0 (yourname@example.com)"' > .env3. Execution
Run the server from the directory containing your .env file:
swiss-weather-mcp-serverInstallation
As a Global CLI Tool
uv tool install swiss-weather-mcpAs a Library Dependency
# Using uv
uv add swiss-weather-mcp
# Using pip
pip install swiss-weather-mcpNote: Add the
clientextra (swiss-weather-mcp[client]) if you also want the optional MCP client, which pulls in the Ollama SDK.
From Source
git clone https://github.com/cuolm/swiss-weather-mcp.git
cd swiss-weather-mcp
# Using uv (Recommended)
uv sync --extra client
# Using pip
python3 -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
pip install -e ".[client]"Note:
uv syncon its own installs the server only. The--extra clientflag is what pulls in the Ollama SDK needed byswiss-weather-mcp-client.
Note:
Ollama is optional – only needed if you want to use the MCP client (
swiss-weather-mcp-client, installed via theclientextra).The server reads its
.envfile relative to the current working directory — run it from the directory that holds your.envfile. ExportingNOMINATIM_USER_AGENTin your shell works when you start the server yourself, but not withswiss-weather-mcp-client: the MCP stdio transport only forwards a fixed list of environment variables to the server it starts, so the client needs the.envfile.Caches are stored under your OS's standard cache directory (via platformdirs, e.g.
~/Library/Caches/swiss-weather-mcpon macOS,~/.cache/swiss-weather-mcpon Linux) — independent of where the server is launched from, so downloaded forecasts and geocoded locations are reused across runs.EarthKitCache/avoids re‑downloading weather data. Delete it to clear.nominatim_geocode_cache.jsoncaches lat/lon lookups. Delete it to clear.
Configuration
Create a .env file in the directory you'll run the server from, specifying an environment variable that tells Nominatim (the geocoding service) who is making the call.
echo 'NOMINATIM_USER_AGENT="YourWeatherMCPServer/1.0 (yourname@example.com)"' > .envNote: Replace the application name and address with your own. The Nominatim usage policy requires a user agent identifying a real application and contact address, and blocks requests that do not provide one. Keep lookups to at most one per second; results are cached, so only locations that have not been requested before reach the service.
Usage
Running the Server
If installed via uv tool install or pip:
# stdio (default)
swiss-weather-mcp-server
# streamable-http
swiss-weather-mcp-server --transport=streamable-http --host=localhost --port=8050If running within the source repository cloned from GitHub:
# Using uv (Recommended)
uv run swiss-weather-mcp-server
# Using pip, with the virtual environment activated
swiss-weather-mcp-serverOptional flags: --help
Running the Server with Docker
Images are built and published automatically by GitHub Actions to the project's GitHub Container Registry, tagged :latest (newest release) and by version.
Create a
.envfile containing your Nominatim user agent environment variable (replace"YourWeatherMCPServer/1.0 (yourname@example.com)"):
echo 'NOMINATIM_USER_AGENT="YourWeatherMCPServer/1.0 (yourname@example.com)"' > .envRun the published image, passing the
.envfile and mapping port 8050:
docker run --env-file .env -p 8050:8050 ghcr.io/cuolm/swiss-weather-mcp:latestAccess the server at:
http://localhost:8050/mcp/Manual Build
docker build -t swiss-weather-mcp .
docker run --env-file .env -p 8050:8050 swiss-weather-mcpRunning the MCP Client using Stdio Transport
The bundled MCP client can be used to test the server over the stdio transport. It requires the client extra (see Installation).
Make sure Ollama is installed on your system. You can download it here or install via Homebrew on macOS: brew install ollama
# Pull a local Ollama LLM model (e.g. qwen3:4b)
ollama pull qwen3:4b
# Run the MCP client (it automatically starts the server as a subprocess)
swiss-weather-mcp-client --model=qwen3:4b
# From a source checkout, using uv
uv run --extra client swiss-weather-mcp-client --model=qwen3:4bAvailable Tools
Tool | Purpose | Example Call |
| Current date and time (weekday day.month.year hour:minute:second) in Swiss local time |
|
| Total rainfall (mm) for a period |
|
| Sunshine hours for a period |
|
| Max temperature (°C) at a specific lead time |
|
| Wind speed (m/s) at a specific lead time |
|
| Sea‑level pressure (Pa) at a specific lead time |
|
| Cloud cover (%) at a specific lead time |
|
| Snow depth (m) at a specific lead time |
|
| Precipitation rate (mm/s) at a specific lead time |
|
Lead Time
Lead time is the number of hours counted from Swiss local time 00:00, internally converted to UTC (the ICON-CH2-EPS forecast system uses UTC).
Example: A lead time of 36 hours returns the forecast for 12:00 Swiss local time tomorrow.
Minimum lead time: 2 hours; maximum lead time: 121 hours.
Example Usage with LMStudio
Using the streamable-http transport layer
Configure the mcp.json file in LMStudio:
{
"mcpServers": {
"swiss_weather_mcp_server": {
"url": "http://localhost:8050/mcp/"
}
}
}Run the MCP server with the streamable-http transport layer:
uv run swiss-weather-mcp-server --transport=streamable-http --host=localhost --port=8050Using the stdio transport layer
Configure the mcp.json file in LMStudio. Replace <path-to-the-project> with your actual local path:
{
"mcpServers": {
"swiss_weather_mcp_server": {
"command": "<path-to-the-project>/.venv/bin/swiss-weather-mcp-server"
}
}
}
Tests
Run the test suite from the project root with:
uv run pytest
# Or, with an activated virtual environment
pytestEvery push and pull request runs the suite plus a Docker build check via the Tests workflow.
Releasing
Versions are derived from Git tags by hatch-vcs — there is no version string to bump by hand.
Pushing a pre-release tag (e.g.
0.2.0rc1) triggersrelease_test.yaml: tests, publish to TestPyPI, push a versioned image to GHCR, and create a prerelease GitHub Release.Pushing a final tag (e.g.
0.2.0) triggersrelease.yaml: tests, publish to PyPI, push:<version>and:latestimages to GHCR, and create a GitHub Release.
Both publish jobs use PyPI trusted publishing via the pypi / testpypi GitHub environments — no API tokens are stored in the repository.
Resources
License
Licensed under the Apache License 2.0.
Available Tools
9 toolscurrent_date_and_timeA
Get a human-readable string of the current time, weekday and date.
Returns:
str: A string in the format "Today is <weekday> <day>.<month>.<year> <hour>:<minute>:<second>"
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does a good job by stating that this is a read-only 'Get' operation and by specifying the exact return format. The only notable omission is timezone awareness, since 'current time' is not qualified as local or UTC.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief, front-loaded with the core purpose, and every sentence adds useful information. The return format is specified without unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only utility tool with an output schema and an explicitly documented return format, the description is fully sufficient. No additional usage context or edge-case guidance is necessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing for the description to explain about arguments. The baseline of 4 applies, and the description appropriately focuses on the return value instead.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and names the exact resource: a human-readable string of the current time, weekday, and date. It is immediately distinct from the weather-focused sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose is clear enough that an agent knows to use it whenever the current date/time is needed, and the sibling names make it obvious this is the only non-weather tool. It does not explicitly state exclusions or alternative conditions, but no meaningful alternatives exist here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
precipitation_rateA
Get precipitation rate for a location at a specific offset time.
Args:
location (str): Location name (e.g., "Zurich").
lead_time_swiss (int): Hour offset from today at 00:00 Swiss local time. Min offset time is 2 hours. Max offset time is 121 hours.
Returns:
float: Precipitation rate in millimeters per second.
Examples:
precipitation_rate("Zurich", 2) # Precipitation rate at 02:00 Swiss local time today
precipitation_rate("Zurich", 14) # Precipitation rate at 14:00 Swiss local time today
precipitation_rate("Zurich", 36) # Precipitation rate at 12:00 Swiss local time tomorrow
precipitation_rate("Zurich", 113) # Precipitation rate at 17:00 Swiss local time in 4 days
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | ||
| lead_time_swiss | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the time offset constraints (min 2 hours, max 121 hours) and the return unit (millimeters per second), which is useful. However, with no annotations provided, the description carries the full burden. It does not mention potential errors (e.g., invalid location, out-of-range offset), data source, or whether the value is an instantaneous rate or averaged. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear summary, parameter explanations, return type, and examples. It is slightly verbose with the examples taking up space, but they are genuinely helpful for understanding the offset semantics. Every section earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return values are documented. The description covers the two required parameters, their semantics, and constraints. It lacks edge-case handling (e.g., what happens for invalid locations or out-of-range offsets) and does not mention data source or accuracy, but for a simple lookup tool it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does: it explains the 'location' parameter with an example ('Zurich') and the 'lead_time_swiss' parameter with a detailed definition ('Hour offset from today at 00:00 Swiss local time') plus min/max bounds and examples. This adds significant meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get precipitation rate for a location at a specific offset time.' It specifies the resource (precipitation rate), the location, and the time offset. It is distinct from siblings like total_rainfall or snow_depth, which measure different weather variables.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool: for precipitation rate at a specific hour offset. It includes examples that illustrate usage. However, it does not explicitly state when not to use it or name alternatives (e.g., total_rainfall for accumulated precipitation), so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pressure_mslA
Get sea-level pressure for a location at a specific offset time.
Args:
location (str): Location name (e.g., "Zurich").
lead_time_swiss (int): Hour offset from today at 00:00 Swiss local time. Min offset time is 2 hours. Max offset time is 121 hours.
Returns:
float: Sea-level pressure in Pascals (Pa).
Examples:
pressure_msl("Zurich", 2) # Pressure at 02:00 Swiss local time today
pressure_msl("Zurich", 14) # Pressure at 14:00 Swiss local time today
pressure_msl("Zurich", 36) # Pressure at 12:00 Swiss local time tomorrow
pressure_msl("Zurich", 113) # Pressure at 17:00 Swiss local time in 4 days
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | ||
| lead_time_swiss | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses non-obvious constraints: lead_time_swiss is an hour offset from 00:00 Swiss local time, min/max valid values are 2 and 121 hours, and the return value is in Pascals. This is valuable context beyond a simple 'get pressure' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and then compactly documents parameters, return type, and examples. Every part earns its place, especially the examples that disambiguate the offset semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool, the description is complete: both parameters are fully specified, return units are stated, and examples cover multiple offset ranges. The output schema covers the return shape, so nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does thoroughly. location is explained with an example, and lead_time_swiss gets a precise meaning, valid range, and illustrative examples mapping offsets to Swiss local times.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: "Get sea-level pressure for a location at a specific offset time." This clearly differentiates it from sibling weather-variable tools like temperature, wind_speed, or total_rainfall, even without naming them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended purpose is clear enough to infer when to use the tool, but there is no explicit 'use this when' guidance or mention of alternatives/exclusions. The agent must infer selection from the purpose statement and sibling tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
snow_depthA
Get forecasted snow depth for a location at a specific offset time.
Args:
location (str): Location name (e.g., "Zurich").
lead_time_swiss (int): Hour offset from today at 00:00 Swiss local time. Min offset time is 2 hours. Max offset time is 121 hours.
Returns:
float: Forecasted snow depth in meters.
Examples:
snow_depth("Zurich", 2) # Snow depth at 02:00 Swiss local time today
snow_depth("Zurich", 14) # Snow depth at 14:00 Swiss local time today
snow_depth("Zurich", 36) # Snow depth at 12:00 Swiss local time tomorrow
snow_depth("Zurich", 113) # Snow depth at 17:00 Swiss local time in 4 days
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | ||
| lead_time_swiss | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It states the return type and units (float in meters), the exact meaning and valid range of lead_time_swiss (2 to 121 hours from 00:00 Swiss local time), and provides multiple examples that clarify the time arithmetic. This goes well beyond minimal behavior disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-organized with explicit Args, Returns, and Examples sections. It front-loads the core purpose, then gives parameter details and illustrative examples without repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, a bare input schema, and a simple two-parameter tool, the description provides everything an agent needs: parameter meaning, constraints, return units, and example calls. The sibling tools are different variables and require no additional disambiguation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully document parameters. It explains location with an example, defines lead_time_swiss as the hour offset, provides min/max constraints, and all examples map offsets to concrete Swiss local times. Every parameter is semantically covered despite the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair: 'Get forecasted snow depth for a location at a specific offset time.' It clearly distinguishes snow_depth from the sibling weather tools by naming the exact physical quantity and its temporal dimension.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes clear it is for obtaining forecasted snow depth at a location and offset time, and documents the valid lead-time range. It does not explicitly compare with alternatives, but among the listed sibling weather tools, selection is straightforward from the variable name and description, so explicit exclusion is not necessary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sunshine_hoursA
Get sunshine hours for a location and offset period.
Args:
location (str): Location name (e.g., "Zurich").
lead_time_start_swiss (int): Start hour offset from today at 00:00 Swiss local time. Min offset time is 2 hours.
lead_time_end_swiss (int): End hour offset from today at 00:00 Swiss local time. Max offset time is 121 hours.
Returns:
float: Predicted sunshine hours for the specified period.
Examples:
sunshine_hours("Zurich", 2, 24) # Total sunshine hours today
sunshine_hours("Zurich", 24, 48) # Total sunshine hours tomorrow
sunshine_hours("Zurich", 30, 36) # Total sunshine hours tomorrow morning
sunshine_hours("Zurich", 36, 42) # Total sunshine hours tomorrow afternoon
sunshine_hours("Zurich", 42, 48) # Total sunshine hours tomorrow evening
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | ||
| lead_time_end_swiss | Yes | ||
| lead_time_start_swiss | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden. It conveys a non-mutating read/prediction ('Get ... Predicted sunshine hours'), states the valid offset bounds (2–121 hours), and anchors the time base ('today at 00:00 Swiss local time'). It stops short of describing failure behavior for invalid ranges, so a perfect score is not warranted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The docstring is organized into Intro, Args, Returns, and Examples, with the core operation front-loaded. The five examples are slightly redundant but each earns its place by clarifying the offset semantics; no filler is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with three required parameters and no annotation context, the description is complete: it covers every parameter, the return type, the timezone/offset convention, and valid bounds. The output schema exists and the Returns line already states the float result, so nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must supply all parameter meaning, and it does: it defines location with an example, defines both offsets as hours from today 00:00 Swiss time, and gives min/max constraints. The examples additionally map numeric ranges to natural-language periods such as 'today' and 'tomorrow morning.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair ('Get sunshine hours') and immediately scopes it by 'location and offset period.' This target variable is distinct from sibling weather tools such as total_cloud_cover and temperature, and the examples reinforce what the tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The Args section and five examples provide clear context for when to call this tool: to obtain forecast sunshine hours over a specific lead-time window, expressed in Swiss local time. It does not explicitly name alternatives or exclusion conditions, but the resource it returns makes the appropriate choice obvious among the weather-variable siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
temperatureA
Get air temperature for a location at a specific offset time.
Args:
location (str): Location name (e.g., "Zurich").
lead_time_swiss (int): Hour offset from today at 00:00 Swiss local time. Min offset time is 2 hours. Max offset time is 121 hours.
Returns:
float: Maximum air temperature in Celsius for the given lead time.
Examples:
temperature("Zurich", 2) # Temperature at 02:00 Swiss local time today
temperature("Zurich", 14) # Temperature at 14:00 Swiss local time today
temperature("Zurich", 36) # Temperature at 12:00 Swiss local time tomorrow
temperature("Zurich", 113) # Temperature at 17:00 Swiss local time in 4 days
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | ||
| lead_time_swiss | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description bears full responsibility for behavioral disclosure. It does mention that the return is 'Maximum air temperature in Celsius' and provides min/max lead time limits, which is helpful. However, the wording 'Maximum' is confusing and seems to contradict the examples (which show temperatures at specific hours), and it does not describe error handling, data source, or any side effects. This is a partial disclosure with notable gaps, so a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured as a docstring with a one-sentence purpose, Args, Returns, and Examples. It is front-loaded with the core purpose and uses minimal words to convey parameters and return type. Each part earns its place, and the examples are concise. No redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 params, returns a float) and the presence of an output schema, the description covers the essentials: what it does, parameter semantics, return type, and examples. It explains the lead time offset fully and even notes limits. The main gap is the ambiguous 'Maximum' wording and lack of error handling or data-source context, which slightly incomplete for a fully specified tool. However, it is largely sufficient, so a 4 is suitable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only parameter names and types with no descriptions (0% coverage). The description fully compensates by explaining both parameters in detail: 'location' as a name and 'lead_time_swiss' as an hour offset with explicit min/max values and an explanation of the base time (today at 00:00 Swiss local time). The examples illustrate the mapping between offset and actual time, adding significant semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a clear verb and resource: 'Get air temperature for a location at a specific offset time.' This distinguishes it from sibling tools like total_cloud_cover or wind_speed, which address different weather parameters. The purpose is unambiguous and it immediately tells an agent what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states the tool fetches air temperature, which implicitly indicates when to use it (when temperature is needed), but it does not explicitly mention when not to use it or offer alternatives. It provides context on the offset and time zone, but no exclusions or comparisons to sibling tools. This meets the 'clear context, no exclusions' bar, so a 4 is warranted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
total_cloud_coverA
Get total cloud cover percentage for a location at a specific offset time.
Args:
location (str): Location name (e.g., "Zurich").
lead_time_swiss (int): Hour offset from today at 00:00 Swiss local time. Min offset time is 2 hours. Max offset time is 121 hours.
Returns:
float: Total cloud cover percentage.
Examples:
total_cloud_cover("Zurich", 2) # Cloud cover at 02:00 Swiss local time today
total_cloud_cover("Zurich", 14) # Cloud cover at 14:00 Swiss local time today
total_cloud_cover("Zurich", 36) # Cloud cover at 12:00 Swiss local time tomorrow
total_cloud_cover("Zurich", 113) # Cloud cover at 17:00 Swiss local time in 4 days
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | ||
| lead_time_swiss | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the input constraints (min/max offset of 2 to 121 hours), the return type (float), and explains the offset semantics with examples. It does not mention error handling or data availability edge cases, but for a simple weather lookup, the provided details are sufficient and not misleading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured into paragraphs for purpose, arguments, return value, and examples. It front-loads the primary purpose and includes only relevant details. Each sentence adds value (constraints, examples) without redundancy. The formatting is clean and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity and the presence of an output schema, the description covers all necessary aspects: both parameters with constraints, the return value, and illustrative examples. The description is complete for an agent to call the tool correctly. No critical information (e.g., units, timezone) is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only types (string, integer) with no descriptions, and schema_description_coverage is 0%. The description fully compensates by explaining that location is a place name, lead_time_swiss is an hour offset from 00:00 Swiss local time, and it specifies the valid range (2–121). The examples clarify the time interpretation, adding substantial meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get total cloud cover percentage for a location at a specific offset time', specifying the exact resource (cloud cover percentage) and the parameters that distinguish it from siblings (location, specific offset time). The name matches the purpose, and the description includes the verb 'Get' and concrete examples that remove any ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates the tool is for retrieving cloud cover, but it does not explicitly compare to siblings like total_rainfall or temperature. However, the purpose is so specific that an agent can infer when to use it. The examples also illustrate valid call patterns, effectively showing when the tool applies, though no exclusions or alternative tools are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
total_rainfallA
Get total rainfall for a location and offset period.
Args:
location (str): Location name (e.g., "Zurich").
lead_time_start_swiss (int): Start hour offset from today at 00:00 Swiss local time. Min offset time is 2 hours.
lead_time_end_swiss (int): End hour offset from today at 00:00 Swiss local time. Max offset time is 121 hours.
Returns:
float: Total precipitation accumulation in millimeters for the given period.
Examples:
total_rainfall("Zurich", 2, 24) # Total rainfall today
total_rainfall("Zurich", 24, 48) # Total rainfall tomorrow
total_rainfall("Zurich", 24, 30) # Total rainfall tonight
total_rainfall("Zurich", 30, 36) # Total rainfall tomorrow morning
total_rainfall("Zurich", 36, 42) # Total rainfall tomorrow afternoon
total_rainfall("Zurich", 42, 48) # Total rainfall tomorrow evening
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | ||
| lead_time_end_swiss | Yes | ||
| lead_time_start_swiss | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden and does a reasonably good job: it states valid offset bounds (minimum 2 hours, maximum 121 hours), clarifies the timezone basis ('Swiss local time'), and specifies the return type and unit (float in millimeters). It does not discuss error behavior or data availability, which prevents a higher score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear Args, Returns, and Examples sections, and the core purpose is front-loaded. The six examples are somewhat repetitive but collectively illustrate the meaning of the offset parameters effectively.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple three-parameter tool with no nested objects or enum constraints, and the description covers all parameters, valid ranges, return units, and illustrative time-window examples. An agent has enough information to call the tool correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must supply all semantic meaning. It explains 'location' with an example, and defines both lead_time_start_swiss and lead_time_end_swiss as hour offsets from today at 00:00 Swiss local time with min/max constraints. The examples further clarify the expected parameter relationships.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action ('Get total rainfall'), the resource (a location and offset period), and the return unit (millimeters). It is easily understandable and distinct enough from siblings like precipitation_rate, though it does not explicitly call out a sibling for differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The examples imply usage scenarios such as 'total rainfall today' and 'tomorrow morning', which help an agent understand the intended time-window semantics. However, there is no explicit guidance on when to prefer this tool over alternatives like precipitation_rate or total_cloud_cover.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wind_speedA
Get predicted wind speed for a location at a specific offset time.
Args:
location (str): Location name (e.g., "Zurich").
lead_time_swiss (int): Hour offset from today at 00:00 Swiss local time. Min offset time is 2 hours. Max offset time is 121 hours.
Returns:
float: Predicted wind speed in meters per second.
Examples:
wind_speed("Zurich", 2) # Wind speed at 02:00 Swiss local time today
wind_speed("Zurich", 14) # Wind speed at 14:00 Swiss local time today
wind_speed("Zurich", 36) # Wind speed at 12:00 Swiss local time tomorrow
wind_speed("Zurich", 113) # Wind speed at 17:00 Swiss local time in 4 days
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | ||
| lead_time_swiss | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description itself discloses that the value is predicted, constrains lead_time_swiss to 2–121 hours, and specifies output units in meters per second. It does not mention error behavior or data update characteristics, but for a simple read-only query it provides meaningful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The docstring is organized with Args, Returns, and Examples, front-loading the tool's purpose. Each section adds useful information with no filler, and the examples clarify the offset-to-clock-time mapping efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has only two parameters, both thoroughly explained, and the return type and units are clearly described. It could additionally state what happens for invalid locations or out-of-range offsets, but those details are not required to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only names and types with 0% description coverage, so the description must carry the load. It explains location as a location name and lead_time_swiss as an hour offset from 00:00 Swiss local time, with min/max bounds and worked examples, fully specifying parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get predicted wind speed for a location at a specific offset time.' This clearly distinguishes it from sibling tools that return other weather variables such as temperature, total_cloud_cover, or precipitation_rate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys usage context through the offset-time semantics and examples, but it never explicitly states when to choose this tool over siblings or gives exclusion criteria. Usage is implied rather than directly instructed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v0.1.0- First observed
current_date_and_time - First observed
precipitation_rate - First observed
pressure_msl - First observed
snow_depth - First observed
sunshine_hours - First observed
temperature - First observed
total_cloud_cover - First observed
total_rainfall - First observed
wind_speed
TDQS
Scored across 9 tools
Each tool returns a distinct meteorological variable or time-related value. Total rainfall and precipitation rate are related but clearly differentiated by period vs. instantaneous rate, so no tool boundaries are ambiguous.
All tool names follow a consistent snake_case noun pattern describing the measured quantity (e.g., total_cloud_cover, wind_speed, pressure_msl). Current_date_and_time fits the same noun-phrase style and does not deviate from the naming convention.
Nine tools is well-scoped for a weather data server, covering the main forecast variables without unnecessary duplication or bloat. Each tool earns its place in the set.
The surface covers core weather variables (temperature, precipitation, wind, pressure, cloud cover, sunshine, snow) and time-based queries. Minor gaps like humidity or wind direction are absent, but agents can still answer most common weather questions without workarounds.
Maintenance
Related MCP Connectors
OpenWeather MCP — wraps the OpenWeatherMap API (openweathermap.org)
Visual Crossing Weather MCP — wraps the Visual Crossing Weather Timeline API
Hosted MCP server for Xweather weather data: conditions, forecasts, alerts, and more.
WeatherAPI.com MCP — wraps WeatherAPI.com (api.weatherapi.com)
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables AI models to access Swiss weather and climate data from MeteoSwiss, including current observations, forecasts, and warnings.626 PyPIMIT
- AlicenseAqualityBmaintenanceMCP server for weather forecasts via Open-Meteo (no API key needed), providing current weather, hourly, and daily forecasts with geocoding support.3MIT
- AlicenseNot gradedqualityAmaintenanceMCP server for querying MeteoSwiss open weather data, providing access to station data, forecasts, radar composites, and more via natural language.77 PyPI44MIT
- FlicenseNot gradedqualityCmaintenanceProvides real-time weather forecasts, current conditions, and smart umbrella recommendations through MCP tools, backed by the Open-Meteo API.-