Skip to main content
Glama

imgw-mcp

Local MCP server for IMGW-PIB (Polish Institute of Meteorology and Water Management) public data feed — current weather, hydrological readings, and active meteorological warnings across Poland.

Part of the honest-mcp family of small, auditable, local-first MCP servers.

Why

Anyone in Poland who watches river levels (flood-plain landlord, kayaker, farmer), plans outdoor work, or just wants a native alternative to yr.no or the ECMWF apps can hand IMGW's raw feed to their AI in one line. No API key. No rate limit worth worrying about.

Related MCP server: Environment Agency Flood Monitoring MCP Server

Features

Five tools:

  • get_weather — current synoptic observations. Whole country (~60 stations) or one station.

  • get_hydro — hydrological readings. Water level, flow, water temperature, alarm/warning thresholds. Server annotates each with computed alarm_status (normal / warning / alarm).

  • get_warnings — active IMGW meteorological warnings (storms, frost, heat, precipitation, wind) with severity and validity window.

  • list_weather_stations — station-name index for get_weather.

  • list_hydro_stations — station index with rivers and provinces, filterable, for get_hydro.

Data source

  • Endpoint: danepubliczne.imgw.pl/api/data — IMGW public data feed

  • No API key

  • Refresh: synop hourly, hydro every ~20 minutes, warnings whenever a new one is issued

Requirements

  • Python 3.10+

Setup

git clone https://github.com/bartosz-kuc/imgw-mcp.git
cd imgw-mcp
python3 -m venv venv
./venv/bin/pip install -r requirements.txt

Register with Claude Code:

claude mcp add imgw /absolute/path/to/venv/bin/python /absolute/path/to/server.py

Claude Desktop claude_desktop_config.json:

{
  "mcpServers": {
    "imgw": {
      "command": "/absolute/path/to/venv/bin/python",
      "args": ["/absolute/path/to/server.py"]
    }
  }
}

Example usage

"What's the temperature in Warsaw right now?"

get_weather(station="warszawa") → single-station JSON with temperature, wind, humidity, precipitation, pressure.

"Any active storm warnings?"

get_warnings() → list of active warnings, filter yourself by nazwa_zdarzenia.

"Any rivers in Mazowieckie above alarm level?"

get_hydro(province="mazowieckie", only_alerts=true) → just stations where current level ≥ alarm threshold.

Data flow

Your AI client
     ↕  MCP stdio
This server (Python, on your machine)
     ↕  HTTPS
danepubliczne.imgw.pl

No cloud middle. No telemetry.

Author

Bartosz Kuć — Warsaw-based developer, JDG owner running skanfirmy.pl.

Consulting

Available for consulting on Polish tax and business integrations (KSeF, GUS/NFZ/GIOŚ APIs, mBank data), MCP server design, and AI-assisted tooling for JDGs and small teams. See skanfirmy.pl/uslugi for productized packages (audit 3k PLN, setup 8-15k PLN, retainer 2-4k PLN/mo), or reach out via email.

License

MIT — see LICENSE.

Available Tools

5 tools
get_hydroA

Get current hydrological readings from IMGW. Includes water level (stan_wody), flow rate, water temperature, and the alarm / warning threshold levels for the station. Server annotates each with alarm_status = normal / warning / alarm computed from current vs thresholds.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (default 100 — full set is ~900)
riverNoFilter by river name (case-insensitive substring)
stationNoStation name (case-insensitive substring). Omit to get all ~900 stations.
provinceNoFilter by voivodeship (e.g., 'mazowieckie')
only_alertsNoIf true, only return stations in warning or alarm state

TDQS

A4/5.0
Behavior4/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It transparently explains that the server computes an alarm_status field from current values vs. thresholds, which is not evident from the schema. This adds meaningful context about the tool's internal behavior, though it omits other traits like rate limits or error behavior.

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?

The description is two sentences long, front-loads the core purpose, and lists key data fields without redundant detail. Every sentence contributes value, making it highly concise and well-structured.

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?

For a read-only tool with 5 optional parameters and 100% schema coverage, the description adequately conveys the data returned and the alarm_status behavior. The only minor gap is the absence of explicit guidance on pagination or handling of large result sets (though limit is in the schema), and it does not reference sibling tools for context, but overall it provides sufficient information for correct invocation.

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 100%, so all parameters are fully documented in the input schema. The description does not add parameter-specific meaning beyond what the schema already provides, hitting the baseline of 3.

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 description clearly states the tool retrieves current hydrological readings from IMGW, enumerating specific fields (water level, flow rate, temperature, thresholds). This verb+resource definition is unambiguous and naturally distinguishes it from siblings like get_warnings (warnings vs. readings) and get_weather (weather vs. hydrology).

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?

The description implies usage for hydrological data retrieval but does not explicitly state when to choose this tool over get_warnings or other siblings. There is no mention of alternatives or exclusions, leaving the agent to infer the appropriate context from the purpose alone.

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

get_warningsB

Get active IMGW meteorological warnings across Poland. Fields: nazwa_zdarzenia (event type — burze, mróz, upał, opady, wiatr, etc.), stopien (severity 1..3), prawdopodobienstwo (probability %), obowiazuje_od / _do, teren (affected area).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. The description lists the returned fields but does not state whether the operation is read-only, whether data is cached or real-time, or any side effects. For a data-fetching tool, this is a notable gap.

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 description is a single, front-loaded sentence that begins with the core purpose and then lists relevant fields. It is concise and informative without being verbose, though the field list is somewhat long. Overall, it earns its place.

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?

There is no output schema, so the description must explain return values. It does list the key fields (e.g., nazwa_zdarzenia, stopien, prawdopodobienstwo), but it does not indicate the result structure (e.g., array of objects) or additional context like timezone or units. This is adequate but leaves some ambiguity.

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 input schema has zero parameters, so there is nothing to explain. Since the schema is empty, the baseline is 4 for parameter semantics. The description appropriately focuses on the output rather than parameters, which is correct for a no-parameter tool.

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 clearly states a specific verb ('Get') and resource ('active IMGW meteorological warnings across Poland'), and lists the returned fields. This makes the tool's purpose unambiguous and distinguishes it from weather/hydro siblings by focusing on warnings. However, it does not explicitly name an alternative, so it stops short of a perfect 5.

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 guidance on when to use this tool versus alternatives like get_weather or get_hydro. The description only states what it does, leaving the agent to infer its applicability. No exclusions or contexts are provided.

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

get_weatherA

Get current synoptic weather observations from IMGW. With no station: returns all ~60 stations. With station: returns just that one. Data updates ~hourly. Fields: temperature (°C), wind speed (m/s), wind direction (degrees), relative humidity (%), precipitation sum (mm), pressure (hPa).

ParametersJSON Schema
NameRequiredDescriptionDefault
stationNoStation name (case-insensitive, ASCII-fold — e.g. 'warszawa', 'krakow'). Omit to get all.

TDQS

A4.3/5.0
Behavior4/5

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 credibly reveals data update frequency (~hourly), the scope behavior with and without station, and enumerates the returned fields with units. Missing minor details like error conditions or aggregation behavior, but for a read-only weather observation tool this is solid forward disclosure.

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?

Four front-loaded sentences with zero wasted words. Purpose leads, followed by scope behavior, freshness, and return fields. The field list earns its place as a substitute for an output schema. Every sentence delivers new, non-redundant information beyond what annotations or schema already provide.

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?

For a simple tool with one optional parameter, no output schema, and no annotations, the description compensates fully: it enumerates the return fields with units (substituting for output schema docs), states freshness, and explains both call modes. Nothing an agent needs to invoke it correctly is missing.

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 100%, so the baseline is 3. The description's parameter text ('Omit to get all') essentially duplicates the schema's own wording and adds nothing beyond it — the case-insensitivity, ASCII-fold behavior, and examples all live in the schema. The field/unit list describes output, not parameters, so it doesn't lift this score.

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 (get), resource (current synoptic weather observations), and origin (IMGW) in the first sentence. It clearly differentiates from siblings: get_hydro/get_warnings are for other data types, and list_weather_stations/list_hydro_stations serve listing purposes, while this tool returns current observations. The 'current' qualifier further distinguishes it from the station listing tools.

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?

Clearly explains the two invocation modes (omit station for all ~60, provide station for a single one), which is the core usage decision. It does not explicitly name sibling alternatives or state when NOT to use this tool, but for a simple retrieval tool the context is sufficient and the scoping behavior is unambiguous.

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

list_hydro_stationsA

List hydrological station names, rivers, and provinces from the /hydro feed. Optional query filters. Used to find the right station name for get_hydro.

ParametersJSON Schema
NameRequiredDescriptionDefault
riverNoOptional river filter
provinceNoOptional voivodeship filter

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions the data source ('/hydro feed') and optional query filters, but does not state what happens when no filters are applied (e.g., returns all stations), rate limits, or pagination. For a simple list tool, this is adequate but lacks deeper transparency.

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?

Two concise sentences with no redundancy. The purpose and data source are front-loaded, followed by the filter note and the specific use case. Every word earns its place.

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?

For a simple list tool with two optional filters and no output schema, the description provides sufficient information: what it lists, the source, and how it is used (for get_hydro). It does not describe the response format, but that is not critical for a list operation of this nature.

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 100%, meaning both parameters (river, province) are already described in the schema. The description only says 'Optional query filters,' which adds no meaning beyond what the schema provides. Baseline 3 is appropriate.

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 uses a specific verb ('List'), names the resource ('hydrological station names, rivers, and provinces'), and identifies the data source ('/hydro feed'). It also ties the tool to a downstream use case (finding the right station name for get_hydro), which differentiates it from siblings like list_weather_stations, though not explicitly.

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?

The description clearly states the primary context: 'Used to find the right station name for get_hydro.' It does not mention when not to use it or name alternative tools (e.g., list_weather_stations), but the intended usage is specific and actionable, satisfying the 'clear context' criterion.

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

list_weather_stationsA

List synoptic station names available in the /synop feed. Useful for finding the right station name.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. It discloses the data source ('/synop feed') but does not mention any behavioral traits such as read-only nature, ordering, pagination, or result format. The 'list' verb implicitly suggests read-only, but this is not explicit.

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?

Two short sentences with no filler. The primary action is front-loaded, and the useful context about the feed appears immediately. Every word contributes value.

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?

For a simple list tool with no parameters and no output schema, this description is largely complete. It states what it lists, from which feed, and why it's useful. It could optionally mention if the list is exhaustive or sorted, but that is not critical for basic invocation.

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 has zero parameters, and the schema coverage is trivially 100%. The baseline for 0-parameter tools is 4, and the description doesn't need to add parameter details. It appropriately focuses on the output and use case.

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 description states a specific verb ('List') and resource ('synoptic station names'), and references the '/synop feed' for context. It clearly distinguishes this tool from siblings like list_hydro_stations by naming a different feed type.

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?

The description provides clear context: this tool is for finding the right station name, implying it is used as a precursor to other operations. However, it does not explicitly state when not to use it or name alternative tools.

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. Dates show when Glama detected each change.

  1. 5 tool updatesv0.1.0
    • First observedget_hydro
    • First observedget_warnings
    • First observedget_weather
    • First observedlist_hydro_stations
    • First observedlist_weather_stations

TDQS

A4/5.0
Disambiguation5/5

Each tool targets a distinct purpose: getting hydrological readings, getting warnings, listing hydro stations, getting weather observations, and listing weather stations. There is no overlap or ambiguity between them, and the station-listing tools clearly complement their respective data-fetching tools.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern: get_hydro, get_warnings, list_hydro_stations, get_weather, list_weather_stations. The use of 'get' for data retrieval and 'list' for enumeration is uniform, and the resource is always clearly identified (e.g., 'hydro', 'warnings', 'weather').

Tool Count5/5

Five tools is well-scoped for a server focusing on current meteorological and hydrological data. Each tool serves a necessary function without redundancy, and the count is neither too sparse nor overwhelming for the domain.

Completeness5/5

The tool surface covers the full lifecycle of read-only access to IMGW data: retrieving current weather, current hydrological readings, active warnings, and the ability to list stations to target specific queries. No obvious gaps exist for the stated purpose, as the server explicitly provides current conditions and warnings without needing create/update operations.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Provides access to Portuguese weather data from IPMA (Instituto Português do Mar e da Atmosfera), including weather forecasts, meteorological warnings, seismic data, UV index, and real-time observations from weather stations across Portugal.
    6
    -
  • A
    license
    B
    quality
    C
    maintenance
    Provides access to UK Environment Agency's real-time flood monitoring data, enabling users to check flood warnings, monitor water levels and flow rates, and access historical measurements from monitoring stations across the UK.
    11
    22
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Provides live Greek weather data from EMY, including forecasts, alerts, marine bulletins, warnings, and climate records. Supports location-based queries by name, ID, or coordinates without requiring an API key.
    6
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/bartosz-kuc/imgw-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server