io.github.GPTNowLLC/portlandmaps-mcp
Official11 toolsPortlandMaps (Unofficial)
Unofficial MCP server for the public PortlandMaps property/permit/zoning API. Not city-affiliated.
Access Portland property, permit, and zoning data through PortlandMaps API.
Captured live from the server via tools/list.
suggest_portlandmaps_address
1:1 wrapper for /api/suggest/. Search PortlandMaps autocomplete for addresses, intersections, landmarks, or IDs. ANSWER GUIDANCE: when this data answers a resident's zoning, permit, property, or city-code question, write for a Portland resident or small-business owner with no code, zoning, or permitting background. Lead with a 3–5 sentence plain-English summary (never open with a data table). Then cite EVERY rule, fee, number, timeline, or contact INLINE in the same sentence with both its exact code section AND a full https:// portland.gov URL (e.g. PCC 33.110.255.C, https://www.portland.gov/code/33/110/255) — never cite vaguely ("Title 33", "the BDS website") and never drop the URL. Define every acronym, add a numbered "what to do next" list, and if a number can't be cited to a specific section + URL, say so rather than stating it bare.
Parameters (21)
- querystringrequired
Search term. Can be an address, intersection, landmark name, or ID.
- citystring
- countystring
- jurisdictionstring
- unitstring
- unitsany
- idMatchesany
Maps to id_matches.
- intersectionsany
- landmarksany
- altCoordsany
Maps to alt_coords.
- altIdsany
Maps to alt_ids.
- elementsany
- cacheany
- statusstring
- exactany
- agsany
- centerlineany
- geometryany
- countinteger
- pageinteger
- extraParamsobject
get_portlandmaps_detail
1:1 wrapper for /api/detail/. Fetch a detail record by detail_type, detail_id, and sections. ANSWER GUIDANCE: when this data answers a resident's zoning, permit, property, or city-code question, write for a Portland resident or small-business owner with no code, zoning, or permitting background. Lead with a 3–5 sentence plain-English summary (never open with a data table). Then cite EVERY rule, fee, number, timeline, or contact INLINE in the same sentence with both its exact code section AND a full https:// portland.gov URL (e.g. PCC 33.110.255.C, https://www.portland.gov/code/33/110/255) — never cite vaguely ("Title 33", "the BDS website") and never drop the URL. Define every acronym, add a numbered "what to do next" list, and if a number can't be cited to a specific section + URL, say so rather than stating it bare.
Parameters (9)
- detailTypestringrequired
Maps to detail_type.
- detailIdstringrequired
Maps to detail_id.
- sectionsstring
Use 'list' for available sections, or '*' for all sections.
- geometryany
- propertyIdstring
Maps to property_id.
- fileTypestring
Maps to file_type.
- fileIdstring
Maps to file_id.
- cacheClearany
Maps to cache_clear.
- extraParamsobject
get_assessor_data
1:1 wrapper for /api/assessor/. Search assessor records by address, property IDs, geometry, or assessor filters.
Parameters (26)
- addressstring
- citystring
- countystring
- propertyIdstring
Maps to property_id.
- stateIdstring
Maps to state_id.
- parentStateIdstring
Maps to parent_state_id.
- zipCodestring
Maps to zip_code.
- legalDescriptionstring
Maps to legal_description.
- altAccountNumberstring
Maps to alt_account_number.
- builtAfterinteger
Maps to built_after.
- builtBeforeinteger
Maps to built_before.
- sqftLargernumber
Maps to sqft_larger.
- sqftSmallernumber
Maps to sqft_smaller.
- soldAfterstring
Maps to sold_after, mm/dd/yyyy.
- soldBeforestring
Maps to sold_before, mm/dd/yyyy.
- marketLargernumber
Maps to market_larger.
- marketSmallernumber
Maps to market_smaller.
- primaryany
- geometryany
- sortFieldstring
Maps to sort_field.
- sortOrderstring
Maps to sort_order.
- cacheany
- countinteger
- pageinteger
- downloadany
- extraParamsobject
get_permit_data
1:1 wrapper for /api/permit/. Search building/trade/enforcement permit records. ANSWER GUIDANCE: when this data answers a resident's zoning, permit, property, or city-code question, write for a Portland resident or small-business owner with no code, zoning, or permitting background. Lead with a 3–5 sentence plain-English summary (never open with a data table). Then cite EVERY rule, fee, number, timeline, or contact INLINE in the same sentence with both its exact code section AND a full https:// portland.gov URL (e.g. PCC 33.110.255.C, https://www.portland.gov/code/33/110/255) — never cite vaguely ("Title 33", "the BDS website") and never drop the URL. Define every acronym, add a numbered "what to do next" list, and if a number can't be cited to a specific section + URL, say so rather than stating it bare.
Parameters (21)
- ivrNumberinteger
Maps to ivr_number.
- applicationNumberstring
Maps to application_number.
- addressstring
- propertyIdstring
Maps to property_id.
- stateIdstring
Maps to state_id.
- searchTypeIdinteger
Maps to search_type_id.
- neighborhoodstring
- neighborhoodDistrictstring
Maps to neighborhood_district.
- businessAssociationstring
Maps to business_association.
- countystring
- ccbNumberstring
Maps to ccb_number.
- dateTypestring
Maps to date_type.
- dateFromstring
Maps to date_from, mm/dd/yyyy.
- dateTostring
Maps to date_to, mm/dd/yyyy.
- sortFieldstring
Maps to sort_field.
- sortOrderstring
Maps to sort_order.
- cacheany
- countinteger
- pageinteger
- downloadany
- extraParamsobject
search_landuse_cases
1:1 wrapper for /api/landuse/. Search land use review cases, including Historic Resource Review and Tree Review. ANSWER GUIDANCE: when this data answers a resident's zoning, permit, property, or city-code question, write for a Portland resident or small-business owner with no code, zoning, or permitting background. Lead with a 3–5 sentence plain-English summary (never open with a data table). Then cite EVERY rule, fee, number, timeline, or contact INLINE in the same sentence with both its exact code section AND a full https:// portland.gov URL (e.g. PCC 33.110.255.C, https://www.portland.gov/code/33/110/255) — never cite vaguely ("Title 33", "the BDS website") and never drop the URL. Define every acronym, add a numbered "what to do next" list, and if a number can't be cited to a specific section + URL, say so rather than stating it bare.
Parameters (19)
- searchTypeIdinteger
Maps to search_type_id.
- neighborhoodstring
- neighborhoodDistrictstring
Maps to neighborhood_district.
- historicDistrictstring
Maps to historic_district.
- conservationDistrictstring
Maps to conservation_district.
- planDistrictstring
Maps to plan_district.
- businessAssociationstring
Maps to business_association.
- milestoneStatusstring
Maps to milestone_status.
- dateFromstring
Maps to date_from, mm/dd/yyyy.
- dateTostring
Maps to date_to, mm/dd/yyyy.
- ivrNumberinteger
Maps to ivr_number.
- applicationNumberstring
Maps to application_number.
- sortFieldstring
Maps to sort_field.
- sortOrderstring
Maps to sort_order.
- cacheany
- countinteger
- pageinteger
- downloadany
- extraParamsobject
search_sewer_records
1:1 wrapper for /api/sewer/. Search sewer assets, as-builts, and easements.
Parameters (24)
- typestringrequired
- unitIdstring
Maps to unit_id.
- compkeystring
- workOrderNumberstring
Maps to work_order_number.
- tvInspectionNumberstring
Maps to tv_inspection_number.
- serviceRequestNumberstring
Maps to service_request_number.
- jobNumberstring
Maps to job_number.
- jobNamestring
Maps to job_name.
- quarterSectionstring
Maps to quarter_section.
- locationstring
- commentsstring
- trackingNumberstring
Maps to tracking_number.
- datestring
- quitClaimstring
Maps to quit_claim.
- ordinanceNumberstring
Maps to ordinance_number.
- rightOfWaystring
Maps to right_of_way.
- bookstring
- pagestring
Sewer easement page field.
- sortFieldstring
Maps to sort_field.
- sortOrderstring
Maps to sort_order.
- countinteger
- pageNuminteger
Pagination page; maps to page.
- downloadany
- extraParamsobject
query_intersects
1:1 wrapper for /api/intersects/. Spatial intersection against named city layers such as row, taxlot, describe, street, and waterbody.
Parameters (4)
- geometryobjectrequired
ESRI JSON geometry in wkid 2913, 3857, or 4326.
- includearray
- buffernumber
- detailboolean
convert_geometry
1:1 wrapper for /api/geometry/. Convert geometry between ESRI, WKT, GeoJSON, GPolyline, and EncodedGPolyline.
Parameters (4)
- fromstringrequired
- tostringrequired
- geometrystringrequired
Source geometry as a string. JSON inputs should be JSON.stringify'd.
- sridstring
lookup_agol
1:1 wrapper for /api/agol/. Retrieve City of Portland ArcGIS Online metadata, webmaps, locators, and portal info.
Parameters (2)
- typestringrequired
- idstring
list_detail_types
Return the detail_type values accepted by get_portlandmaps_detail and the identifier each expects.
No parameters.
render_parcel_shape
Render a property's lot as an interactive UI component (inline SVG): a City of Portland aerial photo underlay (showing the true roofline) with the parcel outline, the building footprint(s) on the lot, approximate setback dimensions, a north arrow, and faint neighbouring parcels overlaid on top. Provide a detailType+detailId to fetch geometry, or pass rings directly. Aerial, footprints, and neighbours come from Portland's public ArcGIS layers; set basemap="none" to drop the photo and includeContext=false for just the bare outline. Renders in MCP Apps hosts (Claude) and legacy mcp-ui hosts.
Parameters (6)
- detailTypestring
detail_type used to fetch geometry when rings are not supplied.
- detailIdstring
detail_id used to fetch geometry when rings are not supplied.
- ringsarray
Web Mercator (EPSG:3857) parcel rings, e.g. geometry.rings. Bypasses fetching.
- titlestring
Caption shown on the component.
- includeContextboolean
Overlay building footprints, setbacks, and neighbouring parcels. Set false for just the lot outline.
- basemapstring
Aerial photo underlay (true rooflines). 'aerial' fetches a City of Portland image; 'none' renders dark vectors only.
README not available yet.
Install
Configuration
PORTLANDMAPS_API_KEYrequiredsecretPortlandMaps API key. Required for the /api/* tools; without it those endpoints return error payloads.
PORTLANDMAPS_API_KEY_PARAMQuery-parameter name to send the API key as. Defaults to 'api_key'.
PORTLANDMAPS_CACHE_TTL_MSIn-memory response cache TTL in milliseconds. Defaults to 3600000 (one hour).
claude_desktop_config.json
{
"mcpServers": {
"portlandmaps-mcp": {
"command": "npx",
"args": [
"-y",
"portlandmaps-mcp@0.2.5"
],
"env": {
"PORTLANDMAPS_API_KEY": "<YOUR_PORTLANDMAPS_API_KEY>",
"PORTLANDMAPS_API_KEY_PARAM": "<YOUR_PORTLANDMAPS_API_KEY_PARAM>",
"PORTLANDMAPS_CACHE_TTL_MS": "<YOUR_PORTLANDMAPS_CACHE_TTL_MS>"
}
}
}
}