Portfolio Terminal
Dated ETF, stock and calendar data, plus tax-loss, withholding and fee math on your holdings.
¿Debería usar esto?
Calidad y seguridad
Basado en el análisis automatizado de las definiciones de herramientas y el cumplimiento del protocolo.
Costo de contexto
Este es el número aproximado de tokens que se consumen cada vez que las herramientas del servidor se cargan en el contexto de un modelo. Los recuentos más altos reducen la atención disponible para otras tareas.
Instalar
Instalación con un clic
Agrega esto a tu archivo `claude_desktop_config.json`:
{
"mcpServers": {
"portfolio-terminal": {
"url": "https://portfolio-terminal.com/api/mcp"
}
}
}Puntos de conexión remotos
https://portfolio-terminal.com/api/mcpstreamable-httpQué puede hacer
Inventario de herramientas
Herramientas (10)
🟢analyze_ticker(ticker)
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".
Esquema de entrada
{
"type": "object",
"properties": {
"ticker": {
"type": "string",
"description": "The ticker as listed in the US (\"NVDA\", \"VOO\", \"BRK.B\"), a coin (\"BTC\" or \"BTC-USD\") or a future (\"GC=F\" for gold).",
"minLength": 1,
"maxLength": 20,
"pattern": "^[A-Za-z0-9.^=\\-]{1,20}$",
"examples": [
"NVDA",
"VOO",
"BRK.B",
"BTC"
]
}
},
"required": [
"ticker"
],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"symbol": {
"type": "string"
},
"name": {
"type": "string"
},
"kind": {
"type": "string",
"enum": [
"stock",
"crypto",
"commodity"
]
},
"sector": {
"type": "string"
},
"asOf": {
"type": "string"
},
"url": {
"type": "string"
},
"keyFacts": {
"type": "array",
"items": {
"type": "string"
}
},
"chart": {
"type": [
"object",
"null"
]
},
"etfHolders": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string"
},
"url": {
"type": "string"
},
"detail": {
"type": "string"
}
},
"required": [
"label",
"url",
"detail"
]
}
},
"investors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string"
},
"url": {
"type": "string"
},
"detail": {
"type": "string"
}
},
"required": [
"label",
"url",
"detail"
]
}
},
"research": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"url": {
"type": "string"
},
"date": {
"type": "string"
}
},
"required": [
"title",
"url",
"date"
]
}
},
"comparisons": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"label",
"url"
]
}
}
},
"required": [
"symbol",
"name",
"kind",
"asOf",
"url",
"keyFacts"
]
}🟢who_holds(ticker)
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".
Esquema de entrada
{
"type": "object",
"properties": {
"ticker": {
"type": "string",
"description": "A US stock ticker, e.g. \"NVDA\", \"BRK.B\".",
"minLength": 1,
"maxLength": 20,
"pattern": "^[A-Za-z0-9.^=\\-]{1,20}$",
"examples": [
"NVDA",
"AAPL",
"BRK.B"
]
}
},
"required": [
"ticker"
],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"symbol": {
"type": "string"
},
"url": {
"type": "string"
},
"etfsTracked": {
"type": "integer"
},
"etfs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fund": {
"type": "string"
},
"issuer": {
"type": "string"
},
"weight": {
"type": "number"
},
"rank": {
"type": "integer"
},
"holdings": {
"type": "integer"
},
"asOf": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"fund",
"issuer",
"weight",
"rank",
"holdings",
"asOf",
"url"
]
}
},
"investorsTracked": {
"type": "integer"
},
"investors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"firm": {
"type": "string"
},
"percent": {
"type": "number"
},
"rank": {
"type": "integer"
},
"positions": {
"type": "integer"
},
"quarter": {
"type": "string"
},
"filed": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"name",
"firm",
"percent",
"rank",
"positions",
"quarter",
"filed",
"url"
]
}
}
},
"required": [
"symbol",
"url",
"etfsTracked",
"etfs",
"investorsTracked",
"investors"
]
}🟢etf_holdings(ticker, limit)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"ticker": {
"type": "string",
"description": "The fund ticker, e.g. \"VOO\", \"QQQ\", \"SCHD\", \"AVUV\".",
"minLength": 1,
"maxLength": 20,
"pattern": "^[A-Za-z0-9.^=\\-]{1,20}$",
"examples": [
"VOO",
"QQQ",
"SCHD"
]
},
"limit": {
"type": "integer",
"description": "How many holdings, largest first to return (1–100, default 25).",
"minimum": 1,
"maximum": 100,
"default": 25
}
},
"required": [
"ticker"
],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"symbol": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"issuer": {
"type": "string"
},
"asOf": {
"type": "string"
},
"source": {
"type": "string"
},
"sourceUrl": {
"type": "string"
},
"via": {
"type": [
"string",
"null"
]
},
"count": {
"type": "integer"
},
"url": {
"type": "string"
},
"concentration": {
"type": "object",
"properties": {
"top10": {
"type": "number"
},
"toHalf": {
"type": "integer"
},
"effective": {
"type": "number"
}
},
"required": [
"top10",
"toHalf",
"effective"
]
},
"sectors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"sector": {
"type": "string"
},
"weight": {
"type": "number"
}
},
"required": [
"sector",
"weight"
]
}
},
"holdings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ticker": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"weight": {
"type": "number"
},
"sector": {
"type": [
"string",
"null"
]
}
},
"required": [
"ticker",
"name",
"weight",
"sector"
]
}
}
},
"required": [
"symbol",
"name",
"issuer",
"asOf",
"source",
"sourceUrl",
"via",
"count",
"url",
"concentration",
"sectors",
"holdings"
]
}🟢etf_overlap(fund_a, fund_b, limit)
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".
Esquema de entrada
{
"type": "object",
"properties": {
"fund_a": {
"type": "string",
"description": "First fund ticker, e.g. \"VOO\".",
"minLength": 1,
"maxLength": 20,
"pattern": "^[A-Za-z0-9.^=\\-]{1,20}$",
"examples": [
"VOO"
]
},
"fund_b": {
"type": "string",
"description": "Second fund ticker, e.g. \"QQQ\".",
"minLength": 1,
"maxLength": 20,
"pattern": "^[A-Za-z0-9.^=\\-]{1,20}$",
"examples": [
"QQQ"
]
},
"limit": {
"type": "integer",
"description": "How many shared holdings to return (1–50, default 10).",
"minimum": 1,
"maximum": 50,
"default": 10
}
},
"required": [
"fund_a",
"fund_b"
],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"a": {
"type": "string"
},
"b": {
"type": "string"
},
"overlap": {
"type": "number"
},
"verdict": {
"type": "string"
},
"sharedCount": {
"type": "integer"
},
"aInB": {
"type": "number"
},
"bInA": {
"type": "number"
},
"onlyA": {
"type": "integer"
},
"onlyB": {
"type": "integer"
},
"asOf": {
"type": "object",
"properties": {
"a": {
"type": "string"
},
"b": {
"type": "string"
}
},
"required": [
"a",
"b"
]
},
"url": {
"type": "string"
},
"shared": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ticker": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"weightA": {
"type": "number"
},
"weightB": {
"type": "number"
}
},
"required": [
"ticker",
"name",
"weightA",
"weightB"
]
}
}
},
"required": [
"a",
"b",
"overlap",
"verdict",
"sharedCount",
"aInB",
"bInA",
"onlyA",
"onlyB",
"asOf",
"url",
"shared"
]
}🟢compare(a, b)
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".
Esquema de entrada
{
"type": "object",
"properties": {
"a": {
"type": "string",
"description": "First ticker, e.g. \"SCHD\".",
"minLength": 1,
"maxLength": 20,
"pattern": "^[A-Za-z0-9.^=\\-]{1,20}$",
"examples": [
"SCHD",
"NVDA"
]
},
"b": {
"type": "string",
"description": "Second ticker, e.g. \"VIG\".",
"minLength": 1,
"maxLength": 20,
"pattern": "^[A-Za-z0-9.^=\\-]{1,20}$",
"examples": [
"VIG",
"AMD"
]
}
},
"required": [
"a",
"b"
],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"a": {
"type": "object"
},
"b": {
"type": "object"
},
"window": {
"type": "object",
"properties": {
"start": {
"type": "string"
},
"end": {
"type": "string"
},
"years": {
"type": "number"
}
},
"required": [
"start",
"end",
"years"
]
},
"correlation": {
"type": [
"number",
"null"
]
},
"headline": {
"type": "string"
},
"takeaways": {
"type": "array",
"items": {
"type": "string"
}
},
"url": {
"type": "string"
}
},
"required": [
"a",
"b",
"window",
"correlation",
"headline",
"takeaways",
"url"
]
}🟢dividend_calendar(month, from, days, symbol, limit)
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`.
Esquema de entrada
{
"type": "object",
"properties": {
"month": {
"type": "string",
"description": "A calendar month as YYYY-MM, from three months back to three months ahead. Defaults to the current month. Ignored when `from` is given.",
"pattern": "^\\d{4}-(0[1-9]|1[0-2])$",
"examples": [
"2026-10"
]
},
"from": {
"type": "string",
"description": "First day of a date range, YYYY-MM-DD (instead of `month`). Use it for \"this week\" or \"the next 10 days\".",
"pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
"examples": [
"2026-10-06"
]
},
"days": {
"type": "integer",
"description": "Length of the range that starts at `from`, in calendar days (1–31, default 10).",
"minimum": 1,
"maximum": 31,
"default": 10
},
"symbol": {
"type": "string",
"description": "Only this ticker, e.g. \"KO\".",
"minLength": 1,
"maxLength": 20,
"pattern": "^[A-Za-z0-9.^=\\-]{1,20}$",
"examples": [
"KO"
]
},
"limit": {
"type": "integer",
"description": "How many entries, earliest first to return (1–200, default 50).",
"minimum": 1,
"maximum": 200,
"default": 50
}
},
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"start": {
"type": "string"
},
"end": {
"type": "string"
},
"count": {
"type": "integer"
},
"returned": {
"type": "integer"
},
"url": {
"type": "string"
},
"entries": {
"type": "array",
"items": {
"type": "object",
"properties": {
"symbol": {
"type": "string"
},
"name": {
"type": "string"
},
"exDate": {
"type": "string"
},
"payDate": {
"type": [
"string",
"null"
]
},
"payDateEstimated": {
"type": "boolean"
},
"perShare": {
"type": "number"
},
"yieldPct": {
"type": [
"number",
"null"
]
},
"frequency": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"confirmed",
"estimated"
]
}
},
"required": [
"symbol",
"name",
"exDate",
"payDate",
"payDateEstimated",
"perShare",
"yieldPct",
"frequency",
"status"
]
}
}
},
"required": [
"start",
"end",
"count",
"returned",
"url",
"entries"
]
}🟢earnings_calendar(month, from, days, symbol, limit)
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`.
Esquema de entrada
{
"type": "object",
"properties": {
"month": {
"type": "string",
"description": "A calendar month as YYYY-MM, from three months back to three months ahead. Defaults to the current month. Ignored when `from` is given.",
"pattern": "^\\d{4}-(0[1-9]|1[0-2])$",
"examples": [
"2026-10"
]
},
"from": {
"type": "string",
"description": "First day of a date range, YYYY-MM-DD (instead of `month`). Use it for \"this week\" or \"the next 10 days\".",
"pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
"examples": [
"2026-10-06"
]
},
"days": {
"type": "integer",
"description": "Length of the range that starts at `from`, in calendar days (1–31, default 10).",
"minimum": 1,
"maximum": 31,
"default": 10
},
"symbol": {
"type": "string",
"description": "Only this ticker, e.g. \"NVDA\".",
"minLength": 1,
"maxLength": 20,
"pattern": "^[A-Za-z0-9.^=\\-]{1,20}$",
"examples": [
"NVDA"
]
},
"limit": {
"type": "integer",
"description": "How many reports, earliest first, larger companies first on the same day to return (1–200, default 50).",
"minimum": 1,
"maximum": 200,
"default": 50
}
},
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"start": {
"type": "string"
},
"end": {
"type": "string"
},
"count": {
"type": "integer"
},
"returned": {
"type": "integer"
},
"url": {
"type": "string"
},
"entries": {
"type": "array",
"items": {
"type": "object",
"properties": {
"symbol": {
"type": "string"
},
"name": {
"type": "string"
},
"date": {
"type": "string"
},
"time": {
"type": "string",
"enum": [
"before-open",
"after-close",
"unknown"
]
},
"status": {
"type": "string",
"enum": [
"reported",
"confirmed",
"estimated"
]
},
"marketCap": {
"type": [
"number",
"null"
]
},
"epsEstimate": {
"type": [
"number",
"null"
]
},
"revenueEstimate": {
"type": [
"number",
"null"
]
},
"result": {
"type": [
"object",
"null"
]
},
"beats": {
"type": [
"object",
"null"
]
}
},
"required": [
"symbol",
"name",
"date",
"time",
"status"
]
}
}
},
"required": [
"start",
"end",
"count",
"returned",
"url",
"entries"
]
}🟢tax_loss_harvest(residence, lots, prices, filing_status, carryover)
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".
Esquema de entrada
{
"type": "object",
"properties": {
"residence": {
"type": "string",
"enum": [
"US",
"FR"
],
"description": "Where the user pays tax: US or FR (France)."
},
"lots": {
"type": "array",
"description": "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.",
"minItems": 1,
"maxItems": 300,
"items": {
"type": "object",
"properties": {
"ticker": {
"type": "string",
"description": "The ticker as the broker lists it: \"NVDA\", \"VOO\", \"MC.PA\", \"IWDA.AS\".",
"minLength": 1,
"maxLength": 20,
"pattern": "^[A-Za-z0-9.^=\\-]{1,20}$",
"examples": [
"NVDA",
"VOO",
"MC.PA"
]
},
"side": {
"type": "string",
"enum": [
"buy",
"sell"
],
"description": "buy (default) for shares bought, sell for a sale already made.",
"default": "buy"
},
"quantity": {
"type": "number",
"description": "Number of shares (fractions allowed).",
"minimum": 1e-9,
"maximum": 1000000000000
},
"price": {
"type": "number",
"description": "Per share, in `currency`: what was paid for a buy, what was received for a sale.",
"minimum": 0,
"maximum": 1000000000000
},
"date": {
"type": "string",
"description": "Trade date, YYYY-MM-DD. Needed for a sale, and for wash sales and short vs long term (US). Without it a holding is valued at its cost and its term is unknown.",
"pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
"examples": [
"2025-03-14"
]
},
"fee": {
"type": "number",
"description": "Commission on this trade, in `currency` (default 0).",
"minimum": 0,
"maximum": 1000000000000
},
"account": {
"type": "string",
"description": "The account's name, e.g. \"Schwab\", \"Fidelity Roth IRA\", \"Boursorama PEA\". Lots with the same name are one account.",
"maxLength": 60
},
"account_type": {
"type": "string",
"enum": [
"taxable",
"ira",
"roth_ira",
"401k",
"pea",
"cto"
],
"description": "taxable (US brokerage), ira (traditional IRA), roth_ira, 401k (any workplace plan), pea (French PEA) or cto (French compte-titres). Default: what the account name says, else taxable/CTO."
},
"currency": {
"type": "string",
"description": "Currency of `price` and `fee` (default: the listing's currency).",
"pattern": "^[A-Za-z]{3}$",
"examples": [
"USD",
"EUR"
]
}
},
"required": [
"ticker",
"quantity",
"price"
],
"additionalProperties": false
}
},
"prices": {
"type": "array",
"description": "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.",
"maxItems": 150,
"items": {
"type": "object",
"properties": {
"ticker": {
"type": "string",
"description": "The ticker.",
"minLength": 1,
"maxLength": 20,
"pattern": "^[A-Za-z0-9.^=\\-]{1,20}$",
"examples": [
"NVDA"
]
},
"price": {
"type": "number",
"description": "Price per share now.",
"minimum": 0,
"maximum": 1000000000000
}
},
"required": [
"ticker",
"price"
],
"additionalProperties": false
}
},
"filing_status": {
"type": "string",
"enum": [
"single",
"married-joint",
"married-separate",
"head-of-household",
"surviving-spouse"
],
"description": "US only: Form 1040 filing status (default single). Married filing separately caps the deduction at $1,500."
},
"carryover": {
"type": "object",
"description": "US only: capital losses carried into this year from last year's return, in dollars, by term.",
"properties": {
"short": {
"type": "number",
"description": "Short-term carryover.",
"minimum": 0,
"maximum": 1000000000000
},
"long": {
"type": "number",
"description": "Long-term carryover.",
"minimum": 0,
"maximum": 1000000000000
}
},
"additionalProperties": false
}
},
"required": [
"residence",
"lots"
],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"residence": {
"type": "string",
"enum": [
"US",
"FR"
]
},
"asOf": {
"type": "string"
},
"year": {
"type": "integer"
},
"daysLeft": {
"type": "integer"
},
"currency": {
"type": "string"
},
"realizedNet": {
"type": "number"
},
"lossTotal": {
"type": "number"
},
"taxErasable": {
"type": [
"number",
"null"
]
},
"flatTaxRate": {
"type": [
"number",
"null"
]
},
"rows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ticker": {
"type": "string"
},
"accounts": {
"type": "array",
"items": {
"type": "string"
}
},
"shares": {
"type": "number"
},
"loss": {
"type": "number"
},
"taxErased": {
"type": [
"number",
"null"
]
},
"term": {
"type": [
"string",
"null"
]
},
"washIfSoldToday": {
"type": [
"object",
"null"
]
}
},
"required": [
"ticker",
"accounts",
"shares",
"loss"
]
}
},
"us": {
"type": [
"object",
"null"
]
},
"leftOut": {
"type": "object",
"properties": {
"pea": {
"type": "array",
"items": {
"type": "string"
}
},
"crypto": {
"type": "array",
"items": {
"type": "string"
}
},
"sheltered": {
"type": "array",
"items": {
"type": "string"
}
},
"blocked": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ticker": {
"type": "string"
},
"reason": {
"type": "string"
}
},
"required": [
"ticker",
"reason"
]
}
},
"unpriced": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"pea",
"crypto",
"sheltered",
"blocked",
"unpriced"
]
},
"approximate": {
"type": "array",
"items": {
"type": "string"
}
},
"substantiallyIdentical": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ticker": {
"type": "string"
},
"account": {
"type": "string"
},
"date": {
"type": "string"
},
"shares": {
"type": "number"
},
"index": {
"type": [
"string",
"null"
]
}
},
"required": [
"ticker",
"account",
"date",
"shares",
"index"
]
}
},
"rule": {
"type": "string"
},
"notAdvice": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"residence",
"asOf",
"year",
"daysLeft",
"currency",
"realizedNet",
"lossTotal",
"rows",
"leftOut",
"rule",
"url"
]
}🟢withholding_check(residence, currency, dividends)
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".
Esquema de entrada
{
"type": "object",
"properties": {
"residence": {
"type": "string",
"enum": [
"FR",
"US",
"other"
],
"description": "Where the user pays tax: FR (France), US, or other (the usual 15% treaty rate is used)."
},
"currency": {
"type": "string",
"description": "Currency of every amount (default EUR for FR, USD otherwise).",
"pattern": "^[A-Za-z]{3}$",
"examples": [
"USD",
"EUR"
]
},
"dividends": {
"type": "array",
"description": "One line per payer: a year of dividends, gross (before any tax). At most 100.",
"minItems": 1,
"maxItems": 100,
"items": {
"type": "object",
"properties": {
"ticker": {
"type": "string",
"description": "The payer's ticker with its exchange suffix: \"NESN.SW\", \"ALV.DE\", \"MSFT\".",
"minLength": 1,
"maxLength": 20,
"pattern": "^[A-Za-z0-9.^=\\-]{1,20}$",
"examples": [
"NESN.SW",
"ALV.DE",
"MSFT"
]
},
"country": {
"type": "string",
"description": "The payer's country, ISO code (\"CH\", \"DE\", \"US\"), when there is no ticker or it says better.",
"pattern": "^[A-Za-z]{2}$",
"examples": [
"CH",
"DE"
]
},
"kind": {
"type": "string",
"enum": [
"stock",
"fund"
],
"description": "stock (default) or fund: a fund listed in Europe pays its holders no withholding."
},
"amount": {
"type": "number",
"description": "Dividends over 12 months, gross, in `currency`.",
"minimum": 0,
"maximum": 1000000000000
}
},
"required": [
"amount"
],
"additionalProperties": false
}
}
},
"required": [
"residence",
"dividends"
],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"residence": {
"type": "string"
},
"asOf": {
"type": "string"
},
"currency": {
"type": "string"
},
"gross": {
"type": "number"
},
"withheld": {
"type": "number"
},
"excess": {
"type": "number"
},
"credit": {
"type": "number"
},
"rows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"payer": {
"type": "string"
},
"country": {
"type": "string"
},
"countryName": {
"type": "string"
},
"gross": {
"type": "number"
},
"withheldRate": {
"type": "number"
},
"treatyRate": {
"type": "number"
},
"withheld": {
"type": "number"
},
"excess": {
"type": "number"
},
"credit": {
"type": "number"
}
},
"required": [
"payer",
"country",
"countryName",
"gross",
"withheldRate",
"treatyRate",
"withheld",
"excess",
"credit"
]
}
},
"uncovered": {
"type": "array",
"items": {
"type": "string"
}
},
"notTaxedAbroad": {
"type": "array",
"items": {
"type": "string"
}
},
"rule": {
"type": "string"
},
"notAdvice": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"residence",
"asOf",
"currency",
"gross",
"withheld",
"excess",
"credit",
"rows",
"uncovered",
"notTaxedAbroad",
"rule",
"notAdvice",
"url"
]
}🟢fund_fees(currency, funds)
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".
Esquema de entrada
{
"type": "object",
"properties": {
"currency": {
"type": "string",
"description": "Currency of every amount (default USD).",
"pattern": "^[A-Za-z]{3}$",
"examples": [
"USD",
"EUR"
]
},
"funds": {
"type": "array",
"description": "One line per fund: its ticker and what is invested in it now. At most 50.",
"minItems": 1,
"maxItems": 50,
"items": {
"type": "object",
"properties": {
"ticker": {
"type": "string",
"description": "The fund's ticker: \"VOO\", \"SCHD\", \"IWDA.AS\".",
"minLength": 1,
"maxLength": 20,
"pattern": "^[A-Za-z0-9.^=\\-]{1,20}$",
"examples": [
"VOO",
"IWDA.AS"
]
},
"amount": {
"type": "number",
"description": "What the holding is worth now, in `currency`.",
"minimum": 0,
"maximum": 1000000000000
}
},
"required": [
"ticker",
"amount"
],
"additionalProperties": false
}
}
},
"required": [
"funds"
],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"asOf": {
"type": "string"
},
"currency": {
"type": "string"
},
"annualCost": {
"type": "number"
},
"weightedRatio": {
"type": [
"number",
"null"
]
},
"funds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ticker": {
"type": "string"
},
"name": {
"type": "string"
},
"amount": {
"type": "number"
},
"expenseRatio": {
"type": [
"number",
"null"
]
},
"annualCost": {
"type": [
"number",
"null"
]
}
},
"required": [
"ticker",
"name",
"amount",
"expenseRatio",
"annualCost"
]
}
},
"notFunds": {
"type": "array",
"items": {
"type": "string"
}
},
"partial": {
"type": "boolean"
},
"rule": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"asOf",
"currency",
"annualCost",
"weightedRatio",
"funds",
"notFunds",
"partial",
"rule",
"url"
]
}Comunidad
Evidencia