vancouver-city-opendata-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@vancouver-city-opendata-mcp find recent building permits in Kitsilano"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Vancouver City Open Data MCP
An MCP server that exposes the City of Vancouver Open Data Portal (Opendatasoft Explore API v2.1) as tools an LLM can call directly: search datasets, inspect their schema, query/filter records, discover facet values, and export bounded slices of data.
Features
search_datasets — full-text and ODSQL search across the ~200 datasets in the catalog.
get_dataset — metadata and field schema for a single dataset.
query_records — filter/sort/paginate a dataset's records with ODSQL (
where,select,order_by,group_by,q,refine).get_facets — discover valid filter values (and counts) before writing a
where/refineclause.export_dataset — bulk export in csv/json/geojson/parquet, capped at a configurable row limit.
Runs over stdio (for Claude Desktop/Claude Code) or Streamable HTTP (for remote deployment) from the same codebase.
No API key required for public read access; an optional key raises Opendatasoft's rate limits.
Related MCP server: MCP Data Vermont
Install
npm install
npm run buildUsage — stdio (Claude Desktop / Claude Code)
stdio is the default transport — running the built binary with no flags starts it directly.
Claude Desktop config (claude_desktop_config.json):
{
"mcpServers": {
"vancouver-opendata": {
"command": "node",
"args": ["/absolute/path/to/vancouver-city-opendata-mcp/dist/index.js"]
}
}
}Or explore it interactively with the MCP Inspector:
npx @modelcontextprotocol/inspector node dist/index.jsUsage — HTTP
MCP_TRANSPORT=http PORT=3000 node dist/index.js
# or: node dist/index.js --httpThis exposes a single /mcp endpoint implementing the Streamable HTTP transport (session lifecycle via the mcp-session-id header — POST to initialize/call tools, GET for the SSE stream, DELETE to close a session).
curl -s -X POST http://127.0.0.1:3000/mcp \
-H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'Note: there is no inbound authentication in v1. If deploying the HTTP transport somewhere reachable beyond localhost, put it behind your own auth/reverse proxy, and set ALLOWED_HOSTS for DNS-rebinding protection.
Environment variables
Variable | Default | Description |
|
| Base URL of the Opendatasoft Explore API v2.1 to query. |
| (none) | Optional Opendatasoft API key, sent as |
|
|
|
|
| Host to bind the HTTP transport to. |
|
| Port used when |
| (none) | Comma-separated hostnames allowed to reach the HTTP transport. |
|
| Hard cap on rows |
Rate limits
Opendatasoft enforces a public per-IP quota (observed at 15,000 requests/day, plus per-dataset limits) surfaced via X-RateLimit-* response headers. export_dataset and friends will return a clear isError message if you're throttled. Set ODS_API_KEY to raise your limits.
Development
npm run test # unit tests (no network access required)
RUN_LIVE_TESTS=1 npm test # also runs the opt-in suite against the real API
npm run dev # tsc --watchLicense
MIT
Available Tools
5 toolsexport_datasetA
Export rows from a dataset in csv, json, geojson, or parquet format. Returns the data inline as text (parquet is base64-encoded binary, since this is not a file-download channel) and is hard-capped at 5000 rows regardless of the requested limit. For larger datasets, narrow the export with where/select, or use query_records with offset-based pagination instead.
Inputs: datasetId (required), limit, where, format, +2 more.
get_datasetA
Get full metadata for a single dataset by its dataset_id, including its field schema (name, type, label, description) needed to write select/where/order_by expressions for query_records.
Inputs: datasetId (required).
get_facetsA
Get facet values and their record counts for a dataset's filterable fields. Call this before query_records to discover valid values for where/refine filters instead of guessing.
Inputs: datasetId (required), where, refine.
query_recordsA
Query and filter records within a dataset using ODSQL (where/select/order_by/group_by/q/refine), with pagination via limit/offset. For geographic datasets, results may include a geom GeoJSON field. Call get_dataset first if you don't know the field names.
Inputs: datasetId (required), q, limit, where, +5 more.
search_datasetsA
Search/list datasets in the City of Vancouver Open Data Portal catalog. Supports full-text search (q) and/or an ODSQL boolean filter (where). Returns dataset_id, title, description, theme, license, and record counts for each match.
Inputs: q, limit, where, offset, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 5 tools
Each tool targets a distinct stage of the open-data workflow: catalog search, metadata/schema retrieval, record querying, facet discovery, and dataset export. Even though query_records and export_dataset both return rows, their intended use cases are clear and non-conflicting.
All tool names follow a consistent verb_noun snake_case pattern: search_datasets, get_dataset, query_records, get_facets, export_dataset. The pattern is predictable and makes it easy to infer tool behavior from the name alone.
Five tools is well-scoped for an open-data portal MCP server. Each tool earns its place by covering a necessary part of the exploration-and-extraction workflow without unnecessary redundancy.
The server covers the full read-only lifecycle for open data: discover datasets, inspect schema, explore facet values, query records, and export in multiple formats. There are no obvious dead ends or missing actions that would prevent an agent from accomplishing the apparent purpose.
Related MCP Connectors
Search and query government open-data portals (Socrata SODA API).
Query and explore Nova Scotia open datasets via the Socrata SODA API.
Search, explore, and analyze hundreds of datasets from the Nova Scotia government's datasets
DataSeattle MCP — Seattle open data (data.seattle.gov, Socrata SODA API).
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables querying Calgary open data from data.calgary.ca using the Socrata SODA API through natural language questions or direct tool calls.153 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables searching, querying, and retrieving metadata from Vermont Open Data (data.vermont.gov) datasets using Socrata SoQL, all via natural language.150 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables querying and searching the Providence Open Data catalog via Socrata SoQL, including dataset search, data querying, and metadata retrieval.135 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables searching and querying Virginia Open Data (datahub.va.gov) via the Socrata API, providing tools to search datasets, run SoQL queries, and retrieve metadata.131 npmMIT