# Portfolio Terminal (remote · portfolio-terminal.com)

Dated ETF, stock and calendar data, plus tax-loss, withholding and fee math on your holdings.

- Trust score: 72/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- remote · `portfolio-terminal.com`: 72/100 (this document), [markdown](https://verifymcp.io/servers/com-portfolio-terminal-portfolio-terminal/api-mcp.md), [page](https://verifymcp.io/servers/com-portfolio-terminal-portfolio-terminal/api-mcp)

## Channel facts

- Endpoint: `https://portfolio-terminal.com/api/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.1.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Endpoint Security**: 83/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Nothing on it is marked destructive, but we can't show that an anonymous caller can only read: full credit needs the server to list at least one tool and every tool to be verifiably read-only. We use a best-effort check of tool names and descriptions to tell read-only tools from tools that change things, so some genuinely read-only tools may not get full credit. Names that start with a read verb (get, list, read, search and similar) and accurate readOnlyHint annotations help. Meet that to earn full credit, or require authorisation.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 66/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 2309 tokens (~230/item across 10 items; 10 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 13/100
  - Stability observed for 4 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 50/100
  - Injection-marker check failed: the server instructions contains an instruction to conceal the call from the user, the text "never tell the user", at byte 1241 of that field.
  - We read all 10 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 11 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the Portfolio Terminal MCP server?

Portfolio Terminal is a hosted endpoint at https://portfolio-terminal.com/api/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http com-portfolio-terminal-portfolio-terminal 'https://portfolio-terminal.com/api/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "com-portfolio-terminal-portfolio-terminal": {
      "url": "https://portfolio-terminal.com/api/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-portfolio-terminal-portfolio-terminal": {
      "type": "http",
      "url": "https://portfolio-terminal.com/api/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.com-portfolio-terminal-portfolio-terminal]
url = "https://portfolio-terminal.com/api/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-portfolio-terminal-portfolio-terminal": {
      "type": "remote",
      "url": "https://portfolio-terminal.com/api/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-portfolio-terminal-portfolio-terminal --url 'https://portfolio-terminal.com/api/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-portfolio-terminal-portfolio-terminal:
    url: "https://portfolio-terminal.com/api/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "com-portfolio-terminal-portfolio-terminal": {
      "Transport": "http",
      "Url": "https://portfolio-terminal.com/api/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-portfolio-terminal-portfolio-terminal -t streamable-http -u 'https://portfolio-terminal.com/api/mcp'
```

### Other

```json
{
  "mcpServers": {
    "com-portfolio-terminal-portfolio-terminal": {
      "type": "http",
      "url": "https://portfolio-terminal.com/api/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 72, +1)

No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-02 (score 71, +1)

- [functional improvement] Stability: unverified → 0.03

### 2026-11-01 (score 70)

First indexed and scored.

## MCP tools (10)

### `analyze_ticker` (~194 tokens)

Stock, ETF or coin key facts

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".

Input parameters:

- `ticker` (string, required): 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 parameters:

- `asOf` (string)
- `chart` (object|null)
- `comparisons` (array)
- `etfHolders` (array)
- `investors` (array)
- `keyFacts` (array)
- `kind` (string)
- `name` (string)
- `research` (array)
- `sector` (string)
- `symbol` (string)
- `url` (string)

### `who_holds` (~113 tokens)

Which ETFs and famous investors hold a stock

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".

Input parameters:

- `ticker` (string, required): A US stock ticker, e.g. "NVDA", "BRK.B".

Output parameters:

- `etfs` (array)
- `etfsTracked` (integer)
- `investors` (array)
- `investorsTracked` (integer)
- `symbol` (string)
- `url` (string)

### `etf_holdings` (~147 tokens)

Everything an ETF holds

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.

Input parameters:

- `limit` (integer): How many holdings, largest first to return (1–100, default 25).
- `ticker` (string, required): The fund ticker, e.g. "VOO", "QQQ", "SCHD", "AVUV".

Output parameters:

- `asOf` (string)
- `concentration` (object)
- `count` (integer)
- `holdings` (array)
- `issuer` (string)
- `name` (string|null)
- `sectors` (array)
- `source` (string)
- `sourceUrl` (string)
- `symbol` (string)
- `url` (string)
- `via` (string|null)

### `etf_overlap` (~151 tokens)

How much two ETFs overlap

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".

Input parameters:

- `fund_a` (string, required): First fund ticker, e.g. "VOO".
- `fund_b` (string, required): Second fund ticker, e.g. "QQQ".
- `limit` (integer): How many shared holdings to return (1–50, default 10).

Output parameters:

- `a` (string)
- `aInB` (number)
- `asOf` (object)
- `b` (string)
- `bInA` (number)
- `onlyA` (integer)
- `onlyB` (integer)
- `overlap` (number)
- `shared` (array)
- `sharedCount` (integer)
- `url` (string)
- `verdict` (string)

### `compare` (~125 tokens)

Head-to-head of two stocks or ETFs

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".

Input parameters:

- `a` (string, required): First ticker, e.g. "SCHD".
- `b` (string, required): Second ticker, e.g. "VIG".

Output parameters:

- `a` (object)
- `b` (object)
- `correlation` (number|null)
- `headline` (string)
- `takeaways` (array)
- `url` (string)
- `window` (object)

### `dividend_calendar` (~224 tokens)

Dividend calendar

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`.

Input parameters:

- `days` (integer): Length of the range that starts at `from`, in calendar days (1–31, default 10).
- `from` (string): First day of a date range, YYYY-MM-DD (instead of `month`). Use it for "this week" or "the next 10 days".
- `limit` (integer): How many entries, earliest first to return (1–200, default 50).
- `month` (string): 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` (string): Only this ticker, e.g. "KO".

Output parameters:

- `count` (integer)
- `end` (string)
- `entries` (array)
- `returned` (integer)
- `start` (string)
- `url` (string)

### `earnings_calendar` (~228 tokens)

Earnings calendar

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`.

Input parameters:

- `days` (integer): Length of the range that starts at `from`, in calendar days (1–31, default 10).
- `from` (string): First day of a date range, YYYY-MM-DD (instead of `month`). Use it for "this week" or "the next 10 days".
- `limit` (integer): How many reports, earliest first, larger companies first on the same day to return (1–200, default 50).
- `month` (string): 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` (string): Only this ticker, e.g. "NVDA".

Output parameters:

- `count` (integer)
- `end` (string)
- `entries` (array)
- `returned` (integer)
- `start` (string)
- `url` (string)

### `tax_loss_harvest` (~413 tokens)

Tax-loss harvesting before December 31

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".

Input parameters:

- `carryover` (object): US only: capital losses carried into this year from last year's return, in dollars, by term.
- `filing_status` (string): US only: Form 1040 filing status (default single). Married filing separately caps the deduction at $1,500.
- `lots` (array, required): 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` (array): 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.
- `residence` (string, required): Where the user pays tax: US or FR (France).

Output parameters:

- `approximate` (array)
- `asOf` (string)
- `currency` (string)
- `daysLeft` (integer)
- `flatTaxRate` (number|null)
- `leftOut` (object)
- `lossTotal` (number)
- `notAdvice` (string)
- `realizedNet` (number)
- `residence` (string)
- `rows` (array)
- `rule` (string)
- `substantiallyIdentical` (array)
- `taxErasable` (number|null)
- `url` (string)
- `us` (object|null)
- `year` (integer)

### `withholding_check` (~251 tokens)

Dividend tax withheld abroad

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".

Input parameters:

- `currency` (string): Currency of every amount (default EUR for FR, USD otherwise).
- `dividends` (array, required): One line per payer: a year of dividends, gross (before any tax). At most 100.
- `residence` (string, required): Where the user pays tax: FR (France), US, or other (the usual 15% treaty rate is used).

Output parameters:

- `asOf` (string)
- `credit` (number)
- `currency` (string)
- `excess` (number)
- `gross` (number)
- `notAdvice` (string)
- `notTaxedAbroad` (array)
- `residence` (string)
- `rows` (array)
- `rule` (string)
- `uncovered` (array)
- `url` (string)
- `withheld` (number)

### `fund_fees` (~154 tokens)

What your funds cost a year

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".

Input parameters:

- `currency` (string): Currency of every amount (default USD).
- `funds` (array, required): One line per fund: its ticker and what is invested in it now. At most 50.

Output parameters:

- `annualCost` (number)
- `asOf` (string)
- `currency` (string)
- `funds` (array)
- `notFunds` (array)
- `partial` (boolean)
- `rule` (string)
- `url` (string)
- `weightedRatio` (number|null)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-portfolio-terminal-portfolio-terminal/api-mcp#diagnostics

## Score history

- 2026-11-05: 72
- 2026-11-04: 71
- 2026-11-03: 71
- 2026-11-02: 71
- 2026-11-01: 70

## Common questions

### What is the Portfolio Terminal MCP server?

Portfolio Terminal is an MCP server listed in the public MCP registry as com.portfolio-terminal/portfolio-terminal. Dated ETF, stock and calendar data, plus tax-loss, withholding and fee math on your holdings. This page covers its hosted endpoint (https://portfolio-terminal.com/api/mcp).

### Is the Portfolio Terminal MCP server safe to use?

Portfolio Terminal scores 72 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Portfolio Terminal MCP server expose?

Portfolio Terminal exposes 10 tools: analyze_ticker, who_holds, etf_holdings, etf_overlap, compare, and 5 more. Their descriptions and schemas cost roughly 2,000 tokens of context every time the server is loaded.

### Does the Portfolio Terminal MCP server require authentication?

No. We connected to Portfolio Terminal without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Portfolio Terminal MCP server still maintained?

Portfolio Terminal is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What did VerifyMCP test on the Portfolio Terminal MCP server?

VerifyMCP ran 13 checks on Portfolio Terminal, covering TLS certificate, Authorization, HTTPS, HSTS header and 9 more. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.

## Links

- Remote endpoint: https://portfolio-terminal.com/api/mcp
- Website: https://portfolio-terminal.com/mcp
- Changelog RSS feed: https://verifymcp.io/servers/com-portfolio-terminal-portfolio-terminal/api-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-portfolio-terminal-portfolio-terminal/api-mcp/changelog.json
- Trust report (JSON): https://verifymcp.io/servers/com-portfolio-terminal-portfolio-terminal/api-mcp.json
- HTML version of this page: https://verifymcp.io/servers/com-portfolio-terminal-portfolio-terminal/api-mcp
