Skip to main content
Glama

What changed: ranked notable events

get_changes
Read-onlyIdempotent

Detect what changed over period and rank it, most significant first: the biggest USD flows, allocation shifts, drawdowns, newly seen sources and reconciliation to-dos, each USD-valued, with countsByType counting everything detected before the list was capped. Built for short windows such as last_7d or last_30d; omitting period scans all time. Use for "what changed", "anything unusual", "notable moves this week". It reports events, not totals: for profit over the same period use get_performance, for money in and out use get_money_flows.

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": "get_changes"
  }
}

Input Schema

NameRequiredDescriptionDefault
periodNoTime window ending now: last_24h, last_7d, last_30d, last_90d, ytd (since 1 January UTC) or all. Omit for all time.
profileNoWhich portfolio to read, for accounts with more than one: its id, or its name (exact, case-insensitive, e.g. "Trading"). Omit to read this connection's default portfolio; every answer names the portfolio it read in `profile`. An unknown or shared name returns profile_not_found or profile_ambiguous listing the real ones, and list_profiles shows them up front.

Output Schema

NameRequiredDescriptionDefault
errorNoPresent ONLY when the call was refused instead of answered: upgrade_required (Pro plan needed), not_found, profile_not_found, profile_ambiguous, invalid_arguments, write_not_permitted. No data fields come with it; read `message` to the user rather than retrying the same call.
notesNo
eventsNoRanked, most significant first.
windowNoThe time window these figures cover.
messageNoPlain-language explanation that accompanies `error`, `data_status` or a proposed change. Read it to the user.
profileNoThe portfolio these figures belong to (absent on list_profiles).
next_stepNoWhat the user should do about data_status.
truncatedNoPresent only when a list was longer than the 200-row cap and was cut: list field name -> {total, kept, keep, from, to}. A `<field>_note` string beside that list says the same in words. Never present a cut list as complete.
source_urlNoLink to the page in the WhereItGoes app that shows this data.
data_statusNoPresent only when the portfolio has no data yet. nothing_connected: no exchange and no wallet is connected, so empty lists and zeros mean "no data", NOT a $0 portfolio, and no data fields come with it (except on get_connections, get_alerts, get_target_allocation and list_profiles, which also answer). Send the user to next_step. syncing: a source is connected but its first sync is still running, so figures are partial and not final.
events_noteNoPresent only when `events` was cut; says how many rows were kept and which.
upgrade_urlNoWhere the user can upgrade, on an upgrade_required refusal.
countsByTypeNoEvents detected per type before the list was capped.
stock_assetsNoPresent when the answer mentions Binance Stocks shares (EQ_<ticker>): they are US stocks, not crypto.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • addedOutput schema / properties / data_status
      Added value: +{
      +  "description": "Present only when the portfolio has no data yet. nothing_connected: no exchange and no wallet is connected, so empty lists and zeros mean \"no data\", NOT a $0 portfolio, and no data fields come with it (except on get_connections, get_alerts, get_target_allocation and list_profiles, which also answer). Send the user to next_step. syncing: a source is connected but its first sync is still running, so figures are partial and not final.",
      +  "enum": [
      +    "nothing_connected",
      +    "syncing"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / properties / message / description
      Previous value: -"Plain-language explanation that accompanies `error` or a proposed change."New value: +"Plain-language explanation that accompanies `error`, `data_status` or a proposed change. Read it to the user."
    • addedOutput schema / properties / next_step
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "What the user should do about data_status.",
      +  "properties": {
      +    "action": {
      +      "enum": [
      +        "connect_a_source",
      +        "wait_for_first_sync"
      +      ],
      +      "type": "string"
      +    },
      +    "add_exchange_url": {
      +      "description": "App page to connect an exchange with a read-only API key.",
      +      "type": "string"
      +    },
      +    "add_wallet_url": {
      +      "description": "App page to add a wallet address to watch.",
      +      "type": "string"
      +    },
      +    "settings_url": {
      +      "type": "string"
      +    },
      +    "sync_status_url": {
      +      "description": "App page showing sync progress.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "action"
      +  ],
      +  "type": "object"
      +}
  2. Changed2 schema fields changed
    • changedInput schema / properties / period / description
      Previous value: -"Time window ending now: last_24h (today / since yesterday), last_7d, last_30d, last_90d, ytd (since 1 January UTC), or all. Omit for all time."New value: +"Time window ending now: last_24h, last_7d, last_30d, last_90d, ytd (since 1 January UTC) or all. Omit for all time."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": true,
      +  "properties": {
      +    "countsByType": {
      +      "additionalProperties": {
      +        "type": "number"
      +      },
      +      "description": "Events detected per type before the list was capped.",
      +      "type": "object"
      +    },
      +    "error": {
      +      "description": "Present ONLY when the call was refused instead of answered: upgrade_required (Pro plan needed), not_found, profile_not_found, profile_ambiguous, invalid_arguments, write_not_permitted. No data fields come with it; read `message` to the user rather than retrying the same call.",
      +      "type": "string"
      +    },
      +    "events": {
      +      "description": "Ranked, most significant first.",
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "amountUsd": {
      +            "description": "USD size, when the event is a valued flow.",
      +            "type": "string"
      +          },
      +          "asset": {
      +            "type": "string"
      +          },
      +          "day": {
      +            "description": "UTC day, YYYY-MM-DD.",
      +            "type": "string"
      +          },
      +          "detail": {
      +            "type": "string"
      +          },
      +          "magnitudePct": {
      +            "type": "string"
      +          },
      +          "severity": {
      +            "enum": [
      +              "info",
      +              "warn"
      +            ],
      +            "type": "string"
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "type": {
      +            "enum": [
      +              "flow",
      +              "allocation",
      +              "drawdown",
      +              "new_source",
      +              "reconciliation"
      +            ],
      +            "type": "string"
      +          },
      +          "venue": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "type",
      +          "severity",
      +          "day",
      +          "title",
      +          "detail"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "events_note": {
      +      "description": "Present only when `events` was cut; says how many rows were kept and which.",
      +      "type": "string"
      +    },
      +    "message": {
      +      "description": "Plain-language explanation that accompanies `error` or a proposed change.",
      +      "type": "string"
      +    },
      +    "notes": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "profile": {
      +      "additionalProperties": true,
      +      "description": "The portfolio these figures belong to (absent on list_profiles).",
      +      "properties": {
      +        "id": {
      +          "type": "string"
      +        },
      +        "name": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "id",
      +        "name"
      +      ],
      +      "type": "object"
      +    },
      +    "source_url": {
      +      "description": "Link to the page in the WhereItGoes app that shows this data.",
      +      "type": "string"
      +    },
      +    "stock_assets": {
      +      "additionalProperties": true,
      +      "description": "Present when the answer mentions Binance Stocks shares (EQ_<ticker>): they are US stocks, not crypto.",
      +      "properties": {
      +        "assets": {
      +          "items": {
      +            "additionalProperties": true,
      +            "properties": {
      +              "asset": {
      +                "type": "string"
      +              },
      +              "ticker": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "asset",
      +              "ticker"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "note": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "note",
      +        "assets"
      +      ],
      +      "type": "object"
      +    },
      +    "truncated": {
      +      "additionalProperties": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "from": {
      +            "description": "Day or bucket of the first kept row, for a dated series.",
      +            "type": "string"
      +          },
      +          "keep": {
      +            "description": "Which rows survived the cut.",
      +            "enum": [
      +              "first",
      +              "most_recent",
      +              "evenly_spaced",
      +              "best_and_worst"
      +            ],
      +            "type": "string"
      +          },
      +          "kept": {
      +            "description": "Rows returned.",
      +            "type": "number"
      +          },
      +          "to": {
      +            "description": "Day or bucket of the last kept row, for a dated series.",
      +            "type": "string"
      +          },
      +          "total": {
      +            "description": "Rows the full answer had.",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "total",
      +          "kept",
      +          "keep"
      +        ],
      +        "type": "object"
      +      },
      +      "description": "Present only when a list was longer than the 200-row cap and was cut: list field name -> {total, kept, keep, from, to}. A `<field>_note` string beside that list says the same in words. Never present a cut list as complete.",
      +      "type": "object"
      +    },
      +    "upgrade_url": {
      +      "description": "Where the user can upgrade, on an upgrade_required refusal.",
      +      "type": "string"
      +    },
      +    "window": {
      +      "additionalProperties": true,
      +      "description": "The time window these figures cover.",
      +      "properties": {
      +        "from": {
      +          "description": "Window start, epoch ms; null = from the first record.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "fromDay": {
      +          "description": "First UTC day covered, YYYY-MM-DD.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "to": {
      +          "description": "Window end, epoch ms; null = now.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "toDay": {
      +          "description": "Last UTC day covered, YYYY-MM-DD.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "from",
      +        "to",
      +        "fromDay",
      +        "toDay"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
  3. Changed2 schema fields changed
    • changedInput schema / properties / period / description
      Previous value: -"Time window. \"last_24h\" for today/since-yesterday, \"all\" for full history. Defaults to the endpoint's own default (usually last 30 days)."New value: +"Time window ending now: last_24h (today / since yesterday), last_7d, last_30d, last_90d, ytd (since 1 January UTC), or all. Omit for all time."
    • changedInput schema / properties / profile / description
      Previous value: -"Which portfolio to read, by name or id, for accounts that have more than one. Omit to use this connection's default. Call list_profiles first if the user names a portfolio you have not seen."New value: +"Which portfolio to read, for accounts with more than one: its id, or its name (exact, case-insensitive, e.g. \"Trading\"). Omit to read this connection's default portfolio; every answer names the portfolio it read in `profile`. An unknown or shared name returns profile_not_found or profile_ambiguous listing the real ones, and list_profiles shows them up front."
  4. First observed

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds real behavioral detail beyond them: results are ranked by significance, the list is capped, and `countsByType` reports everything detected before the cap — a truncation semantic an agent would otherwise miss. It stops short of describing error/empty behavior or the cap size itself.

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

Conciseness5/5

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

Front-loaded with the action and ranking rule, then scope guidance, then disambiguation from siblings — a natural decision order. Dense but every clause carries information; no filler and no repetition of the title.

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?

An output schema exists, so return shape needn't be spelled out, and annotations cover safety. The description still supplies the one thing structured fields can't: how results are ordered and truncated, and which sibling to use instead. Nothing needed to call it correctly 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 coverage is 100% and both parameters are fully documented in the schema, including the omission-means-all-time rule and profile resolution errors. The description's only parameter-adjacent addition is repeating that omitting `period` scans all time, which the schema already states. Baseline 3 applies since the schema does the work.

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 ('Detect what changed over `period` and rank it, most significant first') with the exact event categories returned and the USD-valued nature of each. It explicitly separates itself from get_performance and get_money_flows, so an agent can pick it without opening any 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?

Gives the intended scope ('Built for short windows such as last_7d or last_30d'), sample user phrasings to match ('what changed', 'anything unusual', 'notable moves this week'), and names two alternatives with the condition that selects each. Both when-to-use and when-to-use-something-else are covered.

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.