Zerodha MCP has significant structural weaknesses. While all 8 tools have basic descriptions and most have input schemas, the quality is inconsistent. Tool naming follows verb-noun conventions (good), but descriptions are generic and lack depth. Parameter descriptions are minimal or absent, schemas lack enums and constraints, and there is no structured error guidance. The authentication flow tools (initiate_login, get_request_token) expose concerning patterns, they operate on mutable global state (_request_token) and lack idempotency guarantees. Financial tools (place_order) accept critical parameters like price and trigger_price as optional, creating ambiguity about when they're required. Output schemas are entirely undocumented, LLMs cannot predict what fields to expect from responses. Security is problematic: credentials are managed via environment variables (acceptable) but the server exposes an unprotected FastAPI endpoint for auth callbacks. Overall, this reads as a proof-of-concept rather than production-grade tooling.
Get historical data for an instrument
Get user's holdings/portfolio
Get account margins
Get user's positions
Get quote for symbols
Get the current request token after login redirect
Start the Zerodha login flow by opening the login URL in a browser and starting a local server to handle the redirect
place_order accepts price and trigger_price as optional but financial APIs require them conditionally (LIMIT orders need price; SL orders need trigger_price). No validation or conditional schema constraints documented.
No output schemas documented for ANY tool. LLMs cannot predict response structure, forcing them to guess what fields are available for downstream chaining or extraction.
Stateful authentication via global _request_token variable. Concurrent requests or retries may interfere with each other. Non-idempotent login flow violates agent retry patterns.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 57 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 25 | - | v1 |
Place an order on Zerodha
Parameter descriptions are minimal or absent. 'interval' in get_historical_data lists enum values in description ('minute, 3minute, ...') but lacks a formal enum constraint or explanation of what each interval means.
No error handling or recovery guidance. Tools return error dicts like {'error': msg} but do not categorize errors as retryable, user-fixable, or fatal, and do not guide the LLM on next steps.
Tool descriptions do not explain when to use one over another. For instance, get_holdings, get_positions, and get_margins all fetch account data but their semantic differences are not documented.
FastAPI callback endpoint (/zerodha/auth/redirect) is unprotected. No CSRF token, state parameter validation, or origin checks. A malicious actor could trigger login via query param manipulation.
get_quote accepts a list of symbols but no pagination or result limit is mentioned. If an LLM passes hundreds of symbols, response could explode the context window.