fxapi Exchange Rates MCP Server
Server Details
Live and historical foreign exchange rates for AI agents. Eight tools map to the fxapi REST API: latest rates, historical rates, currency conversion, time series, fluctuation, period averages, supported currencies and quota status. Covers 190+ fiat currencies, 16 cryptocurrencies and gold, silver, platinum and palladium. Authenticate with an apikey header; a free key works. Docs: https://fxapi.com/mcp/
- Status
- Healthy
- Uptime
- 98.5% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 11 tools
The tools mostly have clearly distinct roles: latest snapshot, historical date, single-pair rate, conversion, time range, OHLC, averages, fluctuation, matrix, currency metadata, and status. There is some overlap between getRate, getLatest, getHistorical, and getRange because all return exchange-rate data, but the descriptions make the intended use cases distinguishable.
All tools follow a consistent camelCase `get` + noun pattern: getAverage, getConvert, getCurrencies, getFluctuation, getHistorical, getLatest, getMatrix, getOhlc, getRange, getRate, getStatus. The naming is predictable and easy to scan.
Eleven tools is well-scoped for an exchange-rate API and none appear redundant or trivial. Each tool covers a meaningful operation or data shape, from conversion and latest rates to OHLC and quota status.
The surface covers the full exchange-rate lifecycle: currency metadata, latest and historical rates, ranges, OHLC candles, conversion, averages, fluctuation, cross-rate matrix, and account/quota status. There are no obvious missing CRUD-style or lifecycle operations for this domain.
Available Tools
11 toolsgetAverageAverage, low and high rates per month, quarter or yearAInspect
Averages the daily rates per calendar period (month, quarter, year, or total for the whole span) and reports each period's low and high. Daily rates are first expressed against base_currency and then averaged, so the average EUR rate in GBP is the mean of the daily EUR/GBP rates. Average rates are what IFRS and US GAAP allow for translating income and expenses.
date_from and date_to may be at most 1830 days apart. The first and last period are cut to the requested span; date_from, date_to and days of each period tell exactly which days went into it.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter the returned currencies by type. | |
| format | No | `json` (default), `csv` or `xlsx`. CSV has a header line and one row per currency (and point in time), values without exponent notation. `xlsx` is the same table as an Excel workbook (one sheet, bold frozen header row, numbers as numbers), sent as a download named after the endpoint, e.g. `latest.xlsx`. | |
| period | No | How to group the days. | |
| date_to | Yes | Last day (`YYYY-MM-DD`), yesterday at the latest. | |
| date_from | Yes | First day (`YYYY-MM-DD`), 1999-01-01 or later. | |
| currencies | No | Comma-separated list of currency codes to include (e.g. `EUR,USD,CAD`). The array form `currencies[]=EUR¤cies[]=USD` is also accepted. By default all supported currencies are returned. | |
| base_currency | No | The base currency that all returned values are relative to. Defaults to `USD`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations contain only a title, so the description carries the behavioral burden, and it does substantial work: the 1830-day maximum span, how the first and last partial periods are cut, and how daily rates are converted to base_currency before averaging. It stops short of explicitly declaring read-only behavior, error conditions, or rate limits.
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 definition is front-loaded with the core computation, then the accounting rationale, then constraints; no sentence is filler. Two compact paragraphs cover method, purpose, and edge-case behavior without redundancy.
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 7-parameter tool with no output schema, the description explains the averaging model, the currency conversion order, and the partial-period rule, and it names date_from/date_to/days as the fields that describe each period. It could say more about the response shape per currency, but the essentials an agent needs before calling are present.
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 already 100%, so 3 is the baseline, but the description goes further by explaining that period groups days into month/quarter/year/total and by giving a worked example of base_currency averaging (mean of daily EUR/GBP rates). The date_from/date_to span limit adds meaning beyond the schema's format strings.
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: averages daily rates per calendar month/quarter/year/total and reports each period's low and high. The computation is described precisely enough to distinguish it from getLatest or getHistorical, but no sibling is named explicitly, so the differentiation is implicit rather than stated.
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 IFRS/US GAAP sentence supplies a real use context (translating income and expenses), so the agent can infer when averaging is appropriate. However, it never names an alternative such as getHistorical for daily rates or getOhlc for open/close values, and gives no when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getConvertConvert a value between currenciesAInspect
Converts a value from the base currency into all (or a filtered set of) currencies, for today or for a given historical date. Requires a plan that includes the convert endpoint. Optional: shape=compact, precision and format=csv.
Send values instead of value to convert up to 100 amounts in one request: data is then a list with one {value, currencies} entry per amount, in the order sent, and meta.values replaces meta.value. datetime converts at a moment within your plan's intraday history, like /v1/rate (the minute, quarter hour or hour it falls in: minutes for the last 7 days, hours for the last 3 months); it needs a plan with intraday updates.
For shop prices, round_step or price_ending (with round_mode) add rounded to every converted value, and locale adds formatted, the amount as text for that locale (e.g. "€ 1.233,99" for de_AT). value itself always stays exact. Rounding and locale are not available with shape=compact.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Optional date to convert against historical rates (format `YYYY-MM-DD`). Must be at least one day in the past. Omit for the latest rates. Not together with `datetime`. | |
| type | No | Filter the returned currencies by type. | |
| shape | No | `default`: every rate as `{"code": "EUR", "value": 0.918456}`. `compact`: plain values, `"EUR": 0.918456`. | |
| value | No | The value to convert. Must be greater than 0 and at most 10^18. Required unless `values` is sent; not together with `values`. | |
| format | No | `json` (default), `csv` or `xlsx`. CSV has a header line and one row per currency (and point in time), values without exponent notation. `xlsx` is the same table as an Excel workbook (one sheet, bold frozen header row, numbers as numbers), sent as a download named after the endpoint, e.g. `latest.xlsx`. | |
| locale | No | Adds `formatted`: every converted value as text in this ICU locale (e.g. `de_AT`, `en-US`), with the currency's symbol and decimal places (at most 8; none with a whole-number `round_step`). With rounding, the rounded price is formatted. An unknown locale returns a `422`. Not with `shape=compact`. | |
| values | No | Up to 100 values to convert (each greater than 0 and at most 10^18), comma-separated or as `values[]=`. `data` becomes a list with one entry per value, in the order sent. The request costs one request. | |
| datetime | No | Convert at this moment within your plan's intraday history (ISO 8601): the rate of the minute, quarter hour or hour it falls in, as `/v1/rate` finds it. `meta.last_updated_at` is that point. Needs a plan with intraday updates (`403` on daily plans); moments beyond the plan's history return a `422`. | |
| precision | No | Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals (10 significant digits below 0.1). | |
| currencies | No | Comma-separated list of currency codes to include (e.g. `EUR,USD,CAD`). The array form `currencies[]=EUR¤cies[]=USD` is also accepted. By default all supported currencies are returned. | |
| round_mode | No | How `round_step` and `price_ending` round: to the `nearest` candidate (default), always `up` or always `down`. | |
| round_step | No | Adds `rounded`: every converted value rounded to a multiple of this step (greater than 0, at most 10^18), e.g. `0.05`, `1` or `10`. Not together with `price_ending`; not with `shape=compact`. | |
| price_ending | No | Adds `rounded`: every converted value rounded to a price with this ending (at least 0, below 1), e.g. `0.99` turns 10.97 into 10.99. Not together with `round_step`; not with `shape=compact`. | |
| base_currency | No | The base currency that all returned values are relative to. Defaults to `USD`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only a title annotation, the description carries the burden well: it states the plan prerequisite ('Requires a plan that includes the convert endpoint'), the intraday-plan requirement and resulting 403/422 behavior, the request cost of batch mode, and the incompatibility of rounding/locale with `shape=compact`. It does not explicitly confirm the operation is side-effect free, but for a conversion tool this is largely self-evident.
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 the core purpose and the plan requirement, then organized into one paragraph per concern (batch, intraday, shop-price rounding/formatting). Dense but every sentence carries information; minor redundancy since some details also appear in the schema descriptions.
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 14-parameter tool with no output schema and no annotations, the description covers the important interactions: value/values exclusivity, date vs datetime, shape=compact exclusions, and the extra response fields produced by rounding and locale. It stops short of a full response-shape description, but the added-field conventions (`rounded`, `formatted`, `meta.values`) go a long way.
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 genuine value beyond the schema: the mutual exclusion of `value` and `values`, the one-request cost of batch conversion, the response reshaping (`data` as a list, `meta.values` replacing `meta.value`), and the fact that `rounded`/`formatted` are added fields while `value` stays exact. These are cross-parameter interactions the schema does not express.
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 ('Converts a value from the base currency into all (or a filtered set of) currencies') plus the time dimension (today or historical date). An agent can immediately tell this is a value-conversion tool, distinct from rate-lookup siblings like getLatest or getRate.
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 gives clear conditions for parameter choices ('Send `values` instead of `value` to convert up to 100 amounts') and notes `datetime` behaves 'like /v1/rate', which hints at the sibling relationship. However, it never explicitly says when to use getConvert versus getRate, getLatest, or getHistorical, so routing between 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.
getCurrenciesList supported currenciesBInspect
Returns metadata for all supported currencies, optionally filtered by code or type.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter the returned currencies by type. | |
| as_html | No | When `true`, returns an HTML table of currency codes and names instead of a JSON payload. | |
| currencies | No | Comma-separated list of currency codes to include (e.g. `EUR,USD,CAD`). The array form `currencies[]=EUR¤cies[]=USD` is also accepted. By default all supported currencies are returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations contain only a title, so the description carries the full disclosure burden. 'Returns metadata' implies a safe read, but it never mentions that as_html flips the response into an HTML table rather than JSON, nor any auth or rate-limit behavior — a material output-shape surprise left undisclosed.
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?
A single front-loaded sentence with zero filler: the return value comes first and the optional filtering qualifier second. Nothing could be trimmed without losing meaning.
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 output schema and a rich input schema, the description is adequate for a simple read tool but omits the HTML response mode that changes the return type entirely, and gives no signal about the sibling tools it replaces in a conversion workflow.
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 all three parameters are already documented, including the enum values and the comma-separated array form. The description restates the code/type filtering but adds nothing on syntax or defaults, 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 metadata for all supported currencies') and adds scope ('all supported'). The resource is distinct from the rate-oriented siblings (getLatest, getConvert, getRate), so an agent can separate it without opening the schema, though no sibling is named 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?
The phrase 'optionally filtered by code or type' implies when to pass filters, but there is no explicit guidance on when to call this versus the rate tools, no prerequisites, and no note that omitting filters returns the full catalogue (that detail lives only in the schema).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getFluctuationHow rates changed between two datesAInspect
Returns, for every requested currency, its rate at the end of date_from and of date_to and how much it changed in between, in absolute terms and in percent. Both days are UTC days back to 1999-01-01; the newest allowed is yesterday.
The JSON response also has the high, low and average of the daily closes from date_from to date_to (null when the two days are more than 1830 days apart or the span has no data). The CSV keeps its columns.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter the returned currencies by type. | |
| format | No | `json` (default), `csv` or `xlsx`. CSV has a header line and one row per currency (and point in time), values without exponent notation. `xlsx` is the same table as an Excel workbook (one sheet, bold frozen header row, numbers as numbers), sent as a download named after the endpoint, e.g. `latest.xlsx`. | |
| date_to | Yes | Last day (`YYYY-MM-DD`), on or after `date_from`. | |
| date_from | Yes | First day (`YYYY-MM-DD`). | |
| currencies | No | Comma-separated list of currency codes to include (e.g. `EUR,USD,CAD`). The array form `currencies[]=EUR¤cies[]=USD` is also accepted. By default all supported currencies are returned. | |
| base_currency | No | The base currency that all returned values are relative to. Defaults to `USD`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only a title annotation, the description carries real disclosure value: end-of-day semantics, valid date window, and the precise condition under which `high`/`low`/`average` come back null (>1830 day span or no data). It does not cover error behavior, default currency set, or throttling, so it falls short of fully self-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 short paragraphs, front-loaded with the returned values, then constraints and response-shape caveats. Every sentence is doing work; only 'The CSV keeps its columns' is terse to the point of being cryptic.
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?
Six parameters, no output schema and no behavioral annotations, so the description must explain returns — and it does at a conceptual level (per-currency end rates, absolute and percent change, plus high/low/average aggregates with their null rule). It stops short of giving field names or the exact JSON/CSV shape, which an agent composing a downstream parse would still want.
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 genuinely adds semantics the schema lacks: the values are taken at the *close* of each date, both are UTC days, and the span cap of 1830 days governs the aggregate fields. It adds nothing about `type`, `format` or `base_currency`, which the schema already documents thoroughly.
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 names a specific verb-and-result ('Returns ... its rate at the end of `date_from` and of `date_to` and how much it changed ... in absolute terms and in percent'), which is materially different from siblings like getLatest or getHistorical. It never explicitly contrasts itself with nearby tools such as getRange or getAverage, so an agent must infer the boundary.
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 is only implicit: the description supplies hard constraints (UTC days back to 1999-01-01, newest allowed is yesterday, date_to on or after date_from) but never says when to pick this over getRange, getHistorical or getAverage. There are no exclusions or alternative-routing sentences.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getHistoricalHistorical exchange ratesAInspect
Returns the exchange rates for a specific date. Historical data is available back to 1999. The date must be at least one day in the past.
Send dates instead of date for up to 31 days in one request: data is then keyed by date and the request costs one request per date (see X-Cost). Takes the same optional representations as /v1/latest (shape, precision, inverse, format=csv).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date to retrieve historical rates for (format `YYYY-MM-DD`). Required unless `dates` is sent; not together with `dates`. | |
| type | No | Filter the returned currencies by type. | |
| dates | No | Up to 31 dates (format `YYYY-MM-DD`), comma-separated or as `dates[]=`. Each date is answered once, oldest first, and costs one request. | |
| shape | No | `default`: every rate as `{"code": "EUR", "value": 0.918456}`. `compact`: plain values, `"EUR": 0.918456`. | |
| format | No | `json` (default), `csv` or `xlsx`. CSV has a header line and one row per currency (and point in time), values without exponent notation. `xlsx` is the same table as an Excel workbook (one sheet, bold frozen header row, numbers as numbers), sent as a download named after the endpoint, e.g. `latest.xlsx`. | |
| inverse | No | `true` adds `inverse` to every rate: the value of one unit of the currency in the base currency (1 / value). Not with `shape=compact`. | |
| precision | No | Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals (10 significant digits below 0.1). | |
| currencies | No | Comma-separated list of currency codes to include (e.g. `EUR,USD,CAD`). The array form `currencies[]=EUR¤cies[]=USD` is also accepted. By default all supported currencies are returned. | |
| base_currency | No | The base currency that all returned values are relative to. Defaults to `USD`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry only a title, so the description does the work: it discloses the 1999 data floor, the one-day-past constraint, that multi-date responses are keyed by date, that results are returned oldest first, and that each date costs one request (visible via X-Cost). Auth requirements and error behavior are not covered, keeping 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?
Two tight paragraphs with the core purpose front-loaded and the multi-date/cost caveat immediately after. The parenthetical '(see X-Cost)' and the /v1/latest cross-reference are efficient pointers rather than padding, though the second sentence is dense enough to require a re-read.
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 9-parameter, zero-required tool with no output schema, the description covers the essential call-shaping concerns: which date parameter to use, how the response is structured in each mode, and the cost implication. It stops short of describing the single-date response envelope (base currency, date key, rates map), which an agent without an output schema might want.
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 the baseline is 3, and the description goes beyond it by explaining the response-shape consequence of using `dates` (data keyed by date), the per-date billing cost, and by pointing at `/v1/latest` for the shared shape/precision/inverse/format=csv semantics instead of re-documenting them. The mutual exclusivity of `date`/`dates` is repeated from the schema but the added behavioral framing is genuinely new information.
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 gives a specific verb and resource (returns exchange rates) plus a scope (a specific date), and the second sentence adds the coverage window back to 1999. It does not, however, distinguish itself from the many sibling time-series tools (getRange, getOhlc, getAverage, getFluctuation), so an agent must still infer the boundary cases.
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 constraints are stated: the date must be at least one day in the past, and `dates` should be sent instead of `date` for up to 31 days in one call. But the guidance is about parameter choice within the tool, not when to pick this tool over siblings like getRange or getLatest; the only sibling reference is '/v1/latest' for shared optional representations, which is about output format rather than tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getLatestLatest exchange ratesBInspect
Returns the latest exchange rates for a given base currency (default USD). The update interval of the returned data depends on your subscription plan (from daily down to minutely).
Optional representations, none of which changes the default response: shape=compact for plain values ("EUR": 0.918456), precision to round, inverse=true for the value of one unit of each currency in the base currency, include=change for the change since the previous day's close, and format=csv.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter the returned currencies by type. | |
| shape | No | `default`: every rate as `{"code": "EUR", "value": 0.918456}`. `compact`: plain values, `"EUR": 0.918456`. | |
| format | No | `json` (default), `csv` or `xlsx`. CSV has a header line and one row per currency (and point in time), values without exponent notation. `xlsx` is the same table as an Excel workbook (one sheet, bold frozen header row, numbers as numbers), sent as a download named after the endpoint, e.g. `latest.xlsx`. | |
| include | No | `change` adds `change` and `change_pct` to every rate: the difference to the close of the day before `last_updated_at` (`meta.change_since`), computed like `/v1/fluctuation`. Null when that close has no rate for the currency. Not with `shape=compact`. | |
| inverse | No | `true` adds `inverse` to every rate: the value of one unit of the currency in the base currency (1 / value). Not with `shape=compact`. | |
| precision | No | Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals (10 significant digits below 0.1). | |
| currencies | No | Comma-separated list of currency codes to include (e.g. `EUR,USD,CAD`). The array form `currencies[]=EUR¤cies[]=USD` is also accepted. By default all supported currencies are returned. | |
| base_currency | No | The base currency that all returned values are relative to. Defaults to `USD`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry only a title, so the description bears the behavioral burden. It usefully discloses that the update interval depends on the subscription plan (daily to minutely), but says nothing about authentication, rate limits, or that the operation is read-only beyond the verb 'Returns'.
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 tight paragraphs: the purpose and update-interval caveat come first, then an options summary. The second paragraph is dense but each clause maps to a real parameter, so little 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 eight optional parameters and no output schema, the description does not explain the response envelope (e.g., rates map, meta timestamps) that an agent would need to interpret results. The per-option explanations partially compensate, but the return structure is left undocumented.
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 the schema already documents all eight parameters thoroughly. The description adds a compact narrative of shape, precision, inverse, include, and format but no syntax or constraints beyond what the schema provides, and it omits type and currencies entirely — 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 states a specific verb and resource — 'Returns the latest exchange rates' — and names the base-currency scope plus the subscription-dependent update interval. It implicitly distinguishes itself from getHistorical and getRate via 'latest', but never explicitly differentiates against the ten sibling tools.
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 is only implied through the word 'latest' and the default USD behavior. There is no explicit guidance on when to pick this over getRate, getHistorical, or getConvert, and no prerequisites or exclusions stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getMatrixCross rates between several currenciesAInspect
Returns every cross rate between 2 to 25 currencies in one request: data.EUR.USD is the price of 1 EUR in USD. Latest at your plan's update interval, or the close of a past date. format=csv gives the table with one row per base currency.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | The close of this past day (format `YYYY-MM-DD`). | |
| format | No | `json` (default), `csv` or `xlsx`. CSV has a header line and one row per currency (and point in time), values without exponent notation. `xlsx` is the same table as an Excel workbook (one sheet, bold frozen header row, numbers as numbers), sent as a download named after the endpoint, e.g. `latest.xlsx`. | |
| precision | No | Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals (10 significant digits below 0.1). | |
| currencies | Yes | 2 to 25 currency codes, comma-separated (e.g. `USD,EUR,GBP`) or as `currencies[]=`. Rows and columns keep this order. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Only a title is provided as annotation, so the description carries the burden and does well: it discloses the matrix return shape (`data.EUR.USD` = price of 1 EUR in USD), that data is latest at the plan's update interval or a past-date close, and that formats produce different table shapes. It does not mention rate limits, error behavior for invalid codes, or response envelope details beyond the example.
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 tight sentences, front-loaded with the core purpose and followed by the return-shape example and format nuance. No filler, though the csv detail slightly overlaps what the schema already says.
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 output schema, the description adequately explains the matrix return shape and date/format behavior for a 4-parameter read tool. Minor gaps remain around error handling and envelope structure, but an agent has enough to invoke it correctly.
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% and every parameter is well documented in the schema (date format, format enum behavior, precision range, currency list). The description adds little parameter meaning beyond reiterating the 2-25 currency bound and the csv row-per-base-currency behavior, 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 every cross rate between 2 to 25 currencies in one request, and explains the matrix orientation with `data.EUR.USD`. It is clearly a bulk cross-rate tool rather than a single-pair tool, though it never names the sibling tools (getRate, getConvert, getLatest) it should be chosen over.
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 implies when to use the tool ('Latest at your plan's update interval, or the close of a past `date`') and its 2-25 currency scope, which implicitly separates it from a single-pair lookup. However there is no explicit guidance on when to prefer this over getRate, getConvert, or getLatest, leaving the routing inference up to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getOhlcHourly or daily OHLC candlesAInspect
Returns open, high, low and close per hour or per day for 1 to 10 currencies, built from the stored rates. Requires a plan that includes the range endpoint (medium and up).
hour: from the minute rates.datetime_startnot more than 7 days back, not more than 7 days between start and end. Needs a plan with quarter-hourly updates or finer.day(default): from the hourly rates.datetime_startnot more than 3 months back, not more than 92 days between start and end. Needs a plan with hourly updates or finer.
Each candle closes on the stored rate at the end of its hour or day and opens on the close of the candle before it (on its own close after a gap); high and low are the extremes of the finer rates in between and always include the open and the close. datetime is the start of the candle. Candles whose close is not stored yet (e.g. the hour or day still running) are left out. A request costs one request, however many currencies and candles it holds.
shape=compact gives every candle as [datetime, open, high, low, close], precision rounds, and format=csv gives one row per candle: datetime,base_currency,currency,open,high,low,close.
| Name | Required | Description | Default |
|---|---|---|---|
| shape | No | `default`: every rate as `{"code": "EUR", "value": 0.918456}`. `compact`: plain values, `"EUR": 0.918456`. | |
| format | No | `json` (default), `csv` or `xlsx`. CSV has a header line and one row per currency (and point in time), values without exponent notation. `xlsx` is the same table as an Excel workbook (one sheet, bold frozen header row, numbers as numbers), sent as a download named after the endpoint, e.g. `latest.xlsx`. | |
| interval | No | The length of each candle. | |
| precision | No | Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals (10 significant digits below 0.1). | |
| currencies | Yes | 1 to 10 currency codes, comma-separated (e.g. `EUR,GBP`) or as `currencies[]=`. | |
| datetime_end | Yes | End of the range as an ISO 8601 datetime or date, on or after `datetime_start`. The last candle is the one this moment falls in. | |
| base_currency | No | The base currency that all returned values are relative to. Defaults to `USD`. | |
| datetime_start | Yes | Start of the range as an ISO 8601 datetime or date (e.g. `2026-09-29T00:00:00Z`). The first candle is the one this moment falls in. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry only a title, so the description bears the full burden and does so: it explains how candles are constructed (open = prior close, high/low include open and close, gaps handled), that unfinished candles are omitted, and that the whole request costs one request regardless of currency/candle count. The plan-tier gating is disclosed up front rather than surfacing as an error.
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 purpose and plan gate, then bulleted interval constraints, then candle semantics, then output shapes — a sensible ordering. It is on the long side and the CSV/compact restatement partially duplicates the schema's own parameter descriptions, but every section carries information an agent needs.
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 8 parameters, plan-tier gating, and no output schema, the description fills the gap: it covers lookback limits, default interval, candle construction edge cases, omission of in-progress candles, request costing, and the exact return representations for default, compact and CSV.
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: it tells the agent which finer rate series each interval is built from, that `day` is the default, that `datetime` is the candle start and `datetime_end` selects the candle it falls in, and it spells out the exact compact/CSV payload layouts including column order.
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?
Opens with a specific verb and resource: 'Returns open, high, low and close per hour or per day for 1 to 10 currencies, built from the stored rates.' That is clearly distinguishable from siblings like getHistorical, getRange or getFluctuation, which return different shapes of rate 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?
It gives concrete selection criteria between the two modes (hour needs 7-day windows and quarter-hourly plan; day needs 3-month/92-day windows and hourly plan) plus the plan requirement for the range endpoint, so the agent knows when the call will succeed. It stops short of naming sibling tools or stating when to prefer them (e.g. getHistorical for tick-level data), so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getRangeHistorical exchange rates for a time rangeAInspect
Returns exchange rates for every interval between datetime_start and datetime_end at the requested accuracy. Requires a plan that includes the range endpoint (medium and up). The allowed span and look-back depend on the chosen accuracy:
day: not more than 366 days between start and end.hour: not more than 7 days between start and end, and not more than 3 months back.quarter_hour: not more than 24 hours between start and end, and not more than 7 days back.minute: not more than 6 hours between start and end, and not more than 7 days back.week: the daily rate at the end of each week (Sunday), not more than 1830 days between start and end.month: the daily rate at the end of each month, any span back to
For week and month the last point is datetime_end itself when it falls inside a period. Add format=csv for one row per point and currency: datetime,base_currency,currency,value.
orient=currency returns one series per currency instead of one point per datetime (data.EUR is a list of {datetime, value}), shape=compact drops the code/value objects (with orient=currency each point is [datetime, value]), and precision rounds.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter the returned currencies by type. | |
| shape | No | `default`: every rate as `{"code": "EUR", "value": 0.918456}`. `compact`: plain values, `"EUR": 0.918456`. | |
| format | No | `json` (default), `csv` or `xlsx`. CSV has a header line and one row per currency (and point in time), values without exponent notation. `xlsx` is the same table as an Excel workbook (one sheet, bold frozen header row, numbers as numbers), sent as a download named after the endpoint, e.g. `latest.xlsx`. | |
| orient | No | `datetime` (default): one point per datetime. `currency`: one series per currency, keyed by code. | |
| accuracy | No | The interval accuracy of the returned data. | |
| precision | No | Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals (10 significant digits below 0.1). | |
| currencies | No | Comma-separated list of currency codes to include (e.g. `EUR,USD,CAD`). The array form `currencies[]=EUR¤cies[]=USD` is also accepted. By default all supported currencies are returned. | |
| datetime_end | Yes | End of the range as an ISO 8601 datetime (e.g. `2021-12-31T23:59:59Z`). Must be after or equal to `datetime_start`. | |
| base_currency | No | The base currency that all returned values are relative to. Defaults to `USD`. | |
| datetime_start | Yes | Start of the range as an ISO 8601 datetime (e.g. `2021-11-30T23:59:59Z`). Must be before or equal to `datetime_end`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only a title annotation, the description carries the full burden and does so well: it discloses subscription gating, hard span/look-back limits per accuracy, the special end-of-period behavior for `week`/`month`, and the shape of returned data. It stops short of describing error behavior when limits are exceeded or any rate limits, which is the remaining gap.
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?
Purpose and dependency are front-loaded, then the accuracy limits are presented as a compact, scannable list where every bullet carries information an agent needs. The closing paragraph on orient/shape/precision leans on material the schema already states, so it is slightly redundant but not wasteful.
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 10-parameter tool with no output schema, the description covers what an agent actually needs: required plan tier, legal value combinations of dates and accuracy, and what the response looks like in JSON, CSV, and currency-oriented forms. Nothing essential to a correct call 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 coverage is 100%, so the baseline is 3. The description does add genuine meaning for `accuracy` by attaching concrete span constraints that the schema's one-line entry lacks, and it restates the interactions among `format`, `orient`, `shape`, and `precision` — but those restatements largely duplicate the schema rather than extend it.
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 opens with a specific verb and resource ('Returns exchange rates for every interval between `datetime_start` and `datetime_end`'), which immediately separates it from point-in-time siblings like getLatest or getRate. It does not, however, differentiate itself from getHistorical, which plausibly also returns past rates, so an agent must still infer the boundary from the name alone.
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 per-accuracy span and look-back table is essentially a decision guide: it tells the agent when each `accuracy` value is legal, and the plan requirement ('medium and up') flags a precondition before calling. What is missing is any explicit statement of when to prefer this tool over getHistorical, getAverage, or getOhlc.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getRateExchange rate of one currency pairAInspect
Returns the rate of one pair as a single number: how many units of to one unit of from buys, and the inverse. Latest at your plan's update interval by default, the close of a past date, or the rate at a datetime within your plan's intraday history (the minute, quarter hour or hour it falls in, as /v1/range reports it: minutes for the last 7 days, hours for the last 3 months). datetime needs a plan with intraday updates.
format=text answers with the bare number, so spreadsheets can read it directly, e.g. Google Sheets =IMPORTDATA("https://api.fxapi.com/v1/rate?from=EUR&to=USD&format=text&apikey=YOUR-API-KEY") or Excel =WEBSERVICE(...).
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | The currency to convert to. | |
| date | No | The close of this past day (format `YYYY-MM-DD`). Not together with `datetime`. | |
| from | Yes | The currency to convert from. | |
| format | No | `json` (default), `csv` (`from,to,rate,inverse,last_updated_at`), `xlsx` (the same table as an Excel workbook, `rate.xlsx`) or `text` (only the rate, as plain text without exponent notation). | |
| datetime | No | A moment within your plan's intraday history (ISO 8601). A moment not stored yet gets the newest rate. | |
| precision | No | Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals (10 significant digits below 0.1). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry only a title, so the description does the heavy lifting and succeeds on several points: freshness is tied to the plan's update interval, intraday resolution is quantified (minutes for 7 days, hours for 3 months), and `format=text` is disclosed as emitting a bare number. It omits error behavior and any indication of what the rate's own timestamp looks like beyond the csv column 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-loads the core contract (one pair, one number, both directions) before the temporal modes. The spreadsheet formula example is longer than strictly necessary and repeats the endpoint URL a second time, but it is genuinely practical and clearly delimited.
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 six parameters, no output schema and only a title annotation, the description covers the essentials: return shape, freshness semantics, and temporal resolution limits. It could be stronger by stating what happens for unavailable pairs or historical dates outside plan coverage.
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 the baseline is 3. The description adds real value for `datetime` by naming the interval it resolves to and the retention windows, but leaves `precision`, `format` details and the date/datetime exclusivity to 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?
States a specific verb and resource ('Returns the rate of one pair as a single number') and clarifies directionality ('how many units of `to` one unit of `from` buys, and the inverse'). It does not explicitly distinguish itself from look-alike siblings such as getLatest, getConvert or getHistorical, which matters given that this tool subsumes latest/date/datetime modes.
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 clear selection logic among its own modes: latest by default, the close of a past `date`, or an intraday `datetime` within a stated window. It also flags the plan prerequisite ('`datetime` needs a plan with intraday updates'). It never names a sibling tool as the alternative for cases this tool does not cover, so the guidance stops short of full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getStatusAccount quota statusAInspect
Returns your current monthly and grace quota usage and the plan of your API key's account. Requests to this endpoint do not count against your quota or rate limit.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry only a title, so the description does real work: it discloses that the call is quota- and rate-limit-exempt, which is a non-obvious behavioral trait an agent needs before deciding to poll it. It also names what comes back (usage figures, plan), though it stops short of format or reset-window details.
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, no filler. The return content is front-loaded and the exemption note follows as supporting detail, so an agent gets the essential fact first.
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-param tool with no output schema, the description covers what is returned at a useful level of abstraction (quota usage, grace quota, plan). It lacks any note on units, reset periods, or shape of the response, which is the only remaining gap.
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?
Zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. Nothing in the description conflicts with the empty 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?
States a specific verb and resource: returns current monthly and grace quota usage plus the account's plan. It is unambiguous and, given the all-currency siblings, an agent can immediately tell this is the only account-level tool in the set.
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 is only implied — an agent infers it should call this to check remaining quota or plan tier. There is no explicit when-to-use framing or named alternative, though the absence of any comparable sibling makes the routing decision trivial in practice.
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.
1 tool update
- Changed
getHistorical1 field changed- added
Input schema / properties / dates / minItemsAdded value: +1
7 tool updates
- Changed
getConvert4 fields changed- changed
Input schema / properties / precision / descriptionPrevious value: -"Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals."New value: +"Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals (10 significant digits below 0.1)." - changed
Input schema / properties / round_step / descriptionPrevious value: -"Adds `rounded`: every converted value rounded to a multiple of this step (greater than 0), e.g. `0.05`, `1` or `10`. Not together with `price_ending`; not with `shape=compact`."New value: +"Adds `rounded`: every converted value rounded to a multiple of this step (greater than 0, at most 10^18), e.g. `0.05`, `1` or `10`. Not together with `price_ending`; not with `shape=compact`." - changed
Input schema / properties / value / descriptionPrevious value: -"The value to convert. Must be greater than 0. Required unless `values` is sent; not together with `values`."New value: +"The value to convert. Must be greater than 0 and at most 10^18. Required unless `values` is sent; not together with `values`." - changed
Input schema / properties / values / descriptionPrevious value: -"Up to 100 values to convert (each greater than 0), comma-separated or as `values[]=`. `data` becomes a list with one entry per value, in the order sent. The request costs one request."New value: +"Up to 100 values to convert (each greater than 0 and at most 10^18), comma-separated or as `values[]=`. `data` becomes a list with one entry per value, in the order sent. The request costs one request."
- Changed
getHistorical1 field changed- changed
Input schema / properties / precision / descriptionPrevious value: -"Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals."New value: +"Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals (10 significant digits below 0.1)."
- Changed
getLatest1 field changed- changed
Input schema / properties / precision / descriptionPrevious value: -"Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals."New value: +"Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals (10 significant digits below 0.1)."
- Changed
getMatrix1 field changed- changed
Input schema / properties / precision / descriptionPrevious value: -"Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals."New value: +"Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals (10 significant digits below 0.1)."
- Changed
getOhlc1 field changed- changed
Input schema / properties / precision / descriptionPrevious value: -"Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals."New value: +"Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals (10 significant digits below 0.1)."
- Changed
getRange1 field changed- changed
Input schema / properties / precision / descriptionPrevious value: -"Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals."New value: +"Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals (10 significant digits below 0.1)."
- Changed
getRate1 field changed- changed
Input schema / properties / precision / descriptionPrevious value: -"Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals."New value: +"Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals (10 significant digits below 0.1)."
9 tool updates
- Changed
getAverage2 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"`json` (default) or `csv`. CSV has a header line and one row per currency (and point in time), values without exponent notation."New value: +"`json` (default), `csv` or `xlsx`. CSV has a header line and one row per currency (and point in time), values without exponent notation. `xlsx` is the same table as an Excel workbook (one sheet, bold frozen header row, numbers as numbers), sent as a download named after the endpoint, e.g. `latest.xlsx`." - changed
Input schema / properties / format / enumPrevious value: -[ - "json", - "csv" -]New value: +[ + "json", + "csv", + "xlsx" +]
- Changed
getConvert2 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"`json` (default) or `csv`. CSV has a header line and one row per currency (and point in time), values without exponent notation."New value: +"`json` (default), `csv` or `xlsx`. CSV has a header line and one row per currency (and point in time), values without exponent notation. `xlsx` is the same table as an Excel workbook (one sheet, bold frozen header row, numbers as numbers), sent as a download named after the endpoint, e.g. `latest.xlsx`." - changed
Input schema / properties / format / enumPrevious value: -[ - "json", - "csv" -]New value: +[ + "json", + "csv", + "xlsx" +]
- Changed
getFluctuation2 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"`json` (default) or `csv`. CSV has a header line and one row per currency (and point in time), values without exponent notation."New value: +"`json` (default), `csv` or `xlsx`. CSV has a header line and one row per currency (and point in time), values without exponent notation. `xlsx` is the same table as an Excel workbook (one sheet, bold frozen header row, numbers as numbers), sent as a download named after the endpoint, e.g. `latest.xlsx`." - changed
Input schema / properties / format / enumPrevious value: -[ - "json", - "csv" -]New value: +[ + "json", + "csv", + "xlsx" +]
- Changed
getHistorical2 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"`json` (default) or `csv`. CSV has a header line and one row per currency (and point in time), values without exponent notation."New value: +"`json` (default), `csv` or `xlsx`. CSV has a header line and one row per currency (and point in time), values without exponent notation. `xlsx` is the same table as an Excel workbook (one sheet, bold frozen header row, numbers as numbers), sent as a download named after the endpoint, e.g. `latest.xlsx`." - changed
Input schema / properties / format / enumPrevious value: -[ - "json", - "csv" -]New value: +[ + "json", + "csv", + "xlsx" +]
- Changed
getLatest2 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"`json` (default) or `csv`. CSV has a header line and one row per currency (and point in time), values without exponent notation."New value: +"`json` (default), `csv` or `xlsx`. CSV has a header line and one row per currency (and point in time), values without exponent notation. `xlsx` is the same table as an Excel workbook (one sheet, bold frozen header row, numbers as numbers), sent as a download named after the endpoint, e.g. `latest.xlsx`." - changed
Input schema / properties / format / enumPrevious value: -[ - "json", - "csv" -]New value: +[ + "json", + "csv", + "xlsx" +]
- Changed
getMatrix2 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"`json` (default) or `csv`. CSV has a header line and one row per currency (and point in time), values without exponent notation."New value: +"`json` (default), `csv` or `xlsx`. CSV has a header line and one row per currency (and point in time), values without exponent notation. `xlsx` is the same table as an Excel workbook (one sheet, bold frozen header row, numbers as numbers), sent as a download named after the endpoint, e.g. `latest.xlsx`." - changed
Input schema / properties / format / enumPrevious value: -[ - "json", - "csv" -]New value: +[ + "json", + "csv", + "xlsx" +]
- Changed
getOhlc2 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"`json` (default) or `csv`. CSV has a header line and one row per currency (and point in time), values without exponent notation."New value: +"`json` (default), `csv` or `xlsx`. CSV has a header line and one row per currency (and point in time), values without exponent notation. `xlsx` is the same table as an Excel workbook (one sheet, bold frozen header row, numbers as numbers), sent as a download named after the endpoint, e.g. `latest.xlsx`." - changed
Input schema / properties / format / enumPrevious value: -[ - "json", - "csv" -]New value: +[ + "json", + "csv", + "xlsx" +]
- Changed
getRange2 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"`json` (default) or `csv`. CSV has a header line and one row per currency (and point in time), values without exponent notation."New value: +"`json` (default), `csv` or `xlsx`. CSV has a header line and one row per currency (and point in time), values without exponent notation. `xlsx` is the same table as an Excel workbook (one sheet, bold frozen header row, numbers as numbers), sent as a download named after the endpoint, e.g. `latest.xlsx`." - changed
Input schema / properties / format / enumPrevious value: -[ - "json", - "csv" -]New value: +[ + "json", + "csv", + "xlsx" +]
- Changed
getRate2 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"`json` (default), `csv` (`from,to,rate,inverse,last_updated_at`) or `text` (only the rate, as plain text without exponent notation)."New value: +"`json` (default), `csv` (`from,to,rate,inverse,last_updated_at`), `xlsx` (the same table as an Excel workbook, `rate.xlsx`) or `text` (only the rate, as plain text without exponent notation)." - changed
Input schema / properties / format / enumPrevious value: -[ - "json", - "csv", - "text" -]New value: +[ + "json", + "csv", + "text", + "xlsx" +]
2 tool updates
- Changed
getConvert9 fields changed- changed
Input schema / properties / date / descriptionPrevious value: -"Optional date to convert against historical rates (format `YYYY-MM-DD`). Must be at least one day in the past. Omit for the latest rates."New value: +"Optional date to convert against historical rates (format `YYYY-MM-DD`). Must be at least one day in the past. Omit for the latest rates. Not together with `datetime`." - added
Input schema / properties / datetimeAdded value: +{ + "description": "Convert at this moment within your plan's intraday history (ISO 8601): the rate of the minute, quarter hour or hour it falls in, as `/v1/rate` finds it. `meta.last_updated_at` is that point. Needs a plan with intraday updates (`403` on daily plans); moments beyond the plan's history return a `422`.", + "type": "string" +} - added
Input schema / properties / localeAdded value: +{ + "description": "Adds `formatted`: every converted value as text in this ICU locale (e.g. `de_AT`, `en-US`), with the currency's symbol and decimal places (at most 8; none with a whole-number `round_step`). With rounding, the rounded price is formatted. An unknown locale returns a `422`. Not with `shape=compact`.", + "type": "string" +} - added
Input schema / properties / price_endingAdded value: +{ + "description": "Adds `rounded`: every converted value rounded to a price with this ending (at least 0, below 1), e.g. `0.99` turns 10.97 into 10.99. Not together with `round_step`; not with `shape=compact`.", + "type": "number" +} - added
Input schema / properties / round_modeAdded value: +{ + "description": "How `round_step` and `price_ending` round: to the `nearest` candidate (default), always `up` or always `down`.", + "enum": [ + "nearest", + "up", + "down" + ], + "type": "string" +} - added
Input schema / properties / round_stepAdded value: +{ + "description": "Adds `rounded`: every converted value rounded to a multiple of this step (greater than 0), e.g. `0.05`, `1` or `10`. Not together with `price_ending`; not with `shape=compact`.", + "type": "number" +} - changed
Input schema / properties / value / descriptionPrevious value: -"The value to convert. Must be greater than 0."New value: +"The value to convert. Must be greater than 0. Required unless `values` is sent; not together with `values`." - added
Input schema / properties / valuesAdded value: +{ + "description": "Up to 100 values to convert (each greater than 0), comma-separated or as `values[]=`. `data` becomes a list with one entry per value, in the order sent. The request costs one request.", + "items": { + "type": "number" + }, + "maxItems": 100, + "minItems": 1, + "type": "array" +} - removed
Input schema / requiredRemoved value: -[ - "value" -]
- Added
getOhlc
6 tool updates
- Changed
getConvert3 fields changed- added
Input schema / properties / formatAdded value: +{ + "description": "`json` (default) or `csv`. CSV has a header line and one row per currency (and point in time), values without exponent notation.", + "enum": [ + "json", + "csv" + ], + "type": "string" +} - added
Input schema / properties / precisionAdded value: +{ + "description": "Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals.", + "type": "integer" +} - added
Input schema / properties / shapeAdded value: +{ + "description": "`default`: every rate as `{\"code\": \"EUR\", \"value\": 0.918456}`. `compact`: plain values, `\"EUR\": 0.918456`.", + "enum": [ + "default", + "compact" + ], + "type": "string" +}
- Changed
getHistorical7 fields changed- changed
Input schema / properties / date / descriptionPrevious value: -"Date to retrieve historical rates for (format `YYYY-MM-DD`)."New value: +"Date to retrieve historical rates for (format `YYYY-MM-DD`). Required unless `dates` is sent; not together with `dates`." - added
Input schema / properties / datesAdded value: +{ + "description": "Up to 31 dates (format `YYYY-MM-DD`), comma-separated or as `dates[]=`. Each date is answered once, oldest first, and costs one request.", + "items": { + "type": "string" + }, + "maxItems": 31, + "type": "array" +} - added
Input schema / properties / formatAdded value: +{ + "description": "`json` (default) or `csv`. CSV has a header line and one row per currency (and point in time), values without exponent notation.", + "enum": [ + "json", + "csv" + ], + "type": "string" +} - added
Input schema / properties / inverseAdded value: +{ + "description": "`true` adds `inverse` to every rate: the value of one unit of the currency in the base currency (1 / value). Not with `shape=compact`.", + "type": "boolean" +} - added
Input schema / properties / precisionAdded value: +{ + "description": "Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals.", + "type": "integer" +} - added
Input schema / properties / shapeAdded value: +{ + "description": "`default`: every rate as `{\"code\": \"EUR\", \"value\": 0.918456}`. `compact`: plain values, `\"EUR\": 0.918456`.", + "enum": [ + "default", + "compact" + ], + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "date" -]
- Changed
getLatest5 fields changed- added
Input schema / properties / formatAdded value: +{ + "description": "`json` (default) or `csv`. CSV has a header line and one row per currency (and point in time), values without exponent notation.", + "enum": [ + "json", + "csv" + ], + "type": "string" +} - added
Input schema / properties / includeAdded value: +{ + "description": "`change` adds `change` and `change_pct` to every rate: the difference to the close of the day before `last_updated_at` (`meta.change_since`), computed like `/v1/fluctuation`. Null when that close has no rate for the currency. Not with `shape=compact`.", + "enum": [ + "change" + ], + "type": "string" +} - added
Input schema / properties / inverseAdded value: +{ + "description": "`true` adds `inverse` to every rate: the value of one unit of the currency in the base currency (1 / value). Not with `shape=compact`.", + "type": "boolean" +} - added
Input schema / properties / precisionAdded value: +{ + "description": "Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals.", + "type": "integer" +} - added
Input schema / properties / shapeAdded value: +{ + "description": "`default`: every rate as `{\"code\": \"EUR\", \"value\": 0.918456}`. `compact`: plain values, `\"EUR\": 0.918456`.", + "enum": [ + "default", + "compact" + ], + "type": "string" +}
- Added
getMatrix - Changed
getRange3 fields changed- added
Input schema / properties / orientAdded value: +{ + "description": "`datetime` (default): one point per datetime. `currency`: one series per currency, keyed by code.", + "enum": [ + "datetime", + "currency" + ], + "type": "string" +} - added
Input schema / properties / precisionAdded value: +{ + "description": "Round every value to this many decimals (0 to 10). By default values carry up to 10 decimals.", + "type": "integer" +} - added
Input schema / properties / shapeAdded value: +{ + "description": "`default`: every rate as `{\"code\": \"EUR\", \"value\": 0.918456}`. `compact`: plain values, `\"EUR\": 0.918456`.", + "enum": [ + "default", + "compact" + ], + "type": "string" +}
- Added
getRate
8 tool updates
- First observed
getAverage - First observed
getConvert - First observed
getCurrencies - First observed
getFluctuation - First observed
getHistorical - First observed
getLatest - First observed
getRange - First observed
getStatus
Publisher details
- Operator
- Everapi · Publisher source
- Operator website
- https://fxapi.com · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://fxapi.com/docs/ · Publisher source
- Trust center
- Unknown
- Restrictions
- Unknown
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceRemote MCP server that lets AI assistants read tracked competitive intelligence — competitor news, reviews, website changes, social posts and ads — and act on it by managing projects, competitors, battle cards, reports and canvases. Every answer carries a source and a date, and write actions only publish when explicitly shared.MIT
- AlicenseCqualityBmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs115 npm58 PyPIMIT
- AlicenseAqualityCmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.1623 npm1MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.