tracts.ai API

MCP for agents

Use the tracts.ai MCP server to query parcel data as native tools in Claude, Cursor, and other MCP-compatible agents.

tracts.ai exposes a Model Context Protocol (MCP) server so AI agents can query parcel records as native tool calls — no glue code, no custom HTTP wrappers. The same data and lineage as the REST API, surfaced directly in your agent's tool palette.

Endpoint: https://mcp.tracts.ai/mcp (Streamable HTTP transport)

Authentication

Two auth methods are supported. Use whichever fits your setup.

Pass your tracts API key in the x-api-key header. Get a key from Dashboard → API Keys.

{
  "mcpServers": {
    "tracts": {
      "url": "https://mcp.tracts.ai/mcp",
      "headers": {
        "x-api-key": "tracts_live_…"
      }
    }
  }
}

OAuth flow (no API key)

MCP-native clients (Claude, Cursor) can connect with no API key at all — just point them at the endpoint. On first use the server returns a 401 with OAuth discovery metadata; the client registers itself, opens a browser to sign in to your tracts account, you approve access, and it holds its own token from then on.

{
  "mcpServers": {
    "tracts": {
      "url": "https://mcp.tracts.ai/mcp"
    }
  }
}

No headers block — the client walks you through sign-in. Use the API key method instead for headless/automated agents that can't do an interactive browser login.

Tools

list_counties

Returns the counties that have a configured data source.

ParameterTypeRequiredDescription
statestringNo2-letter state code to filter results (e.g. FL)

Example response:

{
  "total": 2,
  "counties": [
    { "name": "Hillsborough County", "state": "FL", "configured": true },
    { "name": "Maricopa County",     "state": "AZ", "configured": true }
  ]
}

get_parcels

Returns parcel records for a county, with assessor fields and data lineage.

ParameterTypeRequiredDescription
countystringYes"Name, ST" (e.g. "Hillsborough, FL") or 5-digit FIPS code
limitnumberNoMaximum records to return (default: 25)

Each record carries the source's assessor fields (owner, situs/mailing address, etc.) plus a provenance block, and the response is stamped with source, sourceUrl, and pulledAt for full data lineage. Available fields vary by county source.

Example response:

{
  "county": "Hillsborough County",
  "state": "FL",
  "source": "arcgis",
  "sourceUrl": "https://services9.arcgis.com/.../FeatureServer/0",
  "returned": 1,
  "pulledAt": "2026-06-27T00:00:00.000Z",
  "records": [
    {
      "apn": "U-29-28-19-3XX-000000-0001X",
      "ownerName": "SMITH JOHN A",
      "situsAddress": "123 N Armenia Ave",
      "situsCity": "Tampa",
      "situsState": "FL",
      "mailingAddress": "456 Out-of-State Rd",
      "provenance": {
        "source": "arcgis",
        "sourceUrl": "https://services9.arcgis.com/.../FeatureServer/0",
        "fetchedAt": "2026-06-27T00:00:00.000Z"
      }
    }
  ]
}

Client setup

Claude Desktop

Add the following to your Claude Desktop config (claude_desktop_config.json):

{
  "mcpServers": {
    "tracts": {
      "url": "https://mcp.tracts.ai/mcp",
      "headers": {
        "x-api-key": "tracts_live_…"
      }
    }
  }
}

After saving, restart Claude Desktop. The list_counties and get_parcels tools will appear in Claude's tool palette automatically.

Cursor

In Cursor settings under MCP Servers, add a new server entry, or add it directly to .cursor/mcp.json:

{
  "mcpServers": {
    "tracts": {
      "url": "https://mcp.tracts.ai/mcp",
      "headers": {
        "x-api-key": "tracts_live_…"
      }
    }
  }
}

Data and lineage

Every response from the MCP server carries the same data and provenance as the REST API — source, sourceUrl, and pulledAt are present on every payload. The MCP server is a transport layer, not a different data product.

On this page