PortlandMaps (Unofficial)
Measured conclusion: Alive, not deep-tested. L2 outcome: not_attempted.
Unofficial MCP server for the public PortlandMaps property/permit/zoning API. Not city-affiliated.
| Author | io.github.GPTNowLLC |
|---|---|
| Access | mixed |
| Publisher key required | No |
| Measured state | Alive, not deep-tested |
| L1 liveness | alive |
| L1 latency | 205 ms |
| Last measured | 2026-10-26 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"PortlandMaps (Unofficial)": {
"url": "https://portlandmaps-mcp.vercel.app/mcp/v2",
"transport": "streamable-http"
}
}
}
Measured tools (11)
suggest_portlandmaps_addressread-only1: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:
query(required) — string — Search term. Can be an address, intersection, landmark name, or ID.agscity— stringpage— integerunit— stringcachecount— integerexactunitsaltIds— Maps to alt_ids.county— stringstatus— stringelementsgeometryaltCoords— Maps to alt_coords.idMatches— Maps to id_matches.landmarkscenterlineextraParams— objectjurisdiction— stringintersections
Hints: read-only yes · destructive no · idempotent yes · open-world yes
get_portlandmaps_detailread-only1: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:
detailType(required) — string — Maps to detail_type.detailId(required) — string — Maps to detail_id.fileId— string — Maps to file_id.fileType— string — Maps to file_type.geometrysections— string — Use 'list' for available sections, or '*' for all sections.cacheClear— Maps to cache_clear.propertyId— string — Maps to property_id.extraParams— object
Hints: read-only yes · destructive no · idempotent yes · open-world yes
get_assessor_dataread-only1:1 wrapper for /api/assessor/. Search assessor records by address, property IDs, geometry, or assessor filters.
Parameters:
city— stringpage— integercachecount— integercounty— stringaddress— stringprimarystateId— string — Maps to state_id.zipCode— string — Maps to zip_code.downloadgeometrysoldAfter— string — Maps to sold_after, mm/dd/yyyy.sortField— string — Maps to sort_field.sortOrder— string — Maps to sort_order.builtAfter— integer — Maps to built_after.propertyId— string — Maps to property_id.soldBefore— string — Maps to sold_before, mm/dd/yyyy.sqftLarger— number — Maps to sqft_larger.builtBefore— integer — Maps to built_before.extraParams— objectsqftSmaller— number — Maps to sqft_smaller.marketLarger— number — Maps to market_larger.marketSmaller— number — Maps to market_smaller.parentStateId— string — Maps to parent_state_id.altAccountNumber— string — Maps to alt_account_number.legalDescription— string — Maps to legal_description.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
get_permit_dataread-only1: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:
page— integercachecount— integercounty— stringdateTo— string — Maps to date_to, mm/dd/yyyy.address— stringstateId— string — Maps to state_id.dateFrom— string — Maps to date_from, mm/dd/yyyy.dateType— string — Maps to date_type.downloadccbNumber— string — Maps to ccb_number.ivrNumber— integer — Maps to ivr_number.sortField— string — Maps to sort_field.sortOrder— string — Maps to sort_order.propertyId— string — Maps to property_id.extraParams— objectneighborhood— stringsearchTypeId— integer — Maps to search_type_id.applicationNumber— string — Maps to application_number.businessAssociation— string — Maps to business_association.neighborhoodDistrict— string — Maps to neighborhood_district.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
search_landuse_casesread-only1: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:
page— integercachecount— integerdateTo— string — Maps to date_to, mm/dd/yyyy.dateFrom— string — Maps to date_from, mm/dd/yyyy.downloadivrNumber— integer — Maps to ivr_number.sortField— string — Maps to sort_field.sortOrder— string — Maps to sort_order.extraParams— objectneighborhood— stringplanDistrict— string — Maps to plan_district.searchTypeId— integer — Maps to search_type_id.milestoneStatus— string — Maps to milestone_status.historicDistrict— string — Maps to historic_district.applicationNumber— string — Maps to application_number.businessAssociation— string — Maps to business_association.conservationDistrict— string — Maps to conservation_district.neighborhoodDistrict— string — Maps to neighborhood_district.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
search_sewer_recordsread-only1:1 wrapper for /api/sewer/. Search sewer assets, as-builts, and easements.
Parameters:
type(required) — stringbook— stringdate— stringpage— string — Sewer easement page field.count— integerunitId— string — Maps to unit_id.compkey— stringjobName— string — Maps to job_name.pageNum— integer — Pagination page; maps to page.comments— stringdownloadlocation— stringjobNumber— string — Maps to job_number.quitClaim— string — Maps to quit_claim.sortField— string — Maps to sort_field.sortOrder— string — Maps to sort_order.rightOfWay— string — Maps to right_of_way.extraParams— objectquarterSection— string — Maps to quarter_section.trackingNumber— string — Maps to tracking_number.ordinanceNumber— string — Maps to ordinance_number.workOrderNumber— string — Maps to work_order_number.tvInspectionNumber— string — Maps to tv_inspection_number.serviceRequestNumber— string — Maps to service_request_number.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
query_intersectsread-only1:1 wrapper for /api/intersects/. Spatial intersection against named city layers such as row, taxlot, describe, street, and waterbody.
Parameters:
geometry(required) — object — ESRI JSON geometry in wkid 2913, 3857, or 4326.buffer— numberdetail— booleaninclude— array
Hints: read-only yes · destructive no · idempotent yes · open-world yes
convert_geometryread-only1:1 wrapper for /api/geometry/. Convert geometry between ESRI, WKT, GeoJSON, GPolyline, and EncodedGPolyline.
Parameters:
from(required) — stringto(required) — stringgeometry(required) — string — Source geometry as a string. JSON inputs should be JSON.stringify'd.srid— string
Hints: read-only yes · destructive no · idempotent yes · open-world yes
lookup_agolread-only1:1 wrapper for /api/agol/. Retrieve City of Portland ArcGIS Online metadata, webmaps, locators, and portal info.
Parameters:
type(required) — stringid— string
Hints: read-only yes · destructive no · idempotent yes · open-world yes
list_detail_typesread-onlyReturn the detail_type values accepted by get_portlandmaps_detail and the identifier each expects.
Hints: read-only yes · destructive no · idempotent yes · open-world no
render_parcel_shaperead-onlyRender 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:
rings— array — Web Mercator (EPSG:3857) parcel rings, e.g. geometry.rings. Bypasses fetching.title— string — Caption shown on the component.basemap— string — Aerial photo underlay (true rooflines). 'aerial' fetches a City of Portland image; 'none' renders dark vectors only.detailId— string — detail_id used to fetch geometry when rings are not supplied.detailType— string — detail_type used to fetch geometry when rings are not supplied.includeContext— boolean — Overlay building footprints, setbacks, and neighbouring parcels. Set false for just the lot outline.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.