AI-powered portfolio analysis with MCP + RAG + Agents. Provides tools for portfolio analysis, stock research, market context, news search, and corporate events via Kite trading platform integration.
Portfolio Copilot has 9 tools with mixed quality. Tool naming is strong (all start with action verbs: get_, search_, ingest_), descriptions are present but vary in depth (ranging 40-350 chars, averaging ~180 chars). Input schemas are well-defined with proper JSON Schema (types, descriptions, enums where needed). However, OUTPUT schemas are entirely undocumented, no tool explicitly states what fields it returns, what structure agents should expect, or what chaining IDs are available for follow-up calls. Error handling is absent from tool descriptions; no guidance on retryability, user-fixable vs fatal errors, or recovery paths. The get_holdings description is unusually verbose (350 chars) with duplicate content. Parameters generally have types and descriptions, but lack constraints (no min/max for top_k, no enum for segment in get_margins). Overall, the server reads as a competent API wrapper with incomplete agent-readiness, definitions focus on what the API does, not how an LLM should decide when/why to call each tool or what to do with results.
Fetch corporate events and announcements for a stock from BSE India. Returns board meetings, dividends, acquisitions, mergers, earnings announcements, and government policy events.
Fetch the user's portfolio holdings (long-term stocks held in DEMAT account). Returns an object with two parts: 1. "holdings": List of individual holdings, each with: - tradingsymbol: Stock symbol (e.g., "RELIANCE", "TCS") - exchange: Exchange (e.g., "NSE", "BSE") - quantity: Number of shares held - average_price: Average purchase price per share - last_price: Current market price per share - pnl: Profit/Loss in rupees for this stock - day_change: Today's price change per share - day_change_percentage: Today's % change 2. "summary": Pre-calculated portfolio totals (USE THESE VALUES): - total_stocks: Number of stocks in portfolio - total_investment: Total amount invested (sum of quantity × average_price) - total_current_value: Current portfolio value (sum of quantity × last_price) - total_pnl: Total profit/loss in rupees - total_pnl_percentage: Overall return percentage - total_day_change: Today's total change in rupees IMPORTANT: Always use the values from "summary" for portfolio totals. Do not recalculate them.
Get last traded price (LTP) for specific instruments. Lighter than full quotes.
Fetch account margins and available buying power. Shows available cash, used margin, and collateral.
NO output schemas documented for any tool. Agents cannot determine what fields to extract or pass downstream. get_holdings returns 'holdings' and 'summary' but structure is undocumented; get_quotes returns OHLC and volume but format (array vs dict) unknown; get_ltp structure unknown; search_news results structure unknown.
No error handling guidance in any tool description. Agents don't know: Can I retry if the API is slow? What should I do if a stock symbol is not found? Is a 404 retryable or fatal? If DEMAT account is unavailable, what's the recovery path?
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 55 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 43 | - | v1 |
Fetch current trading positions (intraday and overnight). Returns both 'net' positions (cumulative) and 'day' positions (today's activity).
Get real-time market quotes for specific instruments. Returns OHLC, volume, and other market data.
Fetch and store the latest news for specific stocks. Use this before searching if the user asks about recent news and you haven't ingested data recently. This updates the news database.
Search for trading instruments by name or symbol. Use this to find the correct instrument identifier before fetching quotes.
Search for recent news articles about stocks or market events. Use this to find context about why a stock moved, recent announcements, or market sentiment. Returns relevant news snippets from MoneyControl and Yahoo Finance.
Parameters lack constraints. 'segment' in get_margins is a free-form string with no enum, agents could pass 'forex', 'crypto', 'derivatives' without validation, causing silent failures or unexpected behavior. 'top_k' in search_news specifies max=10 in description but not enforced in schema.
ingest_stock_news description does not explicitly state it modifies state (writes to news database). Agents cannot determine if it's safe to call repeatedly or if side effects are expected. Description says 'updates the news database' but this is not flagged as a WRITE operation in tool metadata (no Risk tag visible in tool definition).
get_holdings description is redundant and overly verbose (350 chars, repeats 'summary' concept multiple times). Wastes tokens and buries key intent. Modern tool descriptions should be 50-200 chars.
get_positions description is too sparse (47 chars, no explanation of when to use vs get_holdings, no definition of 'net' vs 'day' positions). An agent cannot infer when this tool is appropriate without external knowledge.
No documentation of chaining IDs. If get_quotes returns a stock_id or isin, search_news should accept those. If search_instruments returns a symbol_id, get_quotes should accept it. Broken chaining forces extra lookup calls. No evidence in descriptions that outputs chain to inputs.