Skip to main content
Glama
derekslinz

meta-data-mcp

by derekslinz

meta-data-mcp

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.

Why "meta"?

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:

  • The LLM calls opendata_providers_find ("FX rates", "court rulings", "earthquakes near Lisbon") and the server routes the query against an internal registry of every bundled plugin.

  • The LLM then calls the matching tool directly. No setup step in between, no separate servers, no per-provider install rituals.

This project was forked from opendata-mcp and reshaped around the single-server idea once the catalogue passed a few dozen plugins.

Related MCP server: ReefAPI MCP

Installation

You'll need uv (a Python package manager).

# macOS — install uv via Homebrew so MCP clients can find it
brew install uv

# Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Then register the server with every MCP client installed on your machine:

uv run meta-data-mcp setup

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:

uv run meta-data-mcp clients

Target a single client (or write to every supported client regardless of detection):

uv run meta-data-mcp setup --client claude-code
uv run meta-data-mcp setup --client all

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):

uv run meta-data-mcp setup --print-json

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.

Hosting meta-data-mcp as a remote SSE server

For 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.

CLI

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.

Server tools (what the LLM calls)

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:

  1. Meta tools — the 13 server-level tools below. They make routing transparent: the LLM uses them to find, activate, and (if needed) create the right plugin without you telling it which tool to call.

  2. Plugin tools — ~330 tools coming from the 90 bundled plugins. In the default discovery-only mode they are activated per provider at runtime (or preloaded via META_DATA_MCP_PRELOAD). The LLM picks one after consulting the meta tools.

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 autonomous discovery flow

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:

  1. User asks for data, e.g. "show me the most recent published CVEs."

  2. LLM calls opendata_providers_find with the query (cve, vulnerability, …).

  3. If the registry has a match: the LLM activates the matching provider (opendata_providers_activate, or activate_top in find) and then calls the plugin tool.

  4. If the registry has no match: the response includes no_match: true and a next_step field that explains the autonomous creation path. The LLM:

    1. Tells the user it's about to add coverage for this data source.

    2. Web-searches for an open API that exposes the requested data (e.g. the NVD or CIRCL CVE API).

    3. Calls 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.

    4. Passes that YAML to 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.

    5. Calls the newly-available tool to answer the user's original question.

  5. User gets their answer — and the plugin remains available for the rest of the session.

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.

Plugin tools

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.

Auto-contribution of created plugins

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.

  • Consent: if your MCP client supports elicitation, you'll get a yes/no prompt (default yes) before the PR is opened.

  • What's shared: only the three generated files (spec, provider module, test stub) on a contribute/plugin-<id> branch. Your working tree is never touched.

  • Opt out: set META_DATA_MCP_AUTO_CONTRIBUTE=0.

  • Target repo: derived from your origin remote; override with META_DATA_MCP_CONTRIBUTE_REPO=owner/repo.

  • Requires the gh CLI authenticated with push access. Without it, the branch is committed locally and the response tells you how to finish the PR.

Presentation layer (MCP Apps)

v2.0 adds a visual layer on top of every tool result. Hosts that support the MCP Apps extension (Claude Desktop, MCP Inspector, others) render bound tool results inline as interactive panels in a sandboxed iframe instead of as JSON text. Hosts that don't speak MCP Apps fall back to the same JSON they always got — the binding is purely additive.

Each MCP-Apps-aware tool declares its panel via _meta.ui.resourceUri on the tool description. The host fetches the ui:// resource (HTML + bundled JS, single payload, no external requests besides explicitly-whitelisted CDNs) and dispatches bidirectional postMessage events between the iframe and itself.

Shape primitives — ui://meta-data-mcp/shape/<name>/v1

Three reusable bundles cover the common payload contracts. Any tool whose response matches one of these shapes binds to the corresponding primitive automatically and gets a rich renderer for free.

Shape

Renders

Payload contract

timeseries/v1

Line chart + auto-computed profile (min/max/mean/stddev/gap-count) via Plotly.

{points: [{date, value, series?}], axes: {x, y}, annotations?}

geofeatures/v1

Leaflet map + marker cluster (with density layer for high-cardinality outputs).

`{features: GeoJSON

records/v1

Faceted, sortable, paginated HTML table + per-column auto-profile (type inference, top-k, null rate, range).

{rows: [...], schema?, default_facets?}

Custom apps — ui://meta-data-mcp/app/<name>/v1

Some data shapes don't fit a generic primitive. v2.0 ships dedicated apps for them:

App

Drives

Visualization

discovery/v1

opendata_providers_find, opendata_domains_list, opendata_regions_list, opendata_providers_activate, etc.

Faceted plugin browser with live health badges.

vulnerability/v1

nvd-*, osv-*, epss-*, cisa-kev.

CVSS radar + severity heatmap + exploitation-probability gauge.

entity-graph/v1

crossref-works-by-author, openalex-search-works, wikidata-search-entities, opensanctions-search.

Force-directed graph (D3) with co-authorship overlay.

trade-flows/v1

comtrade-trade-data.

Reporter → commodity → partner Sankey + commodity treemap.

news-tone/v1

gdelt-article-search, gdelt-volume-timeline.

Volume + tone timeline with country-pair chord diagram.

network-topology/v1

ripestat-asn-neighbours and friends.

Force-directed ASN peering/upstream/downstream graph.

molecular/v1

pubchem-compound, pdb-entry.

WebGL 3D structure viewer (3Dmol.js, cartoon for proteins, stick+sphere for ligands).

museum/v1

met-search, met-search-by-artist, met-get-object.

Lazy-loaded CSS-grid image gallery + provenance detail panel.

Building new apps

Adding a UI binding to a generated provider is now a one-line spec change:

tools:
  - name: my-tool
    description: ...
    endpoint: /foo
    response_shape: records   # ← binds to the shape primitive

See tools/specs/README.md for the full reference. Bundle-size budgets are enforced in CI (warn ≥ 100 KB, error ≥ 1 MB); the v2.0 bundles range from 14 KB (timeseries primitive) to 34 KB (vulnerability app), all comfortably inside the budget.

Citable answers

Every tool result carries a machine-readable citation manifest: exactly which upstream requests produced it. The transport kernel records each HTTP exchange during a tool call, and the result's first content block gains a _meta["meta-data-mcp/citations"] entry:

{
  "sources": [
    {
      "provider": "eu-eurostat",
      "title": "Eurostat",
      "homepage": "https://ec.europa.eu/eurostat",
      "license": "Eurostat data is reusable under CC BY 4.0; cite '© European Union, Eurostat'.",
      "url": "https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/nama_10_gdp?format=JSON&lang=en",
      "method": "GET",
      "status": 200,
      "fetched_at": "2026-07-09T14:02:11.482Z",
      "cache_hit": false
    }
  ]
}

This is what makes an LLM data answer auditable: the exact URL(s) — query parameters included — when they were fetched, whether they came from the transport cache, and the provider's license/attribution terms. Anyone can re-issue the URL and check the claim.

  • Secrets never leak. Values of sensitive query parameters are replaced with REDACTED — an exact denylist (api_key, token, appid, …) plus conservative heuristics (*key, *token, *secret*, *signature*, …) that also cover presigned cloud-storage URLs and plugin-specific key params. Userinfo credentials in the URL itself (https://user:pass@host) are redacted too; parameter names are preserved so the URL stays reproducible with your own credentials. Headers never enter the manifest.

  • Failed exchanges are cited too — a 4xx/5xx a handler recovered from, and the intermediate 429/5xx attempts the kernel's retry loop absorbed, are part of how the answer was produced; filter on status. (A tool call that errors out returns the SDK's isError result, which carries no manifest.)

  • Honest timestamps. fetched_at is when the bytes were actually fetched: cache-served exchanges report the original fetch time with cache_hit: true, not the cache-read time.

  • On by default. Set META_DATA_MCP_CITATIONS=0 to disable. Complements the opt-in tamper-evidence digest (META_DATA_MCP_PROVENANCE); both can coexist on the same result.

Bundled plugins (90)

This is what's inside the one server. You don't install these individually — they all come along.

Government / Civic

Plugin

Source

Description

au_data_gov

Australian Government Open Data

CKAN catalog at data.gov.au

ca_open_gov

Canada Open Data

CKAN catalog at open.canada.ca

ch_opendata_swiss

opendata.swiss

Swiss federal open-data catalog (CKAN)

de_govdata

GovData Germany

Germany's federal open-data catalog (CKAN)

fr_data_gouv

data.gouv.fr

French government open data platform

nl_tweedekamer

Tweede Kamer

Dutch Parliament open data

sg_data_gov

Singapore Open Data

data.gov.sg datasets and collections

uk_gov

data.gov.uk

UK government CKAN catalog

us_cary

Town of Cary Open Data

Town of Cary, NC open data via Socrata — public safety, transportation, utilities, parks

us_data_gov

Data.gov

US federal government open datasets

us_fayetteville

City of Fayetteville Open Data

City of Fayetteville, NC open data via Socrata — public safety, infrastructure, community services

us_raleigh

City of Raleigh Open Data

City of Raleigh open data via Socrata — public safety, infrastructure, parks, planning

Statistics / Economics

Plugin

Source

Description

eu_eurostat

Eurostat

European Union statistics

global_imf

International Monetary Fund

IMF SDMX 2.1 statistical data

global_faostat

FAOSTAT

UN food and agriculture statistics — production, prices, trade, land use, emissions

global_dbnomics

DBnomics

Global economic data aggregator (IMF, World Bank, etc.)

global_oecd

OECD

OECD economic & social statistics (SDMX)

global_world_bank

World Bank

Development indicators by country

nl_cbs

Statistics Netherlands (CBS)

Dutch statistical datasets (OData v2/v3)

uk_ons

UK ONS

UK Office for National Statistics

Finance / Markets

Plugin

Source

Description

eu_ecb

European Central Bank

ECB data portal (SDMX) — FX, monetary, banking

global_coingecko

CoinGecko

Cryptocurrency market data

global_frankfurter

Frankfurter

ECB reference FX rates (key-less)

us_sec_edgar

SEC EDGAR

Public company filings, XBRL financials

us_treasury_fiscal

US Treasury Fiscal Data

Federal debt, daily Treasury statement, FX rates

Health & Life Sciences

Plugin

Source

Description

global_chembl

ChEMBL

EMBL-EBI molecule and bioactivity database

global_disease_sh

disease.sh

COVID-19, influenza, vaccine aggregator

global_pubchem

NCBI PubChem

Chemical compounds and substances

global_rcsb_pdb

RCSB PDB

3D protein and macromolecular structures

global_who_gho

WHO GHO

WHO Global Health Observatory (OData)

us_cdc_socrata

US CDC

CDC open data via Socrata

us_clinicaltrials

ClinicalTrials.gov

NIH/NLM clinical trials registry v2

us_fda_openfda

openFDA

FDA adverse events, recalls, labels

us_healthdata_gov

HealthData.gov

HHS open health data via Socrata — outcomes, insurance, demographics, public health

Earth Science / Weather / Environment

Plugin

Source

Description

eu_copernicus

Copernicus (EU)

European Earth observation and climate datasets

global_open_meteo

Open-Meteo

Weather forecast + historical + air quality

global_openaq

OpenAQ

Global air-quality measurements from reference monitors and sensors

us_ncdeq_gis

NC DEQ Environmental GIS

NC Dept. of Environmental Quality ArcGIS Hub — permits, air/water quality, hazardous waste

us_noaa_ncei

NOAA NCEI

Climate data access services (key-less)

us_noaa_tides

NOAA Tides & Currents

Water levels, tides, currents

us_usgs_earthquake

USGS Earthquakes

Real-time and historical seismic events

Biodiversity / Space / Physics

Plugin

Source

Description

cern_opendata

CERN Open Data

Particle physics datasets and software

global_gbif

GBIF

Global biodiversity occurrence records

global_inaturalist

iNaturalist

Citizen-science species observations

global_opensky

OpenSky Network

Live ADS-B flight tracking

global_solarsystem

Le Systeme Solaire API

Open solar-system object and body metadata

us_nasa

NASA

APOD, Near Earth Objects, Mars rover photos

Geo / Mapping / Knowledge

Plugin

Source

Description

global_mcp_registry

MCP Server Registry

Official MCP server registry — search and list published MCP servers

global_osm_nominatim

OSM Nominatim

Geocoding / reverse-geocoding (1 req/sec)

global_overpass

OSM Overpass

Query OpenStreetMap with Overpass QL

global_rest_countries

REST Countries

Country reference data — borders, capitals, currencies, languages, populations

global_wikidata

Wikidata

Structured knowledge graph + SPARQL

global_wikipedia

Wikipedia

Article summaries, related, page views

us_arcgis_item

ArcGIS REST API

Fetch public ArcGIS item metadata by ID — layers, maps, services, files

us_census_geocoder

US Census Geocoder

Address ⇄ coordinates ⇄ geographies

us_nc_onemap

NC OneMap

NC's authoritative GIS clearinghouse via ArcGIS REST — statewide geographic layers

Agriculture / Trade

Plugin

Source

Description

global_un_comtrade

UN Comtrade

International merchandise and services trade statistics

Security / Vulnerability

Plugin

Source

Description

eu_euvd

ENISA EUVD

Latest, exploited, critical, and filtered EU vulnerability search

global_circl_cve

CIRCL CVE Search

Recent CVEs, CVE details, and vendor/product browsing

global_crtsh

crt.sh

Certificate transparency search for domains and certificates

global_epss

FIRST.org EPSS

Exploit prediction scores and percentile ranks for CVEs

global_nvd_cve

NVD CVE Database

NIST CVE records, filters, and change history

global_opensanctions

OpenSanctions

Sanctions, PEP, debarment, and related risk datasets

global_osv_dev

OSV.dev

Open source vulnerability advisories across ecosystems

global_pwned_passwords

Pwned Passwords

Anonymous breached-password SHA-1 prefix lookups

global_ssllabs

SSL Labs

Public TLS configuration and endpoint analysis

us_cisa_kev

CISA KEV

Known Exploited Vulnerabilities catalog with remediation deadlines

Transit / Aviation

Plugin

Source

Description

ch_sbb

Swiss Federal Railways

Swiss train disruptions and service data

global_transitous

Transitous

Worldwide transit journey planning — travel times, transfers, itineraries (MOTIS over open GTFS)

de_db

Deutsche Bahn

German railway open data

nl_ndov

NDOV Loket

Dutch public transport data

nl_ovapi

OVapi

Live Dutch transit — real-time departures, vehicle positions, GTFS/GTFS-RT feeds

us_faa_nasstatus

FAA NAS Status

US airspace status, delays, ground stops (XML)

us_noaa_awc

NOAA Aviation Weather

METAR, TAF, and station weather data

Scholarly Literature

Plugin

Source

Description

global_arxiv

arXiv

Preprint metadata (Atom XML)

global_crossref

Crossref

DOI metadata, citations, journals

global_doaj

DOAJ

Open-access journal and article search

global_europepmc

Europe PMC

Biomedical literature + fulltext XML

global_openalex

OpenAlex

Open scholarly metadata

Culture / Books

Plugin

Source

Description

global_met_museum

Met Museum

Met Museum Open Access (CC0)

global_open_library

Open Library

Books, authors, works (Internet Archive)

global_unesco_heritage

UNESCO World Heritage Sites

Natural, cultural & mixed World Heritage Sites

News / Media

Plugin

Source

Description

global_gdelt

GDELT 2.0

Global news, event, and tone monitoring across 100+ languages

global_hackernews

Hacker News API

Public stories, comments, jobs, and user profiles

Networking / Internet

Plugin

Source

Description

global_bgpview

BGPView

BGP routing data — ASN info, prefixes, peers (key-less)

global_ripe_stat

RIPE NCC RIPEstat

Production-grade BGP data (key-less)

Plugin

Source

Description

nl_rechtspraak

Dutch Rechtspraak

Dutch court rulings and case law (ECLI)

uk_legislation

UK legislation.gov.uk

UK Acts, statutory instruments (XML/Atom)

us_courtlistener

CourtListener

US court opinions, dockets, judges (Free Law Project)

us_federal_register

US Federal Register

Daily rules, notices, executive orders

Optional environment variables

A few bundled plugins accept optional API keys for higher rate limits. Set these in your shell or in the Claude Desktop server config's env block:

Variable

Plugin

Purpose

COURTLISTENER_API_TOKEN

us_courtlistener

Anonymous access works at low volumes

NVD_API_KEY

global_nvd_cve

Raises NVD API rate limits

META_DATA_MCP_CONTACT

all

Your email, used in User-Agent for polite-pool APIs (Crossref, OpenAlex, OSM, SEC EDGAR). Defaults to meta-data-mcp@example.org.

OPENAQ_API_KEY

global_openaq

Enables authenticated OpenAQ API access

OPENSANCTIONS_API_KEY

global_opensanctions

Enables authenticated OpenSanctions API access

UN_COMTRADE_API_KEY

global_un_comtrade

Enables higher-tier UN Comtrade API access

Server runtime flags

Variable

Purpose

META_DATA_MCP_PRELOAD

Comma-separated plugin ids to activate at startup, or * for all. Default unset = discovery-only (~13 meta tools).

META_DATA_MCP_AUTH_TOKEN

When set on the SSE transport, requires Authorization: Bearer <token> on /sse and /messages.

META_DATA_MCP_OAUTH_ISSUER

Enable OAuth 2.0 Authorization Code + PKCE. Set to the server's public base URL (e.g. http://localhost:8000). Mounts /.well-known/oauth-authorization-server, /register, /authorize, /token, /revoke, and a consent page at /oauth/consent. Coexists with META_DATA_MCP_AUTH_TOKEN — both auth methods remain valid simultaneously.

META_DATA_MCP_OAUTH_MAX_CLIENTS

Maximum number of registered OAuth clients kept in memory. Default 1000. Must be a positive integer; invalid values fall back to the default.

META_DATA_MCP_OAUTH_TOKEN_TTL

OAuth access-token lifetime in seconds. Default 3600 (1 hour). Must be a positive integer; invalid values fall back to the default.

META_DATA_MCP_CITATIONS

Citation manifest on tool results (see Citable answers). Default on; set to 0/false/no/off to disable. Adds a meta-data-mcp/citations entry to the first content block's _meta listing every upstream HTTP exchange (redacted URL, status, fetch timestamp, cache disposition, provider title/homepage/license).

META_DATA_MCP_PROVENANCE

Truthy (1, true, yes, on) enables a meta-data-mcp/provenance entry on every tool-call result's first content block's _meta, carrying sha256 and timestamp (ISO 8601 UTC, ms precision). The digest covers the canonical (tool, arguments, content) envelope — content blocks dumped via model_dump(mode="json", by_alias=True, exclude_none=True) with _meta stripped, JSON-serialized with sort_keys=True, separators=(",",":"), ensure_ascii=True. Binding tool name + arguments into the hash means audit logs can distinguish "tool A returned X" from "tool B returned X". Default off — opt in when you need tamper-evidence. See meta_data_mcp/provenance.py module docstring for the verbatim receiver recipe.

Transports

run defaults to SSE (HTTP, port 8000) so you can connect from the MCP Inspector or remote clients. For Claude Desktop (which the setup command targets), the spawned process uses stdio:

uv run meta-data-mcp run                                  # SSE on 127.0.0.1:8000
uv run meta-data-mcp run --transport stdio                # stdio
uv run meta-data-mcp run --host 0.0.0.0 --port 3001       # SSE bound to all interfaces

Roadmap

Shipped

  • Hierarchical discovery (v2.0): opendata_providers_find with ranked scoring replaces the originally-planned browse/list tools.

  • Agent-driven generation (v2.1): opendata_plugins_draft + opendata_plugins_create let the model close coverage gaps autonomously. Hardened in v2.1.1 with input allowlists, path containment, and a post-generation AST validator (14 RCE/path-traversal/bypass paths closed).

  • Self-hosted SSE deployment (v2.1): bearer-auth-protected, systemd-managed, reverse-proxied.

  • Multi-language SDK (v2.2): Python embedded client (meta_data_mcp.sdk) and TypeScript/Node client (@meta-data-mcp/sdk) for discovery over MCP SSE.

  • OAuth 2.0 (v2.3): Authorization Code + PKCE + Dynamic Client Registration. Works with Claude.ai (StreamableHTTP) and MCP Inspector. /.well-known/oauth-authorization-server, /.well-known/oauth-protected-resource, and /.well-known/openid-configuration all served.

  • MCP registry provider (v2.3.4): mcp_registry_search and mcp_registry_list — discover other MCP servers from within meta-data-mcp. Listed on the official MCP registry and Smithery.

Still ahead

  • Expand provider coverage beyond the current 90.

Credits

License

MIT — see LICENSE.

Available Tools

15 tools
opendata_domains_listList DomainsA
Read-onlyIdempotent

List the controlled domain vocabulary used by the provider registry (e.g. 'health', 'legal', 'finance', 'earth-science').

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
domainsNo

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only and idempotent behavior. The description adds context about the vocabulary being controlled, but does not disclose any additional behavioral traits beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single concise sentence that is front-loaded with the action and includes examples. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema and no parameters, the description fully covers the purpose and scope. Examples provide additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, so schema coverage is 100%. The description does not need to add parameter details. Baseline 4 for zero parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists a controlled domain vocabulary, with specific examples ('health', 'legal', etc.). It is distinct from sibling tools like opendata_providers_list, which list providers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it i.e., when needing the domain vocabulary. It does not explicitly state when not to use it or provide alternatives, but for a simple list tool, this is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opendata_explain_choiceExplain ChoiceA
Read-onlyIdempotent

Explain the scoring breakdown for a provider search. Shows how each provider was ranked using token matching, fuzzy matching, semantic similarity, and metadata filters.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of top providers to explain (1-20, default 5).
queryNoThe original search query to explain scoring for.
domainNoDomain filter used in search.
regionNoRegion filter used in search.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the tool is known to be safe. The description adds substantive behavioral detail by listing the scoring components (token matching, fuzzy matching, semantic similarity, metadata filters), which goes beyond what annotations provide. It does not mention edge cases like null query, but this is not a major gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long, front-loaded with the main purpose, and contains no filler. Every sentence earns its place, making it highly concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with no output schema, the description is fairly complete. It explains the tool's purpose and what it shows, though it does not describe the exact return format. Given the simplicity of the tool and high schema coverage, this is adequate but not exhaustive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters. The description does not add significant meaning beyond indicating these parameters relate to the original search and filters, but it does not compensate beyond the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Explain' and clearly identifies the resource ('the scoring breakdown for a provider search'). It distinguishes this tool from sibling tools like opendata_providers_find (which presumably performs the search) and opendata_federate_compare (which compares federated results).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies the tool is used after a provider search to understand ranking, but it does not explicitly mention alternatives or when not to use it. It provides clear context without exclusions, which aligns with a 4.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opendata_federate_compareCompare Coverage Across ProvidersA
Read-onlyIdempotent

Federate several plugin tool calls and report a coverage matrix — which sources cover which geographies and periods — alongside the merged series. Use this to spot gaps or disagreements between open-data sources.

ParametersJSON Schema
NameRequiredDescriptionDefault
queriesNoSub-calls to run and harmonize. Each names a plugin tool and its arguments; results are normalized onto a common geography + time axis and merged.
harmonizeNoWhich axes to normalize. {'geo': true, 'time': true} by default — set either false to pass that axis through raw.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is clear. The description adds that it makes sub-calls to plugin tools, which is already in the schema. It does not add significant behavioral detail beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with purpose, no wasted words. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but the description outlines the outputs (coverage matrix and merged series). For a federated tool, it is fairly complete, though could mention potential performance or timeout considerations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, baseline is 3. The description adds meaningful context: 'queries' sub-calls are normalized onto a common geography + time axis, and 'harmonize' controls which axes are normalized. This clarifies the merging behavior beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool federates plugin tool calls and reports a coverage matrix alongside merged series, with a specific use case ('spot gaps or disagreements'). It distinguishes from sibling tools like opendata_federate_query by adding coverage reporting.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear context for use ('spot gaps or disagreements between open-data sources'), but does not explicitly state when not to use or provide alternatives. The differentiation from opendata_federate_query is implied but not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opendata_federate_queryFederate & Harmonize Across ProvidersA
Read-onlyIdempotent

Run several plugin tool calls, normalize their results onto a common geography + time axis, and merge them into one cited series. Auto-activates each query's provider. Use this to overlay the same indicator from different open-data sources (e.g. Eurostat vs World Bank) in a single answer.

ParametersJSON Schema
NameRequiredDescriptionDefault
queriesNoSub-calls to run and harmonize. Each names a plugin tool and its arguments; results are normalized onto a common geography + time axis and merged.
harmonizeNoWhich axes to normalize. {'geo': true, 'time': true} by default — set either false to pass that axis through raw.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint and idempotentHint. The description adds value by explaining normalization and merging behavior, auto-activation of providers, and that output is a 'cited series'. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences: defining action, noting auto-activation, and providing a usage example. It is concise, front-loaded, and every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (nested sub-queries, no output schema), the description explains orchestration well. It covers purpose, usage, and key behaviors. Missing details on error handling or output structure, but adequate for selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds context about normalization and merging but doesn't add significant parameter-specific meaning beyond the schema. It explains the harmonize parameter implicitly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: run multiple plugin tool calls, normalize results onto common geography/time axes, and merge into one cited series. It distinguishes from siblings like opendata_tool_call (single call) and opendata_federate_compare (comparison) by specifying overlay of same indicator from different sources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says 'Use this to overlay the same indicator from different open-data sources' with examples (Eurostat vs World Bank). It implies when to use but lacks explicit when-not or alternatives. The auto-activation note adds context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opendata_health_snapshotHealth SnapshotA
Read-onlyIdempotent

Snapshot the in-memory provider health registry. Returns a score in [0.0, 1.0] for each requested provider (or every registered provider when called without arguments). Health degrades on recent 5xx / 429 / network failures and decays back toward 1.0 over ~5 minutes; 401/403 are excluded as caller misconfig. The discovery app uses this to paint live health badges next to each search result.

ParametersJSON Schema
NameRequiredDescriptionDefault
provider_idsNoOptional list of provider ids to query. When omitted, returns snapshots for every provider in the static + dynamic registry. Providers with no recorded failures default to a fully-healthy baseline (score 1.0).

Output Schema

ParametersJSON Schema
NameRequiredDescription
snapshotNo
generated_atNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds significant behavioral details beyond annotations: health degrades on 5xx/429/network errors, decays over 5 minutes, excludes 401/403. This complements idempotentHint and readOnlyHint well.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (3 sentences), front-loaded with the primary action, and every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given one optional parameter and output schema present, the description fully covers behavior with/without arguments, failure recovery, and use case. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description adds context: optional provider_ids default to null, behavior when omitted (returns all providers), and baseline score for healthy providers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool snapshots the in-memory provider health registry and returns a score per provider, distinguishing it from sibling tools like opendata_providers_list which list providers without health context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use (to get health scores for one or all providers) and provides business context (painting health badges), but does not explicitly state when not to use or compare to alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opendata_plugins_createCreate PluginA

Autonomously create a new plugin for this meta-data-mcp server from a YAML spec. Use this when opendata_providers_find returned no match. Recommended flow: first call opendata_plugins_draft with structured fields to get a valid YAML spec, then pass it here. The new plugin is materialized to disk, imported, registered in the live registry, and its tools become available immediately. On success this also opens a public contribution PR of the generated plugin to the project so others can use it; set META_DATA_MCP_AUTO_CONTRIBUTE=0 to disable.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainsNoRegistry domains for the new plugin (e.g. ['security']). Use `opendata_domains_list` to see existing values, but new domain names are allowed.
regionsNoRegistry regions for the new plugin (e.g. ['global', 'us']). Use `opendata_regions_list` to see existing values.
keywordsNoSearch keywords that should match this plugin.
spec_yamlYesFull YAML spec for the new plugin. Must include id, server_name, base_url, description, homepage, and at least one tool. See tools/specs/example_weather_alert.yaml for the canonical form.
license_noteNoOptional short licensing/attribution note for the data source.
requires_envNoNames of any environment variables the new plugin needs (e.g. API keys). Leave empty for keyless APIs.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds significant behavioral context beyond annotations: materialization to disk, import, registration, immediate availability, and auto PR. Annotations only indicate destructiveHint=false, so description adds value without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise paragraph with each sentence adding value: purpose, when to use, recommended flow, effects, and configuration hint. No redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete coverage given tool complexity: describes side effects, prerequisite flow, and configuration. References other tools for context. No output schema needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all 6 parameters with descriptions (100% coverage), so baseline is 3. The description does not add extra parameter-specific details beyond what's in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates a new plugin from a YAML spec, specifies the verb 'create' and resource 'plugin', and distinguishes from siblings by referencing opendata_providers_find and opendata_plugins_draft.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use the tool ('when opendata_providers_find returned no match') and provides a recommended flow involving opendata_plugins_draft, plus mentions environment variable to disable auto-contribution.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opendata_plugins_draftDraft SpecA
Read-onlyIdempotent

Build a validated YAML plugin spec from structured inputs. Use this BEFORE opendata_plugins_create to avoid hand-writing YAML. Validates id format, kebab-case tool names, path-placeholder/param consistency, parameter types, and response format. Returns the YAML string ready to feed into opendata_plugins_create.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPlugin id in snake_case, e.g. 'global_nvd_cve'. Becomes the Python module name under meta_data_mcp/providers/.
titleYesHuman-readable title for the registry entry.
toolsYesAt least one tool definition. Each becomes one MCP tool on the server.
domainsNoRegistry domains (e.g. ['security', 'government']).
regionsNoRegistry regions (e.g. ['global', 'us']).
base_urlYesAPI base URL with no trailing slash (e.g. 'https://services.nvd.nist.gov').
homepageYesURL to the API documentation or provider homepage.
keywordsNoSearch keywords that should match this plugin in opendata_providers_find.
descriptionYesOne- or two-sentence description of what this plugin covers.
server_nameNokebab-case server name for the plugin registry entry. Defaults to id with underscores replaced by hyphens.
requires_envNoNames of environment variables this API needs (e.g. ['NVD_API_KEY']).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint and idempotentHint. Description adds value by listing validations performed (id format, kebab-case, consistency checks) and output format, which are beyond the annotation scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with main purpose, then usage guidance, validation details, and output. Every sentence serves a purpose with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (11 parameters, no output schema), the description adequately covers purpose, usage, validations, and output. It is sufficient for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with detailed descriptions for all 11 parameters. Tool description does not add extra parameter information, but baseline is 3 when schema is complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Build a validated YAML plugin spec from structured inputs' with specific verb and resource. It also distinguishes from sibling 'opendata_plugins_create' by stating usage order.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this BEFORE opendata_plugins_create to avoid hand-writing YAML', providing clear context and alternative. Does not explicitly state when not to use, but the guidance is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opendata_providers_activateActivate ProviderA
Idempotent

Activate a registered provider so its tools become callable in this session. By default the server starts in discovery-only mode — only meta tools (find-providers, list-providers, etc.) are advertised. Activation imports the plugin module and merges its tools into the advertised list, then sends a tools/list_changed notification so the client refetches its catalog. Idempotent.

ParametersJSON Schema
NameRequiredDescriptionDefault
provider_idYesProvider id to activate (e.g. 'us_data_gov' or 'us-data-gov'). Use opendata_providers_find or opendata_providers_list to discover available ids.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusNo
provider_idNo
tools_addedNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the idempotentHint annotation, the description details side effects: imports plugin, merges tools, sends tools/list_changed notification. This adds significant behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no waste. The key purpose is front-loaded, and every sentence adds necessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a single parameter and an output schema, the description covers activation behavior, idempotency, and client notification fully. No gaps are apparent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and schema describes provider_id. The description adds value by advising to use opendata_providers_find or list for discovery, which aids parameter selection.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool activates a registered provider to make its tools callable. It uses specific verb and resource ('activate a registered provider') and distinguishes from sibling tools like opendata_providers_deactivate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains activation is needed because the server starts in discovery-only mode. It implies when to use but doesn't explicitly list when not to use or alternatives beyond mentioning idempotency.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opendata_providers_deactivateDeactivate ProviderA
Idempotent

Remove a previously-activated provider's tools from the session's advertised list. The Python module remains imported (Python caches modules) but its tools no longer appear in tools/list. A tools/list_changed notification is sent so the client refetches.

ParametersJSON Schema
NameRequiredDescriptionDefault
provider_idYesProvider id to deactivate.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusNo
provider_idNo
tools_removedNo

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the 'idempotentHint' annotation, the description discloses that the Python module remains imported (due to caching) and that a 'tools/list_changed' notification is sent. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the primary action, no filler. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and an output schema (as indicated by context signals), the description fully covers behavioral effects and side effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the description adds no additional meaning beyond the schema's 'Provider id to deactivate.' Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'remove' and the resource 'previously-activated provider's tools', specifying the effect on the advertised list. It distinguishes from the sibling 'opendata_providers_activate' by implying the inverse operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly indicates when to use (deactivate a provider) and contrasts with activation, but does not explicitly provide when-not-to-use or alternatives. It gives clear context for usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opendata_providers_describeDescribe ProviderA
Read-onlyIdempotent

Fetch the full registry entry for a single provider id — title, description, domains, regions, keywords, homepage, license note, required environment variables.

ParametersJSON Schema
NameRequiredDescriptionDefault
provider_idYesThe provider id (e.g. 'us_nasa', 'global_world_bank', 'us_courtlistener').

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
titleNo
domainsNo
regionsNo
homepageNo
descriptionNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true and idempotentHint=true, and the description's 'Fetch' aligns with these. The description adds value by enumerating the returned fields (title, description, domains, etc.), providing context beyond the annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that concisely conveys purpose and return fields without any fluff. Every part is informative and earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists (implied), the description adequately covers the tool's behavior. It lists the key fields returned and makes clear that this is a simple lookup by provider ID. No additional information is needed for this straightforward operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the input schema already includes a clear description of the required parameter 'provider_id' with examples. The description does not add additional meaning beyond what the schema provides, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Fetch' and clearly identifies the resource as 'full registry entry for a single provider id', listing the included fields: title, description, domains, regions, keywords, homepage, license note, required environment variables. This clearly distinguishes it from sibling tools like opendata_providers_list (which lists multiple) and opendata_providers_find (which likely searches).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly state when to use this tool versus alternatives like opendata_providers_find or opendata_providers_list. It implies usage for fetching details of a single provider by ID, but lacks guidance on when not to use it or what exclusions apply.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opendata_providers_findFind ProvidersA
Read-onlyIdempotent

Search the meta-data-mcp plugin registry. Returns plugins that match a free-text query and/or domain/region filters. Use this FIRST when you don't know which plugin can answer a question. If no plugin matches, the response includes a next_step field that explains how to autonomously create one via opendata_plugins_create.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of providers to return (1-100, default 20).
queryNoFree-text query. Matched against id, title, description, keywords, domains, regions. Tokens with exact keyword hits score higher.
domainNoRestrict to providers tagged with this domain (e.g. 'health', 'legal', 'finance'). Use opendata_domains_list to enumerate.
regionNoRestrict to providers tagged with this region (e.g. 'us', 'eu', 'uk', 'global'). Use opendata_regions_list to enumerate.
activate_topNoIf > 0, automatically activate the top-N matching providers so their tools become callable in this session. Default 0 means find-providers is read-only — you must call opendata_providers_activate explicitly to load tools.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the description need not restate. It adds useful context about the next_step field for no matches. However, it fails to disclose that setting activate_top > 0 will activate providers, a side effect that contradicts the read-only implication of the default. Though the schema documents this, the description omits it, leaving a transparency gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each substantive: purpose, when-to-use, and fallback behavior. No redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the discovery use case and the no-match fallback, and references an alternative creation tool. However, it omits the activate_top parameter's side effect, which is significant for an agent deciding whether to use this tool. The rich schema partially compensates, but the description is not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides full descriptions for all 5 parameters, achieving 100% schema description coverage. The description's mention of 'free-text query and/or domain/region filters' merely echoes schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Search the meta-data-mcp plugin registry' with a specific verb and resource. It distinguishes itself from sibling tools by describing filtered search functionality and explicitly says to 'Use this FIRST when you don't know which plugin can answer a question.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs when to use: 'Use this FIRST when you don't know which plugin can answer a question.' Also provides an alternative path by mentioning that if no plugin matches, the response includes a next_step field explaining how to autonomously create one via opendata_plugins_create.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opendata_providers_listList ProvidersA
Read-onlyIdempotent

Enumerate all providers in the opendata-mcp registry (paginated, terse). Returns id, title, domains, regions, and any required env vars per provider.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of entries to return (1-200, default 50).
offsetNoNumber of entries to skip (default 0).

Output Schema

ParametersJSON Schema
NameRequiredDescription
limitNo
totalNo
offsetNo
providersNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations confirm read-only and idempotent behavior. Description adds important behavioral details: pagination, terse output, and inclusion of env vars per provider, which exceeds annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence efficiently conveys purpose, pagination, terse nature, and return fields—no superfluous words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a paginated list tool with complete schema coverage, an output schema, and clear return field description, the description is fully adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with well-described limit and offset parameters. Description mentions pagination generically but adds no new semantic detail beyond schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Enumerate all providers in the opendata-mcp registry' with specific return fields, effectively distinguishing from siblings like opendata_providers_list_active which presumably filters only active ones.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description implies full listing but does not explicitly advise when to use this tool over alternatives like opendata_providers_list_active, leaving the agent to infer from sibling names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opendata_providers_list_activeList Active ProvidersA
Read-onlyIdempotent

List the providers currently activated in this session, along with the tool names each contributes. Useful for inspecting why a particular tool is (or isn't) advertised.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
meta_tool_countNo
active_providersNo
plugin_tool_countNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds context beyond annotations: it specifies that the tool returns currently activated providers and the tool names they contribute. This aligns with the readOnlyHint and idempotentHint annotations, and no contradictions are present. The behavioral insight into inspection of tool advertising adds value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loading the core action ('List the providers') followed by a practical usage scenario. Every sentence contributes meaning without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of parameters, the presence of annotations (readOnly, idempotent), and an output schema (not shown), the description sufficiently explains the tool's function and usage. It is complete within its context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no parameters and 100% coverage, so the description does not need to elaborate. The baseline for zero parameters is 4, and the description appropriately omits parameter details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists active providers with their contributed tool names, distinguishing it from sibling 'opendata_providers_list' which likely lists all providers. The specific verb 'list' and resource 'active providers' make the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a usage hint: 'Useful for inspecting why a particular tool is (or isn't) advertised.' This implies when to use, but it does not explicitly contrast with alternatives like opendata_providers_list or opendata_providers_describe. A more direct comparison would strengthen this dimension.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opendata_regions_listList RegionsA
Read-onlyIdempotent

List the controlled region vocabulary used by the provider registry (e.g. 'us', 'eu', 'uk', 'global').

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds the context that this is a controlled vocabulary with examples, but doesn't disclose further behavioral details like pagination or return format. This is acceptable given the annotations and simplicity, but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that front-loads the action and includes examples. Every word earns its place with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only list tool, the description is completely adequate. It explains what the tool returns (a list of region codes) and provides examples, without needing to explain return values or side effects. No output schema exists, but the description covers the key information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and schema coverage is 100% (nothing to document). The description explicitly notes 'no parameters' in the schema and doesn't need to add parameter details. Baseline for 0 params is 4, and no additional explanation is necessary.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists a controlled region vocabulary for the provider registry, with concrete examples ('us', 'eu', 'uk', 'global'). The verb 'List' and resource are specific, and it distinguishes itself from sibling tools focused on providers or queries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context by noting the vocabulary is 'used by the provider registry', making it clear this is a reference for valid region values. It doesn't explicitly mention alternatives or exclusions, but for a simple list tool, this is adequate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opendata_tool_callCall Activated ToolA
Read-onlyIdempotent

Proxy any activated plugin tool by name. Use this when dynamically activated tools aren't directly callable in your environment. First activate the provider with opendata_providers_activate, then call this tool with the tool name and arguments from the activation response's tool_schemas field.

ParametersJSON Schema
NameRequiredDescriptionDefault
argumentsNoArguments to pass to the tool, matching its inputSchema.
tool_nameYesExact name of an activated plugin tool to call (e.g. 'nvd-search-cves'). Use opendata_providers_activate first, then pass the tool name from its 'tools' list.

TDQS

A4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds context about activation requirements but contradicts the annotations. The tool is described as calling dynamic tools, which may write or mutate data, yet annotations set readOnlyHint=true and idempotentHint=true. This is a significant inconsistency that misleads about the tool's side effects. Without the contradiction, the description would score higher for explaining the proxy mechanism.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each serving a distinct purpose: stating functionality, explaining use case, and providing workflow steps. No redundant or unnecessary text. Highly efficient and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool is a proxy with no output schema, the description adequately explains the prerequisite activation and how to obtain the tool name. However, it does not address error handling (e.g., what if the target tool fails) or confirm the idempotency hinted by annotations. Slight gap but mostly complete for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 100% coverage, so baseline is 3. The description adds valuable meaning for 'tool_name' by specifying it should come from the activation response's 'tools' list and providing an example ('nvd-search-cves'). For 'arguments', only minimal restatement. Overall, description improves understanding of parameter origin and usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Proxy any activated plugin tool by name.' It distinguishes itself from sibling tools by explaining it is for dynamically activated tools that aren't directly callable. The verb 'proxy' and resource 'activated plugin tool' are specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use: 'when dynamically activated tools aren't directly callable in your environment.' It also provides a clear two-step workflow: first activate with opendata_providers_activate, then call with tool name and arguments. However, it does not explicitly mention alternatives or when not to use, which would improve guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv3.3.0
    • Changedopendata_explain_choice1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "query": {
        -      "type": [
        -        "string",
        -        "null"
        -      ]
        -    },
        -    "results": {
        -      "items": {
        -        "type": "object"
        -      },
        -      "type": "array"
        -    }
        -  },
        -  "type": "object"
        -}New value: +null
    • Changedopendata_providers_find1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "count": {
        -      "type": "integer"
        -    },
        -    "next_step": {
        -      "type": "string"
        -    },
        -    "no_match": {
        -      "type": "boolean"
        -    },
        -    "providers": {
        -      "items": {
        -        "type": "object"
        -      },
        -      "type": "array"
        -    }
        -  },
        -  "type": "object"
        -}New value: +null
    • Changedopendata_regions_list1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "regions": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    }
        -  },
        -  "type": "object"
        -}New value: +null
  2. 2 tool updatesv3.2.0
    • Addedopendata_federate_compare
    • Addedopendata_federate_query
  3. 13 tool updatesv0.1.0
    • First observedopendata_domains_list
    • First observedopendata_explain_choice
    • First observedopendata_health_snapshot
    • First observedopendata_plugins_create
    • First observedopendata_plugins_draft
    • First observedopendata_providers_activate
    • First observedopendata_providers_deactivate
    • First observedopendata_providers_describe
    • First observedopendata_providers_find
    • First observedopendata_providers_list
    • First observedopendata_providers_list_active
    • First observedopendata_regions_list
    • First observedopendata_tool_call

TDQS

A4.3/5.0

Scored across 15 tools

Disambiguation5/5

Every tool serves a distinct purpose: provider discovery vs activation vs health, plugin drafting vs creation, federated query vs comparison. Even the two federate tools are clearly separated by output (merged series vs coverage matrix). No two tools appear to duplicate each other.

Naming Consistency4/5

The vast majority follow the 'opendata_<resource>_<verb>' pattern (e.g., providers_list, plugins_create, health_snapshot). However, three tools deviate with verb-object order (federate_query, federate_compare, explain_choice), which is a minor inconsistency in an otherwise readable and predictable scheme.

Tool Count5/5

15 tools is at the upper edge of the ideal range but perfectly appropriate for the server's scope: it manages providers, plugins, health monitoring, federation, and vocabulary. Each tool earns its place with a clear role, and none feel redundant or excessive.

Completeness4/5

The core workflows are well covered: discover providers, activate/deactivate, run federated queries, and create new plugins. The only minor gaps are the absence of an explicit update/delete lifecycle for plugins (though plugin creation is the intended path) and no unregister operation for providers beyond deactivation. These do not prevent typical agent workflows.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    A meta-MCP server that acts as a universal gateway, allowing users to discover and execute tools from thousands of other MCP servers through semantic search. It dynamically loads servers on demand and provides standardized functions for searching, discovering, and running tools across the entire MCP ecosystem.
    6
    -
  • A
    license
    A
    quality
    C
    maintenance
    One MCP server providing access to 160+ live web data APIs (search, social media, e-commerce, real estate, jobs, travel, news, finance, and more) using dynamic discovery via 4 generic tools to avoid the agent's tool limit.
    5
    3
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    A comprehensive MCP server that makes official UAE open data queryable through natural language, offering tools for source discovery, dataset search, spatial joins, and intelligence recipes.
    55 npm
    MIT