King County Permit Status

io.github.chaoz23v1.0.0更新於 Oct 9, 2026

Live permit history + status for any King County, WA address, parcel or permit number. Read-only.

已驗證Streamable HTTP可網頁執行Location & LifestyleData & Analytics

概覽

AI 產生的概覽

查詢華盛頓州金郡地址、地號或許可證編號的建築許可歷史與即時狀態。

功能
提供一個唯讀工具 king_county_permit_status,接受街道地址、10 位地號或許可證編號,回傳符合的許可證類型、狀態、日期、管轄區與入口網站連結。地址會先進行地理編碼,並依城市界線幾何而非郵寄城市進行路由;地號查詢會檢索所有支援的來源。結果包含可信度等級、已檢索的管轄區,以及沒有即時資料來源時指向市政入口網站的 next_step 備援資訊。
適用情境
當助理需要查詢金郡特定房產的許可證歷史或目前狀態時適用,例如盡職調查、翻修規劃或承包商背景查核。39 個城市中有 20 個以及金郡非建制地區提供即時資料;其餘城市僅回傳評估官索引的已核發許可歷史,不含狀態。
執行需求
遠端 Streamable HTTP 端點 permits-api.secondlandings.ai;未宣告需要身分驗證、API 金鑰或環境變數。若改在本地執行查詢,則需要 Python 3.10+(僅標準函式庫)以及連線各市政許可資料來源的網路存取。
安裝前請注意
僅執行唯讀查詢,不涉及寫入、付款或憑證。查詢結果快取 15 分鐘,並依用戶端限速每分鐘 30 次。結果可能不完整或退回手動入口網站連結;Des Moines、Milton 與 Tukwila 的電氣許可證缺漏。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 King County Permit Status,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "king-county-permit-status": {
      "type": "http",
      "url": "https://permits-api.secondlandings.ai/mcp"
    }
  }
}

README

King County Permit Status

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.

bash
python3 lookup.py "27927 E Main St"           # by addresspython3 lookup.py "7222000353"                  # by parcel numberpython3 lookup.py "B25000947"                   # by permit numberpython3 lookup.py "23-127651-LP"                # Bellevue permit numberpython3 lookup.py "6145915-CN"                  # Seattle SDCI permit numberpython3 lookup.py --pipe "27927 E Main St"      # agent pipeline modepython3 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
RESTGET 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

json
{  "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)"}
FieldDescription
actionfound (permits returned), none (no matches), refine (connection issue)
permit_countNumber of unique permits found
permitsArray sorted newest applied_date first
searchedWhich jurisdictions were searched
separate_portalIf the city has an unsupported portal: city name + URL + prose note
next_stepStructured 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
errorsSource errors when a search is incomplete; may accompany permits from successful sources
trust_levellive (every applicable source answered), partial (a source errored or a portal needs manual follow-up), fallback (nothing searchable)
fetched_atUTC timestamp of the query — records are live, never cached
parcel_idCounty-namespaced parcel, e.g. king:7222000353 or pierce:5985002900, when the query was or resolved to a parcel
jurisdictionWhere 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_resolutionHow 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_asOne-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

SourceCities / scope
MyBuildingPermit.comAuburn, 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 indexIssued-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&IElectrical 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

CityStatusSourceHealthBuildingElectricalMech/PlumbLand Use
Algona🟠 IndexedKC Assessor index✅🗂️ index➖ L&I🗂️ index🗂️ index
Auburn🟢 LiveMyBuildingPermit✅✅➖ L&I✅✅
Beaux Arts Village🟠 IndexedKC Assessor index✅🗂️ index➖ L&I🗂️ index🗂️ index
Bellevue🟢 LiveBellevue (Open Data)✅✅✅✅✅
Black Diamond🟠 IndexedKC Assessor index✅🗂️ index➖ L&I🗂️ index🗂️ index
Bothell🟢 LiveMyBuildingPermit✅✅➖ L&I✅✅
Burien🟢 LiveMyBuildingPermit✅✅✅✅✅
Carnation🟢 LiveCarnation (SmartGov)✅✅➖ L&I✅✅
Clyde Hill🟠 IndexedKC Assessor index✅🗂️ index➖ L&I🗂️ index🗂️ index
Covington🟠 IndexedKC Assessor index✅🗂️ index➖ L&I🗂️ index🗂️ index
Des Moines🟠 IndexedKC Assessor index✅🗂️ index⚠️ gap🗂️ index🗂️ index
Duvall🟠 IndexedKC Assessor index✅🗂️ index➖ L&I🗂️ index🗂️ index
Enumclaw🟠 IndexedKC Assessor index✅🗂️ index➖ L&I🗂️ index🗂️ index
Federal Way🟢 LiveMyBuildingPermit✅✅✅✅✅
Hunts Point🟠 IndexedKC Assessor index✅🗂️ index➖ L&I🗂️ index🗂️ index
Issaquah🟢 LiveMyBuildingPermit✅✅➖ L&I✅✅
Kenmore🟢 LiveMyBuildingPermit✅✅➖ L&I✅✅
Kent🟠 IndexedKC Assessor index✅🗂️ index➖ L&I🗂️ index🗂️ index
Kirkland🟢 LiveMyBuildingPermit✅✅✅✅✅
Lake Forest Park🟠 IndexedKC Assessor index✅🗂️ index➖ L&I🗂️ index🗂️ index
Maple Valley🟠 IndexedKC Assessor index✅🗂️ index➖ L&I🗂️ index🗂️ index
Medina🟠 IndexedKC Assessor index✅🗂️ index➖ L&I🗂️ index🗂️ index
Mercer Island🟢 LiveMyBuildingPermit✅✅✅✅✅
Milton🟠 IndexedKC Assessor index✅🗂️ index⚠️ gap🗂️ index🗂️ index
Newcastle🟢 LiveMyBuildingPermit✅✅➖ L&I✅✅
Normandy Park🟢 LiveNormandy Park (SmartGov)✅✅✅✅✅
North Bend🟠 IndexedKC Assessor index✅🗂️ index➖ L&I🗂️ index🗂️ index
Pacific🟠 IndexedKC Assessor index✅🗂️ index➖ L&I🗂️ index🗂️ index
Redmond🟢 LiveRedmond (EnerGov Civic Access)✅✅✅✅✅
Renton🟢 LiveRenton (EnerGov)✅✅✅✅✅
Sammamish🟢 LiveMyBuildingPermit✅✅✅✅✅
SeaTac🟢 LiveSeaTac (LAMA)✅✅✅✅✅
Seattle🟢 LiveSeattle (SDCI Open Data)✅✅✅✅✅
Shoreline🟢 LiveShoreline (eTRAKiT)✅✅➖ L&I✅✅
Skykomish🟠 IndexedKC Assessor index✅🗂️ index➖ L&I🗂️ index🗂️ index
Snoqualmie🟢 LiveMyBuildingPermit✅✅➖ L&I✅✅
Tukwila🟠 IndexedKC Assessor index✅🗂️ index⚠️ gap🗂️ index🗂️ index
Woodinville🟢 LiveWoodinville (Accela)✅✅➖ L&I✅✅
Yarrow Point🟠 IndexedKC Assessor index✅🗂️ index➖ L&I🗂️ index🗂️ index
King County (unincorp.)🟢 LiveMyBuildingPermit (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

CodeActionMeaning
0foundpermits[] is populated
1none / refineNo permits or connection issue
2rejectBad 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:

bash
python3 lookup.py --schema
json
{  "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:

bash
# Get all permits at an address, extract open onespython3 lookup.py --pipe "1817 Morris Ave S, Renton WA" \  | python3 -c "import sys, jsond = 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:

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:

bash
python3 -m unittest discover -s tests -v

License

MIT

來源:README.md,提交 9daf7e3

工具

0
工具後設資料尚未被收錄。

版本歷史

1
  1. v1.0.0最新Oct 9, 2026