Skip to main content
Glama
kalcifield

ovf-data-mcp

by kalcifield

ovf-data-mcp

ovf-data — Hungary's water data, made navigable

PyPI Python 3.11+ License: MIT MCP Status: Alpha

Agent-friendly, read-only access to public Hungarian water-management data from the Országos Vízügyi Főigazgatóság (OVF).

IMPORTANT

ovf-data-mcp is an independent, unofficial project. It is not affiliated with or endorsed by OVF. OVF and the regional water directorates remain the authoritative sources for the data.

WARNING

This repository is an experimental proof of concept, not a finished or supported production service. Interfaces and upstream integrations may change. SeeTODO.md for known limitations.

vizugy supports the investigation workflow agents actually need:

discover → resolve stations → inspect coverage → explain query → retrieve or aggregate → cite

The same application logic is exposed through a composable CLI and a local MCP server. The CLI is the primary interface; MCP tools are thin adapters over identical operations.

Installation

Install uv, then choose the CLI or an MCP client.

CLI

Install both vizugy and ovf-data-mcp as isolated global tools:

uv tool install ovf-data-mcp
vizugy --help

Run the CLI without installing it:

uvx --from ovf-data-mcp vizugy --help

MCP clients

Claude Code:

claude mcp add --scope user ovf-data -- uvx ovf-data-mcp

Codex CLI and IDE extension:

codex mcp add ovf-data -- uvx ovf-data-mcp

Editor one-click installs and manual configuration are in MCP server.

Related MCP server: Environment Agency Flood Monitoring MCP Server

What it can do

  • Discover and inspect public OVF ArcGIS datasets.

  • Search surface-water stations, shallow-groundwater wells (--network wells), confined/layer-aquifer wells (--network deep-wells), and precipitation stations (--network precipitation) by name, municipality, or watercourse.

  • Find the nearest stations to WGS84 coordinates.

  • List authoritative measurement codes, units, accepted ranges, and data types.

  • Inspect temporal coverage before requesting observations.

  • Retrieve compact, bounded operational or historical time series, optionally with upstream quality codes and labels (--quality).

  • Report per-station context: flood-alert thresholds, record low/high water levels, and river kilometre where the upstream registry provides them.

  • Aggregate observations upstream by day, ten-day period, month, or year.

  • Query VRA soil moisture and soil temperature by the upstream DataExt dimension; for verified soil metrics this is exposed as sensor depth in centimetres.

  • Find stations with documented coverage for a requested metric and compare aligned, upstream-aggregated soil series across 10, 20, 30, 45, 60, and 75 cm depths.

  • Report officially declared water-shortage (drought) grades per district, with the declaring action and timestamps — administrative status, not measurements.

  • Explain resolved identifiers and query semantics without fetching values.

  • Return structured provenance and explicit upstream caveats.

It deliberately does not interpret hydrology, detect anomalies, expose arbitrary SQL, or provide unrestricted bulk access. The agent remains responsible for analysis.

Showcase

What an agent can build from a handful of vizugy queries — 92 years of Lake Velence water levels, from the near-dry 1930s to July 2026, which sits below the 2022 crisis floor at a level last seen in 1938:

Nine decades of Lake Velence

View the live dashboard → (source) — every number on the page came from these commands, no scraping or manual downloads:

vizugy stations search Velence
vizugy observations coverage surface:818          # available from 1934-01-01
vizugy observations aggregate surface:818 \
    --start 1934-01-01T00:00:00Z --end 1960-01-01T00:00:00Z \
    --interval yearly --operation avg   # × avg/min/max × 4 windows, + monthly close-up

More examples, each built the same way:

All examples with previews: kalcifield.github.io/ovf-data-mcp

Data sources

Source

Purpose

Status

VRAQuery OpenAPI

Stations, measurement catalogues, coverage, observations, aggregation

Officially documented

OVF ArcGIS REST

Spatial dataset discovery and layer metadata

Public; metadata quality varies

data.vizugy.hu

Official public-data frontend and anonymous access flow

Public frontend

Operational observations may be preliminary or unchecked. For official proceedings or guaranteed checked data, follow OVF's formal data-request process.

Quick investigation

1. Resolve a station

vizugy stations search Budapest --watercourse Duna --limit 10

Results use stable namespaced IDs such as surface:1026.

Find stations by coordinates:

vizugy stations nearest 47.4979 19.0402 --limit 5

2. Inspect available measurements and coverage

vizugy catalog measurements

vizugy observations coverage surface:1026 \
  --metric water-level \
  --data-type operational

Useful metric aliases:

  • water-level

  • discharge

  • water-temperature

  • soil-moisture

  • soil-temperature

Useful data-type aliases:

  • raw

  • observed

  • checked

  • processed

  • hydrological

  • operational

An empty result includes documented coverage for other available data types, when the upstream catalogue provides it. Retry explicitly with the suggested --data-type; the tool never silently substitutes one data type for another.

Numeric VRA codes and exact catalogue names are also accepted.

3. Explain before fetching

vizugy observations get surface:1026 \
  --metric water-level \
  --data-type operational \
  --start 2026-07-16T00:00:00Z \
  --end 2026-07-17T00:00:00Z \
  --explain

The explanation shows the resolved station, metric and data-type codes, UTC bounds, upstream operation, expected mode, and safety warnings. It performs no value query.

4. Retrieve a bounded raw series

vizugy observations get surface:1026 \
  --metric water-level \
  --data-type operational \
  --start 2026-07-16T00:00:00Z \
  --end 2026-07-17T00:00:00Z \
  --limit 1000 \
  --format jsonl

Raw observation queries require explicit bounds and may span at most seven days. JSONL emits one compact timestamp/value record per line followed by a _meta record.

5. Aggregate longer periods upstream

vizugy observations aggregate surface:2046 \
  --metric water-level \
  --data-type operational \
  --start 2026-06-01T00:00:00Z \
  --end 2026-07-01T00:00:00Z \
  --interval daily \
  --operation max

Intervals: daily, tenday, monthly, yearly.

Operations supported by VRAQuery: min, max, avg, sum, cnt, mean, cntday.

Aggregation buckets follow upstream hydrological/local-day boundaries. Returned bucket labels remain UTC timestamps and can precede the requested UTC boundary by an offset.

6. Compare soil depths

Find precipitation-network stations with documented soil-moisture coverage, then compare upstream daily averages across the six verified sensor depths:

vizugy stations nearest 46.91 19.69 \
  --network precipitation --metric soil-moisture

vizugy observations coverage precip:6994 \
  --metric soil-moisture --data-type operational

vizugy observations compare-depths precip:6994 \
  --start 2026-07-01T00:00:00Z \
  --end 2026-07-19T00:00:00Z

Raw and general aggregate queries also accept --data-ext; --depth-cm is the validated semantic alias for soil moisture and soil temperature. DataExt remains a generic upstream dimension because it may mean something else for other metrics.

DataCatalogMinMax documents station/metric/data-type coverage, not depth-specific coverage. The comparison helper therefore reports empty requested depths from its bounded value query. A live probe on 2026-07-19 found soil-moisture coverage at 24 of the 428 active VRA precipitation stations; the separate OVF drought-monitoring API has wider coverage and computed drought indicators, but is not integrated yet.

Dataset discovery

Search the OVF ArcGIS catalogue without knowing folder or layer identifiers:

vizugy datasets list --query Vizmercek --limit 20 --format json

Inspect one service or layer:

vizugy datasets describe \
  VIR/Vizmercek_vizugyhu_orszagos_adatsoros \
  --layer 6

Some advertised ArcGIS folders require authentication. Public discovery skips them and returns explicit warnings rather than failing the entire catalogue request.

Declared water-shortage grades

The ArcGIS drought folder publishes the water-shortage grade each directorate has formally declared for its districts. This is the administrative response to drought, not a measurement, and pairs with the measured series above:

vizugy datasets water-shortage --grade-code 723 --limit 10
vizugy datasets water-shortage --directorate ATIVIZIG

A live probe on 2026-07-20 returned 85 districts: 28 at III. fok, 34 at II. fok, 9 at I. fok, with declarations as recent as 2026-07-19. Each record carries the previous grade code, so escalations stay visible. Grade codes are 720 (none), 721, 722, and 723 (most severe).

The same layer joins a drought-index block whose values are stale by roughly two years; those fields are deliberately not read. See docs/arcgis-drought-layers.md.

CLI reference

vizugy datasets list
vizugy datasets describe
vizugy datasets water-shortage
vizugy catalog measurements
vizugy stations search
vizugy stations nearest
vizugy observations coverage
vizugy observations get
vizugy observations aggregate
vizugy observations compare-depths

Machine-readable output goes to stdout; diagnostics go to stderr.

Exit code

Meaning

0

Success

2

Invalid or unsafe query

3

Upstream unavailable or invalid response

4

Requested entity not found

MCP server

MCP clients launch the local stdio server automatically using the commands in Installation or the configurations at the end of this section. To start it directly:

uvx ovf-data-mcp

Available tools:

Tool

Intent

discover_datasets

Search public spatial datasets

describe_dataset

Inspect a service or layer schema

list_measurement_types

Resolve metrics, units, ranges, and data types

find_stations

Resolve station names, rivers, and municipalities

nearest_stations

Resolve coordinates to nearby stations

inspect_coverage

Check temporal availability before querying

get_observations

Retrieve a bounded raw series

aggregate_observations

Aggregate a longer series upstream

compare_soil_depths

Compare upstream-aggregated soil series by sensor depth

One-click editor installation:

Client

Install

VS Code

Install on VS Code

Cursor

Install MCP Server

Generic stdio configuration for Cursor and other MCP clients:

{
  "mcpServers": {
    "ovf-data": {
      "command": "uvx",
      "args": ["ovf-data-mcp"]
    }
  }
}

Add this to your user configuration or .vscode/mcp.json:

{
  "servers": {
    "ovf-data": {
      "type": "stdio",
      "command": "uvx",
      "args": ["ovf-data-mcp"]
    }
  }
}

Add this to ~/.codex/config.toml:

[mcp_servers.ovf-data]
command = "uvx"
args = ["ovf-data-mcp"]

Output semantics

Observation results distinguish:

  • station identity and location;

  • observation or aggregation-bucket timestamp;

  • metric and unit;

  • VRA data type;

  • requested UTC interval;

  • retrieval timestamp;

  • provider and source operation;

  • truncation and upstream warnings.

The coverage endpoint currently omits composed operational type 101. When related type 100 coverage exists, vizugy returns it with an explicit inference warning; it does not silently claim equivalence.

Configuration

Variable

Default

Purpose

VIZUGY_ARCGIS_URL

https://geoportal.vizugy.hu/arcgis/rest

ArcGIS catalogue root

VIZUGY_VRA_URL

https://vmservice.vizugy.hu/vraquery

VRAQuery API root

VIZUGY_TOKEN_URL

https://data.vizugy.hu/AuthApi/auth/token

Public frontend token endpoint

VIZUGY_TIMEOUT_SECONDS

15

Upstream request timeout

VIZUGY_CACHE_TTL_SECONDS

300

ArcGIS metadata cache lifetime

Development

git clone https://github.com/kalcifield/ovf-data-mcp.git
cd ovf-data-mcp
uv sync --extra test
uv run ruff format --check src tests
uv run ruff check src tests
uv run mypy src tests
uv run pytest -q

VRAQuery wire models are generated from the pinned OpenAPI document. Regenerate them after intentionally updating that document:

scripts/generate-vra-models

Design decisions, verified upstream behavior, and unresolved questions are documented in docs/design.md and docs/phase-2-review.md. Observed upstream limits — aggregation timeouts under load, catalogued-but-dead stations, and which comparisons the data actually supports — are in docs/ovf-service-behavior.md.

Licence and data attribution

The software is available under the MIT License. This does not establish unrestricted reuse rights for every upstream dataset. Preserve OVF provenance and verify the applicable data terms before redistribution or production use.

Available Tools

10 tools
aggregate_observationsC

Aggregate observations server-side over daily, ten-day, monthly, or yearly buckets.

ParametersJSON Schema
NameRequiredDescriptionDefault
endYes
startYes
metricNowater-level
stationYes
data_extNo
depth_cmNo
intervalNodaily
data_typeNooperational
operationNomax

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.4/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. It mentions 'server-side' computing but doesn't disclose rate limits, required auth, result limits, or what the aggregated output structure looks like. With zero annotation coverage for a computation-heavy tool, this is a significant 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 efficient sentence with zero waste, listing the purpose and bucket options concisely. However, this conciseness sacrifices useful detail that the tool needs — the tradeoff favors brevity over informativeness given the 9 parameters.

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

Completeness2/5

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

The tool has 9 parameters, 0% schema coverage, and a complex aggregation operation, yet the description explains almost nothing about parameter interplay (interval vs operation vs metric), what statistics can be computed, or how the output schema relates. Despite having an output schema, the input side is severely under-documented for a tool this complex.

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%, and the description adds no parameter-level meaning. There are 9 parameters (3 required), including operation (default 'max'), interval, metric, data_type — none of which are explained. The description names the bucket types but never maps them to the 'interval' parameter or explains what operation/others control. The description fails to compensate for the 0% schema coverage.

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

Purpose3/5

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

The description states 'Aggregate observations server-side over daily, ten-day, monthly, or yearly buckets' — a clear verb (aggregate) + resource (observations) + bucket sizes. However, it does not distinguish itself from sibling get_observations, which likely returns raw observations; the relationship between the two is left to inference.

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 says aggregation is over various buckets but gives no guidance on when to choose this tool versus get_observations, or what 'server-side' aggregation means operationally for the agent. No explicit when/when-not guidance or alternatives are named. The aggregation vs raw distinction is implied but not stated.

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

compare_soil_depthsC

Compare aligned soil-moisture or temperature series across sensor depths.

ParametersJSON Schema
NameRequiredDescriptionDefault
endYes
startYes
metricNosoil-moisture
stationYes
intervalNodaily
data_typeNooperational
depths_cmNo
operationNoavg

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/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 full burden of behavioral disclosure. The description only states the operation ('compare aligned series') but doesn't disclose what 'aligned' means, whether this is a read-only aggregation operation, what happens with missing depths, how multi-depth data is combined, or any performance considerations. The tool likely produces a derived/computed output, but no behavioral detail is disclosed.

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?

A single concise sentence with no wasted words. It's appropriately short given that it offers little content. However, conciseness at the cost of completeness means the brevity isn't earned—there's substantial missing information that could have been compressed into a still-compact but more complete description.

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

Completeness2/5

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

Despite having an output schema and 8 parameters (3 required), the description addresses none of the tool's complexity. It doesn't explain what the comparison produces, how depths map to series, what 'aligned' means operationally, what operations are available, or how the metric/data_type/interval parameters behave. Even with the output schema present, the description is inadequate for an 8-parameter comparison tool.

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 carries the full burden of explaining parameters. With 8 parameters including metric, interval, data_type, depths_cm, and operation, the description provides zero elaboration on any of them. The term 'aligned' hints at alignment logic but doesn't explain the operation parameter (avg) or how depths_cm filtering works, metric selection, or data_type semantics. This is a significant gap.

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 'Compare aligned soil-moisture or temperature series across sensor depths' clearly identifies the verb (compare), resource (soil series), and scope (across sensor depths). It distinguishes from siblings like get_observations (fetch raw series) and aggregate_observations (aggregate observations), though it doesn't explicitly name alternatives. The purpose is specific to depth-based comparison, differentiating it from other observation tools.

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?

No when-to-use guidance is provided. The description doesn't say when to use this over get_observations, aggregate_observations, or describe_dataset. It implies a comparison use case but gives no exclusions or alternative tool references. Given 9 siblings, the lack of guidance is a clear gap.

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

describe_datasetC

Inspect one dataset or layer, including schema, CRS, limits, and provenance.

ParametersJSON Schema
NameRequiredDescriptionDefault
layer_idNo
dataset_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.6/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 disclosure burden. It lists what fields are inspected (schema, CRS, limits, provenance) which adds some behavioral context, but doesn't disclose whether this is a read-only operation, what happens with missing/unavailable metadata, or any auth/permission requirements.

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?

A single, efficient sentence that fronts the core purpose and enumerates the key inspection areas compactly. No wasted words or filler.

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

Completeness2/5

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

The tool has 2 parameters, no annotations, 0% schema description coverage, and the description is short. The tool inspects data with multiple semantic dimensions (schema, CRS, limits, provenance), and the interaction between dataset_id and layer_id is not fully explained. An output schema exists which offsets some return-value explanation need, but the description remains thin for a tool with this inspection scope.

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 compensate. The description explains dataset_id's role ('inspect one dataset or layer') at a high level, and layer_id's role is implied by 'or layer', but neither parameter's exact format, constraints, or interaction is clarified. It adds some meaning but not enough to bridge a 0% coverage baseline.

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

Purpose3/5

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

The description states a specific verb+resource ('Inspect one dataset or layer') and lists what it covers (schema, CRS, limits, provenance), which is clear. However, with 9 sibling tools including discover_datasets and inspect_coverage, it doesn't explicitly distinguish itself from these related inspection/discovery tools.

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?

No explicit when-to-use or when-not-to-use guidance is given. The description implies it's for inspecting dataset metadata, but doesn't contrast with siblings like discover_datasets (discovery vs. inspection) or inspect_coverage (which may overlap in purpose). The differentiation gap is notable given the tool count.

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

discover_datasetsC

Find public water datasets by catalogue identifier; results are bounded.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/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 phrase 'results are bounded' is vague—it hints at pagination or a limit but doesn't clarify what bounds apply, the default behavior, or whether the limit parameter controls it. It doesn't disclose the return format, ordering, or any side effects.

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 efficient sentence with minimal waste. It's front-loaded with the core purpose. However, it is over-terse; the brevity comes at the cost of needed content rather than trimming redundancy, which slightly undermines this as 'appropriately sized.'

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

Completeness2/5

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

Despite having an output schema and only 2 optional parameters (simple tool), the description is under-specified. No annotations and 0% schema coverage mean it should carry substantial informational weight, but it doesn't. While the output schema covers return values, the tool's filtering/list semantics remain opaque.

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?

With 0% schema description coverage, the description must compensate for both parameters (limit and query), but it mentions neither. The agent doesn't learn what 'query' expects (catalogue identifier format?) or how 'limit' caps results. The schema gives only types and defaults with no meaning, and the description adds nothing about either parameter.

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+resource (find public water datasets) and a clear scoping mechanism (by catalogue identifier). It distinguishes from siblings like get_observations and find_stations by focusing on dataset discovery rather than data retrieval. However, it doesn't explicitly explain how it differs from describe_dataset, which could cause some ambiguity among dataset-focused siblings.

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. No exclusions, no when-not-to-use, and no mention of alternatives like describe_dataset or find_stations. The description implies a search-or-listing use case but provides no explicit context for the agent to decide between this and sibling tools.

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

find_stationsB

Find gauges by registry ID, name, watercourse, or municipality.

network: "surface" (rivers and lakes), "wells" (shallow groundwater), "deep-wells" (confined/layer aquifer), or "precipitation".

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
metricNo
networkNosurface
watercourseNo
municipalityNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/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 doesn't mention what the output looks like, whether this is a safe read operation, any pagination or result limits, or what 'find' means in terms of matching behavior (exact vs fuzzy). The network enum listing helps somewhat, but the tool's behavior around the query parameter and how filters combine is left unexplained. For a search tool with no annotations, this is a significant 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 compact and front-loaded with the key purpose in the first line. The network enumeration is useful and efficiently formatted. It doesn't waste space, though it could have used the structure better by explaining metric and query semantics in the remaining space.

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?

The tool has 6 parameters, no annotations, and no schema description coverage — a moderate complexity tool where the description needs to compensate. The description covers the network field well and hints at search dimensions but leaves metric entirely unexplained and gives no sense of result format. With an output schema present, return values don't need detailing, which helps, but the missing metric semantics and lack of behavioral guidance on filtering combination leave meaningful gaps for an agent to navigate this multi-parameter search tool.

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 all 6 parameters are undocumented in the schema. The description adds meaning to network by enumerating its valid values, and implicitly explains query, watercourse, and municipality search filters. However, the 'metric' and 'limit' parameters are not explained at all in the description, and there's no clarity on what the metric filter does or how it relates to network. This partial coverage earns a middle score.

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 the tool finds gauges by registry ID, name, watercourse, or municipality. The verb 'find' plus the resource 'gauges' and the search criteria provide good purpose clarity. It doesn't explicitly distinguish from siblings like nearest_stations, but it names the search dimensions clearly enough to establish its distinct role as a general lookup tool.

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 explains what the tool does and lists the search dimensions, but provides no when-to-use versus alternatives guidance. Given siblings include nearest_stations and get_observations, guidance on when to choose this over those alternatives would be valuable. The network field enumeration offers some implicit selection context, but there's no explicit statement about when this tool is the right choice.

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

get_observationsC

Get raw observations for an explicit interval of at most 7 days.

include_quality: add upstream quality codes and labels per observation.

ParametersJSON Schema
NameRequiredDescriptionDefault
endYes
limitNo
startYes
metricNowater-level
stationYes
data_extNo
depth_cmNo
data_typeNooperational
include_qualityNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/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. It discloses the 7-day limit, which is useful, but doesn't describe pagination behavior, rate limiting, what happens with large intervals, whether data is ordered, or the nature of the raw observations returned. With zero annotation coverage and an output schema present, more behavioral context would be valuable.

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 brief and front-loaded with the core purpose in the first sentence. The second line about include_quality is relevant but could be clearer about whether it's optional or default behavior. Slightly minimal but no wasted words.

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

Completeness2/5

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

With 9 parameters at 0% schema coverage, no annotations, and multiple sibling tools with overlapping functionality (aggregate_observations, compare_soil_depths), the description is significantly under-specified. The output schema exists but doesn't reduce the need for parameter guidance. A moderate-complexity tool like this needs more than two short lines.

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 compensate for 9 parameters. Only include_quality is explained ('add upstream quality codes and labels per observation'). The meaning of data_ext, depth_cm, data_type, metric, limit, and the date formats of start/end are all undocumented in both schema and description.

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 'Get raw observations for an explicit interval of at most 7 days,' which is a specific verb+resource+scope. It distinguishes from siblings like aggregate_observations (raw vs aggregated) and inspect_coverage/inspect functionality. However, it doesn't explicitly differentiate from all siblings, and 'raw observations' could be slightly clearer about what kind of data is returned.

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 7-day max interval is a useful usage constraint, but there's no guidance on when to use this vs. aggregate_observations or other sibling tools. No exclusions or alternatives are named. The 'explicit interval' phrasing implies it requires explicit start/end dates, but this is not fully developed.

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

inspect_coverageC

Resolve a station and report documented temporal coverage before querying.

ParametersJSON Schema
NameRequiredDescriptionDefault
metricNowater-level
stationYes
data_typeNooperational

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/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. 'Resolve a station' implies it maps/resolves identifiers, and 'reports documented temporal coverage' describes output, but it does not mention whether this is a read-only operation, any rate limits, or what happens with unresolvable stations. No schema values (defaults like metric and data_type) are explained in behavioral terms.

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 concise sentence with no wasted words. It front-loads the core action and purpose. However, it is slightly under-specified—conciseness here borders on sparse rather than optimally economical given the amount of missing behavioral detail.

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

Completeness2/5

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

While an output schema exists (mitigating the need to describe return values), the tool has 3 parameters with 0% schema coverage, no annotations, and a purpose that is central to workflow sequencing ('before querying'). The description should clarify what 'temporal coverage' reporting entails, how metric and data_type influence it, and what distinguishes this from discover_datasets/describe_dataset. It leaves significant gaps.

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%, and the description mentions the station parameter implicitly (resolving a station) but provides no semantics for 'metric' (default water-level) or 'data_type' (default operational). The description does not explain what these parameters mean or how they affect the coverage report. With zero schema coverage and no param description, compensation is absent.

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 action ('Resolve a station and report documented temporal coverage before querying'). This clearly indicates the tool resolves a station identifier and reports its temporal coverage. It distinguishes reasonably from siblings like describe_dataset and discover_datasets, though it doesn't explicitly name alternatives.

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 phrase 'before querying' implies it should be used as a prerequisite to data queries, but this is subtle and not explicit. It does not state when to use this vs alternatives like describe_dataset or discover_datasets, nor does it specify exclusions or prerequisites beyond the implied sequencing.

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

list_measurement_typesA

List authoritative metric codes, units, valid ranges, and data-type codes.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/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. This is clearly a read-only, non-destructive lookup tool, and the description appropriately reflects that. However, it doesn't describe pagination, ordering, or whether the full code set fits in one response, which would be useful behavioral context for a reference-list tool.

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, dense sentence that lists the exact content categories (codes, units, ranges, data-type codes). It's efficient with no wasted words, though slightly more context about intended use could enrich it.

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?

The tool has no parameters and an output schema (which presumably documents the fields), so the description's job is limited to establishing the purpose and content scope. It does that adequately. Given the low complexity (0 params, no nested objects) and presence of output schema, the description is reasonably complete for this 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 has 0 parameters and schema description coverage is 100% (trivially, since there are no parameters). With no parameters to explain, the baseline of 4 is appropriate; the description doesn't need to add parameter semantics when none exist.

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 the tool lists 'authoritative metric codes, units, valid ranges, and data-type codes.' It specifies the verb (list), the resource (measurement types/metrics), and the scope (authoritative codes with units/ranges). It distinguishes reasonably from siblings like describe_dataset and aggregate_observations, though it doesn't name them 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?

The description implies this tool is a reference/lookup for measurement units and codes, but does not explicitly state when an agent should use it versus alternatives (e.g., describe_dataset). The context of being a dictionary/reference tool is clear but no explicit when/when-not guidance is given.

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

nearest_stationsB

Find public gauges nearest a WGS84 latitude/longitude.

network: "surface" (rivers and lakes), "wells" (shallow groundwater), "deep-wells" (confined/layer aquifer), or "precipitation".

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
metricNo
networkNosurface
latitudeYes
longitudeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output 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 full burden for behavioral disclosure. It does not state what the response contains (station metadata, distances?), whether results are sorted by distance, how many results max (limit default is in schema but not described), or any rate limits or access constraints.

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

Conciseness3/5

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

The description is short, but the network value explanations are oddly embedded in the description rather than the schema. The opening line is good and front-loaded, but the trailing network bullet feels like it belongs in the schema, making the description slightly mis-structured.

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?

For a geospatial lookup tool with 5 parameters and 0% schema coverage, the description does not fully compensate. It explains the network parameter but leaves latitude/longitude format, metric, and limit semantics unexplained. Having an output schema helps, but the input semantics are not complete.

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 none of the 5 parameters are described in the schema, but the description does explain the network values (surface, wells, deep-wells, precipitation) which is genuinely useful. However, latitude, longitude, limit, and metric parameters have no explanation in either the schema or description.

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 it finds public gauges nearest given coordinates, which is specific and clear. The network parameter explanation (surface, wells, deep-wells, precipitation) helps differentiate from siblings like get_observations and find_stations, though it doesn't explicitly name alternatives.

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 (find nearest stations to a coordinate) but gives no explicit guidance on when to prefer this over siblings like find_stations or inspect_coverage. No when/when-not exclusions are stated.

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

water_shortage_districtsA

List officially declared water-shortage (drought) grades per district.

These are administrative declarations by the water directorates, not measurements. grade_code: 720 (none), 721, 722, or 723 (most severe).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
grade_codeNo
directorateNo

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?

With no annotations provided, the description explains the key semantics: these are official administrative grades with a defined grade_code mapping (720=none to 723=most severe). It doesn't disclose pagination behavior, filtering defaults, or response format, but it does carry its share of the burden for explaining the domain meaning.

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 concise with clear front-loading of the core purpose in the first line, followed by a useful one-sentence clarification about the administrative nature and grade_code mapping. Efficient and no wasted words.

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?

For a list tool with an output schema present and only 3 simple parameters, the description provides reasonable domain context but leaves gaps: it doesn't explain the limit or directorate parameters, and doesn't clarify default filtering behavior. It is adequate but not thorough for a tool with zero annotation coverage.

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 compensate by explaining parameters. It does explain the meaning of grade_code values (720-723) and the 'district' output context, but it does not explain what 'limit' controls or what the 'directorate' filter does or accepts as values. Two of three parameters remain semantically undocumented.

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 uses a specific verb+resource ('List officially declared water-shortage (drought) grades per district') that clearly distinguishes it from sibling tools. It clarifies this is about administrative drought declarations, not measurements, which distinguishes it well from measurement-focused siblings like get_observations and aggregate_observations.

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 clarifies these are administrative declarations 'not measurements,' providing some context for when to use this tool vs measurement tools. However, it doesn't explicitly state when to choose this over alternatives or name any specific alternative tool for similar filtering scenarios.

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. 10 tool updatesv0.2.0
    • First observedaggregate_observations
    • First observedcompare_soil_depths
    • First observeddescribe_dataset
    • First observeddiscover_datasets
    • First observedfind_stations
    • First observedget_observations
    • First observedinspect_coverage
    • First observedlist_measurement_types
    • First observednearest_stations
    • First observedwater_shortage_districts

TDQS

B3/5.0
Disambiguation4/5

Each tool targets a distinct purpose: dataset discovery, schema inspection, aggregation, soil-depth comparison, drought declarations, measurement-type metadata, station lookup, proximity search, raw observations, and coverage inspection. The only mild overlap is find_stations vs nearest_stations, but the descriptions (registry/name search vs geographic proximity) make the distinction fairly clear.

Naming Consistency2/5

The naming is inconsistent, mixing verb-based names (discover_datasets, describe_dataset, aggregate_observations, compare_soil_depths, list_measurement_types, find_stations, get_observations, inspect_coverage) with noun-phrase names (water_shortage_districts, nearest_stations). Some use verb_noun (find_stations, describe_dataset), others drop the leading verb (nearest_stations, water_shortage_districts). The 'describe_dataset' vs 'discover_datasets' singular/plural mismatch also adds inconsistency.

Tool Count5/5

Ten tools is a well-scoped surface for an observational water data domain, covering discovery, metadata, querying, and analysis. Each tool serves a distinct function and none feels like filler; the count is squarely in the ideal 3-15 range.

Completeness4/5

The surface covers discovery, metadata inspection, raw observation retrieval, aggregation, soil-depth comparison, station lookup, proximity search, and drought declarations. Minor gaps include no direct update/delete (not applicable to a read-oriented data service) and possibly no explicit download/export tool, but the core observational querying workflow appears complete.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides access to real-time water data from the USGS Water Services API, allowing users to fetch instantaneous measurements like stream flow, gage height, temperature, and water quality parameters from thousands of monitoring stations across the US.
    3
    -
  • 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
    B
    maintenance
    Enables querying USGS water data including real-time and historical streamflow, gage height, and water temperature from USGS gauges across the United States.
    3
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Provides real-time access to Polish meteorological and hydrological data from IMGW-PIB, including weather observations, river levels, and weather warnings, without requiring an API key.
    5
    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/kalcifield/ovf-data-mcp'

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