Skip to main content
Glama
kgy0617

Global Economic Statistical MCP

by kgy0617

🌏 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 --check

Claude 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-mcp

Environment variable

Description

ECOS_API_KEY

Bank of Korea key (free registration). Without it a sample key is used (10 rows per call). No other institution needs a key.

GESM_DATA_DIR

Where validation results are stored (default ~/.cache/global-economic-statistical-mcp).

GESM_PERSIST

0 writes nothing to disk.


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

source

Institution

Covers

ECOS

Bank of Korea

Korea (the only source that needs a key)

OECD

OECD

OECD members and major economies

IMF

IMF

Most countries

BIS

Bank for International Settlements

Policy rates, exchange rates, prices, property

ECB

European Central Bank

Euro area and EU member states

EUROSTAT

Eurostat

Euro area and EU member states

WB

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

search_statistics

Find concepts, datasets and indicators across all institutions.

get_metadata

A dataset's structure and codes, or an indicator's definition.

get_data

Retrieve a series, with validation and a citation. cross_validate=True compares institutions.

compare_series

Align several economies, institutions or concepts and compute correlations.

calculate_statistics

Growth, trend, volatility, drawdown and other summary statistics.

explain_indicator

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 one

You 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

MATCH

The institutions agree (within tolerance).

DIFFER

They differ for a known reason (e.g. seasonal adjustment).

UNRESOLVED

They differ and the cause is not known. Reported, never hidden.

NOT_COMPARED

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 economies

License: MIT.

Available Tools

6 tools
calculate_statisticsCalculate statisticsA
Read-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
ParametersJSON Schema
NameRequiredDescriptionDefault
keyNo
cycleNo
sourceNo
countryNo
dataflowNo
end_dateNo
indicatorNo
stat_codeNo
item_code1No
item_code2No
item_code3No
item_code4No
start_dateNo
recent_yearsNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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-validateA
Read-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
ParametersJSON Schema
NameRequiredDescriptionDefault
joinNoinner
seriesYes
end_dateNo
frequencyNo
start_dateNo
aggregationNo
recent_yearsNo
output_formatNocompact
normalize_methodNonone

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 indicatorA
Read-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
ParametersJSON Schema
NameRequiredDescriptionDefault
termYes
countryNo
languageNokr
stat_codeNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/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 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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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)A
Read-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
ParametersJSON Schema
NameRequiredDescriptionDefault
keyNo
cycleNo
sourceNo
countryNo
dataflowNo
end_dateNo
languageNokr
end_countNo
indicatorNo
stat_codeNo
transformNo
unit_multNo
item_code1No
item_code2No
item_code3No
item_code4No
start_dateNo
start_countNo
changes_onlyNo
recent_yearsNo
output_formatNocompact
prefer_latestNo
rebase_periodNo
cross_validateNo

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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)A
Read-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
ParametersJSON Schema
NameRequiredDescriptionDefault
sourceNo
dataflowNo
languageNokr
stat_codeNo
codes_limitNo
code_keywordNo
output_formatNocompact

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 statisticsA
Read-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)
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
scopeNoall
sourceNo
languageNokr
parent_codeNo
searchable_onlyNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 6 tool updatesv0.4.0
    • First observedcalculate_statistics
    • First observedcompare_series
    • First observedexplain_indicator
    • First observedget_data
    • First observedget_metadata
    • First observedsearch_statistics

TDQS

A4.6/5.0

Scored across 6 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Connect 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.
    28
    430 npm
    2
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables 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.
    9
    33 PyPI
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables LLM agents to query US macroeconomic time series from FRED, including GDP, CPI, unemployment, and interest rates, for contextual research.
    6
    MIT