zip-county-mcp
ZIP-County Crosswalk MCP
Documentation
ZIP↔County Crosswalk MCP Server
A Model Context Protocol (MCP) server that lets Claude look up ZIP-to-county
and county-to-ZIP relationships, using HUD's official USPS ZIP Code
Crosswalk API — including residential-address overlap filtering, since ZIP
codes routinely cross county lines.
Architecture
flowchart LR
Claude -->|MCP tool call| Server[zip-county-mcp server]
Server -->|overlap ratios| HUD[HUD USPS Crosswalk API]
Server -->|county names| BQ[(BigQuery:\ngeo_us_boundaries)]Why this exists
ZIP codes and counties don't line up cleanly — a single ZIP can spread
across several counties, each holding a different share of that ZIP's
residential addresses. Most simple ZIP↔county lookups ignore this and just
return one answer, which is often wrong for the county holding a small
sliver of the ZIP. This server exposes HUD's real overlap-ratio data so a
caller can filter out negligible slivers via a `min_overlap_pct` threshold,
and get accurate county names via a BigQuery public dataset.
Example: ZIP `77494` (Katy, TX) is actually split across three counties —
Fort Bend (83.4%), Harris (16.5%), and Waller (0.17%). A caller who only
wants counties that meaningfully make up that ZIP can set
`min_overlap_pct=5` and get back just Fort Bend and Harris.
How overlap is actually measured
The overlap percentage comes straight from HUD's `res_ratio` field, and
it's worth being precise about what that field is (verified against
not assumed):
- It's a ratio of residential addresses, not population/headcount. A
single-person address and a five-person address both count as "1" toward
the ratio — addresses are a reasonable proxy for population, but not
the same measurement.
- The denominator flips with query direction. For `zip_to_county`
(HUD `type=2`), `res_ratio` is addresses-in-this-county ÷
addresses-in-the-whole-ZIP. For `zips_in_county` (HUD `type=7`, the
reverse lookup), it's addresses-in-this-ZIP ÷ addresses-in-**the-whole-
county**. Same field name, different denominator — which is why a
populous county like Harris shows dozens of ZIPs at only 1-3% each,
while a single ZIP can show one county at 80%+: the two percentages
aren't measuring against the same total.
Status
All three tools are implemented, tested (7 passing tests, `pytest`), and
verified end-to-end against live HUD + BigQuery data and a real Claude
Desktop connection.
Setup
1. Get a free HUD API account and Bearer token at
2. Confirm you have BigQuery access to `bigquery-public-data.geo_us_boundaries`
(e.g. via `gcloud auth application-default login`).
3. Copy `.env.example` to `.env` and fill in `HUD_API_TOKEN` and your Google
Cloud project.
4. Create a virtualenv with Python 3.10+ (the `mcp` package requires it —
on macOS the system `python3` is often older, so check `python3 --version`
first) and install dependencies:
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt5. Run it: `.venv/bin/python3 server.py`
Connecting to Claude Desktop
Add an entry to your `claude_desktop_config.json` (macOS:
`~/Library/Application Support/Claude/claude_desktop_config.json`):
"mcpServers": {
"zip-county-mcp": {
"command": "/absolute/path/to/zip-county-mcp/.venv/bin/python3",
"args": ["/absolute/path/to/zip-county-mcp/server.py"]
}
}Fully quit and reopen Claude Desktop (MCP servers only load at startup), then
try one of the questions below.
Example usage
Once connected, just ask Claude in plain English — it picks the right tool
and arguments on its own. A few real examples (verified against live data):
Look up a single ZIP:
> "What county is ZIP 77002 in?"
Claude calls `zip_to_county("77002")` → ZIP 77002 (Houston, TX) is entirely
in Harris County, TX (FIPS 48201) — 100% overlap.
A ZIP that crosses county lines:
> "What counties does ZIP 77494 overlap, and by how much?"
Claude calls `zip_to_county("77494")` → three counties: Fort Bend (83.4%),
Harris (16.5%), Waller (0.17%). Ask a follow-up like *"only ones with at
least 5%"* and it re-calls with `min_overlap_pct=5`, dropping Waller's
negligible sliver.
Reverse lookup — ZIPs inside a county:
> "What ZIP codes are in Harris County, Texas?" (or give it the FIPS code,
> 48201, directly)
Claude calls `zips_in_county("48201")` → a list of every ZIP holding a
meaningful share of Harris County's residential addresses, sorted by
overlap.
A list of ZIP codes at once:
> "What counties are ZIP codes 77002, 77494, and 10001 each in?"
Claude calls `batch_zip_to_county(["77002", "77494", "10001"])` → one
result per ZIP in a single response, without querying BigQuery once per
ZIP behind the scenes.
Tools (v1 scope)
- `zip_to_county(zip_code, min_overlap_pct=0)` — county/counties for a ZIP, with % overlap
- `zips_in_county(county_fips, min_overlap_pct=0)` — ZIP codes in a county, with % overlap
- `batch_zip_to_county(zip_codes, min_overlap_pct=0)` — same as above, multiple ZIPs at once
Out of scope for v1: census tract-level lookups, CBSA/congressional district
crosswalks, caching layer, other geography types.
Testing
.venv/bin/pip install -r requirements.txt
.venv/bin/python3 -m pytest tests/ -vTests mock HUD's API responses (`httpx.MockTransport`) and the BigQuery
name lookup, so they run in about a second with no live token or BigQuery
access required.
Frequently asked questions
What is zip-county-mcp?
zip-county-mcp is ZIP-County Crosswalk MCP
How do I install zip-county-mcp?
Open the GitHub repository and follow its README. Most MCP servers are added to your client's MCP config, then called by your agent.
Is zip-county-mcp open source?
Yes — it is hosted on GitHub at https://github.com/imelendez/zip-county-mcp.
Related MCP tools
Cognee is the open-source AI memory platform for agents. Give your AI agents persistent long-term memory across sessions with a self-hosted knowledge graph engine.
Automate browser based workflows with AI
Hindsight: Agent Memory That Learns
A privacy-first app that strips AI watermarks from content you own.
Agent framework and applications built upon Qwen>=3.0, featuring Function Calling, MCP, Code Interpreter, RAG, Chrome extension, etc.
The power of Claude Code / GeminiCLI / CodexCLI + [Gemini / OpenAI / OpenRouter / Azure / Grok / Ollama / Custom Model / All Of The Above] working as one.
Run your own MCP server? See who uses it and what to fix.
Measure it with TrackMCP