Folionomiq
Server Details
Measures a portfolio from price history: independent bets, what funds own, past crises. No advice.
- Status
- Healthy
- Uptime
- 100.0% over 42 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- Folionomiq
TDQS
Scored across 22 tools
Most tools have a distinct analytical purpose, and descriptions explicitly point to neighboring tools when the boundary might blur. However, several portfolio-level outputs overlap conceptually (measure_portfolio, portfolio_report, plain_findings, health_axes), and change-oriented tools (test_a_change, check_before_you_buy, sweep_holding) require careful reading to choose correctly.
All tool names use lowercase snake_case, so casing is consistent throughout. But the set mixes imperative verb-led names (search_symbols, validate_symbols, compare_portfolios) with noun phrases (asset_info, past_crises, health_axes), so the semantic pattern is only partly predictable.
At 22 tools the server is heavy, sitting in the borderline 16-25 range. The broad portfolio-analytics domain justifies many of them, but the surface still feels large enough that consolidation could improve usability.
The surface covers symbol discovery and validation, asset lookup, pricing, full and partial portfolio measurement, risk structure, return history, crisis replay, reverse stress, currency effects, factor exposure, look-through, withdrawals, monthly investing, change testing, comparison, and reporting. For the stated analytical domain there are no obvious dead ends; it intentionally excludes recommendations, predictions, and tax.
Available Tools
22 toolsasset_infoOne fund or share: what it is and holdsARead-onlyIdempotentInspect
One fund or share on its own: name, type, exchange, yearly cost when published, measured return, volatility and worst fall, and for a fund its largest holdings and sectors. Typical questions: 'What is EQQQ.DE?'; 'Tell me about this ETF before I add it.'; 'What's inside VXUS?'. Instead: for a whole portfolio's companies, look_through. Non-US listings need the exchange suffix (VWCE.DE, IWDA.AS); search_symbols finds it. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | One ticker, as the exchange lists it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Where the prices came from and what was missing or repaired. |
| fund | No | For a fund: is_fund, holdings ([symbol, weight] pairs), sectors. |
| meta | No | name, type, category, expense_ratio, currency, exchange, fund_family, total_assets, sector, isin. |
| stats | No | last, ret_1y, vol, max_drawdown, years, start, end. |
| ticker | Yes | Ticker. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so safety is covered. The description still adds useful behavioral context beyond that: the exchange-suffix requirement for non-US symbols and a scope disclaimer about advice/prediction/tax. It does not say what happens on an invalid or ambiguous ticker, which is the one 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the resource and its returned fields, then examples, then the sibling alternative, then constraints — a sensible priority order. Slightly over-packed with example questions and a metric list, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not enumerate return values, and the read-only annotations cover the safety profile. Combined with routing to search_symbols for suffix discovery, an agent has what it needs to call this correctly; only failure handling for unknown tickers is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and there is a single parameter, so the baseline is satisfied by the schema alone. The description nevertheless adds real operational meaning: single-ticker only, and the exchange-suffix convention illustrated with VWCE.DE and IWDA.AS, which is more actionable than 'as the exchange lists it'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: returns profile data for a single fund or share, enumerating the exact fields (name, type, exchange, cost, return, volatility, worst fall, top holdings and sectors). It explicitly separates itself from look_through (whole portfolio) and search_symbols (ticker discovery), so an agent can route between siblings 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggering questions ('What is EQQQ.DE?', 'What's inside VXUS?'), names the alternative for the portfolio-level case (look_through), and states the prerequisite that non-US tickers need an exchange suffix with search_symbols as the resolver. It also sets explicit exclusions: no recommendations, predictions, or tax calculations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_before_you_buyCheck before you buyARead-onlyIdempotentInspect
Before adding one new holding to a portfolio: how much of it is already owned through the current funds, whether it adds an independent bet, what past crises would have done with it, and a decision sheet with three columns: now, the same money kept as cash, the money in the new holding. Typical questions: 'I'm thinking of adding $10,000 of QQQ with new cash: what changes versus keeping it in cash?'; 'Check before I buy SCHD.'; 'Test adding an ETF to my portfolio.'. Instead: for selling, reweighting or several changes at once, test_a_change. The 'after' portfolio was never held; it never says whether to buy. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| add | Yes | The one ticker being considered. | |
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| units | No | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. | |
| amount | Yes | How much of it, in the same units as `holdings` (money when holdings are amounts). | |
| holdings | Yes | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| add | No | The ticker considered. |
| bets | No | Independent bets before and after. |
| data | No | Where the prices came from and what was missing or repaired. |
| _fence | Yes | What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result. |
| amount | No | How much of it. |
| crises | No | Per past crisis: fall before and after, as fractions. |
| window | No | The shared price window. |
| overlap | No | How much of it is already owned: kind (fund, stock, opaque); for a fund already_share (share of its money in companies already held), seen_share, shared ([company, weight in it, weight in the portfolio]), source, as_of; for a stock already (share of the portfolio) and via. |
| top_risk | No | The holding carrying the most risk, and its share, before and after. |
| total_after | No | Portfolio size after. |
| total_before | No | Portfolio size before. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds real behavioral context: the 'after' portfolio is hypothetical, the output is a three-column decision sheet, and the tool does not recommend, predict, or calculate tax. Missing only practical traits like cost/latency or data freshness, which is why it is not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then the typical questions, then the exclusion, then the limits — a sensible information hierarchy. Slightly dense with three quoted example questions, but each sentence carries routing or scoping value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex (nested holdings, unit inference), yet the description plus the 100%-covered schema and an existing output schema cover everything needed to call it and interpret the answer. Limits (no advice, no tax, hypothetical after-portfolio) close the remaining ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already explains the units inference rule, ticker formats (including CASH.USD), and the amount's unit alignment. The description echoes the general 'holdings + add + amount' shape but adds no parameter detail beyond what the schema documents, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: adding one new holding to an existing portfolio, reporting overlap, independence, crisis behavior, and a now-vs-cash-vs-new-holding decision sheet. It explicitly separates itself from test_a_change, so an agent can route between the two without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the triggering condition ('before adding one new holding'), concrete user phrasings as examples, and an explicit exclusion with the correct alternative ('for selling, reweighting or several changes at once, test_a_change'). It also bounds the tool's role: it never says whether to buy.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_portfoliosCompare portfolios side by sideARead-onlyIdempotentInspect
Two to eight separate portfolios on one shared window of prices. In: {label: {ticker: weight}}. Out: growth, volatility, worst fall, and how each moved against the others. Typical questions: 'Compare 60/40 with an all-world fund.'; 'Which of these three mixes fell less in 2022?'; 'Put my portfolio next to the S&P 500.'. Instead: for one portfolio before and after a change, test_a_change or check_before_you_buy. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| portfolios | Yes | Two to eight portfolios, {label: {ticker: weight}}. Labels are shortened to letters and digits. |
Output Schema
| Name | Required | Description |
|---|---|---|
| end | No | Shared window end. |
| data | No | Where the prices came from and what was missing or repaired. |
| start | No | Shared window start. |
| _fence | Yes | What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result. |
| series | No | Per portfolio label: the growth path over the window. |
| metrics | No | Per portfolio label: growth, volatility, worst fall and related figures. |
| correlation | No | Per pair of labels: how the portfolios moved together. |
TDQS
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 genuine context beyond that: the 2-8 portfolio limit, the input shape, the measures returned including cross-portfolio co-movement, and an explicit negative capability boundary. Minor gap: nothing about how a window or date range is chosen, though no such parameter exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with input and output contract, then alternatives, then exclusions – a sensible order with little waste. The inline 'In: {label: {ticker: weight}}' duplicates the schema slightly and reads awkwardly, but overall it is tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, yet the description still names the four headline measures and the cross-portfolio comparison. Input format, cardinality limit, use cases and exclusions are all covered for a tool with nested object parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters (base currency default USD, portfolios map) are documented in the schema, including label shortening. The description restates the {label: {ticker: weight}} shape and the 2-8 limit but adds no syntax or weighting semantics beyond what the schema already says, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: two to eight portfolios measured on one shared window of prices. That scope, plus the output measures listed, makes it immediately distinguishable from single-portfolio siblings like measure_portfolio.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete example questions that select this tool, and explicitly routes the adjacent case (one portfolio before/after a change) to test_a_change or check_before_you_buy. Also states what the tool does not do: no recommendations, predictions or tax.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
currency_effectWhat exchange rates did to itARead-onlyIdempotentInspect
For a portfolio held in one currency but priced partly in others: how much is outside the base currency, and what exchange rates added to growth, volatility and the worst fall, against the same holdings currency-hedged. Typical questions: 'I'm in euros but hold US funds: what did the dollar do to me?'; 'How much currency risk is in this?'; 'Hedged or not, what was the difference?'. Limits: Only when some holdings are priced in another currency than the holder's. base must be set to the holder's currency. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| units | No | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. | |
| holdings | Yes | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| base | No | Base currency. |
| data | No | Where the prices came from and what was missing or repaired. |
| _fence | Yes | What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result. |
| hedged | No | The same with the currency moves removed. |
| headline | No | One sentence summary. |
| unhedged | No | Growth, volatility and worst fall as held. |
| by_currency | No | [currency, share of the money] pairs, by listing currency. |
| limitations | No | What this cannot show (listing currency is not earning currency). |
| share_of_vol | No | Share of the volatility that comes from exchange rates. |
| foreign_share | No | Share of the money priced outside the base currency. |
| cagr_from_currency | No | Growth per year added (or removed) by exchange rates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/idempotent annotations, it discloses that the tool does not recommend, predict or calculate tax, and that base must match the holder's currency. It does not describe return format or error behavior, but with an output schema and strong annotations, this adds useful context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then typical questions, then limits. It is appropriately sized, though the illustrative questions could be seen as slightly verbose; every part still adds clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (nested holdings, currency mismatch, hedged comparison) and the presence of a full output schema and annotations, the description is complete enough for an agent to decide when and how to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds a meaningful constraint not in the schema: base must be set to the holder's currency. It otherwise relies on the schema for units and holdings format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific analytical purpose: decomposing currency effects on growth, volatility and worst fall for holdings partly outside the base currency, and comparing against a hedged version. It is clear what the tool does, but does not explicitly differentiate itself from sibling portfolio analysis tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides concrete typical questions ('I'm in euros but hold US funds...') and a clear limit: only applies when some holdings are priced in another currency, and base must be the holder's currency. However, no alternative tools are named for cases where the limit is not met.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
factor_exposureSensitivity to common return patternsARead-onlyIdempotentInspect
How a portfolio's daily moves line up with four common patterns: the market, small versus large, value versus growth, momentum. Out: each sensitivity, whether it can be told from zero, and how much of the movement the four explain. Typical questions: 'Am I a growth investor without knowing it?'; 'What style is my portfolio really exposed to?'; 'Is this tilted to small caps?'. Instead: for the number of independent bets, portfolio_structure. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| units | No | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. | |
| holdings | Yes | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Where the prices came from and what was missing or repaired. |
| betas | No | Sensitivity per factor: mkt_rf (market), smb (small minus big), hml (value minus growth), mom (momentum). |
| model | No | Factor model used. |
| years | No | Years of history used. |
| _fence | Yes | What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result. |
| t_stats | No | t-statistic per factor; below about 2 in size, not distinguishable from zero. |
| poor_fit | No | True when the factors explain little. |
| frequency | No | Data frequency. |
| r_squared | No | Share of the daily movement the factors explain, 0 to 1. |
| fit_caveat | No | Why the fit is poor, when it is. |
| alpha_annual | No | Return not explained by the factors, per year (estimated, not a skill measure). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, idempotent, non-destructive operation. The description adds useful behavioral context by describing the outputs (sensitivities, significance versus zero, explanatory power) and stating that it does not recommend, predict, or calculate tax.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core measurement and then adds examples, an alternative tool, and limitations. It is somewhat longer than strictly necessary due to three sample questions, but each part remains relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to explain return values in full, and it already summarizes the key outputs and limitations. It could say more about the estimation window or method, but overall it is complete enough for correct tool selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 base, units, and holdings in detail. The description does not add parameter-specific semantics beyond referring generally to portfolio daily moves, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states precisely what the tool measures: a portfolio's daily return sensitivity to four named common patterns (market, size, value, momentum). It also clearly distinguishes this from the sibling portfolio_structure tool, which handles independent-bet counts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides concrete typical questions that indicate when to use it, such as checking unintended growth or small-cap tilts. It also explicitly names an alternative, portfolio_structure, and the condition under which that alternative is more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_axesThe portfolio along separate axesARead-onlyIdempotentInspect
One portfolio read along three separate questions: what its risk is built from, how it behaved when markets broke, and what it returned for the risk taken, each with its own figures and no overall score. Typical questions: 'Is anything off in how my portfolio is built?'; 'How did this hold up in bad markets, and was the return worth the swings?'; 'Check the construction of this portfolio.'. Instead: for the full measurement, measure_portfolio. An axis without enough history comes back without a reading. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| units | No | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. | |
| holdings | Yes | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| axes | No | Per axis: key, label, the question it answers, band, kind, drivers (each with label, value, unit and a plain reading). |
| data | No | Where the prices came from and what was missing or repaired. |
| kinds | No | What each kind of figure means (observed, replayed, estimated…). |
| _fence | Yes | What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result. |
| inputs | No | What was measured: holdings, window, what was left out. |
| headline | No | One sentence across the axes. |
| subscores | No | The individual measured readings behind the axes. |
| limitations | No | What these axes cannot show. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a read-only, idempotent, non-destructive, non-open-world operation. The description adds important behavioral context beyond that: it produces three separate axis readings with no overall score, returns nothing for an axis lacking sufficient history, and explicitly does not recommend, predict, or calculate tax.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose and then adds routing examples, an alternative, and limitations. It is slightly longer than strictly necessary because of the three example questions, but each part is relevant and clearly structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, rich schema, annotations, and output schema, the description covers what an agent needs: the three axes, the absence of an overall score, the sibling alternative for full measurement, behavior with insufficient history, and non-recommendation boundaries. Return formatting is handled by the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the input schema already documents `holdings`, `base`, and `units` in detail, including unit inference rules and examples. The tool description does not add parameter-specific meaning beyond what the schema provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it reads one portfolio along three separate axes — risk construction, crisis behavior, and return for risk taken. It explicitly distinguishes this from the sibling `measure_portfolio`, which provides the full measurement, so an agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete typical questions that should trigger the tool and names the alternative: use `measure_portfolio` for the full measurement. It also notes that an axis without enough history comes back without a reading, setting expectations for incomplete results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
last_priceLatest closeARead-onlyIdempotentInspect
The latest daily close for each ticker, in its own currency and in the base currency, with the date. Typical questions: 'What's the last price of VWCE?'; 'Turn 120 shares of VTI into dollars.'; 'Latest close for these tickers.'. Instead: for history and figures of one asset, asset_info. One price per ticker, no history. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| tickers | Yes | Tickers, up to 50. |
Output Schema
| Name | Required | Description |
|---|---|---|
| base | No | Base currency. |
| data | No | Where the prices came from and what was missing or repaired. |
| as_of | No | Date of the close. |
| prices | Yes | Per ticker: latest close in the base currency. |
| currencies | No | Per ticker: its trading currency. |
| native_prices | No | Per ticker: latest close in its own currency. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint and openWorldHint, so the safety profile is covered. The description adds scope traits beyond that: one price per ticker, no history, and explicit non-goals ('does not recommend, predict or calculate tax'). It does not discuss rate limits, symbol validity handling, or what happens with unknown tickers, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core statement is front-loaded and the follow-on sentences each carry distinct information: examples, the sibling alternative, the one-price-no-history constraint, and the non-goals. There is minor formatting noise from an embedded line break in the text, but no redundant sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and the description covers purpose, exclusions, and non-goals for a simple two-parameter tool. A minor gap is that it doesn't hint at behavior for invalid or unknown tickers, despite a validate_symbols sibling in the family.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both the 'tickers' (up to 50) and 'base' (default USD) parameters are already documented. The description reinforces the dual-currency output and shows tickers in use (VWCE, VTI), but adds no syntax, formatting, or edge-case detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: the latest daily close per ticker, expressed in both the ticker's own currency and the base currency, plus the date. It explicitly carves out the boundary against asset_info ('for history and figures of one asset'), so an agent can distinguish it from siblings without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies concrete example questions ('What's the last price of VWCE?'; 'Turn 120 shares of VTI into dollars.'; 'Latest close for these tickers.') that map real intents to this tool. It also names the alternative and the condition that selects it: 'Instead: for history and figures of one asset, asset_info. One price per ticker, no history.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
living_off_itLiving off it: withdrawals replayedARead-onlyIdempotentInspect
A yearly withdrawal, raised with real inflation, replayed from every start month the history allows: how many starts lasted the full span, how many ran out and when, the lowest point from the worst start, and the highest yearly rate that ran out from no start in the record. Typical questions: 'Can I live off $1M taking $40,000 a year for 30 years?'; 'Would a 4% withdrawal have lasted on this portfolio?'; 'How long would this money have lasted in retirement?'. Instead: for money put in every month instead, monthly_plan. A count of past starts, never a probability. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| units | No | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. | |
| years | No | How many years, 5 to 50. | |
| amount | No | How much is in the portfolio, when `holdings` are weights rather than money. | |
| holdings | Yes | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. | |
| withdrawal | Yes | Taken each year, in today's money; raised with the real price index of the base currency. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Where the prices came from and what was missing or repaired. |
| rate | No | withdrawal / amount. |
| worst | No | The worst start: start, ran_out, months, low_real, low_at, end_real. |
| years | No | Span asked for. |
| _fence | Yes | What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result. |
| amount | No | Money in the portfolio at each start. |
| record | No | start, end and years of the shared monthly record. |
| starts | No | A sample of starts (every sixth): start, complete, months, ran_out, low_real, end_real. |
| n_going | No | Recent starts not run out so far, span not over. |
| n_starts | No | Starts followed (at least a year). |
| inflation | No | Price index used: source, last_published, assumed. |
| n_ran_out | No | Starts, complete or not, where the money ran out. |
| safe_rate | No | Highest yearly rate that ran out from no start; null if no start is complete. |
| n_complete | No | Starts old enough for the full span. |
| withdrawal | No | Taken each year, in start-month money, raised with prices. |
| testable_years | No | The longest span the record can test in full. |
| n_complete_lasted | No | Of those, how many lasted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive, closed-world), and the description adds interpretation-critical context beyond them: results are counts of past starts and 'never a probability', and the replay is bounded by 'every start month the history allows'. It stops short of saying how far back the data reaches per ticker, which matters for a closed-world historical tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The output spec is front-loaded and the alternative tool plus caveats follow in a logical order with no filler sentences. It is a single dense block with telegraphic phrasing and three example questions where one would establish the pattern, so it is slightly longer than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter, nested-object tool with an output schema and full annotation coverage, the description covers what it computes, how to read the output as historical counts, and the sibling alternative. The missing piece is the boundary of the available history, which the phrase 'the history allows' acknowledges without quantifying.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 base, units, years, amount, holdings and withdrawal, and the description mostly restates the holdings/units inference rules. It does add the consequence of that inference ('which makes the falls come out in money') and re-states that the withdrawal is raised with the real price index, but it never mentions years or amount directly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific operation on a specific resource: a yearly withdrawal, inflation-adjusted, replayed from every start month, reporting survival counts, depletion dates, worst-start low, and the highest failing rate. It explicitly separates itself from monthly_plan, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete selection cues via three typical questions, names the alternative tool and the condition that selects it ('for money put in every month instead, monthly_plan'), and states exclusions ('does not recommend, predict or calculate tax'). Nothing about when to pick this is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
look_throughWhat the funds hold underneathARead-onlyIdempotentInspect
The companies a portfolio owns through its funds, added up across funds. In: holdings. Out: the largest companies with their share of the whole portfolio, companies reached through more than one fund, the part of the money that buys a company a second time, sectors, and how much of the money could be named. Typical questions: 'How much do my ETFs overlap?'; 'What companies do I really own through VTI, QQQ and VXUS?'; 'How much NVIDIA do I hold through my funds?'. Instead: for one fund on its own, asset_info. Figures are minimums where a fund shows only its largest holdings; the answer says how much of the money is named. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| units | No | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. | |
| holdings | Yes | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Where the prices came from and what was missing or repaired. |
| _fence | Yes | What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result. |
| opaque | No | Holdings with no breakdown to look through. |
| n_funds | No | Funds looked through. |
| refused | No | Funds whose breakdown the data vendor refused. |
| sectors | No | [sector, share] pairs. |
| exposures | No | [company, share of the whole portfolio] pairs, largest first. |
| top_symbol | No | The largest single company underneath. |
| n_companies | No | Distinct companies seen underneath. |
| covered_fraction | No | Share of the money whose underlying holdings are visible, 0 to 1. |
| top_symbol_weight | No | Its share of the whole portfolio. |
| duplicated_exposure | No | Share held more than once through different funds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, but the description adds important caveats: figures are minimums when funds disclose only top holdings, the answer reports named coverage, and the tool does not recommend, predict, or calculate tax. It does not discuss rate limits or authentication, but those are not central for this local analysis tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and expected output, then gives examples and exclusions. It is somewhat long, but most sentences earn their place by clarifying output scope or avoiding misuse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the description need not restate return fields in detail, and it already names the main output categories plus key limitations. For a read-only analytical tool with fully described parameters, this is complete enough to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameter definitions already carry the baseline. The description adds useful semantics beyond the schema: ticker formatting conventions, cash notation, 1–100 holdings, and the units inference rule when omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb-like operation and resource: aggregating the companies a portfolio owns through its funds. It also distinguishes the scope from sibling asset_info, so an agent can tell this is portfolio-wide look-through rather than single-fund detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit typical questions and names the alternative: use asset_info for one fund on its own. That directly routes the agent between this tool and a close sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
measure_portfolioMeasure a portfolioARead-onlyIdempotentInspect
The full measurement of one portfolio in one call. In: holdings as weights or money amounts. Out: how many independent bets they make, each holding's share of the risk beside its share of the money, the companies owned through the funds, what past crises did and how long recovery took, and the numbered report. Typical questions: 'Analyze my portfolio: 60% VTI, 30% VXUS, 10% BND.'; 'What should I know about what I hold?'; 'Give me the full picture of this portfolio.'. Instead: for one narrow question use the narrower tool: portfolio_structure (spread of risk), look_through (companies), past_crises (crashes). For a quotable text with numbered figures, portfolio_report. For the shortest answer, plain_findings. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| units | No | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. | |
| holdings | Yes | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| _fence | Yes | What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result. |
| report | No | The numbered report: every figure beside its method. |
| stress | No | What past crises did to this mix, replayed on its holdings. |
| structure | No | How many independent bets the holdings add up to and who carries the risk. |
| lookthrough | No | What the portfolio owns through its funds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered; the description adds value by disclosing the response contents and hard scope exclusions (no advice, no prediction, no tax). It stops short of stating latency, cost, or failure modes (e.g. unknown tickers), so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core statement in one sentence, then In/Out, then usage routing and exclusions — well structured. The long list of example questions is slightly padded but each element maps to a distinct decision the agent must make.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't document return shapes, yet it still summarizes them; combined with explicit sibling routing and scope exclusions, an agent has everything needed to select and call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents base, units, and holdings including the weights-vs-money auto-detection rule; the description's 'In: holdings as weights or money amounts' merely restates it. Baseline 3 applies since structured fields carry the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('full measurement of one portfolio'), then enumerates concrete outputs (independent bets, risk vs money share, look-through companies, past crises, numbered report), which lets an agent distinguish it from narrower siblings. The scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'for one narrow question use the narrower tool' and names three alternatives with their domains (portfolio_structure, look_through, past_crises), plus portfolio_report for quotable text and plain_findings for the shortest answer. Also states what it does not do (recommend, predict, calculate tax).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monthly_planMoney in every month, replayedARead-onlyIdempotentInspect
The same amount bought on the first trading day of each month, replayed on a portfolio's own history with dividends reinvested: what it became against what was put in, the deepest point below the money put in, and the same plan from every possible starting January. Typical questions: 'If I put $500 a month into these, what would it have become?'; 'Dollar-cost averaging into VTI since 2007?'; 'Monthly investing: what was the hardest stretch?'. Instead: for withdrawals, living_off_it. For the record itself, return_history. Before taxes and fees. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| start | No | The year whose January the plan starts in; the record's first whole January when absent. | |
| monthly | Yes | Amount bought every month, in the base currency. | |
| holdings | Yes | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| run | No | The plan from `start`: start (first buying day), year, months, put, value, worst_day, worst_value, worst_put, gap (how far below the money put in at its hardest moment), under_months (longest stretch below it, at month ends), brief_dip, under_from, under_to. |
| base | No | Currency of every figure. |
| data | No | Where the prices came from and what was missing or repaired. |
| kind | No | replayed. |
| start | No | The year whose January the plan started in. |
| _fence | Yes | What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result. |
| amount | No | Bought every month, in the base currency. |
| record | No | start, end: the shared daily record replayed. |
| starts | No | The same plan from every January in `start_years`, in order; each as `run`. |
| limitations | No | What the figures leave out, in words. |
| start_years | No | Every January the record allows as a start. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds meaningful model assumptions the agent would otherwise guess: dividends reinvested, purchases on the first trading day, results before taxes and fees, and no recommendation/prediction/tax computation. It stops short of disclosing data frequency or how the 'deepest point below' is measured, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action leads, followed by the reported quantities, example questions, and exclusion routing — a sensible front-load. Some phrasing is stylized ('what it became against what was put in') and the three sample questions are slightly redundant, but nothing is padded enough to waste an agent's attention.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter tool with nested holdings and an output schema, the description covers what is computed, the reinvestment/timeframe assumptions, tax and fee scope, and the sibling to use instead. Return-value explanation is rightly omitted because an output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds semantics the schema lacks: the monthly amount is bought on the first trading day, and the start year defines a January with the plan also replayed from every possible starting January (a rolling-window behavior not evident from 'the year whose January the plan starts in'). The dollar examples reinforce the monthly parameter's scale.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific computation: a fixed monthly purchase on the first trading day of each month, replayed on the portfolio's own history with dividends reinvested, reporting final value vs. contributions, the deepest underwater point, and rolling January-start replays. This is a precise verb+resource definition that an agent can separate from siblings like return_history or compare_portfolios without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggering questions ('If I put $500 a month into these...', 'Dollar-cost averaging into VTI since 2007?') so an agent can pattern-match a user's ask. It also names explicit negatives and alternatives: living_off_it for withdrawals, return_history for the raw record.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
past_crisesWhat past crises did to this mixARead-onlyIdempotentInspect
What past crises did to one portfolio held as it is today: 2008, 2020, 2022 and the others inside its price history. In: holdings. Out: for each crisis the deepest fall, the worst day and the days until the previous high came back; crises before a holding existed are named as not tested. Typical questions: 'How much would 2008 have cost me with 60% VTI, 20% VXUS, 20% BND?'; 'What did the 2020 crash do to this mix?'; 'Simulate a market crash on my portfolio.'. Instead: for a loss chosen by the reader ('what would it take to lose 30%?'), reverse_stress. For the whole record, return_history. Holdings in money give each fall in money; in percentages the falls are percentages. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| units | No | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. | |
| holdings | Yes | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Where the prices came from and what was missing or repaired. |
| _fence | Yes | What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result. |
| scenarios | No | One entry per crisis. |
| limited_by | No | The holding whose short history limits the window. |
| window_start | No | First date all holdings have prices. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, idempotent, non-destructive operation. The description adds meaningful behavioral context beyond that: it explains the output fields, notes that crises before a holding existed are labelled 'not tested', and states that the tool does not recommend, predict, or calculate tax.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose and input/output shape, then adds examples, sibling routing, and scope caveats. Despite being fairly detailed, every element is useful for selecting and invoking the tool correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the presence of an output schema, and rich annotations, the description is complete enough: it covers the scenario, input expectations, output meaning, limitations, and alternatives. Nothing critical for correct invocation appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the input schema already fully documents holdings, base, and units. The description reinforces that holdings drive the analysis and that money-based versus percentage-based holdings affect whether falls appear in money or percentages, but it adds little parameter syntax or meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific analytical operation: showing what named historical crises did to a current portfolio mix using its price history. It distinguishes the tool from siblings by explicitly naming reverse_stress and return_history as alternatives for different questions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage cues through typical questions and clearly routes related needs elsewhere: reverse_stress for a chosen loss level and return_history for the whole record. This leaves little ambiguity about when to call past_crises versus its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plain_findingsThe findings in plain wordsARead-onlyIdempotentInspect
Three or four plain sentences about one portfolio, how its risk is built and its worst historical fall, each with its window. Typical questions: 'Explain my portfolio simply.'; 'In plain words, what should I know?'; 'I'm new to investing: what does this portfolio look like?'. Instead: for the figures in full, measure_portfolio. For a quotable numbered report, portfolio_report. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| units | No | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. | |
| holdings | Yes | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Where the prices came from and what was missing or repaired. |
| _fence | Yes | What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result. |
| insights | No | Per finding: key, title, detail, severity (info or warning), evidence. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the safety profile is covered. The description adds genuine behavior context the annotations don't: output length (three or four sentences), that every figure carries its measurement window, and that advice/prediction/tax calculation are out of scope. It stops short of saying how invalid or unknown tickers are handled, which matters for a tool that takes free-form tickers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the output shape, then example questions, then sibling routing, then exclusions — a sensible order with no filler. It is slightly long-winded and the awkward line breaks make it read as one run-on block, but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, rich annotations, and fully described parameters, the description only needs to say what the tool is for and when to prefer it — which it does. Minor gap: nothing about failure behavior for unrecognized tickers or about how expensive/long the call is, which is the one thing left for an agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the holdings property is documented in depth (scales, ticker conventions, CASH.USD, example object), so the schema carries parameter meaning. The description only implies the single-portfolio scope and adds nothing on base/units handling or the 1–100 holding limit. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States exactly what the tool produces (three or four plain sentences about one portfolio's risk construction and worst historical fall, each with its window), which is a specific verb+resource+output shape. It explicitly names the two sibling tools that do something else (measure_portfolio, portfolio_report), 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggering questions ('Explain my portfolio simply', 'I'm new to investing...') plus explicit routing to alternatives for the figures-in-full and numbered-report cases. It also adds a negative boundary: it does not recommend, predict or calculate tax.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
portfolio_reportThe numbered reportARead-onlyIdempotentInspect
The written report on one portfolio, every figure numbered F1, F2… beside its method and window. In: holdings. Out: a text to quote or keep. Typical questions: 'Write me a report on this portfolio I can keep.'; 'Give me the numbers with their sources.'; 'A citable summary of my portfolio, please.'. Instead: for the full structured measurement, measure_portfolio (which includes this report). For a few plain sentences, plain_findings. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| units | No | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. | |
| holdings | Yes | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| end | No | Window end. |
| facts | No | One entry per figure: id, label, value, method, window, limit. |
| start | No | Window start. |
| _fence | Yes | What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result. |
| receipt | No | A short plain-text receipt of the same figures. |
| markdown | No | The report as markdown, figures numbered F1, F2… |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnly/idempotent/non-destructive/closed-world, so the bar is lower; the description still adds the scope boundary (no recommendations, predictions, or tax calculations) and the output nature (a quotable text). It does not discuss length, rate limits, or what happens with unusual holdings, but nothing it says conflicts with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool produces before the routing information; sentences are terse and telegraphic ('In: … Out: … Instead: … does not …'). The three sample questions are useful for matching but are the one slightly padded element.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists and the description still characterizes the return as a quotable numbered text, plus it delimits scope against three siblings and states what it will not do. For a read-only report tool with a fully documented schema, an agent needs nothing more to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter (base, units, holdings) carries detailed enumeration and defaults, including the money-vs-weights inference rule and ticker/cash formatting. The description only signals 'In: holdings' and adds no syntax or default detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (a written report on one portfolio) with the distinctive artifact spelled out: figures numbered F1, F2… beside method and window. Explicitly separates itself from measure_portfolio (full structured measurement) and plain_findings (a few plain sentences), so an agent can route 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives both sides: 'In: holdings. Out: a text to quote or keep', three concrete user phrasings that should select this tool, and named alternatives with the condition that selects them (measure_portfolio for structured measurement, plain_findings for plain sentences). Exclusions are also stated ('does not recommend, predict or calculate tax').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
portfolio_structureHow many independent bets, and where the risk sitsARead-onlyIdempotentInspect
How many independent bets a portfolio's holdings make, from how their prices moved together rather than how many tickers there are, and each holding's share of the risk beside its share of the money, over the full record and recent years. Shares of the risk are Euler contributions and add up to 100%. Typical questions: 'Am I really diversified?'; 'Which of my holdings is behind most of the risk?'; 'Do my four funds move as one?'. Instead: for the companies inside the funds, look_through. For everything at once, measure_portfolio. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| units | No | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. | |
| holdings | Yes | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Where the prices came from and what was missing or repaired. |
| _fence | Yes | What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result. |
| recent | No | The same figures over the recent years only. |
| max_weight | No | Its share of the money, 0 to 1. |
| n_holdings | No | Holdings measured. |
| effective_bets | No | Effective number of independent bets (from correlations, not the ticker count). |
| max_risk_ticker | No | The holding carrying the largest share of the portfolio's risk. |
| top_factor_share | No | Share of the movement explained by the single strongest common factor. |
| max_weight_ticker | No | The largest holding by money. |
| risk_contributions | No | [ticker, share of risk] pairs. |
| max_risk_contribution | No | That holding's share of the risk, 0 to 1. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, non-open-world, idempotent, and non-destructive behavior. The description adds useful methodological context: risk shares are Euler contributions summing to 100%, and results cover the full record and recent years. It also clarifies boundary limitations, though it does not go into permissions or output details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, and the description is organized into purpose, example questions, and alternatives. It is appropriately sized for a nuanced analytical tool, though the opening sentence is dense and slightly long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a complete input schema, output schema present, and annotations covering safety behavior, the description provides enough context about what the tool measures, how to interpret risk shares, and when to choose it over siblings. No critical invocation detail is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents base, units, and holdings in detail. The description adds only general framing about holdings and price co-movement, not parameter-specific semantics. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific analytical resource: measuring how many independent bets a portfolio's holdings make based on co-movement, and each holding's risk contribution. It clearly distinguishes this from counting tickers and from sibling tools like look_through and measure_portfolio.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit example questions that indicate when to use the tool and names alternatives for adjacent tasks: look_through for companies inside funds, measure_portfolio for everything at once. It also states what the tool does not do, including recommendation, prediction, or tax calculation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
return_historyThe record, month by monthARead-onlyIdempotentInspect
What one portfolio returned over its record: growth per year before and after inflation, best and worst months and years, every 12-month stretch, returns by month and year, and weight drift between rebalances. Typical questions: 'How did this portfolio do over the years?'; 'What was its worst year?'; 'Returns after inflation, please.'. Instead: for crises only, past_crises. For money put in every month, monthly_plan. Past record, not a forecast. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| units | No | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. | |
| holdings | Yes | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cagr | No | Growth per year over the record. |
| data | No | Where the prices came from and what was missing or repaired. |
| grid | No | Monthly returns: one row per year, null where the record has no month. |
| drift | No | Per holding: target weight and how far it drifted between rebalances. |
| stats | No | best_month, worst_month, best_year, worst_year, pct_positive, n_months, var95, cvar95, real_cagr (after inflation). |
| years | No | Calendar years. |
| _fence | Yes | What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result. |
| months | No | Month names, aligned with each row of `grid`. |
| yearly | No | Return per calendar year, aligned with `years`. |
| distribution | No | Histogram of monthly returns: centers, counts. |
| rolling_stats | No | Any 12 months in a row: min, max, percentiles, share negative. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish read-only, idempotent, non-destructive, and closed-world behavior, while the description adds meaningful boundaries beyond that: it does not forecast, recommend, predict, or calculate tax. It also discloses that inflation-adjusted returns and rebalance weight drift are included, which helps the agent understand the scope of analysis.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded with the core purpose, then lists outputs, typical questions, alternatives, and limitations. Every clause is informative and there is no redundant restatement of the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given rich annotations, full schema description coverage, and an output schema, the description is complete enough for correct selection and invocation. It covers purpose, alternatives, output scope, and explicit non-goals.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the input schema already explains base, units, and the holdings object in detail, including currency codes, money-vs-weight inference, ticker formatting, and examples. The description adds no parameter-specific guidance beyond that, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('what one portfolio returned over its record') and enumerates the concrete outputs: annual growth before/after inflation, best/worst months and years, rolling 12-month stretches, calendar returns, and rebalance drift. It also distinguishes itself from sibling tools by explicitly naming past_crises and monthly_plan as alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives typical user questions that select this tool, and explicitly routes two adjacent use cases to alternatives: crises-only analysis to past_crises and recurring contributions to monthly_plan. It also clarifies the tool is for past performance, not forecasting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reverse_stressWhat it would take to lose that muchARead-onlyIdempotentInspect
Starts from a loss the reader names and finds the least extreme combination of market moves that would cause it on this portfolio, beside the worst each move actually did in the record; also each single company on its own. Typical questions: 'What would it take to lose 30%?'; 'A third of my portfolio is my employer's stock: what would a crash in it take from me?'; 'How bad would markets have to get for me to lose a quarter?'. Instead: for what past crises actually did, past_crises. No probability is computed: it says how large the moves would be, not how likely. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| loss | No | The loss to explain, as a fraction: 0.25 = lose a quarter. | |
| holdings | Yes | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Where the prices came from and what was missing or repaired. |
| line | No | One sentence: what it would take. |
| moves | No | Per market direction: label, plain wording, shock needed, sensitivity (beta), share of the loss, worst_seen in the record over the same number of days. |
| _fence | Yes | What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result. |
| target | No | The loss explained, as a negative fraction. |
| coverage | No | Share of the portfolio's movement these directions explain. |
| window_end | No | Record end. |
| window_days | No | Length of the move considered, in trading days. |
| window_start | No | Record start. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnly, idempotent, and non-destructive behavior, so the description does not need to restate those. It still adds useful scope limits beyond them: no probability is computed, and it does not recommend, predict, or calculate tax. That is valuable for a read-only analytics tool, though it does not say anything about output size or cost.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior and the alternative appear first, and the example questions make the intent concrete. Some phrasing is dense ('beside the worst each move actually did in the record'), but no sentence is wasted and the negative scope statements earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values do not need explaining. For a three-parameter analytic tool, the description covers the intent, the alternative, and the exclusions. What is missing is minor: no note on how large the output is or limits on portfolio complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already defines base, loss, and the holdings object in detail, including units and ticker format. The description adds only mild framing ('a loss the reader names' and per-company output) beyond that. The baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation on a specific object: it starts from a named loss and finds the least extreme combination of market moves that would cause it on this portfolio, alongside the worst each move actually did and each single company on its own. It is clearly separable from siblings, and it explicitly contrasts itself with past_crises.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete user questions that select this tool ('What would it take to lose 30%?', employer-stock crash, market decline), and it names the alternative for a different intent ('for what past crises actually did, past_crises'). The routing decision is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_symbolsFind a ticker by nameARead-onlyIdempotentInspect
Finds tickers from a name, part of a ticker or an ISIN, with the exchange of each listing. In: one search phrase. Out: up to ten listings, those not yet checked marked as such. Typical questions: 'What's the ticker for Vanguard FTSE All-World?'; 'Find IE00BK5BQT80.'; 'Is there a euro listing of the Nasdaq 100 ETF?'. Instead: when the tickers are already written down, validate_symbols. A bare US-style symbol can name a different fund than a European one with the same letters (EQQQ is a US ProShares fund; the Invesco UCITS fund is EQQQ.DE / EQQQ.L): give the exchange suffix. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| query | Yes | A fund or company name, a ticker, or an ISIN. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | Matches, best first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses the result cap ('up to ten listings'), that unchecked listings are flagged as such, and a real gotcha: a bare US symbol can resolve to a different fund than the European listing of the same letters. It also sets a negative scope ('does not recommend, predict or calculate tax') so the agent won't over-trust the output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and input/output contract, followed by usage examples and the sibling alternative. Slightly dense with three quoted example questions and a parenthetical ticker illustration, but every element carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter lookup tool with full schema coverage, annotations and an output schema, nothing material is missing: input forms, result limits, the unchecked flag, the sibling alternative, and the failure mode of ambiguous symbols are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds value by clarifying that 'query' is exactly one search phrase and may carry an exchange suffix (EQQQ.DE / EQQQ.L). It does not explain the 'base' currency parameter at all, leaving that entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Finds tickers') plus the accepted input types (name, partial ticker, ISIN) and what comes back per listing (the exchange). It is clearly separable from validate_symbols, which the description names as the different tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'Instead: when the tickers are already written down, validate_symbols.' Concrete example queries show the exact situations this tool is meant for, and the exchange-suffix paragraph tells the agent how to disambiguate ambiguous symbols rather than guessing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sweep_holdingOne holding across its whole rangeARead-onlyIdempotentInspect
One holding already in the portfolio, measured at every weight from none to all, the rest of the money shared out in proportion: volatility, its share of the risk and the number of independent bets at each point. Typical questions: 'How much BND does it take to change anything?'; 'Show me my portfolio with 0% to 100% QQQ.'; 'At what weight does gold start to matter here?'. Instead: for one specific change, test_a_change. For a holding not yet owned, check_before_you_buy. It never says which weight to hold. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| ticker | Yes | The holding to sweep; must be one of `holdings`. | |
| holdings | Yes | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| end | No | Window end. |
| data | No | Where the prices came from and what was missing or repaired. |
| kind | No | Kind of figures (counterfactual). |
| knee | No | Weight below which most of the change happens, when there is one. |
| note | No | One sentence on where the change comes from. |
| start | No | Window start. |
| _fence | Yes | What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result. |
| points | No | Per weight: weight, vol (volatility), risk_share (that holding's share of the risk), effective_bets, top_factor_share. |
| ticker | No | The holding swept. |
| total_change | No | Change in volatility from none to the current weight. |
| redistribution | No | How the rest of the money is spread at each point. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive, closed-world behavior, and the description adds meaningful scope beyond that: it reports volatility, risk share, and independent bets at each weight, and explicitly refuses to recommend an optimal weight or calculate tax. It does not discuss edge cases or error behavior, but the output schema covers return structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the alternatives and limitations are clearly organized. The three example questions and multiple clarifications are useful rather than redundant, though the description is longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex analytical tool with a full output schema, complete parameter descriptions, and safety annotations, the definition is complete enough to call correctly. It explains the sweep behavior, the metrics, the intended questions, the alternatives, and the non-goals.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so ticker, holdings, base, weight scale, and ticker format are already fully documented in the schema. The description reinforces that the holding must already be in the portfolio and that the sweep covers every weight, but does not add syntax or constraints beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific analysis verb/resource: sweeping one existing holding across every weight from 0% to 100%, with the rest shared proportionally. It also names the metrics produced (volatility, risk share, independent bets) and distinguishes itself from test_a_change and check_before_you_buy.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit use cases through example questions like 'Show me my portfolio with 0% to 100% QQQ' and clear alternatives: test_a_change for one specific change, check_before_you_buy for a holding not yet owned. It also states what the tool does not do, including recommending a weight, predicting, or calculating tax.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_a_changeBefore and after a proposed changeARead-onlyIdempotentInspect
Any change to one portfolio, measured before it is made: current and proposed holdings side by side on the same prices. In: two sets of holdings. Out: structure, share of the risk, falls in past crises, and what the change adds or removes; the figures are in the structured result. Typical questions: 'What happens if I sell half my QQQ and buy BND?'; 'Compare my portfolio now with this rebalanced version.'; 'I want to swap VXUS for VWO: before and after?'. Instead: for adding ONE new holding (how much of it is already owned, and a 'kept as cash' column) use check_before_you_buy. For one holding at every weight, sweep_holding. For separate unrelated portfolios, compare_portfolios. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Optional window end, YYYY-MM-DD. | |
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| start | No | Optional window start, YYYY-MM-DD. | |
| current | Yes | What is held now, {ticker: weight}. | |
| proposed | Yes | What would be held after the change, {ticker: weight}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| axes | No | Per axis: label, the question it answers, before, after. |
| data | No | Where the prices came from and what was missing or repaired. |
| kind | No | Kind of figures (counterfactual). |
| _fence | Yes | What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result. |
| deltas | No | Per measure: label, before, after, direction, unit. |
| window | No | The shared window: start, end, years, which holding set it, crises inside. |
| similar | No | Measures that barely moved. |
| summary | No | One sentence on what the change moves. |
| improved | No | Measures that moved one way. |
| worsened | No | Measures that moved the other way. |
| historical | No | Per past crisis: before and after. |
| introduces | No | Risk the proposed holdings add that the current ones did not carry. |
| kind_means | No | What that kind means. |
| limitations | No | What this comparison cannot show. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds useful behavioral context — the comparison is on the same prices, figures are in the structured result, and the tool does not recommend, predict, or calculate tax. It does not need to repeat safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and comparison are front-loaded, followed by useful alternatives and examples. It is somewhat lengthy but each section serves a distinct purpose; minor tightening could improve it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety, a full input schema, and an output schema, the description provides everything needed: what goes in, what comes out, when to use it versus siblings, and what it deliberately does not do.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including clear descriptions for current and proposed holdings and optional date/currency parameters. The description adds conceptual meaning ('two sets of holdings') but does not elaborate on the {ticker: weight} format or date/currency semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — measuring a portfolio change before it is made — and sharply distinguishes it from sibling tools. The 'In/Out' framing and concrete examples make the operation unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names alternatives and the conditions that select them: check_before_you_buy for one new holding, sweep_holding for one holding at every weight, compare_portfolios for unrelated portfolios. Typical questions further anchor when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_symbolsCheck symbols before measuringARead-onlyIdempotentInspect
Checks tickers before a measurement. In: up to 150 tickers. Out: which have usable price history, their trading currency, and the closest listings for those that do not. Typical questions: 'Check these tickers before you measure: VWCE, EQQQ, CSPX.'; 'Are VTI and BND valid?'; 'Which of these symbols can you price?'. Instead: when only a name is known, search_symbols. It measures nothing. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| tickers | Yes | Tickers to check, up to 150. |
Output Schema
| Name | Required | Description |
|---|---|---|
| base | No | Base currency. |
| data | No | Where the prices came from and what was missing or repaired. |
| valid | Yes | Per ticker: true when it has usable price history. |
| problems | No | Per failing ticker: why. |
| currencies | No | Per ticker: its trading currency. |
| suggestions | No | Per ambiguous ticker: the closest listing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-open-world, non-destructive, so safety is covered; the description adds useful scope limits ('up to 150 tickers') and explicit non-capabilities ('does not recommend, predict or calculate tax') plus how failures are surfaced ('closest listings'). It does not discuss rate limits or latency, so it stops short of full disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core check and its output are front-loaded, and the boundary-plus-alternative sentence is efficient. The three quoted example questions take up noticeable space for modest routing value, costing a bit of tightness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values don't need exhaustive description, yet the description summarizes them helpfully (validity, trading currency, closest listings). For a 2-parameter read-only tool with full schema coverage and annotations, this is nearly complete; only the 'base' currency behavior is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented (tickers with maxItems 150, base currency with default USD). The description repeats the 150 cap but does not mention the 'base' currency parameter or explain how it affects returned trading-currency figures. Baseline 3 applies when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('checks tickers') and defines both input scope (up to 150 tickers) and output (usable price history, trading currency, closest listings for misses). It explicitly separates itself from search_symbols, so an agent can route between the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives the sequencing rule ('before a measurement'), sample user questions that map to the tool, and a named alternative with the exact condition that selects it ('when only a name is known, search_symbols'). It also states the negative boundary ('measures nothing'), which prevents misuse as a measurement tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
walk_forwardWould refitting have helped? (out of sample)ARead-onlyIdempotentInspect
Whether re-optimising an allocation would have helped: fit on the years before each date, hold on prices not yet seen, repeat, and compare with the portfolio held and with equal weights. Typical questions: 'Would an optimiser have beaten my portfolio?'; 'Test max-Sharpe out of sample on these funds.'; 'Does rebalancing to an optimised mix help?'. Limits: Only for that question; it is not for choosing weights and returns no allocation to hold. It does not recommend, predict or calculate tax.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. | |
| tickers | Yes | The candidate holdings, 2 to 30. | |
| holdings | No | Optional: the portfolio actually held, {ticker: weight}, measured on the same span for comparison. | |
| objective | No | What each refit maximises or minimises: max_sharpe, min_variance, min_drawdown, min_cvar or max_quadratic_utility. | max_sharpe |
| step_months | No | Months each fitted mix is held. | |
| train_years | No | Years of history each refit sees. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Where the prices came from and what was missing or repaired. |
| _fence | Yes | What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result. |
| objective | No | What each refit optimised. |
| fitted_window | No | First and last date of shared history. |
| out_of_sample | No | start, end, n_refits, train_years, step_months, mean_turnover, verdict (one sentence on the record), limitations, tracks (per track: label, cagr, vol, sharpe, max_drawdown, nav), refits (date, turnover); or `unavailable` with the reason. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world behavior. The description adds meaningful behavioral context beyond that: it returns no allocation to hold and does not recommend, predict, or calculate tax, which helps set expectations for a read-only analytical tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core procedure and then lists typical questions and limits. It is somewhat dense and the typical-questions list is long, but every sentence contributes useful selection or scope information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter analytical tool with an output schema and full annotation coverage, the description supplies enough context about purpose, usage, and limits. It does not need to explain return values because an output schema exists, though it could say more about what the out-of-sample comparison reports.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameter meanings are already well documented. The description still adds conceptual value by explaining the walk-forward mechanic: fitting on years before each date maps to train_years, holding on unseen prices maps to step_months, and comparison with the held portfolio maps to holdings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific analytical procedure: fit on prior years, hold out-of-sample, repeat, and compare optimized refits against the held portfolio and equal weights. It also explicitly distinguishes the tool from allocation-selection by saying it is not for choosing weights and returns no allocation to hold.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear typical questions that indicate when to use the tool, such as testing whether an optimizer would have beaten a portfolio or whether rebalancing to an optimized mix helps. It also states a useful exclusion: only for that question, not for choosing weights or tax advice. It does not name specific sibling alternatives, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Publisher details
- Operator
- Folionomiq · Publisher source
- Operator website
- https://folionomiq.com
- Vendor relationship
- First-party
- Documentation
- https://folionomiq.com/connect
- Trust center
- Not available
- Restrictions
- None. Free, with no account, no sign-in, no API key and no regional limits.
Related MCP Connectors
Backtest and analyze any portfolio, incl. nested multi-strategy ones: returns, risk, factors, guides
ETF portfolio calculator: returns, drawdown, market thermometers, plan. No advice, no orders.
Portfolio analysis from published fund data: charges, exposure and overlap. Read-only.
Portfolio and strategy stress diagnostics with hedge-break detection and regime outlook. Free tier.
Related MCP Servers
- AlicenseAqualityBmaintenanceWhat it does: * Portfolio risk profiling (per-asset and portfolio-level) * Target allocation based on risk profile (conservative/moderate/aggressive) * Diversification scoring via HHI index * Sharpe proxy calculation * Concentration risk detection * Rule-based rebalance recommendations101MIT
- AlicenseAqualityBmaintenanceInvestment decision tools for AI agents: portfolio status, isolated multi-agent committee analysis, auditable verdict history, and lookahead-protected backtests. Advisory only, no auto-trading; negative research results published.361,113 PyPI139MIT
- FlicenseNot gradedqualityCmaintenanceProvides quantitative portfolio analysis tools, including return, volatility, Sharpe ratio, VaR, correlation, and rebalance simulation, using bundled OHLCV data over stdio.-
- AlicenseNot gradedqualityDmaintenancePortfolio & trading-strategy stress diagnostics for AI agents: multi-asset stress with hedge-break detection, a daily preregistered regime outlook and deflated-Sharpe backtest-integrity checks. Remote streamable-HTTP endpoint with a free tier (no key); this repo is the public server card.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.