Portfolio Terminal
Server Details
Dated ETF, stock and calendar data, plus tax-loss, withholding and fee math on your holdings.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 10 tools
Most tools have clearly distinct purposes: calendars, ETF holdings/overlap, fees, tax-loss harvesting, withholding, and holder lookup are separable. The only mild overlaps are `compare` versus `etf_overlap` for two-ETF questions and `analyze_ticker` being a broad one-ticker tool, but descriptions make the intended use clear.
All names are snake_case and readable, but the conventions are mixed: `analyze_ticker` and `compare` are verb-led, while most others are noun-phrase tools like `dividend_calendar`, `etf_holdings`, and `tax_loss_harvest`. The set is not chaotic, but it lacks a single predictable pattern.
Ten tools is well-scoped for a portfolio research terminal, with each tool covering a meaningful analysis area rather than redundant variants. No tool feels like filler, and the surface is neither too thin nor unwieldy.
The set covers core research and tax workflows well: ticker analysis, comparisons, dividends, earnings, ETF holdings/overlap, fees, loss harvesting, holder lookup, and withholding. Minor gaps remain around full portfolio tracking, screening, or broader market/news functionality, but agents can work around these for the apparent analytics purpose.
Available Tools
10 toolsanalyze_tickerStock, ETF or coin key factsARead-onlyIdempotentInspect
Dated key facts and a plain-English chart read for one ticker Portfolio Terminal covers (390 US stocks, 30 ETFs, 17 cryptocurrencies and 4 commodity futures): price and one-year change, 52-week range, distance from the 200-day average, 30-day volatility with a risk rating, P/E and dividend yield, all-time high and "lowest since", ten years against the S&P 500 (SPY), support and resistance levels, which tracked ETFs and famous investors (13F) hold it, and related research. Use it for "how is NVDA doing", "is TSLA near its high", "what does the AAPL chart say".
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | The ticker as listed in the US ("NVDA", "VOO", "BRK.B"), a coin ("BTC" or "BTC-USD") or a future ("GC=F" for gold). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| asOf | Yes | |
| kind | Yes | |
| name | Yes | |
| chart | No | |
| sector | No | |
| symbol | Yes | |
| keyFacts | Yes | |
| research | No | |
| investors | No | |
| etfHolders | No | |
| comparisons | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, while the description adds useful scope details: the covered universe, the bundled outputs, risk rating, support/resistance, holders, and related research. It does not discuss data freshness beyond "dated" or behavior for unsupported 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?
The description is front-loaded with the core resource and output bundle, and the use-case examples are useful. It is dense and long, but most enumerated items earn their place by clarifying the returned content.
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 rich annotations, 100% schema coverage, and an output schema, the description provides enough detail about scope, returned facts, coverage universe, and intended queries. Nothing essential for correct invocation appears to be 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 single ticker parameter is well documented in the schema. The description reinforces that the ticker must be covered by Portfolio Terminal, but adds no syntax or format details 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 clear single-ticker resource and enumerates the key facts and chart read it returns. It implicitly separates itself from multi-ticker or specialized sibling tools by saying "one ticker," but it does not explicitly name alternatives such as compare or who_holds.
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 example queries ("how is NVDA doing", "is TSLA near its high", "what does the AAPL chart say") that clearly indicate when to use it. It lacks explicit when-not guidance or direct routing to sibling tools for narrower tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compareHead-to-head of two stocks or ETFsARead-onlyIdempotentInspect
Five-year head-to-head of two covered stocks or ETFs from weekly closes adjusted for dividends and splits: total and annualized return, 1-, 3- and 5-year returns, volatility, worst drawdown and worst week, correlation, what $10,000 became, plus each one's dividend yield, beta and (for funds) fee. Use it for "SCHD vs VIG", "NVDA vs AMD".
| Name | Required | Description | Default |
|---|---|---|---|
| a | Yes | First ticker, e.g. "SCHD". | |
| b | Yes | Second ticker, e.g. "VIG". |
Output Schema
| Name | Required | Description |
|---|---|---|
| a | Yes | |
| b | Yes | |
| url | Yes | |
| window | Yes | |
| headline | Yes | |
| takeaways | Yes | |
| correlation | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, open-world, so the description is free to add real behavioral context: the five-year window, weekly closes, dividend/split adjustment, and the full returned metric set including fee for funds. The "covered" qualifier also warns about instrument coverage limits, which is not in any structured field.
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 scope and window, then the metric list, then usage examples — a sensible order. The metric enumeration is long and partly duplicates the output schema, so a sentence could be trimmed, but nothing is genuinely wasted.
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, fully described params, and rich annotations, the remaining burden is methodology and scope, both of which are covered (weekly closes, dividend/split adjustment, five-year horizon, coverage restriction). An agent can call this correctly without opening anything else.
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% for both tickers, so the schema carries the syntax and examples. The description adds the meaningful constraint that inputs must be covered stocks or ETFs and shows a matched pair per asset class, which is more than restating 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+resource+scope: a five-year head-to-head of exactly two tickers, with the exact metric set enumerated. It is clearly distinct from single-ticker siblings like analyze_ticker or fund_fees because the two-input comparison is stated up front.
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?
The closing line gives concrete triggering phrasings ("SCHD vs VIG", "NVDA vs AMD") and the description scopes inputs to "covered" stocks or ETFs. It stops short of naming alternatives or stating when not to use it (e.g., one ticker → analyze_ticker, overlapping ETFs → etf_overlap).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dividend_calendarDividend calendarARead-onlyIdempotentInspect
US stocks and ETFs (of the 420 Portfolio Terminal covers) going ex-dividend in a month or a date range: ex-dividend date, pay date, dividend per share, yield, frequency, and whether the date is confirmed by the company or estimated from its payment rhythm. Buy before the ex-date to receive the dividend. Filter by one ticker with symbol.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Length of the range that starts at `from`, in calendar days (1–31, default 10). | |
| from | No | First day of a date range, YYYY-MM-DD (instead of `month`). Use it for "this week" or "the next 10 days". | |
| limit | No | How many entries, earliest first to return (1–200, default 50). | |
| month | No | A calendar month as YYYY-MM, from three months back to three months ahead. Defaults to the current month. Ignored when `from` is given. | |
| symbol | No | Only this ticker, e.g. "KO". |
Output Schema
| Name | Required | Description |
|---|---|---|
| end | Yes | |
| url | Yes | |
| count | Yes | |
| start | Yes | |
| entries | Yes | |
| returned | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so safety is covered. The description still adds real context the annotations cannot: the covered universe (420 tickers), and critically that each date is either 'confirmed by the company or estimated from its payment rhythm' — a data-reliability caveat an agent must know before presenting dates as fact.
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 resource and its output, then the caveat, then the filter hint — good ordering and no filler paragraphs. Minor noise: the awkward fragment 'of the 420 Portfolio Terminal covers' and the advisory 'Buy before the ex-date' sentence, which is orientation rather than tool description.
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 no explanation, and all five parameters are fully documented in the schema. The description supplies the remaining essentials: universe scope, date-estimation caveat, and the single-ticker filter path. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including the mutual exclusivity of `month` and `from` and the range bounds, so the baseline of 3 applies. The description restates only that `symbol` filters to one ticker, adding no syntax, format, or behavioral nuance 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 first sentence names a specific verb+resource ('going ex-dividend'), the asset universe (US stocks and ETFs), the time dimension (a month or a date range) and the projected fields (ex-date, pay date, DPS, yield, frequency, confirmed vs estimated). That is far more specific than the name alone. It does not explicitly contrast itself with the adjacent `earnings_calendar` sibling, though the dividend framing makes confusion unlikely.
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?
Usage is only implied: 'Filter by one ticker with `symbol`' hints at the narrowing path, and 'Buy before the ex-date to receive the dividend' is a domain tip rather than invocation guidance. Nothing states when to choose a month vs. a from/days range, or when to reach for this over `earnings_calendar` or `analyze_ticker`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
earnings_calendarEarnings calendarARead-onlyIdempotentInspect
US companies (of the 390 Portfolio Terminal covers) reporting earnings in a month or a date range: the day, before the open or after the close, EPS and revenue estimates, whether the date is confirmed or estimated, and once out, the result against the consensus and how many recent quarters beat it. Filter by one ticker with symbol.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Length of the range that starts at `from`, in calendar days (1–31, default 10). | |
| from | No | First day of a date range, YYYY-MM-DD (instead of `month`). Use it for "this week" or "the next 10 days". | |
| limit | No | How many reports, earliest first, larger companies first on the same day to return (1–200, default 50). | |
| month | No | A calendar month as YYYY-MM, from three months back to three months ahead. Defaults to the current month. Ignored when `from` is given. | |
| symbol | No | Only this ticker, e.g. "NVDA". |
Output Schema
| Name | Required | Description |
|---|---|---|
| end | Yes | |
| url | Yes | |
| count | Yes | |
| start | Yes | |
| entries | Yes | |
| returned | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety profile is covered. The description adds real value by declaring the coverage universe (only 390 US companies) and by explaining that dates may be 'confirmed or estimated' and results appear only 'once out' — semantics an agent could not infer from 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?
The payload is front-loaded into one dense sentence that leads with the resource and scope before listing fields, and the final sentence gives the one actionable filter. It is somewhat clause-heavy but every clause carries information; no filler 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 and parameter documentation is complete, so the description need not explain return values, and it correctly focuses on what the data represents (estimates vs. actuals, confirmed vs. estimated). Minor residual gaps — pagination behavior via `limit` and the 'larger companies first' ordering — are covered by the schema rather than the description.
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 ranges, defaults, and mutual exclusivity of `month` vs `from`. The description only restates that `symbol` filters to one ticker and that a month or a date range is accepted, adding essentially no syntax or format detail beyond structured fields; 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 resource and verb ('companies reporting earnings') and enumerates exactly what the tool surfaces: the day, BMO/AMC timing, EPS and revenue estimates, confirmed vs. estimated status, actual vs. consensus, and beat streak. It also states the covered universe (the 390 Portfolio Terminal companies), which lets an agent distinguish it from dividend_calendar and analyze_ticker 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?
It explains that `symbol` narrows to one ticker and that reporting can be scoped to a month or a date range, which implies usage, but never states when to choose this over sibling tools such as dividend_calendar or analyze_ticker. No exclusions or preconditions are given beyond the schema's note that `from` supersedes `month`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
etf_holdingsEverything an ETF holdsARead-onlyIdempotentInspect
An ETF's or index fund's holdings from the issuer's full file (or its latest SEC N-PORT report for funds outside the catalog): the largest lines with their weights, the sector mix, and how concentrated it is (weight of the top 10, how many names make up half the fund, effective number of holdings). Share classes of one fund (VFIAX → VOO) resolve to its file.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many holdings, largest first to return (1–100, default 25). | |
| ticker | Yes | The fund ticker, e.g. "VOO", "QQQ", "SCHD", "AVUV". |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| via | Yes | |
| asOf | Yes | |
| name | Yes | |
| count | Yes | |
| issuer | Yes | |
| source | Yes | |
| symbol | Yes | |
| sectors | Yes | |
| holdings | Yes | |
| sourceUrl | Yes | |
| concentration | Yes |
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 real value beyond that: it discloses the dual data source and the fallback condition, plus the derived concentration metrics, which an agent would not infer from annotations alone.
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?
A single front-loaded sentence with no filler, and the core scope comes first. It is dense but each clause (source, contents, metrics, share-class rule) earns its place; only the parenthetical metric list is slightly compressed.
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 explain return structure, yet it still usefully enumerates the payload categories. For a two-parameter, read-only lookup tool this covers what an agent needs to call it correctly; only explicit sibling routing 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%, and both parameters are fully documented in the schema (ticker examples, limit range and ordering). The description's mention of 'the largest lines with their weights' only marginally reinforces the largest-first ordering already stated in the limit parameter, 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 (an ETF's or index fund's holdings) and enumerates what comes back: largest lines with weights, sector mix, and concentration stats. It also names the fallback data source (issuer file vs. SEC N-PORT) and the share-class resolution rule, which clearly separates it from siblings like etf_overlap, who_holds, and fund_fees.
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?
Usage context is implied through the data-source fallback (issuer file first, SEC N-PORT for funds outside the catalog) and the share-class resolution behavior. However, there is no explicit guidance on when to pick this over etf_overlap or who_holds, and no exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
etf_overlapHow much two ETFs overlapARead-onlyIdempotentInspect
How much of two ETFs is the same money: overlap by weight (the sum, over companies both hold, of the smaller of the two weights), how many companies they share, what share of each fund sits in names the other also holds, and the largest shared holdings. Full issuer files, matched on ISIN. Use it for "VOO vs QQQ overlap", "is IVV the same as VOO".
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many shared holdings to return (1–50, default 10). | |
| fund_a | Yes | First fund ticker, e.g. "VOO". | |
| fund_b | Yes | Second fund ticker, e.g. "QQQ". |
Output Schema
| Name | Required | Description |
|---|---|---|
| a | Yes | |
| b | Yes | |
| url | Yes | |
| aInB | Yes | |
| asOf | Yes | |
| bInA | Yes | |
| onlyA | Yes | |
| onlyB | Yes | |
| shared | Yes | |
| overlap | Yes | |
| verdict | Yes | |
| sharedCount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the bar is lower. The description nonetheless adds genuine behavioral context: the overlap is computed from full issuer holdings files matched on ISIN, which tells the agent the numbers are point-in-time holdings-based rather than price-based, and that tickers must be resolvable by ISIN.
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?
Two sentences, front-loaded with the definition of the headline metric and its formula in parentheses, then data provenance, then example queries as a routing cue. No filler and nothing repeated from 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?
With an output schema present the description needn't enumerate return fields, and it instead defines the metric precisely enough to interpret those fields. The only shortfall is that it doesn't distinguish this from the closest sibling tools (compare, etf_holdings), a minor gap for a simple 3-parameter analytical tool.
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%, with each of fund_a, fund_b, and limit documented including format and bounds, so the baseline is 3. The description only lightly reinforces parameters via "the largest shared holdings" (implying limit shapes that list) without adding format or edge-case guidance 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?
Names a specific resource (two ETFs) and defines the exact computation: overlap by weight as the sum of the smaller weight over commonly held companies, plus shared count, per-fund shared share, and largest shared holdings. An agent can distinguish this from compare or etf_holdings purely from this text.
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?
Ends with quoted example intents ("VOO vs QQQ overlap", "is IVV the same as VOO") that imply when to reach for it, and the ISIN-matched full issuer file note hints at data fidelity. But it never states when NOT to use it or names the sibling (compare, etf_holdings) that handles adjacent questions, so routing 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.
fund_feesWhat your funds cost a yearARead-onlyIdempotentInspect
Computes, on the funds and amounts the user gives, what each fund's expense ratio takes a year (amount × expense ratio), the total and the weighted ratio, with the expense ratios of Portfolio Terminal's fees view (the fund's latest annual report as Yahoo Finance lists it). A fact, not a verdict: no other fund is suggested. A line that is not a fund, or whose ratio is not published, is named. Nothing is stored. Use it for "how much do my ETFs cost me a year".
| Name | Required | Description | Default |
|---|---|---|---|
| funds | Yes | One line per fund: its ticker and what is invested in it now. At most 50. | |
| currency | No | Currency of every amount (default USD). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| asOf | Yes | |
| rule | Yes | |
| funds | Yes | |
| partial | Yes | |
| currency | Yes | |
| notFunds | Yes | |
| annualCost | Yes | |
| weightedRatio | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive and open-world. The description adds meaningful behavior beyond them: the ratio provenance (Yahoo Finance's listing of the latest annual report), that no recommendation is made, and that non-fund or unpublished-ratio lines are explicitly named rather than silently dropped.
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?
Single paragraph with the computation and formula front-loaded, followed by caveats. Several parentheticals (the provenance clause especially) make it denser than strictly necessary, but no sentence is wasted.
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 no explanation; the description still covers the calculation, provenance and degradation behavior for unpublished ratios. What is missing is only minor: how the weighted ratio is computed and what happens with mixed or non-USD currencies.
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, amount, currency and the 50-item cap are all documented in the schema. The description only restates 'funds and amounts the user gives' and adds no format, currency 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?
States a precise verb and resource ('Computes ... what each fund's expense ratio takes a year'), gives the formula (amount × expense ratio), the outputs (per-fund cost, total, weighted ratio) and the data source. This is clearly distinguishable from siblings like etf_holdings or analyze_ticker.
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?
Ends with an explicit trigger phrase ('Use it for "how much do my ETFs cost me a year"') and frames itself as a fact-finder, not advice. It does not name an alternative tool or state when not to use it, so it falls short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tax_loss_harvestTax-loss harvesting before December 31ARead-onlyIdempotentInspect
Computes, on the lots the user gives (ticker, shares, price, date, account and its type), the losses a sale before December 31 would realize and what they offset, with the engine of Portfolio Terminal's "Before December 31" panel. US resident: FIFO lots per account, short vs long term, this year's realized gains, the year netted as Schedule D nets it (the $3,000 off ordinary income, the carryforward), and the wash-sale rule across every account, IRA and 401(k) included: losses it took this year, windows still open, and the first day the same security can be bought back without one (IRS Publication 550). French resident: weighted average cost across accounts at ECB rates, PEA and crypto left out, and the flat tax those losses erase against this year's net gains (CGI art. 150-0 D, 200 A). Funds on the same index are flagged, never judged "substantially identical". Current prices are fetched unless given in prices. Nothing is stored. Use it for "how much tax can my losses save before December 31", "would this be a wash sale".
| Name | Required | Description | Default |
|---|---|---|---|
| lots | Yes | Every purchase of the shares held, one per lot; add this year's sales (side "sell") with the purchases they came from, so realized gains and wash sales count. At most 300. | |
| prices | No | Current price per share by ticker, in the lots' currency, when the user gave it. Tickers left out are priced from Yahoo Finance. At most 150. | |
| carryover | No | US only: capital losses carried into this year from last year's return, in dollars, by term. | |
| residence | Yes | Where the user pays tax: US or FR (France). | |
| filing_status | No | US only: Form 1040 filing status (default single). Married filing separately caps the deduction at $1,500. |
Output Schema
| Name | Required | Description |
|---|---|---|
| us | No | |
| url | Yes | |
| asOf | Yes | |
| rows | Yes | |
| rule | Yes | |
| year | Yes | |
| leftOut | Yes | |
| currency | Yes | |
| daysLeft | Yes | |
| lossTotal | Yes | |
| notAdvice | No | |
| residence | Yes | |
| approximate | No | |
| flatTaxRate | No | |
| realizedNet | Yes | |
| taxErasable | No | |
| substantiallyIdentical | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral detail beyond the annotations: it states that nothing is stored, that current prices are fetched unless supplied in `prices`, and that wash-sale and tax-treatment rules are applied across every account including IRAs and 401(k)s. It also discloses that funds on the same index are flagged but never judged "substantially identical," which prevents the agent from overreading 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?
The purpose is front-loaded and the density is justified by the complexity of the tax rules being described. However, the main body is a long, clause-heavy sentence that could be broken up for easier scanning.
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 complex domain, rich input schema, annotations, and output schema, the description is complete enough for an agent to call the tool correctly. It covers residency-specific behavior, wash-sale handling, price fetching, and the fact that no data is stored.
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 nested lot fields, `prices`, `carryover`, `residence`, and `filing_status` are already well documented in the schema. The description adds some high-level context about the lot array and the need to include sales, but it does not add much meaning beyond the structured fields.
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 opens with a specific verb and resource: it computes realized losses on user-provided lots for a sale before December 31 and explains what those losses offset. It clearly distinguishes the US and French tax regimes and is unmistakable relative to the sibling tools, none of which are tax-loss harvesting calculators.
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: "how much tax can my losses save before December 31" and "would this be a wash sale." It does not state when not to use it or name an alternative tool, but the context is clear enough that an agent can infer appropriate use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
who_holdsWhich ETFs and famous investors hold a stockARead-onlyIdempotentInspect
Which of the 54 tracked US ETFs hold a US-listed stock (weight and rank, from each issuer's full holdings file, matched on ISIN), and which famous investors hold it in their latest SEC Form 13F (share of their reported portfolio, rank, quarter). Offline data: fast, no market call. Use it for "which ETFs hold PLTR", "does Buffett own Apple".
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | A US stock ticker, e.g. "NVDA", "BRK.B". |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| etfs | Yes | |
| symbol | Yes | |
| investors | Yes | |
| etfsTracked | Yes | |
| investorsTracked | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/closed-world, and the description adds genuinely new context: data comes from offline issuer files, no market call is made, and 13F figures reflect the latest reported quarter. It stops short of noting lag or coverage caveats (e.g. 13F reporting delay, ETFs outside the 54), which would push it to 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-loaded with the core answer, then the data provenance, then usage examples — a logical order with no filler. The parenthetical clauses are dense but each carries real information; the sentence is long enough that a skim may miss the 13F qualifier.
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 and rich annotations, the description only needs to supply scope and provenance, and it does: 54-ETF universe, ISIN matching, latest-quarter 13F, offline/fast. Nothing required to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 goes further by constraining the input to a US-listed stock and disclosing that matching happens on ISIN, which tells the caller that non-US listings or ambiguous tickers may not resolve. No format or edge-case guidance for tickers like 'BRK.B' beyond the schema examples.
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 question-answering resource: which of 54 tracked US ETFs hold a US-listed stock, plus which famous investors hold it per latest 13F. It names the data sources (issuer holdings files, ISIN match, 13F) and scopes the universe, so an agent can distinguish it from etf_holdings (forward lookup) and analyze_ticker 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 trigger phrases ('which ETFs hold PLTR', 'does Buffett own Apple') that map cleanly onto the tool's purpose. It does not explicitly name a sibling to avoid (e.g. etf_holdings for the reverse direction), so the boundary is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
withholding_checkDividend tax withheld abroadARead-onlyIdempotentInspect
Computes, on the dividends the user gives (a year of dividends, gross, by payer: a ticker such as "NESN.SW" or a country code), the tax each payer's country keeps at source, the treaty rate, and what was withheld above it over 12 months, which only that country refunds on a claim; for a French resident, also the treaty part France credits on form 2047. Same engine as Portfolio Terminal's Income and Pro tabs: statutory rates as of 2026, a US dividend at 15% (W-8BEN on file), European-listed funds paying no withholding. Countries outside its table are named, never guessed. Nothing is stored. Use it for "how much Swiss tax do I lose on Nestlé dividends", "which of my dividends are over-withheld".
| Name | Required | Description | Default |
|---|---|---|---|
| currency | No | Currency of every amount (default EUR for FR, USD otherwise). | |
| dividends | Yes | One line per payer: a year of dividends, gross (before any tax). At most 100. | |
| residence | Yes | Where the user pays tax: FR (France), US, or other (the usual 15% treaty rate is used). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| asOf | Yes | |
| rows | Yes | |
| rule | Yes | |
| gross | Yes | |
| credit | Yes | |
| excess | Yes | |
| currency | Yes | |
| withheld | Yes | |
| notAdvice | Yes | |
| residence | Yes | |
| uncovered | Yes | |
| notTaxedAbroad | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive and closed-world; the description reinforces this with "Nothing is stored" and "Countries outside its table are named, never guessed", the latter directly corroborating openWorldHint=false. It also discloses methodology an agent could not infer: statutory rates as of 2026, US 15% with W-8BEN, European funds paying no withholding.
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 computation in the first clause and keeps every later detail (rates, edge cases, no storage) relevant. It is dense and slightly run-on across three long sentences, which keeps it just under a 5.
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 no explanation, and the description covers the remaining gaps an agent needs: rate assumptions, unknown-country handling, no persistence, and residence-specific behavior. Nothing required to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 meaning beyond the schema by explaining that dividends are gross annual figures identified by ticker or country code and by describing the residence-dependent French 2047 credit treatment. This goes beyond restating field definitions.
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 (computes) and a precisely scoped resource: source withholding, treaty rate, and over-withholding on a per-payer dividend list, plus the French 2047 credit. An agent can tell this apart from sibling tax tools like tax_loss_harvest 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?
Provides concrete user-question triggers ("how much Swiss tax do I lose on Nestlé dividends", "which of my dividends are over-withheld") that make the intended use unambiguous. It stops short of naming an explicit alternative or a when-not-to-use condition, so it sits below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
- First observed
analyze_ticker - First observed
compare - First observed
dividend_calendar - First observed
earnings_calendar - First observed
etf_holdings - First observed
etf_overlap - First observed
fund_fees - First observed
tax_loss_harvest - First observed
who_holds - First observed
withholding_check
Related MCP Connectors
Clarity on your investments: performance, holdings, dividends, ETF look-through and transactions.
Stocks, crypto, FX, and portfolio math in one tool — no per-source API juggling.
Portfolio-aware finance tools: drift, risk, earnings, benchmarks, news, tax harvesting
Dividend portfolio tracking and planning for US and EU markets: income, safety, Spain-aware taxes.
Related MCP Servers
FlicenseNot gradedqualityDmaintenanceTax-aware retirement planning for Canada and the US. CPP/OAS and Social Security timing, RRSP/TFSA/401k/IRA projections, Monte Carlo simulation, withdrawal order optimization, and historical backtesting against 150 years of market data.2-- AlicenseAqualityAmaintenanceDeterministic US equity-compensation tax optimizer. Six tools cover ISO/AMT exercise scheduling, NSO sell-vs-hold, RSU vest-and-sell, single-stock concentration, protective put / zero-cost collar pricing, and Section 1202 QSBS qualification. Federal plus 50-state plus DC tax math.843 npm6MIT
- FlicenseBqualityBmaintenanceEnables retail investors to create calendar-based investment plans, review portfolios, deploy cash, rebalance with fees in mind, and pick stocks using deterministic engines and public data, generating suggested orders only.341-
- AlicenseNot gradedqualityDmaintenanceEnables comprehensive analysis of Interactive Brokers portfolios through automated data fetching and multi-dimensional analytics. Provides performance, tax, cost, risk, and bond analysis across multiple accounts with rich reporting capabilities.2MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.