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.
API key (recommended for automated agents)
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.
| Parameter | Type | Required | Description |
|---|---|---|---|
state | string | No | 2-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.
| Parameter | Type | Required | Description |
|---|---|---|---|
county | string | Yes | "Name, ST" (e.g. "Hillsborough, FL") or 5-digit FIPS code |
limit | number | No | Maximum 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.
Related
- Authentication — create and manage API keys
- Quickstart — REST API quickstart
- Counties reference — available counties
- Parcels reference — full field reference