Skip to main content
Glama

gb-climate-mcp

test

An MCP server that gives Claude (or any MCP client) 35 years of daily weather for Gilgit-Baltistan, Pakistan, and a live flash-flood screening outlook for its valleys.

Ask things like:

Is the coming week risky for flash floods in Hunza?

How has snowfall changed at Skardu since 1990?

How unusual was the rain in Gilgit on 26 August 2022?

Why this exists

Flash floods and glacial outbursts hit Gilgit-Baltistan every summer, and many valleys have little or no local early warning. Public weather data for the region also has a trap in it: at four of the five stations the ERA5 reanalysis jumps by 5 to 6.5 °C on average (up to 10 °C in winter) between December 2016 and January 2017, an artefact of a change in how the model assimilates data. Anyone who pulls the raw series and fits a line finds about +1.4 °C of warming per decade. After correcting the step, the five-station average is about +0.08 °C per decade.

This server bundles the corrected record and is written to stop a model from repeating that kind of mistake. Trend tools warn when a range crosses the break, and the caveats are exposed as a resource the model is told to read.

Related MCP server: Weather MCP Server

Tools

Tool

What it does

list_stations

Five stations from 1,250 m (Chilas) to 4,693 m (Khunjerab), coverage and variables

get_daily_weather

Daily values for one station, up to a year per call

climate_trend

Yearly totals or means plus the linear trend per decade

compare_stations

One variable across all stations, ordered by elevation

rain_thresholds

What counts as a heavy, extreme or once-in-years rain day at a station

flood_risk_outlook

Live 1 to 16 day outlook scored against the station's own history

Resource: gb://methodology covers the source, the correction and what it cannot fix.

All tools are read-only. Only flood_risk_outlook touches the network (the free Open-Meteo forecast API, no key). Everything else works offline.

How the flood outlook works

Each forecast day is scored on three drivers, all relative to that valley's own 35-year record:

  1. Daily rain against the station's 90th, 95th, 99th and 99.9th percentiles

  2. Peak hourly rain, the cloudburst signal a daily total hides

  3. Heat-driven melt: a day hotter than 95% of that station's summer days, scored higher after recent snow

The heat threshold is learned per station, not fixed. A hot summer day is about 36 °C in Gilgit but about 6 °C at Khunjerab, and a single fixed cutoff (the first version of this used 32 °C) fires constantly in the low valleys and never at the pass.

Install

Requires Python 3.10+.

Claude Code

claude mcp add gb-climate -- uvx --from git+https://github.com/nawazxz/gb-climate-mcp gb-climate-mcp

Claude Desktop (claude_desktop_config.json)

{
  "mcpServers": {
    "gb-climate": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/nawazxz/gb-climate-mcp", "gb-climate-mcp"]
    }
  }
}

From source

git clone https://github.com/nawazxz/gb-climate-mcp && cd gb-climate-mcp
python -m venv .venv && .venv/bin/pip install -e '.[dev]'
.venv/bin/pytest

Data

ERA5 reanalysis (ECMWF / Copernicus) via the Open-Meteo Historical Weather API, 1990 to 2024, 63,920 station-days. Built from the raw series in gilgit-baltistan-era5-weather by scripts/build_data.py. Pre-2017 rows are shifted onto the post-2017 baseline per station, variable and calendar month; the factors are in src/gb_climate_mcp/data/corrections.json.

Station

Elevation

Mean temp trend 1990-2024 (°C/decade)

Chilas

1,250 m

+0.11

Gilgit

1,500 m

+0.16

Skardu

2,228 m

+0.02

Hunza

2,438 m

+0.04

Khunjerab

4,693 m

+0.05

Limitations

These matter more than the features, so they are spelled out:

  • Precipitation is for a 25 km grid cell, not the valley floor. ERA5 gives Gilgit about 1,430 mm of rain a year. The Gilgit gauge records about 130 mm, because the town sits in a rain shadow while the grid cell includes the wet mountains around it. The server uses rain only in relative terms (percentiles, anomalies, trends), and the tool descriptions tell the model to do the same.

  • The break correction absorbs real change. Matching monthly means across 2017 removes the artificial step and also any genuine difference between the two periods, so trends across 2017 are conservative.

  • The flood outlook is not validated. It has not been tested against recorded flood events yet, the hourly bands (4, 8, 15 mm/h) are hand-set, and the live forecast model is not on exactly the same scale as ERA5. Treat it as a screening signal. Official warnings come from PMD and GBDMA.

Licence

Code: MIT. Data: CC BY 4.0, contains modified Copernicus Climate Change Service information (see DATA_LICENSE).

Available Tools

6 tools
climate_trendA
Read-onlyIdempotent

Yearly values and the linear trend per decade for one station and variable.

Rain, snow, precipitation hours and evapotranspiration are yearly totals; everything else is a yearly mean. Partial years are skipped.

ParametersJSON Schema
NameRequiredDescriptionDefault
stationYes
end_yearNo
variableYes
start_yearNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and closed-world behavior, so the bar is lower. The description adds genuinely useful behavioral detail beyond that: aggregation semantics differ by variable (totals for rain/snow/precipitation hours/evapotranspiration, means otherwise) and partial years are skipped, which affects result interpretation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with the core purpose front-loaded and no filler. The aggregation rule sentence is dense but each clause earns its place by preventing misinterpretation of the returned numbers.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value shape need not be described. However, with 0% schema coverage the definition still leaves the agent guessing at valid variable values and station format, which are the two required parameters — a meaningful gap for a tool whose whole purpose is selecting one of each.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden. It does name four variables that behave as totals and clarifies the station/variable scope, which is real added meaning, but it never enumerates valid variable names, does not explain the station identifier format, and says nothing about start_year/end_year beyond their obvious names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it returns yearly values plus a linear trend per decade, scoped to one station and one variable. The 'one station' scoping implicitly distinguishes it from compare_stations, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the 'one station and variable' scope — an agent can infer this is the single-station trend tool rather than the multi-station comparison. There is no explicit when-to-use statement, no mention of alternatives like compare_stations or get_daily_weather, and no prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_stationsB
Read-onlyIdempotent

Compare all stations on one variable: the average yearly value and the trend per decade, low to high elevation.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_yearNo
variableYes
start_yearNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and closed-world behavior, so the safety profile is covered. The description adds genuinely non-structured behavioral context: results are aggregated across all stations and returned ordered low to high elevation, which an agent could not infer otherwise.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One tight sentence with the core action front-loaded and no redundant padding. It is efficient, though it could have spent a few words covering the year-range parameters instead of nothing at all.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations cover safety. However, for a tool with zero schema-description coverage, the omission of any guidance on the year parameters and the 'variable' vocabulary leaves real gaps for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry all parameter meaning. It hints at the required 'variable' ('on one variable') but says nothing about start_year, end_year, their defaults, their accepted range, or the accepted variable names/formats, leaving two of three parameters undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Compare') and resource ('all stations') plus the exact computed outputs (average yearly value, trend per decade) and ordering. This separates it from list_stations and climate_trend, though it does not explicitly name a sibling to distinguish against.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use context, no prerequisites, and no guidance on choosing between this and siblings like climate_trend or list_stations. Usage is only implied by the word 'compare'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

flood_risk_outlookA
Read-only

Live flash-flood screening outlook for the next 1-16 days at a station.

Pulls the current Open-Meteo forecast and scores each day against the station's own history: daily rain vs historical percentiles, peak hourly rain (cloudburst signal), and heat-driven melt. Returns a risk level per day (normal, watch, elevated, high, severe) with the reasons. A screening signal, not an official warning.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
stationYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only and open-world access; the description adds real value by explaining the live-forecast pull, the scoring method against station history, the risk-level vocabulary, and the explicit caveat that this is screening not an official warning. The live-fetch wording also explains the non-idempotentHint annotation. It omits any note on auth, rate limits or data staleness.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The summary sentence is front-loaded, and the following lines add methodology, the return vocabulary and a caveat without filler. Slightly longer than strictly required, but each sentence contributes distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return structure needn't be spelled out, yet the description still enumerates the risk levels, which helps interpretation. Annotations cover the safety profile. The only notable omission is how to obtain a valid station identifier, given an undocumented string parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must carry the parameters. It usefully pins the 'days' range to 1-16, which the bare integer schema does not, and anchors 'station' to 'at a station'. However it does not say what identifier format a station takes or point to list_stations as the source of valid values, leaving a real gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb+resource ('flash-flood screening outlook'), the scope (next 1-16 days) and the unit of analysis (at a station). It is clearly separable from siblings like get_daily_weather, rain_thresholds and climate_trend without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the tool's role ('a screening signal, not an official warning'), which implies when output should and shouldn't be acted on, but it never contrasts itself with alternatives such as get_daily_weather or rain_thresholds. Usage is inferable rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_daily_weatherA
Read-onlyIdempotent

Daily values for one station between two dates (inclusive, YYYY-MM-DD), at most 366 days per call.

Pass variables to limit columns (see list_stations); by default temperature min/max, precipitation and snowfall are returned. For multi-year questions use climate_trend instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
stationYes
end_dateYes
variablesNo
start_dateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=false, so the safety profile is covered. The description adds real behavioral context beyond them: a hard 366-day per-call ceiling and the default column set (temperature min/max, precipitation, snowfall) when `variables` is omitted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with the scope and limits front-loaded, followed by the parameter guidance and the alternative-route sentence. No filler or repetition of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value documentation is unnecessary, and the description covers the remaining decision-relevant facts: scope, per-call cap, default output columns, and the multi-year alternative. Adequate for an agent to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage the description carries the full burden and largely meets it: it defines the date-range semantics (inclusive, YYYY-MM-DD), explains that `variables` narrows the returned columns, names the defaults, and points to list_stations for valid values. It stops short of clarifying whether `station` is an identifier from list_stations versus a free-form name, or what happens when the range exceeds 366 days.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb/resource/scope combination: daily values, one station, bounded date range. The 366-day cap and the explicit contrast with climate_trend let an agent distinguish this from siblings such as climate_trend and list_stations without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"For multi-year questions use climate_trend instead" is an explicit when-not plus named alternative, and "Pass `variables` to limit columns (see list_stations)" routes the agent to the sibling that enumerates valid inputs. Nothing about when this tool is the right choice is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_stationsA
Read-onlyIdempotent

List the weather stations, their location, elevation, date coverage and the variables available.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=false, so the safety and determinism profile is covered. The description adds which attributes are exposed per station, which is useful, but says nothing about result size, pagination or filtering limits for what could be a large station catalogue.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with the verb and resource first and the returned attributes after; no filler and nothing redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not detail the return shape, and annotations cover the safety profile. The only gap is any hint about the volume of the result set or how it should be used downstream, which is minor for a zero-parameter listing tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters, so the baseline is 4. There is nothing for the description to disambiguate, and it correctly implies the call is unfiltered and returns the full station set.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the weather stations') and enumerates the attributes returned (location, elevation, date coverage, variables). It is clearly a discovery/enumeration tool, but it never distinguishes itself from siblings like compare_stations or get_daily_weather that also operate on stations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance, no prerequisites, and no mention of the sibling tools it complements (e.g. querying weather for a chosen station). Usage is only inferable from the tool name and the fact that it enumerates stations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rain_thresholdsA
Read-onlyIdempotent

What counts as a heavy, extreme or rare rain day at a station, from its 35-year record (percentiles of daily rain).

Values are for the ~25 km ERA5 grid cell, which includes surrounding mountains, so they are much higher than valley-floor gauge readings. Use them to judge how unusual a day is, not how much fell in town.

ParametersJSON Schema
NameRequiredDescriptionDefault
stationYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly/idempotent/closed-world, and the description adds a genuinely important behavioral caveat: values reflect the ~25 km ERA5 grid cell including surrounding mountains, not valley-floor gauge readings. It also discloses the 35-year record basis. It does not cover return format, but annotations lower the bar on that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core definition, then the CRS/grid caveat, then the usage warning. Three tight sentences with no filler, though the colloquial 'in town' phrasing is slightly imprecise for a global tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers scope, derivation window, and the grid-vs-gauge caveat well. The only real gap is the ambiguity of the single required 'station' argument.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is one parameter ('station') with 0% schema description coverage, and the description never says what identifier form it expects or where valid values come from (e.g., list_stations). With low coverage, the description was the place to compensate, and it does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource and what it returns: percentiles of daily rain defining heavy/extreme/rare days, derived from a 35-year station record. That is far more informative than the bare name, but it does not explicitly distinguish itself from siblings like get_daily_weather, so the agent must infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear intended use ('use them to judge how unusual a day is') and an explicit when-not ('not how much fell in town'), which steers the agent away from misusing thresholds as rainfall totals. It stops short of naming an alternative tool for actual amounts, so it is not fully prescriptive.

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.

  1. 6 tool updatesv0.1.0
    • First observedclimate_trend
    • First observedcompare_stations
    • First observedflood_risk_outlook
    • First observedget_daily_weather
    • First observedlist_stations
    • First observedrain_thresholds

TDQS

A3.8/5.0

Scored across 6 tools

Disambiguation4/5

Most tools target clearly distinct outputs: listing stations, daily data, rain percentiles, flood outlook, and cross-station comparison are all separable. The only mild overlap is between compare_stations and climate_trend, since both surface trends-per-decade, but compare_stations is explicitly cross-station while climate_trend is single-station, so the descriptions keep them apart.

Naming Consistency4/5

All names use consistent snake_case, which is good. However the verb pattern is mixed: some are verb_noun (compare_stations, list_stations, get_daily_weather) while others are noun phrases (rain_thresholds, climate_trend, flood_risk_outlook), a minor deviation from a single predictable pattern.

Tool Count5/5

Six tools is well-scoped for a climate data server, covering discovery, retrieval, trend analysis, thresholds, and forecasting without redundancy. Each tool earns its place.

Completeness4/5

The surface covers the full lifecycle well: station discovery, daily historical retrieval, long-term trends, cross-station comparison, rain thresholds, and live flood screening. Minor gaps exist (e.g. no explicit station-metadata lookup beyond list_stations, no sub-daily history), but core workflows are covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Exposes Swiss weather forecast data as MCP tools, including rainfall, sunshine, temperature, wind, and more, with local caching.
    8
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables to interact with comprehensive weather data through the MCP protocol, including current conditions, multi-day forecasts, hourly forecasts, and geocoding.
    12 npm
    MIT