Skip to main content
Glama

History analysis (change, trend, movers)

analyze_history
Read-onlyIdempotent

Summarise how currencies moved against base over a window: start/end rate, change %, strengthened % (positive = stronger vs base), and optional min/max/avg. Use for questions like "how did EUR do over 10 years" and for movers rankings. Omit currencies to rank the universe (movers mode); provide them to compare specific ones. Use get_history for raw points, and the other analyze_* tools for volatility, correlation, drawdown, safe-haven, or mean-reversion questions. Defaults: 20-year window, base USD, sort strengthened, assetClass fiat, limit 10, stats true. Returns { base, from, to, mode, sort?, assetClass?, stats, results[] }. A 404 means no rate data at the window edges. Requires a signed-in connection and the Growth plan or higher; each successful call bills 1 API request.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "analyze_history"
  }
}

Input Schema

NameRequiredDescriptionDefault
toNoWindow end YYYY-MM-DD (UTC). Defaults to today; a future date clamps to today.
baseNoCurrency everything is measured against (3-letter ISO 4217). Defaults to USD.
fromNoWindow start YYYY-MM-DD (UTC). Defaults to 20 years (2 decades) before `to`. See `period` for a shorthand.
sortNoMovers ranking: strengthened (default) or weakened.
limitNoMovers: how many top results to return (default 10, max 200).
statsNoInclude min/max/avg over the window per currency. Defaults to true; pass false to skip.
periodNoRelative window shorthand for `from`: e.g. 10y, 6m, 30d, ytd, max. Ignored if `from` is given.
intervalNoAttach a trend series per named currency: weekly, monthly, or yearly (compare mode only).
assetClassNoMovers universe: fiat (default, liquid tradeable currencies), metals (XAU/XAG/XPT/XPD), all (every currency including illiquid/frontier), or crypto (accepted, but this FX dataset has no crypto data, so results are empty). Redenomination artifacts are always dropped.
currenciesNoComma-separated currencies to compare, e.g. GBP,EUR,AED. OMIT to rank ALL currencies vs base ('movers' mode).

Output Schema

NameRequiredDescriptionDefault
toYes
baseYes
fromYes
modeYes
sortNo
statsYes
resultsYes
intervalNo
assetClassNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedInput schema / properties / assetClass / description
      Previous value: -"Movers universe: fiat (default, the liquid tradeable currencies), metals (XAU/XAG/XPT/XPD), or all (every currency incl. illiquid/frontier). fiat excludes metals/synthetics + illiquid frontier codes; redenomination artifacts are always dropped."New value: +"Movers universe: fiat (default, liquid tradeable currencies), metals (XAU/XAG/XPT/XPD), all (every currency including illiquid/frontier), or crypto (accepted, but this FX dataset has no crypto data, so results are empty). Redenomination artifacts are always dropped."
    • addedInput schema / properties / assetClass / enum
      Added value: +[
      +  "fiat",
      +  "metals",
      +  "all",
      +  "crypto"
      +]
    • addedInput schema / properties / interval / enum
      Added value: +[
      +  "daily",
      +  "weekly",
      +  "monthly",
      +  "yearly"
      +]
    • addedInput schema / properties / sort / enum
      Added value: +[
      +  "strengthened",
      +  "weakened"
      +]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "assetClass": {
      +      "enum": [
      +        "fiat",
      +        "metals",
      +        "all",
      +        "crypto"
      +      ],
      +      "type": "string"
      +    },
      +    "base": {
      +      "type": "string"
      +    },
      +    "from": {
      +      "type": "string"
      +    },
      +    "interval": {
      +      "enum": [
      +        "daily",
      +        "weekly",
      +        "monthly",
      +        "yearly"
      +      ],
      +      "type": "string"
      +    },
      +    "mode": {
      +      "enum": [
      +        "compare",
      +        "movers"
      +      ],
      +      "type": "string"
      +    },
      +    "results": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "changePct": {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "currency": {
      +            "type": "string"
      +          },
      +          "endDate": {
      +            "type": "string"
      +          },
      +          "endRate": {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "series": {
      +            "additionalProperties": {
      +              "type": "number"
      +            },
      +            "propertyNames": {
      +              "type": "string"
      +            },
      +            "type": "object"
      +          },
      +          "startDate": {
      +            "type": "string"
      +          },
      +          "startRate": {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "stats": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "avg": {
      +                "type": "number"
      +              },
      +              "max": {
      +                "type": "number"
      +              },
      +              "min": {
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "min",
      +              "max",
      +              "avg"
      +            ],
      +            "type": "object"
      +          },
      +          "strengthenedPct": {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "volatility": {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          }
      +        },
      +        "required": [
      +          "currency",
      +          "startDate",
      +          "endDate",
      +          "startRate",
      +          "endRate",
      +          "changePct",
      +          "strengthenedPct"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "sort": {
      +      "enum": [
      +        "strengthened",
      +        "weakened"
      +      ],
      +      "type": "string"
      +    },
      +    "stats": {
      +      "type": "boolean"
      +    },
      +    "to": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "base",
      +    "from",
      +    "to",
      +    "mode",
      +    "stats",
      +    "results"
      +  ],
      +  "type": "object"
      +}
  2. First observed

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description goes further: billing of 1 API request per successful call, Growth plan plus signed-in connection requirement, and the meaning of a 404 at window edges. It does not discuss pagination or truncation behavior at `limit` max 200, which is the main 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.

Conciseness4/5

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

Front-loaded with purpose and mode selection before edge details, and each sentence is informative. It runs long, however, and the defaults list plus the explicit return-shape sentence duplicate information already carried by the 100%-covered schema and the output schema.

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 10-parameter, enum-heavy read tool this covers purpose, mode selection, defaults, error semantics, and access/billing constraints. Return values are documented by the output schema and are additionally sketched here, so nothing an agent needs 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 every parameter including defaults and enum meanings. The description's 'Defaults:' sentence and mode explanation largely restate that, adding only the interaction framing that `currencies` presence flips the mode.

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 and resource plus the exact outputs (start/end rate, change %, strengthened %, optional min/max/avg), and explicitly separates the two operating modes: omit `currencies` to rank the universe, provide them to compare. An agent can distinguish it from get_history and the other analyze_* tools without opening schemas.

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?

Gives an example question ('how did EUR do over 10 years'), names the alternative for raw data (`get_history`), and routes volatility/correlation/drawdown/safe-haven/mean-reversion questions to the specific sibling tools. No ambiguity about when this tool is the right choice.

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