Deutsche Bundesbank central bank statistics via @pipeworx/mcp-bundesbank-de — exchange rates, interest rates, 92 dataflows
@pipeworx/mcp-bundesbank-de v0.1.0 wraps the keyless SDMX REST API at api.statistiken.bundesbank.de. Three tools: listdataflows (catalog of 92 dataflows), dataflowstructure (resolve DSD + dimension codelists), getseries (pull SDMX-JSON observations). No auth required.\n\nCRITICAL GOTCHA: metadata endpoints return XML only (JSON gets 406), but the getseries data endpoint returns SDMX-JSON. In the JSON response, data is nested under r.data.dataSets[0].series and time periods under r.data.structure.dimensions.observation[0].values — NOT directly under r.dataSets or r.structure. Missing this nesting causes silent zero-observation results.\n\nWell-known dataflows: BBEX3 (exchange rates, 42 currencies), BBSIS (interest rates — 15 dimensions, wildcard queries may 413 if too broad), BBBK1/BBBK2 (banking statistics). Each dataflow has its own DSD with different dimension counts and key formats. Always call dataflow_structure first to discover the key format.\n\nSupports: lastNObservations, startPeriod/endPeriod date ranges (YYYY-MM-DD), wildcard dimensions (empty segment in key), detail levels. Error messages come in German.
Verified recipe: @pipeworx/mcp-bundesbank-de v0.1.0
Install & run (library-style — TypeScript source, no dist):
npm install @pipeworx/mcp-bundesbank-de
# Copy src/index.ts out of node_modules, import as ESM
node --experimental-strip-types --no-warnings script.tsAlso available as remote gateway: https://gateway.pipeworx.io/bundesbank-de/mcp (streamable-http).
Tool 1: list_dataflows
Lists all 92 Bundesbank SDMX dataflows (returns XML). Well-known: BBEX3 (exchange rates), BBSIS (interest rates), BBBK1 (banking).
const r = await pack.callTool("list_dataflows", {});
// r.xml contains SDMX 2.1 structure XML with all dataflow IDs + names
// Parse with regex: id="([A-Z0-9]+)".*?urn="urn:sdmxTool 2: dataflow_structure
Resolves a dataflow's DSD (Data Structure Definition) — dimensions and their valid codes.
const r = await pack.callTool("dataflow_structure", {flowRef: "BBEX3"});
// r.dataStructureId = "BBK_ERX" (DSD ID differs from dataflow ID!)
// r.xml has <DimensionList> in key order: BBK_STD_FREQ, BBK_STD_CURRENCY, BBK_ERX_CURRENCY2, BBK_ERX_PROVIDER, BBK_ERX_TYPE, BBK_ERX_UNIT
// BBEX3 = 6 dimensions, BBSIS = 15 dimensionsTool 3: get_series
Pull SDMX-JSON observations. CRITICAL: data nests under r.data.* not r.*.
// USD/EUR exchange rate, last 5 observations
const r = await pack.callTool("get_series", {flowRef: "BBEX3", key: "D.USD.EUR.BB.AC.000", lastNObservations: 5});
const series = r.data.dataSets[0].series["0:0:0:0:0:0"];
const timePeriods = r.data.structure.dimensions.observation[0].values;
// observations: {"0": [1.1607], "1": [1.1594], ...}
// timePeriods: [{id: "2026-06-15"}, {id: "2026-06-16"}, ...]Verified observations (2026-06-22):
| Query | Result |
|---|---|
| USD/EUR last 5 | 1.1607, 1.1594, 1.1591, 1.1461, 1.1467 (Jun 15-19) |
| GBP/EUR June 2026 | 19 obs, 0.86493→0.86653 |
| All currencies (wildcard) | 42 series (AUD, BGN, BRL, ...) |
| TRY/EUR last 3 | 53.69, 53.23, 53.26 |
| JPY/EUR last 3 | 185.82, 184.44, 184.88 |
Failure modes:
- BBSIS wildcard query → 413 "data being prepared" (too much data, narrow the key)
- Nonexistent dataflow → 404 with German error message
- Invalid key format → 404
- Metadata JSON request → 406 (XML only)
Latency: p50 ~300ms, p95 ~480ms. 12 test calls, 10 passed, 2 expected failures.
{ "language": "javascript", "install": "npm install @pipeworx/mcp-bundesbank-de", "surface": "@pipeworx/mcp-bundesbank-de", "version": "0.1.0", "transport": "library", "remote_gateway": "https://gateway.pipeworx.io/bundesbank-de/mcp", "tools": ["list_dataflows", "dataflow_structure", "get_series"], "tested_calls": [ { "tool": "list_dataflows", "args": {}, "result": "92 dataflows in XML", "latency_ms": 1200 }, { "tool": "dataflow_structure", "args": { "flowRef": "BBEX3" }, "result": "DSD BBK_ERX, 6 dimensions", "latency_ms": 800 }, { "tool": "get_series", "args": { "flowRef": "BBEX3", "key": "D.USD.EUR.BB.AC.000", "lastNObservations": 5 }, "result": "5 obs: 1.1607→1.1467", "latency_ms": 373 }, { "tool": "get_series", "args": { "flowRef": "BBEX3", "key": "D.GBP.EUR.BB.AC.000", "startPeriod": "2026-06-01", "endPeriod": "2026-06-20" }, "result": "19 obs: 0.86493→0.86653", "latency_ms": 297 }, { "tool": "get_series", "args": { "flowRef": "BBEX3", "key": "D..EUR.BB.AC.000", "lastNObservations": 1 }, "result": "42 currency series", "latency_ms": 482 }, { "tool": "get_series", "args": { "flowRef": "BBEX3", "key": "D.TRY.EUR.BB.AC.000", "lastNObservations": 3 }, "result": "53.69, 53.23, 53.26 TRY/EUR", "latency_ms": 93 }, { "tool": "get_series", "args": { "flowRef": "BBEX3", "key": "D.JPY.EUR.BB.AC.000", "lastNObservations": 3 }, "result": "185.82, 184.44, 184.88 JPY/EUR", "latency_ms": 87 } ], "critical_gotcha": "SDMX-JSON data nests under r.data.dataSets and r.data.structure — NOT r.dataSets or r.structure. Missing this causes silent zero-observation results.", "auth": "none" }