Skip to main content
Glama

Portfolio overview, holdings and recent change

get_portfolio
Read-onlyIdempotent

Read the portfolio as it stands now, in one of three views. overview: a whole-portfolio summary (live total value, allocation by asset, class, venue and chain, concentration, stablecoin and self-custody shares, 30-day true P&L, drift from the target allocation, what BTC and ETH did, and on a Pro plan risk, a 0-100 health score and ranked findings, which a free plan gets empty and named in gated); start here for open questions such as "how am I doing". holdings: every asset held with quantity, USD price and value, weight, 24h change, FIFO average cost, unrealized and realized P&L and a per-venue split, largest first, plus totalUsdt; use for "what do I hold", "my net worth". recent_change: 24h, 7d and 30d change in % and USD, lifetime net capital and cash in and out, and lastSyncAt. No view takes a window: holdings come from the last computed snapshot (asOf), recent_change is null until daily history exists, and overview's P&L is an end-of-day 30-day figure. For profit over another period use get_performance; for drawdown and volatility use get_risk. The answer is nested under the key named after the view. A new account may have nothing connected: the answer is then data_status "nothing_connected" with a link to add a wallet address or exchange in the app, not a $0 portfolio.

Input Schema

NameRequiredDescriptionDefault
viewYesWhich view to read: overview (whole-portfolio summary, start here); holdings (every asset held, largest first); recent_change (24h, 7d and 30d change and last sync). Each view takes only the arguments the description lists for it.
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
viewNoWhich view answered; its data is under the key of the same name.
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.
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).
holdingsNoPresent when view = "holdings".
overviewNoPresent when view = "overview".
next_stepNoWhat the user should do about data_status.
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.
upgrade_urlNoWhere the user can upgrade, on an upgrade_required refusal.
stock_assetsNoPresent when the answer mentions Binance Stocks shares (EQ_<ticker>): they are US stocks, not crypto.
recent_changeNoPresent when view = "recent_change".

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed12 schema fields changed
    • changedOutput schema / properties / holdings / properties / assets / items / properties / position / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "properties": {
      -      "apyPct": {
      -        "description": "Supply APY percent where the protocol publishes one; null = unknown.",
      -        "type": [
      -          "number",
      -          "null"
      -        ]
      -      },
      -      "chain": {
      -        "description": "Chain the receipt sits on.",
      -        "type": "string"
      -      },
      -      "contract": {
      -        "description": "The receipt token's contract address.",
      -        "type": "string"
      -      },
      -      "expiresAt": {
      -        "description": "Pendle maturity, epoch ms; past it the position is matured (redeemable).",
      -        "type": [
      -          "number",
      -          "null"
      -        ]
      -      },
      -      "folded": {
      -        "description": "true when \"Merge related tokens\" counted it inside its underlying's row (aUSDC inside USDC).",
      -        "type": "boolean"
      -      },
      -      "kind": {
      -        "description": "Receipt kind: aave-atoken, comet, erc4626, lst, pendle-pt/yt/lp/sy, stargate-lp, curve-lp, curve-gauge.",
      -        "type": "string"
      -      },
      -      "proofSource": {
      -        "description": "Which official registry proved the token.",
      -        "type": "string"
      -      },
      -      "protocol": {
      -        "description": "Protocol key, e.g. \"aave-v3\", \"morpho\", \"pendle\".",
      -        "type": "string"
      -      },
      -      "protocolLabel": {
      -        "description": "Protocol as a person reads it, e.g. \"Aave v3\".",
      -        "type": "string"
      -      },
      -      "qty": {
      -        "description": "Receipt quantity, native units.",
      -        "type": "string"
      -      },
      -      "receipt": {
      -        "description": "The receipt token's own ticker, e.g. \"aArbWETH\". Not what to call it.",
      -        "type": "string"
      -      },
      -      "summary": {
      -        "description": "How to say it: \"Aave v3 WETH supply on Arbitrum\".",
      -        "type": "string"
      -      },
      -      "underlying": {
      -        "description": "What the position is a claim on, e.g. \"WETH\"; Curve pools list their coins joined with \"/\".",
      -        "type": "string"
      -      },
      -      "underlyingQty": {
      -        "description": "Quantity of the underlying the receipt is worth (qty x protocol rate), in underlyingUnit.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "underlyingUnit": {
      -        "description": "Unit of underlyingQty.",
      -        "type": "string"
      -      },
      -      "valueUsdt": {
      -        "description": "USD value of this position.",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "protocol",
      -      "protocolLabel",
      -      "receipt",
      -      "contract",
      -      "underlying",
      -      "chain",
      -      "qty",
      -      "underlyingQty",
      -      "underlyingUnit",
      -      "valueUsdt",
      -      "apyPct",
      -      "proofSource",
      -      "folded"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "apyPct": {
      +        "description": "Supply APY percent where the protocol publishes one; null = unknown.",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "chain": {
      +        "description": "Chain the receipt sits on.",
      +        "type": "string"
      +      },
      +      "contract": {
      +        "description": "The receipt token's contract address.",
      +        "type": "string"
      +      },
      +      "expiresAt": {
      +        "description": "Pendle maturity, epoch ms; past it the position is matured (redeemable).",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "folded": {
      +        "description": "true when \"Merge related tokens\" counted it inside its underlying's row (aUSDC inside USDC).",
      +        "type": "boolean"
      +      },
      +      "kind": {
      +        "description": "Receipt kind: aave-atoken, comet, erc4626, lst, pendle-pt/yt/lp/sy, stargate-lp, curve-lp, curve-gauge, univ2-lp.",
      +        "type": "string"
      +      },
      +      "proofSource": {
      +        "description": "Which official registry proved the token.",
      +        "type": "string"
      +      },
      +      "protocol": {
      +        "description": "Protocol key, e.g. \"aave-v3\", \"morpho\", \"pendle\".",
      +        "type": "string"
      +      },
      +      "protocolLabel": {
      +        "description": "Protocol as a person reads it, e.g. \"Aave v3\".",
      +        "type": "string"
      +      },
      +      "qty": {
      +        "description": "Receipt quantity, native units.",
      +        "type": "string"
      +      },
      +      "receipt": {
      +        "description": "The receipt token's own ticker, e.g. \"aArbWETH\". Not what to call it.",
      +        "type": "string"
      +      },
      +      "summary": {
      +        "description": "How to say it: \"Aave v3 WETH supply on Arbitrum\".",
      +        "type": "string"
      +      },
      +      "underlying": {
      +        "description": "What the position is a claim on, e.g. \"WETH\"; Curve pools and Uniswap v2 pairs list their coins joined with \"/\".",
      +        "type": "string"
      +      },
      +      "underlyingQty": {
      +        "description": "Quantity of the underlying the receipt is worth (qty x protocol rate), in underlyingUnit.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "underlyingUnit": {
      +        "description": "Unit of underlyingQty.",
      +        "type": "string"
      +      },
      +      "valueUsdt": {
      +        "description": "USD value of this position.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "protocol",
      +      "protocolLabel",
      +      "receipt",
      +      "contract",
      +      "underlying",
      +      "chain",
      +      "qty",
      +      "underlyingQty",
      +      "underlyingUnit",
      +      "valueUsdt",
      +      "apyPct",
      +      "proofSource",
      +      "folded"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / holdings / properties / assets / items / properties / positions / items / properties / kind / description
      Previous value: -"Receipt kind: aave-atoken, comet, erc4626, lst, pendle-pt/yt/lp/sy, stargate-lp, curve-lp, curve-gauge."New value: +"Receipt kind: aave-atoken, comet, erc4626, lst, pendle-pt/yt/lp/sy, stargate-lp, curve-lp, curve-gauge, univ2-lp."
    • changedOutput schema / properties / holdings / properties / assets / items / properties / positions / items / properties / underlying / description
      Previous value: -"What the position is a claim on, e.g. \"WETH\"; Curve pools list their coins joined with \"/\"."New value: +"What the position is a claim on, e.g. \"WETH\"; Curve pools and Uniswap v2 pairs list their coins joined with \"/\"."
    • addedOutput schema / properties / holdings / properties / assets / items / properties / userTrusted
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "Present when the USER counted this token from the unverified list: valued at an estimate, not a verified price. Say so when you cite it.",
      +  "properties": {
      +    "chainId": {
      +      "type": "string"
      +    },
      +    "contract": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "chainId",
      +    "contract"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / holdings / properties / assets / items / properties / weightPct / description
      Previous value: -"Share of totalUsdt, percent."New value: +"Share of grossUsdt (the holdings), percent."
    • removedOutput schema / properties / holdings / properties / excludedDebt
      Removed value: -{
      -  "additionalProperties": true,
      -  "description": "Borrowings (Aave debt tokens) found on-chain and NOT counted in totalUsdt or any row. Present only when there are some.",
      -  "properties": {
      -    "count": {
      -      "description": "Proven debt tokens left out.",
      -      "type": "number"
      -    },
      -    "protocols": {
      -      "description": "Protocols borrowed from.",
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    },
      -    "valueUsdt": {
      -      "description": "What they are worth, USD, as a POSITIVE amount owed.",
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "count",
      -    "valueUsdt",
      -    "protocols"
      -  ],
      -  "type": "object"
      -}
    • addedOutput schema / properties / holdings / properties / grossUsdt
      Added value: +{
      +  "description": "What the holdings rows are worth, USD (sum of assets[].valueUsdt).",
      +  "type": "string"
      +}
    • addedOutput schema / properties / holdings / properties / liabilities
      Added value: +{
      +  "description": "Proven DeFi borrowings (Aave-family debt tokens), largest first. Never rows of assets; subtracted from totalUsdt.",
      +  "items": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "chain": {
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "aave-debt",
      +        "type": "string"
      +      },
      +      "protocol": {
      +        "type": "string"
      +      },
      +      "protocolLabel": {
      +        "type": "string"
      +      },
      +      "qty": {
      +        "description": "Amount owed in the underlying, interest included.",
      +        "type": "string"
      +      },
      +      "receipt": {
      +        "description": "The debt token ticker, e.g. \"variableDebtBasUSDC\".",
      +        "type": "string"
      +      },
      +      "summary": {
      +        "description": "The sentence to say, e.g. \"Aave v3 USDC borrowed on Base\".",
      +        "type": "string"
      +      },
      +      "underlying": {
      +        "description": "What is owed, e.g. \"USDC\".",
      +        "type": "string"
      +      },
      +      "valueUsdt": {
      +        "description": "Amount owed, USD, POSITIVE.",
      +        "type": "string"
      +      },
      +      "venue": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "protocol",
      +      "protocolLabel",
      +      "receipt",
      +      "underlying",
      +      "chain",
      +      "venue",
      +      "qty",
      +      "valueUsdt"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / holdings / properties / liabilitiesUsdt
      Added value: +{
      +  "description": "What is owed against them, USD, a POSITIVE amount (sum of liabilities[].valueUsdt).",
      +  "type": "string"
      +}
    • changedOutput schema / properties / holdings / properties / totalUsdt / description
      Previous value: -"Whole portfolio value in USD, decimal string with 2 decimals."New value: +"NET WORTH in USD: grossUsdt minus liabilitiesUsdt, decimal string with 2 decimals."
    • addedOutput schema / properties / holdings / properties / unverified
      Added value: +{
      +  "description": "UNVERIFIED wallet tokens the trust checks do not count: never holdings, never in totalUsdt. Tokens with no market are only counted in unverifiedSummary.",
      +  "items": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "chain": {
      +        "type": "string"
      +      },
      +      "choice": {
      +        "description": "The user's call: count (now also a row of assets, userTrusted), hide, or null.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "contract": {
      +        "type": "string"
      +      },
      +      "estimatedValueUsdt": {
      +        "description": "Best-effort USD ESTIMATE, only for a token with a real DEX pool deep enough to sell it. NOT in any total.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "liquidityUsd": {
      +        "description": "Reserve of the deepest qualifying pool, USD.",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "market": {
      +        "description": "liquid | no-market | unchecked.",
      +        "type": "string"
      +      },
      +      "priceSource": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "qty": {
      +        "description": "Quantity held, native units.",
      +        "type": "string"
      +      },
      +      "reason": {
      +        "description": "Why it is not counted: unlisted, thin-market, no-evidence, unpriced, receipt-unpriced.",
      +        "type": "string"
      +      },
      +      "symbol": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "symbol",
      +      "chain",
      +      "contract",
      +      "qty",
      +      "estimatedValueUsdt",
      +      "liquidityUsd",
      +      "market",
      +      "reason",
      +      "priceSource",
      +      "choice"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / holdings / properties / unverifiedSummary
      Added value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "countedCount": {
      +      "type": "number"
      +    },
      +    "countedUsdt": {
      +      "description": "USD of the ones the user counted (already inside totalUsdt).",
      +      "type": "string"
      +    },
      +    "estimatedTotalUsdt": {
      +      "description": "ABOUT figure: totalUsdt plus liquidUsdt. Say \"about\"; it is not the verified total.",
      +      "type": "string"
      +    },
      +    "hiddenCount": {
      +      "type": "number"
      +    },
      +    "liquidCount": {
      +      "type": "number"
      +    },
      +    "liquidUsdt": {
      +      "description": "Estimated USD of the liquid, undecided unverified tokens.",
      +      "type": "string"
      +    },
      +    "noMarketCount": {
      +      "type": "number"
      +    },
      +    "uncheckedCount": {
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "liquidCount",
      +    "liquidUsdt",
      +    "noMarketCount",
      +    "uncheckedCount",
      +    "countedCount",
      +    "countedUsdt",
      +    "hiddenCount",
      +    "estimatedTotalUsdt"
      +  ],
      +  "type": "object"
      +}
  2. Changed6 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"
      +}
    • addedOutput schema / properties / holdings / properties / assets / items / properties / position
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": true,
      +      "properties": {
      +        "apyPct": {
      +          "description": "Supply APY percent where the protocol publishes one; null = unknown.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "chain": {
      +          "description": "Chain the receipt sits on.",
      +          "type": "string"
      +        },
      +        "contract": {
      +          "description": "The receipt token's contract address.",
      +          "type": "string"
      +        },
      +        "expiresAt": {
      +          "description": "Pendle maturity, epoch ms; past it the position is matured (redeemable).",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "folded": {
      +          "description": "true when \"Merge related tokens\" counted it inside its underlying's row (aUSDC inside USDC).",
      +          "type": "boolean"
      +        },
      +        "kind": {
      +          "description": "Receipt kind: aave-atoken, comet, erc4626, lst, pendle-pt/yt/lp/sy, stargate-lp, curve-lp, curve-gauge.",
      +          "type": "string"
      +        },
      +        "proofSource": {
      +          "description": "Which official registry proved the token.",
      +          "type": "string"
      +        },
      +        "protocol": {
      +          "description": "Protocol key, e.g. \"aave-v3\", \"morpho\", \"pendle\".",
      +          "type": "string"
      +        },
      +        "protocolLabel": {
      +          "description": "Protocol as a person reads it, e.g. \"Aave v3\".",
      +          "type": "string"
      +        },
      +        "qty": {
      +          "description": "Receipt quantity, native units.",
      +          "type": "string"
      +        },
      +        "receipt": {
      +          "description": "The receipt token's own ticker, e.g. \"aArbWETH\". Not what to call it.",
      +          "type": "string"
      +        },
      +        "summary": {
      +          "description": "How to say it: \"Aave v3 WETH supply on Arbitrum\".",
      +          "type": "string"
      +        },
      +        "underlying": {
      +          "description": "What the position is a claim on, e.g. \"WETH\"; Curve pools list their coins joined with \"/\".",
      +          "type": "string"
      +        },
      +        "underlyingQty": {
      +          "description": "Quantity of the underlying the receipt is worth (qty x protocol rate), in underlyingUnit.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "underlyingUnit": {
      +          "description": "Unit of underlyingQty.",
      +          "type": "string"
      +        },
      +        "valueUsdt": {
      +          "description": "USD value of this position.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "protocol",
      +        "protocolLabel",
      +        "receipt",
      +        "contract",
      +        "underlying",
      +        "chain",
      +        "qty",
      +        "underlyingQty",
      +        "underlyingUnit",
      +        "valueUsdt",
      +        "apyPct",
      +        "proofSource",
      +        "folded"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Present when the row IS a DeFi position (a receipt token such as aArbWETH): name it by position.summary, never by the receipt ticker."
      +}
    • addedOutput schema / properties / holdings / properties / assets / items / properties / positions
      Added value: +{
      +  "description": "Every proven DeFi receipt under this row, including ones folded into it (USDC carrying aUSDC).",
      +  "items": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "apyPct": {
      +        "description": "Supply APY percent where the protocol publishes one; null = unknown.",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "chain": {
      +        "description": "Chain the receipt sits on.",
      +        "type": "string"
      +      },
      +      "contract": {
      +        "description": "The receipt token's contract address.",
      +        "type": "string"
      +      },
      +      "expiresAt": {
      +        "description": "Pendle maturity, epoch ms; past it the position is matured (redeemable).",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "folded": {
      +        "description": "true when \"Merge related tokens\" counted it inside its underlying's row (aUSDC inside USDC).",
      +        "type": "boolean"
      +      },
      +      "kind": {
      +        "description": "Receipt kind: aave-atoken, comet, erc4626, lst, pendle-pt/yt/lp/sy, stargate-lp, curve-lp, curve-gauge.",
      +        "type": "string"
      +      },
      +      "proofSource": {
      +        "description": "Which official registry proved the token.",
      +        "type": "string"
      +      },
      +      "protocol": {
      +        "description": "Protocol key, e.g. \"aave-v3\", \"morpho\", \"pendle\".",
      +        "type": "string"
      +      },
      +      "protocolLabel": {
      +        "description": "Protocol as a person reads it, e.g. \"Aave v3\".",
      +        "type": "string"
      +      },
      +      "qty": {
      +        "description": "Receipt quantity, native units.",
      +        "type": "string"
      +      },
      +      "receipt": {
      +        "description": "The receipt token's own ticker, e.g. \"aArbWETH\". Not what to call it.",
      +        "type": "string"
      +      },
      +      "summary": {
      +        "description": "How to say it: \"Aave v3 WETH supply on Arbitrum\".",
      +        "type": "string"
      +      },
      +      "underlying": {
      +        "description": "What the position is a claim on, e.g. \"WETH\"; Curve pools list their coins joined with \"/\".",
      +        "type": "string"
      +      },
      +      "underlyingQty": {
      +        "description": "Quantity of the underlying the receipt is worth (qty x protocol rate), in underlyingUnit.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "underlyingUnit": {
      +        "description": "Unit of underlyingQty.",
      +        "type": "string"
      +      },
      +      "valueUsdt": {
      +        "description": "USD value of this position.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "protocol",
      +      "protocolLabel",
      +      "receipt",
      +      "contract",
      +      "underlying",
      +      "chain",
      +      "qty",
      +      "underlyingQty",
      +      "underlyingUnit",
      +      "valueUsdt",
      +      "apyPct",
      +      "proofSource",
      +      "folded"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / holdings / properties / excludedDebt
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "Borrowings (Aave debt tokens) found on-chain and NOT counted in totalUsdt or any row. Present only when there are some.",
      +  "properties": {
      +    "count": {
      +      "description": "Proven debt tokens left out.",
      +      "type": "number"
      +    },
      +    "protocols": {
      +      "description": "Protocols borrowed from.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "valueUsdt": {
      +      "description": "What they are worth, USD, as a POSITIVE amount owed.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "count",
      +    "valueUsdt",
      +    "protocols"
      +  ],
      +  "type": "object"
      +}
    • 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"
      +}
  3. Changed3 schema fields changed
    • addedInput schema / properties / view
      Added value: +{
      +  "description": "Which view to read: overview (whole-portfolio summary, start here); holdings (every asset held, largest first); recent_change (24h, 7d and 30d change and last sync). Each view takes only the arguments the description lists for it.",
      +  "enum": [
      +    "overview",
      +    "holdings",
      +    "recent_change"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / required
      Added value: +[
      +  "view"
      +]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": true,
      +  "properties": {
      +    "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"
      +    },
      +    "holdings": {
      +      "additionalProperties": true,
      +      "description": "Present when view = \"holdings\".",
      +      "properties": {
      +        "asOf": {
      +          "description": "When the holdings snapshot was computed, epoch ms (not a live quote).",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "assets": {
      +          "description": "One row per asset, largest USD value first.",
      +          "items": {
      +            "additionalProperties": true,
      +            "properties": {
      +              "asset": {
      +                "description": "Asset key, e.g. \"BTC\".",
      +                "type": "string"
      +              },
      +              "byVenue": {
      +                "description": "Where the asset is held.",
      +                "items": {
      +                  "additionalProperties": true,
      +                  "properties": {
      +                    "displayName": {
      +                      "type": "string"
      +                    },
      +                    "qty": {
      +                      "description": "Quantity at this venue, native units.",
      +                      "type": "string"
      +                    },
      +                    "type": {
      +                      "type": "string"
      +                    },
      +                    "valueUsdt": {
      +                      "description": "USD value at this venue.",
      +                      "type": [
      +                        "string",
      +                        "null"
      +                      ]
      +                    },
      +                    "venue": {
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "venue",
      +                    "displayName",
      +                    "type",
      +                    "qty",
      +                    "valueUsdt"
      +                  ],
      +                  "type": "object"
      +                },
      +                "type": "array"
      +              },
      +              "fifoAvgCost": {
      +                "description": "FIFO average cost per unit, USD.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "priceChangePct24h": {
      +                "description": "Signed 24h price change, percent.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "priceUsdt": {
      +                "description": "USD price used for the valuation.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "realizedPnlUsdt": {
      +                "description": "Realized FIFO P&L to date, USD.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "sector": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "total": {
      +                "description": "Quantity held across every venue, native units.",
      +                "type": "string"
      +              },
      +              "trades": {
      +                "description": "Trades recorded for the asset.",
      +                "type": "number"
      +              },
      +              "unknownCostQty": {
      +                "description": "Quantity with no known cost basis (excluded from avg cost and unrealized).",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "unrealizedAbs": {
      +                "description": "Unrealized P&L on the open quantity, USD.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "unrealizedPct": {
      +                "description": "Unrealized P&L, percent.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "valueChange24hUsdt": {
      +                "description": "USD value change over 24h.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "valueUsdt": {
      +                "description": "USD value; null when unpriced.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "weightPct": {
      +                "description": "Share of totalUsdt, percent.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              }
      +            },
      +            "required": [
      +              "asset",
      +              "total",
      +              "priceUsdt",
      +              "priceChangePct24h",
      +              "valueUsdt",
      +              "valueChange24hUsdt",
      +              "weightPct",
      +              "fifoAvgCost",
      +              "unknownCostQty",
      +              "unrealizedAbs",
      +              "unrealizedPct",
      +              "realizedPnlUsdt",
      +              "trades",
      +              "byVenue"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "assets_note": {
      +          "description": "Present only when `assets` was cut; says how many rows were kept and which.",
      +          "type": "string"
      +        },
      +        "regrouping": {
      +          "description": "true while a recompute for a changed grouping setting is in flight.",
      +          "type": "boolean"
      +        },
      +        "totalUsdt": {
      +          "description": "Whole portfolio value in USD, decimal string with 2 decimals.",
      +          "type": "string"
      +        },
      +        "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"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Plain-language explanation that accompanies `error` or a proposed change.",
      +      "type": "string"
      +    },
      +    "overview": {
      +      "additionalProperties": true,
      +      "description": "Present when view = \"overview\".",
      +      "properties": {
      +        "allocation": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "byAsset": {
      +              "description": "Largest first, at most 12; the rest are counted in `truncated.assets`.",
      +              "items": {
      +                "additionalProperties": true,
      +                "properties": {
      +                  "asset": {
      +                    "type": "string"
      +                  },
      +                  "name": {
      +                    "type": "string"
      +                  },
      +                  "pct": {
      +                    "description": "Share of total value, percent.",
      +                    "type": "number"
      +                  },
      +                  "priceChangePct24h": {
      +                    "description": "24h price change, percent.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "valueUsd": {
      +                    "description": "USD value.",
      +                    "type": "number"
      +                  }
      +                },
      +                "required": [
      +                  "asset",
      +                  "name",
      +                  "pct",
      +                  "valueUsd",
      +                  "priceChangePct24h"
      +                ],
      +                "type": "object"
      +              },
      +              "type": "array"
      +            },
      +            "byChain": {
      +              "items": {
      +                "additionalProperties": true,
      +                "properties": {
      +                  "name": {
      +                    "type": "string"
      +                  },
      +                  "pct": {
      +                    "type": "number"
      +                  },
      +                  "valueUsd": {
      +                    "type": "number"
      +                  }
      +                },
      +                "required": [
      +                  "name",
      +                  "pct",
      +                  "valueUsd"
      +                ],
      +                "type": "object"
      +              },
      +              "type": "array"
      +            },
      +            "byClass": {
      +              "items": {
      +                "additionalProperties": true,
      +                "properties": {
      +                  "name": {
      +                    "type": "string"
      +                  },
      +                  "pct": {
      +                    "type": "number"
      +                  },
      +                  "valueUsd": {
      +                    "type": "number"
      +                  }
      +                },
      +                "required": [
      +                  "name",
      +                  "pct",
      +                  "valueUsd"
      +                ],
      +                "type": "object"
      +              },
      +              "type": "array"
      +            },
      +            "byVenue": {
      +              "items": {
      +                "additionalProperties": true,
      +                "properties": {
      +                  "name": {
      +                    "type": "string"
      +                  },
      +                  "pct": {
      +                    "type": "number"
      +                  },
      +                  "valueUsd": {
      +                    "type": "number"
      +                  }
      +                },
      +                "required": [
      +                  "name",
      +                  "pct",
      +                  "valueUsd"
      +                ],
      +                "type": "object"
      +              },
      +              "type": "array"
      +            },
      +            "truncated": {
      +              "additionalProperties": true,
      +              "description": "How many assets, venues and chains were left out of the lists above.",
      +              "properties": {
      +                "assets": {
      +                  "type": "number"
      +                },
      +                "chains": {
      +                  "type": "number"
      +                },
      +                "venues": {
      +                  "type": "number"
      +                }
      +              },
      +              "required": [
      +                "assets",
      +                "venues",
      +                "chains"
      +              ],
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "byAsset",
      +            "byClass",
      +            "byVenue",
      +            "byChain",
      +            "truncated"
      +          ],
      +          "type": "object"
      +        },
      +        "asOf": {
      +          "description": "When this overview was assembled, epoch ms.",
      +          "type": "number"
      +        },
      +        "candidates": {
      +          "description": "Ranked findings, most severe first. Pro only: empty on a free plan.",
      +          "items": {
      +            "additionalProperties": true,
      +            "properties": {
      +              "ruleId": {
      +                "type": "string"
      +              },
      +              "severity": {
      +                "type": "string"
      +              },
      +              "statement": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "ruleId",
      +              "severity",
      +              "statement"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "concentration": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "hhi": {
      +              "description": "Herfindahl index of the weights, 0-10000.",
      +              "type": "number"
      +            },
      +            "top1Pct": {
      +              "type": "number"
      +            },
      +            "top3Pct": {
      +              "type": "number"
      +            },
      +            "topName": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "hhi",
      +            "top1Pct",
      +            "top3Pct",
      +            "topName"
      +          ],
      +          "type": "object"
      +        },
      +        "degraded": {
      +          "description": "Blocks that failed to compute this time.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "flags": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "cexPct": {
      +              "description": "Share held on exchanges, percent.",
      +              "type": "number"
      +            },
      +            "dustCount": {
      +              "type": "number"
      +            },
      +            "selfCustodyPct": {
      +              "description": "Share held in self-custody wallets, percent.",
      +              "type": "number"
      +            },
      +            "stablecoinPct": {
      +              "type": "number"
      +            },
      +            "stockPct": {
      +              "type": "number"
      +            },
      +            "unpricedCount": {
      +              "type": "number"
      +            },
      +            "volatilePct": {
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "stablecoinPct",
      +            "volatilePct",
      +            "stockPct",
      +            "cexPct",
      +            "selfCustodyPct",
      +            "dustCount",
      +            "unpricedCount"
      +          ],
      +          "type": "object"
      +        },
      +        "gated": {
      +          "description": "Blocks withheld because the account is not on a Pro plan.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "market": {
      +          "anyOf": [
      +            {
      +              "additionalProperties": true,
      +              "properties": {
      +                "windowDays": {
      +                  "type": "number"
      +                }
      +              },
      +              "required": [
      +                "windowDays"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "What BTC and ETH did over the same window, plus the fear and greed reading."
      +        },
      +        "performance": {
      +          "anyOf": [
      +            {
      +              "additionalProperties": true,
      +              "properties": {
      +                "feesUsd": {
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "incomeUsd": {
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "netFlowsUsd": {
      +                  "description": "Deposits minus withdrawals over the 30 days, USD.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "realizedUsd": {
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "topGainers": {
      +                  "items": {
      +                    "additionalProperties": true,
      +                    "properties": {
      +                      "asset": {
      +                        "type": "string"
      +                      },
      +                      "pnlUsd": {
      +                        "type": "number"
      +                      }
      +                    },
      +                    "required": [
      +                      "asset",
      +                      "pnlUsd"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  "type": "array"
      +                },
      +                "topLosers": {
      +                  "items": {
      +                    "additionalProperties": true,
      +                    "properties": {
      +                      "asset": {
      +                        "type": "string"
      +                      },
      +                      "pnlUsd": {
      +                        "type": "number"
      +                      }
      +                    },
      +                    "required": [
      +                      "asset",
      +                      "pnlUsd"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  "type": "array"
      +                },
      +                "truePnlPct": {
      +                  "description": "Same as a percent.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "truePnlUsd": {
      +                  "description": "Profit over the 30 days with deposits and withdrawals stripped out, USD.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "unrealizedUsd": {
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "valuedThroughDay": {
      +                  "description": "UTC day the figures are valued through (end-of-day, not live).",
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "required": [
      +                "valuedThroughDay",
      +                "truePnlUsd",
      +                "truePnlPct",
      +                "netFlowsUsd",
      +                "realizedUsd",
      +                "unrealizedUsd",
      +                "incomeUsd",
      +                "feesUsd",
      +                "topGainers",
      +                "topLosers"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "period": {
      +          "additionalProperties": true,
      +          "description": "The fixed 30-day window the performance and market blocks cover.",
      +          "properties": {
      +            "from": {
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            },
      +            "label": {
      +              "type": "string"
      +            },
      +            "to": {
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "from",
      +            "to"
      +          ],
      +          "type": "object"
      +        },
      +        "risk": {
      +          "anyOf": [
      +            {
      +              "additionalProperties": true,
      +              "properties": {
      +                "annualizedVolPct": {
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "maxDrawdownPct": {
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "sharpe": {
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "required": [
      +                "annualizedVolPct",
      +                "maxDrawdownPct",
      +                "sharpe"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Pro only: null on a free plan (see `gated`)."
      +        },
      +        "score": {
      +          "anyOf": [
      +            {
      +              "additionalProperties": true,
      +              "properties": {
      +                "band": {
      +                  "type": "string"
      +                },
      +                "score": {
      +                  "description": "0-100.",
      +                  "type": "number"
      +                }
      +              },
      +              "required": [
      +                "score",
      +                "band"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Pro only: null on a free plan (see `gated`)."
      +        },
      +        "targets": {
      +          "anyOf": [
      +            {
      +              "additionalProperties": true,
      +              "properties": {
      +                "dim": {
      +                  "type": "string"
      +                },
      +                "rows": {
      +                  "items": {
      +                    "additionalProperties": true,
      +                    "properties": {
      +                      "actualPct": {
      +                        "type": "number"
      +                      },
      +                      "bandPct": {
      +                        "type": "number"
      +                      },
      +                      "deltaUsd": {
      +                        "description": "Signed USD to reach target: + sell this much, - buy this much.",
      +                        "type": "number"
      +                      },
      +                      "driftPct": {
      +                        "description": "Signed percentage points: + overweight, - underweight.",
      +                        "type": "number"
      +                      },
      +                      "inBand": {
      +                        "type": "boolean"
      +                      },
      +                      "subject": {
      +                        "type": "string"
      +                      },
      +                      "targetPct": {
      +                        "type": "number"
      +                      }
      +                    },
      +                    "required": [
      +                      "subject",
      +                      "targetPct",
      +                      "actualPct",
      +                      "driftPct",
      +                      "bandPct",
      +                      "inBand",
      +                      "deltaUsd"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  "type": "array"
      +                }
      +              },
      +              "required": [
      +                "dim",
      +                "rows"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Drift from the target allocation; null when no target is set."
      +        },
      +        "totals": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "assetCount": {
      +              "description": "Number of priced holdings.",
      +              "type": "number"
      +            },
      +            "valueUsd": {
      +              "description": "Live total portfolio value, USD.",
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "valueUsd",
      +            "assetCount"
      +          ],
      +          "type": "object"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "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"
      +    },
      +    "recent_change": {
      +      "additionalProperties": true,
      +      "description": "Present when view = \"recent_change\".",
      +      "properties": {
      +        "cashDeployedUsdt": {
      +          "description": "Lifetime fiat cash put in, USD.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "cashWithdrawnUsdt": {
      +          "description": "Lifetime fiat cash taken out, USD.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "change24hPct": {
      +          "description": "Portfolio value change over 24h, percent; null until daily history exists.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "change24hUsdt": {
      +          "description": "Same in USD.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "change30dPct": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "change30dUsdt": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "change7dPct": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "change7dUsdt": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "costBasisUsdt": {
      +          "description": "Cost basis of current holdings, USD.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "lastSyncAt": {
      +          "description": "When the last sync finished, epoch ms.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "lastSyncMode": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "netCapitalUsdt": {
      +          "description": "Lifetime net capital put in, USD.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "totalMovements": {
      +          "description": "Deposits, withdrawals, transfers and income on record.",
      +          "type": "number"
      +        },
      +        "totalTrades": {
      +          "description": "Trades on record.",
      +          "type": "number"
      +        }
      +      },
      +      "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"
      +    },
      +    "upgrade_url": {
      +      "description": "Where the user can upgrade, on an upgrade_required refusal.",
      +      "type": "string"
      +    },
      +    "view": {
      +      "description": "Which view answered; its data is under the key of the same name.",
      +      "enum": [
      +        "overview",
      +        "holdings",
      +        "recent_change"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  4. Changed1 schema field changed
    • 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."
  5. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the readOnly/idempotent annotations: it discloses that no view accepts a time window, that holdings come from the last computed snapshot with `asOf`, that recent_change is null until daily history exists, that overview P&L is an end-of-day 30-day figure, that Pro-plan sections come back empty and named in `gated`, and that a fresh account returns data_status "nothing_connected" rather than a $0 portfolio.

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 core action and the three view choices before caveats and alternatives. The per-view field enumerations are dense (e.g. the overview run-on list), but each carries selection-relevant information, so little is 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?

For a multi-view read tool with an output schema, this covers everything an agent needs: when to pick each view, the snapshot/staleness semantics, plan gating, the nesting key, and the empty-account case with its remedy. No meaningful gaps remain.

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 schema already documents both parameters, but the description adds substantive meaning by detailing what each `view` value actually yields and by clarifying the no-window constraint. Profile semantics are left mostly to the schema's already thorough description.

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 ("Read the portfolio as it stands now") and enumerates all three views with the exact content each returns. It is clearly distinguishable from siblings like get_performance and get_risk, which are named as the tools for other time windows and risk metrics.

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 explicit routing cues: "start here for open questions such as 'how am I doing'" for overview, "use for 'what do I hold', 'my net worth'" for holdings, and explicit exclusions — "For profit over another period use get_performance; for drawdown and volatility use get_risk." It also points to list_profiles for discovering profile names.

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.