cyanheads avatar

Exchange Rates Mcp Server

cyanheads/exchange-rates-mcp-server

Wraps the ECB's exchange rate data via the Frankfurter API with seven tools covering currency lookup, spot rates, historical conversions, and time series queries. You get point-in-time FX rates back to 1999, automatic cross-rate triangulation through EUR, and weekend/holiday date snapping with clear flags when the API returns a prior business day. Long time series (over 90 days) spill into a DuckDB-backed DataCanvas workspace where you can run SQL aggregations and window functions. Built on mcp-ts-core, runs over stdio or streamable HTTP, and needs no API keys. Useful when you need reliable historical currency data or want to analyze multi-year exchange rate trends without managing your own dataset.

GitHub stars
1
tools
7
transport
STDIO, HTTP
env vars
9
last updated
Nov 3, 2026

Install

From registry metadata
$ npx add-mcp https://exchange-rates.caseyjhand.com/mcp --name exchange-rates

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http exchange-rates https://exchange-rates.caseyjhand.com/mcp

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 7 tools

Verified live against the running server on Nov 6, 2026.

fx_list_currenciesList current Frankfurter v1 currency codes and names with as_of, the latest served rate date. include_retired=true adds historical codes absent from the current set. Optional official ECB start_date/end_date are outer coverage bounds, not uninterrupted availability; a dated en...1 params

List current Frankfurter v1 currency codes and names with as_of, the latest served rate date. include_retired=true adds historical codes absent from the current set. Optional official ECB start_date/end_date are outer coverage bounds, not uninterrupted availability; a dated en...

Parameters* required
include_retiredboolean
Include historical codes absent from current v1 discovery, default false. Optional official ECB coverage dates are outer bounds and may contain gaps.
fx_get_ratesGet 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...3 params

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

Parameters* required
base_currency*string
ISO 4217 base currency code (e.g. USD). Call fx_list_currencies to get valid codes.
datestring
ISO 8601 date (YYYY-MM-DD). Omit for the latest available rate. Frankfurter v1 data starts 1999-01-04. Future dates are not supported.
symbolsarray
Optional list of quote currency codes to filter the response. When provided, must contain at least one currency code — omit the field entirely, not an empty array, to return all ~30 supported curre...
fx_get_rateGet 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 — daily observations may skip non-publication days), and source provenance. Cross-rates are triang...3 params

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 — daily observations may skip non-publication days), and source provenance. Cross-rates are triang...

Parameters* required
base_currency*string
ISO 4217 base currency code (e.g. USD). Call fx_list_currencies to get valid codes.
datestring
ISO 8601 date (YYYY-MM-DD). Omit for the latest available rate. Frankfurter v1 data starts 1999-01-04. Future dates are not supported.
quote_currency*string
ISO 4217 quote currency code (e.g. EUR). The rate is expressed as "how many quote units per 1 base unit". Call fx_list_currencies to get valid codes.
fx_convert_currencyConvert 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 autom...4 params

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 autom...

Parameters* required
amount*number
Amount in the base currency to convert. Must be greater than zero.
base_currency*string
ISO 4217 source currency code (e.g. USD). Call fx_list_currencies to get valid codes.
datestring
ISO 8601 date (YYYY-MM-DD) for a historical rate. Omit for the latest available rate. Frankfurter v1 data starts 1999-01-04. Future dates are not supported.
quote_currency*string
ISO 4217 target currency code (e.g. EUR). The amount will be expressed in this currency. Call fx_list_currencies to get valid codes.
fx_get_timeseriesGet historical daily Frankfurter v1 rates over an inclusive date range. Same-date EUR legs are divided without intermediate rounding; only days with both currencies appear, including observed self-pairs at 1 and historical retired currencies. Missing-leg served days produce co...6 params

Get historical daily Frankfurter v1 rates over an inclusive date range. Same-date EUR legs are divided without intermediate rounding; only days with both currencies appear, including observed self-pairs at 1 and historical retired currencies. Missing-leg served days produce co...

Parameters* required
base_currency*string
ISO 4217 base currency code (e.g. USD). Call fx_list_currencies to get valid codes.
canvas_idstring
Existing canvas ID from a prior call explicitly requesting staging even for short or empty results. Every call creates a uniquely named table. Omit for automatic staging or inline paging.
end_date*string
ISO 8601 end date (YYYY-MM-DD). Must be >= start_date. Future dates are not supported.
limitinteger
Maximum observations returned in rates, default 500, clamped to 500. Use 0 for summary only; continue inline with a positive limit. Does not affect summary, counts, bounds, staging eligibility or t...
quote_currency*string
ISO 4217 quote currency code (e.g. EUR). Call fx_list_currencies to get valid codes.
start_date*string
ISO 8601 start date (YYYY-MM-DD). Frankfurter v1 data starts 1999-01-04. The actual first data point may be later if start_date falls on a weekend/holiday.
fx_dataframe_describeList 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, which is on by default — a deployment that turns it off does not list thi...1 params

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, which is on by default — a deployment that turns it off does not list thi...

Parameters* required
canvas_id*string
Canvas ID returned by fx_get_timeseries. Re-run fx_get_timeseries to obtain a fresh canvas_id if this one has expired.
fx_dataframe_queryRun 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, wh...3 params

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, wh...

Parameters* required
canvas_id*string
Canvas ID returned by fx_get_timeseries. Re-run fx_get_timeseries to obtain a fresh canvas_id if this one has expired.
query*string
Read-only SQL SELECT statement. Reference tables by the names returned by fx_dataframe_describe or the table_name field from fx_get_timeseries. Example: SELECT date, rate FROM <table_name> WHERE da...
row_limitinteger
Most rows to return (positive integer, default 150; values above 10000 clamp to 10000 with a notice). When the query produces more, truncated is true — page with ORDER BY <column> LIMIT <n> OFFSET...default: 150

Sponsors

Configuration

FRANKFURTER_BASE_URLdefault: https://api.frankfurter.dev/v1

Frankfurter API base URL. Override for local testing or self-hosted instances.

FX_TIMESERIES_CANVAS_THRESHOLD_DAYSdefault: 90

Day range above which fx_get_timeseries considers automatic DataCanvas staging for SQL analytics. Without canvas_id, series that fit the preview remain inline. DataCanvas is on by default; CANVAS_PROVIDER_TYPE=none returns ranges inline when canvas_id is omitted and rejects expli

FX_ENABLE_CANVAS_DROPdefault: false

Enable fx_dataframe_drop, which permanently removes one staged table or view from a DataCanvas. Disabled by default; the tool is not registered (absent from tools/list) until set to true.

MCP_LOG_LEVELdefault: info

Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').

MCP_TRANSPORT_TYPEdefault: http

Selects the HTTP transport.

MCP_HTTP_HOSTdefault: 127.0.0.1

The hostname for the HTTP server.

MCP_HTTP_PORTdefault: 3010

The port to run the HTTP server on.

MCP_HTTP_ENDPOINT_PATHdefault: /mcp

The endpoint path for the MCP server.

MCP_AUTH_MODEdefault: none

Authentication mode to use: 'none', 'jwt', or 'oauth'.

Readme

@cyanheads/exchange-rates-mcp-server

Convert currencies, get FX rates, and query historical Frankfurter v1 exchange rate data via MCP. STDIO or Streamable HTTP.

7 Tools • 1 Opt-in Tool • 2 Resources

Details

Repository
github.com/cyanheads/exchange-rates-mcp-server
Category
Data & Analytics
Package
@cyanheads/exchange-rates-mcp-server
Transport
STDIO, HTTP
Registry
MCP registry, active
Resources
6
Tools verified
Nov 6, 2026

More from cyanheads

Related Data & Analytics MCP servers

View all
1cyanheads avatarFcc Broadband Mcp Servercyanheads/fcc-broadband-mcp-serverFCC broadband availability, coverage analysis, and digital divide data for US geographies.1stars
2docupipe avatarDocuPipedocupipe/docupipe-mcpUpload documents and extract structured JSON from Claude Code, Codex, Cursor and other MCP clients.1stars
3estaite-solutions avatarEstaite Mcpestaite-solutions/estaite-mcpCurrent US rental market data for AI agents: 1,500+ submarkets, monthly rent + vacancy + trends.1stars
4fetter-io avatarFetter MCPfetter-io/fetter-mcpReal-time Python package and vulnerability data for AI coding agents.1stars
5flowiesner avatarFronius Mcpflowiesner/fronius-mcpReal-time Fronius inverter data in Claude — PV, battery, grid and smart meter via local Solar API.1stars
6generect avatarGenerectgenerect/generect_mcpB2B lead and company data for AI agents: free search, pay only for emails, phones, profiles.1stars