Skip to main content
Glama

Get exchange rate

well_get_fx_quote
Read-only

Call this FIRST for any question about an exchange rate or a currency conversion, in any wording or language ("convert 500 EUR to USD", "how much is 2,000 GBP in euros", "EUR USD today", "what's the dollar at", "and in GBP?"): your own memory of rates is out of date and wrong, so never answer a rate or a converted figure without this call, and never answer it from a web search or from your own arithmetic.

Convert an amount between two currencies, or read the exchange rate: how many quote one base is worth on a day. Use it in any workflow that needs a rate or a converted figure (converting an amount, pricing an invoice in another currency, reading a balance or a report in one currency), so the rate and the arithmetic come from Well and are never typed, recalled, estimated or computed by you. The rate is a daily reference rate from the provider source names (Well reads more than one): it is not a live market quote, and a live rate can differ slightly.

Pass base and quote as ISO 4217 codes, always both. Pass amount, a plain decimal string such as "500.00" (no currency symbol, no thousands separator), whenever there is a sum to convert: the tool multiplies and rounds it, so never multiply an amount by a rate yourself. Do not call the tool when base and quote are the same currency: nothing converts, so the amount stands as it is. Leave amount out only when you need the rate alone; it then defaults to "1". Pass date (YYYY-MM-DD) for the day the rate must hold on, such as a document's issue date; leave it out for today. Any day since 4 January 1999 has a rate, so never tell the person that history is limited or that old dates are unavailable: ask for the date and read the answer.

Returns status. "same_currency": base equals quote (a call that should not have been needed), nothing converts, and converted_amount is the amount. "found": amount, converted_amount (the amount in quote, rounded to that currency's minor units: quote it exactly as given) and converted_currency; rate ("1 base = rate quote") and inverse_rate (1 quote in base), decimal strings stored at 8 decimals; rate_display, the rate as the source publishes it with no padding zeros ("1.1225", never "1.12250000"), the figure you show the person, every digit kept, with the decimal mark of the reply's language ("1,1225" in French); rate_date (the day of the latest rate published on or before date); source (the provider of the rate); and triangulated (true when two published rates were combined through EUR). To state the rate, quote rate_display, not a converted_amount for an amount of 1, which is rounded. "no_rate": reason is "no_rate_on_or_before_date" (no published rate on that date or in the week before it), "before_rate_history" (the date is before the first rate Well holds), "unsupported_pair" (no provider publishes a rate for a currency) or "provider_unavailable" (the rate source did not answer in time; a retry in a moment can work), with a plain message you can pass on as it is. A malformed, negative or oversized amount is refused with error_reason "invalid_amount".

On "no_rate", say that no rate was available and stop: never state, estimate or recall a rate or a converted figure yourself. Say, in one short plain sentence, that the rate is the source reference rate of rate_date, not a live market rate, beside any rate or converted figure you show. Quote source and rate_date exactly as returned, never another provider's name. When rate_date differs from date, state rate_date only, never a reason for the gap (a weekend, a holiday, a publication time).

Input Schema

NameRequiredDescriptionDefault
baseYesThe currency being converted from: 1 base = rate quote.
dateNoThe day the rate must hold on, YYYY-MM-DD. Leave out for today.
quoteYesThe currency being converted to.
amountNoThe sum of `base` to convert, a decimal string such as "500.00". Leave out to get the rate alone: it defaults to "1".1
workspace_idNoTarget workspace. Optional: this tool describes the token itself rather than one workspace's data, so omitting it returns the same answer.
conversation_idNoThe conversation id returned by the previous Well result, in its meta under well/conversation_id, in its structuredContent, or in its JSON text block. Pass it back on every call in the same conversation, including a call a card makes, so the chosen workspace and the earlier answers still apply. It decides the conversation on its own: nothing the host states about the session replaces it. Omit it only on the first call of a conversation.
workspace_scopeNoRestrict this call to the family: the token's primary workspace plus the company workspaces under it that you are a member of. Unrelated authorized workspaces drop out of the read; row reads merge across the family, while a per-workspace figure still reports exactly one workspace.

Output Schema

NameRequiredDescriptionDefault
baseNo
rateNo1 base in quote, a decimal string.
errorNo
quoteNo
amountNoThe sum of base that was converted, as given.
reasonNo
sourceNo
statusNo
messageNoOn no_rate, a plain sentence saying why, to pass on to the person.
successYes
rate_dateNoThe day the rate was published.
error_reasonNo
inverse_rateNo1 quote in base, a decimal string.
rate_displayNoThe rate as the source publishes it, with no padding zeros: the figure to show the person.
triangulatedNo
requested_dateNo
conversation_idNoThe conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation.
newly_connectedNoTools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. The connected-line rule says when to tell an entry; when it does, one line per entry, in the person's language: "<name> is connected.". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later.
converted_amountNoThe amount in quote, rounded to its minor units: quote it as given.
converted_currencyNo
conversation_id_noteNoPresent only when the server opened a fresh lane, stating that no choice recorded earlier was read.
conversation_id_sourceNoWhere the conversation id came from: the host's own request meta, the caller's argument, or a fresh lane the server opened.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / rate_display
      Added value: +{
      +  "description": "The rate as the source publishes it, with no padding zeros: the figure to show the person.",
      +  "type": "string"
      +}
  2. Changed1 schema field changed
    • changedOutput schema / properties / newly_connected / description
      Previous value: -"Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. Start the reply with one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later."New value: +"Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. The connected-line rule says when to tell an entry; when it does, one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later."
  3. Changed1 schema field changed
    • addedInput schema / properties / workspace_scope
      Added value: +{
      +  "description": "Restrict this call to the family: the token's primary workspace plus the company workspaces under it that you are a member of. Unrelated authorized workspaces drop out of the read; row reads merge across the family, while a per-workspace figure still reports exactly one workspace.",
      +  "enum": [
      +    "family"
      +  ],
      +  "type": "string"
      +}
  4. Changed1 schema field changed
    • addedOutput schema / properties / newly_connected
      Added value: +{
      +  "description": "Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. Start the reply with one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "name": {
      +        "type": "string"
      +      },
      +      "service_id": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "service_id"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  5. Added

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/no-destructive/closed-world, and the description still adds substantial behavior: rates are daily provider reference rates, not live market quotes; triangulation through EUR is flagged; the provider may be unavailable and a retry can succeed; history reaches back to 4 January 1999; rounding is applied to the converted figure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The critical directive ("Call this FIRST") is front-loaded, and later paragraphs are organized by parameter then return field. It is long, and the injunctions against recalling or computing a rate yourself are repeated three times, which is some avoidable bulk for a 7-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema, the description adds the field-selection guidance an agent actually needs (quote `rate_display`, not a rounded `converted_amount` of 1; quote `source` and `rate_date` exactly; suppress reasons for a rate-date gap). Failure modes and the required follow-up behavior on `no_rate` are covered, leaving nothing material unsaid.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, and the description goes further: `amount` is a plain decimal string with no symbol or separator, defaults to "1" when only the rate is wanted, and the tool performs the multiplication and rounding rather than the agent. `date` semantics (rate holds on that day; the returned `rate_date` may be earlier) are also explained. Workspace/conversation parameters are left entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource (convert an amount between currencies / read the exchange rate), names the direction convention ("1 base = rate quote"), and explicitly distinguishes the tool from sibling/alternative approaches such as a web search or recalling a rate. An agent can identify exactly what this tool does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states explicitly when to call ("Call this FIRST for any question about an exchange rate or a currency conversion, in any wording"), when not to (same currency as base and quote), and rules out alternatives ("never answer it from a web search or from your own arithmetic"). Date selection is also routed: pass `date` for a document's issue date, omit it for today.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources