AddressIntel MCP
# AddressIntel MCP server
A read-only [Model Context Protocol](https://modelcontextprotocol.io) server that puts
SF Peninsula building-permit and parcel-buildability data inside Claude, ChatGPT, or any
other MCP-capable agent.
It is a thin client over the public AddressIntel API, so it inherits that API's auth,
rate limits and tier ceilings. Every tool is a `GET`. Nothing here can write.
## Tools
| Tool | What it answers |
|---|---|
| `search_permits` | What construction has actually been permitted at an address or in a city? Filters on city, keyword (address, project type, scope description, contractor, architect, permit number) and minimum valuation. |
| `list_sb9_inventory` | Which active listings can be split or duplexed under SB 9, and what blocks the ones that can't? |
| `list_adu_leads` | Which parcels have room for an ADU, and how many units / how much square footage? |
| `list_redevelopment_leads` | Which parcels are underbuilt against their allowable envelope (scrape-and-rebuild or expansion)? |
| `list_market_signals` | Which listings score highest for teardown or flip potential? |
| `get_property_intelligence` | Full scores and comparable sales for one property id. |
The permit and parcel tools are the differentiated half: permit-level detail and
parcel-level buildability for the Peninsula, rather than a nationwide owner list.
## Install
No install step: `npx` fetches it on demand.
### Claude Code
```bash
claude mcp add addressintel \
-e ADDRESSINTEL_API_KEY=your_key \
-- npx -y addressintel-mcp
```
### Claude Desktop
Add to `claude_desktop_config.json`:
```json
{
"mcpServers": {
"addressintel": {
"command": "npx",
"args": ["-y", "addressintel-mcp"],
"env": {
"ADDRESSINTEL_API_KEY": "your_key"
}
}
}
}
```
### From source
For working on the server itself:
```bash
git clone https://github.com/RantumBits/addressintel-mcp.git
cd addressintel-mcp
npm install
npm run build # emits dist/index.js
```
Then point the client at `node /absolute/path/to/addressintel-mcp/dist/index.js` instead of
the `npx` command above.
Restart the client, then ask it something like *"what demolition permits were issued in
Menlo Park this year?"* or *"which Palo Alto listings are SB 9 eligible?"*
## Configuration
| Variable | Default | Notes |
|---|---|---|
| `ADDRESSINTEL_API_KEY` | `demo` | Without a key the server uses the public demo tier: 10 requests/minute, 5 rows per call. Grab a free key at https://addressintel.co/developers for 30/min and 25 rows; the key is emailed to the address you enter. |
| `ADDRESSINTEL_API_BASE` | `https://addressintel.co/api` | Point at a local dev server (`http://localhost:3000/api`) when working on the API. |
## Development
```bash
npm run dev # run from source over stdio
node test_mcp.mjs # smoke test: connect, list tools, call one
```
Tools are declared in one table in `src/index.ts`. Each entry carries its zod schema and
its advertised JSON Schema side by side, so adding a tool means adding one entry, and the
two shapes cannot drift apart.
TDQS
Scored across 6 tools
Most tools have clearly distinct purposes: search_permits is unique, and the four list_* tools each target different criteria (SB9, ADU, redevelopment, market signals). However, list_redevelopment_leads and list_market_signals could overlap in identifying teardowns, and all list tools produce property leads, so there is minor potential for confusion.
Tool names follow a verb_noun pattern with snake_case, which is consistent. The primary deviation is the verb set: search, list (four times), and get. This is a minor inconsistency because most tools use 'list' but search_permits and get_property_intelligence use different verbs.
Six tools is well within the ideal 3-15 range. Each tool serves a distinct function in the real estate lead generation domain, and the count feels neither bloated nor sparse.
The core workflow is covered: search permits, generate multiple types of leads, and get detailed intelligence—though get_property_intelligence only takes ids from list_market_signals, leaving other lead lists without a deep-dive follow-up. Minor gaps like no general address lookup or update/delete operations are acceptable for a read-only intel server.