Skip to main content
Glama
knightchrism

GeoRescue MCP Server

by knightchrism

Status: early prototype, work in progress.

Test demo — not authoritative. Not a survey, title opinion, or legal determination; for testing and demonstration only. Results are automated, experimental data quality test results computed from public data. Verdicts are proposals, not findings; placements of deed descriptions are best-fit, not measured in the field. Consult a licensed surveyor and mapper or an attorney and the official records. GeoRescue is not affiliated with the City of Jacksonville, the Duval County Clerk of Courts or the Duval County Property Appraiser. See TERMS.md. Questions, corrections or removal requests: open an issue at https://github.com/knightchrism/georescue/issues

What it does

  • Inspects parcel layers (SHP / GPKG / GeoJSON) for invalid or empty geometry, duplicate IDs and geometries, CRS problems, out-of-bounds features, overlaps, slivers, gaps and attribute-rule violations (YAML rules, Pydantic-validated).

  • Proposes repairs on a copy — the source file is never modified; every proposed change is written to changelog.csv with before/after, reason and whether it was applied (an audit trail for review).

  • Checks overlaps against the record: appraiser legal descriptions, deed OCR, metes-and-bounds / COGO traverses and closure, compared back to the GIS fabric (verify/).

  • Publishes a static dashboard with per-case evidence pages, owner names redacted by default.

  • Talks to agents through an MCP server backed by a redacted DuckDB results store.

Related MCP server: SQLite Memory

Architecture

flowchart LR
  A[Parcel layer<br/>SHP · GPKG · GeoJSON · ArcGIS REST] --> B[inspect<br/>checks.py + YAML rules]
  B --> C[repair on a copy<br/>repair.py]
  C --> D[(out/<br/>corrected.gpkg · changelog.csv<br/>issues.csv · diff.csv · report.html)]
  B --> V[verify/<br/>PAO legal desc · deed OCR · COGO · PLSS]
  D --> P[publish<br/>redact owners]
  V --> P
  P --> S[Static site<br/>GitHub Pages]
  D --> L[load-db<br/>redacted DuckDB]
  L --> M[georescue-mcp<br/>read-only tools · logs/mcp.log]
  M --> AG[AI agent<br/>Claude · Cursor · ...]

Quickstart

git clone https://github.com/knightchrism/georescue.git && cd georescue
uv sync --extra verify
PYTHONPATH=. uv run --extra verify pytest -q          # test suite
uv run georescue inspect data.gpkg -c configs/columbia_fl.yaml
uv run georescue repair  data.gpkg -c configs/columbia_fl.yaml -o out/

On Windows, clone to a local folder such as C:\dev\georescue (keep projects out of OneDrive-synced folders).

AI / agent angle

  • georescue-mcp exposes inspection, repair-to-a-new-folder, guarded read-only SQL, governed metrics and case lookups to any MCP client (details below).

  • scripts/mcp_demo.py records real agent sessions; agent_demo/ drives a visualization loop and saves before/after snapshots.

  • Agents get the redacted store only &mdash; never owner names, never write access to source data.

Tech stack

Python 3.13 · uv · GeoPandas · Shapely · pyogrio · PyProj · DuckDB · Pydantic · Typer · Jinja2 · Streamlit + Folium · MCP Python SDK · MapLibre GL JS · GitHub Actions + Pages

Core (V1)

GIS data-quality & repair for parcel datasets. Load (SHP/GPKG/GeoJSON) → inspect → classify issues → propose repairs on a copy (every change logged) → export corrected.gpkg, changelog.csv, issues.csv, diff.csv, summary.json, report.html.

Checks

missing/empty/invalid geometry · duplicate IDs · duplicate geometries · required attributes & types (YAML rules, Pydantic-validated) · CRS missing/unexpected · out-of-bounds · overlaps · slivers · small gaps · original-vs-corrected diff.

Repairs (all logged: feature_id, check, action, before, after, reason, post_valid, applied)

make_valid (polygonal parts kept) · numeric text→number coercion · assign CRS if missing · optional: drop empty geoms, drop exact duplicates, trim overlaps below an area. Everything else is flag_only. The source file is never modified.

Usage

uv sync
uv run georescue inspect data.gpkg -c configs/columbia_fl.yaml
uv run georescue repair  data.gpkg -c configs/columbia_fl.yaml -o out/
uv run georescue report  data.gpkg -c configs/columbia_fl.yaml -o out/
uv run streamlit run app.py          # demo UI (docs/demo.png)
uv run georescue-mcp                 # MCP stdio server: inspect_dataset, repair_dataset
PYTHONPATH=. uv run --extra verify pytest -q

Real data: uv run python scripts/fetch_columbia.py (Columbia County FL LCParcels FeatureServer).

Known gaps

Gap detection uses holes in the unioned fabric (misses gaps open to the outside edge); overlap trimming is greedy (higher row loses); DuckDB batch mode not implemented; no map of issue geometries in the UI (points only); type rules don't parse unit-suffixed text (e.g. "3 Ac").

Automated vs. manual steps

Step

Status

Inspect, classify, repair, change log, QA report

Automated (georescue CLI / MCP)

RustGIS visualization loop

Automated (agent_demo/run_demo.py)

Appraiser legal descriptions, PLSS corner tie (BLM CadNSDI)

Automated (verify/)

Fetching recorded deed images (myfloridacounty.com ORI)

Manual today: portal sits behind a human-verification check

Deed OCR, metes-and-bounds + curve parsing, COGO traverse, closure and GIS comparison

Automated (verify/run_deeds.py)

Final boundary position within ~3 ft

Needs a licensed surveyor

Deed PDFs, page images, and raw county data are excluded from the repo.

Credits

See THIRD_PARTY_NOTICES.md for open-source licenses and data sources, and Data sources below. Brand font: Exo 2 (SIL Open Font License, brand/fonts/OFL.txt).

Live demo

Static dashboard (GitHub Pages): https://knightchrism.github.io/georescue/

  • KPIs per check, filterable issues table, Leaflet map of flagged parcels only (small GeoJSON, not the 584 MB county layer), per-overlap case files (verdict, confidence, ORB refs, deed closure/acreage, overlay PNGs) and run history.

  • Basemap: OpenStreetMap tiles. The COJ Duval orthoimagery has no published licence, so imagery-backed figures are not published; case pages use the plain (no-imagery) overlay PNGs.

PYTHONPATH=. uv run --extra verify georescue run --config configs/duval_fl.yaml   # -> out/runs/<ts>/, out/latest/
PYTHONPATH=. uv run --extra verify georescue publish                               # -> site/
python -m http.server -d site 8765                                                  # preview locally

Automation: .github/workflows/pipeline.yml (weekly cron + manual dispatch) runs the pipeline on a bbox extract (configs/duval_fl_ci.yaml), fetching parcels at runtime, and deploys site/ to Pages. To enable: push the repo to GitHub, then Settings → Pages → Source: GitHub Actions, and allow Actions under Settings → Actions. Only invalid-geometry repair is ever auto-applied; every other fix is a proposal recorded in changelog.csv.

Data sources

GeoRescue does not own the data below and is not affiliated with, or endorsed by, any of these sources. Their records are maintained for their own purposes (for example, assessment) and, as the Property Appraiser states for its data, are not intended for legal use such as conveyances or boundary determinations.

Owner and person names are removed from the public site (georescue publish redacts by default; --no-redact-owners is for private local builds only).

Ask GeoRescue (MCP server)

georescue load-db loads the latest run into a redacted DuckDB results store, out/georescue.duckdb. It holds the tables issues, cases, verdicts, deed_traverses, runs and glossary, and it never contains owner names. georescue run refreshes it automatically. The MCP server (uv run --extra verify georescue-mcp, stdio) exposes these tools: inspect_dataset, repair_dataset (writes a repaired copy into a new folder only), list_tables, describe_table, run_query (single SELECT/WITH, guard + row cap + 10 s timeout), list_metrics/get_metric (governed metrics in semantic/metrics.yml), get_case, find_issues, explain_issue and compare_runs. All calls are logged to logs/mcp.log.

scripts/mcp_demo.py drives the server over stdio through realistic questions and records the real calls and outputs to examples/agent_sessions.{json,md}. The site's Ask GeoRescue page renders those sessions. Each answer is filled in by a fixed template from the tool outputs. The page also has Claude Desktop / Cursor config snippets for running it yourself. These are recorded sessions and test results, not authoritative.

The server structure, SQL guard, metrics layer, logging and demo are adapted from the author's own census-pipeline (MIT). GeoRescue keeps its existing MCP SDK (mcp>=2.3, MCPServer).

Glossary

The site's glossary (generated by georescue publish from src/georescue/glossary.py and the config thresholds) explains every issue type the checks emit — what it means, why it matters, how it is detected, what (if anything) is done automatically — plus terms like verdict, confidence, deed traverse/COGO, misclosure, POB, ORB, IoU and PAO. All results are proposed test results, not authoritative.

Terms

See TERMS.md. Questions, corrections or removal requests: open an issue at https://github.com/knightchrism/georescue/issues

License

Code: MIT, see LICENSE. Third-party software and data keep their own licenses and terms (THIRD_PARTY_NOTICES.md).

Available Tools

11 tools
compare_runsB

Compare issue counts by check between two runs (default: the two most recent in the runs table).

NameRequiredDescriptionDefault
run_aNo
run_bNo

TDQS

B3.1/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral burden. It usefully discloses the default behavior (comparing the two most recent runs), but it does not state whether the operation is read-only, what the output looks like, or any preconditions such as run validity.

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, front-loaded sentence with no wasted words. The parenthetical default note is placed appropriately.

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?

For a comparison tool with no output schema and no annotations, the description is too thin. It omits the shape of the comparison result, how checks are matched, and how to specify runs beyond an implicit default.

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 there are two parameters, so the description must compensate. It only alludes to the parameters as 'two runs' and the default behavior; it does not explain what values run_a and run_b accept or that null triggers the default.

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

Purpose4/5

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

The description states a specific verb and resource: comparing issue counts by check between two runs. It is distinguishable from siblings like find_issues or explain_issue, though it does not 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?

It implies usage when comparing two runs and explains the default when runs are omitted. However, it gives no guidance on when to prefer this over find_issues or other sibling tools, nor any exclusions.

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

describe_tableC

Columns and types of a results-store table, e.g. 'issues' or 'cases'.

NameRequiredDescriptionDefault
tableYes

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, yet it says nothing about read-only nature, behavior for unknown tables, or error cases. It only asserts the shape of the returned information.

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

Conciseness4/5

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

One short sentence with no filler and the key concept front-loaded. It is fragmentary and slightly under-specified rather than padded.

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 simple single-parameter read tool this covers the essential output (columns and types), but with no annotations and no output schema, the description should also say what a failure looks like and confirm there are no side effects.

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% with a single 'table' string parameter, so the description must compensate. The examples ('issues', 'cases') give the agent real domain values to pass, which is genuinely useful, but there is no note on naming conventions, case sensitivity, or what happens for invalid names.

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

Purpose4/5

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

States a specific resource (columns and types) tied to a results-store table, with concrete table examples ('issues', 'cases'). It is distinguishable from sibling list_tables, though the verb is only implied by the name rather than stated in the description.

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 guidance on when to call this versus inspect_dataset, list_tables, or run_query. An agent must infer that this is the schema-introspection step before querying.

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

explain_issueA

Plain-English explanation of an issue type or site term (e.g. 'sliver_polygon', 'closure', 'iou'), with the detection thresholds used, the automatic action and typical causes.

NameRequiredDescriptionDefault
checkYes

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses that the response includes detection thresholds, the automatic action, and typical causes, which is meaningful beyond the schema, but it does not explicitly confirm that the tool is read-only and side-effect-free, nor does it mention any auth or rate-limit constraints.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no redundant filler. Each part earns its place by naming the purpose, the expected input style, and the returned explanatory content.

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

Completeness4/5

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

For a one-parameter explanatory tool with no annotations or output schema, the description is largely complete: it explains the input concept and what the response will contain. It falls short only on explicit read-only behavior and on whether `check` values are validated against an enumeration.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must supply parameter semantics. It does explain that the single `check` parameter is an issue type or site term and gives three concrete examples, but it does not say whether values must be exact slugs, whether there is a canonical list, or how to handle unknown terms.

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

Purpose5/5

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

The description states a specific verb and resource: it explains an issue type or site term in plain English. The examples ('sliver_polygon', 'closure', 'iou') clarify what counts as a check and distinguish this explanatory tool from action-oriented siblings like find_issues or repair_dataset.

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 when the tool is useful—when an agent needs to understand an issue term, its thresholds, automatic action, or causes—but it does not explicitly say when to use this instead of siblings such as find_issues or inspect_dataset. There are no exclusions or alternative-routing guidance.

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

find_issuesB

Filter issues in the latest run. bbox = [min_lon, min_lat, max_lon, max_lat] (EPSG:4326). Returns the total match count and up to limit rows (max 500).

NameRequiredDescriptionDefault
bboxNo
checkNo
limitNo
severityNo
parcel_idNo

TDQS

B3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden; it does disclose that results are capped at `limit` (max 500) and that a total match count is returned alongside the rows, which is genuinely useful. It says nothing about read-only safety, permissions, or what happens when filters are omitted.

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?

Two sentences, front-loaded with purpose then parameter format then return shape; no filler. The second sentence wraps awkwardly but costs no clarity.

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 absence of an output schema is partly offset by describing the return (count plus rows), but with no annotations and 0% schema coverage the description leaves too much open — filter value formats and default behavior when nothing is supplied.

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 coverage is 0%, so the description must compensate. It fully documents bbox (order plus EPSG:4326) and hints at limit's cap, but check, severity, and parcel_id — three of five parameters — are never mentioned, leaving their accepted values and semantics unknown.

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?

"Filter issues in the latest run" gives a specific verb and resource plus scope (latest run), which separates it from explain_issue and compare_runs. It stops short of naming those siblings explicitly, so an agent still has to infer the boundary.

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

Usage Guidelines2/5

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

There is no statement of when to use this versus explain_issue (drill into one issue) or compare_runs (cross-run diff). The 'latest run' qualifier hints at scope but no alternatives or exclusions are given.

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

get_caseA

One case file by case_id (e.g. '0015420010__0015315300') or by a parcel ID (e.g. '001542 0010'): the proposed verdict, confidence, ORB refs, deed check (closure, IoU) and the parcel's issues.

NameRequiredDescriptionDefault
case_idNo
parcel_idNo

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 full burden. It usefully discloses the returned payload (verdict, confidence, deed check with closure and IoU, parcel issues), which substitutes for a missing output schema. However, it says nothing about whether the call is read-only, error behavior when a case is not found, or what happens if both/neither identifier is supplied.

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 sentence, front-loaded with the lookup keys and followed by the returned fields, with no filler. The nested parentheticals are slightly dense but each carries useful format or payload information.

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

Completeness4/5

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

For a two-parameter lookup with no annotations and no output schema, the description covers both input formats and the return contents, which is most of what an agent needs. The remaining gap is requiredness/precedence between the two optional identifiers.

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

Parameters4/5

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

With 0% schema coverage, the description must do the work, and it does add real value by supplying concrete identifier formats ('0015420010__0015315300' vs '001542 0010') that the bare null-typed string fields do not convey. It stops short of stating whether exactly one identifier is required or which wins if both are passed.

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 opens with a specific verb and resource ('One case file by case_id ... or by a parcel ID') and enumerates the payload (verdict, confidence, ORB refs, deed check, issues), so the agent knows exactly what it retrieves. It does not reference any sibling tool, so differentiation from the inspect/query tools is left implicit.

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

Usage Guidelines3/5

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

It states the two valid lookup keys and gives concrete example formats, which implies when the tool applies. But there is no explicit guidance on when to pick this over siblings like find_issues, explain_issue, or run_query, and no exclusions.

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

get_metricB

Compute a governed metric from semantic/metrics.yml. Returns rows, the SQL used and caveats.

NameRequiredDescriptionDefault
nameYes
group_byNo

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries full burden: it does disclose the return payload (rows, the SQL used, caveats), which is genuinely useful context for trusting results. It says nothing about whether the call is read-only, what permissions or validation apply, or what happens when a metric name is unknown.

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?

Two short sentences, front-loaded with the core action and followed by the return contract. No filler, though the grouping behavior could be folded in without bloat.

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 description covers the return shape in lieu of an output schema, which is good, and it is adequate for the required 'name' parameter. However, the optional grouping parameter and the distinctness from run_query remain unexplained, leaving meaningful gaps for a two-parameter analysis tool with no annotations.

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 both parameters need the description to compensate. It implies 'name' is a metric identifier defined in metrics.yml, which adds real meaning, but 'group_by' is never mentioned — an agent must guess its accepted values and effect on output shape.

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?

Specific verb + resource: 'Compute a governed metric from semantic/metrics.yml', plus a claim about what comes back. This distinguishes it reasonably from generic siblings like run_query or list_metrics, though it never names 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 phrase 'governed metric from semantic/metrics.yml' implies this is the path when an approved metric definition exists rather than ad-hoc SQL, and the sibling list (run_query, list_metrics) makes the contrast inferable. But no explicit when/when-not or prerequisite (e.g., call list_metrics first to find a valid name) is stated.

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

inspect_datasetB

Inspect a parcel dataset (read-only). Filter issues by check name(s) and severity(ies), page with limit/offset, and set include_wkt to get each issue's geometry (working CRS WKT).

NameRequiredDescriptionDefault
pathYes
checkNo
limitNo
offsetNo
severityNo
config_pathNo
include_wktNo

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description does real work by disclosing read-only behavior and that include_wkt returns each issue's geometry as working CRS WKT. However, it does not explain the return shape, default filtering behavior, config_path effects, or pagination behavior beyond the parameter names.

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 two short sentences, front-loaded with the core operation and then the main filtering/pagination/output switches. It is efficient, though the second sentence is a dense list and the first sentence's broad 'inspect' framing sits slightly awkwardly with the issue-focused detail that follows.

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 7-parameter read-only tool with no annotations, no output schema, and 0% schema description coverage, the description covers the main filtering, paging, and include_wkt behavior. It remains incomplete because path and config_path are undocumented and the return structure and default behavior when filters are omitted are not described.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must carry parameter meaning. It clarifies check name(s), severity(ies), limit/offset pagination, and include_wkt geometry output, but says nothing about the required path parameter's expected value or the config_path parameter, and gives no accepted check/severity values.

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

Purpose4/5

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

The description states a specific verb and resource: inspect a parcel dataset read-only, and clarifies that it filters issues. It is understandable without opening the schema, but it does not explicitly distinguish this tool from siblings such as find_issues or explain_issue.

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

Usage Guidelines3/5

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

Usage is implied by 'Inspect a parcel dataset (read-only)' and the filtering/paging details, but there is no explicit when-to-use or when-not-to-use guidance. It does not name alternatives like find_issues or repair_dataset, so an agent must infer selection from the operation semantics.

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

list_metricsA

List governed metrics (name, label, unit, description, allowed group_by).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full burden, but for a zero-parameter tool the risk surface is small. 'Governed' hints that only a curated metric set is returned, which is useful context beyond structured fields, yet nothing is said about ordering, completeness, or whether the set is workspace-scoped.

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

Conciseness4/5

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

One short, front-loaded sentence with the verb and resource first and no filler. The parenthetical return-field list slightly duplicates the output schema, which is the only wasted surface.

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

Completeness4/5

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

An output schema exists, so return values needn't be explained, and with no parameters there is little else to cover. The remaining gap is scope — whether the list covers all governed metrics or a filtered subset — which an agent might want before deciding to page or follow up.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate — baseline 4 applies. The field list in parentheses describes the response shape rather than any input, so it contributes little on this dimension.

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

Purpose4/5

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

States a specific verb ('List') and a specific resource ('governed metrics'), and the parenthetical enumerates what each metric carries. That clearly separates it from the singular sibling get_metric, though it never names that sibling explicitly.

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

Usage Guidelines3/5

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

Usage is only implied: an agent can infer this is the discovery step before get_metric, but the description never states when to use it, when not to, or which sibling to prefer. No prerequisite or scoping conditions are given.

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

list_tablesA

List tables in the GeoRescue results store (latest run, owner names redacted).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose two non-obvious traits: results are scoped to the latest run only and owner names are redacted. It stops short of stating ordering, whether an empty store yields an empty list, or read-only semantics explicitly.

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

Conciseness5/5

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

A single front-loaded sentence with the key scoping and redaction caveats in parentheses. Every element earns its place, with no filler.

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

Completeness4/5

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

An output schema exists, so return structure needn't be explained, and with no parameters the surface is small. The description covers the important context (latest-run scope, redaction); only minor details like ordering or empty-result behavior are absent.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4; there is no parameter behavior to clarify. The description adds no param detail, but none is needed.

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

Purpose4/5

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

States a specific verb (List) and resource (tables) plus the store it targets, so the agent knows exactly what it retrieves. It doesn't explicitly name how it differs from siblings like describe_table or list_metrics, though the 'tables' vs 'table detail' distinction is reasonably evident.

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

Usage Guidelines3/5

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

Usage is only implied: an agent can infer this is a discovery step before describe_table or run_query, but the description never says when to use it versus alternatives or what prerequisites exist. No exclusions or alternative routing are stated.

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

repair_datasetA

Write a repaired COPY of the dataset plus changelog into a NEW folder (a proposal output). Never modifies the input; refuses an out_dir that is the input's folder or already contains files.

NameRequiredDescriptionDefault
pathYes
out_dirYes
config_pathNo

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses that the input is never modified, that output is a copy plus a changelog, and that unsafe out_dir values are refused. It leaves out what happens on refusal (error vs. no-op) and nothing about the result payload.

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

Conciseness5/5

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

Two dense sentences, front-loaded with the write target and followed by the safety constraints. No filler, and every clause carries a constraint the schema does not express.

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?

Covers the write-safety profile and output location, which is the critical part for a mutation tool with no annotations. But with no output schema and undocumented config_path, the description does not say how a repair is configured or what the caller gets back.

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. It gives strong semantics for out_dir (new, non-input, empty) and implies path is the input dataset via 'Never modifies the input', but config_path is never mentioned at all, leaving one of three parameters opaque.

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

Purpose4/5

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

States a specific verb and resource: writes a repaired COPY of the dataset plus changelog into a NEW folder. That is far more specific than the read-only siblings (inspect_dataset, find_issues, compare_runs), though it never explicitly contrasts itself with them or explains what 'repaired' means.

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

Usage Guidelines4/5

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

Gives clear guardrails on when the call is valid: out_dir must be a new folder, must not equal the input's folder, and must not already contain files. It does not name alternatives or say what workflow precedes a repair (e.g. after find_issues/explain_issue).

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

run_queryA

Run ONE read-only SELECT/WITH query on the results store. Capped (default 100, max 500 rows), 10 s timeout. Quote the column "check" (a keyword).

NameRequiredDescriptionDefault
sqlYes
max_rowsNo

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it declares read-only enforcement, single-statement restriction, row caps (default 100, max 500) and a 10 s timeout, plus the 'check' keyword quoting requirement. It does not say what happens on cap/timeout truncation or whether errors are raised or returned.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core action, then limits, then the one syntax gotcha. No filler or restatement of the tool name.

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

Completeness4/5

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

For a 2-parameter tool with no output schema, the essentials (single statement, read-only, row cap, timeout, quoting pitfall) are covered. What remains thin is the shape of results and whether truncation is signaled, which an agent would want before relying on the output.

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?

Schema coverage is 0%, so the description must compensate, and it does for both parameters: it constrains 'sql' to one SELECT/WITH statement and warns about quoting the reserved column 'check', and it supplies the effective upper bound of 500 for 'max_rows' which the schema omits. Error/validation behavior for malformed SQL is still unspecified.

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

Purpose4/5

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

States a concrete verb and resource: run one read-only SELECT/WITH query against the 'results store', with the scope constraint of a single statement. An agent can distinguish it from list_tables/describe_table/inspect_dataset, though it never names those siblings explicitly to reinforce the routing.

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?

'Run ONE read-only SELECT/WITH query' implies ad-hoc SQL querying as opposed to metadata inspection, so usage is inferable from the sibling set. There is no explicit when-to-use/when-not guidance, e.g. no statement that schema discovery should go through list_tables or describe_table first.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 11 tool updatesv0.1.0
    • First observedcompare_runs
    • First observeddescribe_table
    • First observedexplain_issue
    • First observedfind_issues
    • First observedget_case
    • First observedget_metric
    • First observedinspect_dataset
    • First observedlist_metrics
    • First observedlist_tables
    • First observedrepair_dataset
    • First observedrun_query

TDQS

A3.7/5.0

Scored across 11 tools

Disambiguation4/5

Most tools target distinct resources or actions, and descriptions clarify boundaries such as inspect_dataset for parcel datasets versus find_issues for latest-run issues. Minor overlap remains between inspect_dataset and find_issues, and between run_query and governed metric tools, but the intended use cases are separable.

Naming Consistency5/5

All tools use snake_case verb_noun names with clear, predictable verbs such as list_, get_, find_, inspect_, repair_, and compare_. Singular/plural noun choices are appropriate to each operation and remain consistent throughout.

Tool Count5/5

Eleven tools is well scoped for a dataset inspection, repair-proposal, results-querying, metrics, and case-review server. Each tool covers a meaningful operation without obvious redundancy.

Completeness4/5

The surface covers inspection, repair proposal generation, results-store discovery/querying, governed metrics, case lookup, issue filtering/explanation, and run comparison. Minor gaps exist around listing cases or runs directly and applying a repair, but core workflows are supported.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables AI agents to discover and execute analytical queries on a DuckDB dataset through typed MCP tools, with guarded read-only SQL support for complex calculations without direct database access.
    6
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables coding agents to query and modify a SQLite database through twelve SQL-based tools, with safety enforced server-side via statement policies, protected tables, result caps, and snapshots. It also provides an append-only, hash-chained memory log with checkpoints so agents can record events and resume context across sessions.
    12
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Exposes a synthetic issue tracker and pipeline warehouse as callable tools so an agent can answer operational questions about tickets, pipeline health, runs, incidents, and governed metrics with every claim cited to the exact tool call it came from. All writes are proposal-only, requiring human approval through a gated apply path that logs each step for audit.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to inspect schemas, walk Delta table history, run read-only DuckDB queries, and check data-quality and job-run status safely.
    MIT