Native MCP · OpenAPI 3.1 · Function calling — works with everything

Property, people & company data,
ready for your AI agents.

Drop Plotted into Claude, ChatGPT, Gemini, Cursor, Codex, or Antigravity in 30 seconds. One key, 24 tools — enrich an address or a person, search profiles nationwide, prospect companies, reveal verified emails & phones. Every endpoint returns clean structured JSON, every tool definition is published, and rate-limit + credit metadata flows back so your agent knows when to slow down.

Connect Plotted to Claude (Desktop or Code)

Plotted ships an MCP (Model Context Protocol) server. Add it once to your Claude desktop config and every Claude conversation can call the API directly — no copy-pasting, no manual JSON.

Step 01

Edit your Claude desktop config

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json

claude_desktop_config.jsonjson
{
  "mcpServers": {
    "plotted": {
      "command": "npx",
      "args": ["-y", "@plotted/mcp-server"],
      "env": {
        "PLOTTED_API_KEY": "plt_live_***"
      }
    }
  }
}
Step 02

Restart Claude desktop

The Plotted tool icon should appear in the input area. Click it to see all 24 available operations — across property, people, and company data.

Step 03

Just ask

Claude will pick the right endpoint automatically. Examples:

  • Property: "Find absentee owners within 2 miles of 4421 Gulf Shore Blvd N, Naples FL with phone numbers"
  • People: "Find VPs of Engineering at fintech companies in California and reveal their emails"
  • Company: "Enrich Stripe — industry, headcount, and linked employees"
  • Bridge: "Who owns 4421 Gulf Shore Blvd N, and where does that person work?"
Example conversation
Find trust-owned properties within 1 mile of the Ritz-Carlton Naples that have phone numbers.
I'll search for that. [Calling plotted.geocode for "Ritz-Carlton Naples FL"] [Calling plotted.nearbyParcels with lat=26.142, lon=-81.795, radius_mi=1, is_trust=true, has_contact=true]

Found 42 trust-owned parcels with phone numbers within 1 mile. The top 3 by assessed value:
  1. NAPLES BAY HOLDINGS TRUST — 4421 Gulf Shore Blvd N · $4.2M · (239) ***-1247
  2. DAVIS FAMILY REVOCABLE TRUST — 4501 Gulf Shore Blvd N · $3.8M · (614) ***-2103
  3. SHORE LANDING HOLDINGS TRUST — 4429 Gulf Shore Blvd N · $3.1M · (212) ***-9921
⚡ 3 tool calls · 1 geocode + 1 nearby + 1 owner_search · 4 credits used · 280ms

Connect Plotted to ChatGPT

Build a Custom GPT that uses Plotted as its action source. ChatGPT will call any of the 24 endpoints based on user prompts — works in ChatGPT Plus, Team, and Enterprise.

Step 01

Create a new Custom GPT

In ChatGPT → Explore GPTs → Create → switch to the Configure tab.

Step 02

Add a Plotted action

Scroll down to ActionsCreate new action → in the Schema box, paste this URL:

OpenAPI schema URLurl
https://plotted.to/openapi.json

ChatGPT auto-imports all 24 operations.

Step 03

Add your API key

Under Authentication → pick API KeyBearer → paste your plt_live_***.

Step 04

Suggested system prompt

Instructions
You are a U.S. property, people, and company research assistant powered by Plotted
(150M+ property records + nationwide professional profiles).

Property & addresses:
- Use /v1/geocode to resolve an address to lat/lon when needed.
- Use /v1/parcels/nearby for radius searches around a point.
- Use /v1/views/absentee, /v1/views/trust, /v1/views/homeowners for curated lead segments.
- Combine filters: state, county, is_trust, has_contact, year_built_min/max, value_min/max, beds_min, baths_min, sqft_min/max.
- For bulk enrichment, use /v1/match (up to 10,000 addresses per call).

Enrichment, people & companies:
- Use /v1/enrich/address (address_id or address+zip) for the people, contacts, and distress at an address.
- Use /v1/person/enrich (email, phone, name+zip, or linkedin URL) for a person + their LinkedIn professional profile.
- Use /v1/person/search (anchor: company, name, or linkedin_url; refine with title, role, industry, region) to find people.
- Use /v1/company/enrich (name or ein) for business registry officers/agent + LinkedIn firmographics.
- Call /v1/openapi any time for the full endpoint catalog.

Always cite parcel row_id when referencing specific properties. Redact phone/email digits in
output unless the user explicitly asks for the unmasked value.

Connect Plotted to Gemini (Vertex AI or AI Studio)

Gemini's function-calling API accepts our endpoint definitions directly. Drop the Plotted tool declarations into your agent and Gemini will invoke them automatically.

Step 01

Define the Plotted tool

pythonpython
import google.generativeai as genai

plotted_tool = {
    "function_declarations": [
        {
            "name": "plotted_nearby_parcels",
            "description": "Find parcels within radius_mi of a lat/lon. Filters: is_trust, has_contact, owner, year_built_min/max, value_min/max, beds_min, baths_min, sqft_min/max.",
            "parameters": {
                "type": "object",
                "properties": {
                    "lat": {"type": "number"},
                    "lon": {"type": "number"},
                    "radius_mi": {"type": "number"},
                    "is_trust": {"type": "boolean"},
                    "has_contact": {"type": "boolean"}
                },
                "required": ["lat", "lon", "radius_mi"]
            }
        }
        # ... add the other 15 endpoints (or fetch via /openapi.json)
    ]
}

model = genai.GenerativeModel("gemini-2.0-pro", tools=[plotted_tool])
Step 02

Handle the function call

pythonpython
import requests, os
PLOTTED_KEY = os.environ["PLOTTED_KEY"]

def call_plotted(name, args):
    endpoint_map = {
        "plotted_nearby_parcels": "/v1/parcels/nearby",
        # ...
    }
    r = requests.get(
        "https://api.plotted.to" + endpoint_map[name],
        params=args,
        headers={"Authorization": f"Bearer {PLOTTED_KEY}"}
    )
    return r.json()

response = model.generate_content(
    "Find trust-owned parcels within 1mi of 26.142, -81.795 with phone numbers"
)
# If response.candidates[0].content.parts[0].function_call exists, call_plotted() and send back

Connect Plotted to Cursor (and any MCP-compatible IDE)

Cursor 0.42+ supports MCP servers natively. Same config as Claude Desktop. Lets you ask the AI inside your editor to enrich CSVs, generate property lookups, or build queries.

Step 01

Open Cursor Settings → Features → Model Context Protocol

Or edit ~/.cursor/mcp.json directly. Add this block:

~/.cursor/mcp.jsonjson
{
  "mcpServers": {
    "plotted": {
      "command": "npx",
      "args": ["-y", "@plotted/mcp-server"],
      "env": { "PLOTTED_API_KEY": "plt_live_***" }
    }
  }
}
Step 02

Restart Cursor, then ask in chat

Example: "Take the addresses in selected.csv, call Plotted's /v1/match for each, and add the owner_name + phone columns." Cursor handles the rest.

Step 03

Codex, Antigravity, Windsurf, VS Code & every other MCP client

Same server everywhere — point the tool at @plotted/mcp-server. Config locations per platform:

  • Antigravity (IDE & CLI) — ~/.gemini/config/mcp_config.json (same mcpServers JSON as above), or IDE agent panel ··· → Manage MCP Servers → View raw config
  • Windsurf~/.codeium/windsurf/mcp_config.json (same JSON)
  • VS Code (Copilot agent mode) — .vscode/mcp.json under a "servers" key
  • Continue, Zed, Cline, Roo Code — same mcpServers JSON
  • OpenAI Codex — TOML, shown below
~/.codex/config.tomltoml
[mcp_servers.plotted]
command = "npx"
args = ["-y", "@plotted/mcp-server"]

[mcp_servers.plotted.env]
PLOTTED_API_KEY = "plt_live_***"

Or one command: codex mcp add plotted --env PLOTTED_API_KEY=plt_live_*** -- npx -y @plotted/mcp-server

OpenAPI 3.1 — works with anything

If your AI tooling doesn't have a dedicated integration above, point it at our OpenAPI spec. Most agent frameworks (LangChain, LlamaIndex, AutoGPT, CrewAI, Pydantic AI, etc.) consume OpenAPI as a first-class input.

URL

OpenAPI 3.1 spec

url
https://plotted.to/openapi.json

Auto-imports all 24 operations, request/response schemas, error envelopes, and the auth scheme (Bearer token).

Examples

LangChain

pythonpython
from langchain_community.tools.openapi.utils.openapi_utils import OpenAPISpec
from langchain_community.agent_toolkits.openapi.toolkit import RequestsToolkit
from langchain_community.utilities.requests import RequestsWrapper

spec = OpenAPISpec.from_url("https://plotted.to/openapi.json")
toolkit = RequestsToolkit(
    requests_wrapper=RequestsWrapper(headers={"Authorization": "Bearer " + KEY}),
    spec=spec,
)
agent.tools.extend(toolkit.get_tools())

LlamaIndex

pythonpython
from llama_index.tools.openapi import OpenAPIToolSpec

spec = OpenAPIToolSpec(
    url="https://plotted.to/openapi.json",
    auth_headers={"Authorization": "Bearer " + KEY},
)
tools = spec.to_tool_list()

Direct curl from any prompt-engineering harness

curlshell
curl https://api.plotted.to/v1/parcels/nearby \
  -G -d "lat=26.142&lon=-81.795&radius_mi=1&is_trust=true" \
  -H "Authorization: Bearer $KEY"

Built for agentic workflows from day one.

Not just an API. Every design choice was made for AI agents reading and reasoning over the response.

Stable row_id primary key

Every parcel has a permanent integer ID. Agents can cite, deep-link, and re-fetch records across sessions without ambiguity.

Cost & remaining credits in every response

meta.credits_used and meta.credits_remaining on every call. The agent can plan a budget and back off when it's running low.

Stable, machine-friendly errors

Error responses carry a stable code string (insufficient_credits, rate_limited). Agents can branch on them, no string parsing.

Bulk endpoints that scale

POST 10,000 addresses to /v1/match in one call. Lets the agent enrich a whole spreadsheet in one tool call instead of 10K.

Paginated, indexed lookups

Endpoints are indexed for the common patterns and cursor-paginated, so an agent pulls just the page it needs instead of scanning 150M rows.

Free /v1/health

No auth, no credits. Agents can verify the integration without burning a credit on every check.