Convert currencies, get FX rates, and query historical ECB exchange rate data via MCP. STDIO or Streamable HTTP.
Strong tool definitions with comprehensive schemas, clear descriptions, and proper parameter documentation. All 8 tools have explicit input schemas with type definitions and descriptions. Tool names follow verb_noun convention (fx_convert_currency, fx_get_rate, fx_list_currencies). Descriptions are detailed (150-300 chars) and explain WHAT, WHEN, and WHAT-RETURNS. Parameters include ISO 4217 constraints, date format guidance, and optional field documentation. Error handling is implicit (e.g., 'Call fx_list_currencies to get valid codes'). Minor gaps: no explicit output schema documentation, no per-tool error recovery guidance, and no destructive operation confirmation pattern despite fx_dataframe_drop being DESTRUCTIVE.
Convert an amount between any two currencies at the latest or a historical rate. Returns the converted amount, the rate used, the actual rate date, and whether the date was snapped from a weekend/holiday to the prior business day. Cross-rates are triangulated through EUR automatically.
List tables and columns staged on a DataCanvas from a prior fx_get_timeseries call. Required first step before fx_dataframe_query — use it to discover table names and column schemas. Requires DataCanvas (CANVAS_PROVIDER_TYPE=duckdb) — without it this tool is not listed at all and fx_get_timeseries returns every range inline.
Permanently remove one table or view staged on a DataCanvas by fx_get_timeseries. This deletes staged analytical data only; ECB rate data is never affected and the same series can be re-staged by re-running fx_get_timeseries. Call fx_dataframe_describe first to get the exact table name. Disabled unless the deployment sets FX_ENABLE_CANVAS_DROP=true.
Run a read-only SQL SELECT against DataCanvas tables staged by fx_get_timeseries. Supports aggregations, GROUP BY, window functions, and JOINs across multiple registered tables. Run fx_dataframe_describe first to discover table names and column schemas. Requires DataCanvas (CANVAS_PROVIDER_TYPE=duckdb) — without it this tool is not listed at all and fx_get_timeseries returns every range inline.
fx_dataframe_drop is DESTRUCTIVE but lacks confirmation/dry-run pattern. No explicit guidance on recovery or undo steps.
Output schemas not explicitly documented. Tool descriptions mention what is returned (e.g., 'Returns the converted amount, the rate used...') but no formal schema definition visible in source.
Error handling relies on implicit recovery hints ('Call fx_list_currencies to get valid codes') rather than explicit error classification (retryable, user-fixable, fatal).
fx_get_timeseries and fx_dataframe_query accept canvas_id but do not document expiration policy or how to detect stale canvas references.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 71 | 2026-07-28+ | v2 |
Get the exchange rate for a currency pair on a given date (default: latest). Returns the rate, the actual rate date (which may differ from the requested date on weekends/holidays — ECB publishes business days only), and source provenance. Cross-rates are triangulated through EUR automatically. A same-currency pair returns a rate of 1, dated to the same publication day any other pair would report for that date. Use fx_convert_currency when you want the converted amount; use this tool when you only need the rate number.
Get all available exchange rates for one base currency in a single snapshot. Useful for bulk comparison and seeding downstream tools. Returns a map of quote currency → rate, the actual snapshot date, and whether a historical date was snapped from a weekend/holiday to the prior business day. Optionally filter to a subset of quote currencies via symbols. Listing the base currency itself in symbols is accepted and returns a rate of 1 for it.
Get historical daily exchange rates for a currency pair over a date range. ECB publishes on business days only — weekends and holidays produce no entry, and no date outside the requested range is ever returned, so a range covering only non-publication days comes back with an empty rates map and a notice explaining why. A same-currency pair returns a rate of 1 on each publication day in the range. Inline results are returned as a date→rate map paged at 500 publication days: rate_count is always the total for the requested range, and when a page is cut short the response carries truncated=true and next_start_date — call again with start_date set to next_start_date and the same end_date for the next page. When DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb) long ranges (>90 days by default) spill to it instead: the response carries spilled=true, a canvas_id, and a table_name — call fx_dataframe_describe to inspect the staged table, then fx_dataframe_query to run SQL against it. Without DataCanvas long ranges are paged inline (spilled=false) and the notice says so.
List all supported ISO 4217 currency codes with their full names. Call this before converting to disambiguate "dollars" (USD vs AUD vs CAD vs HKD vs SGD) or to validate a user-supplied currency code. Covers the ~30 ECB reference currencies.
No batch variants for multi-currency operations. Agents converting 10 currency pairs must call fx_convert_currency 10 times instead of one batch call.