Skip to content
Staircase

Tools

The tool registry a client connects to: one definition set served over several transports, with a guarded query surface.

One registry is the single source both the standard-input entry and the HTTP entry read, so the two transports cannot drift apart. Every tool carries a title, a description, and a per-parameter description written for a model rather than for a reader who already knows the domain.

  • One tool registry is the single source both transports read, so the stdio entry and the HTTP entry cannot drift apart.
  • Every tool carries a title, a description, and a per-parameter description written for a model rather than for a reader who already knows the domain.
  • Query tools are guarded in four layers: comment and literal stripping, multi-statement rejection, a read-only statement allowlist, and an unconditional row cap.

How it works

The query tools accept caller-written SQL, which is only safe because the guard is explicit. Four layers, in order: comments and string literals are stripped before any keyword matching, so a value like 'copy' inside a string cannot trip the filter; multiple statements are rejected; the statement must begin SELECT or WITH; and the caller's query is wrapped in an outer select with a row cap the caller cannot override.

Stripping literals before matching is what a plain keyword scan does not do. A scan over raw text rejects owners_text ILIKE '%copy%', which is a legitimate query, and a guard that rejects legitimate queries is one callers route around.

Tools that author their own SQL use a separate path with positional binding and skip the caller validator, because they are safe by construction rather than by inspection.

The registry

listClassesByDataGroup

List classes by data group

List classes for a property data group with names and descriptions

  • groupNamestringrequired

    The data group name, case-insensitive

listPropertiesByClassName

List properties by class name

Lists JSON Schema property names for a property class (excludes source_http_request)

  • classNamestringrequired

    The class name, case-insensitive

getPropertySchema

Get property schema by class and property

Returns the full JSON Schema object for a class property

  • classNamestringrequired

    Class name, case-insensitive

  • propertyNamestringrequired

    Property name, case-insensitive

getVerifiedScriptExamples

Get verified script examples

Get most relevant working examples of the code, that maps data to the canonical property schema

  • querystringrequired

    Description of the example meaning. Wll be used to search for similar examples.

  • topKnumber

    Number of results (default 5)

listOracleProperties

List Oracle open-data properties

Paginated discovery of properties for a county. Returns slim entries (propertyId, parcelIdentifier, cid, county, fileSizeBytes) plus summary fields (address, marketValue, ownerName) when served from the query table. Use getOracleProperty to fetch full consolidated data for a specific entry.

  • countystring

    Filter by county name (case-insensitive)

  • limitnumber

    Number of results to return (default 50, max 500)

  • offsetnumber

    Zero-based offset for pagination (default 0)

getOracleProperty

Get Oracle open-data property

Fetch the full consolidated property JSON (appraisal, permits, Sunbiz, BBB) from content-addressed storage. Provide exactly one of parcelIdentifier, propertyId, or cid.

  • parcelIdentifierstring

    The property parcel identifier (digits) — looked up in the manifest to resolve its content-addressed storage content address

  • propertyIdstring

    The property UUID — looked up in the manifest to resolve its content-addressed storage content address

  • cidstring

    content-addressed storage content address for the consolidated property JSON

  • countystring

    County to look up the parcel/property in (case-insensitive). Selects which county's open data to read when the deployment serves multiple counties.

getOracleDatasetInfo

Get Oracle open-data dataset info

Returns dataset-level metadata for a county: county, propertyCount (live row count when served from the query table), state, and provenance/content address fields on the legacy path. When per-source coverage is configured, also returns datasets[] with, per source (appraisal, permits, sunbiz, bbb), ingestedCount, expectedCount, completionPercent, and first/last loaded timestamps — so callers can qualify partial answers by coverage. For a coverage-only county (no property dataset served) propertyCount is null and propertyDatasetAvailable is false, so callers can distinguish a missing property table from a county with zero properties.

  • countystring

    County to report dataset info for (case-insensitive). Selects which county's open data to read when the deployment serves multiple counties.

getPropertyPermits

Get property permits (on-demand)

Fetch permit records for a property by parcel ID. Returns cached permits immediately if available. If not cached, enqueues a harvest job (reuses the permit-harvest Lambda) and returns a status indicating the harvest is in progress — poll again after ~90 seconds. Permits are cached to content-addressed storage after harvest completes.

  • parcelIdstringrequired

    The property parcel identifier (digits, e.g. '1234567890000')

  • countyFipsstring

    County FIPS code (default: 12071 = Lee County FL)

findPropertiesInArea

Find properties in an area

Returns the set of properties whose centroid (latitude/longitude) falls inside a user-supplied bounding box or polygon. Provide exactly one of bbox or polygon. Reads the per-county property query table (falls back to the derived geo index); no NOAA/FEMA geometry is used.

sumPropertyValueInArea

Sum property value in an area

Returns the exact sum of avm_value over the properties whose centroid falls inside a user-supplied bounding box or polygon, plus the in-area count. Null valuations are treated as 0. Provide exactly one of bbox or polygon. Reads the per-county property query table (falls back to the derived geo index).

queryProperties

Query properties (SQL)

Run a read-only SQL SELECT against a county's flat property query table (view name 'properties', one row per property) backed by embedded DuckDB. Use getPropertyQuerySchema first to see available columns. SAFETY: a single SELECT statement only (a leading WITH/CTE is allowed); multiple statements and any mutating or file/extension keyword (INSERT/UPDATE/DELETE/COPY/ATTACH/INSTALL/LOAD/PRAGMA/CALL/SET …) are rejected; results are always capped at 1000 rows.

  • countystringrequired

    County to query (case-insensitive), e.g. 'Lee'.

  • sqlstringrequired

    A single read-only SELECT statement over the 'properties' view.

  • limitnumber

    Max rows to return (default 100, max 1000). Always enforced.

getPropertyQuerySchema

Get property query schema

Returns the column list, DuckDB types, and a one-line description of each column of the 'properties' query table for a county, so queryProperties can be written without guessing. Notes that some coverage-dependent fields may be NULL.

  • countystringrequired

    County to describe (case-insensitive), e.g. 'Lee'.

queryPermits

Query permits (SQL)

Run a read-only SQL SELECT against a county's flat permit query table (view name 'permits', one row per building permit) backed by embedded DuckDB. Use getPermitQuerySchema first to see available columns and getPermitCoverage to qualify aggregate answers by source. SAFETY: a single SELECT statement only (a leading WITH/CTE is allowed); multiple statements and any mutating or file/extension keyword (INSERT/UPDATE/DELETE/COPY/ATTACH/INSTALL/LOAD/PRAGMA/CALL/SET …) are rejected; results are always capped at 1000 rows.

  • countystringrequired

    County to query (case-insensitive), e.g. 'Lee'.

  • sqlstringrequired

    A single read-only SELECT statement over the 'permits' view.

  • limitnumber

    Max rows to return (default 100, max 1000). Always enforced.

getPermitQuerySchema

Get permit query schema

Returns the column list, DuckDB types, and a one-line description of each column of the 'permits' query table for a county, so queryPermits can be written without guessing. Notes that date/value fields are frequently NULL depending on the permit source.

  • countystringrequired

    County to describe (case-insensitive), e.g. 'Lee'.

getPermitCoverage

Get permit coverage by source

Returns per-source-system permit coverage for a county from the 'permits' query table: each source_system with its permit_count and completion_date range (earliest/latest), plus the overall total. The donphan agent uses this to QUALIFY aggregate permit answers (permit data lags appraisals and some sources may have NULL dates).

  • countystringrequired

    County to report permit coverage for (case-insensitive), e.g. 'Lee'.

Type to search.