MCP 서버

PortlandMaps (Unofficial)

io.github.GPTNowLLC/portlandmaps-mcp
지도 및 위치 부동산 공개 · 연결 가능 MCP 2025-11-25

이 MCP로 할 수 있는 일

Queries Portland property, assessor, permit, zoning, land-use, sewer, parcel, and ArcGIS data, including interactive parcel rendering.

convert_geometry
Convert Geometry
1:1 wrapper for /api/geometry/. Convert geometry between ESRI, WKT, GeoJSON, GPolyline, and EncodedGPolyline.
읽기 전용 외부 접근 가능 멱등성
입력 스키마
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['from', 'to', 'geometry'], 'properties': {'to': {'enum': ['ESRI', 'WKT', 'GeoJSON', 'GPolyline', 'EncodedGPolyline'], 'type': 'string'}, 'from': {'enum': ['ESRI', 'WKT', 'GeoJSON', 'GPolyline', 'EncodedGPolyline'], 'type': 'string'}, 'srid': {'enum': ['2913', '3857', '4326'], 'type': 'string'}, 'geometry': {'type': 'string', 'description': "Source geometry as a string. JSON inputs should be JSON.stringify'd."}}, 'additionalProperties': False}
get_assessor_data
Get Assessor Data
1:1 wrapper for /api/assessor/. Search assessor records by address, property IDs, geometry, or assessor filters.
읽기 전용 외부 접근 가능 멱등성
입력 스키마
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'city': {'type': 'string'}, 'page': {'type': 'integer', 'exclusiveMinimum': 0}, 'cache': {'$ref': '#/properties/primary'}, 'count': {'type': 'integer', 'maximum': 1000, 'exclusiveMinimum': 0}, 'county': {'enum': ['Multnomah', 'Clackamas', 'Washington'], 'type': 'string'}, 'address': {'type': 'string'}, 'primary': {'anyOf': [{'type': 'boolean'}, {'type': 'number', 'const': 0}, {'type': 'number', 'const': 1}]}, 'stateId': {'type': 'string', 'description': 'Maps to state_id.'}, 'zipCode': {'type': 'string', 'description': 'Maps to zip_code.'}, 'download': {'$ref': '#/properties/primary'}, 'geometry': {'anyOf': [{'type': 'object', 'additionalProperties': {}}, {'type': 'string'}]}, 'soldAfter': {'type': 'string', 'description': 'Maps to sold_after, mm/dd/yyyy.'}, 'sortField': {'type': 'string', 'description': 'Maps to sort_field.'}, 'sortOrder': {'enum': ['asc', 'desc'], 'type': 'string', 'description': 'Maps to sort_order.'}, 'builtAfter': {'type': 'integer', 'description': 'Maps to built_after.'}, 'propertyId': {'type': 'string', 'description': 'Maps to property_id.'}, 'soldBefore': {'type': 'string', 'description': 'Maps to sold_before, mm/dd/yyyy.'}, 'sqftLarger': {'type': 'number', 'description': 'Maps to sqft_larger.'}, 'builtBefore': {'type': 'integer', 'description': 'Maps to built_before.'}, 'extraParams': {'type': 'object', 'additionalProperties': {}}, 'sqftSmaller': {'type': 'number', 'description': 'Maps to sqft_smaller.'}, 'marketLarger': {'type': 'number', 'description': 'Maps to market_larger.'}, 'marketSmaller': {'type': 'number', 'description': 'Maps to market_smaller.'}, 'parentStateId': {'type': 'string', 'description': 'Maps to parent_state_id.'}, 'altAccountNumber': {'type': 'string', 'description': 'Maps to alt_account_number.'}, 'legalDescription': {'type': 'string', 'description': 'Maps to legal_description.'}}, 'additionalProperties': False}
get_permit_data
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.
읽기 전용 외부 접근 가능 멱등성
입력 스키마
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'page': {'type': 'integer', 'exclusiveMinimum': 0}, 'cache': {'anyOf': [{'type': 'boolean'}, {'type': 'number', 'const': 0}, {'type': 'number', 'const': 1}]}, 'count': {'type': 'integer', 'maximum': 1000, 'exclusiveMinimum': 0}, 'county': {'type': 'string'}, 'dateTo': {'type': 'string', 'description': 'Maps to date_to, mm/dd/yyyy.'}, 'address': {'type': 'string'}, 'stateId': {'type': 'string', 'description': 'Maps to state_id.'}, 'dateFrom': {'type': 'string', 'description': 'Maps to date_from, mm/dd/yyyy.'}, 'dateType': {'enum': ['issued', 'review', 'final'], 'type': 'string', 'description': 'Maps to date_type.'}, 'download': {'$ref': '#/properties/cache'}, 'ccbNumber': {'type': 'string', 'description': 'Maps to ccb_number.'}, 'ivrNumber': {'type': 'integer', 'description': 'Maps to ivr_number.'}, 'sortField': {'type': 'string', 'description': 'Maps to sort_field.'}, 'sortOrder': {'enum': ['asc', 'desc'], 'type': 'string', 'description': 'Maps to sort_order.'}, 'propertyId': {'type': 'string', 'description': 'Maps to property_id.'}, 'extraParams': {'type': 'object', 'additionalProperties': {}}, 'neighborhood': {'type': 'string'}, 'searchTypeId': {'type': 'integer', 'description': 'Maps to search_type_id.'}, 'applicationNumber': {'type': 'string', 'description': 'Maps to application_number.'}, 'businessAssociation': {'type': 'string', 'description': 'Maps to business_association.'}, 'neighborhoodDistrict': {'type': 'string', 'description': 'Maps to neighborhood_district.'}}, 'additionalProperties': False}
get_portlandmaps_detail
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.
읽기 전용 외부 접근 가능 멱등성
입력 스키마
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['detailType', 'detailId'], 'properties': {'fileId': {'type': 'string', 'description': 'Maps to file_id.'}, 'detailId': {'type': 'string', 'minLength': 1, 'description': 'Maps to detail_id.'}, 'fileType': {'type': 'string', 'description': 'Maps to file_type.'}, 'geometry': {'anyOf': [{'type': 'object', 'additionalProperties': {}}, {'type': 'string'}]}, 'sections': {'type': 'string', 'default': '*', 'description': "Use 'list' for available sections, or '*' for all sections."}, 'cacheClear': {'anyOf': [{'type': 'boolean'}, {'type': 'number', 'const': 0}, {'type': 'number', 'const': 1}], 'description': 'Maps to cache_clear.'}, 'detailType': {'type': 'string', 'minLength': 1, 'description': 'Maps to detail_type.'}, 'propertyId': {'type': 'string', 'description': 'Maps to property_id.'}, 'extraParams': {'type': 'object', 'additionalProperties': {}}}, 'additionalProperties': False}
list_detail_types
List Detail Types
Return the detail_type values accepted by get_portlandmaps_detail and the identifier each expects.
읽기 전용 멱등성
입력 스키마
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
lookup_agol
Lookup ArcGIS Online Metadata
1:1 wrapper for /api/agol/. Retrieve City of Portland ArcGIS Online metadata, webmaps, locators, and portal info.
읽기 전용 외부 접근 가능 멱등성
입력 스키마
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['type'], 'properties': {'id': {'type': 'string'}, 'type': {'enum': ['Locators', 'Portal', 'PortalGroup', 'PortalGroupItems', 'PortalThemes', 'Webmap', 'WebmapData', 'WebmapItem', 'WebmapExtra'], 'type': 'string'}}, 'additionalProperties': False}
query_intersects
Query Intersects
1:1 wrapper for /api/intersects/. Spatial intersection against named city layers such as row, taxlot, describe, street, and waterbody.
읽기 전용 외부 접근 가능 멱등성
입력 스키마
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['geometry'], 'properties': {'buffer': {'type': 'number', 'default': 10}, 'detail': {'type': 'boolean', 'default': False}, 'include': {'type': 'array', 'items': {'enum': ['all', 'city', 'county', 'describe', 'park', 'row', 'stream', 'street', 'taxlot', 'trail', 'waterbody', 'zipcode'], 'type': 'string'}, 'default': ['describe']}, 'geometry': {'type': 'object', 'description': 'ESRI JSON geometry in wkid 2913, 3857, or 4326.', 'additionalProperties': {}}}, 'additionalProperties': False}
render_parcel_shape
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.
읽기 전용 외부 접근 가능 멱등성
입력 스키마
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'rings': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'number'}}}, 'description': 'Web Mercator (EPSG:3857) parcel rings, e.g. geometry.rings. Bypasses fetching.'}, 'title': {'type': 'string', 'description': 'Caption shown on the component.'}, 'basemap': {'enum': ['aerial', 'none'], 'type': 'string', 'default': 'aerial', 'description': "Aerial photo underlay (true rooflines). 'aerial' fetches a City of Portland image; 'none' renders dark vectors only."}, 'detailId': {'type': 'string', 'description': 'detail_id used to fetch geometry when rings are not supplied.'}, 'detailType': {'type': 'string', 'default': 'zoning', 'description': 'detail_type used to fetch geometry when rings are not supplied.'}, 'includeContext': {'type': 'boolean', 'default': True, 'description': 'Overlay building footprints, setbacks, and neighbouring parcels. Set false for just the lot outline.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['rings', 'areaSqFt'], 'properties': {'rings': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'number'}}}}, 'title': {'type': 'string'}, 'basemap': {'anyOf': [{'type': 'object', 'required': ['dataUri'], 'properties': {'dataUri': {'type': 'string'}, 'attribution': {'type': 'string'}}, 'additionalProperties': False}, {'type': 'null'}]}, 'areaSqFt': {'type': 'number'}, 'setbacks': {'anyOf': [{'type': 'object', 'required': ['north', 'east', 'south', 'west'], 'properties': {'east': {'type': 'number'}, 'west': {'type': 'number'}, 'north': {'type': 'number'}, 'south': {'type': 'number'}}, 'additionalProperties': False}, {'type': 'null'}]}, 'buildings': {'type': 'array', 'items': {'type': 'object', 'required': ['rings'], 'properties': {'sqft': {'type': 'number'}, 'rings': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'number'}}}}, 'stories': {'type': 'number'}, 'onSubject': {'type': 'boolean'}, 'yearBuilt': {'type': 'number'}}, 'additionalProperties': False}}, 'neighbors': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'number'}}}}}}, 'additionalProperties': False}
search_landuse_cases
Search Land Use 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.
읽기 전용 외부 접근 가능 멱등성
입력 스키마
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'page': {'type': 'integer', 'default': 1, 'exclusiveMinimum': 0}, 'cache': {'anyOf': [{'type': 'boolean'}, {'type': 'number', 'const': 0}, {'type': 'number', 'const': 1}]}, 'count': {'type': 'integer', 'default': 100, 'maximum': 1000, 'exclusiveMinimum': 0}, 'dateTo': {'type': 'string', 'description': 'Maps to date_to, mm/dd/yyyy.'}, 'dateFrom': {'type': 'string', 'description': 'Maps to date_from, mm/dd/yyyy.'}, 'download': {'$ref': '#/properties/cache'}, 'ivrNumber': {'type': 'integer', 'description': 'Maps to ivr_number.'}, 'sortField': {'type': 'string', 'description': 'Maps to sort_field.'}, 'sortOrder': {'enum': ['asc', 'desc'], 'type': 'string', 'description': 'Maps to sort_order.'}, 'extraParams': {'type': 'object', 'additionalProperties': {}}, 'neighborhood': {'type': 'string'}, 'planDistrict': {'type': 'string', 'description': 'Maps to plan_district.'}, 'searchTypeId': {'type': 'integer', 'description': 'Maps to search_type_id.'}, 'milestoneStatus': {'enum': ['Review Complete', 'Under Review'], 'type': 'string', 'description': 'Maps to milestone_status.'}, 'historicDistrict': {'type': 'string', 'description': 'Maps to historic_district.'}, 'applicationNumber': {'type': 'string', 'description': 'Maps to application_number.'}, 'businessAssociation': {'type': 'string', 'description': 'Maps to business_association.'}, 'conservationDistrict': {'type': 'string', 'description': 'Maps to conservation_district.'}, 'neighborhoodDistrict': {'type': 'string', 'description': 'Maps to neighborhood_district.'}}, 'additionalProperties': False}
search_sewer_records
Search Sewer Records
1:1 wrapper for /api/sewer/. Search sewer assets, as-builts, and easements.
읽기 전용 외부 접근 가능 멱등성
입력 스키마
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['type'], 'properties': {'book': {'type': 'string'}, 'date': {'type': 'string'}, 'page': {'type': 'string', 'description': 'Sewer easement page field.'}, 'type': {'enum': ['Asset', 'AsBuilt', 'Easement'], 'type': 'string'}, 'count': {'type': 'integer', 'default': 100, 'maximum': 1000, 'exclusiveMinimum': 0}, 'unitId': {'type': 'string', 'description': 'Maps to unit_id.'}, 'compkey': {'type': 'string'}, 'jobName': {'type': 'string', 'description': 'Maps to job_name.'}, 'pageNum': {'type': 'integer', 'default': 1, 'description': 'Pagination page; maps to page.', 'exclusiveMinimum': 0}, 'comments': {'type': 'string'}, 'download': {'anyOf': [{'type': 'boolean'}, {'type': 'number', 'const': 0}, {'type': 'number', 'const': 1}]}, 'location': {'type': 'string'}, 'jobNumber': {'type': 'string', 'description': 'Maps to job_number.'}, 'quitClaim': {'enum': ['Yes', 'No'], 'type': 'string', 'description': 'Maps to quit_claim.'}, 'sortField': {'type': 'string', 'description': 'Maps to sort_field.'}, 'sortOrder': {'enum': ['asc', 'desc'], 'type': 'string', 'description': 'Maps to sort_order.'}, 'rightOfWay': {'type': 'string', 'description': 'Maps to right_of_way.'}, 'extraParams': {'type': 'object', 'additionalProperties': {}}, 'quarterSection': {'type': 'string', 'description': 'Maps to quarter_section.'}, 'trackingNumber': {'type': 'string', 'description': 'Maps to tracking_number.'}, 'ordinanceNumber': {'type': 'string', 'description': 'Maps to ordinance_number.'}, 'workOrderNumber': {'type': 'string', 'description': 'Maps to work_order_number.'}, 'tvInspectionNumber': {'type': 'string', 'description': 'Maps to tv_inspection_number.'}, 'serviceRequestNumber': {'type': 'string', 'description': 'Maps to service_request_number.'}}, 'additionalProperties': False}
suggest_portlandmaps_address
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.
읽기 전용 외부 접근 가능 멱등성
입력 스키마
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['query'], 'properties': {'ags': {'$ref': '#/properties/units'}, 'city': {'type': 'string'}, 'page': {'type': 'integer', 'exclusiveMinimum': 0}, 'unit': {'type': 'string'}, 'cache': {'$ref': '#/properties/units'}, 'count': {'type': 'integer', 'maximum': 1000, 'exclusiveMinimum': 0}, 'exact': {'$ref': '#/properties/units'}, 'query': {'type': 'string', 'minLength': 1, 'description': 'Search term. Can be an address, intersection, landmark name, or ID.'}, 'units': {'anyOf': [{'type': 'boolean'}, {'type': 'number', 'const': 0}, {'type': 'number', 'const': 1}]}, 'altIds': {'$ref': '#/properties/units', 'description': 'Maps to alt_ids.'}, 'county': {'type': 'string'}, 'status': {'enum': ['active', 'pending', 'all'], 'type': 'string'}, 'elements': {'$ref': '#/properties/units'}, 'geometry': {'anyOf': [{'type': 'object', 'additionalProperties': {}}, {'type': 'string'}]}, 'altCoords': {'$ref': '#/properties/units', 'description': 'Maps to alt_coords.'}, 'idMatches': {'$ref': '#/properties/units', 'description': 'Maps to id_matches.'}, 'landmarks': {'$ref': '#/properties/units'}, 'centerline': {'$ref': '#/properties/units'}, 'extraParams': {'type': 'object', 'additionalProperties': {}}, 'jurisdiction': {'type': 'string'}, 'intersections': {'$ref': '#/properties/units'}}, 'additionalProperties': False}
추가됨
render_parcel_shape
2026년 9월 17일 12:42 PM
추가됨
list_detail_types
2026년 9월 17일 12:42 PM
추가됨
lookup_agol
2026년 9월 17일 12:42 PM
추가됨
convert_geometry
2026년 9월 17일 12:42 PM
추가됨
query_intersects
2026년 9월 17일 12:42 PM
추가됨
search_sewer_records
2026년 9월 17일 12:42 PM
추가됨
search_landuse_cases
2026년 9월 17일 12:42 PM
추가됨
get_permit_data
2026년 9월 17일 12:42 PM
추가됨
get_assessor_data
2026년 9월 17일 12:42 PM
추가됨
get_portlandmaps_detail
2026년 9월 17일 12:42 PM
추가됨
suggest_portlandmaps_address
2026년 9월 17일 12:42 PM