protogrid

Search / io.github.GPTNowLLC/portlandmaps-mcp

PortlandMaps (Unofficial)

R0· no sign-in

Unofficial MCP server for the public PortlandMaps property/permit/zoning API. Not city-affiliated.

v0.2.5 · active · repository · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality87good
Trust90of 100
Uptime, 30 days100%
Latency p50258 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "portlandmaps-mcp": {
      "type": "http",
      "url": "https://portlandmaps-mcp.vercel.app/mcp/v2"
    }
  }
}
claude mcp add --transport http portlandmaps-mcp https://portlandmaps-mcp.vercel.app/mcp/v2
[mcp_servers.portlandmaps-mcp]
url = "https://portlandmaps-mcp.vercel.app/mcp/v2"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "portlandmaps-mcp": {
      "type": "remote",
      "url": "https://portlandmaps-mcp.vercel.app/mcp/v2",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "portlandmaps-mcp": {
      "type": "http",
      "url": "https://portlandmaps-mcp.vercel.app/mcp/v2"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=portlandmaps-mcp&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vcG9ydGxhbmRtYXBzLW1jcC52ZXJjZWwuYXBwL21jcC92MiJ9"
}
{
  "servers": {
    "portlandmaps-mcp": {
      "type": "http",
      "url": "https://portlandmaps-mcp.vercel.app/mcp/v2"
    }
  }
}
{
  "mcpServers": {
    "portlandmaps-mcp": {
      "httpUrl": "https://portlandmaps-mcp.vercel.app/mcp/v2"
    }
  }
}
extensions:
  "portlandmaps-mcp":
    enabled: true
    name: "portlandmaps-mcp"
    type: streamable_http
    uri: "https://portlandmaps-mcp.vercel.app/mcp/v2"
    timeout: 300

Quality 87 / 100good

protocol75 · weight 25
  • warn
    protocol.modernnewest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
  • n/a
    protocol.statelessonly applies to 2026-07-28 servers
  • pass
    protocol.transportstreamable HTTP
  • n/a
    protocol.list_ttlonly applies to 2026-07-28 servers
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene100 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • pass
    tools.description_lengthdescriptions are concise
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations11 of 11 tools declare readOnlyHint or destructiveHint
  • pass
    tools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
  • pass
    tools.token_costabout 4,235 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability100 · weight 15
  • pass
    stability.changesno tool changes in 30 days
  • pass
    stability.rug_pullno tool changed its meaning under the same name
dependencies67 · weight 15
  • pass
    deps.known_vulnsno known advisory in 119 resolved packages
  • fail
    deps.mcp_sdk_version@modelcontextprotocol/sdk 1.30.1 has 1 known advisory (GHSA-6qxp-vccf-f47h); update @modelcontextprotocol/sdk to 1.31.0 or later
  • pass
    deps.resolvable[email protected] resolved: 119 packages

11 tools, about 4,235 tokens to load them all · tool set a56c253cb518 · checked 2026-10-20 12:45 UTC

Tool changes

No tool definition changes recorded. A server's first observation is its baseline; later probes record what changes.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 90 / 100

provenance90
liveness100
freshness65
hygiene100

+repository +namespace-matches-repo +website +reachable +uptime-100% ~updated-117d-ago

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Dependencies

[email protected] npm118 dependencies, resolved · MCP SDK @modelcontextprotocol/sdk 1.30.1 · advisories checked 2026-10-19

advisoryseveritypackagefixed in
GHSA-6qxp-vccf-f47hMCP TypeScript SDK: OAuth client could send credentials to an authorization server chosen by the MCP serverhigh@modelcontextprotocol/[email protected]MCP SDK, directfixed in 1.31.0

Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0. The graph is what a clean install of this version resolves today; nothing was installed or run. How it is checked.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://portlandmaps-mcp.vercel.app/mcp/v2 streamable-httpnoneyes100%258 ms2025-11-252026-10-20
packageregistryversionruntimesecrets
portlandmaps-mcpnpm0.2.5–PORTLANDMAPS_API_KEY

Tools (11)

convert_geometryread-only1:1 wrapper for /api/geometry/. Convert geometry between ESRI, WKT, GeoJSON, GPolyline, and EncodedGPolyline.
get_assessor_dataread-only1:1 wrapper for /api/assessor/. Search assessor records by address, property IDs, geometry, or assessor filters.
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.
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.
list_detail_typesread-onlyReturn the detail_type values accepted by get_portlandmaps_detail and the identifier each expects.
lookup_agolread-only1:1 wrapper for /api/agol/. Retrieve City of Portland ArcGIS Online metadata, webmaps, locators, and portal info.
query_intersectsread-only1:1 wrapper for /api/intersects/. Spatial intersection against named city layers such as row, taxlot, describe, street, and waterbody.
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.
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.
search_sewer_recordsread-only1:1 wrapper for /api/sewer/. Search sewer assets, as-builts, and easements.
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.

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "io.github.GPTNowLLC/portlandmaps-mcp",
  "icons": [
    {
      "src": "https://portlandmaps-mcp.vercel.app/favicon.png",
      "sizes": [
        "512x512"
      ],
      "mimeType": "image/png"
    },
    {
      "src": "https://portlandmaps-mcp.vercel.app/favicon.svg",
      "sizes": [
        "any"
      ],
      "mimeType": "image/svg+xml"
    },
    {
      "src": "https://portlandmaps-mcp.vercel.app/apple-touch-icon.png",
      "sizes": [
        "180x180"
      ],
      "mimeType": "image/png"
    },
    {
      "src": "https://portlandmaps-mcp.vercel.app/favicon-32x32.png",
      "sizes": [
        "32x32"
      ],
      "mimeType": "image/png"
    },
    {
      "src": "https://portlandmaps-mcp.vercel.app/favicon-16x16.png",
      "sizes": [
        "16x16"
      ],
      "mimeType": "image/png"
    }
  ],
  "title": "PortlandMaps (Unofficial)",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://portlandmaps-mcp.vercel.app/mcp/v2",
      "type": "streamable-http"
    }
  ],
  "version": "0.2.5",
  "packages": [
    {
      "version": "0.2.5",
      "transport": {
        "type": "stdio"
      },
      "identifier": "portlandmaps-mcp",
      "registryType": "npm",
      "environmentVariables": [
        {
          "name": "PORTLANDMAPS_API_KEY",
          "isSecret": true,
          "isRequired": true,
          "description": "PortlandMaps API key. Required for the /api/* tools; without it those endpoints return error payloads."
        },
        {
          "name": "PORTLANDMAPS_API_KEY_PARAM",
          "description": "Query-parameter name to send the API key as. Defaults to 'api_key'."
        },
        {
          "name": "PORTLANDMAPS_CACHE_TTL_MS",
          "description": "In-memory response cache TTL in milliseconds. Defaults to 3600000 (one hour)."
        }
      ]
    }
  ],
  "repository": {
    "url": "https://github.com/GPTNowLLC/portlandmaps-mcp",
    "source": "github"
  },
  "websiteUrl": "https://github.com/GPTNowLLC/portlandmaps-mcp#readme",
  "description": "Unofficial MCP server for the public PortlandMaps property/permit/zoning API. Not city-affiliated."
}