io.github.cyanheads/imf-mcp-server
REMOTE · IMF.CASEYJHAND.COM · 2 COMPONENTS
Query IMF SDMX 3.0 macroeconomic dataflows — WEO, BOP, CPI, exchange rates, 190 countries.
Available components
Last scanned (2 hours ago)
Scores higher than 96% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Data and Analytics
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. How we score → Why this is hard to score →
Endpoint Security83
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one. See how to fix → View diagnostics → Partial
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability73
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 2877 tokens (~479/item across 6 items; 5 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 5 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 7 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 0
- Stability: 0.97 → pass security
- 4 Nov 26 0
- Stability: pass → 0.97 functional
- 29 Oct 26 +2
- The server rewrote its instructions, which are the text every model session reads security
- Schema quality: 557 → 479 ▲ functional
- Schema quality: unverified → 100 ▲ functional
- New resource “imf-guide” functional
- Server version: 0.4.4 → 0.5.0 functional
- 16 Oct 26 0
- Tool “imf_list_databases” rewrote its description, which is the text the model reads security
- Tool “imf_query_dataset” rewrote its description, which is the text the model reads security
- Schema quality: 503 → 557 ▼ functional
- Server version: 0.4.3 → 0.4.4 functional
- “imf_get_database” reworded the description of “agency_id” cosmetic
- “imf_get_database” reworded the description of “limit” cosmetic
- “imf_list_databases” reworded the description of “limit” cosmetic
- “imf_query_dataset” reworded the description of “agency_id” cosmetic
- “imf_query_dataset” reworded the description of “key” cosmetic
- “imf_query_dataset” reworded the description of “last_n_observations” cosmetic
- “imf_query_dataset” reworded the description of “version” cosmetic
- 30 Sept 26 0
- The server rewrote its instructions, which are the text every model session reads security
- Tool “imf_query_dataset” rewrote its description, which is the text the model reads security
- Tool “imf_get_database” rewrote its description, which is the text the model reads security
- Schema quality: 404 → 503 ▼ functional
- Server version: 0.4.2 → 0.4.3 functional
- “imf_query_dataset” added an optional parameter “last_n_observations” cosmetic
- “imf_query_dataset” reworded the description of “key” cosmetic
- “imf_query_dataset” reworded the description of “dataflow_id” cosmetic
- “imf_list_databases” reworded the description of “filter” cosmetic
- “imf_get_database” reworded the description of “dataflow_id” cosmetic
- “imf_get_database” reworded the description of “codelist_filter” cosmetic
- 28 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 25 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 19 Sept 26 0
- Server version: 0.4.1 → 0.4.2 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://imf.caseyjhand.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=caseyjhand.com | CN=WE1,O=Google Trust Services,C=US | 2 Nov 2026 | 31 Jan 2027 | ECDSA 256 | ECDSA-SHA256 | 995a30681ab772540e934241ca1d576c |
| SANs: caseyjhand.com, *.caseyjhand.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC secure
Validation of imf.caseyjhand.com. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| caseyjhand.com. | present | 2371 | 13 | Verified |
| imf.caseyjhand.com. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=63072000; includeSubDomains; preload |
| x-content-type-options | nosniff |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://imf.caseyjhand.com/mcp | Verified | 200 | |
| http (plaintext) | http://imf.caseyjhand.com/mcp | HTTPS enforced | 301 | https://imf.caseyjhand.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
imf_dataframe_describe Imf Dataframe Describe ~91
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.
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | yes | Canvas ID returned by imf_query_dataset whenever staged=true, from automatic spillover or output_mode="canvas". |
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | Canvas session ID that was introspected. |
| error | object | – | Present when the call failed. Absent on success. |
| table_count | number | – | Total number of tables on the canvas. |
| tables | array | – | All tables registered on this canvas. |
No examples provided.
imf_dataframe_query Imf Dataframe Query ~181
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. One SELECT statement per call; a leading WITH … SELECT (CTE) is accepted. DML and DDL are rejected.
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | yes | Canvas ID returned by imf_query_dataset whenever staged=true. Call imf_dataframe_describe with it before writing SQL. |
| sql | string | yes | Read-only SQL SELECT statement — exactly one statement, starting with SELECT or with a WITH … SELECT common table expression. Reference tables by the names returned by imf_dataframe_describe. Example… |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | Present when the call failed. Absent on success. |
| row_count | number | – | Number of materialized rows returned in rows. Always equals rows.length and never claims a pre-cap total. |
| rows | array | – | Largest result-row prefix whose complete structured and formatted response fits the 100,000-character response budget, after the canvas row limit (default 10,000) is applied. Values and column names… |
| truncated | boolean | – | True when DataCanvas capped the query at its row limit or the server omitted materialized rows to fit the response-size budget. Page the remainder with a stable ORDER BY plus LIMIT/OFFSET, or narrow… |
No examples provided.
imf_get_database Imf Get Database ~609
Fetch a dataflow's dimension list with a codelist preview for each dimension. Resolves human-readable terms to SDMX codes (e.g. "United States" → USA, "Constant prices" → NGDP_RPCH). Required before imf_query_dataset — SDMX keys are opaque without codelist lookups. Each codelist is capped at the first 50 entries by default, including previews filtered by codelist_filter. Set dimension_id to retrieve one codelist with bounded limit/offset paging after the optional codelist_filter, which keeps codes whose ID or name contains every word given. Set available_only=true to page codes the dataflow actually publishes, with series and time coverage metadata; availability filtering happens before codelist_filter and paging. The imf://database/{dataflow_id} resource provides the same bounded discovery summary. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| agency_id | string | – | Agency ID that publishes this dataflow, e.g. IMF.RES or IMF.STA, matched case-insensitively. Auto-detected from the dataflow list when omitted. |
| available_only | boolean | – | Return only codes reported by the dataflow-wide availability constraint. Default false keeps ordinary codelist discovery unchanged. |
| codelist_filter | string | – | Optional words to search for in each dimension's codelist, split on spaces and commas. A code matches when every word appears, case-insensitively, in its code ID or name; different words may match di… |
| dataflow_id | string | yes | Dataflow identifier from imf_list_databases, e.g. WEO, BOP, CPI. |
| dimension_id | string | – | Exact dimension ID from this tool, e.g. INDICATOR. Select one dimension to page beyond its preview. |
| limit | integer | – | Entries to return from the selected dimension. Valid only with dimension_id; default 50. One call returns at most 200, so a larger limit (up to 50,000) returns 200, echoes requested_limit and applied… |
| offset | integer | – | Matching entries to skip in the selected dimension before this page. Valid only with dimension_id; default 0. |
| version | string | – | Dataflow version, e.g. 9.0.0. Auto-detected from the dataflow list when omitted. |
| Name | Type | Req | Description |
|---|---|---|---|
| agency_id | string | – | Agency that publishes this dataflow, e.g. IMF.RES, IMF.STA. |
| applied_limit | number | – | The limit the selected dimension's page was cut to — the per-call maximum of 200 — echoed beside requested_limit. |
| available_only | boolean | – | True when dimensions contain published availability coverage rather than codelists. |
| codelist_filter | string | – | Echo of the codelist_filter that produced this result. Absent when no filter was applied — an empty codelist then means the codelist could not be resolved, not that the filter missed. |
| dataflow_id | string | – | Dataflow identifier, e.g. WEO, BOP, CPI. |
| description | string | – | This dataflow's own description in full — not the shared DSD's, and not the shortened preview imf_list_databases returns for the same id. Absent when the dataflow publishes none. |
| dimension_id | string | – | Selected dimension ID. Absent when previews for every dimension were returned. |
| dimensions | array | – | All dimension previews, or the one selected dimension page. |
| 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). |
| error | object | – | Present when the call failed. Absent on success. |
| 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. |
| notice | string | – | Populated when a codelist_filter matched no entries anywhere, or when a dimension has no resolvable codelist, or when offset is past the final match. |
| requested_limit | number | – | The limit requested, echoed only when it exceeded the per-call maximum of 200. |
| series_count | number | – | Total series published by the dataflow. Present when available_only is true. |
| 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. |
| time_period_end | string|null | – | Latest period with published data, or null when the constraint omits it. |
| time_period_start | string|null | – | Earliest period with published data, or null when the constraint omits it. |
| truncated | boolean | – | True when any returned dimension page omits matching codes. |
| version | string | – | Dataflow version string, e.g. 9.0.0. |
No examples provided.
imf_list_databases Imf List Databases ~351
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. Results are paged — 50 per call by default and at most 200, adjustable with limit and offset — and total_count reports how many dataflows matched. Descriptions are shortened here; imf_get_database returns the full text for a single dataflow.
| Name | Type | Req | Description |
|---|---|---|---|
| filter | string | – | Optional words to filter results by, split on spaces and commas. A dataflow matches when every word appears, case-insensitively, somewhere in its ID, name, or full description. Example: "exchange rat… |
| 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. |
| limit | integer | – | Maximum dataflows to return in this call. Default 50; one call returns at most 200, so a larger limit (up to 1,000) returns 200 and echoes requested_limit and applied_limit. total_count reports how m… |
| offset | integer | – | Number of matching dataflows to skip before this page. Combine with limit to page through a broad or unfiltered catalog. |
| Name | Type | Req | Description |
|---|---|---|---|
| applied_limit | number | – | The limit this page was cut to — the per-call maximum of 200 — echoed beside requested_limit. |
| cap | number | – | The limit that bounded this page. |
| dataflows | array | – | This page of matching dataflows; pass the id to imf_get_database to resolve dimension codelists. |
| error | object | – | Present when the call failed. Absent on success. |
| notice | string | – | Populated when the filter matches nothing, or when matches remain beyond this page — explains why and names the next offset to request. |
| offset | number | – | Number of matching dataflows skipped before this page. |
| requested_limit | number | – | The limit requested, echoed only when it exceeded the per-call maximum of 200. |
| returned_count | number | – | Dataflows in this page — the length of dataflows. |
| shown | number | – | Dataflows returned in this page. |
| total_count | number | – | Dataflows matching filter and include_vintages, before limit and offset are applied. Exceeds returned_count when more pages remain. |
| truncated | boolean | – | True when matching dataflows remain beyond this page. |
No examples provided.
imf_query_dataset Imf Query Dataset ~1,373
Query an IMF SDMX dataflow by dimension key over a time range. Returns observations with time_period, value, and status, plus the unit, scale, and decimals of each series — a key resolving to several series carries one entry per series in series_metadata, since unit and scale differ between them. An index series also carries the reference_period it is based on (e.g. 2010A, 2010=100) exactly as published, on the series and, where the dataflow publishes one per observation, on each observation. 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). Every position must carry a code: use + to combine codes (e.g. USA+GBR.NGDP_RPCH.A) and * to match every code at a position (e.g. *.NGDP_RPCH.A for all countries); * stands alone and cannot join a + list. Codes are matched case-insensitively and checked against each dimension's codelist before the query — an unknown code is rejected with the nearest valid codes. 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. When a + key returns data for some requested series and none for others, missing_series names each empty one with the reason a query for it alone gives (no_data or no_data_in_range). When the extra request that recovers the unit, scale, or decimals a + key suppresses fails, unresolved_attributes names them and how to get them. start_period and end_period must be valid period strings (YYYY, YYYY-SN, YYYY-QN, YYYY-MM, or a calendar-valid YYYY-MM-DD) with start_period no later than end_period; malformed or reversed ranges are rejected. A bound covers the whole period it names, so end_period 2023 includes 2023-M12 and 2023-Q4. last_n_observations keeps each series' last N observations — 1 is each series' latest value, the cheap wa…
| Name | Type | Req | Description |
|---|---|---|---|
| agency_id | string | – | Agency ID, e.g. IMF.RES or IMF.STA, matched case-insensitively. Auto-detected from dataflow list when omitted. |
| canvas_id | string | – | Existing canvas ID to accumulate results into across multiple queries. This selects the destination only; it does not force staging. Use output_mode="canvas" to stage an under-budget result. |
| dataflow_id | string | yes | Dataflow identifier from imf_list_databases, e.g. WEO, BOP, CPI. Matched case-insensitively; the response echoes the catalog spelling. |
| end_period | string | – | End of time range (inclusive). Same formats as start_period, and must not be earlier than it. The bound covers the whole period it names, so end_period 2023 admits 2023-M12 and 2023-Q4. Observations… |
| key | string | yes | Dot-separated dimension codes in DSD keyPosition order. Call imf_get_database to get key_format and valid codes first. Use + to combine codes at one position (e.g. USA+GBR.NGDP_RPCH.A). Use * to matc… |
| last_n_observations | integer | – | Keep only each series' last N observations, an integer from 1 to 1,000,000; 1 returns each series' latest value. Latest is per series: series end at different periods, and a WEO series ends in its pr… |
| output_mode | string | – | Result placement. auto returns an under-budget result inline and spills only when needed. canvas explicitly stages the full result, using canvas_id when supplied or allocating a fresh canvas. |
| start_period | string | – | Start of time range (inclusive). Accepts any of YYYY (annual), YYYY-SN (semi-annual, e.g. 2023-S1), YYYY-QN (quarterly, e.g. 2023-Q1), YYYY-MM (monthly), or a calendar-valid YYYY-MM-DD (daily), whate… |
| version | string | – | Dataflow version, e.g. 9.0.0. Auto-detected from dataflow list when omitted. |
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | DataCanvas session ID — present when staged=true. Pass first to imf_dataframe_describe, then to imf_dataframe_query. |
| dataflow_id | string | – | Dataflow identifier that was queried, in its catalog spelling, e.g. WEO. |
| end_period | string | – | Latest period covered; absent when the full available range was used. |
| error | object | – | Present when the call failed. Absent on success. |
| key | string | – | Dimension key used in the query, trimmed and with each code in its codelist spelling, e.g. USA.NGDP_RPCH.A. |
| last_n_observations | number | – | The last_n_observations input, echoed when set: observations holds each series' last N in the range. Absent when every observation was returned. |
| missing_series | array | – | Requested series of a + key that returned no observation while others did, in key order, at most 20. A requested series is each combination of the codes listed at every position. Counted over the ful… |
| missing_series_count | number | – | How many requested series returned no observation — the full count when missing_series stops at 20. Present with missing_series. |
| notice | string | – | Populated when empty or duplicate + members were dropped from key (naming each position and the key queried), or when a period bound was set but some observations carry a time_period label the range… |
| observation_count | number | – | Total observations in the result, after any last_n_observations selection. |
| observations | array | – | Inline observations, oldest period first. When truncated=true this is the budget-limited time-ascending prefix of the result; observation_count remains the full count. |
| retrieval_guidance | string | – | Present on every staged result, where it names the imf_dataframe_describe-before-imf_dataframe_query retrieval workflow, and on a result truncated without DataCanvas, where it names the last time_per… |
| series_attributes | object | – | Attributes of the first series in the result — the same series as series_metadata[0]. A key with + or * resolves to several series whose scale and unit differ, and this field describes only the first… |
| series_metadata | array | – | Per-series attributes, one entry per distinct series_key in the result. Present only when the query resolved to more than one series; a single-series query carries its values in series_attributes ins… |
| source | string | – | Attribution string required by IMF data terms: "Source: International Monetary Fund, <dataflow name>, <link>". |
| staged | boolean | – | True when the complete observation set is stored on DataCanvas. canvas_id and table_name are present whenever true. |
| 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 staged=true; reference in SQL via FROM <table_name>. |
| truncated | boolean | – | True only when observations is an incomplete preview of observation_count. A result can be staged=true and truncated=false when every observation also fits inline, and staged=false and truncated=true… |
| unresolved_attributes | object | – | Present only when a + key on the dimension an attribute is grouped by made the portal leave unit, scale, or decimals out, and the extra request that recovers them failed. A listed attribute that is n… |
No examples provided.
How do I install the io.github.cyanheads/imf-mcp-server server?
io.github.cyanheads/imf-mcp-server is a hosted endpoint at https://imf.caseyjhand.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · imf.caseyjhand.com
claude mcp add --transport http cyanheads-imf-mcp-server 'https://imf.caseyjhand.com/mcp'
What is the io.github.cyanheads/imf-mcp-server server?
io.github.cyanheads/imf-mcp-server is listed in the public MCP registry as io.github.cyanheads/imf-mcp-server. Query IMF SDMX 3.0 macroeconomic dataflows, WEO, BOP, CPI, exchange rates, 190 countries. This page covers its hosted endpoint (https://imf.caseyjhand.com/mcp).
Is the io.github.cyanheads/imf-mcp-server server safe to use?
io.github.cyanheads/imf-mcp-server scores 88 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.cyanheads/imf-mcp-server server expose?
io.github.cyanheads/imf-mcp-server exposes 5 tools: imf_list_databases, imf_get_database, imf_query_dataset, imf_dataframe_describe, imf_dataframe_query. Their descriptions and schemas cost roughly 2,605 tokens of context every time the server is loaded.
Does the io.github.cyanheads/imf-mcp-server server require authentication?
No. We connected to io.github.cyanheads/imf-mcp-server without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the io.github.cyanheads/imf-mcp-server server still maintained?
io.github.cyanheads/imf-mcp-server is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.