Frankfurter Forex MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Frankfurter Forex MCPConvert 250 Euros to US Dollars"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Frankfurter Forex MCP
MCP server in Python for currency rates, conversion, and exchange-rate history using the Frankfurter API.
Features
base_quote: latest rates from a base currency to one or many targetsconvert_currency: converts an amount between two currenciesexchange_history: returns the time series for a currency pair in a date rangeStructured error payloads with
error_code,tool, andtrace_idRetry with exponential backoff for transient upstream failures
Related MCP server: FrankfurterMCP
Tech stack
Python 3.11+
MCP Python SDK (
mcp)httpxasync clientPydantic v2
pytest,pytest-asyncio,ruff
Project structure
src/frankfurter_forex_mcp/
client/frankfurter.py
models/schemas.py
tools/
base_quote.py
convert_currency.py
exchange_history.py
server.py
tests/Setup
Install dependencies:
uv sync --all-extrasCopy environment file:
cp .env.example .envRun MCP server (stdio)
uv run python -m frankfurter_forex_mcp.serverUse with MCP Inspector on localhost
The easiest way to expose this server in the local Inspector is using:
uv run mcp dev src/frankfurter_forex_mcp/server.pyThis command starts the local Inspector bridge and shows a localhost URL in the terminal.
For a manual Inspector stdio connection flow, see .docs/mcp-inspector-guide.md.
Advanced MCP practices implemented
Strict request validation with Pydantic before external calls
Strict external payload validation before response serialization
Stable JSON error contracts for machine clients
stdio-safe runtime behavior (no stdout logging side effects)CI pipeline for linting, testing, and package smoke checks
Run quality checks
uv run ruff check .
uv run pytestCI
GitHub Actions workflow is available at .github/workflows/ci.yaml.
Available Tools
3 toolsbase_quoteC
Get latest exchange rates from one base currency to multiple target currencies.
| Name | Required | Description | Default |
|---|---|---|---|
| base | Yes | ||
| targets | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool retrieves 'latest exchange rates,' implying a read-only operation, but doesn't specify data sources, update frequency, rate limits, error handling, or authentication requirements. For a tool with zero annotation coverage, this leaves critical behavioral traits undocumented.
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 description is a single, efficient sentence that front-loads the core functionality. There's no wasted wording, and it directly communicates the tool's purpose without unnecessary details. This is appropriately concise for a simple data retrieval tool.
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 the complexity (2 parameters, no annotations, no output schema), the description is incomplete. It doesn't address parameter details, behavioral traits, or output format. While conciseness is good, the lack of contextual information makes it inadequate for an agent to use the tool effectively without additional assumptions.
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 0%, meaning the input schema provides no descriptions for parameters. The description mentions 'base currency' and 'target currencies,' which loosely map to the 'base' and 'targets' parameters, but doesn't explain expected formats (e.g., currency codes like USD), constraints, or examples. It adds minimal semantic value beyond what's inferred from parameter names.
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 the tool's purpose: 'Get latest exchange rates from one base currency to multiple target currencies.' It specifies the verb ('Get'), resource ('latest exchange rates'), and scope (one-to-many conversion). However, it doesn't explicitly differentiate from sibling tools like 'convert_currency' or 'exchange_history', which likely handle different aspects of currency data.
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 provides no guidance on when to use this tool versus its siblings ('convert_currency' and 'exchange_history'). It doesn't mention alternatives, prerequisites, or exclusions. The agent must infer usage from the tool name and description alone, which is insufficient for clear decision-making.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_currencyC
Convert a monetary amount from one currency to another.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | ||
| from_currency | Yes | ||
| to_currency | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool converts currency but doesn't add any context about rate sources, accuracy, limitations, or potential errors. For a tool with no annotations, this leaves significant gaps in understanding its operational behavior.
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 description is a single, clear sentence with zero waste. It's appropriately sized and front-loaded, efficiently conveying the core purpose without unnecessary details.
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 the tool's complexity (currency conversion with 3 parameters), no annotations, no output schema, and 0% schema coverage, the description is incomplete. It lacks details on behavior, parameters, and output, making it inadequate for reliable agent use without additional context.
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 0%, so the schema provides no parameter descriptions. The description mentions 'monetary amount' and 'currencies' but doesn't elaborate on parameter meanings, formats (e.g., currency codes like USD), or constraints. It adds minimal value beyond the schema's structure.
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 the tool's purpose with a specific verb ('convert') and resource ('monetary amount from one currency to another'). It distinguishes the core function well, though it doesn't explicitly differentiate from sibling tools like 'base_quote' or 'exchange_history', which might offer related currency functions.
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 provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools, prerequisites, or specific contexts for use, leaving the agent to infer usage based on the generic purpose alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exchange_historyC
Get an exchange-rate time series for a currency pair and date interval.
| Name | Required | Description | Default |
|---|---|---|---|
| start | Yes | ||
| end | Yes | ||
| from_currency | Yes | ||
| to_currency | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool retrieves data ('Get'), implying a read-only operation, but doesn't mention any behavioral traits such as rate limits, authentication needs, data freshness, error conditions, or response format. This is inadequate for a tool with 4 parameters and no output schema.
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 description is a single, well-structured sentence that efficiently conveys the core purpose without any wasted words. It's front-loaded with the main action and resource, making it easy to parse quickly.
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 the tool's complexity (4 parameters, no annotations, no output schema), the description is incomplete. It lacks details on parameter usage, behavioral context, output format, and differentiation from siblings. This leaves significant gaps for an agent to understand how to invoke the tool effectively.
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 schema description coverage is 0%, so the description must compensate. It mentions 'currency pair and date interval', which hints at parameters like 'from_currency', 'to_currency', 'start', and 'end', but doesn't explain their semantics, formats (e.g., date strings like YYYY-MM-DD), or constraints. This adds minimal value beyond the bare parameter names in the schema.
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 the tool's purpose with a specific verb ('Get') and resource ('exchange-rate time series'), specifying the target data (currency pair and date interval). It distinguishes from sibling tools like 'base_quote' and 'convert_currency' by focusing on historical time-series data rather than current rates or conversions. However, it doesn't explicitly contrast with siblings, so it's not a perfect 5.
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 provides no guidance on when to use this tool versus alternatives like 'base_quote' or 'convert_currency'. It mentions the data type (time series) but doesn't specify use cases, prerequisites, or exclusions. This leaves the agent with minimal context for tool selection.
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.
3 tool updates
v0.1.0- First observed
base_quote - First observed
convert_currency - First observed
exchange_history
TDQS
Scored across 3 tools
Each tool has a clearly distinct purpose with no overlap: base_quote retrieves latest rates from one base to multiple targets, convert_currency handles specific amount conversions, and exchange_history provides historical time series data. An agent can easily differentiate these functions without confusion.
The naming follows a consistent pattern with two tools using snake_case (base_quote, exchange_history) and one using a verb_noun style (convert_currency), which is a minor deviation. All names are descriptive and readable, but the mix of conventions slightly reduces consistency.
With 3 tools, this is well-scoped for a forex server, covering core operations: real-time rates, currency conversion, and historical data. Each tool earns its place without bloat or thinness, making it appropriate for the domain.
The toolset covers key forex functionalities—real-time rates, conversions, and historical data—with no major gaps. Minor gaps might include advanced features like currency lists or metadata, but agents can work effectively with the provided tools for common workflows.
Maintenance
Related MCP Connectors
A MCP server for the Frankfurter API for currency exchange rates.
Frankfurter MCP — wraps Frankfurter API (api.frankfurter.dev)
Exchange MCP — wraps the Frankfurter currency exchange API (free, no auth)
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.435-
- AlicenseBqualityAmaintenanceA MCP server for the Frankfurter API for currency exchange rates.66MIT
- -licenseNot gradedqualityNot gradedmaintenanceMCP server that provides real exchange-rate data from the European Central Bank, including latest rates, currency conversion, historical rates, and time series.-
- FlicenseNot gradedqualityCmaintenanceAn MCP server that integrates ExchangeRate-API and Open-Meteo to provide currency conversion and weather tools, enabling natural language queries for exchange rates, weather, and geocoding.-