Server definition
- Hash
- sha256:8d3721f4981da7dcc4c3ae8dc6309beeb0f72c1eeb613eee6336eedeb96cc0b1
- What it is
- What a remote MCP server returned when asked what it offers: 21 tools
The blob, as servednamed by its sha256
{
"instructions": null,
"tools": [
{
"description": "Compare 2–4 stocks side by side (the /compare view): snapshot, dividend\ngrowth, Quantic reads, valuation, momentum, financial health, schedule and\ncommunity metrics — with the winning column flagged per row (`best`). Pass a\nlist of tickers, e.g. [\"KO\",\"PEP\",\"MO\"].\n",
"inputSchema": {
"properties": {
"symbols": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"symbols"
],
"type": "object"
},
"name": "compare_stocks",
"outputSchema": null
},
{
"description": "Upcoming ex-dividend dates across the dividend universe over the next `days`\ndays (default 45, max 120), soonest first. Public — buy before the ex-date to\nreceive the next dividend.\n",
"inputSchema": {
"properties": {
"days": {
"type": "integer"
}
},
"type": "object"
},
"name": "dividend_calendar",
"outputSchema": null
},
{
"description": "The signed-in user's received (paid) dividends, newest first. Each row carries\nthe symbol, pay date, shares, per-share and gross amount, withholding tax, net\namount and currency. Optionally filter by `symbol` (e.g. \"AAPL\") and a\n`from`/`to` date window (ISO-8601, e.g. \"2024-01-01\"), and/or pass `portfolio`\n(one of your portfolio names or slugs, case-insensitive — see\n`list_portfolios`) to narrow to that portfolio; omitted, dividends aggregate\nacross all your portfolios (rows then carry a `portfolio` name when you have\nmore than one). Private to the caller.\n",
"inputSchema": {
"properties": {
"from": {
"type": "string"
},
"portfolio": {
"type": "string"
},
"symbol": {
"type": "string"
},
"to": {
"type": "string"
}
},
"type": "object"
},
"name": "get_dividends",
"outputSchema": null
},
{
"description": "The signed-in user's current holdings: each position's symbol, name, shares\nheld, average cost per share, trading currency and sector. This is cost-basis\ndata from the ledger (no live prices) — use `get_valuation` for current market\nvalue, gain/loss and yield. Optionally pass `portfolio` (one of your portfolio\nnames or slugs, case-insensitive — see `list_portfolios`) to narrow to that\nportfolio; omitted, holdings aggregate across all your portfolios (rows then\ncarry a `portfolio` name when you have more than one). Private to the caller.\n",
"inputSchema": {
"properties": {
"portfolio": {
"type": "string"
}
},
"type": "object"
},
"name": "get_holdings",
"outputSchema": null
},
{
"description": "Why the signed-in user's dividend income changed: the trailing 12 months\nagainst the 12 before them, split into what the companies did, what the user\ndid, what the tax office took and what the exchange rate moved.\n\nThe four components sum to the headline change by construction, so they can be\nquoted together without reconciling them yourself. Each is in the user's\npreferred currency and **net of the withholding their broker recorded**, the\nsame basis `get_income_outlook` reports.\n\n`organic` is the part that came from raises alone — income the companies added\nwithout the user putting in another cent. That is the number worth leading\nwith: a year where income grew because savings went in is a different\nachievement from one where it grew because dividends were raised, and only the\nsecond compounds on its own.\n\nReturns `null` when the ledger doesn't reach back far enough to cover both\nwindows. That is a refusal, not an error: comparing a part-year against a full\none shows a collapse that never happened, so say the history is too short\nrather than reporting a change.\n\nTwo honesty flags worth relaying when non-zero:\n\n * `withholding_newly_reported` — holdings whose earlier window recorded no\n withholding and whose later one did. Their withholding line reflects the\n broker starting to report the tax, not the tax changing.\n * `unresolved_fx` — payments whose historical rate couldn't be resolved.\n Those fall back to today's rate and so contribute nothing to the currency\n line, rather than inventing a move.\n\nOptionally pass `portfolio` (one of your portfolio names or slugs,\ncase-insensitive — see `list_portfolios`); omitted, it aggregates across all\nyour portfolios. Private to the caller.\n",
"inputSchema": {
"properties": {
"portfolio": {
"type": "string"
}
},
"type": "object"
},
"name": "get_income_attribution",
"outputSchema": null
},
{
"description": "The signed-in user's forward dividend income outlook, in their preferred\ncurrency: projected annual income at the current rate (gross and net of\nestimated foreign withholding tax), the income-weighted trailing dividend\ngrowth, the current yield, the top income-contributing holdings (gross and\nnet per holding, ranked on the net basis when withholding applies; with each\none's growth, 5-year CAGR and consecutive-increase streak), and a year-by-year\nincome projection (gross and net).\n\nAlso `income_year` — the shape of a typical year: projected income per\ncalendar month, which months sit below the monthly average (\"thin\") or\ncollect nothing at all, and the share of the year landing in its three\nbiggest months (0.25 would be perfectly even; higher is lumpier). Most\ncompanies pay quarterly on one of three cycles, so portfolios drift towards\ncollecting heavily in March/June/September/December, which matters to anyone\nspending the income rather than reinvesting it. Absent for portfolios too\nsmall for the shape to mean anything.\n\nSet `years` for the projection horizon\n(default 10, max 50) and `drip: true` to compound reinvested dividends.\nOptionally pass `portfolio` (one of your portfolio names or slugs,\ncase-insensitive — see `list_portfolios`) to project just that portfolio;\nomitted, the outlook aggregates across all your portfolios.\nPrivate to the caller.\n",
"inputSchema": {
"properties": {
"drip": {
"type": "boolean"
},
"portfolio": {
"type": "string"
},
"years": {
"type": "integer"
}
},
"type": "object"
},
"name": "get_income_outlook",
"outputSchema": null
},
{
"description": "The signed-in user's trades / cash movements (buys, sells, …), newest first.\nEach row carries the symbol, date, type, quantity, price, total amount, fee\nand currency. Optionally filter by `symbol` (e.g. \"AAPL\") and a `from`/`to`\ndate window (ISO-8601, e.g. \"2024-01-01\"), and/or pass `portfolio` (one of\nyour portfolio names or slugs, case-insensitive — see `list_portfolios`) to\nnarrow to that portfolio; omitted, movements aggregate across all your\nportfolios (rows then carry a `portfolio` name when you have more than one).\nPrivate to the caller.\n",
"inputSchema": {
"properties": {
"from": {
"type": "string"
},
"portfolio": {
"type": "string"
},
"symbol": {
"type": "string"
},
"to": {
"type": "string"
}
},
"type": "object"
},
"name": "get_movements",
"outputSchema": null
},
{
"description": "The signed-in user's options positions — the income \"wheel\" of sold puts and\ncalls — newest first. Each row carries the symbol, put/call type, strike,\nexpiry, contracts, premium collected, fees, status (open/expired/assigned/\nclosed), net premium, break-even price, annualized premium yield (ratio) and\ncurrency. Optionally filter by `symbol` (e.g. \"AAPL\")\nand `status` (\"open\", \"history\" for everything resolved, or \"all\"), and/or\npass `portfolio` (one of your portfolio names or slugs, case-insensitive —\nsee `list_portfolios`) to narrow to that portfolio; omitted, positions\naggregate across all your portfolios (rows then carry a `portfolio` name when\nyou have more than one). Premium is received income alongside dividends.\nPrivate to the caller.\n",
"inputSchema": {
"properties": {
"portfolio": {
"type": "string"
},
"status": {
"type": "string"
},
"symbol": {
"type": "string"
}
},
"type": "object"
},
"name": "get_options",
"outputSchema": null
},
{
"description": "How the signed-in user's portfolio has actually done — an annualized\n**money-weighted** return (XIRR) in their preferred currency, including\ndividends received and any sales, next to what the same money moved on the\nsame days would have made in broad index funds.\n\nMoney-weighted, not time-weighted: it counts *when* each amount went in, so\nmoney invested before a good year earns more of the credit than money added\nat the end. Every flow is converted at the exchange rate published on its\nown date, so currency movement is part of the answer — unlike `get_realized`,\nwhich deliberately never converts because it measures a position rather than\na portfolio.\n\n`status` says whether a number was produced:\n\n * `\"ok\"` — `rate_pct` and the comparison are present.\n * `\"insufficient_ledger\"` — no holding has any trades behind it, so there\n is nothing to measure a return on. Ask the user to import their broker's\n trades.\n * `\"awaiting_rates\"` — historical exchange rates for the years the ledger\n spans are still being fetched; they arrive shortly.\n\n**`coverage` matters when reporting this.** Holdings whose shares were typed\nin by hand have no purchase behind them, so they are excluded from both the\nflows and the value: the rate describes only the part with trade history,\nand `coverage.value_pct` says how much of the portfolio that is. Say so\nrather than presenting the figure as the whole portfolio's.\n\nBenchmarks are accumulating funds, whose price already includes reinvested\ndividends, so both sides are total return. They are priced monthly, so treat\nthe comparison as a direction rather than a decimal. Private to the caller.\n",
"inputSchema": {
"properties": {
"portfolio": {
"type": "string"
}
},
"type": "object"
},
"name": "get_performance",
"outputSchema": null
},
{
"description": "The signed-in user's complete portfolio snapshot in one call: current holdings\n(shares + average cost), dividends received, trades (movements) and radar\nwatchlist with target prices. Their own private data, including amounts. Use\nthis for a full overview/backup; for a specific slice (filtered dividends or\nmovements, current market value, income projection) prefer the focused tools\n(`get_dividends`, `get_movements`, `get_valuation`, `get_income_outlook`).\nOptionally pass `portfolio` (one of your portfolio names or slugs,\ncase-insensitive — see `list_portfolios`) to narrow to that portfolio;\nomitted, the snapshot aggregates across all your portfolios (ledger rows then\ncarry a `portfolio` name when you have more than one).\n",
"inputSchema": {
"properties": {
"portfolio": {
"type": "string"
}
},
"type": "object"
},
"name": "get_portfolio",
"outputSchema": null
},
{
"description": "The signed-in user's radar (watchlist): stocks they're tracking to buy or\nsell, with their target buy/sell prices, notes and currency. Private to the\ncaller. Use `get_stock` to fetch the current price for any of these symbols.\n",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "get_radar",
"outputSchema": null
},
{
"description": "What the signed-in user's sales actually realized — the positions they've\nsold out of, and the partial sales of positions they still hold. Each row\ncarries proceeds, the cost basis those proceeds consumed, and the **signed**\n`result` (negative when sold below the average cost), plus the holding\nwindow, trade count and dividends collected while held. Pass\n`status: \"closed\"` for only the positions that were fully sold out, or\n`portfolio` (a portfolio name or slug — see `list_portfolios`) to narrow to\none; omitted, it covers every portfolio. Also returns per-currency totals.\n\nResults use **average cost** and are never converted between currencies:\neach figure stays in the currency the shares traded in. This is a measure of\nhow a position performed, not a tax calculation — most European tax rules\nmatch each sale to specific purchases (FIFO) instead. Private to the caller.\n",
"inputSchema": {
"properties": {
"portfolio": {
"type": "string"
},
"status": {
"type": "string"
}
},
"type": "object"
},
"name": "get_realized",
"outputSchema": null
},
{
"description": "Look up a stock or ETF by ticker (e.g. \"KO\", \"SCHD\"): its dividend profile,\nlive quote, dividend safety, balance-sheet leverage, the momentum & value\nscores and the snowflake radar — and, for a signed-in caller, the full\n\"Valuation & strategy\" read (fair value, two-stage DDM, margin of safety,\nsector-relative rank, dividend doubling time, max drawdown).\n",
"inputSchema": {
"properties": {
"symbol": {
"type": "string"
}
},
"required": [
"symbol"
],
"type": "object"
},
"name": "get_stock",
"outputSchema": null
},
{
"description": "Fetch Quantic's AI-generated research deep-dive for a stock — the narrative\nbrief (overview, dividend history, safety, risks, watch items). Optional\n`locale` (falls back to English). Returns `found: false` when no article has\nbeen generated for the stock yet.\n",
"inputSchema": {
"properties": {
"locale": {
"type": "string"
},
"symbol": {
"type": "string"
}
},
"required": [
"symbol"
],
"type": "object"
},
"name": "get_stock_research",
"outputSchema": null
},
{
"description": "A tax year assembled from the signed-in user's own ledger: the dividends\nreceived (gross, withheld at source, net — per payment and per source\ncountry) and the disposals made (matched first-in first-out, with Spain's\ntwo-month rule applied to losses). Foreign currency is converted to euros\nat the ECB's official daily reference rate for each date — a dividend at\nits pay date, and a sale's cost and proceeds at their own separate dates,\nso the currency movement between buying and selling is part of the result.\n\nPass `year` (defaults to the last completed one). Private to the caller.\n\n**Beta, and unevenly scoped.** The dividends section works for any tax\nresidence. The disposals section is modelled for **Spain only** so far and\nreturns `supported: false` for anyone else — say so rather than implying\nthe user has no sales.\n\n`other_income` is cash that is income but not a dividend — today only\npayments in lieu of a dividend, paid by the borrower of a lent share\ninstead of the company. It is reported and deliberately **not\nclassified**: no casilla, and it must never be added to the dividend\ntotals or described as dividend income.\n\n`other_costs` is what the broker charged the account — today only margin\ninterest. It is **not deductible** in a Spanish declaration, and that is\na rule rather than an open question: say so plainly if asked, and never\nsuggest subtracting it from income or folding it into a cost basis.\n\n**This is the input to a declaration, not a declaration.** No tax is\ncomputed. Every figure carries flags where the data is incomplete — a\nmissing exchange rate, a broker that never reports withholding, a position\nthat sold more shares than its recorded purchases account for. Those flags\nare the point: relay them, and relay the disclaimer, whenever you relay a\nnumber from here.\n",
"inputSchema": {
"properties": {
"portfolio": {
"type": "string"
},
"year": {
"type": "integer"
}
},
"type": "object"
},
"name": "get_tax_report",
"outputSchema": null
},
{
"description": "The signed-in user's portfolio valued at current market prices, in their\npreferred display currency. Returns the total market value and cost basis\n(so total − cost is the unrealised gain/loss), the yield on cost and current\nyield, a sector breakdown, and a per-position list with each holding's market\nvalue, cost and forward annual dividend income. Income is reported both gross\nand net of estimated foreign withholding tax (from the user's tax residence),\nand the health block includes a per-country geography breakdown. Uses live\nquotes; positions whose price can't be resolved have null value/income.\nOptionally pass `portfolio` (one of your portfolio names or slugs,\ncase-insensitive — see `list_portfolios`) to value just that portfolio;\nomitted, the valuation aggregates across all your portfolios.\nPrivate to the caller.\n",
"inputSchema": {
"properties": {
"portfolio": {
"type": "string"
}
},
"type": "object"
},
"name": "get_valuation",
"outputSchema": null
},
{
"description": "The signed-in user's portfolios: each one's name and whether it is the\ndefault; publicly shared portfolios also carry their URL `slug`. Pass a\nname (or slug) as the `portfolio` param of the ledger tools\n(`get_holdings`, `get_portfolio`, `get_movements`, `get_dividends`,\n`get_options`, `get_valuation`, `get_income_outlook`) to narrow them to\none portfolio; without it they aggregate across all portfolios. Private\nto the caller.\n",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "list_portfolios",
"outputSchema": null
},
{
"description": "Fetch a curated dividend list by `slug`. Slugs: dividend-aristocrats,\ndividend-kings, monthly-dividend-stocks, highest-yield-dividend-stocks,\nsafest-reits, dividend-growth-stocks, low-debt-dividend-stocks,\nlarge-cap-safe-dividend-stocks, utility-dividend-stocks,\nhealthcare-dividend-stocks, consumer-staples-dividend-stocks,\nenergy-dividend-stocks, european-dividend-stocks, best-dividend-etfs,\nmonthly-dividend-etfs, best-momentum-dividend-stocks,\nundervalued-dividend-stocks. Returns the list's title, intro and ranked\nstocks (compact rows — call get_stock for a full read).\n\nSet `eu_only` to keep only holdings listed on a European exchange. This\nmatters most on the two fund lists: a US-listed ETF has no key information\ndocument under European rules, so a European broker refuses the order — most\nof the funds in `best-dividend-etfs` are US-listed and unbuyable from Europe.\nUse it whenever the person asking is investing from Europe.\n",
"inputSchema": {
"properties": {
"eu_only": {
"type": "boolean"
},
"slug": {
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"name": "list_stocks",
"outputSchema": null
},
{
"description": "Find dividend stocks & ETFs matching criteria — the screener behind\nquantic.finance. Filter by `sector`, `currency`, yield range\n(`min_yield`/`max_yield`, on the 5-year average), `min_cagr5y`, `min_streak`,\n`frequency`, leverage (`max_de`), `min_current` ratio, `min_market_cap`,\ndividend-`safety` (\"safe\"/\"watch\"/\"at_risk\"), `min_rating` (Quantic's\ncomposite 0–10 read on the company), `type` (\"equity\"/\"etf\"), or the\n`aristocrat`/`reit`/`has_ffo`/`exclude_traps` toggles; `sort` by \"quality\"\n(the default — the 0–10 rating), \"yield\", \"cagr5y\", \"streak\",\n\"ffo_payout_asc\", \"momentum\" or \"value\". Returns up to 100 compact rows —\ncall `get_stock` for a full read of any match.\n\nTwo notes worth passing on to whoever asked. **Sorting by yield alone is how\npeople find yield traps**, which is why quality leads by default. And\n`exclude_traps` drops what Quantic has already judged at risk while KEEPING\nstocks it has never assessed — unassessed is not the same as dangerous, so a\nresult set is never quietly narrowed to only what happens to have been\nscanned.\n",
"inputSchema": {
"properties": {
"aristocrat": {
"type": "boolean"
},
"currency": {
"type": "string"
},
"exclude_traps": {
"type": "boolean"
},
"frequency": {
"type": "string"
},
"has_ffo": {
"type": "boolean"
},
"max_de": {
"type": "number"
},
"max_yield": {
"type": "number"
},
"min_cagr5y": {
"type": "number"
},
"min_current": {
"type": "number"
},
"min_market_cap": {
"type": "number"
},
"min_rating": {
"type": "number"
},
"min_streak": {
"type": "integer"
},
"min_yield": {
"type": "number"
},
"reit": {
"type": "boolean"
},
"safety": {
"type": "string"
},
"sector": {
"type": "string"
},
"sort": {
"type": "string"
},
"type": {
"type": "string"
}
},
"type": "object"
},
"name": "screen_stocks",
"outputSchema": null
},
{
"description": "Options worth selling on the wheel, ranked by company quality first and\npremium second — the same order the `/options/wheel` screen uses.\n\nTwo lenses via `side`: `\"put\"` (the default) lists quality dividend payers\nthe caller does **not** hold, where a cash-secured put gets paid to wait for\na price they'd accept; `\"call\"` lists holdings large enough to cover a\ncontract once shares already pledged to open calls are set aside.\n\nRows are **not priced** unless `price: true`. Listing costs nothing;\npricing fetches a live option chain per symbol, so it is capped by `limit`\n(default 5, max 10) and should be asked for only when the caller actually\nwants numbers. Securities with no listed options come back\n`chain_status: \"no_chain\"` — a fact about the security, not a failure, and\nmost European listings land there.\n\nPriced put rows carry the period and annualized return, the downside buffer,\nthe effective cost basis if assigned, the yield on cost that basis would\ngive, and the maximum loss. Priced call rows carry the return if called\naway, the upside forfeited, whether the strike clears the holding's cost\nbasis, and whether a dividend goes ex inside the contract — the usual reason\na covered call is exercised early.\n\n**This is not investment advice.** Every response carries a `disclaimer`,\nverbatim rather than paraphrased, and it must be relayed rather than\nsummarized away — as must the maximum loss beside any return quoted.\nPrivate to the caller.\n",
"inputSchema": {
"properties": {
"limit": {
"type": "integer"
},
"portfolio": {
"type": "string"
},
"price": {
"type": "boolean"
},
"side": {
"type": "string"
}
},
"type": "object"
},
"name": "screen_wheel",
"outputSchema": null
},
{
"description": "Search dividend stocks by ticker or company name (e.g. \"coca\", \"AAPL\").\nPublic — returns up to ~10 matches with their symbols.\n",
"inputSchema": {
"properties": {
"query": {
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"name": "search_stocks",
"outputSchema": null
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:8d3721f4981da7dcc4c3ae8dc6309beeb0f72c1eeb613eee6336eedeb96cc0b1 | sha256sum