MCP server for Zerodha Kite — trade Indian stocks via any MCP-compatible AI assistant
This server has 12 tools with reasonable naming conventions and basic descriptions, but suffers from significant gaps in schema completeness, parameter documentation, and error handling. Most tools have empty input schemas (no parameters documented), making them difficult for LLMs to compose and validate input. Descriptions exist but are often generic and lack dependency hints or recovery guidance. The server exposes financial trading operations (place_order, cancel_order) without adequate confirmation or dry-run patterns, creating safety risks. No output schemas are documented, and error handling is minimal.
Cancel a pending order.
Get historical candle data for an instrument. Interval can be: minute, day, 3minute, 5minute, 10minute, 15minute, 30minute, 60minute.
Get all holdings in the portfolio with quantity, average price, last price, and P&L.
Get list of tradeable instruments for an exchange. Use to find instrument_token for historical data. Exchange: NSE, BSE, NFO, BFO, CDS, MCX.
Get account margins/funds available for trading (equity and commodity segments).
Get OHLC (open, high, low, close) and last price for instruments. Falls back to holdings/positions data if the market data API is not available.
No output schemas documented for any tool. LLMs cannot predict response structure, cannot chain tools reliably, and must parse response text ad-hoc.
Destructive operations (place_order, modify_order, cancel_order) lack confirmation or dry-run patterns. No dry-run capability. LLMs can trigger real trades without a safety gate.
No recovery guidance in error responses. If a tool fails (auth, rate limit, invalid instrument), there is no guidance for what the LLM should do next.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | <=2025-11-25 | v2 |
Get all orders placed today.
Get current day's positions (both day and net).
Get live market quote for one or more instruments. Use NSE: prefix for stocks (e.g., NSE:RELIANCE, NSE:INFY). Falls back to holdings/positions data if the market data API is not available.
Authenticate with Zerodha Kite. Auto-generates TOTP and logs in. Call this if other tools fail with auth errors.
Modify a pending order.
Place a buy or sell order. Returns order ID on success. Use variety='regular' for normal orders, 'amo' for after-market orders.
Parameter descriptions for place_order and modify_order lack constraint details. 'price' has no min/max bounds, no hint on when it's required vs optional. 'order_type' lists valid values in description but should be an enum for LLM validation.
Tool descriptions for place_order, modify_order, cancel_order do not state that these are irreversible operations. LLMs need to know a 'place_order' call is permanent and carries financial risk.
No pagination support documented or implemented. get_holdings, get_positions, get_orders, get_instruments may return large lists. No limit, page, offset, or next_cursor parameters visible.
get_quote and get_ohlc fallback behavior ('Falls back to holdings/positions data if the market data API is not available') is undocumented in parameter descriptions. Dependency chains are implicit, not explicit.
modify_order marks ALL parameters (quantity, price, order_type, trigger_price) as optional but provides no guidance on which field actually triggers the modification. The description does not explain partial vs full updates.
Credentials (API_KEY, API_SECRET, USER_ID, PASSWORD, TOTP_SECRET) are injected via environment variables, which is correct. However, no audit logging of tool calls is visible in the code. Financial transactions should be logged with user, timestamp, parameters, and outcome for compliance.
get_historical_data requires a numeric instrument_token, but most users have instrument symbols (RELIANCE, INFY). The tool description suggests calling get_instruments first, but this dependency is not formalized. No chainable IDs returned from get_instruments to get_historical_data.