Skip to main content
Glama

Set exchange rates

set_exchange_rates
DestructiveIdempotent

Set/remove Fixed workspace FX rates (admin-only). Fixed overrides the daily ECB Automatic reference rate until changed; removing restores Automatic. Direction: 1 input-currency unit = rate in default currency (DKK default: {currency:"EUR",rate:7.46} means 1 EUR = 7.46 DKK). Reversed-looking rates or rates outside 0.8–1.25× the bank rate require confirm:true; without it nothing saves, and the response supplies the question/reference/suggested correction. Upserts and removals are atomic; ambiguous requests change nothing. Stored amounts never change; totals convert only if every currency has a rate. Returns default currency, Fixed rates, bank date and effective rates.

When to use: An admin chooses a budget/contract rate or returns a currency to Automatic.

Example: Fix 1 EUR at 7.46 DKK; reset USD.

Input Schema

NameRequiredDescriptionDefault
removeNoCurrency codes whose Fixed rate to remove, switching them back to Automatic. May be combined atomically with upsert; a currency cannot appear in both lists.
upsertNoRates to add or replace. Omit the workspace default currency; its implicit rate is 1.
confirmNotrue saves a questioned rate as entered, after the user has checked it.

Output Schema

NameRequiredDescriptionDefault
ratesNo
updatedNo
workspaceNo
bank_ratesNo
rate_checksNo
rates_in_useNo
invalid_ratesNo
default_currencyNo
requires_confirmNo
duplicate_currenciesNo
supported_currenciesNo
unchanged_currenciesNo
conflicting_currenciesNo
unsupported_currenciesNo
default_currency_upsertsNo
requires_default_currencyNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • removedInput schema / properties / confirm / anyOf
      Removed value: -[
      -  {
      -    "type": "boolean"
      -  },
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "number"
      -  }
      -]
    • addedInput schema / properties / confirm / type
      Added value: +[
      +  "boolean",
      +  "string",
      +  "number"
      +]
    • removedInput schema / properties / upsert / items / properties / rate / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "string"
      -  }
      -]
    • addedInput schema / properties / upsert / items / properties / rate / type
      Added value: +[
      +  "number",
      +  "string"
      +]
  2. Changed1 schema field changed
    • removedInput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
  3. Changed14 schema fields changed
    • removedOutput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
    • removedOutput schema / additionalProperties
      Removed value: -{}
    • removedOutput schema / properties / bank_rates / additionalProperties
      Removed value: -{}
    • removedOutput schema / properties / bank_rates / propertyNames
      Removed value: -{
      -  "type": "string"
      -}
    • removedOutput schema / properties / invalid_rates / items / additionalProperties
      Removed value: -false
    • removedOutput schema / properties / rate_checks / items / additionalProperties
      Removed value: -{}
    • removedOutput schema / properties / rate_checks / items / propertyNames
      Removed value: -{
      -  "type": "string"
      -}
    • removedOutput schema / properties / rates / items / additionalProperties
      Removed value: -false
    • removedOutput schema / properties / rates / items / properties / set_by / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / rates / items / properties / set_by / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / rates_in_use / items / additionalProperties
      Removed value: -{}
    • removedOutput schema / properties / rates_in_use / items / propertyNames
      Removed value: -{
      -  "type": "string"
      -}
    • removedOutput schema / properties / workspace / additionalProperties
      Removed value: -{}
    • removedOutput schema / properties / workspace / propertyNames
      Removed value: -{
      -  "type": "string"
      -}
  4. Changed8 schema fields changed
    • addedInput schema / properties / confirm
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "number"
      +    }
      +  ],
      +  "description": "true saves a questioned rate as entered, after the user has checked it."
      +}
    • changedInput schema / properties / remove / description
      Previous value: -"Currency codes to remove. May be combined atomically with upsert; a currency cannot appear in both lists."New value: +"Currency codes whose Fixed rate to remove, switching them back to Automatic. May be combined atomically with upsert; a currency cannot appear in both lists."
    • changedInput schema / properties / remove / items / description
      Previous value: -"ISO 4217 currency code whose stored manual rate should be removed. Must not be empty."New value: +"ISO 4217 currency code whose Fixed rate should be removed. Must not be empty."
    • changedInput schema / properties / upsert / items / properties / rate / description
      Previous value: -"Positive manual rate, at most 1000000: 1 unit of currency = this many units of the workspace default currency."New value: +"Positive Fixed rate, at most 1000000: 1 unit of currency = this many units of the workspace default currency."
    • addedOutput schema / properties / bank_rates
      Added value: +{
      +  "additionalProperties": {},
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / rate_checks
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "propertyNames": {
      +      "type": "string"
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / rates_in_use
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "propertyNames": {
      +      "type": "string"
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / requires_confirm
      Added value: +{
      +  "type": "boolean"
      +}
  5. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: explains that Fixed overrides the daily ECB Automatic rate, that removal restores Automatic, that upserts/removals are atomic and ambiguous requests change nothing, and that stored amounts never change while totals convert only if every currency has a rate — which correctly qualifies the destructiveHint. It also discloses the confirm gate and what the response supplies when confirmation is needed.

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-loads purpose, then direction, then confirmation behavior, then a 'When to use' and an 'Example' section. Dense with semicolons but every clause carries distinct operational information; slightly packed for a single opening block.

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?

For a 3-parameter admin mutation with an output schema, this covers everything an agent needs: the rate direction and currency set, the default-currency exclusion, atomicity, the confirmation loop, and downstream effects on totals. Return values are described but not relied upon since an output schema exists.

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 already 100%, so the baseline is 3, but the description adds real meaning: the rate direction with a worked example ({currency:'EUR',rate:7.46} = 1 EUR = 7.46 DKK), the interaction between upsert and remove, and the confirm workflow that the schema only gestures at. The 0.8–1.25× bank-rate threshold that triggers confirmation appears only here.

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?

States a specific verb pair and resource: 'Set/remove Fixed workspace FX rates (admin-only)'. No sibling tool touches FX rates, and the Fixed-vs-Automatic distinction is stated immediately, so an agent can identify the tool unambiguously.

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

Usage Guidelines4/5

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

A dedicated 'When to use' line names both use cases: an admin choosing a budget/contract rate, and returning a currency to Automatic. It gives clear context but no explicit when-not or named alternative, though none of the sibling tools competes for this job.

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