Zentrix MCP tool reference
The Zentrix MCP server exposes live stock market data, news, sentiment, alerts, and portfolio tools to any MCP-compatible AI assistant. Every tool below is grouped by category, with its parameters.
Authentication
Most tools operate on the authenticated user's account (watchlist, holdings, alerts, usage). A few are public and require no authentication: watchlist_default_get and market_status.
Watchlist
Scroll the table horizontally to see all columns.
| Tool | Description | Key parameters |
|---|---|---|
| watchlist_get | Current watchlist with live prices, day-change %, and market state. | None |
| watchlist_add | Add a ticker to the watchlist. | ticker |
| watchlist_recap | One-shot gainers/losers/news summary across the watchlist. | None |
| watchlist_default_get | Live snapshot of a curated public watchlist (e.g. "Big Tech", "AI Stocks"). | name |
watchlist_recap combines price data with news but excludes sentiment scores by default. Call sentiment_for_ticker separately if needed.
Portfolio
Scroll the table horizontally to see all columns.
| Tool | Description | Key parameters |
|---|---|---|
| portfolio_analysis | Value-weighted position and sector exposure on user-entered holdings; reports missing or stale price data explicitly. | None |
| portfolio_changes | Read the existing owner's bounded changes page, with the same event IDs, versions, facts, coverage, and exposure projection as the app. | symbol, kind, cursor (all optional) |
| portfolio_briefing | Read the latest retained factual briefing or an exact immutable snapshot and page shared with the app and email. | snapshotId, version, cursor (all optional; version/cursor require snapshotId) |
portfolio_analysis reports exposure; portfolio_changes and portfolio_briefing report factual changes and retained briefings. None infers suitability or presents output as a trade recommendation.
Market Data
Scroll the table horizontally to see all columns.
| Tool | Description | Key parameters |
|---|---|---|
| stock_search | Resolve a ticker or company name fragment to matching symbols. | query |
| stock_chart_summary | Price/volume chart data plus key metrics (open, day range, 52-week range, market cap, EPS, P/E) and a plain-English trend summary. | symbol, timeframe (1D/5D/1M/6M/YTD/1Y/5Y/MAX) |
| market_status | Whether the US market is currently open. | None |
News & Sentiment
Scroll the table horizontally to see all columns.
| Tool | Description | Key parameters |
|---|---|---|
| news_web_search | Live web-sourced headlines (6-8 most recent) with source, recency, and per-item bullish/neutral/bearish tag. | ticker |
| news_for_ticker | Structured article feed (up to 25) plus a live web-analysis summary, combined in one response. | ticker, limit (default 10) |
| sentiment_for_ticker | Aggregate 0-100 sentiment score with a short AI-generated summary; cached 24h per ticker. | ticker |
news_web_search is always live; sentiment_for_ticker is a cached aggregate. Use accordingly depending on whether the caller needs freshness or a single summarized score.
Alerts
Scroll the table horizontally to see all columns.
| Tool | Description | Key parameters |
|---|---|---|
| alert_set | Set a one-shot price alert (email on trigger). | ticker, conditionType (price_below/price_above), thresholdPrice |
| alert_list | List alerts grouped by active / triggered / paused. | None |
| alert_update | Change an existing alert's threshold/direction and re-arm it. | alertId, ... |
| alert_pause | Pause an active alert. | alertId |
| alert_resume | Re-arm a triggered or paused alert. | alertId |
| alert_cancel | Cancel a single alert. | alertId |
| alert_cancel_all | Cancel all active alerts. | None |
Alerts auto-pause after triggering (no repeat notifications). Only active alerts count toward the per-user alert limit; if the limit is reached, alert_set returns the active list so one can be paused to make room.
Earnings
Scroll the table horizontally to see all columns.
| Tool | Description | Key parameters |
|---|---|---|
| earnings_calendar | Market-wide upcoming earnings dates: company, fiscal quarter, BMO/AMC timing, EPS estimate/actual. | tickers (optional filter), daysAhead (default 14, max 90) |
Refreshed nightly from a bulk earnings provider; served instantly from the Zentrix database.
Account & Usage
Scroll the table horizontally to see all columns.
| Tool | Description | Key parameters |
|---|---|---|
| usage_status | Current daily API usage: calls used/remaining, tier, reset time. | None |
Returns a low-balance warning when 3 or fewer calls remain for the day.
Portfolio changes and retained briefings
These two tools require an existing, confirmed, unlocked account with an exact linked OAuth identity. The server resolves the owner from authentication; neither tool accepts an owner ID or links or creates an account. They share your existing daily MCP budget and entitlement boundaries. Reads do not change read/saved state, holdings, orders, delivery preferences, or briefings, and never compile, approve, or send an email.
Inputs and pagination
portfolio_changes: omit all arguments for the first page. Optional symbol is a followed or held ticker, at most 10 ASCII letters, digits, dots, or hyphens; it is trimmed and normalized to uppercase. Optional kind must be exactly correction_notice, threshold_crossing, issuer_release, upcoming_earnings, or cited_news.
portfolio_briefing: omit all arguments for the latest retained snapshot. Optional snapshotId is brief_ followed by 32 hexadecimal characters. Optional version is a positive integer that must match that snapshot's retained snapshotVersion; it requires snapshotId.
Both tools return at most 20 items per page. Pass the returned nextCursor as cursor without editing it (maximum 4,096 characters). For changes, keep the same symbol/kind filters; for briefings, include the same snapshot ID. Cursors are owner-bound and expire after 10 minutes. Feed cursors can become unavailable sooner after eviction or a server restart. A conflict response requires restarting pagination; a retained briefing can restart from the same snapshot ID. Unknown arguments, wrong primitive types, and excessive inputs are rejected.
Outputs and availability
Success returns the shared JSON DTO in MCP structuredContent and an identical JSON text content block. A changes page contains contractVersion, snapshotId, asOfUtc, coverage, items, and nextCursor. Each item contains its canonical event and owner projection, including exact versions, source-linked facts, correction provenance, and exposure limitations.
A retained briefing also contains ownerId, snapshotVersion, factualState, periodStartUtc, periodEndUtc, cutoffUtc, policyVersion, and holdingExposure. Its immutable snapshot ID/version and retained facts match the app and email's factual source. Independent first-page changes reads allocate separate transient feed_ pagination handles; these are not retained brief_ IDs. Continuing a protected cursor preserves the same ordered facts, IDs, and versions; newly issued cursor tokens may differ.
Watchlist-only items use relevance: "watchlist", exposureState: "none", and a null holding weight. Coverage may be complete, partial, or unavailable. Briefing factual states distinguish available, partial, quiet, no_inventory, and unavailable. An empty result during an outage is never evidence of no changes; preserve coverage, freshness, limitations, nulls, and fixture/sample labels.
The portfolio read capability can be disabled even while legacy tools remain available. A disabled capability returns disabled (503). A missing, expired, foreign, or wrong-version retained snapshot returns unavailable (404); invalid parameters return invalid_input (400), and an exhausted daily budget returns rate_limited (429). Tool failures set isError: true with a fixed safe error DTO. Invalid or expired transport authentication is rejected before the call; an unlinked or locked account cannot read private data.
Timestamp semantics
cutoffUtc is the retained briefing's evidence capture boundary, while asOfUtc is the factual view's as-of time. The period start/end label the retained briefing period. Reading an old snapshot does not refresh these values, and none is an email delivery timestamp.
Event/source observedAtUtc records observation, not publication or occurrence. Source publishedAtUtc/publishedOn and event timing.occurredAtUtc/occurredOn retain their actual precision and nulls. A date-only event does not imply midnight; BMO/AMC or unknown sessions do not supply an exact instant. Exposure and market-data as-of/retrieval times describe their own inputs.
Call and output examples
These are synthetic, abridged examples, with fields omitted for space. IDs and facts are illustrative and are not live data. The requests are tools/call parameters after an authenticated MCP handshake; outputs show the structuredContent value.
Read followed-company changes
Input
{
"name": "portfolio_changes",
"arguments": {
"symbol": "AAPL",
"kind": "upcoming_earnings"
}
} Abridged output
{
"contractVersion": "1.0",
"snapshotId": "feed_0123456789abcdef0123456789abcdef",
"asOfUtc": "2026-10-07T08:00:00Z",
"coverage": {
"state": "partial",
"coveredSymbolCount": 1,
"totalSymbolCount": 1,
"limitations": [
"sample_only"
]
},
"items": [
{
"event": {
"eventId": "example_earnings_aapl",
"version": 1,
"symbol": "AAPL",
"kind": "upcoming_earnings",
"origin": "sample",
"timing": {
"precision": "date_only",
"occurredAtUtc": null,
"occurredOn": "2026-10-08",
"session": null
},
"observedAtUtc": "2026-10-07T08:00:00Z",
"sources": [
{
"sourceId": "example_calendar",
"publishedAtUtc": null,
"publishedOn": "2026-10-07",
"observedAtUtc": "2026-10-07T08:00:00Z"
}
],
"facts": [
{
"name": "earnings_timing",
"valueType": "text",
"textValue": "date_only",
"numericValue": null,
"sourceIds": [
"example_calendar"
]
}
]
},
"projection": {
"eventId": "example_earnings_aapl",
"eventVersion": 1,
"relevance": "watchlist",
"holdingWeightPercent": null,
"exposureState": "none"
}
}
],
"nextCursor": null
} Read an exact retained briefing
Input
{
"name": "portfolio_briefing",
"arguments": {
"snapshotId": "brief_0123456789abcdef0123456789abcdef",
"version": 1
}
} Abridged output
{
"contractVersion": "1.0",
"snapshotId": "brief_0123456789abcdef0123456789abcdef",
"snapshotVersion": 1,
"factualState": "partial",
"periodStartUtc": "2026-10-01T00:00:00Z",
"periodEndUtc": "2026-10-02T00:00:00Z",
"cutoffUtc": "2026-10-07T08:00:00Z",
"asOfUtc": "2026-10-07T08:00:00Z",
"coverage": {
"state": "partial",
"coveredSymbolCount": 1,
"totalSymbolCount": 1,
"limitations": [
"sample_only"
]
},
"items": [
{
"event": {
"eventId": "example_earnings_aapl",
"version": 1,
"symbol": "AAPL",
"kind": "upcoming_earnings",
"origin": "sample",
"timing": {
"precision": "date_only",
"occurredAtUtc": null,
"occurredOn": "2026-10-08",
"session": null
},
"observedAtUtc": "2026-10-07T08:00:00Z",
"sources": [
{
"sourceId": "example_calendar",
"publishedAtUtc": null,
"publishedOn": "2026-10-07",
"observedAtUtc": "2026-10-07T08:00:00Z"
}
],
"facts": [
{
"name": "earnings_timing",
"valueType": "text",
"textValue": "date_only",
"numericValue": null,
"sourceIds": [
"example_calendar"
]
}
]
},
"projection": {
"eventId": "example_earnings_aapl",
"eventVersion": 1,
"relevance": "watchlist",
"holdingWeightPercent": null,
"exposureState": "none"
}
}
],
"nextCursor": null
} For the latest briefing, use {"name":"portfolio_briefing","arguments":{}}. For the next briefing page, reuse the returned snapshot ID and version and add its unmodified nextCursor as cursor.
Safe missing-snapshot output (isError: true)
{
"contractVersion": "1.0",
"code": "unavailable",
"message": "The requested private portfolio data is unavailable.",
"status": 404,
"retryable": false,
"details": null,
"traceId": null
} Scope notes
- Zentrix is a data and insight layer: quotes, charts, news, sentiment, alerts, earnings, and portfolio exposure reporting.
- It does not place trades or manage brokerage execution. It's designed to sit alongside, not replace, an execution-capable service.
- Data freshness varies by tool: prices and market status are live, sentiment is cached 24h, and earnings data refreshes nightly.