MCP server exposing the Frankfurter API (ECB euro reference exchange rates) as tools.
Five well-defined currency exchange tools with complete JSON schemas, clear descriptions (194 - 280 chars), and proper parameter typing. All tools are READ_ONLY with no destructive operations. Naming follows verb_noun convention (convert, latest_rates, historical_rate, rate_timeseries, list_currencies). Descriptions explain WHAT each tool does and WHEN to use it. Input schemas include type, description, and constraints for all parameters. However, output schemas are not documented in the tool definitions, LLMs cannot see what fields to expect in responses. Error handling is minimal; no recovery guidance or actionable error messages visible in the code. Tool annotations (readOnlyHint, idempotentHint) are absent despite all tools being read-only and idempotent.
Convert an amount from one currency to another at the ECB reference rate. Returns the converted amount, the rate applied and the date it was published (`rate_date`). ECB reference rates publish on working days only: if `date` falls on a weekend or a holiday, the most recent working day's rate is used instead, and `note` explains the substitution in plain language.
ECB reference rates for one base currency on a specific date. Returns the date that was requested (`requested_date`), the date the rates actually published on (`rate_date`) and one rate per requested currency. ECB rates publish on working days only: a weekend or holiday `date` returns the most recent working day's rate instead of an error, and `note` explains the substitution — including when one currency's own feed lags the rest.
The latest published ECB reference rates for one base currency. Returns one rate per requested currency (or every currency Frankfurter tracks, when `symbols` is omitted), plus the date those rates were published (`rate_date`). ECB rates publish on working days only, so `note` explains it when one currency's own feed lags behind the rest of the snapshot.
Every ISO 4217 currency code Frankfurter tracks, with its name. Returns a list of `{code, name}` objects, one per currency, sorted by code.
Output schemas not documented. Tool definitions lack return type documentation; LLMs cannot infer what fields (rate, rate_date, note, etc.) to expect in responses, forcing them to guess or make follow-up calls.
Tool annotations missing. All five tools are read-only and idempotent, but lack readOnlyHint and idempotentHint annotations. This prevents clients from optimizing caching and retry logic.
Error handling lacks recovery guidance. UpstreamError exceptions are caught but no actionable error messages visible in tool code. LLMs receive raw errors with no hint on what to do next (retry, ask user, or fail).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2025-06-18+ | v2 |
One quote currency's exchange rate against EUR across a date range. Returns one rate per date in the range (every date the ECB published on), plus min/max/average rates across the range. ECB rates publish on working days only: `points` contains only those dates, never weekends or holidays.
Parameter constraints not fully documented. 'date' parameters accept YYYY-MM-DD format but description does not state range limits (e.g., no future dates, no dates before ECB started publishing). 'amount' must be positive but constraint is not in description.
No pagination or result limits documented. rate_timeseries can return 366+ data points; no limit or pagination guidance visible. Large responses risk context window exhaustion.