Skip to main content
Glama

utilpeek: live FX rates from Base stablecoin pools (EUR, GBP, MXN, BRL, CAD, SGD, ZAR, IDR) with ECB deviation, plus exchange bid/ask for the majors

get_live_fx_rates
Read-onlyIdempotent

utilpeek: Use when an agent needs on-chain EUR/GBP/MXN/BRL/CAD/SGD/ZAR/IDR vs USD or exchange quotes for 8 pairs, not ECB. For the ECB fix or a past date use get_fx_rates. Returns on-chain FX bid/ask/mid with ECB deviation_pct; indicative quotes from a regulated exchange for EURUSD, GBPUSD, USDJPY, AUDUSD, USDCAD, USDCHF, EURGBP, EURJPY (exchange_quotes). USDCHF/EURGBP/EURJPY exchange-only; USDCAD also on-chain. Matching gap_pct in exchange_gaps. Indicative, not dealable or synchronized arbitrage. Pools cached 15 s; thin/errors reported. Exchange cache 60 s; stale=true data kept at most 300 s. as_of/age_s: fetch age, not venue age; venue_timestamp null. Exchange-only empty: 503 exchange_unavailable (not charged). Unknown pair: 422 (not charged). Typically 2 to 4 s (two chain reads). Price: USD 0.002. Free: 10 utilpeek calls per IP per UTC day. Docs: https://tanod.dev/learn/live-fx-rates-api.html

Input Schema

NameRequiredDescriptionDefault
pairsNoPairs in market convention, for example EURUSD (USD per EUR) or USDMXN (MXN per USD). Omit for every supported pair. Exchange quotes cover EURUSD, GBPUSD, USDJPY, AUDUSD, USDCAD, USDCHF, EURGBP and EURJPY. USDJPY, AUDUSD, USDCHF, EURGBP and EURJPY are exchange-only; EURUSD, GBPUSD and USDCAD also have configured on-chain pools. An unknown pair is a 422 that lists the supported ones.
amount_usdNoReference trade size in USD for the price-impact measurement, 100 to 100000 (default 1000). A pair whose impact at this size is 1% or more is listed under `thin`.

Output Schema

NameRequiredDescriptionDefault
thinNo
blockNo
chainNo
errorNoOnly on an error result: an object {code, message}, or the reason string of an x402 PaymentRequired object.
pairsNo
cachedNo
errorsNo
methodNo
licenceNo
small_usdNo
timestampNo
amount_usdNo
disclaimerNo
indicativeNo
exchange_gapsNo
exchange_noteNo
exchange_quotesNo
exchange_omittedNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / pairs / description
      Previous value: -"Pairs in market convention, for example EURUSD (USD per EUR) or USDMXN (MXN per USD). Omit for every supported pair; USDJPY and AUDUSD return exchange quotes only. USDCAD is on-chain only, with no exchange quote. An unknown pair is a 422 that lists the supported ones."New value: +"Pairs in market convention, for example EURUSD (USD per EUR) or USDMXN (MXN per USD). Omit for every supported pair. Exchange quotes cover EURUSD, GBPUSD, USDJPY, AUDUSD, USDCAD, USDCHF, EURGBP and EURJPY. USDJPY, AUDUSD, USDCHF, EURGBP and EURJPY are exchange-only; EURUSD, GBPUSD and USDCAD also have configured on-chain pools. An unknown pair is a 422 that lists the supported ones."
  2. Changed8 schema fields changed
    • changedInput schema / properties / pairs / description
      Previous value: -"Pairs in market convention, for example EURUSD (USD per EUR) or USDMXN (MXN per USD). Omit for every supported pair; USDJPY and AUDUSD return indicative exchange quotes only. An unknown pair is a 422 that lists the supported ones."New value: +"Pairs in market convention, for example EURUSD (USD per EUR) or USDMXN (MXN per USD). Omit for every supported pair; USDJPY and AUDUSD return exchange quotes only. USDCAD is on-chain only, with no exchange quote. An unknown pair is a 422 that lists the supported ones."
    • addedOutput schema / properties / exchange_gaps
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "exchange_age_s": {
      +        "maximum": 300,
      +        "minimum": 0,
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "exchange_as_of": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "exchange_mid": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "exchange_stale": {
      +        "type": [
      +          "boolean",
      +          "null"
      +        ]
      +      },
      +      "gap_pct": {
      +        "description": "(onchain_mid / exchange_mid - 1) * 100; not synchronized.",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "onchain_mid": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "onchain_timestamp": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "pair": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "type": [
      +      "object",
      +      "null"
      +    ]
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / exchange_quotes / items / properties / age_s / description
      Added value: +"Seconds since fetch, not venue quote age."
    • addedOutput schema / properties / exchange_quotes / items / properties / age_s / maximum
      Added value: +300
    • addedOutput schema / properties / exchange_quotes / items / properties / age_s / minimum
      Added value: +0
    • addedOutput schema / properties / exchange_quotes / items / properties / as_of / description
      Added value: +"Fetch-window start, not a venue timestamp."
    • addedOutput schema / properties / exchange_quotes / items / properties / stale
      Added value: +{
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / exchange_quotes / items / properties / venue_timestamp
      Added value: +{
      +  "description": "Null when not supplied by the ticker.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  3. Changed4 schema fields changed
    • changedInput schema / properties / pairs / description
      Previous value: -"Pairs in market convention, for example EURUSD (USD per EUR) or USDMXN (MXN per USD). Omit for every supported pair; an unknown pair is a 422 that lists the supported ones."New value: +"Pairs in market convention, for example EURUSD (USD per EUR) or USDMXN (MXN per USD). Omit for every supported pair; USDJPY and AUDUSD return indicative exchange quotes only. An unknown pair is a 422 that lists the supported ones."
    • addedOutput schema / properties / exchange_note
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / exchange_omitted
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "code": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "pair": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "reason": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "spread_pct": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      }
      +    },
      +    "type": [
      +      "object",
      +      "null"
      +    ]
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / exchange_quotes
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "age_s": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "as_of": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "ask": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "base": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "bid": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "mid": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "pair": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "quote": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "source": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "spread_pct": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      }
      +    },
      +    "type": [
      +      "object",
      +      "null"
      +    ]
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
  4. Added

TDQS

A4.6/5.0
Behavior5/5

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

Despite readOnlyHint/idempotentHint being present, the description adds substantial context annotations cannot carry: 15 s pool cache, 60 s exchange cache with stale data retained up to 300 s, as_of/age_s meaning fetch age not venue age, venue_timestamp null, thin/errors reporting, 503 exchange_unavailable and 422 for unknown pair (both uncharged), typical 2–4 s latency, $0.002 price and a 10-call/day free tier.

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?

Front-loaded with the decision-relevant usage and alternative, and nearly every clause carries operational fact (caching, error codes, pricing). It is dense and symbol-heavy (thin, stale, age_s, gap_pct) and long, which slows parsing, but little is actually wasted.

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?

With an output schema present the description needn't enumerate returns, yet it still names the key fields (bid/ask/mid, deviation_pct, exchange_quotes, exchange_gaps/gap_pct) and covers failure modes, latency, cost and freshness. Nothing an agent needs to invoke it correctly or interpret results is missing.

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

Parameters3/5

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 pairs format, supported set, exchange-only vs on-chain pairs, and amount_usd's role in the thin threshold. The description largely restates that pair coverage (USDCHF/EURGBP/EURJPY exchange-only, USDCAD also on-chain) rather than adding new syntax or defaults, so baseline 3 applies.

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 opening sentence states a specific verb and resource — live on-chain FX rates for eight named currencies vs USD, plus exchange quotes for eight pairs — and explicitly distinguishes the not-ECB variant from the sibling get_fx_rates. An agent can select it 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 gives an explicit use condition ("Use when an agent needs on-chain ... not ECB") and routes the excluded cases — ECB fix or a past date — to get_fx_rates by name. It also warns the quotes are indicative and not dealable arbitrage, which constrains how the output may be used.

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