Monitors a user-supplied portfolio of holdings: pulls live quotes, flags price/volume alerts, surfaces the day's news impact per position, and produces a daily brief combining market data with news. Use whenever the user asks about their holdings, a watchlist, portfolio performance, or a daily market brief for specific tickers — e.g. "check my portfolio", "morning brief on AAPL MSFT NVDA", "anything moving on my positions today", "alert me if TSLA drops below 240", "end-of-day summary for this watchlist", or "which of my holdings had news today". User provides holdings; this skill does NOT persist them.
Combines viaNexus quotes, corporate actions, and MT Newswires news into a single portfolio briefing. The user always supplies the holdings (tickers + optional share counts + optional price alerts); this skill does not store state.
Extract from the user's message:
If no shares given, show per-share change only. If no alerts given, flag any ticker with > ±3% day move as "notable".
Call viaNexus:current_date.
Call viaNexus:fetch:
dataset_name: quoteproduct: coreendpointdatasymbols: comma-separated tickersKey fields: symbol, latestPrice, change, changePercent, previousClose,
latestVolume, avgTotalVolume, week52High, week52Low, peRatio, marketCap,
isUSMarketOpen.
For each holding:
day_change = latestPrice - previousCloseday_change_pct = changePercent (already decimal)volume_spike = latestVolume / avgTotalVolume — flag if > 2xposition_value = latestPrice × shares,
position_pnl_today = day_change × sharesAggregate portfolio total value and day PnL if shares provided.
For each user-supplied alert:
latestPrice crosses thresholdabs(changePercent) >= thresholdFor any ticker flagged in Step 5 (or the top 3 movers if no alerts),
call viaNexus:fetch:
dataset_name: mt_newswires_north_americaproduct: edgeendpoint: datasymbols: mover tickers (comma-separated)last: 5on_date: today's date from Step 2Deduplicate by subkey, prioritize isPrimary: true.
If any ticker has dividend or split activity that could explain a move,
call viaNexus:fetch with advanced_dividends or advanced_splits
(product edge).
Output format:
## Portfolio Brief — [Today]
Market status: [OPEN | CLOSED]
### 💼 Holdings
| Ticker | Last | Day % | Day $ | Volume vs Avg | Position Value |
|--------|------|-------|-------|---------------|----------------|
| AAPL | 259.10 | -0.04% | -0.10 | 0.6x | $25,910 (100 sh) |
| ... | | | | | |
**Portfolio total:** $X,XXX,XXX | **Day PnL:** $X,XXX (+X.X%)
### 🚨 Alerts Fired
- **[TICKER]** crossed $XXX threshold (currently $YYY)
- **[TICKER]** volume 3.2x avg — unusual activity
### 📰 News on Movers
- **[TICKER]** (+4.2%): "[Headline]" — [1-line summary, MT Newswires, HH:MM]
- **[TICKER]** (-2.8%): "[Headline]" — [...]
### 🗓️ Upcoming Catalysts
Any earnings / dividend / split dates in the next 7 days for holdings.
Rules:
isUSMarketOpen: false, label the brief as an after-hours / pre-market view.calculationPrice: "delayed") so the user
knows this isn't real-time.