Live permit history + status for any King County, WA address, parcel or permit number. Read-only.
One address for any MCP client. No sign-in needed on this server.
1 other
Grouped by tool name. At most: only reads or looks up information.
Odel charges nothing per call. The publisher may charge for its own service.
Look up building permit history and status across King County, WA jurisdictions — county-level permits (septic, critical areas, grading) and city-level permits (building, mechanical, electrical) can all apply to the same address. Coverage is live where a jurisdiction offers an open permit feed, and falls back to the correct municipal portal link everywhere else.
Coverage today: 🟢 20/39 cities live (status + history) · 🟠 19/39 indexed (issued-permit history from the King County Assessor; current status needs the city portal, which next_step names) · plus unincorporated King County. See the coverage scorecard below for the per-city breakdown.
python3 lookup.py "27927 E Main St" # by address
python3 lookup.py "7222000353" # by parcel number
python3 lookup.py "B25000947" # by permit number
python3 lookup.py "23-127651-LP" # Bellevue permit number
python3 lookup.py "6145915-CN" # Seattle SDCI permit number
python3 lookup.py --pipe "27927 E Main St" # agent pipeline mode
python3 lookup.py --schema # print tool definition
The same lookup is served read-only, no auth, from permits-api.secondlandings.ai
(server.py, zero dependencies; see deploy/README.md):
| MCP (Streamable HTTP) | POST https://permits-api.secondlandings.ai/mcp — tool king_county_permit_status, arg query |
| REST | GET https://permits-api.secondlandings.ai/api/lookup?q=1817+Morris+Ave+S,+Renton+WA |
| OpenAPI 3.1 (typed) | /openapi.json · agent orientation /llms.txt · CLI definition /tool.json · /healthz |
Results are live; the server caches each query for 15 minutes and rate-limits
per client (30/min) to protect the municipal portals. Run it yourself with
python3 server.py or docker compose up — server.json is the MCP Registry manifest.
Parcel-number searches query every supported MyBuildingPermit and live city portal because a bare parcel number does not identify its city jurisdiction.
Address searches are routed by geometry, not the mailing city: the address
is geocoded with King County's four-county locator and the point is tested
against the city-limits polygons. A "Kent, WA" address that sits in
unincorporated King County is searched as county, not Kent; an address with no
city in it is routed correctly instead of fanning out to every jurisdiction; and
Pierce-side addresses of Milton/Pacific/Auburn get a pierce: parcel id. The
mailing city is only used when geocoding fails (jurisdiction.basis says which).
{
"action": "found",
"permit_count": 2,
"searched": ["Renton (EnerGov)"],
"permits": [
{
"permit_number": "E26000458",
"type": "Residential Electrical Permit",
"status": "Issued",
"description": "Electrical Work (Garage & Garage Exterior): ...",
"address": "1817 Morris Ave S Renton WA 98055",
"jurisdiction": "Renton",
"applied_date": "2026-01-28",
"issued_date": "2026-01-28",
"finaled_date": null,
"expires_date": "2027-07-27",
"portal": "https://permitting.rentonwa.gov",
"record_url": null,
"is_open": true
}
],
"trust_level": "live",
"fetched_at": "2026-10-08T19:02:11+00:00",
"parcel_id": "king:7222000353",
"cite_as": "King County Permit Status (github.com/chaoz23/king-county-permit-status), queried 2026-10-08 via Renton (EnerGov)"
}
| Field | Description |
|---|---|
action | found (permits returned), none (no matches), refine (connection issue) |
permit_count | Number of unique permits found |
permits | Array sorted newest applied_date first |
searched | Which jurisdictions were searched |
separate_portal | If the city has an unsupported portal: city name + URL + prose note |
next_step | Structured twin of separate_portal for agents: kind: manual_portal_search, reason (no_feed / electrical_only / parcel_resolution_failed / source_incomplete), portal_url (the portal's actual search page when known — PermitTrax, LAMA, OpenGov, Kent), vendor, search_by (inputs that page accepts; empty when login-gated), query, query_type, covers_electrical, hint |
errors | Source errors when a search is incomplete; may accompany permits from successful sources |
trust_level | live (every applicable source answered), partial (a source errored or a portal needs manual follow-up), fallback (nothing searchable) |
fetched_at | UTC timestamp of the query — records are live, never cached |
parcel_id | County-namespaced parcel, e.g. king:7222000353 or pierce:5985002900, when the query was or resolved to a parcel |
jurisdiction | Where the query was routed and why: city, basis (city-limits = the geocoded point falls inside that city's polygon — authoritative; geocoder-city; address-text = the mailing city in the query, used only when geocoding fails), county, unincorporated (true → county permits only, even if the mailing city says "Kent") |
address_resolution | How well the geocoder matched an address: matched_address, score, match_type (point = exact address point; interpolated = number placed along the street, no parcel; street), partial_match, street_number_snapped |
cite_as | One-line attribution string for generated text |
Per permit: permit_number, type, status, is_open (normalized across vendor status vocabularies; null when the source exposes no status), description, address, jurisdiction, applied_date, issued_date, finaled_date, expires_date, portal, record_url (the specific record's URL when the source exposes one).
| Source | Cities / scope |
|---|---|
| MyBuildingPermit.com | Auburn, Bellevue, Bothell, Burien, Edmonds, Federal Way, Issaquah, Kenmore, King County (unincorporated), Kirkland, Mercer Island, Mill Creek, Newcastle, Sammamish, Snoqualmie |
| Bellevue Open Data (live ArcGIS API) | Daily Bellevue permit snapshot (1998+) for address, parcel, and permit-number searches |
| Seattle Open Data (live Socrata APIs) | Building, electrical, trade, and land-use permits for Seattle address and permit-number searches |
| Renton EnerGov (live API) | All Renton permit types including electrical |
| Redmond EnerGov Civic Access (live API) | All Redmond permit types including electrical, for address, parcel, and permit-number searches |
| Accela Citizen Access (live) | Woodinville, and King County's own agency for unincorporated addresses (older history, enforcement and electrical records that MyBuildingPermit lacks), for address, parcel, and permit-number searches |
| SmartGov (live) | Normandy Park and Carnation, for address, parcel, and permit-number searches |
| King County Assessor parcel index | Issued-permit history (number, type, description, issue date, value, issuing city) for every King County parcel — the only source for the 19 cities without a public portal. It is what cities report for valuation: building/remodel/addition permits (some electrical), dense since ~2023 and thin before, back to the late 1990s; never trade sub-permits or inspections, and no status. Address queries use the geocoded parcel, parcel queries use it directly |
| LAMA (live) | SeaTac, for address and permit-number searches (incl. SeaTac's self-run electrical; parcel search not offered by the portal; capped at 200 newest per query) |
| Shoreline eTRAKiT (live) | Building, mechanical/plumbing, and land-use permits for Shoreline address, parcel, and permit-number searches (status/description not exposed by the portal's search) |
| WA State L&I | Electrical permits for cities not handling their own (2020+) |
Auto-generated from routing_data.json (python3 scripts/gen_scorecard.py --write). One row per King County city.
Legend — ✅ live (status + history) · 🗂️ index (valuation-reported building history from the King County Assessor's parcel index — no status, no sub-permits, dense since ~2023) · ➖ L&I electrical only (2020+) · ⚠️ gap (city self-runs electrical, not yet integrated)
Health = last weekly live probe of the city's source (scripts/source_health.py, 2026-10-09): ✅ answered with records · ⚪ answered, zero rows for a known-good query · ⛔ blocked (403) · ❌ down · ❔ unchecked · — no live source
| City | Status | Source | Health | Building | Electrical | Mech/Plumb | Land Use |
|---|---|---|---|---|---|---|---|
| Algona | 🟠 Indexed | KC Assessor index | ✅ | 🗂️ index | ➖ L&I | 🗂️ index | 🗂️ index |
| Auburn | 🟢 Live | MyBuildingPermit | ✅ | ✅ | ➖ L&I | ✅ | ✅ |
| Beaux Arts Village | 🟠 Indexed | KC Assessor index | ✅ | 🗂️ index | ➖ L&I | 🗂️ index | 🗂️ index |
| Bellevue | 🟢 Live | Bellevue (Open Data) | ✅ | ✅ | ✅ | ✅ | ✅ |
| Black Diamond | 🟠 Indexed | KC Assessor index | ✅ | 🗂️ index | ➖ L&I | 🗂️ index | 🗂️ index |
| Bothell | 🟢 Live | MyBuildingPermit | ✅ | ✅ | ➖ L&I | ✅ | ✅ |
| Burien | 🟢 Live | MyBuildingPermit | ✅ | ✅ | ✅ | ✅ | ✅ |
| Carnation | 🟢 Live | Carnation (SmartGov) | ✅ | ✅ | ➖ L&I | ✅ | ✅ |
| Clyde Hill | 🟠 Indexed | KC Assessor index | ✅ | 🗂️ index | ➖ L&I | 🗂️ index | 🗂️ index |
| Covington | 🟠 Indexed | KC Assessor index | ✅ | 🗂️ index | ➖ L&I | 🗂️ index | 🗂️ index |
| Des Moines | 🟠 Indexed | KC Assessor index | ✅ | 🗂️ index | ⚠️ gap | 🗂️ index | 🗂️ index |
| Duvall | 🟠 Indexed | KC Assessor index | ✅ | 🗂️ index | ➖ L&I | 🗂️ index | 🗂️ index |
| Enumclaw | 🟠 Indexed | KC Assessor index | ✅ | 🗂️ index | ➖ L&I | 🗂️ index | 🗂️ index |
| Federal Way | 🟢 Live | MyBuildingPermit | ✅ | ✅ | ✅ | ✅ | ✅ |
| Hunts Point | 🟠 Indexed | KC Assessor index | ✅ | 🗂️ index | ➖ L&I | 🗂️ index | 🗂️ index |
| Issaquah | 🟢 Live | MyBuildingPermit | ✅ | ✅ | ➖ L&I | ✅ | ✅ |
| Kenmore | 🟢 Live | MyBuildingPermit | ✅ | ✅ | ➖ L&I | ✅ | ✅ |
| Kent | 🟠 Indexed | KC Assessor index | ✅ | 🗂️ index | ➖ L&I | 🗂️ index | 🗂️ index |
| Kirkland | 🟢 Live | MyBuildingPermit | ✅ | ✅ | ✅ | ✅ | ✅ |
| Lake Forest Park | 🟠 Indexed | KC Assessor index | ✅ | 🗂️ index | ➖ L&I | 🗂️ index | 🗂️ index |
| Maple Valley | 🟠 Indexed | KC Assessor index | ✅ | 🗂️ index | ➖ L&I | 🗂️ index | 🗂️ index |
| Medina | 🟠 Indexed | KC Assessor index | ✅ | 🗂️ index | ➖ L&I | 🗂️ index | 🗂️ index |
| Mercer Island | 🟢 Live | MyBuildingPermit | ✅ | ✅ | ✅ | ✅ | ✅ |
| Milton | 🟠 Indexed | KC Assessor index | ✅ | 🗂️ index | ⚠️ gap | 🗂️ index | 🗂️ index |
| Newcastle | 🟢 Live | MyBuildingPermit | ✅ | ✅ | ➖ L&I | ✅ | ✅ |
| Normandy Park | 🟢 Live | Normandy Park (SmartGov) | ✅ | ✅ | ✅ | ✅ | ✅ |
| North Bend | 🟠 Indexed | KC Assessor index | ✅ | 🗂️ index | ➖ L&I | 🗂️ index | 🗂️ index |
| Pacific | 🟠 Indexed | KC Assessor index | ✅ | 🗂️ index | ➖ L&I | 🗂️ index | 🗂️ index |
| Redmond | 🟢 Live | Redmond (EnerGov Civic Access) | ✅ | ✅ | ✅ | ✅ | ✅ |
| Renton | 🟢 Live | Renton (EnerGov) | ✅ | ✅ | ✅ | ✅ | ✅ |
| Sammamish | 🟢 Live | MyBuildingPermit | ✅ | ✅ | ✅ | ✅ | ✅ |
| SeaTac | 🟢 Live | SeaTac (LAMA) | ✅ | ✅ | ✅ | ✅ | ✅ |
| Seattle | 🟢 Live | Seattle (SDCI Open Data) | ✅ | ✅ | ✅ | ✅ | ✅ |
| Shoreline | 🟢 Live | Shoreline (eTRAKiT) | ✅ | ✅ | ➖ L&I | ✅ | ✅ |
| Skykomish | 🟠 Indexed | KC Assessor index | ✅ | 🗂️ index | ➖ L&I | 🗂️ index | 🗂️ index |
| Snoqualmie | 🟢 Live | MyBuildingPermit | ✅ | ✅ | ➖ L&I | ✅ | ✅ |
| Tukwila | 🟠 Indexed | KC Assessor index | ✅ | 🗂️ index | ⚠️ gap | 🗂️ index | 🗂️ index |
| Woodinville | 🟢 Live | Woodinville (Accela) | ✅ | ✅ | ➖ L&I | ✅ | ✅ |
| Yarrow Point | 🟠 Indexed | KC Assessor index | ✅ | 🗂️ index | ➖ L&I | 🗂️ index | 🗂️ index |
| King County (unincorp.) | 🟢 Live | MyBuildingPermit (King County) + KC Accela | ✅ | ✅ | ➖ L&I | ✅ | ✅ |
Coverage: 20/39 live · 19/39 indexed (issued history via the Assessor; status needs the city portal). Plus King County (unincorporated) for county-level permits (septic, critical areas, grading).
⚠️ Electrical gaps: Des Moines, Milton, Tukwila. These cities self-run their electrical program (so L&I is skipped) and are not on MyBuildingPermit, leaving their electrical permits in no feed we search. MBP cities that self-run electrical (Burien, Federal Way, Kirkland, Mercer Island, Sammamish) are not gaps — verified 2026-07-15 that MBP carries their electrical history. Closing the remaining gaps is tracked in the coverage epic.
ℹ️ Split-county cities: Milton (mostly Pierce), Pacific and Auburn straddle the King/Pierce line. Each city issues its own permits for the whole city, so the row above applies to both sides; only county-level permits (septic, critical areas) differ — Pierce County's portal is not searched. Parcel ids are county-namespaced (
king:…) for this reason.
All 39 incorporated King County cities are recognized. Cities outside the searchable sources are flagged with their municipal portal URL rather than being treated as unincorporated King County.
For comma-separated addresses, the locality component takes precedence over
city names that also appear in streets (for example, Kent Kangley Rd, Covington). If a Renton address cannot be resolved to a parcel for its live
EnerGov search, the result retains Renton's portal as an actionable fallback.
Seattle address and exact permit-number searches query all four official SDCI
Open Data datasets; parcel-only Seattle lookup is not yet supported.
Kent's official permit-status page currently requires users to sign in to the
city portal, so Kent results include that page as a manual fallback.
| Code | Action | Meaning |
|---|---|---|
| 0 | found | permits[] is populated |
| 1 | none / refine | No permits or connection issue |
| 2 | reject | Bad input |
tool.json at the repo root contains the full tool definition in Anthropic/OpenAI tool-call format. An agent can load it directly or fetch the live version:
python3 lookup.py --schema
{
"name": "king_county_permit_status",
"description": "Look up building permit history and status for any King County, WA property...",
"input_schema": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Street address, 10-digit parcel number, or permit number..."
}
},
"required": ["query"]
},
"output_schema": { ... },
"invocation": {
"command": "python3 lookup.py --pipe \"{query}\"",
"exit_codes": {
"0": "action=found — permits[] is populated",
"1": "action=none or refine — no permits or connection issue",
"2": "action=reject — bad input"
}
}
}
Pipeline pattern:
# Get all permits at an address, extract open ones
python3 lookup.py --pipe "1817 Morris Ave S, Renton WA" \
| python3 -c "
import sys, json
d = json.load(sys.stdin)
open_statuses = {'Issued', 'In Review', 'On Hold', 'Pending'}
open_permits = [p for p in d.get('permits', []) if p['status'] in open_statuses]
print(json.dumps(open_permits, indent=2))
"
Related tools in this series:
king-county-address-to-parcel-number — resolve an address to its parcel numberwa-contractor-license — verify WA contractor license status and violationsking-county-property-tax-appeal — build a filing-ready tax appeal packetpermitsearch.mybuildingpermit.com, services1.arcgis.com, permitting.rentonwa.gov, secure.lni.wa.govRun the network-free regression suite with:
python3 -m unittest discover -s tests -v
MIT