GeoRescue MCP Server
The GeoRescue MCP server provides read-only access to parcel data quality inspection results, enabling data exploration, issue discovery, metric tracking, and proposing data repair copies via standardized tools.
Inspect raw parcel datasets for specific issues like invalid geometry, CRS problems, and attribute violations.
Propose data repairs by generating corrected data copies without ever modifying the original source file.
Interact with the underlying results store by running SQL queries and describing tables.
Retrieve detailed case files, including verdicts, confidence scores, and related GIS checks.
Locate specific parcels or issues using geographic bounding boxes (bbox).
Access governed metrics, compare data quality trends across different processing runs, and find explanations for complex GIS issues.
Provides tools for working with GeoRescue's redacted DuckDB results store: listing and describing tables, running guarded read-only queries, retrieving metrics, cases, issues, and comparing runs.
Click on "Deploy 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., "@GeoRescue MCP Serverrepair data.gpkg and save a corrected copy with a changelog"
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.
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.csvwith 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-mcpexposes inspection, repair-to-a-new-folder, guarded read-only SQL, governed metrics and case lookups to any MCP client (details below).scripts/mcp_demo.pyrecords real agent sessions;agent_demo/drives a visualization loop and saves before/after snapshots.Agents get the redacted store only — 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 -qReal 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 ( |
RustGIS visualization loop | Automated ( |
Appraiser legal descriptions, PLSS corner tie (BLM CadNSDI) | Automated ( |
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 ( |
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 locallyAutomation: .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.
City of Jacksonville GIS — parcels (CityBiz/Parcels service): https://maps.coj.net/coj/rest/services/CityBiz/Parcels/MapServer/0 · home/disclaimer: https://maps.coj.net/
Duval County Property Appraiser: https://paopropertysearch.coj.net/Basic/Search.aspx (disclaimer shown on the search site)
Duval County Clerk of Courts — Official Records: https://or.duvalclerk.com · disclaimer: https://www.duvalclerk.com/disclaimer
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 toolscompare_runsB
Compare issue counts by check between two runs (default: the two most recent in the runs table).
| Name | Required | Description | Default |
|---|---|---|---|
| run_a | No | ||
| run_b | No |
TDQS
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.
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.
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.
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.
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.
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes |
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, 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| check | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | No | ||
| check | No | ||
| limit | No | ||
| severity | No | ||
| parcel_id | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| case_id | No | ||
| parcel_id | No |
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 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| group_by | No |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| check | No | ||
| limit | No | ||
| offset | No | ||
| severity | No | ||
| config_path | No | ||
| include_wkt | No |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| out_dir | Yes | ||
| config_path | No |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| max_rows | No |
TDQS
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.
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.
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.
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.
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.
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.
11 tool updates
v0.1.0- First observed
compare_runs - First observed
describe_table - First observed
explain_issue - First observed
find_issues - First observed
get_case - First observed
get_metric - First observed
inspect_dataset - First observed
list_metrics - First observed
list_tables - First observed
repair_dataset - First observed
run_query
TDQS
Scored across 11 tools
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.
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.
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.
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
Related MCP Connectors
Agent-native MCP over US public + government records, entity- and parcel-keyed.
A read-only verified record of agent-operable GTM tools: search, fetch, compare, track changes.
US parcel, zoning, ordinance and permit data, with a Python sandbox to query and map it
Astra DB tools for agents: schema, find, vector search, guarded writes, and interactive views.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables 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.6MIT
- AlicenseAqualityBmaintenanceEnables 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.12MIT
- AlicenseNot gradedqualityCmaintenanceExposes 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
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to inspect schemas, walk Delta table history, run read-only DuckDB queries, and check data-quality and job-run status safely.MIT