The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Socrata MCP Server listing page.
Search and query government open-data portals (Socrata SODA API) via MCP. STDIO or Streamable HTTP.
Six tools covering the full Socrata workflow — portal discovery, dataset search, schema inspection, SoQL querying, and DuckDB-powered analytical SQL over large result sets:
| Tool | Description |
|---|---|
socrata_list_portals | List known Socrata-powered government open-data portals with domain, organization name, and approximate dataset count |
socrata_find_datasets | Search for datasets across all Socrata portals or scope to one portal via the Discovery API |
socrata_get_dataset | Fetch full metadata and typed column schema for a dataset by ID — required before writing SoQL queries |
socrata_query_dataset | Execute a SoQL query against any dataset: search, select, where, group, having, order, with DataCanvas spillover |
socrata_dataframe_describe | List registered tables in a DataCanvas session — schema, row count, column names |
socrata_dataframe_query | Run SELECT-only SQL against DataCanvas tables populated by socrata_query_dataset |
socrata_list_portalsList known Socrata-powered government open-data portals.
0 means the portal exposes no dataset assets to the catalog; null means the count is temporarily unavailable)socrata_find_datasets), organization name, and approximate dataset countsocrata_find_datasetsSearch for datasets across all Socrata portals or scope to a single portal.
domain parameter["Public Safety", "Transportation"]) and tags (e.g. ["covid19"])socrata_get_dataset for typed schema before writing queriessocrata_get_datasetFetch full metadata and column schema for a Socrata dataset by ID.
data_type determines correct WHERE clause syntax: Number → bare literals (year=2023), Text → single-quoted strings (year='2023'):@computed_region_*) to reduce noisesocrata_query_dataset querysocrata_query_datasetExecute a SoQL query against any dataset on any Socrata portal.
search parameter for quick full-text lookup across all text columns ($q)select, where, group, having, order for full analytical control=, !=, >, <, LIKE, IN(...), BETWEEN, IS NULL, starts_with(), contains(), AND, OR, NOTcount(*), sum(), avg(), min(), max() with group and havingtotal_count returned when result is truncatedassembled_query in the response echoes the SoQL string for learning the syntaxCANVAS_PROVIDER_TYPE=duckdb and result hits the limit, rows spill to a DataCanvas table for SQL-based analysissocrata_dataframe_describeList registered tables in a DataCanvas session.
CANVAS_PROVIDER_TYPE=duckdb is setsocrata_query_dataset spills a large result setsocrata_dataframe_querysocrata_dataframe_queryRun SELECT-only SQL against DataCanvas tables populated by socrata_query_dataset.
year > 2020, amount < 500)read_csv, read_parquet) are rejectedCANVAS_PROVIDER_TYPE=duckdb is set — DuckDB ships as a regular dependency| Type | Name | Description |
|---|---|---|
| Resource | socrata://datasets/{domain}/{datasetId} | Fetch full metadata and column schema for a dataset by stable URI — same payload as socrata_get_dataset |
| Resource | socrata://portals | Paginated list of known Socrata portals with organization name and approximate dataset count |
| Prompt | explore_open_data | Structured six-step civic data investigation workflow: find portal → discover datasets → inspect schema → query → aggregate → synthesize |
All resource data is also reachable via tools. Use the corresponding tool for agent workflows — resources are for clients that support URI-addressable data.
Built on @cyanheads/mcp-ts-core:
none, jwt, oauthin-memory, filesystem, Supabase, Cloudflare KV/R2/D1Socrata-specific:
SOCRATA_APP_TOKEN) for higher per-IP rate limitsSOCRATA_DEFAULT_DOMAINAgent-friendly output:
socrata_query_dataset response so agents can learn and refine syntaxinvalid_id, not_found, soql_error, rate_limited) with actionable recovery textAdd the following to your MCP client configuration file.
Or with npx (no Bun required):
Or with Docker:
For Streamable HTTP, set the transport and start the server:
All configuration is validated at startup via Zod schemas in src/config/server-config.ts. Key environment variables:
| Variable | Description | Default |
|---|---|---|
SOCRATA_APP_TOKEN | Socrata app token (X-App-Token header). Without a token, requests share a throttled pool per source IP. | — |
SOCRATA_DEFAULT_DOMAIN | Default portal domain when domain is omitted from tool calls. | data.seattle.gov |
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | Port for HTTP server. | 3010 |
MCP_SESSION_MODE | Session handling: stateful, stateless, or auto (schema default auto resolves to stateful). This server sets it explicitly to stateless. | stateless |
MCP_AUTH_MODE | Auth mode: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (RFC 5424): debug, info, notice, warning, error. | info |
CANVAS_PROVIDER_TYPE | Set to duckdb to enable DataCanvas spillover for large result sets. DuckDB ships with the server — no additional install required. | — |
LOGS_DIR | Directory for log files (Node.js only). | <project-root>/logs |
STORAGE_PROVIDER_TYPE | Storage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1. | in-memory |
OTEL_ENABLED | Enable OpenTelemetry instrumentation. | false |
See .env.example for the full list of optional overrides.
Build and run:
Run checks and tests:
The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/socrata-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
| Directory | Purpose |
|---|---|
src/index.ts | createApp() entry point — registers tools, resources, prompts, and inits the Socrata service. |
src/config | Server-specific environment variable parsing and validation with Zod. |
src/mcp-server/tools | Tool definitions (*.tool.ts). Six tools covering portal listing, dataset search, schema fetch, SoQL query, and DataCanvas SQL. |
src/mcp-server/resources | Resource definitions (*.resource.ts). Dataset metadata and portal catalog resources. |
src/mcp-server/prompts | Prompt definitions (*.prompt.ts). Civic data investigation workflow prompt. |
src/services/socrata | Socrata service layer — SODA 2.1 API client, Discovery API, query builder, type normalization. |
tests/ | Unit and integration tests mirroring src/. |
See CLAUDE.md for development guidelines and architectural rules. The short version:
try/catch in tool logicctx.log for request-scoped logging, ctx.state for tenant-scoped storagesocrata_get_dataset before writing WHERE clauses — column data_type determines quotingApache-2.0 — see LICENSE for details.