Global Economic Statistical MCP
This server is an MCP toolset for finding, retrieving, validating, comparing, and analysing official macroeconomic statistics from institutions like the Bank of Korea, OECD, IMF, BIS, ECB, Eurostat, and World Bank.
Search: discover concepts, indicators, datasets, ECOS tables/items, and institutional dataflows (
search_statistics).Explore metadata: inspect dataset structures, dimensions, codelists, and SDMX/ECOS keys (
get_metadata).Retrieve data: get validated time series by concept+country, ECOS table, or SDMX dataflow, with provenance, citation, transforms, rebasing, and formatting (
get_data).Cross-validate: compare the same concept across institutions and see MATCH/DIFFER/UNRESOLVED status (
get_datawithcross_validate=Trueorcompare_series).Compare series: align multiple economies, institutions, or concepts, compute correlations, and normalize (index/z-score) (
compare_series).Analyse trends: calculate summary statistics like growth, volatility, drawdowns, CAGR, and trend fits (
calculate_statistics).Explain indicators: get definitions, source mappings per economy, and Korean glossary/methodology notes (
explain_indicator).
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., "@Global Economic Statistical MCPCompare CPI inflation in the US and Euro area since 2020."
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.
π Global Economic Statistical MCP
Global economic statistics infrastructure for AI-powered macro research.
An MCP server that lets an LLM find, retrieve, compare and analyse official macroeconomic statistics from central banks and international organisations. You ask for a concept (policy rate, CPI inflation, real GDP, current account, β¦) for an economy. The server fetches it from the right institution, converts it to one common time-series format, checks it against other institutions, and cites its source.
LLM
β
βΌ
βββββββββββββββββββ
β Statistical MCP β
β 6 Tools β
ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββ
β Concept Resolverβ
ββββββββββ¬βββββββββ
β
βββββββββββββββ΄ββββββββββββββ
βΌ βΌ
Concept Catalog Provider Catalog
β β
βββββββββββββββ¬ββββββββββββββ
βΌ
Provider Resolver
β
βββββββββββββββββββββΌββββββββββββββββββββ
βΌ βΌ βΌ
ECOS SDMX Layer Data360
(REST, Korea) β (World Bank)
β ββββββββ¬βββββββΌβββββββ¬βββββββ β
β βΌ βΌ βΌ βΌ βΌ β
β OECD IMF BIS ECB Eurostat β
β β β β β β β
βββββ΄βββββββ΄βββββββ΄βββββββ΄βββββββ΄ββββββββ
β
βΌ
βββββββββββββββββββ
β Canonical Model β
ββββββββββ¬βββββββββ
β
ββββββββ΄βββββββ
βΌ βΌ
Validation Provenance
β β
ββββββββ¬βββββββ
βΌ
Analysisπ Installation
Requires uv. Check connectivity first:
ECOS_API_KEY=your_key uvx --from git+https://github.com/kgy0617/global-economic-statistical-mcp global-economic-statistical-mcp --checkClaude Desktop (claude_desktop_config.json) / Cursor (~/.cursor/mcp.json)
{
"mcpServers": {
"global-econ-stats": {
"command": "uvx",
"args": ["--from", "git+https://github.com/kgy0617/global-economic-statistical-mcp", "global-economic-statistical-mcp"],
"env": { "ECOS_API_KEY": "your_api_key_here" }
}
}
}Claude Code
claude mcp add global-econ-stats -e ECOS_API_KEY=your_key -- uvx --from git+https://github.com/kgy0617/global-economic-statistical-mcp global-economic-statistical-mcpEnvironment variable | Description |
| Bank of Korea key (free registration). Without it a sample key is used (10 rows per call). No other institution needs a key. |
| Where validation results are stored (default |
|
|
Related MCP server: Autario
π Coverage
Economies: Korea KR, United States US, Japan JP, China CN, euro area EA, United Kingdom GB. Every mapping for these six is re-checked against the live APIs daily. About 40 more economies work through the same mappings without daily checks (list: gesm://countries).
Institutions
| Institution | Covers |
| Bank of Korea | Korea (the only source that needs a key) |
| OECD | OECD members and major economies |
| IMF | Most countries |
| Bank for International Settlements | Policy rates, exchange rates, prices, property |
| European Central Bank | Euro area and EU member states |
| Eurostat | Euro area and EU member states |
| World Bank (Data360) | Most countries; annual development indicators |
Not every institution publishes every concept. See docs/sources.md for which institution serves what.
π§° Tools
Tool | What it does |
| Find concepts, datasets and indicators across all institutions. |
| A dataset's structure and codes, or an indicator's definition. |
| Retrieve a series, with validation and a citation. |
| Align several economies, institutions or concepts and compute correlations. |
| Growth, trend, volatility, drawdown and other summary statistics. |
| What a concept means and which sources serve each economy. |
Ask by concept; country is required:
get_data(indicator="CPI_YOY", country="EA") # the server picks the source
get_data(indicator="POLICY_RATE", country="US", source="BIS") # or choose oneYou can also query an institution directly (source + dataflow + key) or a Bank of Korea table (stat_code). Options: transform (yoy/pop), rebase_period, unit_mult, start_date/end_date.
31 concepts: policy, short- and long-term rates; CPI and inflation; PPI; GDP growth and levels; unemployment; current account, goods balance, FX reserves; exchange rates; share prices; consumer and business confidence; house prices; and annual population, GDP per capita (PPP) and current account/GDP. Full list: gesm://concepts.
π Validation
Every series comes with checks on country, frequency, unit, scale, period, missing values, duplicates and revisions.
With cross_validate=True (or compare_series), the same concept is fetched from every institution that publishes it and compared period by period. Each result is one of:
Status | Meaning |
| The institutions agree (within tolerance). |
| They differ for a known reason (e.g. seasonal adjustment). |
| They differ and the cause is not known. Reported, never hidden. |
| Not enough data to compare. |
Official sources do not always agree. Latest report for the six economies: MATCH 43 Β· DIFFER 3 Β· UNRESOLVED 15 Β· NOT_COMPARED 1. See docs/validation.md for the details.
π§Ύ Provenance
Every series carries its institution, dataset, series key, retrieval time, query URL, any transformation applied, and a ready-to-use citation. output_format="sdmx" returns an SDMX-JSON data message.
π Examples
"How has monetary policy diverged across the US, the euro area and Japan?" β
compare_series(series=[{"indicator":"POLICY_RATE","country":"US"}, {"indicator":"POLICY_RATE","country":"EA"}, {"indicator":"POLICY_RATE","country":"JP"}])"Do Eurostat, the ECB and the BIS agree on euro-area inflation?" β
get_data(indicator="CPI_YOY", country="EA", cross_validate=True)"Germany's unemployment rate" β
get_data(indicator="UNEMPLOYMENT_RATE_SA", country="DE", source="Eurostat")"Trend and volatility of Japanese 10-year yields" β
calculate_statistics(indicator="LONG_TERM_RATE", country="JP")"GDP per capita (PPP) over 20 years" β
get_data(indicator="GDP_PER_CAPITA_PPP", country="CN", recent_years=20)
Prompts: macro-economic-briefing, compare-countries, analyze-economic-trend.
β οΈ Limitations
Institutions differ in methods, base years and revisions. Cross-validation shows where they differ; it does not decide which one is right.
World Bank indicators are annual and published with a lag.
OECD limits requests per IP; under heavy use the server falls back to other institutions.
Only the six default economies are checked daily.
π§ͺ Development
git clone https://github.com/kgy0617/global-economic-statistical-mcp.git
cd global-economic-statistical-mcp
uv sync
uv run pytest # offline tests (all institutions faked)
uv run pytest -m live # live API checks for the six economiesLicense: MIT.
Available Tools
6 toolscalculate_statisticsCalculate statisticsARead-onlyIdempotent
Summary statistics of a series (addressed the same way as get_data).
Per series: count, first/last, min/max (with periods), mean, median, std, change/change_pct, cagr_pct,
trend_per_year/trend_r2, latest_pop_pct, pop_pct_std, max_drawdown_pct, latest_yoy_pct, mean_yoy_pct.
Rates (interest rates, inflation) change in percentage points. Validation and provenance are included.
Args:
indicator: concept id or name
country: economy, ISO code or EA (required with indicator)
source: ECOS | OECD | IMF | BIS
stat_code: ECOS table code
cycle: frequency
item_code1..4: ECOS item codes
dataflow: SDMX dataflow
key: SDMX series key
start_date: start period
end_date: end period
recent_years: window
Returns:
statistics, validation status and provenance per series
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | ||
| cycle | No | ||
| source | No | ||
| country | No | ||
| dataflow | No | ||
| end_date | No | ||
| indicator | No | ||
| stat_code | No | ||
| item_code1 | No | ||
| item_code2 | No | ||
| item_code3 | No | ||
| item_code4 | No | ||
| start_date | No | ||
| recent_years | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety. The description adds behavioral context: it notes that rates change in percentage points, that validation and provenance are included, and lists the full set of statistics. It does not contradict annotations and adds useful nuance beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with a clear purpose statement, a compact list of statistics, and a labeled Args section. It is longer than minimal but each part earns its place, especially the param hints. The front-loading of purpose is effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 14 parameters and no output schema, the description covers the return value ('statistics, validation status and provenance per series') and the addressing method (same as get_data). It does not explain how to choose among the many addressing options (indicator vs. stat_code vs. dataflow), but given the complexity, it provides enough context for an agent to call it correctly, especially with sibling tools available.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does: every one of the 14 parameters is explained with a brief type or format hint (e.g., 'concept id or name', 'economy, ISO code or EA', 'ECOS | OECD | IMF | BIS', 'frequency', 'SDMX series key'), and it even notes a dependency ('required with indicator'). This adds substantial meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('calculate') and resource ('summary statistics of a series'), and enumerates the exact statistics returned (count, min/max, mean, median, std, CAGR, etc.). It also references get_data for addressing, which helps distinguish it from sibling tools like get_data and compare_series.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when summary statistics are needed, and mentions 'addressed the same way as get_data' which hints at a parallel, but it does not explicitly state when to use this tool over siblings like get_data or compare_series, nor provide exclusions or conditions. Guidance is implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_seriesCompare series and cross-validateARead-onlyIdempotent
Align 2-6 series to one frequency and compare them: across economies, institutions or concepts.
Examples:
- economies: [{"indicator":"POLICY_RATE","country":"US"}, {"indicator":"POLICY_RATE","country":"EA"}]
- institutions: [{"indicator":"CPI","country":"CN","source":"IMF"}, {"indicator":"CPI","country":"CN","source":"BIS"}]
β the same concept and economy from different institutions adds cross_validation automatically
- concepts: [{"indicator":"POLICY_RATE","country":"GB"}, {"indicator":"CPI_YOY","country":"GB"}]
Args:
series: list of series (indicator/country/source, or stat_code/..., or source/dataflow/key/cycle)
start_date: start period (default: the last recent_years years)
end_date: end period
recent_years: window (default 3)
frequency: comparison frequency (default: the lowest one)
aggregation: "mean" | "last" | "first" | "sum" (default per concept: flows such as the current account
or GDP are summed, stocks such as reserves take the period end, everything else is averaged)
normalize_method: "none" | "index" (first period = 100) | "zscore"
join: "inner" | "outer"
output_format: "compact" | "csv"
Returns:
the aligned table, correlations, provenance and validation per series, and cross-validation where it applies
| Name | Required | Description | Default |
|---|---|---|---|
| join | No | inner | |
| series | Yes | ||
| end_date | No | ||
| frequency | No | ||
| start_date | No | ||
| aggregation | No | ||
| recent_years | No | ||
| output_format | No | compact | |
| normalize_method | No | none |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive. The description goes further by explaining the alignment process, aggregation defaults based on flow vs. stock concepts, normalization options, and the return payload (table, correlations, provenance, validation). This exceeds the annotation coverage and gives the agent a full picture of side effects and output structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but well-structured with a clear purpose line, three illustrative examples, and a bulleted Args list. Every sentence adds value, and the most critical information (alignment and comparison scope) is front-loaded. It could be tightened slightly, but the organization makes it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description explicitly states what is returned: aligned table, correlations, provenance, validation, and cross-validation where applicable. The examples cover the three main use cases, and all parameters and their effects are described. An agent has everything needed to invoke the tool correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description carries the full burden. It lists every parameter, explains defaults (e.g., recent_years=3, aggregation rules), and describes the three acceptable series specifications (indicator/country/source, stat_code, or dataflow/key/cycle). It even provides concrete JSON examples. This is exemplary compensation for the sparse schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('align', 'compare') with a clear resource ('2-6 series') and scope ('across economies, institutions or concepts'). The description distinguishes itself from siblings like get_data and calculate_statistics by focusing on comparison and cross-validation. Examples reinforce the purpose without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage scenarios via three example types (economies, institutions, concepts) and explains the automatic cross-validation when the same concept comes from different sources. It does not explicitly state when not to use it or name alternative tools, but the context is clear enough for an agent to infer appropriate use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_indicatorExplain indicatorARead-onlyIdempotent
Explain what an indicator measures and which sources (institution, dataflow, key) serve each economy.
Returns the concept definition, its source mappings with rendered keys, and for Korean statistics the
Bank of Korea glossary definition, methodology notes and related ECOS tables.
Args:
term: indicator or term (e.g. "CPI_YOY", "policy rate", "unemployment", "κ²½μ μ¬λ¦¬μ§μ")
country: economy whose sources to show (default: every verified economy)
stat_code: a specific ECOS table to explain
language: "kr" | "en" (Bank of Korea glossary and methodology)
Returns:
concept (definition, unit, sources), sources per economy, definition (glossary), methodology, tables
| Name | Required | Description | Default |
|---|---|---|---|
| term | Yes | ||
| country | No | ||
| language | No | kr | |
| stat_code | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds behavioral detail about the return content (concept, sources, glossary, methodology, tables), which enriches what the agent can expect 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-sentence purpose, then a returns summary, then an Args block with examples. Front-loaded with the core purpose and no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with four parameters and no output schema, the description explains all parameters, provides examples, and lists the return fields. It is complete enough for an agent to call it correctly without further inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description's 'Args' section explains each parameter (term, country, stat_code, language) with examples and defaults. It fully compensates for the missing schema descriptions, providing meaning beyond the raw property names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('explain') and resource ('indicator'), and specifies what it returns: concept definition, source mappings, and for Korean statistics, glossary, methodology, and tables. This clearly distinguishes it from siblings like get_data or get_metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives contextual hints (e.g., 'for Korean statistics') but does not explicitly state when to use this tool versus alternatives like search_statistics or get_metadata. No exclusions or when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dataGet data (validated, with provenance)ARead-onlyIdempotent
Retrieve a time series in the canonical model, with validation and provenance.
Three ways to ask (use one):
1. Concept: indicator + country (+ source, cycle), e.g. indicator="CPI_YOY", country="US".
Korea uses ECOS first; other economies OECD, IMF and BIS. If a source has no data, the next one is tried.
2. ECOS table (Korea): stat_code (+ cycle, item_code1..4)
3. SDMX dataflow: source (OECD | IMF | BIS) + dataflow + key + cycle
* validation: country, frequency, unit (and index base), scale, period, missing, duplicate and revision checks (pass/info/warn/fail)
* cross_validate=True: fetch the concept from every source and compare period by period;
the result is MATCH, DIFFER (documented cause) or UNRESOLVED (unexplained difference)
* dates: "2024", "2024-03", "2024Q1", "2024-03-15" are converted; default window 3 months for daily data, else 2 years
* transform: "yoy" / "pop" % change β value becomes the change and the level is kept
* rebase_period: rebase an index to that period = 100 (e.g. "2020")
Args:
indicator: concept id or name (see search_statistics(scope="concepts"))
country: economy, ISO code or EA (required with indicator; with a direct SDMX query it enables the country check)
source: ECOS | OECD | IMF | BIS
stat_code: ECOS table code
cycle: frequency A/S/Q/M/SM/D
item_code1..4: ECOS item codes
dataflow: SDMX dataflow (e.g. "OECD.SDD.STES:DSD_STES@DF_FINMARK(4.0)")
key: SDMX series key (e.g. "USA.M.IRLT.PA._Z._Z._Z._Z.N")
start_date: start period
end_date: end period
recent_years: window when dates are omitted
transform: "yoy" | "pop" | "none"
changes_only: only periods where the value changed (default for policy rates)
rebase_period: index rebase period
unit_mult: rescale values to 10^unit_mult (e.g. 12 turns a billions (9) series into trillions)
cross_validate: include cross-validation across institutions
output_format: "compact" | "csv" | "json" | "sdmx"
prefer_latest: when ECOS results are truncated, keep the latest periods
start_count: ECOS first row
end_count: ECOS last row
language: "kr" | "en" (ECOS names)
Returns:
series (periods and values), provenance (source and citation), validation, and optionally cross_validation
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | ||
| cycle | No | ||
| source | No | ||
| country | No | ||
| dataflow | No | ||
| end_date | No | ||
| language | No | kr | |
| end_count | No | ||
| indicator | No | ||
| stat_code | No | ||
| transform | No | ||
| unit_mult | No | ||
| item_code1 | No | ||
| item_code2 | No | ||
| item_code3 | No | ||
| item_code4 | No | ||
| start_date | No | ||
| start_count | No | ||
| changes_only | No | ||
| recent_years | No | ||
| output_format | No | compact | |
| prefer_latest | No | ||
| rebase_period | No | ||
| cross_validate | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive. The description goes far beyond this by specifying validation checks (country, frequency, unit, etc.), cross-validation semantics (MATCH/DIFFER/UNRESOLVED), date conversion rules ('2024', '2024-03', '2024Q1'), default windows (3 months daily, 2 years otherwise), transform behavior, rebase semantics, and the prefer_latest truncation behavior. This is rich behavioral context that directly informs agent expectations. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although long, the description is meticulously organized: a one-line statement, three numbered access patterns, a bullet list of validation/transformation behaviors, an Args list with short explanations, and a Returns section. Every sentence adds functional value and there is no redundant repetition. The critical usage patterns are front-loaded, so an agent can grasp the core quickly without reading the entire parameter list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 24 parameters, no output schema, and no parameter descriptions in the schema, the description carries an enormous burden. It meets this by documenting every relevant behavior, the return structure (series, provenance, validation, optional cross_validation), and providing concrete value examples. The three access patterns cover all major invocation routes, making it fully complete for an agent to call correctly without external documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides zero descriptions (0% coverage) and no enums, so the description is the sole source of parameter meaning. It explains each argument with concrete examples and usage notes: indicator and country are required together, source defaults described, stat_code and dataflow formats are exemplified, and flags like cross_validate and prefer_latest are explained. This fully compensates for the schema's silence.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise statement of purpose: 'Retrieve a time series in the canonical model, with validation and provenance.' It then enumerates three distinct calling conventions (concept, ECOS table, SDMX dataflow), each with concrete field requirements. This clearly distinguishes the tool from siblings like search_statistics (which searches concepts) and get_metadata (which presumably fetches metadata).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit routing logic: 'Korea uses ECOS first; other economies OECD, IMF and BIS. If a source has no data, the next one is tried.' It also lists validated access patterns and optional cross-validation, giving the agent unambiguous choices for how to invoke the tool. While it doesn't explicitly contrast with siblings, the level of procedural detail (argument combinations, fallback behavior) functions as strong usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_metadataGet structure (metadata)ARead-onlyIdempotent
Return the structure (dimensions and codelists) of a dataset, to find the codes get_data needs.
- OECD, IMF, BIS: source + dataflow β the dimensions and codelists of the institution's own DSD.
A series key is the codes joined with '.' in dimension order (e.g. BIS WS_CBPOL β 'M.US').
- ECOS: stat_code β the table's structure mapped to SDMX (FREQ + ITEM_CODE1..4, coverage, units).
output_format="sdmx" returns an SDMX-JSON structure message.
Args:
stat_code: ECOS table code (e.g. "901Y009")
source: OECD | IMF | BIS (with dataflow)
dataflow: SDMX dataflow (e.g. "BIS:WS_CBPOL(1.0)", "IMF.STA:CPI")
code_keyword: filter codes by name or value (e.g. "Japan", "JPN", "current account")
codes_limit: maximum codes per dimension (default 30)
output_format: "compact" | "sdmx" (ECOS only)
language: "kr" | "en" (ECOS names)
Returns:
dimensions, codes per dimension, a key template
| Name | Required | Description | Default |
|---|---|---|---|
| source | No | ||
| dataflow | No | ||
| language | No | kr | |
| stat_code | No | ||
| codes_limit | No | ||
| code_keyword | No | ||
| output_format | No | compact |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds valuable behavioral context beyond annotations by detailing source-specific behavior, the series-key format (e.g., 'M.US'), and the output_format='sdmx' effect for ECOS. It supplements the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly organized: a one-sentence purpose statement, two concise source-specific behavior bullets, and a clean parameter list. Every sentence adds valueβthe series-key example is particularly illustrative without being verbose. No filler or redundant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description adequately explains returns ('dimensions, codes per dimension, a key template') and covers the special output_format behavior. It also addresses both usage modes and parameter semantics. It stops short of detailing error conditions or required-parameter validation, but for a read-only metadata lookup tool, the coverage is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description is the only source of parameter meaning. It compensates thoroughly with an Args list that explains every parameter, including acceptable values (source, output_format), examples (stat_code '901Y009', dataflow 'BIS:WS_CBPOL(1.0)'), and cross-parameter interactions. This is essential and well-executed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb-resource pair: 'Return the structure (dimensions and codelists) of a dataset', and explicitly ties its purpose to 'to find the codes get_data needs.' This clearly differentiates it from sibling tools like get_data and search_statistics, making the tool's role obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear contextual guidance: use this tool to obtain dimension/codelist codes before calling get_data. It explains the two distinct usage modes (OECD/IMF/BIS with source+dataflow, ECOS with stat_code) and gives concrete examples. However, it does not explicitly discuss when not to use the tool or how it compares to alternatives like search_statistics or explain_indicator, so it stops short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_statisticsSearch statisticsARead-onlyIdempotent
Search concepts, OECD/IMF/BIS dataflows and Bank of Korea (ECOS) tables and items. The first step before retrieval.
scope:
- "all" (default): concepts + ECOS items + ECOS tables + international dataflows
- "concepts": country-agnostic concepts mapped across institutions (retrieve with get_data(indicator=..., country=...))
- "items": ECOS items (e.g. 'μ' rice, 'νλ°μ ' gasoline) from an index generated from the ECOS API
- "tables": ECOS tables (without query: children of the parent_code category)
- "dataflows": OECD, IMF and BIS dataflows (every word must match the English name or id; source narrows the institution)
- "key_statistics": latest values of the Bank of Korea's 100 key statistics
Args:
query: search terms (e.g. "policy rate", "unemployment", "inflation", "λ¬Όκ°")
scope: "all" | "concepts" | "items" | "tables" | "dataflows" | "key_statistics"
source: institution for dataflow search (OECD | IMF | BIS)
parent_code: ECOS table category code
searchable_only: ECOS tables that can be queried only
limit: maximum results per category
language: language of key_statistics ("kr" | "en")
Returns:
results per category (concepts, items, tables, dataflows, key_statistics)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| scope | No | all | |
| source | No | ||
| language | No | kr | |
| parent_code | No | ||
| searchable_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint=false, and idempotentHint, so the description doesn't need to repeat safety. It adds valuable behavioral detail such as how dataflows require every word to match the English name/id, tables without query return children of parent_code, and key_statistics returns latest values. This goes beyond annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a one-line summary, a scope section, an Args list, and a Returns note. It is a bit long but every bullet adds necessary detail. It is front-loaded with the purpose and avoids redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with no output schema, the description covers the main aspects: what each scope searches, how parameters affect results, and that results are returned per category. It lacks detail on the exact fields of each result item, but this is a minor gap given the tool's exploratory role.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates by explaining all seven parameters with examples and context: query gives example terms, scope enumerates all valid values and meanings, source specifies institutions, parent_code, searchable_only, limit, and language. This is far more than the bare schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches concepts, OECD/IMF/BIS dataflows, and ECOS tables/items, and explicitly labels itself as 'The first step before retrieval,' which distinguishes it from sibling retrieval tools like get_data. The verb and resource are specific, and the scope section adds granularity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says it is the first step before retrieval, implying use before get_data, and for concepts it even specifies how to retrieve with get_data. However, it does not explicitly list when not to use it or name all alternative tools, though the scope definitions provide clear context for choosing scopes.
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.
6 tool updates
v0.4.0- First observed
calculate_statistics - First observed
compare_series - First observed
explain_indicator - First observed
get_data - First observed
get_metadata - First observed
search_statistics
TDQS
Scored across 6 tools
Each tool has a distinct purpose: search discovery, structural metadata, data retrieval, multi-series comparison, summary statistics, and indicator explanation. There is no overlap or ambiguity in their roles.
All tool names follow a consistent verb_noun pattern (search_statistics, get_metadata, get_data, compare_series, calculate_statistics, explain_indicator), making the API predictable and easy to navigate.
Six tools form a well-scoped set for a statistical data server, covering the essential operations without redundancy or bloat. Each tool is justified by the domain's needs.
The tools cover the full workflow: search to discover, metadata to understand structure, retrieval, comparison, analysis, and explanation. No significant gaps appear for the stated purpose of global economic statistics.
Maintenance
Related MCP Connectors
Macroeconomic and other official data from 170+ publishers, resolved from natural language with provenance.
Macro data for AI agents: GDP, inflation, unemployment and more (World Bank, US BLS). No keys.
Macro data for AI agents: GDP, inflation, unemployment and more (World Bank, US BLS). No keys.
Macroeconomic and FX time-series data for AI agents: indicators, calendars, COT, forex, commodities.
Related MCP Servers
- AlicenseAqualityCmaintenanceProvides access to macroeconomic indicators, FX rates, COT data, commodities, and release calendars through the FXMacroData API for AI agents.8MIT
- AlicenseAqualityCmaintenanceConnect your ads, shop, analytics, social, CRM and finance platforms once, then let Claude, ChatGPT, Cursor or any MCP client read, join and explain your numbers. Public statistics from the World Bank, IMF, Eurostat, OECD, WHO and SEC filings come as context, searchable and chartable from the same tools. Read-only by design, every number carries its source.28430 npm2MIT
- AlicenseAqualityBmaintenanceEnables AI agents to search and retrieve FRED economic time series, including vintage (as-published) data, with tools for series search, observation retrieval, release calendar, revision history, and more.933 PyPIMIT
- AlicenseAqualityCmaintenanceEnables LLM agents to query US macroeconomic time series from FRED, including GDP, CPI, unemployment, and interest rates, for contextual research.6MIT