MCP server
Isopleth runs a hosted Model Context Protocol server, so Claude, Cursor, VS Code, Codex, ChatGPT, Claude.ai and other AI agents can look up public data about any US location directly. Connect with your Isopleth sign-in or an API key; either way it uses the same plans, lookups and limits as the REST API.
Connect
Server URL: https://api.isopleth.dev/mcp (Streamable HTTP). Two ways to authenticate:
- Sign in with Isopleth (OAuth). For ChatGPT, Claude.ai and any client that supports MCP sign-in. The app sends you to Isopleth to sign in and approve, and never sees a key.
- API key. Send it in the
Authorization: Bearerheader. Never put the key in the URL.
ChatGPT
ChatGPT connects with your Isopleth sign-in, no key needed. Custom MCP servers are available on ChatGPT web for Pro, Business, Enterprise and Edu accounts (workspace admins may need to allow them).
- Open Plugins in ChatGPT, select +, then Add custom MCP server. (Older layouts: Settings → Apps → Create, with developer mode on.)
- Name it Isopleth and enter the server URL
https://api.isopleth.dev/mcp. - Choose OAuth for authentication and leave the client ID and secret blank. ChatGPT registers itself.
- Accept the risk notice and create it. ChatGPT opens the Isopleth sign-in: enter your email, open the sign-in link we send you in the same browser, and choose Allow access.
- Start a chat, type
@and pick Isopleth.
Claude.ai (web, desktop and mobile)
Claude connects with your Isopleth sign-in too. Custom connectors are on Pro, Max, Team and Enterprise plans; on Team and Enterprise an owner adds the connector first, then each person connects their own Isopleth account.
- Go to Customize → Connectors (formerly Settings → Connectors), select Add, then Add custom connector.
- Name it Isopleth and enter
https://api.isopleth.dev/mcp. Keep the detected sign-in settings and leave the OAuth client fields blank. - Select Connect, sign in to Isopleth with your email and choose Allow access.
- Turn Isopleth on from the connectors menu in a chat. A connector added on claude.ai also shows up in Claude Desktop and the mobile apps.
How app sign-in works
- Approving an app gives it access to Isopleth's MCP tools only. It can't see your API keys or billing, and its token is refused by the REST API.
- Lookups made through an app count against your plan, with the same rate limit and daily cap as your API keys. All your connected apps share one rate limit.
- Access tokens expire after an hour and the app renews them quietly. Renewal stops after 30 days without use.
- See and disconnect apps any time under Connected apps on your dashboard. A disconnected app loses access immediately.
- Technical details: OAuth 2.1 with PKCE (S256), dynamic client registration and client ID metadata documents, and
discovery at
https://api.isopleth.dev/.well-known/oauth-protected-resource/mcp.
Claude Code
claude mcp add --transport http isopleth https://api.isopleth.dev/mcp --header "Authorization: Bearer $ISOPLETH_KEY"
Or skip the key: add it without the header, then run /mcp in Claude Code and choose to authenticate.
Claude Desktop
The simplest route is the connector set up on claude.ai, which Claude Desktop picks up. To
use an API key instead, go through the mcp-remote bridge (needs Node.js 18 or later): open Settings →
Developer → Edit Config, add this to claude_desktop_config.json, then restart Claude Desktop.
{
"mcpServers": {
"isopleth": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.isopleth.dev/mcp",
"--header",
"Authorization:${ISOPLETH_AUTH}"
],
"env": {
"ISOPLETH_AUTH": "Bearer YOUR_ISOPLETH_KEY"
}
}
}
}
Cursor
Add to ~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project). Leave out
headers to sign in with your Isopleth account instead of a key.
{
"mcpServers": {
"isopleth": {
"url": "https://api.isopleth.dev/mcp",
"headers": {
"Authorization": "Bearer YOUR_ISOPLETH_KEY"
}
}
}
}
VS Code (Copilot agent mode)
Add to .vscode/mcp.json. VS Code asks for the key once and stores it securely. Without the
headers block VS Code offers to sign in with your Isopleth account.
{
"servers": {
"isopleth": {
"type": "http",
"url": "https://api.isopleth.dev/mcp",
"headers": {
"Authorization": "Bearer ${input:isopleth-key}"
}
}
},
"inputs": [
{
"type": "promptString",
"id": "isopleth-key",
"description": "Isopleth API key",
"password": true
}
]
}
OpenAI Codex CLI
Add to ~/.codex/config.toml and export ISOPLETH_KEY in your shell.
[mcp_servers.isopleth] url = "https://api.isopleth.dev/mcp" bearer_token_env_var = "ISOPLETH_KEY"
Other MCP clients
Any client that supports Streamable HTTP works: server URL https://api.isopleth.dev/mcp, then either the header
Authorization: Bearer <your key> or the client's OAuth sign-in. Clients that only speak stdio can use
the mcp-remote bridge shown for Claude Desktop.
Tools
| tool | what it does |
|---|---|
fetch_location | Get public-data facts for one US location, given lat+lng or a street address, and a preset and/or a list of field names. Each value comes back with its unit, status (ok, absent or failed), source and confidence. Costs 1 lookup per started block of 50 fields; nothing is charged when no field returns data. |
fetch_batch | Get the same preset and/or fields for several US locations in one call (up to your plan's batch size: 10 on Free, 100 on paid plans). Results are index-aligned with the input, each with its own ok flag. Costs 1 lookup per location per started block of 50 fields. Places nobody has asked about before are fetched live and can take a few seconds each, so keep batches to 10-25 new locations per call. Pass idempotency_key to retry a batch without being charged twice. |
geocode_address | Turn a US street address into lat/lng plus the normalized address, using the US Census geocoder (placed along the street from the house-number range, not a rooftop). accuracy is 1 for a single match and lower when several candidates matched. Costs 1 lookup when it resolves; address_not_found is not charged. |
list_presets | List the named field bundles (presets) such as terrain, flood_risk, natural_hazard, utilities, solar_siting and data_center_siting, with their field names. Free. |
search_fields | Search the field catalog by words in the field name or description (e.g. 'flood zone', 'substation', 'wildfire', 'broadband'), optionally limited to one preset or source. Returns name, type, unit, source and description. Free. |
describe_fields | Full catalog entries for named fields: description, type, unit, source, source URL, license, attribution, refresh interval and presets. Free. |
parcel_enrich | Get the public parcel record for one US parcel, located by lat+lng, street address, parcel_id (from an earlier result) or apn+state: owner, situs and mailing address, land use, zoning, assessed/land/improvement value, last sale, year built, legal description, plus boundary calcs (acres, square feet, perimeter, centroid, bounding box, compactness, minimum rectangle) and the GeoJSON boundary. Columns vary by state; see parcel_coverage. Optionally pass fields and/or a preset to also compute point fields at the parcel centroid. Costs 1 lookup per matched parcel plus 1 per started block of 50 point fields; nothing is charged when no parcel matches. |
parcel_search | Find parcels in one or more states by county, acreage, owner name, land-use code or words, total/land value, sale price or date, year built, ZIP, city, a bbox or a GeoJSON polygon, or generic column filters ({field, op, value} with op eq, ne, lt, lte, gt, gte, in, between, contains, starts_with, exists, missing). All filters are ANDed. Returns up to 100 parcels per page with next_cursor for the next page. Costs 1 lookup per page that returns parcels. |
parcel_coverage | States with parcel data: parcel counts, counties, publisher, licence, data vintage, refresh cadence and the share of parcels with each column filled (owner, values, sale, zoning...). Free. |
get_usage | Your plan, its limits (batch size, requests per minute, daily cap), lookups remaining this period and recent daily usage. Free. Check it before a large batch. |
Prompts
The server also offers each template as an MCP prompt. In clients that show prompts (for example as slash commands), pick one and give it a location or a list.
| prompt | template |
|---|---|
land_read | Land Read: Terrain, soil and land-cover facts for one site, every value tied to its public source. |
power_read | Power Read: Grid and utility context for one site: nearest transmission line and voltage, substation, power plant, gas pipeline, utility territory and water and sewer service. |
hazards_read | Hazards Read: Flood, wetland, wildfire and severe-weather exposure for one site, cited to FEMA, USFWS, USGS, NOAA and state fire-agency sources. |
insurance_book_monitoring | Insurance Book Monitoring: Re-screen a list of insured properties for flood, wildfire and severe-weather exposure in batches, and route anything that crosses a threshold to manual review. |
crm_address_cleanup | CRM Address Cleanup: Turn a messy list of CRM or lead addresses into normalized records with coordinates, and an explicit review queue for anything that did not match. |
Lookups and limits
Tool calls are metered exactly like the REST API, because they run through it: one location with up to
50 fields is 1 lookup, a geocode that resolves is 1 lookup, and
one matched parcel from parcel_enrich is 1 lookup, one
parcel_search page with results is 1 lookup, and
list_presets, search_fields, describe_fields, parcel_coverage and
get_usage are free.
Your plan's requests per minute, batch size, concurrency and daily cap apply to tool calls too. Connecting and listing
tools are free and do not use your per-minute requests. See Lookups and billing.
When a limit is hit, the tool returns an error with its code (for example rate_limited,
daily_cap_reached or quota_exhausted) and, where relevant, retry_after_s, so the agent
can wait or tell you.
Tips for agents
- Start with
list_presetsorsearch_fieldsto find field names, then fetch only what you need. - Results default to a compact form (value, unit, status, source, confidence). Pass
detail: "full"for license, attribution, dataset vintage and notes on every field. - Places nobody has asked about before are fetched live from public sources and can take several seconds each. Keep
fetch_batchcalls to 10 to 25 new locations. - Parcel records (owner, values, sale, boundary) come from
parcel_enrichandparcel_search, only in the states listed on Parcels. Callparcel_coveragefirst: some states publish no owner names or sale data.