MCP server for interacting with the Groww trading API - fetch portfolio, get live quotes, place/cancel/modify orders, and more
Server defines 6 tools with varying quality. Core issues: (1) Tool naming is inconsistent, 'portfolio', 'market-data', 'place_order', 'modify_order', 'cancel_order', 'order_status' mix underscore and hyphen conventions, violating verb_noun consistency. (2) Descriptions are present but generic and lack actionable context (e.g., 'Place a new stock order' does not explain when to use this vs modify/cancel, or warn of irreversible consequences). (3) Input schemas visible for most tools but lack validation guidance in descriptions (e.g., enum values not explained inline). (4) No output schemas documented, LLMs cannot know what fields to expect from responses. (5) Error handling absent, no guidance on retry, recovery, or what to do when API fails. (6) Parameters like 'order_type' repeated across tools but not consistently described. (7) No examples of tool chaining (e.g., place_order response should include order_id for subsequent order_status calls). Server is functional but lacks production-grade polish.
Cancel an existing stock order. Use this tool to cancel a pending order on Groww.
Fetch live quotes, last traded prices (LTP), OHLC, or historical candle data for stocks. Use this tool to get real-time or historical market data.
Modify an existing stock order. Use this tool to update quantity, price, or trigger price of a pending order.
Get the status of a stock order. Use this tool to check the current status, filled quantity, and other details of an order.
Place a new stock order (buy/sell). Use this tool to execute trades on Groww.
Fetches the user's current portfolio holdings, including trading symbol, quantity, and average price. Use this tool to view your current investments.
Naming inconsistency: 'portfolio' and 'market-data' use hyphens while 'place_order', 'modify_order', 'cancel_order', 'order_status' use underscores. This violates the verb_noun convention and confuses LLMs when selecting similar tools. Normalize to underscore: 'get_portfolio', 'get_market_data', etc.
No output schemas documented. Source code shows Zod schema validation (LiveDataSchema, LtpSchema, OhlcSchema, HistoricalCandleSchema) in market-data.ts, but tool definitions do not expose return type information. LLMs cannot plan downstream calls without knowing response structure.
Descriptions lack actionable context. 'Place a new stock order' does not explain: when to use place_order vs modify_order; that this operation is irreversible; what fields are required vs optional in different scenarios; or what the response contains. Descriptions should follow WHAT-WHEN-WHY format with recovery hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 46 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 42 | - | v1 |
No error handling guidance. If an order placement fails (insufficient funds, invalid symbol, market closed), tool returns raw API error. LLMs need: error classification (retryable vs user-fixable), the invalid constraint, and next steps (e.g., 'Try search_symbols() for valid trading symbols').
'market-data' action parameter uses enum with hyphens ('live-quote', 'ltp', 'ohlc', 'historical-candle') but descriptions and inline text use inconsistent formatting. No guidance on which action to use for different user intents (e.g., 'live-quote' vs 'ltp', what's the difference?).
'portfolio' tool has minimal schema, only 'action' enum=['get']. No parameters for filtering (e.g., by symbol, by segment). No output schema. Response must be inferred from context.
No tool chaining support documented. If 'place_order' returns 'groww_order_id', the tool definition should note this ID can be passed to 'order_status' or 'modify_order'. Breaking this chain forces extra discovery calls.
Parameters like 'exchange' (NSE/BSE), 'segment' (CASH/FNO), 'order_type' (LIMIT/MARKET/SL/SL_M) appear across multiple tools but are described inconsistently or minimally. No guidance on when each enum value is appropriate (e.g., when to use SL vs SL_M?).