currencyfreaks-mcp
OfficialCurrencyFreaks MCP Server
Official MCP server for CurrencyFreaks. Exposes 7 MCP tools for real-time and historical exchange rates and currency conversion across 1000+ fiat currencies, cryptocurrencies, and precious metals. Your AI assistant asks for rates in plain English; the MCP server handles the API calls.
Works with Claude Desktop, Claude Code, Cursor, Windsurf, VS Code, Cline, Codex, and any other MCP-compatible client.
Item | Value |
Package |
|
Transport |
|
Node.js |
|
Quick Start
Get a free CurrencyFreaks API key — 1,000 requests a month, no card required.
Cursor users can install in one click:
Everyone else: add this to your MCP client config (see Install by Client for the exact file path):
{
"mcpServers": {
"currencyfreaks": {
"command": "npx",
"args": ["-y", "@currencyfreaks/mcp"],
"env": {
"CURRENCYFREAKS_API_KEY": "<YOUR_API_KEY>"
}
}
}
}Restart your client.
Test it: ask "What's the current EUR to USD exchange rate?"
Related MCP server: Frankfurter Forex MCP
Table of Contents
Install by Client
Requirements
Node.js 18 or later
npxavailable in your terminalA CurrencyFreaks API key — sign up free
Claude Desktop
Add to claude_desktop_config.json (Settings → Developer → Edit Config):
{
"mcpServers": {
"currencyfreaks": {
"command": "npx",
"args": ["-y", "@currencyfreaks/mcp"],
"env": {
"CURRENCYFREAKS_API_KEY": "<YOUR_API_KEY>"
}
}
}
}Restart Claude Desktop after saving.
Claude Code
claude mcp add currencyfreaks --env CURRENCYFREAKS_API_KEY=<YOUR_API_KEY> -- npx -y @currencyfreaks/mcpStart a new Claude Code session after adding the server.
Cursor
One-click install:
Or add to .cursor/mcp.json manually:
{
"mcpServers": {
"currencyfreaks": {
"command": "npx",
"args": ["-y", "@currencyfreaks/mcp"],
"env": {
"CURRENCYFREAKS_API_KEY": "<YOUR_API_KEY>"
}
}
}
}Restart Cursor after saving.
Windsurf
Add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"currencyfreaks": {
"command": "npx",
"args": ["-y", "@currencyfreaks/mcp"],
"env": {
"CURRENCYFREAKS_API_KEY": "<YOUR_API_KEY>"
}
}
}
}Restart Windsurf after saving.
VS Code / GitHub Copilot
Add to your VS Code settings.json:
{
"mcp": {
"servers": {
"currencyfreaks": {
"command": "npx",
"args": ["-y", "@currencyfreaks/mcp"],
"env": {
"CURRENCYFREAKS_API_KEY": "<YOUR_API_KEY>"
}
}
}
}
}Restart VS Code after saving.
Cline
Open MCP Servers panel → Configure → Advanced MCP Settings. Add to cline_mcp_settings.json:
{
"mcpServers": {
"currencyfreaks": {
"command": "npx",
"args": ["-y", "@currencyfreaks/mcp"],
"env": {
"CURRENCYFREAKS_API_KEY": "<YOUR_API_KEY>"
}
}
}
}Restart Cline after saving.
Codex CLI
codex mcp add currencyfreaks --env CURRENCYFREAKS_API_KEY=<YOUR_API_KEY> -- npx -y @currencyfreaks/mcp
codex mcp listStart a new Codex session after adding the server.
Any Other MCP Client
Use this config:
{
"command": "npx",
"args": ["-y", "@currencyfreaks/mcp"],
"env": {
"CURRENCYFREAKS_API_KEY": "<YOUR_API_KEY>"
}
}Verify It Works
Try these after setup:
Prompt | Expected tool |
What's the current EUR to USD exchange rate? |
|
Convert 500 USD to PKR. |
|
What was 1,000 GBP worth in JPY on 2026-01-15? |
|
What was the EUR/USD rate on January 2nd, 2020? |
|
Show daily USD to INR rates for the first week of August 2026. |
|
How much has the yen moved against the dollar since June 1st? |
|
What's the currency code for the Nepalese rupee? |
|
What's 50 USD in the local currency of IP 182.186.18.9? |
|
Tool Reference
All 7 tools wrap the CurrencyFreaks v2.0 REST API. Tools that take symbols accept a comma-separated list of currency codes (e.g. EUR,GBP,PKR), case-insensitive. Use list_currencies to look up a code — there are 1000+ across fiat, crypto, and metals.
Precious metals use ISO 4217 codes: XAU (gold), XAG (silver), XPT (platinum), XPD (palladium). The API returns all rates and amounts as strings to preserve precision.
list_currencies
GET /v2.0/currency-symbols (compact) or GET /v2.0/supported-currencies (detailed) — the supported currency catalogue. No API key required.
Parameter | Required | Description |
| No | Case-insensitive substring matched against code, name, or (with |
| No |
|
get_latest_rates
GET /v2.0/rates/latest — latest rates for one or more currencies against a base. Refresh frequency depends on plan: daily on Developer (free), hourly on Starter, every 10 minutes on Growth, every 60 seconds on Professional and above.
Parameter | Required | Description |
| No | Comma-separated currency codes. Omit for all 1000+ currencies. |
| No | Base currency code. Default |
convert_currency
GET /v2.0/convert/latest, or GET /v2.0/convert/historical when date is given — convert an amount between two currencies. Paid plans only.
Parameter | Required | Description |
| Yes | Currency code to convert from |
| Yes | Currency code to convert to |
| No | Amount to convert, greater than 0. Default |
| No |
|
get_historical_rates
GET /v2.0/rates/historical — rates on a specific past date. Major fiat currencies go back to 1984-11-28; newer currencies and crypto start from their own listing date. Paid plans only.
Parameter | Required | Description |
| Yes |
|
| No | Comma-separated currency codes. Omit for all. |
| No | Base currency code. Default |
get_time_series
GET /v2.0/timeseries — daily rates between two dates, one entry per day. Professional plan and above.
Parameter | Required | Description |
| Yes |
|
| Yes |
|
| No | Comma-separated currency codes |
| No | Base currency code. Default |
get_fluctuation
GET /v2.0/fluctuation — how each currency moved between two dates: start rate, end rate, absolute change, and percent change. Professional plan and above.
Sign convention: change is startRate - endRate. A positive change means the rate fell (the symbol currency strengthened against the base); a negative change means the rate rose (the symbol currency weakened).
Parameter | Required | Description |
| Yes |
|
| No |
|
| No | Comma-separated currency codes |
| No | Base currency code. Default |
ip_to_currency
GET /v2.0/iptocurrency — resolves the local currency from an IP address's geolocation and converts an amount into it. The target currency comes back in the to field. Growth plan and above.
Parameter | Required | Description |
| Yes | Currency code to convert from |
| No | IPv4 or IPv6 address. Omit to use the caller's own IP. |
| No | Amount to convert. Default |
Plan Requirements
Feature | Minimum plan |
| None (no API key needed) |
| Developer (free) |
| Starter |
| Starter |
| Starter |
| Growth |
| Professional |
| Professional |
Calls that exceed the plan return a 402 error with guidance (see Error Codes).
Prompt Examples
Live rates
What's the current EUR to USD exchange rate?
Give me the latest rates for GBP, JPY, and CHF against the euro.
What's bitcoin worth in USD right now?
What's the gold price in euros?
Conversion
Convert 250 USD to Indian rupees.
How many yen is 1,200 euros?
What was 500 GBP worth in USD on 2025-12-31?
Historical data
What was the USD to PKR rate on January 2nd, 2020?
Show me daily EUR/USD rates for Q1 2026.
Compare the pound and the euro against the dollar over the last 30 days.
Price changes
How much has the Turkish lira dropped against the dollar since January 1st?
Did ETH go up or down versus USD this month, and by how much?
Discovery
What's the currency code for the Kazakhstani tenge?
Which currencies does CurrencyFreaks support for Africa?
How far back does historical data go for the Nigerian naira?
Example Answers and Tool Output
The text answers show what a client might say; exact wording depends on the model. JSON blocks are raw tool output.
Latest rates
Prompt: What are the latest EUR, GBP, and PKR rates against the dollar?
Example answer: As of 2026-08-25 13:26 UTC, 1 USD buys 0.9279 EUR, 0.8173 GBP, or 281.62 PKR.
{
"date": "2026-08-25 13:26:00+00",
"base": "USD",
"rates": {
"EUR": "0.9278605451274349",
"GBP": "0.8172754173817152",
"PKR": "281.6212943333344",
"USD": "1.0"
}
}Conversion
Prompt: Convert 500 USD to PKR.
Example answer: 500 USD is 140,841.48 PKR at a rate of 281.683.
{
"date": "2026-08-25 15:22:00+00",
"from": "USD",
"to": "PKR",
"rate": "281.683",
"givenAmount": "500.0",
"convertedAmount": "140841.475"
}Fluctuation
Prompt: How did the Pakistani rupee move against the pound between June 1st and June 15th, 2026?
Example answer: PKR strengthened against the pound, going from 254.331 to 243.874 per GBP, a move of 10.457 (4.11%).
{
"startDate": "2026-06-01",
"endDate": "2026-06-15",
"base": "GBP",
"rateFluctuations": {
"PKR": {
"startRate": "254.331",
"endRate": "243.874",
"change": "10.457",
"percentChange": "4.11"
}
}
}Currency lookup
Prompt: What's the currency code for the Nepalese rupee?
Example answer: The Nepalese rupee is NPR.
{
"count": 6,
"currencies": {
"SCR": "Seychellois Rupee",
"MUR": "Mauritius Rupee",
"INR": "Indian Rupee",
"PKR": "Pakistani Rupee",
"LKR": "Sri Lankan Rupee",
"NPR": "Nepalese Rupee"
}
}Error Codes
Tool calls never crash the server. Upstream errors are returned as structured tool results with error, code, message, and a guidance field so the client can explain what went wrong instead of echoing a status code.
Code | Meaning |
| Missing API key, or invalid parameters (bad currency code, date format, amount, or IP address) |
| API key is invalid or inactive — check |
| Feature not included in the current plan — see Plan Requirements |
| Rates not found for the requested currency, date, or interval |
| Monthly request quota exhausted — upgrade or wait for the reset |
| Request to the upstream API timed out (see |
| Server could not reach the upstream API |
Example error result for an invalid key:
{
"error": "Invalid Api Access Exception",
"code": 401,
"message": "Provided API key is invalid. [Contact tech. support for assistance at support@currencyfreaks.com]",
"guidance": "The API key is invalid or inactive. Check CURRENCYFREAKS_API_KEY in your MCP client config and confirm the key is active on the CurrencyFreaks dashboard."
}How It Works
This is a stdio MCP server that wraps the CurrencyFreaks v2.0 REST API.
At runtime:
Your MCP client starts the server process via
npx.The client reads the tool list.
When a prompt matches a tool, the client calls it.
The server validates inputs, calls CurrencyFreaks, and returns structured JSON.
The API key is read from the environment on each call and sent as the apikey query parameter. The catalogue endpoints behind list_currencies are public, so that tool works even before a key is configured.
Environment Variables
Variable | Required | Default | Description |
| Yes | Your CurrencyFreaks API key | |
| No |
| Upstream request timeout in ms |
Building from Source
git clone https://github.com/CurrencyFreaks/currencyfreaks-mcp.git
cd currencyfreaks-mcp
npm install
npm run buildRun it directly:
CURRENCYFREAKS_API_KEY=<YOUR_KEY> node dist/cli.jsInspect with the MCP Inspector:
CURRENCYFREAKS_API_KEY=<YOUR_KEY> npx @modelcontextprotocol/inspector node dist/cli.jsTroubleshooting
Client uses an old tool list after updating: Restart the client and confirm it loaded the latest npm version.
400 "Please provide API Key": CURRENCYFREAKS_API_KEY is not set in your MCP client config's env block.
401 errors: The key is wrong or inactive. Copy it again from the CurrencyFreaks dashboard.
402 errors: The tool needs a higher plan. See Plan Requirements. On the Developer (free) plan only get_latest_rates with the default USD base and list_currencies work.
404 "Rates of provided currency X are available from A to B": The date is outside that currency's data range. Call list_currencies with search=X and detailed=true to see availableFrom and availableUntil.
Huge responses: Always pass symbols to the rate tools and search to list_currencies. Without them the API returns all 1000+ currencies.
499 timeouts: The upstream API did not respond in time. Increase CURRENCYFREAKS_REQUEST_TIMEOUT_MS (default: 15000 ms).
Pricing
Developer plan is free with 1,000 requests a month, no card required. Paid plans add base currency selection, conversion, historical data, time series, fluctuation, and IP-to-currency, with faster refresh rates. See the CurrencyFreaks pricing page.
Links
License
Available Tools
7 toolsconvert_currencyConvert an amount between currenciesA
Converts an amount from one currency to another using the latest rate, or the rate on a past date if 'date' is given. Returns the rate used, the given amount, and the converted amount. Starter plan and above (any paid plan).
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Currency code to convert to, e.g. 'EUR'. | |
| date | No | Optional past date (YYYY-MM-DD) to convert at that day's rate instead of the latest rate. | |
| from | Yes | Currency code to convert from, e.g. 'USD'. | |
| amount | No | Amount to convert. Must be greater than 0. Default is 1.0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and adds real value: it discloses the plan requirement ('Starter plan and above') and the returned fields (rate used, given amount, converted amount). It does not cover failure behavior (invalid currency code, out-of-range date), which is the remaining gap for a no-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then the return contract, then the access requirement. Nothing is redundant and no sentence could be dropped without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter tool with no output schema, the description covers the operation, the date variant, the return contents, and plan gating — enough to call it correctly. Only error/edge-case behavior is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters — including the YYYY-MM-DD pattern for 'date' and the exclusiveMinimum on 'amount' — are already documented in the schema. The description's mention of the date conditional restates rather than extends the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('converts an amount from one currency to another') plus the basis for the conversion (latest rate or a past date's rate). It implicitly separates itself from the rate-listing siblings (get_latest_rates, get_historical_rates) by returning a converted amount, but never names or contrasts them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states the condition that selects the historical behavior: supply 'date' for a past day's rate, omit it for the latest rate. There are no explicit exclusions or named alternative tools for the rate-only lookups, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fluctuationGet exchange rate fluctuationA
Returns how currencies moved between two dates: start rate, end rate, absolute change, and percent change for each symbol against the base. Note the sign convention: change = startRate - endRate, so a POSITIVE change means fewer units per base, i.e. the symbol currency strengthened against the base, and a NEGATIVE change means the rate rose and the symbol currency weakened. Professional plan and above.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Base currency code the rates are expressed against (e.g. 'EUR'). Default is USD. Changing the base requires the Starter plan or above (any paid plan). | |
| endDate | No | End date in YYYY-MM-DD format. Defaults to the day before today. | |
| symbols | No | Comma-separated currency codes to return, e.g. 'EUR,GBP,PKR' or 'BTC,ETH' or 'XAU,XAG'. Case-insensitive. Omit to get every supported currency (1000+ entries) — prefer passing symbols to keep responses small. Use list_currencies to look up a code. | |
| startDate | Yes | Start date in YYYY-MM-DD format. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden well: it discloses the returned fields, the sign convention with a worked interpretation (positive = symbol strengthened), and the plan gating. It does not mention rate limits or behavior when dates are invalid/reversed, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The output fields are front-loaded in the first clause, followed by the sign convention and plan note. The sign-convention sentence is long but each part earns its place by preventing a real interpretation error; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description must specify the response shape and safety/permission context — it does both by enumerating return fields and stating the plan requirement. Minor gap: no guidance on default date behavior beyond what the schema provides or on large-symbol responses.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so base, startDate, endDate, and symbols are already fully documented in the schema, including defaults and the symbols guidance. The description adds no parameter-level meaning beyond the sign convention, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns how currencies moved between two dates') and enumerates the returned metrics (start rate, end rate, absolute change, percent change). It is clearly distinct from a raw rate lookup, though it does not explicitly name the closest siblings (get_time_series, get_historical_rates) that an agent might confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear operational precondition ('Professional plan and above') and implies usage for two-date comparison, but it never says when to prefer this over get_time_series or get_historical_rates. The choice among siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_historical_ratesGet historical exchange ratesA
Returns exchange rates for a specific past date. Major fiat currencies go back to 1984-11-28; newer currencies and crypto start from their own listing date (see list_currencies with detailed=true). Starter plan and above (any paid plan).
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Base currency code the rates are expressed against (e.g. 'EUR'). Default is USD. Changing the base requires the Starter plan or above (any paid plan). | |
| date | Yes | Date in YYYY-MM-DD format. | |
| symbols | No | Comma-separated currency codes to return, e.g. 'EUR,GBP,PKR' or 'BTC,ETH' or 'XAU,XAG'. Case-insensitive. Omit to get every supported currency (1000+ entries) — prefer passing symbols to keep responses small. Use list_currencies to look up a code. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose two meaningful behavioral facts: data-availability boundaries and plan gating (Starter+). It is silent on response shape, payload size (the 1000+ entry default lives only in the schema), and whether requests for pre-coverage dates error or return empty.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what the tool returns, then coverage limits, then plan requirement. No filler; the parenthetical pointer to list_currencies is actionable rather than decorative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations, so the description must stand alone — and it covers purpose, data availability, plan requirement, and a currency-lookup escape hatch. The remaining gap is what the response looks like and how out-of-range dates behave, which an agent needs before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameters are already documented, including base-plan gating and the symbols size warning. The description adds the date lower bound (1984-11-28) and per-currency listing dates, which genuinely extend the bare 'YYYY-MM-DD format' schema text, but it adds nothing about base or symbols.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource+scope: 'Returns exchange rates for a specific past date' precisely separates it from get_latest_rates without naming the sibling. It does not explicitly name alternatives, but the temporal qualifier makes the distinction usable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real constraints on when the tool works: historical coverage from 1984-11-28 for major fiat, per-currency listing dates for newer/crypto, and a paid-plan requirement. It never explicitly contrasts with get_latest_rates or get_time_series, leaving the choice of tool to the name rather than stated guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_latest_ratesGet latest exchange ratesA
Returns the latest exchange rates for one or more currencies against a base currency (USD by default). Covers fiat, crypto, and metals. Rates are returned as strings; refresh frequency depends on the plan (daily on Developer/free, hourly on Starter, every 10 minutes on Growth, every 60 seconds on Professional). Omit 'symbols' to get all 1000+ currencies.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Base currency code the rates are expressed against (e.g. 'EUR'). Default is USD. Changing the base requires the Starter plan or above (any paid plan). | |
| symbols | No | Comma-separated currency codes to return, e.g. 'EUR,GBP,PKR' or 'BTC,ETH' or 'XAU,XAG'. Case-insensitive. Omit to get every supported currency (1000+ entries) — prefer passing symbols to keep responses small. Use list_currencies to look up a code. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it discloses that rates are returned as strings, that refresh frequency varies by plan (daily/hourly/10min/60s), and that the response can balloon to 1000+ entries. It stops short of describing error behavior or the response shape (e.g. a code→rate mapping).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose and followed by constraints and the key caveat. The plan-tier refresh sentence is dense but earns its place; nothing is redundant enough to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-optional-parameter read tool with no annotations and no output schema, the description covers scope, return type, freshness, and response-size risk. The main gap is the shape of the returned payload, which matters here precisely because no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already fully documented, including the default base of USD, the comma-separated symbol format, and the advice to prefer passing symbols. The description's 'Omit symbols to get all 1000+ currencies' restates the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (returns latest exchange rates) plus scope (fiat, crypto, metals; against a base currency). The word 'latest' implicitly separates it from get_historical_rates, get_time_series, and get_fluctuation, but no sibling is named, so an agent must infer the boundary rather than read it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage guidance is limited to parameter-level advice ('Omit symbols to get all 1000+ currencies'). There is no statement of when to pick this over convert_currency (single conversion) or get_historical_rates, and no mention of the plan prerequisite for changing base beyond what the schema already says.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_time_seriesGet daily exchange rate time seriesB
Returns daily exchange rates for one or more currencies between two dates, one entry per day. Professional plan and above.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Base currency code the rates are expressed against (e.g. 'EUR'). Default is USD. Changing the base requires the Starter plan or above (any paid plan). | |
| endDate | Yes | End date in YYYY-MM-DD format. | |
| symbols | No | Comma-separated currency codes to return, e.g. 'EUR,GBP,PKR' or 'BTC,ETH' or 'XAU,XAG'. Case-insensitive. Omit to get every supported currency (1000+ entries) — prefer passing symbols to keep responses small. Use list_currencies to look up a code. | |
| startDate | Yes | Start date in YYYY-MM-DD format. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It does add real context: plan gating and the one-entry-per-day shape of the result. It omits what happens with large ranges, empty intervals, response size/pagination behavior, and error conditions, which matter for a date-range query tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the capability and followed by the access constraint; no filler. It is arguably under-sized for a tool with zero annotation coverage, but nothing in it is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description should be richer. It covers the plan requirement and output granularity, but leaves the agent without guidance on range limits, large-response behavior, or failure modes for a tool that can return 1000+ entries per day.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter is already documented with format, defaults, and plan-dependent base behavior. The description adds nothing about parameters beyond restating the two dates and the currency set, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (returns daily exchange rates), the scope (one or more currencies, between two dates) and the granularity (one entry per day). It is distinguishable from get_latest_rates and get_historical_rates by the daily-series framing, but it never names them, so differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage signal is the eligibility constraint (Professional plan and above), which is genuinely useful for deciding whether to call. There is no explicit guidance on when to pick this over get_historical_rates or get_fluctuation, and no exclusions or alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ip_to_currencyConvert to the local currency of an IP addressA
Resolves the local currency from an IP address's geolocation and converts an amount into it using the latest rate. Useful for localizing prices for a visitor. The target currency is returned in the 'to' field. Growth plan and above.
| Name | Required | Description | Default |
|---|---|---|---|
| ip | No | IPv4 or IPv6 address to geolocate. Omit to use the caller's own IP address. | |
| from | Yes | Currency code to convert from, e.g. 'USD'. | |
| amount | No | Amount to convert. Must be greater than 0. Default is 1.0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden. It usefully discloses the plan gating ("Growth plan and above") and that the rate used is the latest, not historical. However, it omits failure behavior for private/ungeolocatable IPs and what happens when no rate exists for the derived currency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action and ending with the access constraint. No sentence repeats the title or the schema, and the 'to' field note earns its place as return-value information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description is the only source of return-value information, and it names just the 'to' field. The converted amount field, the rate used, and error shapes remain undisclosed for a tool whose output the agent will need to interpret.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (ip, from, amount) are already documented including the omit-to-use-caller's-IP behavior and the amount default. The description adds no parameter-level meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: resolve the local currency from an IP's geolocation and convert an amount into it at the latest rate. This clearly distinguishes it from the generic sibling convert_currency (which takes an explicit target) and from get_latest_rates, since the target currency is derived from an IP.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Useful for localizing prices for a visitor" implies the use case but never says when to prefer this over convert_currency (target currency already known) or what to do if geolocation is not desired. The agent must infer the alternative from the sibling name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_currenciesList supported currenciesA
Returns the currencies supported by CurrencyFreaks: 1000+ fiat currencies, cryptocurrencies, and precious metals (XAU gold, XAG silver, XPT platinum, XPD palladium). Use it to find a currency code before calling rate or conversion tools. No API key needed. By default returns a compact code → name map. Pass 'search' to filter by code, name, or country (e.g. 'rupee', 'PK', 'bitcoin'). Pass detailed=true for country, status (AVAILABLE/DEPRECATED), and the availableFrom/availableUntil date range of historical data per currency — combine with 'search' because the full detailed catalogue is very large.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Case-insensitive substring to match against currency code, name, or (with detailed=true) country name. | |
| detailed | No | Return full details per currency (country, status, historical availability range, icon). Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that no API key is needed, that the default response is a compact code → name map, which fields detailed=true adds (country, status AVAILABLE/DEPRECATED, availableFrom/availableUntil), and warns that the full detailed catalogue is very large. Gaps are minor — nothing on rate limits, error behavior, or pagination of the 1000+ item list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool returns, then usage, then auth, then the two parameter behaviors in progression. Four dense sentences with no filler and no repetition of the schema text verbatim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter, no-annotation, no-output-schema read tool, the description covers the essentials: return shape in both modes, auth requirement, catalogue size caveat, and how the parameters interact. Nothing an agent needs in order to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond it: concrete search examples ('rupee', 'PK', 'bitcoin') and the behavioral distinction that country names are only matched when detailed=true. That extra context lifts it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns the currencies supported by CurrencyFreaks') and quantifies the scope: 1000+ fiat currencies, cryptocurrencies, and precious metals with named examples (XAU, XAG, XPT, XPD). It also positions itself against siblings by saying it's used to find a currency code before calling rate or conversion tools, so an agent can distinguish it from get_latest_rates and convert_currency without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the downstream tools (rate or conversion tools) and the condition that selects this one — locating a currency code first. It also gives usage routing between the plain call, 'search', and detailed=true, including the instruction to combine search with detailed because the full catalogue is very large.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v1.0.1- First observed
convert_currency - First observed
get_fluctuation - First observed
get_historical_rates - First observed
get_latest_rates - First observed
get_time_series - First observed
ip_to_currency - First observed
list_currencies
TDQS
Scored across 7 tools
Each tool targets a distinct temporal or functional aspect (latest vs historical vs time series vs fluctuation vs conversion), and descriptions clarify boundaries. Slight overlap between get_latest_rates and convert_currency exists, but the conversion tool's added value (amount + rate + result) is clear.
Most tools follow a clean snake_case verb_noun pattern (list_currencies, get_latest_rates, convert_currency, get_historical_rates, get_time_series, get_fluctuation). ip_to_currency breaks the pattern as noun-first, a minor deviation.
Seven tools cleanly cover the currency-freaks API surface without bloat; each maps to a distinct endpoint/operation.
Covers catalogue lookup, latest/historical/time-series rates, conversion, fluctuation, and IP localization, matching the API's core lifecycle. Minor gaps like account/usage status or symbol-level metadata beyond list_currencies are non-critical.
Maintenance
Related MCP Connectors
ExchangeRate MCP — wraps open.er-api.com (free, no auth)
Frankfurter MCP — wraps Frankfurter API (api.frankfurter.dev)
Live & historical FX rates and currency conversion for AI agents. No API keys.
Related MCP Servers
- FlicenseCqualityFmaintenanceAn MCP server providing real-time currency conversion and exchange rate data through the Frankfurter API, enabling users to convert currencies, fetch latest or historical rates, and list available currencies.437-
- FlicenseBqualityDmaintenanceAn MCP server that provides currency rates, conversions, and historical exchange-rate data using the Frankfurter API. It enables users to retrieve latest rates, convert amounts between currencies, and access time-series data for currency pairs.3-
- AlicenseAqualityAmaintenanceProvides real-time foreign-exchange rates, historical data, and multi-currency lookups to MCP-compatible AI coding assistants like Claude Code and Cursor.4832 npmMIT
- AlicenseAqualityCmaintenanceAn MCP server for the Xe Currency Data API that brings live FX rates, historical analysis, and quant-flavored tools into AI tools, working out of the box with zero credentials via Frankfurter/ECB data.124 npm1MIT