King County Permit Status
MCP serverDev toolsLets your agent look up permit history and status for any King County, WA address or parcel.
No key or account is asked for. Not verified by us yet: Ahel has not run a call through it.
Then ask your AI: use the king county permit status tool from King County Permit Status
Details
Available today. Use it as a step in a pipeline you build, or from your connected AI.
No key or account is asked for. Not verified by us yet: Ahel has not run a call through it.
Add it as a step in a pipeline you build on Ahel, or connect Ahel to Claude, ChatGPT, Cursor, Claude Code or Codex and ask your AI to use it.
About this server
Live permit history + status for any King County, WA address, parcel or permit number. Read-only.
Install King County Permit Status
The serverβs own address, for the clients that take one directly. Or connect Ahel once and every client you use reads it from one address, with the account kept on Ahel rather than in each clientβs config.
Claude Code
claude mcp add --transport http --scope user king-county-permit-status 'https://permits-api.secondlandings.ai/mcp'Run it once in your project, then open /mcp to approve any sign-in the server asks for.
Claude Desktop
https://permits-api.secondlandings.ai/mcpAdd a custom connector in Settings, paste this address, and approve the sign-in.
Cursor
cursor://anysphere.cursor-deeplink/mcp/install?name=king-county-permit-status&config=eyJ1cmwiOiJodHRwczovL3Blcm1pdHMtYXBpLnNlY29uZGxhbmRpbmdzLmFpL21jcCJ9Open the link and Cursor adds the server at that address.
ChatGPT
https://permits-api.secondlandings.ai/mcpIn Settings, enable Developer mode, create an MCP app, and paste this address. Your plan and workspace must allow custom apps.
Codex
codex mcp add king-county-permit-status --url 'https://permits-api.secondlandings.ai/mcp'Run it once, then sign in with codex mcp login king-county-permit-status if the server asks for an account.
From the project's README
As published by chaoz23/king-county-permit-status in README.md.
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
Hosted API + MCP (no install)
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).
What you get
{
"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).
Multi-jurisdiction coverage
| 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+) |
Coverage scorecard
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.
Exit codes
| Code | Action | Meaning |
|---|---|---|
| 0 | found | permits[] is populated |
| 1 | none / refine | No permits or connection issue |
| 2 | reject | Bad input |
For agents
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 packet
Requirements
- Python 3.10+ (stdlib only, no dependencies)
- Network access to
permitsearch.mybuildingpermit.com,services1.arcgis.com,permitting.rentonwa.gov,secure.lni.wa.gov
Development
Run the network-free regression suite with:
python3 -m unittest discover -s tests -v
License
MIT
Tools it offers (1)
What this server listed when Ahel dialed its public endpoint in Oct 2026, with no key and no account of yours. The names are the serverβs own.
king_county_permit_status
Signals
- GitHub stars
- 1
- Last commit
- Oct 2026
Advanced
- Delivery
- king-county-permit-status MCP server β your Ahel connector (mcp.ahel.ai) β your AI.
- Item type
- mcp-server
- Key
io-github-chaoz23-king-county-permit-status- Source
- github.com/chaoz23/king-county-permit-status
- Hosted endpoint
https://permits-api.secondlandings.ai/mcp
github.com/chaoz23/king-county-permit-status
More in Dev tools
MCP server Β· airtreks
More in Dev toolsworld-data-statistics
MCP server Β· adarsh4052
More in Dev toolsdraw.io
MCP server Β· jgraph
More in Dev tools0nMCP
MCP server Β· 0nork
More in Dev toolssportwizzard
MCP server Β· adamruehle
More in Dev toolskorean-law-mcp
MCP server Β· chrisryugj
More in Dev tools