ovf-data-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ovf-data-mcpsearch for surface-water stations near Debrecen"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ovf-data-mcp

Agent-friendly, read-only access to public Hungarian water-management data from the Országos Vízügyi Főigazgatóság (OVF).
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.
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 → citeThe 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 --helpRun the CLI without installing it:
uvx --from ovf-data-mcp vizugy --helpMCP clients
Claude Code:
claude mcp add --scope user ovf-data -- uvx ovf-data-mcpCodex CLI and IDE extension:
codex mcp add ovf-data -- uvx ovf-data-mcpEditor 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
DataExtdimension; 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:

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-upMore examples, each built the same way:
How deep does the drought bite? (source) — soil moisture at six sensor depths on the Danube–Tisza ridge, day by day through 2026 against the record 2022 drought: a wetter start, yet by late May the topsoil was drier than 2022's low.
Hungary's hidden groundwater pulse (source) — the latest reported month at 30 spatially distributed deep wells, ranked against decades of observations from the same calendar month, with 8,679 historical monthly values behind the view.
A year of the Danube, measured in Balatons (source) — 47 km³ of water passed Budapest this year, about one Lake Balaton every 15 days, integrated from daily discharge.
The sinking water table of the Homokhátság (source) — three shallow wells on the Danube–Tisza ridge, up to 92 years each: the water table has sunk 1–3 metres.
Danube at Budapest — water level, last 12 months (source) — daily mean with min–max range and the flood-alert threshold at the Budapest gauge.
A flood wave travelling down the Danube (source) — small multiples of five gauges, Komárom to Mohács, tracking the February 2026 crest across ~320 river-km in 3 days.
How low are Hungary's rivers right now? (source) — six gauges across the Duna, Tisza, Dráva and Balaton, each placed in its own 12-month range.
All examples with previews: kalcifield.github.io/ovf-data-mcp
Data sources
Source | Purpose | Status |
Stations, measurement catalogues, coverage, observations, aggregation | Officially documented | |
Spatial dataset discovery and layer metadata | Public; metadata quality varies | |
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 10Results use stable namespaced IDs such as surface:1026.
Find stations by coordinates:
vizugy stations nearest 47.4979 19.0402 --limit 52. Inspect available measurements and coverage
vizugy catalog measurements
vizugy observations coverage surface:1026 \
--metric water-level \
--data-type operationalUseful metric aliases:
water-leveldischargewater-temperaturesoil-moisturesoil-temperature
Useful data-type aliases:
rawobservedcheckedprocessedhydrologicaloperational
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 \
--explainThe 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 jsonlRaw 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 maxIntervals: 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:00ZRaw 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 jsonInspect one service or layer:
vizugy datasets describe \
VIR/Vizmercek_vizugyhu_orszagos_adatsoros \
--layer 6Some 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 ATIVIZIGA 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-depthsMachine-readable output goes to stdout; diagnostics go to stderr.
Exit code | Meaning |
| Success |
| Invalid or unsafe query |
| Upstream unavailable or invalid response |
| 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-mcpAvailable tools:
Tool | Intent |
| Search public spatial datasets |
| Inspect a service or layer schema |
| Resolve metrics, units, ranges, and data types |
| Resolve station names, rivers, and municipalities |
| Resolve coordinates to nearby stations |
| Check temporal availability before querying |
| Retrieve a bounded raw series |
| Aggregate a longer series upstream |
| Compare upstream-aggregated soil series by sensor depth |
One-click editor installation:
Client | Install |
VS Code | |
Cursor |
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 |
|
| ArcGIS catalogue root |
|
| VRAQuery API root |
|
| Public frontend token endpoint |
|
| Upstream request timeout |
|
| 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 -qVRAQuery wire models are generated from the pinned OpenAPI document. Regenerate them after intentionally updating that document:
scripts/generate-vra-modelsDesign 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 toolsaggregate_observationsC
Aggregate observations server-side over daily, ten-day, monthly, or yearly buckets.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | ||
| start | Yes | ||
| metric | No | water-level | |
| station | Yes | ||
| data_ext | No | ||
| depth_cm | No | ||
| interval | No | daily | |
| data_type | No | operational | |
| operation | No | max |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | ||
| start | Yes | ||
| metric | No | soil-moisture | |
| station | Yes | ||
| interval | No | daily | |
| data_type | No | operational | |
| depths_cm | No | ||
| operation | No | avg |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| layer_id | No | ||
| dataset_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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".
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| metric | No | ||
| network | No | surface | |
| watercourse | No | ||
| municipality | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | ||
| limit | No | ||
| start | Yes | ||
| metric | No | water-level | |
| station | Yes | ||
| data_ext | No | ||
| depth_cm | No | ||
| data_type | No | operational | |
| include_quality | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| metric | No | water-level | |
| station | Yes | ||
| data_type | No | operational |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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".
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| metric | No | ||
| network | No | surface | |
| latitude | Yes | ||
| longitude | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| grade_code | No | ||
| directorate | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
10 tool updates
v0.2.0- First observed
aggregate_observations - First observed
compare_soil_depths - First observed
describe_dataset - First observed
discover_datasets - First observed
find_stations - First observed
get_observations - First observed
inspect_coverage - First observed
list_measurement_types - First observed
nearest_stations - First observed
water_shortage_districts
TDQS
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.
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.
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.
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
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
Query real-time and historical USGS water data from ~8,000 stream gages and groundwater wells.
USGS Water MCP — wraps USGS National Water Information System (NWIS) REST services (free, no auth)
Access UK flood warnings, river levels, water quality, Met Office forecasts, and carbon data
USGS Water Services (NWIS) MCP.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides 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-
- AlicenseBqualityCmaintenanceProvides 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.1122MIT
- AlicenseAqualityBmaintenanceEnables querying USGS water data including real-time and historical streamflow, gage height, and water temperature from USGS gauges across the United States.3MIT
- AlicenseAqualityBmaintenanceProvides 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.5MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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