# io.github.cyanheads/imf-mcp-server (remote · imf.caseyjhand.com)

Query IMF SDMX 3.0 macroeconomic dataflows — WEO, BOP, CPI, exchange rates, 190 countries.

- Trust score: 68/100 (medium)
- Change this week: +5
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `imf.caseyjhand.com`: 68/100 (this document), [markdown](https://verifymcp.io/servers/cyanheads-imf-mcp-server/imf.md), [page](https://verifymcp.io/servers/cyanheads-imf-mcp-server/imf)
- npm · `@cyanheads/imf-mcp-server`: 35/100, [markdown](https://verifymcp.io/servers/cyanheads-imf-mcp-server/cyanheads-imf-mcp-server.md), [page](https://verifymcp.io/servers/cyanheads-imf-mcp-server/cyanheads-imf-mcp-server)

## Channel facts

- Endpoint: `https://imf.caseyjhand.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.2.4`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 66/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 5 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 65/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 1370 tokens (~274/item across 5 items; 5 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http cyanheads-imf-mcp-server https://imf.caseyjhand.com/mcp
```

### Codex

```toml
[mcp_servers.cyanheads-imf-mcp-server]
url = "https://imf.caseyjhand.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cyanheads-imf-mcp-server": {
      "type": "remote",
      "url": "https://imf.caseyjhand.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add cyanheads-imf-mcp-server --url https://imf.caseyjhand.com/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  cyanheads-imf-mcp-server:
    url: "https://imf.caseyjhand.com/mcp"
```

### Other

```json
{
  "mcpServers": {
    "cyanheads-imf-mcp-server": {
      "type": "http",
      "url": "https://imf.caseyjhand.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-02 (score 68, +1)

No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-31 (score 67, +2)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 65, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-28 (score 64, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-27 (score 63, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 63)

First indexed and scored.

## MCP tools (5)

### `imf_list_databases` (~172 tokens)

Imf List Databases

List IMF SDMX dataflows available on the portal. Entry point for every query: imf_get_database and imf_query_dataset both require a dataflow id obtained here. Vintage (historical snapshot) dataflows such as WEO_2025_OCT_VINTAGE are excluded by default; set include_vintages=true to include them. The returned total_count reflects the current live catalog size.

Input parameters:

- `filter` (string): Optional name, ID, or description substring to filter results. Case-insensitive. Example: "exchange rate" returns ER and related dataflows.
- `include_vintages` (boolean): Include vintage (historical snapshot) dataflows such as WEO_2025_OCT_VINTAGE. Default false — vintages are excluded to keep the discovery surface clean.

Output parameters:

- `dataflows` (array): Matching dataflows; pass the id to imf_get_database to resolve dimension codelists.
- `notice` (string): Populated when the filter matches nothing — explains why and suggests next steps.
- `total_count` (number): Total number of matching dataflows returned.

### `imf_get_database` (~339 tokens)

Imf Get Database

Fetch a dataflow's dimension list and complete codelist for each dimension. Resolves human-readable terms to SDMX codes (e.g. "United States" → USA, "real GDP growth" → NGDP_RPCH). Required before imf_query_dataset — SDMX keys are opaque without codelist lookups. Country codes are ISO 3-letter (USA, GBR, DEU), not ISO 2-letter (US, GB, DE). The key_format field shows the exact dimension order required by imf_query_dataset. Note: codelists enumerate the code universe, not actual coverage — valid codes can still return no_data if the combination has no series in this dataflow.

Input parameters:

- `agency_id` (string): Agency ID that publishes this dataflow, e.g. IMF.RES or IMF.STA. Auto-detected from the dataflow list when omitted.
- `codelist_filter` (string): Optional case-insensitive substring to search within each dimension's codelist (code ID and name). When set, returns all matching entries per dimension instead of the first-50 window — useful for lar…
- `dataflow_id` (string, required): Dataflow identifier from imf_list_databases, e.g. WEO, BOP, CPI. Case-sensitive.
- `version` (string): Dataflow version, e.g. 9.0.0. Auto-detected from the dataflow list when omitted.

Output parameters:

- `agency_id` (string): Agency that publishes this dataflow, e.g. IMF.RES, IMF.STA.
- `dataflow_id` (string): Dataflow identifier, e.g. WEO, BOP, CPI.
- `description` (string): Extended description, if available.
- `dimensions` (array): All dimensions of this dataflow with their codelists.
- `dsd_version` (string): Version of the underlying data structure definition (DSD) that backs this dataflow. Differs from version when the dataflow references a shared DSD (e.g. IIP → DSD_BOP at 24.0.0).
- `key_format` (string): Dimension names in dot-separated keyPosition order, e.g. COUNTRY.INDICATOR.FREQUENCY. Use this exact format when constructing the key for imf_query_dataset.
- `name` (string): Human-readable dataflow name.
- `source` (string): Attribution string required by IMF data terms: "Source: International Monetary Fund, <dataflow name>, <link>".
- `structure_ref` (string): Identifier of the underlying DSD, e.g. DSD_BOP. Several dataflows can share one DSD.
- `version` (string): Dataflow version string, e.g. 9.0.0.

### `imf_query_dataset` (~516 tokens)

Imf Query Dataset

Query an IMF SDMX dataflow by dimension key over a time range. Returns observations with time_period, value, unit, scale, and status attributes. Requires imf_get_database first to obtain the correct key_format and valid dimension codes. Country codes are ISO 3-letter (USA, GBR, DEU — not US, GB, DE). Key format: dot-separated codes in DSD keyPosition order (e.g. USA.NGDP_RPCH.A for WEO). Use + to specify multiple codes per position (e.g. USA+GBR.NGDP_RPCH.A). Codelists from imf_get_database enumerate the code universe, not actual coverage — valid codes can still return no_data if the combination has no series. start_period and end_period must be valid period strings (YYYY, YYYY-QN, or YYYY-MM) with start_period no later than end_period; malformed or reversed ranges are rejected. Large analytical result sets (multi-country, long time range) spill to DataCanvas; imf_dataframe_query provides SQL analysis of spilled results.

Input parameters:

- `agency_id` (string): Agency ID, e.g. IMF.RES or IMF.STA. Auto-detected from dataflow list when omitted.
- `canvas_id` (string): Existing canvas ID to accumulate results into across multiple queries. Omit to allocate a fresh canvas; the response includes a canvas_id when results spill to DataCanvas.
- `dataflow_id` (string, required): Dataflow identifier from imf_list_databases, e.g. WEO, BOP, CPI.
- `end_period` (string): End of time range (inclusive). Same format as start_period, and must be greater than or equal to start_period. Observations after this period are excluded from the result.
- `key` (string, required): Dot-separated dimension codes in DSD keyPosition order. Call imf_get_database to get key_format and valid codes first. Use + to specify multiple codes (e.g. USA+GBR.NGDP_RPCH.A). Country codes are IS…
- `start_period` (string): Start of time range (inclusive). Format matches the dataflow frequency: YYYY (annual), YYYY-QN (quarterly, e.g. 2023-Q1), YYYY-MM (monthly). Observations before this period are excluded from the resu…
- `version` (string): Dataflow version. Auto-detected from dataflow list when omitted.

Output parameters:

- `canvas_id` (string): DataCanvas session ID — present when truncated=true. Pass to imf_dataframe_query or imf_dataframe_describe to query the full result.
- `dataflow_id` (string): Dataflow identifier that was queried, e.g. WEO.
- `end_period` (string): Latest period covered; absent when the full available range was used.
- `key` (string): Dimension key used in the query, e.g. USA.NGDP_RPCH.A.
- `observation_count` (number): Total observations in the result.
- `observations` (array): Inline observations. Empty when results spilled to canvas (see canvas_id / table_name).
- `series_attributes` (object): Series-level attributes (unit, scale, decimals).
- `source` (string): Attribution string required by IMF data terms: "Source: International Monetary Fund, <dataflow name>, <link>".
- `start_period` (string): Earliest period covered; absent when the full available range was used.
- `table_name` (string): DuckDB table name on the canvas — present when truncated=true; reference in SQL via FROM <table_name>.
- `truncated` (boolean): True when the result exceeded the inline limit and was staged on a DataCanvas table; canvas_id and table_name are populated and imf_dataframe_query provides SQL access to the full set.

### `imf_dataframe_describe` (~86 tokens)

Imf Dataframe Describe

List DataCanvas tables and columns staged by a prior imf_query_dataset call. Returns each table's name, row count, and column schema (name + DuckDB type). Required before imf_dataframe_query to discover the table and column names for SQL.

Input parameters:

- `canvas_id` (string, required): Canvas ID returned by imf_query_dataset when results were too large for inline delivery.

Output parameters:

- `canvas_id` (string): Canvas session ID that was introspected.
- `table_count` (number): Total number of tables on the canvas.
- `tables` (array): All tables registered on this canvas.

### `imf_dataframe_query` (~150 tokens)

Imf Dataframe Query

Run a read-only SQL SELECT against a DataCanvas table staged by imf_query_dataset. Supports multi-country comparisons, time-series aggregation, and cross-indicator joins. Requires imf_dataframe_describe first to discover table and column names. Only SELECT statements are accepted — DML and DDL are rejected.

Input parameters:

- `canvas_id` (string, required): Canvas ID returned by imf_query_dataset when results were too large for inline delivery.
- `sql` (string, required): Read-only SQL SELECT statement. Must start with SELECT. Reference tables by the names returned by imf_dataframe_describe. Example: SELECT time_period, value FROM spilled_abc123 WHERE time_period >= '…

Output parameters:

- `row_count` (number): Total matching rows before the cap — may exceed rows.length.
- `rows` (array): Query result rows, capped at the canvas row limit (default 10,000).

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/cyanheads-imf-mcp-server/imf#diagnostics

## Score history

- 2026-08-03: 68
- 2026-08-02: 68
- 2026-08-01: 67
- 2026-07-31: 67
- 2026-07-30: 65
- 2026-07-29: 65
- 2026-07-28: 64
- 2026-07-27: 63
- 2026-07-26: 63

## Links

- Remote endpoint: https://imf.caseyjhand.com/mcp
- Repository: https://github.com/cyanheads/imf-mcp-server
- Changelog RSS feed: https://verifymcp.io/servers/cyanheads-imf-mcp-server/imf/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/cyanheads-imf-mcp-server/imf/changelog.json
- HTML version of this page: https://verifymcp.io/servers/cyanheads-imf-mcp-server/imf
