Query 100+ open data APIs β government, science, finance, environment, and more.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
A single MCP server that transparently routes user requests to 90 open-data sources.
meta-data-mcp is one MCP server β not many. Under the hood it bundles 90 plugins, each wrapping a different open-data API. The plugins are an implementation detail; from your LLM's perspective there is one server and one place to ask "where can I find data about X?"
You install one server. You get all the data, discoverable through built-in routing tools.
Finding open data isn't the hard part β there's an absurd amount of it available. The hard part is finding the right dataset when you need it. meta-data-mcp makes that automatic:
opendata_providers_find ("FX rates", "court rulings", "earthquakes near Lisbon") and the server routes the query against an internal registry of every bundled plugin.This project was forked from opendata-mcp and reshaped around the single-server idea once the catalogue passed a few dozen plugins.
You'll need uv (a Python package manager).
Then register the server with every MCP client installed on your machine:
The command auto-detects which MCP clients you have installed and adds one meta-data-mcp entry under mcpServers in each. Supported clients:
| Client | Config file |
|---|---|
| Claude Desktop | ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) / %APPDATA%/Claude/claude_desktop_config.json (Windows) |
| Claude Code | ~/.claude.json |
| Cursor | ~/.cursor/mcp.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| Gemini CLI | ~/.gemini/settings.json |
| LM Studio | ~/.cache/lm-studio/mcp.json |
Each existing config is backed up to <file>.bak before writing. Restart the affected client(s) and you'll see one new server with discovery tools available immediately; plugin tools can then be activated on demand.
Inspect what's detected / configured on your machine:
Target a single client (or write to every supported client regardless of detection):
If you want to see the JSON snippet without touching any config file (e.g. to paste into a client we don't support yet):
When META_DATA_MCP_AUTH_TOKEN is set, --print-json also surfaces the SSE-client snippet (with the real token) to stderr so you can wire a remote client.
meta-data-mcp as a remote SSE serverFor deploying behind your own domain with bearer-token authentication, see docs/hosting.md. It covers systemd, Caddy/nginx TLS termination, token rotation, and the threat model.
There is one server, so the CLI takes no "provider" argument. Every command operates on the one meta-data-mcp server.
| Command | What it does |
|---|---|
uv run meta-data-mcp run | Run the server (default SSE; pass --transport stdio for Claude Desktop). |
uv run meta-data-mcp setup | Register the server in detected MCP client configs (or one target via --client). |
uv run meta-data-mcp remove | Unregister the server from detected MCP client configs (or one target via --client). |
uv run meta-data-mcp cleanup | Detect and remove legacy multi-server entries (--apply to commit). |
uv run meta-data-mcp inspect | Launch mcp-inspector against the server. |
uv run meta-data-mcp list | Informational: list the internal plugins bundled in this server. |
uv run meta-data-mcp info | Informational: show server overview. Pass --plugin <name> for plugin-level details. |
uv run meta-data-mcp version | Print the package version. |
The list command exists for transparency about what's bundled β plugins are not separately installable, runnable, or addressable. They are loaded automatically when the server starts.
Once meta-data-mcp is running, the LLM has access to two layers of tools β and you don't need to mention either to the user:
META_DATA_MCP_PRELOAD). The LLM picks one after consulting the meta tools.| Tool | Purpose |
|---|---|
opendata_providers_find | Free-text search over the plugin registry. Returns ranked matches. When nothing matches the response carries a no_match: true flag and a next_step hint pointing at opendata_plugins_draft + opendata_plugins_create. |
opendata_explain_choice | Show the scoring breakdown for a search (useful for debugging routing decisions). |
opendata_domains_list | Enumerate the controlled domain vocabulary (health, legal, finance, earth-science, β¦). |
opendata_regions_list | Enumerate the controlled region vocabulary (us, eu, uk, global, β¦). |
opendata_providers_describe | Full metadata for one plugin by id β title, description, domains, regions, keywords, homepage, required env vars. |
opendata_providers_list | Paginated dump of the whole registry. |
opendata_providers_activate | Activate one provider so its tools become callable in this session. |
opendata_providers_deactivate | Remove an activated provider's tools from the current session catalog. |
opendata_providers_list_active | List currently active providers and the tool names each contributes. |
opendata_health_snapshot | Return per-provider health scores used by discovery health badges and routing context. |
opendata_plugins_draft | Build a validated plugin YAML spec from structured inputs. Takes id, base_url, tool definitions (name, endpoint, params), and registry metadata. Validates id/tool-name casing, path-placeholder/param consistency, and parameter types, then emits a YAML string ready to feed into opendata_plugins_create. Use this so the LLM never has to hand-author YAML. |
opendata_plugins_create | Autonomously create a new plugin. Takes a YAML spec (typically produced by opendata_plugins_draft), runs the generator, imports the new module, registers it in the live registry, and hot-loads its tools onto the running server. Use this when opendata_providers_find returns no match. |
opendata_tool_call | Proxy-call an activated plugin tool by name for environments that cannot directly invoke dynamically added tools. |
The reason this server is called "meta" is that it routes data requests on the user's behalf β including by creating the route when one doesn't exist yet. The full flow:
opendata_providers_find with the query (cve, vulnerability, β¦).opendata_providers_activate, or activate_top in find) and then calls the plugin tool.no_match: true and a next_step field that explains the autonomous creation path. The LLM:
opendata_plugins_draft with the API's id, base URL, and structured tool definitions. The server validates the inputs (id casing, path-placeholder consistency, parameter types) and returns a YAML string.opendata_plugins_create. The server materializes the plugin module + tests, imports the module, registers a ProviderEntry in the in-memory dynamic registry, and merges the new tools into the running server's tool list.The materialized plugin lives on disk (meta_data_mcp/providers/{id}.py + tests/providers/test_{id}.py); contributors can clean it up, add it to meta_data_mcp/registry.py as a static entry, and open a PR so it becomes part of every shipped install.
Every bundled plugin contributes its own tools under the one server. Their names are unique kebab-case identifiers, often using a provider-specific prefix (e.g. usgs-eq-feed-significant-week, frankfurter-latest, wikipedia-fetch-summary). The LLM discovers them through opendata_providers_find/opendata_providers_describe, activates the provider when needed, and can inspect session state with opendata_providers_list_active.
When opendata_plugins_create builds a new plugin, meta-data-mcp opens a
pull request contributing it back to the project so others can use it β the
catalogue grows from real usage.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/meta-data-mcp)<a href="https://allmcps.com/mcp/meta-data-mcp"><img src="https://allmcps.com/api/badge/meta-data-mcp?style=directory" alt="Meta Data MCP on AllMCPs" /></a>