OECD MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@OECD MCP Serversearch for PISA data"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Public Hosted Server: https://oecd.caseyjhand.com/mcp
Overview
OECD statistical data via the SDMX 2.1 REST API — 1,500+ dataflows spanning national accounts, employment, trade, education, and health. Search datasets, inspect their dimensions, resolve codes, and query observations, with large multi-country time-series spilling to a queryable DataCanvas table for SQL analysis. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.
Tools
Five discovery and data tools plus three DataCanvas tools for large query results:
Tool | Description |
| List OECD SDMX agencies with their directorate and the number of dataflows each publishes |
| Search 1,500+ OECD dataflows by keyword or theme |
| Fetch a dataflow's dimensions, key order, and codelist references |
| Fetch valid codes and labels for one dimension (countries, measures, frequencies) |
| Fetch observations filtered by dimension key and time range; spills large results to DataCanvas |
| List DataCanvas tables and columns staged by a prior |
| Run a read-only SQL SELECT against DataCanvas tables |
| Drop a staged DataCanvas table or view once the analysis is done — opt-in via |
Resources
Resource | Description |
| Dimension metadata for a single OECD dataflow — same content as |
All resource data is also reachable via tools. Use oecd_get_dataset_info for the same content.
Related MCP server: OECD Stats MCP
Capability reference
oecd_list_agencies tool
No inputs; returns every agency ID (e.g.
OECD.SDD.NAD) with its directorate name and dataflow count, sorted by countPublishers outside OECD that ship dataflows through the same catalog (
ESTAT,IAEG-SDGs) carry no directorate
oecd_search_datasets tool
querytoken-matched across dataflow names and descriptions; optionalagency_idscope;limit(1–100) andoffsetpaging withtotal_matchesEach result carries its
flow_ref— the identifier every other tool takes — andmatched_in(name,description, orboth)
oecd_get_dataset_info tool
Takes a
flow_ref; returns every dimension in key order with its concept name and codelist reference, plus akey_exampleforoecd_query_datasetFails
invalid_flow_reffor a string that is not a flow reference anddataflow_not_foundfor one OECD does not publish
oecd_get_dimension_values tool
Takes a
flow_refanddimension_id; optionalquerysubstring-matches both code and labellimit(1–500, default 50) andoffsetpage the matches, with the full match count when more remain
oecd_query_dataset tool
flow_refplus a dot-delimitedkey(+for multiple values, empty segments as wildcards) and optionalstart_period/end_periodOne row per observation with every dimension and attribute as its own column;
valueis pre-multiplied byvalue_scaleLarge results spill to DataCanvas with
truncated: true,canvas_id, andtable_name; without a canvas every row stays instructuredContentand only the rendered table is capped (content_table_capped)
oecd_dataframe_describe tool
Takes the
canvas_idoecd_query_datasetreturned; lists each staged table and view with its row count and column names and types
oecd_dataframe_query tool
canvas_idplus one read-only SQLSELECT; writes, DDL, and system-catalog access are rejectedReturns rows capped at the canvas row limit, with
row_countreporting the full count
oecd_dataframe_drop tool
canvas_idplus atable_nameasoecd_dataframe_describelists it; returns the dropped object'skindand theremaining_tablesOpt-in: listed but not callable unless
OECD_DATAFRAME_DROP_ENABLED=true
oecd://dataflow/{agency_id}/{flow_id} resource
Same content as
oecd_get_dataset_info, asapplication/json{flow_id}is{dsd_id}@{df_id}with@encoded as%40(e.g.oecd://dataflow/OECD.SDD.NAD/DSD_NAAG%40DF_NAAG_I), or the bare{df_id}
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
OECD-specific:
Keyless access — no API key required; OECD SDMX 2.1 REST API is fully public
Covers 1,500+ dataflows across 20+ OECD statistical departments (national accounts, employment, inflation, trade, education, health, environment, taxation, inequality)
Delegated dataflows and codelist revisions resolved end to end — a dataflow OECD catalogues on one service root but defines on another follows the catalog's own link for structure, codes, and observations, and codes come from the revision the datastructure names rather than the endpoint's current latest
AllDimensionsobservation mode — one-pass SDMX-JSON decoding into flat row objects, no nested series key reconstructionoecd_query_datasetmaterializes large observation sets (multi-country time-series) on a DuckDB DataCanvas for in-conversation SQL analytics; the threeoecd_dataframe_*tools work on it and needCANVAS_PROVIDER_TYPE=duckdb
Agent-friendly output:
Workflow-aware tool surface —
flow_reffrom search flows directly into info, values, and query tools without reconstructionSpill signaling —
truncated: true+canvas_idtells the agent to switch to SQL instead of parsing a truncated inline listFull SDMX decoding server-side — agents see
{ REF_AREA: "United States", MEASURE: "Gross domestic product", UNIT_MULT: "Billions", value: 26054614000000, value_scale: 1000000000 }, not raw index arrays
Getting started
Public Hosted Instance
A public instance is available at https://oecd.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"oecd-mcp-server": {
"type": "streamable-http",
"url": "https://oecd.caseyjhand.com/mcp"
}
}
}Self-Hosted / Local
Add the following to your MCP client configuration file.
{
"mcpServers": {
"oecd-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/oecd-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"oecd-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/oecd-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with Docker:
{
"mcpServers": {
"oecd-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/oecd-mcp-server:latest"
]
}
}
}To enable DataCanvas SQL analytics for large query results, add CANVAS_PROVIDER_TYPE=duckdb:
{
"mcpServers": {
"oecd-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/oecd-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"CANVAS_PROVIDER_TYPE": "duckdb"
}
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Bun v1.4.0 or higher (or Node.js v24+).
No API key required — OECD SDMX is a free, public API.
Installation
Clone the repository:
git clone https://github.com/cyanheads/oecd-mcp-server.gitNavigate into the directory:
cd oecd-mcp-serverInstall dependencies:
bun installConfigure environment:
cp .env.example .env
# edit .env — most vars are optional; no API key requiredConfiguration
All configuration is validated at startup via Zod schemas in src/config/server-config.ts. Key environment variables:
Variable | Description | Default |
| OECD SDMX REST API base URL. Must be an https origin that answers directly — no redirect is followed, so a plaintext |
|
| Per-request timeout in milliseconds. |
|
| Canvas engine. Set to |
|
| Set to |
|
| Transport: |
|
| Port for HTTP server. |
|
| HTTP session posture: |
|
| Auth mode: |
|
| Log level (RFC 5424). |
|
| Directory for log files (Node.js only). |
|
| Log each failed tool call's arguments and result, redacted by key name and capped at |
|
| Enable OpenTelemetry instrumentation. |
|
See .env.example for the full list of optional overrides.
Running the server
Local development
Build and run:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:httpRun checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t oecd-mcp-server .
docker run --rm -p 3010:3010 oecd-mcp-serverThe Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/oecd-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
Directory | Purpose |
|
|
| Server-specific environment variable parsing and validation with Zod. |
| Tool definitions ( |
| Resource definitions ( |
| Shared OECD fetch boundary — timeout and retry-classification corrections used by both services below, the origin check every delegated service root passes before it is addressed, the refusal of any redirect off the configured host, and the classification that gives an upstream refusal the same declared reason on every tool and resource. |
| OECD SDMX structure service — dataflows, data structures, codelists. |
| OECD SDMX data service — observations, SDMX-JSON decoding, DataCanvas spillover. |
| DataCanvas accessor — registers and exposes the framework canvas instance to tools. |
| Unit and integration tests mirroring |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storageRegister new tools and resources via the barrels in
src/mcp-server/*/index.tsWrap external API calls: validate raw SDMX-JSON → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues are welcome — see CONTRIBUTING.md for what makes one actionable, and CODE_OF_CONDUCT.md for how we work together. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
This server cannot be deployed
Maintenance
Related MCP Connectors
Query IMF SDMX 3.0 macroeconomic dataflows — WEO, BOP, CPI, exchange rates, 190 countries.
Macroeconomic and other official data from 170+ publishers, resolved from natural language with provenance.
SDMX Structure MCP — dataflow dimensions and code lists for any SDMX 2.1 registry: Eurostat, OECD…
Official statistics for AI agents: Eurostat, World Bank, OECD, IMF and WHO data for 150+ countries.
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides AI assistants access to over 5,000 OECD economic and statistical datasets via the SDMX API for search, analysis, and comparison across 38 countries.916 npm8MIT
- AlicenseAqualityBmaintenanceProvides OECD statistical data (employment, wages, etc.) through SDMX API, supporting Korean-language queries. Enables listing indicators, retrieving stats, trends, comparisons, and rankings among OECD countries.8MIT
- AlicenseAqualityBmaintenanceEnables querying, exploring, and downloading ISTAT statistical datasets via SDMX REST API, with unified metadata, territorial code resolution, and data extraction.7MIT
- AlicenseNot gradedqualityCmaintenanceEnables discovery and retrieval of National Bank of Belgium statistical data across 221 SDMX dataflows, with search, descriptions, custom queries, and comparisons of economic indicators.27 PyPI3MIT