AllRatesToday MCP Server — @allratestoday/mcp-server
Website: https://allratestoday.com · Hosted endpoint (no install): https://allratestoday.com/api/mcp · Docs: https://allratestoday.com/mcp/
English | 简体中文
Give your AI assistant a live window into the foreign-exchange market. A Model Context Protocol server that lets Claude Code, Cursor, Claude Desktop, Windsurf, and any MCP-compatible client fetch real-time currency rates, historical series, and multi-currency lookups from the AllRatesToday API.
After installation, your assistant can answer questions like:
- "What's the current USD to EUR rate?"
- "Show me how GBP/JPY moved over the last 30 days."
- "Convert 250 USD into CAD at a real rate."
- "Compare USD against EUR, GBP, and JPY simultaneously."
🚀 Why this server?
- 📡 Live mid-market rates — 160+ ISO 4217 currencies, refreshed every ~60 seconds
- 📈 Historical series built in —
1d/7d/30d/1ywindows with sensible granularity per period - 🧰 Eight focused tools —
get_exchange_rate,get_historical_rates,get_rates_authenticated,list_currencies,list_central_banks,get_official_rates,get_reference_rate,request_trial_key; small surface, easy for the model to use correctly - 🔌 Works everywhere MCP does — stdio transport, MCP 1.x; Claude Code, Cursor, Claude Desktop, Windsurf, or any generic host
- 🔓 Works with no API key — installs and answers out of the box from open official central-bank tables (ECB first, else the bank that issues one of the two currencies); a free key unlocks real-time rates for 160+ currencies
- 🛡️ Honest about what it returned — every keyless answer says which rate it is and when it was published; API errors map to clear, actionable messages
- 🔒 Nothing leaks — only the request parameters and your API key ever reach allratestoday.com; never conversation context
⚖️ Mid-market vs official central-bank rates
With a key, get_exchange_rate, get_historical_rates and get_rates_authenticated return a mid-market rate, refreshed every ~60 seconds — the right number for price display, conversion, and anything that should track the market. It is not the official rate a tax authority or auditor may require. For those, call get_official_rates: the latest table published by any of 122 central banks and 4 tax authorities (ECB, Fed, HMRC, US Treasury, Swiss BAZG, …), fixed once published and carrying the institution's own rate_date, no key needed. list_central_banks gives the codes. Dated official tables (a past date) need an API key on a paid plan — a free key gets 403 Historical central bank rates require a paid plan. Mid-market history (get_historical_rates, and time on get_rates_authenticated) is paid-plan too — free and trial keys get 403. See the central bank REST API and per-bank npm SDKs. The two can diverge by several percent, so pick by use case, not convenience.
🔑 Get your API key (free)
A key unlocks real-time mid-market rates across 160+ currencies and multi-target lookups. The free tier is enough for development and trying it out — no credit card required. Historical series, point-in-time lookups and dated official and reference-rate tables need a paid plan from €4.99/month.
- Register at allratestoday.com/register — 30 seconds
- Verify your email
- Copy your key from the dashboard (format:
art_live_xxxxx) - Use it as
ALLRATES_API_KEYin the configs below
Without one the server prints a short summary of keyless mode (below) on stderr and keeps running — it never exits, because an MCP server that exits breaks the host client's whole configuration.
🔓 Keyless mode — what works with no setup
Install it with no configuration at all and it starts, connects, and answers:
| Tool | Keyless | What you get |
|---|---|---|
get_exchange_rate |
✅ | An official central-bank rate: the ECB reference table first, else the central bank that issues the target or source currency (USD/GBP → Bank of England, USD/INR → Reserve Bank of India). The response carries bank, rate_date, derived and a note saying so, so the assistant never passes it off as a live quote. Only pairs one bank publishes, or their inverses (flagged derived: true), work keyless; other crosses are refused with a pointer to the key. |
list_currencies |
✅ | All 160+ supported ISO 4217 codes. |
list_central_banks |
✅ | Codes, names and latest publication date of all 122 central banks and 4 tax authorities. |
get_official_rates |
✅ | Latest official table (or one pair) published by any of them. A dated table needs a paid-plan key. |
get_reference_rate |
✅ | The Daily Reference Rate: one never-revised table per business day, fixed at 16:00 London. A past date needs a paid-plan key. |
request_trial_key |
✅ | Self-issues a 100-call, 7-day key with no account and adopts it for the session. |
get_historical_rates |
🔑 | Returns one sentence explaining how to get a key. Needs a paid plan. |
get_rates_authenticated |
🔑 | Same. |
The keyless path reads the open, edge-cached /api/open/central-bank/{bank}
endpoints — no upstream cost, no rate limit to trip over, nothing to sign up for.
Attribution. Keyless use requires a visible, followable link to AllRatesToday wherever the rates are shown (a footer, an about page, a README). With an API key it is appreciated but not required.
<a href="https://allratestoday.com">Exchange rates by AllRatesToday</a>
Markdown: Exchange rates by [AllRatesToday](https://allratestoday.com). Full wording: https://allratestoday.com/terms/#attribution.
🧩 Easiest install: the Claude Code plugin
If you use Claude Code, install the plugin instead of configuring this server by
hand — it bundles both AllRatesToday MCP servers, two skills, and five slash
commands (/rate, /convert, /official-rate, /fx-history,
/add-currency-support):
/plugin marketplace add AllRates-Today/claude-code-plugin
/plugin install allratestoday@allratestoday
Everything below still applies for other MCP clients.
☁️ Hosted endpoint — nothing to install
The same tools also run as a hosted Streamable HTTP MCP server, which lists 11 tools: the 8 of this stdio package plus get_official_rate_history, compare_official_rates and get_publication_calendar from the sibling central-bank server. Paste the URL into any client that supports remote MCP — Claude.ai and Claude Desktop connectors, ChatGPT, Cursor, VS Code, Codex, Gemini CLI:
https://allratestoday.com/api/mcp
claude mcp add --transport http allratestoday https://allratestoday.com/api/mcp
Works keyless. With a key, send Authorization: Bearer art_live_… or, where the client only takes a URL, connect to https://allratestoday.com/api/mcp?api_key=art_live_…. That puts the key in the URL, where client configs, logs and screenshots can expose it: prefer the header when your client supports it, never share or commit that URL, and rotate the key at https://allratestoday.com/profile if it leaks. Registry name: com.allratestoday/mcp. One-click Cursor / VS Code buttons: https://allratestoday.com/mcp/#hosted
📦 Installation
The simplest install is zero-install via npx, which is what every config below uses:
# Run without installing (recommended)
npx -y @allratestoday/mcp-server
# Or install globally
npm install -g @allratestoday/mcp-server
allratestoday-mcp
Both commands launch the stdio MCP server and wait for a client to connect — they're not meant to be run interactively from your shell; your MCP client launches them as a subprocess.
🏁 Quick setup per client
Each client reads MCP servers from a different config file. Pick yours below.
Claude Code
The fastest path uses the built-in CLI:
claude mcp add allratestoday -- npx -y @allratestoday/mcp-server
claude mcp env allratestoday ALLRATES_API_KEY=art_live_xxxxx
Restart Claude Code. Verify by asking it: "What's the current USD to EUR rate?"
Cursor
Edit ~/.cursor/mcp.json (or .cursor/mcp.json inside your project for project-scoped servers):
{
"mcpServers": {
"allratestoday": {
"command": "npx",
"args": ["-y", "@allratestoday/mcp-server"],
"env": {
"ALLRATES_API_KEY": "art_live_xxxxx"
}
}
}
}
Restart Cursor. The eight tools should appear in the MCP tool picker.
Claude Desktop
Edit the config file (path depends on OS):
| OS | Path |
|---|---|
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
| Linux | ~/.config/Claude/claude_desktop_config.json |
{
"mcpServers": {
"allratestoday": {
"command": "npx",
"args": ["-y", "@allratestoday/mcp-server"],
"env": {
"ALLRATES_API_KEY": "art_live_xxxxx"
}
}
}
}
Fully quit and reopen Claude Desktop (Cmd+Q on macOS, right-click tray icon → Exit on Windows). Closing the window alone keeps the old config loaded.
Windsurf
Edit ~/.codeium/windsurf/mcp_config.json with the same mcpServers block as above, then restart Windsurf.
Generic stdio MCP client
Any MCP host that supports stdio transport works. The launch command is:
npx -y @allratestoday/mcp-server
…with the environment variable ALLRATES_API_KEY set. The protocol version is MCP 1.x.
✅ Verify it works
After configuring your client, test in this order:
- Server starts — open the client. The server starts with or without a key (no key ⇒ keyless mode), so a red dot or "failed to connect" means the client could not launch it — usually
npxor Node ≥18 (see Troubleshooting below). A wrong key does not stop it starting; calls then returnInvalid AllRatesToday API key. - Tools are listed — most clients have a "tools" or "MCP" panel showing the eight tools.
- A live call returns a number — ask: "What's the current USD to EUR rate?" The assistant should call
get_exchange_rate(source: "USD", target: "EUR")and reply with a real rate. If it fabricates a number without a tool call, the server isn't connected.
More prompts that exercise the other tools:
- "What was the ECB's official USD rate on the latest published table?" →
get_official_rates - "Give me today's 16:00 London reference rate for EUR, GBP and JPY." →
get_reference_rate - "Which central banks can you get official rates from?" →
list_central_banks - "Convert 250 USD to CAD." →
get_exchange_rate
🧪 Test with MCP Inspector
To check the server on its own, without any AI client in the way, run it under the official MCP Inspector:
npx @modelcontextprotocol/inspector npx -y @allratestoday/mcp-server
- Open the URL it prints and click Connect. The Tools tab should list the eight tools.
- Call
get_exchange_ratewithsource: USD,target: EUR— it answers keyless with an official rate. - Set
ALLRATES_API_KEYin the Inspector's environment panel, reconnect, and call it again — now it returns the live mid-market rate.
If this works but your client doesn't, the problem is the client's config (path to npx, Node version, JSON syntax), not the server.
📚 Tools reference
get_exchange_rate— current rate for one pairget_historical_rates— time series over a preset periodget_rates_authenticated— multiple targets in one call, optional point-in-timelist_currencies— all supported currency codes, names, symbolslist_central_banks— every covered central bank / tax authority with its code and latest publication dateget_official_rates— the official table (or one pair) a named institution publishedget_reference_rate— the Daily Reference Rate, one fixed mid-market table per business day (16:00 London)request_trial_key— self-issue a 100-call, 7-day trial key, no account needed
get_historical_rates and get_rates_authenticated require ALLRATES_API_KEY; the other six of the eight work keyless. History (get_historical_rates, and time on get_rates_authenticated) needs a paid plan.
get_exchange_rate
Current mid-market rate between two currencies.
Input
| Field | Type | Required | Description |
|---|---|---|---|
source |
string | yes | 3-letter ISO 4217 code, e.g. USD |
target |
string | yes | 3-letter ISO 4217 code, e.g. EUR |
Example call
{ "source": "USD", "target": "EUR" }
Response (with a key):
{ "rate": 0.888889, "source": "mid-market" }
Response (keyless — USD → GBP, not in the ECB table, so the Bank of England table answers):
{
"rate": 0.7598784195,
"source": "Bank of England official rate (keyless mode)",
"bank": "boe",
"rate_date": "2026-10-14",
"derived": true,
"note": "Keyless mode: this is the Bank of England official rate published on 2026-10-14, not a live mid-market quote. For real-time rates across 160+ currencies set ALLRATES_API_KEY — free tier at https://allratestoday.com/register."
}
derived: true means the bank publishes the inverse (GBP→USD) and the rate was inverted. A pair no single bank publishes is refused keyless with No keyless official source covers … and a pointer to the key.
get_historical_rates
Time-series data points for a currency pair over a fixed period. Needs an API key on a paid plan (free and trial keys get a 403).
Input
| Field | Type | Required | Description |
|---|---|---|---|
source |
string | yes | Source currency code |
target |
string | yes | Target currency code |
period |
string | no (default 7d) |
One of 1d, 7d, 30d, 1y |
Granularity by period
period |
Data points |
|---|---|
1d |
Hourly (24 points) |
7d |
Daily (7 points) |
30d |
Daily (30 points) |
1y |
Weekly (52 points) |
Example call
{ "source": "USD", "target": "INR", "period": "30d" }
Response (truncated):
{
"source": "USD",
"target": "INR",
"period": "30d",
"data": [
{ "date": "2026-09-17", "rate": 96.1006, "timestamp": 1789603200000 },
{ "date": "2026-09-18", "rate": 95.8142, "timestamp": 1789689600000 },
"...",
{ "date": "2026-10-16", "rate": 94.9643, "timestamp": 1792108800000 }
]
}
get_rates_authenticated
Multiple targets in one call, with optional historical timestamp or grouping window.
Input
| Field | Type | Required | Description |
|---|---|---|---|
source |
string | yes | Source currency code |
target |
string | yes | One or more codes, comma-separated (EUR,GBP,JPY) |
time |
string (ISO 8601) | no | Historical point in time (paid plans) |
group |
string | no | One of hour, day, week, month |
Example call
{ "source": "USD", "target": "EUR,GBP,JPY" }
Response:
{
"rates": [
{ "rate": 0.888889, "source": "USD", "target": "EUR", "time": "2026-10-16T12:16:01+0000" },
{ "rate": 0.749766, "source": "USD", "target": "GBP", "time": "2026-10-16T12:16:01+0000" },
{ "rate": 157.985, "source": "USD", "target": "JPY", "time": "2026-10-16T12:16:01+0000" }
]
}
list_currencies
All supported currencies with codes, names, and symbols. Cached upstream for 24 hours — cheap to call for validating user input before the other tools.
Input — none.
Response (truncated):
{
"currencies": [
{ "code": "USD", "name": "US Dollar", "symbol": "$" },
{ "code": "EUR", "name": "Euro", "symbol": "€" },
{ "code": "GBP", "name": "British Pound", "symbol": "£" },
"..."
],
"count": 163
}
list_central_banks
Every official source the server can quote — 122 central banks plus HMRC, the US Treasury, Swiss BAZG and India's CBIC — with the code that get_official_rates takes as bank, the institution's name, its latest publication date, age_days, its publication cadence and a stale flag when it is behind its own schedule. Keyless.
Input — none.
Response (truncated):
{
"sources": [
{ "code": "ecb", "name": "European Central Bank", "latest": "2026-10-15", "age_days": 1, "stale": false, "cadence": "daily" },
{ "code": "fed", "name": "US Federal Reserve (H.10)", "latest": "2026-10-09", "age_days": 7, "stale": false, "cadence": "weekly" },
"..."
],
"stale_count": 3,
"checked_at": "2026-10-16T12:16:46.232Z"
}
get_official_rates
The fixed, citable rate an institution published — for invoices, VAT and tax returns, customs, transfer pricing and audit. Not a live market rate.
Input:
| Field | Type | Required | Description |
|---|---|---|---|
bank |
string | yes | Source code from list_central_banks, e.g. ecb, fed, boe, rbi, hmrc |
date |
string | no | YYYY-MM-DD. Omit for the latest table (keyless). Needs an API key on a paid plan — a free key gets 403 Historical central bank rates require a paid plan. Weekends/holidays roll back to the last published date. |
source |
string | no | With target, narrows to one pair |
target |
string | no | With source, narrows to one pair |
Response (one pair):
{
"bank": "ecb",
"rate_date": "2026-10-15",
"source": "EUR",
"target": "USD",
"rate": 1.1208,
"rate_type": "reference",
"derived": false,
"method": "published",
"age_days": 1,
"stale": false,
"cadence": "daily",
"attribution": { "source": "Official rates published by ECB, served by AllRatesToday", "url": "https://allratestoday.com/central-bank-rates-api/ecb/", "terms": "Free to use with visible attribution linking to allratestoday.com" }
}
Omit source/target for the whole table as rates: [{ base, quote, type, value }]. Keyless, only pairs the bank publishes and their inverses (flagged derived: true) are served; other crosses are refused. With a key, pairs the bank does not publish directly are cross-computed inside its own table and flagged derived: true. Always cite rate_date.
get_reference_rate
AllRatesToday's Daily Reference Rate: the per-currency median of samples taken in a five-minute window centred on 16:00 London, published once per business day and never revised. Use it when a report, index or research series needs one reproducible rate per day. It is not the WM/Refinitiv fix and not a registered benchmark; every response carries a disclaimer and the rate_date.
Input
| Field | Type | Required | Description |
|---|---|---|---|
source |
string | no | With target, narrows to one pair (crossed via USD, flagged derived) |
target |
string | no | See above |
date |
string | no | Past business day YYYY-MM-DD (API key on a paid plan). Omit for the latest table |
Output — { rate_date, base, time, rates } for the table, or { rate_date, source, target, rate, derived } for a pair, plus method and disclaimer. Keyless for the latest table. Docs: https://allratestoday.com/reference-rate/
request_trial_key
Self-issues an API key with 100 lifetime calls, valid 7 days, with no account and no email, and switches this server to it for the rest of the session. The reply tells the user to copy the key into the MCP c
