Are you the author? Sign in to claim
A Centralized MCP Server for Fetching Data from Many Countries' Govs
A Model Context Protocol (MCP) server that lets AI agents search, explore, and fetch open datasets from official government data portals. One unified tool interface across the United States, United Kingdom, Canada, and Australia — with per-portal quirks (API migrations, auth walls, bilingual metadata, stale DataStore flags) absorbed behind a common adapter layer.
Built for the typical agent workflow: "Is there a government dataset for X?" → find candidates → inspect the files → preview rows or grab a download link and move on.
get_download_link instead", "retry with dataset_id", "available portals: …") — never raw tracebacks.stdio for local clients (Claude Desktop etc.), stateless streamable-http for serverless deployment (Google Cloud Run).| Code | Portal | API | Search | Explore | Row Preview | Notes |
|---|---|---|---|---|---|---|
us | data.gov | data.gov v4 (DCAT) | ✅ | ✅ | CSV fallback | Requires free api.data.gov key |
uk | data.gov.uk | CKAN | ✅ | ✅ | CSV fallback | Resource lookups need the parent dataset_id |
ca | open.canada.ca | CKAN | ✅ | ✅ | CSV fallback | Bilingual titles normalized to English |
au | data.gov.au | CKAN + DataStore | ✅ | ✅ | ✅ DataStore | Full row queries with text filtering |
git clone https://github.com/YOUR_ORG/Gov-Stat-MCP-Server.git
cd Gov-Stat-MCP-Server
# pip
pip install -e ".[dev]"
# or conda
conda env create -f environment.yml
conda activate opendata-mcp
Copy .env.example to .env and set your key:
DATAGOV_API_KEY=your-api-data-gov-key
Standard config for most MCP clients (stdio transport):
{
"mcpServers": {
"govdata": {
"command": "govdata-mcp",
"env": {
"DATAGOV_API_KEY": "your-api-data-gov-key"
}
}
}
}
claude mcp add govdata -e DATAGOV_API_KEY=your-key -- govdata-mcp
Follow the MCP install guide and use the standard config above. Note: govdata-mcp must be on the PATH Claude Desktop uses — provide an absolute path to the executable inside your virtualenv/conda env if needed, e.g. /path/to/envs/mcp-env/bin/govdata-mcp.
Use the standard config above in the client's MCP settings file.
Run the server in HTTP mode:
MCP_TRANSPORT=http govdata-mcp
Then point your client at the endpoint:
{
"mcpServers": {
"govdata": {
"url": "http://localhost:8080/mcp"
}
}
}
The intended agent flow: list_portals → search_datasets → get_dataset → preview_resource / fetch_resource / get_download_link.
list_portals
search_datasets
portal (string): Portal code — us, uk, ca, auquery (string): Search terms, e.g. "air quality monitoring"limit (number, optional): Max results (default 10, max 50)org (string, optional): Publisher/organization slug filter (CKAN portals)format (string, optional): Resource format filter, e.g. "CSV" (CKAN portals)get_dataset
portal (string): Portal codedataset_id (string): Dataset id/slug from search_datasetspreview_resource
portal (string): Portal coderesource_id (string): Resource id from get_datasetrows (number, optional): Rows to return (default 20, max 100)query (string, optional): Full-text row filter (DataStore-backed resources only)dataset_id (string, optional): Parent dataset id — recommended; required on ukfetch_resource
portal (string): Portal coderesource_id (string): Resource id from get_datasetmax_kb (number, optional): Max kilobytes to inline (default 256, cap 512)dataset_id (string, optional): Parent dataset id — recommended; required on ukget_download_link
portal (string): Portal coderesource_id (string): Resource id from get_datasetdataset_id (string, optional): Parent dataset id — recommended; required on ukAll settings are environment variables (or a local .env file):
| Variable | Default | Description |
|---|---|---|
MCP_TRANSPORT | stdio | stdio (local clients) or http (streamable-http server) |
PORT | 8080 | Listen port for HTTP transport (injected automatically on Cloud Run) |
DATAGOV_API_KEY | — | api.data.gov key for the US portal; falls back to DEMO_KEY (~30 req/hr) |
LOG_LEVEL | INFO | Logging verbosity (always written to stderr) |
HTTP_TIMEOUT_SECONDS | 30 | Timeout for outbound portal requests |
HTTP_MAX_RETRIES | 2 | Retries on transient portal errors (5xx / transport), exponential backoff |
SEARCH_DEFAULT_LIMIT | 10 | Default number of search results |
NOTES_TRUNCATE_CHARS | 200 | Description truncation length in search summaries |
FETCH_MAX_BYTES | 524288 | Hard cap for inlined resource content |
make docker-build # build image
make docker-run # run on :8080, exactly as Cloud Run would
The image runs the HTTP transport in stateless mode and is ready for serverless platforms (Google Cloud Run deployment script included under deploy/).
make run # stdio mode
make run-http # HTTP mode on :8080
make inspect # MCP Inspector interactive UI (requires Node.js)
make test # offline unit tests
make test-live # live end-to-end tests against all four real portals
make lint # ruff check + format check
The live suite (pytest -m live) verifies the full search → explore → preview → fetch chain per country plus portal-specific behavior (Canada's bilingual normalization, UK's dataset-scoped resource lookup, Australia's DataStore paths). Run it before deploying — government portals change without notice.
src/govdata_mcp/
├── server.py # FastMCP instance + tool registration
├── config.py # env-driven settings
├── ckan/ # generic async CKAN client, models, typed errors
├── portals/
│ ├── registry.py # portal registry — single source of truth
│ ├── base.py # Portal config + default (vanilla CKAN) adapter
│ ├── us.py # data.gov v4 DCAT adapter (auth, cursor paging)
│ ├── uk.py # dataset-scoped resource lookup
│ └── ca.py # bilingual metadata normalization
├── tools/ # MCP tools: search, explore, fetch
└── utils/ # formatting (token economy), CSV-head preview
Adding a portal: for a standard CKAN portal, add one Portal(...) entry to portals/registry.py — done. For portals with quirks, subclass PortalAdapter and override the narrow hooks (normalize_dataset, build_search_params) or, for non-CKAN APIs, the operation methods themselves (see us.py for a full custom adapter).
deploy/)fetch_resource and preview_resource download from URLs contained in portal metadata; content is size-capped and binary-checked before being returned to the model, but treat fetched content as untrusted input.--no-allow-unauthenticated).DATAGOV_API_KEY in .env / secret manager — never commit it.MIT
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots
Google's universal MCP server supporting PostgreSQL, MySQL, MongoDB, Redis, and 10+ databases
Official GitHub integration for repos, issues, PRs, and CI/CD workflows