Frankfurter
Server Details
Convert currencies and fetch blended FX rates from 50+ institutional sources.
- Status
- Healthy
- Uptime
- 100.0% over 43 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- lineofflight/frankfurter-mcp
- GitHub Stars
- 3
- Server Listing
- frankfurter-mcp
TDQS
Scored across 4 tools
Each tool has a clearly distinct purpose: convert handles conversions, get_rates returns raw rates, and the two list tools provide reference data. The companion relationship between convert and get_rates is explicitly described, so there is little risk of misselection.
All tool names follow a consistent lowercase verb_noun pattern: convert, get_rates, list_currencies, list_providers. The naming is predictable and immediately signals each tool's action and target.
Four tools is well-scoped for a currency conversion server. Each tool covers a necessary function without redundancy or bloat.
The surface covers the core domain completely: currency conversion, current and historical rates, supported currencies, and available rate providers. Agents can accomplish any reasonable currency-related task without hitting dead ends.
Available Tools
4 toolsconvertConvert currencyARead-onlyInspect
Convert an amount from one currency to another. Returns {amount, currency} rounded to the target's minor units. Upstream rounds rates per direction; for low-value sources, flip via get_rates for more precision. Pass provider to use one institution's published rate, e.g. UST for a U.S. Treasury reporting rate.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ISO 4217 target currency. | |
| date | No | Date YYYY-MM-DD for a past rate; omit for latest. | |
| from | Yes | ISO 4217 source currency. | |
| amount | Yes | Amount in the source currency. Normalize localized input first: '100,50' -> 100.5; German '1.000,50' -> 1000.5; English '1,000.50' -> 1000.5. | |
| provider | No | Provider key, e.g. ECB for European Central Bank or UST for U.S. Treasury reporting rates. Serves that institution's published rates instead of the blend; a date inside a monthly or quarterly provider's period returns the rate in force. Keys at https://frankfurter.dev/providers/. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses the return shape, rounding to minor units, direction-dependent rate rounding, and provider-specific rate behavior. It gives the agent important operational context without contradicting the annotations.
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 with no filler. The first sentence defines the core operation, and the subsequent sentences each add a distinct, useful behavioral detail. Everything is front-loaded and relevant.
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?
Even without an output schema, the description states the return shape and key rounding behavior. Provider nuances, date semantics, and the get_rates alternative are addressed either in the description or in the schema, making this complete for a read-only conversion tool.
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. The description adds extra meaning by explaining provider examples (UST) and the direction-dependent rounding behavior, which is not inferable from the schema alone.
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 clearly states a specific action and resource: converting an amount from one currency to another. It also distinguishes itself from the sibling get_rates tool by referencing it for an alternative precision behavior.
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 description explicitly tells the agent when to consider get_rates instead (low-value sources, to flip direction for more precision), and when to pass a provider. It does not spell out a comprehensive list of exclusions, but the primary use case is unambiguous and the alternative routing is concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ratesGet exchange ratesARead-onlyInspect
Latest or a single day's exchange rates. The raw-rate companion to convert. With provider, published rates from one or more institutions: on its own base the digits are as published, with the date they took effect.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | ISO 4217 base currency. Default EUR. | |
| date | No | Single day YYYY-MM-DD. Omit for the latest rates. | |
| quotes | No | ISO 4217 quote codes to return; omit for all. | |
| provider | No | Provider key or keys, e.g. ECB or ['ECB', 'HMRC']. Serves published rates instead of the blend; a date inside a monthly or quarterly provider's period returns the rate in force. Keys at https://frankfurter.dev/providers/. | |
| providers | No | Alias for `provider` accepting multiple provider keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and open-world, so the bar is lower. The description adds behavioral detail beyond those hints, notably that provider-sourced digits are returned as published and carry the date they took effect, and that omitting date yields latest rates.
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 core action and scope, with every clause earning its place. It avoids repeating schema content.
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 five-parameter tool with no required fields and no output schema, the description plus rich schema descriptions give an agent enough to call it correctly. Minor gaps remain around what the response looks like and what 'latest' resolves to, but they are not blocking.
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 schema already documents all five parameters and their defaults/aliases. The description reinforces provider behavior but adds little beyond the schema's parameter descriptions, keeping this at the baseline for high coverage.
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 first sentence states the tool returns exchange rates for either the latest date or a single specified day. Calling itself the 'raw-rate companion to convert' directly distinguishes its scope from the convert sibling, so an agent can pick it correctly.
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 clear context that this tool supplies raw rates rather than conversion and that provider should be used when published institutional rates are needed. It does not spell out explicit when-not-to-use conditions or list the other sibling alternatives, but the main choice between get_rates and convert is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_currenciesList currenciesARead-onlyInspect
List all supported ISO 4217 currency codes and their full names (e.g. { 'USD': 'United States Dollar' }).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds format details beyond the annotations: it returns a mapping of code to name. Annotations already declare readOnlyHint and openWorldHint, which align. No contradictions.
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?
Single sentence, front-loaded with purpose, no fluff. Every word earns its place.
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?
Given zero parameters, full annotation coverage, and a simple return format described, the description is fully complete for this tool.
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?
There are no parameters, and the schema coverage is 100% (empty). The description provides meaning about the output format, which is the only semantic needed. Baseline 4 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?
Description clearly states the tool lists all supported ISO 4217 currency codes with their full names, using a specific verb and resource. It distinguishes from siblings 'convert' and 'get_rates' by specifying enumeration rather than conversion or rate retrieval.
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 description implies the tool is used for retrieving the full set of supported currencies. While it does not explicitly state when not to use it or mention alternatives, the sibling context makes the usage clear. No exclusions are needed given the simple scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_providersList providersARead-onlyInspect
List the institutions whose rates Frankfurter relays, with key, rate type, frequency (daily, monthly or quarterly) and coverage dates. Use a key as provider in convert or get_rates for that institution's published rates instead of the blend.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds behavioral context by specifying the data fields (key, rate type, frequency, coverage dates) and the relationship to the blend, which goes beyond the annotations. It doesn't mention pagination or rate limits, but for a zero-parameter list operation this is sufficient.
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 with no filler. The first sentence states the resource and output fields; the second provides actionable usage guidance. Every sentence earns its place and the most important information is front-loaded.
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 zero-parameter, read-only list tool with no output schema, the description is nearly complete. It explains what is returned and how to use the results. The only minor gap is that it doesn't explicitly state the output format (e.g., JSON array), but the absence of an output schema and the simplicity of the tool make this a minor omission.
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?
The tool has zero parameters, so the schema provides no parameter documentation. The description compensates by explaining what the returned 'key' field is for and how it should be used as a parameter in sibling tools. This adds meaning beyond the empty schema, though it doesn't need to document any input parameters.
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 states a specific verb ('List') and resource ('institutions whose rates Frankfurter relays'), and enumerates the exact fields returned (key, rate type, frequency, coverage dates). It also distinguishes itself from siblings by explaining how the key is used in convert/get_rates, so an agent can tell it apart from list_currencies.
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 description explicitly tells the agent when to use this tool: to obtain a provider key for use as the `provider` parameter in `convert` or `get_rates`. It also implies the alternative (using the default blend) and clarifies the purpose of the returned keys, which is strong usage guidance.
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.
2 tool updates
- Changed
convert1 field changed- changed
Input schema / properties / provider / descriptionPrevious value: -"Provider key, e.g. UST for U.S. Treasury reporting rates. Serves that institution's published rates instead of the blend; a date inside a monthly or quarterly provider's period returns the rate in force. Keys at https://frankfurter.dev/providers/."New value: +"Provider key, e.g. ECB for European Central Bank or UST for U.S. Treasury reporting rates. Serves that institution's published rates instead of the blend; a date inside a monthly or quarterly provider's period returns the rate in force. Keys at https://frankfurter.dev/providers/."
- Changed
get_rates6 fields changed- changed
Input schema / properties / provider / descriptionPrevious value: -"Provider key, e.g. UST for U.S. Treasury reporting rates. Serves that institution's published rates instead of the blend; a date inside a monthly or quarterly provider's period returns the rate in force. Keys at https://frankfurter.dev/providers/."New value: +"Provider key or keys, e.g. ECB or ['ECB', 'HMRC']. Serves published rates instead of the blend; a date inside a monthly or quarterly provider's period returns the rate in force. Keys at https://frankfurter.dev/providers/." - added
Input schema / properties / provider / itemsAdded value: +{ + "maxLength": 8, + "minLength": 2, + "type": "string" +} - removed
Input schema / properties / provider / maxLengthRemoved value: -8 - removed
Input schema / properties / provider / minLengthRemoved value: -2 - changed
Input schema / properties / provider / typePrevious value: -"string"New value: +"array" - added
Input schema / properties / providersAdded value: +{ + "description": "Alias for `provider` accepting multiple provider keys.", + "items": { + "maxLength": 8, + "minLength": 2, + "type": "string" + }, + "type": "array" +}
3 tool updates
- Changed
convert1 field changed- added
Input schema / properties / providerAdded value: +{ + "description": "Provider key, e.g. UST for U.S. Treasury reporting rates. Serves that institution's published rates instead of the blend; a date inside a monthly or quarterly provider's period returns the rate in force. Keys at https://frankfurter.dev/providers/.", + "maxLength": 8, + "minLength": 2, + "type": "string" +}
- Changed
get_rates1 field changed- added
Input schema / properties / providerAdded value: +{ + "description": "Provider key, e.g. UST for U.S. Treasury reporting rates. Serves that institution's published rates instead of the blend; a date inside a monthly or quarterly provider's period returns the rate in force. Keys at https://frankfurter.dev/providers/.", + "maxLength": 8, + "minLength": 2, + "type": "string" +}
- Added
list_providers
3 tool updates
- Changed
convert2 fields changed- changed
Input schema / properties / amount / descriptionPrevious value: -"Amount in the source currency."New value: +"Amount in the source currency. Normalize localized input first: '100,50' -> 100.5; German '1.000,50' -> 1000.5; English '1,000.50' -> 1000.5." - changed
Input schema / properties / date / descriptionPrevious value: -"Historical date YYYY-MM-DD. Omit for latest."New value: +"Date YYYY-MM-DD for a past rate; omit for latest."
- Changed
get_rates5 fields changed- changed
Input schema / properties / date / descriptionPrevious value: -"Single day YYYY-MM-DD. Mutually exclusive with start/end."New value: +"Single day YYYY-MM-DD. Omit for the latest rates." - removed
Input schema / properties / endRemoved value: -{ - "$ref": "#/properties/date", - "description": "Range end YYYY-MM-DD (inclusive). Requires start and quotes." -} - removed
Input schema / properties / providersRemoved value: -{ - "description": "Provider keys. Omit for blended (default).", - "items": { - "type": "string" - }, - "type": "array" -} - changed
Input schema / properties / quotes / descriptionPrevious value: -"ISO 4217 quote codes. Required when start/end is set."New value: +"ISO 4217 quote codes to return; omit for all." - removed
Input schema / properties / startRemoved value: -{ - "$ref": "#/properties/date", - "description": "Range start YYYY-MM-DD (inclusive). Requires end and quotes." -}
- Added
list_currencies
2 tool updates
- First observed
convert - First observed
get_rates
Related MCP Connectors
Convert currencies, get FX rates, and query historical ECB exchange rate data.
Live & historical FX rates and currency conversion for AI agents. No API keys.
Live & historical FX rates and currency conversion for AI agents. No API keys.
Live FX + official central-bank rates, 110+ sources. Hosted, keyless, nothing to install.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceReal-time currency exchange rates and crypto prices via MCP. Convert between 60+ fiat currencies and 30+ cryptocurrencies with multi-source failover. No API keys needed for upstream data.9 npmISC
- AlicenseNot gradedqualityAmaintenanceConvert currencies, get FX rates, and query historical ECB exchange rate data via MCP.278 npm1Apache 2.0
- AlicenseAqualityDmaintenanceProvides currency conversion using the Wise API, supporting real-time and historical rates with caching and cross-rate calculation.2MIT
- AlicenseAqualityCmaintenanceEnables MCP clients to access exchange rates for 160+ currencies, currency conversion, historical rates, time series, crypto, metal and stock prices, usage checks, and rate alerts.171 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.