{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-05T21:18:39.233Z","url":"https://verifymcp.io/servers/techfreakworm-kite-connect-mcp/kite-connect-mcp","markdownUrl":"https://verifymcp.io/servers/techfreakworm-kite-connect-mcp/kite-connect-mcp.md","server":{"slug":"techfreakworm-kite-connect-mcp","name":"Kite Connect MCP","registryName":"io.github.techfreakworm/kite-connect-mcp","description":"Zerodha Kite Connect v3 for AI agents: orders (dry-run by default), GTT, alerts, portfolio, quotes","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"kite-connect-mcp","type":"pypi","identifier":"kite-connect-mcp","withdrawn":false,"url":"https://verifymcp.io/servers/techfreakworm-kite-connect-mcp/kite-connect-mcp","version":"0.1.1","transport":"stdio","scoredAt":"2026-11-05T09:03:37.960Z"},"score":{"total":65,"tier":"medium","status":"scored","weekDelta":null,"history":[{"date":"2026-11-05","total":65},{"date":"2026-11-04","total":64},{"date":"2026-11-03","total":64}]},"categories":[{"name":"Supply Chain Security","score":50,"verdict":"partial","reasons":["Malware scan not yet available for this package.","No known CVEs affecting this package version or its production dependencies.","Runs hatchling.build at install time, a recognised build step with no custom scripting around it.","1 of 29 dependencies flagged as unhealthy."],"codes":[{"code":"supplychain.malware_inconclusive","args":{"reason":"vendor_no_verdict"}},{"code":"cve.none","args":{}},{"code":"installscript.allowlisted","args":{"tool":"hatchling.build","hooks":"build_backend"}},{"code":"dephealth.assessed","args":{"deps":"29","unhealthy":"1"}}]},{"name":"Provenance & Transparency","score":100,"verdict":"pass","reasons":["Source repository is publicly reachable at the declared URL.","Cryptographically verified build provenance (signed, bound to techfreakworm/kite-connect-mcp).","Clear OSI-approved license (MIT).","Actively maintained (last published 1 days ago).","Publishes a security disclosure policy (SECURITY.md)."],"codes":[{"code":"provenance.repo_verified","args":{}},{"code":"provenance.verified","args":{"repo":"techfreakworm/kite-connect-mcp"}},{"code":"license.osi","args":{"spdx":"MIT"}},{"code":"maintenance.recent","args":{"age_days":"1"}},{"code":"disclosure.present","args":{}}]},{"name":"Schema Quality & AI Usability","score":62,"verdict":"fail","reasons":["AI-judged instruction clarity (good).","Context-footprint check failed: tool/resource definitions use about 10916 tokens (~205/item across 53 items; 53 tools + 0 resources), over budget; trim descriptions and params.","Usage-examples check failed: none of the tools include examples."],"codes":[{"code":"schema.ai_quality","args":{"band":"good"}},{"code":"schema.footprint_heavy","args":{"avg":"205","items":"53","tools":"53","tokens":"10916","resources":"0"}},{"code":"schema.examples_absent","args":{}}]},{"name":"Stability & Change Management","score":7,"verdict":"partial","reasons":["Stability observed for 2 of 30 days with no destabilising changes; credit accrues until the full window elapses."],"codes":[{"code":"stability.building_history","args":{"days":"2"}}]},{"name":"Tool Coverage","score":96,"verdict":"partial","reasons":["100% of tools have a non-trivial description (not blank, and not just the tool's name).","89% of tool parameters carry a description."],"codes":[{"code":"toolquality.descriptions","args":{"pct":"100"}},{"code":"toolquality.param_docs","args":{"pct":"89"}}]},{"name":"Tool Safety","score":100,"verdict":"pass","reasons":["No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.","All 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.","An AI judge read all 54 captured unit(s) of tool text and found none that tries to manipulate the model reading it."],"codes":[{"code":"toolsafety.injection_clean","args":{}},{"code":"toolsafety.destructive_declared","args":{"pct":"100","annotated":"3","destructive":"3"}},{"code":"toolsafety.manipulation_clean","args":{"units":"54","judged":"54"}}]},{"name":"Capabilities","score":100,"verdict":"pass","reasons":["Implements a current MCP spec version (2026-07-28)."],"codes":[{"code":"protocol.current","args":{"version":"2026-07-28"}}]}],"inconclusive":["Malware scan not yet available for this package."],"malware":[],"components":[{"slug":"kite-connect-mcp","type":"pypi","identifier":"kite-connect-mcp","withdrawn":false,"score":65,"current":true,"url":"https://verifymcp.io/servers/techfreakworm-kite-connect-mcp/kite-connect-mcp","markdownUrl":"https://verifymcp.io/servers/techfreakworm-kite-connect-mcp/kite-connect-mcp.md"}],"facts":[{"label":"Registry","value":"pypi"},{"label":"Package","value":"kite-connect-mcp"},{"label":"Version","value":"0.1.1"},{"label":"Transport","value":"stdio"}],"install":{"available":true,"bundleSha256":null},"tools":[{"name":"session_status","title":"Session status","description":"Whether this server is logged in to Kite, and what to do if it is not. Call this first: Kite sessions end\nevery day at 06:00 IST.\n\nReturns `logged_in`, the token's `expires_at` and `minutes_left`, `auth_mode` (managed: this server does the\ndaily login; external: another program keeps the token file and this server only reads it),\n`login_managed_here`, the token file path, `minutes_to_token_reset` (to the next 06:00 IST), and a one-line\n`safety` summary (trading mode, read-only). The token itself is never shown.\n\nverify=true also makes one live call to Kite and adds `verify` with the user id or Kite's error. Use it when a\ntoken that looks valid might have been ended elsewhere (logging in again with the same API key, or a master\nlogout on the Kite web, ends the earlier token).","inputs":[{"name":"verify","type":"boolean","required":false,"description":"also ask Kite once (GET /user/profile) whether it still accepts the token, and report the account's user id or Kite's error"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":238},{"name":"login","title":"Log in to Kite","description":"Start the daily Kite login (managed auth mode): returns a one-time login link for the person to open.\nShow them the `warning` and the link. They log in at Kite themselves (user id, password, 2FA); never ask for\ntheir credentials and never try to log in for them.\n\nKite then redirects to the app's registered redirect URL (`redirect_url`). This server completes the login\nwhen that redirect reaches it; if the redirect page cannot be reached, the person can copy the request_token\nfrom the browser's address bar (or the whole URL) and you call complete_login with it.\n\nIf a valid token already exists nothing is issued, unless force=true; a new login ends the old token at Kite.\nIn external auth mode another program owns the login: this only explains and shows the status.","inputs":[{"name":"force","type":"boolean","required":false,"description":"issue a new link even though a valid token exists (the new login ends the old token)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":200},{"name":"complete_login","title":"Complete the Kite login by hand","description":"Finish a Kite login with a request_token the person copied from the browser's address bar after logging in\n(use it when the redirect page could not be reached). Exchanges the token with Kite and stores the access\ntoken for every client of this server. Request tokens are single use and last only a few minutes. If\nKITE_MCP_ALLOWED_USER_ID is set, a login by any other Kite account is ended and refused.","inputs":[{"name":"request_token","type":"string","required":true,"description":"the request_token from the address bar after logging in at Kite; the whole redirected URL (which also carries the state) is accepted too"},{"name":"state","type":null,"required":false,"description":"the state from the same URL (optional; if given it must be valid)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":149},{"name":"logout","title":"Log out of Kite","description":"End the Kite API session, delete the stored token and close any open login link (managed auth mode). Two\nsteps: the first call (no confirmation_token) only describes what would happen and returns a\nconfirmation_token; call again with it to do it. Every client using this token is signed out until the next\nlogin. It does not log the person out of the Kite web or mobile apps.","inputs":[{"name":"confirmation_token","type":null,"required":false,"description":"from the first call; omit it to see what would happen and get one"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":110},{"name":"get_profile","title":"User profile","description":"The logged-in user's Kite profile: user id, name, email, broker, the exchanges, products and order types\nenabled for the account, and whether it is a demat consent / POA account (`meta.demat_consent`).","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":57},{"name":"get_margins","title":"Funds and margins","description":"Funds and margins: `available` (cash, opening balance, live balance, collateral, intraday payin) and\n`utilised` (debits, exposure, span, option premium, holding sales, turnover, ...) per segment, plus `net`\n(what is left to trade with). Amounts in INR.","inputs":[{"name":"segment","type":null,"required":false,"description":"equity or commodity; omit for both"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":88},{"name":"get_orders","title":"Today's orders","description":"The day's order book (open and executed orders), newest first. Each order has order_id, status,\nstatus_message, variety, exchange, tradingsymbol, transaction_type, order_type, product, quantity,\nfilled/pending/cancelled quantities, price, trigger_price, average_price, timestamps and tag.","inputs":[{"name":"limit","type":"integer","required":false,"description":null},{"name":"offset","type":"integer","required":false,"description":null},{"name":"status","type":"string","required":false,"description":"open = still working (OPEN, TRIGGER PENDING, AMO...), or a final state"},{"name":"tradingsymbol","type":null,"required":false,"description":"only orders for this tradingsymbol"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":124},{"name":"get_order_history","title":"Order history","description":"Every state an order went through (put order req received, validation pending, open, complete,\nrejected...), oldest first, with the status_message of each step.","inputs":[{"name":"order_id","type":"string","required":true,"description":"the order_id"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":53},{"name":"get_trades","title":"Today's trades","description":"The day's executed trades (fills), newest first: trade_id, order_id, exchange, tradingsymbol, product,\naverage_price, quantity, transaction_type, fill_timestamp.","inputs":[{"name":"limit","type":"integer","required":false,"description":null},{"name":"offset","type":"integer","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":58},{"name":"get_order_trades","title":"Trades of an order","description":"The fills that one order produced.","inputs":[{"name":"order_id","type":"string","required":true,"description":"the order_id (see get_orders)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":32},{"name":"place_order","title":"Place an order (dry run by default)","description":"Place an order. DRY RUN BY DEFAULT: with dry_run=true (the default) nothing is sent; the answer shows the\nexact request, the estimated value, Kite's margin calculation, every safety check and, when live trading is\nenabled and the checks pass, a confirmation_token. To send it, repeat the identical call with dry_run=false and\nthat token. Live sends are checked against the server's caps and allow-lists and written to the audit log.\n\nPlacing an order only registers it with Kite's OMS; check get_order_history for its fate. Live API orders must\ncome from the static IP registered in the Kite developer console (SEBI rule, since April 2026).","inputs":[{"name":"auction_number","type":null,"required":false,"description":"auction only (get_auctions)"},{"name":"autoslice","type":null,"required":false,"description":"split a quantity above the exchange freeze limit into up to 10 orders"},{"name":"confirmation_token","type":null,"required":false,"description":"the confirmation_token returned by a dry run of this exact call (single use)"},{"name":"disclosed_quantity","type":null,"required":false,"description":"quantity shown in the market"},{"name":"dry_run","type":"boolean","required":false,"description":"true (default): validate and preview only, nothing is sent. false: send it live, which needs live trading enabled on the server and the confirmation_token from a dry run"},{"name":"exchange","type":"string","required":true,"description":"NSE, BSE (equity), NFO, BFO (F&O), CDS, BCD, MCX"},{"name":"iceberg_legs","type":null,"required":false,"description":"iceberg only: number of legs"},{"name":"iceberg_quantity","type":null,"required":false,"description":"iceberg only: quantity per leg"},{"name":"market_protection","type":null,"required":false,"description":"MARKET / SL-M only: -1 automatic, or a % above 0 and up to 100"},{"name":"order_type","type":"string","required":true,"description":"MARKET, LIMIT, SL (stop-limit), SL-M (stop-market)"},{"name":"price","type":null,"required":false,"description":"limit price (LIMIT, SL)"},{"name":"product","type":"string","required":true,"description":"CNC delivery, MIS intraday, NRML F&O carry, MTF margin"},{"name":"quantity","type":"integer","required":true,"description":"units (NFO/BFO: a multiple of the lot size)"},{"name":"tag","type":null,"required":false,"description":"alphanumeric label, max 20 chars"},{"name":"tradingsymbol","type":"string","required":true,"description":"e.g. INFY, NIFTY25NOVFUT"},{"name":"transaction_type","type":"string","required":true,"description":"BUY or SELL"},{"name":"trigger_price","type":null,"required":false,"description":"trigger (SL, SL-M; stop-loss for co)"},{"name":"validity","type":null,"required":false,"description":"DAY (default), IOC, or TTL"},{"name":"validity_ttl","type":null,"required":false,"description":"minutes, for validity=TTL"},{"name":"variety","type":"string","required":false,"description":"regular, amo (after market), co (cover), iceberg, auction"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":529},{"name":"modify_order","title":"Modify an open order (dry run by default)","description":"Modify an open or pending order: quantity, price, order_type, trigger_price, validity, disclosed_quantity\n(cover orders: price / trigger_price only). DRY RUN BY DEFAULT, confirmed like place_order. The new value is\nchecked against the per-order cap and any increase against the daily cap. Kite allows 25 modifications per\norder.","inputs":[{"name":"confirmation_token","type":null,"required":false,"description":"the confirmation_token returned by a dry run of this exact call (single use)"},{"name":"disclosed_quantity","type":null,"required":false,"description":null},{"name":"dry_run","type":"boolean","required":false,"description":"true (default): validate and preview only, nothing is sent. false: send it live, which needs live trading enabled on the server and the confirmation_token from a dry run"},{"name":"market_protection","type":null,"required":false,"description":"MARKET / SL-M: -1 or (0, 100]"},{"name":"order_id","type":"string","required":true,"description":null},{"name":"order_type","type":null,"required":false,"description":null},{"name":"parent_order_id","type":null,"required":false,"description":"co second leg: the parent"},{"name":"price","type":null,"required":false,"description":null},{"name":"quantity","type":null,"required":false,"description":null},{"name":"trigger_price","type":null,"required":false,"description":null},{"name":"validity","type":null,"required":false,"description":null},{"name":"variety","type":"string","required":false,"description":"the order's variety (it is part of the URL)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":235},{"name":"cancel_order","title":"Cancel an open order (dry run by default)","description":"Cancel an open or pending order. DRY RUN BY DEFAULT, confirmed like place_order (cancelling a stop-loss\ncan increase risk, so it is not exempt). Caps do not apply to cancellations.","inputs":[{"name":"confirmation_token","type":null,"required":false,"description":"the confirmation_token returned by a dry run of this exact call (single use)"},{"name":"dry_run","type":"boolean","required":false,"description":"true (default): validate and preview only, nothing is sent. false: send it live, which needs live trading enabled on the server and the confirmation_token from a dry run"},{"name":"order_id","type":"string","required":true,"description":null},{"name":"parent_order_id","type":null,"required":false,"description":"co second leg: the parent"},{"name":"variety","type":"string","required":false,"description":"the order's variety (it is part of the URL)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":153},{"name":"get_gtts","title":"GTT order book","description":"The GTT book, newest first: every active GTT and those in other states from the previous 7 days. Each has\nid (the trigger_id), type (single or two-leg), status, created_at / updated_at / expires_at (IST), condition\n(exchange, tradingsymbol, trigger_values, last_price at placement), orders (with `result` once an order was\nplaced by the trigger, including the rejection reason if the order failed) and meta.","inputs":[{"name":"limit","type":"integer","required":false,"description":null},{"name":"offset","type":"integer","required":false,"description":null},{"name":"status","type":null,"required":false,"description":"only GTTs in this state; omit for all (active, triggered, disabled, expired, ...)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":145},{"name":"get_gtt","title":"One GTT","description":"One GTT by its trigger_id, whatever its age or status: type, status, condition, the orders it places and\nthe result of the order if the trigger fired.","inputs":[{"name":"trigger_id","type":"integer","required":true,"description":"the GTT's trigger_id (see get_gtts)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":64},{"name":"place_gtt_order","title":"Place a GTT (dry run by default)","description":"Place a GTT (good till triggered): Kite watches the price and places a LIMIT order when a trigger value is\nreached. DRY RUN BY DEFAULT: with dry_run=true (the default) nothing is sent; the answer shows the exact\nrequest, the value of each order, Kite's margin calculation, every safety check and, when live trading is\nenabled and the checks pass, a confirmation_token. To create it, repeat the identical call with dry_run=false\nand that token.\n\ntype=single: one trigger value (not equal to last_price) and one order. type=two-leg is an OCO (one cancels\nother): two trigger values, lower first, with last_price between them, and two orders; orders[i] is placed when\ntrigger_values[i] is reached and the other is dropped (typically a stop-loss below and a target above).\nlast_price is the current price in INR from get_ltp, get_quotes or get_holdings: never guess it. Only LIMIT\norders are supported; prices must sit on the tick size.\n\nSafety: a GTT uses one slot of the daily order count. Every order is checked against the per-order cap and the\nallow-lists; for an OCO only one order can execute, so the day's value grows by the larger order, not the sum.\nMCX, CDS and BCD GTTs cannot be valued and so cannot be sent live. Returns the trigger_id when sent.","inputs":[{"name":"confirmation_token","type":null,"required":false,"description":"the confirmation_token returned by a dry run of this exact call (single use)"},{"name":"dry_run","type":"boolean","required":false,"description":"true (default): validate and preview only, nothing is sent. false: send it live, which needs live trading enabled on the server and the confirmation_token from a dry run"},{"name":"exchange","type":"string","required":true,"description":"exchange of the instrument: NSE, BSE (equity), NFO, BFO (F&O), CDS, BCD, MCX"},{"name":"last_price","type":"number","required":true,"description":"the instrument's CURRENT price in INR (get_ltp / get_quotes / get_holdings). Kite uses it to decide which way each trigger fires, so it must be fresh"},{"name":"orders","type":"array","required":true,"description":"the order(s) to place: one for single, two for two-leg"},{"name":"tradingsymbol","type":"string","required":true,"description":"tradingsymbol, e.g. INFY"},{"name":"trigger_values","type":"array","required":true,"description":"trigger prices in INR, on the tick size: ONE value for single; TWO for two-leg, the lower first (trigger_values[i] fires orders[i])"},{"name":"type","type":"string","required":true,"description":"single: one trigger, one order. two-leg: OCO, two triggers, two orders"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":558},{"name":"modify_gtt_order","title":"Modify a GTT (dry run by default)","description":"Modify an ACTIVE GTT. Kite replaces the whole trigger, so send its complete new definition: call get_gtt\nfirst and change only what you mean to change. The fields are those of place_gtt_order, with the same rules.\nDRY RUN BY DEFAULT, confirmed like place_gtt_order.\n\nSafety: the new orders are checked against the per-order cap and the allow-lists. A modification takes no new\nslot of the daily order count; only the increase over the stored trigger's value counts toward the day's\nvalue cap. Returns the trigger_id when sent.","inputs":[{"name":"confirmation_token","type":null,"required":false,"description":"the confirmation_token returned by a dry run of this exact call (single use)"},{"name":"dry_run","type":"boolean","required":false,"description":"true (default): validate and preview only, nothing is sent. false: send it live, which needs live trading enabled on the server and the confirmation_token from a dry run"},{"name":"exchange","type":"string","required":true,"description":"exchange of the instrument: NSE, BSE (equity), NFO, BFO (F&O), CDS, BCD, MCX"},{"name":"last_price","type":"number","required":true,"description":"the instrument's CURRENT price in INR (get_ltp / get_quotes / get_holdings). Kite uses it to decide which way each trigger fires, so it must be fresh"},{"name":"orders","type":"array","required":true,"description":"the order(s) to place: one for single, two for two-leg"},{"name":"tradingsymbol","type":"string","required":true,"description":"tradingsymbol, e.g. INFY"},{"name":"trigger_id","type":"integer","required":true,"description":"the GTT's trigger_id (see get_gtts)"},{"name":"trigger_values","type":"array","required":true,"description":"trigger prices in INR, on the tick size: ONE value for single; TWO for two-leg, the lower first (trigger_values[i] fires orders[i])"},{"name":"type","type":"string","required":true,"description":"single: one trigger, one order. two-leg: OCO, two triggers, two orders"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":394},{"name":"delete_gtt_order","title":"Delete a GTT (dry run by default)","description":"Delete an ACTIVE GTT so it can no longer fire. DRY RUN BY DEFAULT, confirmed like place_gtt_order (deleting\na stop-loss GTT can increase risk, so it is not exempt). Caps do not apply to deletions; the allow-lists do,\njudged on the orders the GTT would have placed. The dry run shows the stored GTT. Returns the trigger_id\nwhen sent.","inputs":[{"name":"confirmation_token","type":null,"required":false,"description":"the confirmation_token returned by a dry run of this exact call (single use)"},{"name":"dry_run","type":"boolean","required":false,"description":"true (default): validate and preview only, nothing is sent. false: send it live, which needs live trading enabled on the server and the confirmation_token from a dry run"},{"name":"trigger_id","type":"integer","required":true,"description":"the GTT's trigger_id (see get_gtts)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":179},{"name":"get_alerts","title":"Alerts","description":"Your alerts, newest first. Kite allows at most 500 active alerts per user. Each has uuid, type (simple or\nato), name, status (enabled = being evaluated, disabled, deleted = soft-deleted), disabled_reason, the\ncondition (lhs_exchange, lhs_tradingsymbol, lhs_attribute, operator, rhs_type, rhs_constant or the rhs_*\ninstrument), alert_count (how many times it triggered), created_at / updated_at (IST) and, for an ato alert,\nthe basket of orders it places.","inputs":[{"name":"limit","type":"integer","required":false,"description":null},{"name":"offset","type":"integer","required":false,"description":null},{"name":"status","type":null,"required":false,"description":"only alerts in this state (enabled, disabled, deleted); omit for the default list"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":154},{"name":"get_alert","title":"One alert","description":"One alert by its uuid: type, name, status, condition, alert_count and, for an ato alert, its basket.","inputs":[{"name":"uuid","type":"string","required":true,"description":"the alert's uuid (see get_alerts)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":50},{"name":"get_alert_history","title":"When an alert triggered","description":"Every time the alert triggered, newest first: the condition as evaluated, created_at (IST), the market\ndata of the instrument at that moment (last_price, ohlc, volume, oi, ...) and, for an ato alert, the orders\nit placed (order_meta).","inputs":[{"name":"limit","type":"integer","required":false,"description":null},{"name":"offset","type":"integer","required":false,"description":null},{"name":"uuid","type":"string","required":true,"description":"the alert's uuid (see get_alerts)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":97},{"name":"create_alert","title":"Create an alert (dry run by default)","description":"Create a price alert. DRY RUN BY DEFAULT: with dry_run=true (the default) nothing is sent; the answer shows\nthe exact request, every safety check and, when live trading is enabled and the checks pass, a\nconfirmation_token. To create it, repeat the identical call with dry_run=false and that token. Kite allows at\nmost 500 active alerts per user.\n\nThe alert watches lhs_attribute (LastTradedPrice) of lhs_exchange:lhs_tradingsymbol and triggers when\n\"value operator right-hand side\" becomes true (operators: <=, >=, <, >, ==). The right-hand side is a constant\n(rhs_type=constant with rhs_constant, in INR for prices) or another instrument's attribute (rhs_type=instrument\nwith rhs_exchange and rhs_tradingsymbol). Indices live on the exchange INDICES (INDICES:NIFTY 50).\n\ntype=simple only notifies. type=ato (alert triggers order) also places the basket `orders` by itself when the\ncondition becomes true, with no confirmation at that moment: the confirmation you give now covers them. Each\nbasket order is checked like place_order (per-order cap, allow-lists, tick and lot size) and counts toward the\ndaily order count and value caps; MARKET orders are valued at the live price plus a buffer (paid market data\nneeded), MCX/CDS/BCD orders cannot be valued and so cannot be sent live. A simple alert has no orders and no\ncaps. Returns the created alert (with its uuid) when sent.","inputs":[{"name":"confirmation_token","type":null,"required":false,"description":"the confirmation_token returned by a dry run of this exact call (single use)"},{"name":"dry_run","type":"boolean","required":false,"description":"true (default): validate and preview only, nothing is sent. false: send it live, which needs live trading enabled on the server and the confirmation_token from a dry run"},{"name":"lhs_attribute","type":"string","required":false,"description":"what to monitor; LastTradedPrice is the only attribute Kite documents"},{"name":"lhs_exchange","type":"string","required":true,"description":"exchange of the monitored instrument: NSE, BSE, NFO, CDS, BCD, MCX, or INDICES for indices"},{"name":"lhs_tradingsymbol","type":"string","required":true,"description":"tradingsymbol of the monitored instrument: INFY, 'NIFTY 50'"},{"name":"name","type":"string","required":true,"description":"a label for the alert"},{"name":"operator","type":"string","required":true,"description":"comparison of the monitored value with the right-hand side"},{"name":"orders","type":null,"required":false,"description":"the basket of orders: required for type=ato (up to 20), not allowed for simple"},{"name":"rhs_attribute","type":null,"required":false,"description":"only for rhs_type=instrument; defaults to LastTradedPrice"},{"name":"rhs_constant","type":null,"required":false,"description":"the number to compare with (INR for prices); only for rhs_type=constant"},{"name":"rhs_exchange","type":null,"required":false,"description":"only for rhs_type=instrument"},{"name":"rhs_tradingsymbol","type":null,"required":false,"description":"only for rhs_type=instrument"},{"name":"rhs_type","type":"string","required":true,"description":"constant: compare with rhs_constant. instrument: compare with another instrument (rhs_*)"},{"name":"type","type":"string","required":true,"description":"simple: only notify. ato: also place the basket `orders` by itself when the condition is true"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":654},{"name":"modify_alert","title":"Modify an alert (dry run by default)","description":"Modify an alert. Kite replaces the whole alert, so send its complete new definition: call get_alert first\nand change only what you mean to change. The fields are those of create_alert, with the same rules (for an ato\nalert that includes the whole basket `orders`). DRY RUN BY DEFAULT, confirmed like create_alert.\n\nSafety: an ato alert's new basket is checked like place_order. A modification takes no new slot of the daily\norder count, but the full value of the new basket counts toward the day's value cap. The dry run shows the\nstored alert. Kite's docs do not say whether a basket sent here replaces the stored basket or adds to it, so\nthe dry run warns when the alert already has one. Returns the updated alert when sent.","inputs":[{"name":"confirmation_token","type":null,"required":false,"description":"the confirmation_token returned by a dry run of this exact call (single use)"},{"name":"dry_run","type":"boolean","required":false,"description":"true (default): validate and preview only, nothing is sent. false: send it live, which needs live trading enabled on the server and the confirmation_token from a dry run"},{"name":"lhs_attribute","type":"string","required":false,"description":"what to monitor; LastTradedPrice is the only attribute Kite documents"},{"name":"lhs_exchange","type":"string","required":true,"description":"exchange of the monitored instrument: NSE, BSE, NFO, CDS, BCD, MCX, or INDICES for indices"},{"name":"lhs_tradingsymbol","type":"string","required":true,"description":"tradingsymbol of the monitored instrument: INFY, 'NIFTY 50'"},{"name":"name","type":"string","required":true,"description":"a label for the alert"},{"name":"operator","type":"string","required":true,"description":"comparison of the monitored value with the right-hand side"},{"name":"orders","type":null,"required":false,"description":"the basket of orders: required for type=ato (up to 20), not allowed for simple"},{"name":"rhs_attribute","type":null,"required":false,"description":"only for rhs_type=instrument; defaults to LastTradedPrice"},{"name":"rhs_constant","type":null,"required":false,"description":"the number to compare with (INR for prices); only for rhs_type=constant"},{"name":"rhs_exchange","type":null,"required":false,"description":"only for rhs_type=instrument"},{"name":"rhs_tradingsymbol","type":null,"required":false,"description":"only for rhs_type=instrument"},{"name":"rhs_type","type":"string","required":true,"description":"constant: compare with rhs_constant. instrument: compare with another instrument (rhs_*)"},{"name":"type","type":"string","required":true,"description":"simple: only notify. ato: also place the basket `orders` by itself when the condition is true"},{"name":"uuid","type":"string","required":true,"description":"the alert's uuid (see get_alerts)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":507},{"name":"delete_alerts","title":"Delete alerts (dry run by default)","description":"Delete one or more alerts in a single call (a deleted alert shows status 'deleted'). Deleting an ato alert\nalso removes the orders it would have placed. DRY RUN BY DEFAULT, confirmed like create_alert. No caps or\nallow-lists apply to a deletion. The dry run lists the alerts that will be deleted. Kite answers with no\ndata when it is sent.","inputs":[{"name":"confirmation_token","type":null,"required":false,"description":"the confirmation_token returned by a dry run of this exact call (single use)"},{"name":"dry_run","type":"boolean","required":false,"description":"true (default): validate and preview only, nothing is sent. false: send it live, which needs live trading enabled on the server and the confirmation_token from a dry run"},{"name":"uuids","type":"array","required":true,"description":"uuids of the alerts to delete (see get_alerts), up to 50"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":176},{"name":"get_holdings","title":"Holdings","description":"Long-term equity holdings in the demat account, by tradingsymbol, with a `summary` over ALL the holdings\nthat match (not just the page), in INR: invested (average_price x shares), current_value (last_price x shares),\npnl (the sum of Kite's pnl) and its percentage, day_change (against the previous close) and its percentage.\nThe shares of a holding are quantity (settled, T+2) plus t1_quantity (bought, not yet delivered). Each holding\nhas tradingsymbol, exchange, isin, product, quantity, t1_quantity, used_quantity, authorised_quantity (for\nsale at the depository), collateral_quantity, average_price, last_price, close_price, pnl, day_change (per\nshare) and day_change_percentage.","inputs":[{"name":"limit","type":"integer","required":false,"description":null},{"name":"offset","type":"integer","required":false,"description":null},{"name":"tradingsymbol","type":null,"required":false,"description":"only holdings of this tradingsymbol, e.g. INFY"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":207},{"name":"get_positions","title":"Positions","description":"Short-term positions (derivatives and intraday equity). `net` is the actual current position book; `day`\nis a snapshot of today's buying and selling, useful for intraday P&L. Each position has tradingsymbol,\nexchange, product, quantity, overnight_quantity, multiplier (lot-size multiplier for P&L: 1 for equity and\nF&O, the lot size for MCX), average_price, last_price, value, pnl, m2m, unrealised, realised and the\nbuy / sell / day_buy / day_sell quantity, price and value. A `summary` per book totals pnl, m2m, unrealised\nand realised (INR) and counts the open positions (quantity not 0). Equity positions carried overnight move\nto the holdings the next day.","inputs":[{"name":"kind","type":"string","required":false,"description":"net: the actual current positions. day: today's buying and selling. both (default)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":197},{"name":"get_auctions","title":"Auctions of your holdings","description":"The auctions being held right now for stocks you hold in your demat account (only those). Each entry is\nthe holding (tradingsymbol, exchange, isin, quantity, average_price, last_price, pnl, ...) plus its\nauction_number: pass that to place_order with variety=auction to take part.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":74},{"name":"convert_position","title":"Convert a position's product (dry run by default)","description":"Convert the margin product of an open position, for example MIS to NRML or NRML to MIS.\nDRY RUN BY DEFAULT: with dry_run=true (the default) nothing is sent; the answer shows the exact request, the\nposition found in get_positions, every safety check and, when live trading is enabled and the checks pass, a\nconfirmation_token. To convert, repeat the identical call with dry_run=false and that token.\n\nA conversion places no order and adds no exposure, so it does not count toward the daily order count or the\ndaily value. It is still checked: the new product must be allowed, and the converted quantity's notional\n(quantity x multiplier x last_price from get_positions) must be within the per-order cap. If the position is\nnot found, its value is unknown and the conversion cannot be sent live. Moving a position out of MIS keeps it\nopen past the end of the day and needs the full margin of the new product. Returns true when sent.","inputs":[{"name":"confirmation_token","type":null,"required":false,"description":"the confirmation_token returned by a dry run of this exact call (single use)"},{"name":"dry_run","type":"boolean","required":false,"description":"true (default): validate and preview only, nothing is sent. false: send it live, which needs live trading enabled on the server and the confirmation_token from a dry run"},{"name":"exchange","type":"string","required":true,"description":"exchange of the position: NSE, BSE, NFO, BFO, CDS, BCD, MCX"},{"name":"new_product","type":"string","required":true,"description":"the margin product to convert to"},{"name":"old_product","type":"string","required":true,"description":"the position's current margin product"},{"name":"position_type","type":"string","required":true,"description":"overnight: carried over from a previous day. day: opened today"},{"name":"quantity","type":"integer","required":true,"description":"quantity to convert (MCX/CDS/BCD: lots)"},{"name":"tradingsymbol","type":"string","required":true,"description":"e.g. INFY, NIFTY25NOVFUT"},{"name":"transaction_type","type":"string","required":true,"description":"the position's side: BUY for a long position, SELL for a short one"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":420},{"name":"authorise_holdings","title":"Authorise holdings for sale (dry run by default)","description":"Start a CDSL authorisation so that shares can be sold from the demat account. Call this when a SELL fails\nwith HTTP 428 ('N quantity needs authorisation at depository'). DRY RUN BY DEFAULT: with dry_run=true (the\ndefault) nothing is sent; the answer shows the request and the checks. Repeat the identical call with\ndry_run=false and the confirmation_token to send it: Kite answers with a request_id, and this tool's live\nanswer then contains `authorise_url`, the link YOU open in a browser to key in your demat PIN (TPIN) at CDSL.\nThe PIN never passes through this server. Nothing is authorised until you finish that page.\n\nWith `holdings` (isin and quantity pairs) only those shares are authorised; without it the page offers the\nentire holdings. An authorisation is valid for one trading session (until 5:30 PM IST, then it counts for the\nnext trading day) and is used up as you sell. This is not an order: no caps apply.","inputs":[{"name":"confirmation_token","type":null,"required":false,"description":"the confirmation_token returned by a dry run of this exact call (single use)"},{"name":"dry_run","type":"boolean","required":false,"description":"true (default): validate and preview only, nothing is sent. false: send it live, which needs live trading enabled on the server and the confirmation_token from a dry run"},{"name":"holdings","type":null,"required":false,"description":"the holdings (isin, quantity) to authorise; omit to authorise the entire holdings"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":315},{"name":"get_quotes","title":"Full market quotes","description":"Full market snapshot for up to 500 instruments in one call: last_price, last_quantity, volume,\naverage_price, buy_quantity / sell_quantity, ohlc (close is the previous session's close), net_change, oi /\noi_day_high / oi_day_low (F&O), lower / upper circuit limits and the 5-level market depth (buy / sell price,\nquantity, orders). Prices are in INR, timestamps in IST. Returns {\"quotes\": {instrument: snapshot}, \"missing\":\n[...]}: `missing` lists requested instruments Kite has no data for (misspelt, expired or not traded). Needs the\npaid Kite Connect plan; quote calls are limited to 1 per second. A full quote with depth is about 1.5 KB: for\nmany instruments use get_ltp or get_ohlc.","inputs":[{"name":"instruments","type":"array","required":true,"description":"1 to 500 instruments, each EXCHANGE:TRADINGSYMBOL (e.g. \"NSE:INFY\", \"NSE:NIFTY 50\", \"NFO:NIFTY25NOVFUT\")"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":232},{"name":"get_ohlc","title":"OHLC quotes","description":"Last price and the day's open / high / low / close (close is the previous session's close) for up to 1000\ninstruments in one call, in INR. Returns {\"quotes\": {instrument: {instrument_token, last_price, ohlc}},\n\"missing\": [...]} (`missing`: instruments Kite has no data for). Lighter than get_quotes: no depth, volume or\nopen interest. Needs the paid Kite Connect plan.","inputs":[{"name":"instruments","type":"array","required":true,"description":"1 to 1000 instruments, each EXCHANGE:TRADINGSYMBOL (e.g. \"NSE:INFY\", \"NSE:NIFTY 50\", \"NFO:NIFTY25NOVFUT\")"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":156},{"name":"get_ltp","title":"Last traded prices","description":"Last traded price (INR) for up to 1000 instruments in one call. Returns {\"quotes\": {instrument:\n{instrument_token, last_price}}, \"missing\": [...]} (`missing`: instruments Kite has no data for). The cheapest\nprice check. Needs the paid Kite Connect plan.","inputs":[{"name":"instruments","type":"array","required":true,"description":"1 to 1000 instruments, each EXCHANGE:TRADINGSYMBOL (e.g. \"NSE:INFY\", \"NSE:NIFTY 50\", \"NFO:NIFTY25NOVFUT\")"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":123},{"name":"get_historical_data","title":"Historical candles","description":"OHLCV candles for one instrument between two IST times, oldest first, in INR. Returns {instrument,\ninstrument_token, interval, from, to, columns, candles, count}; each candle is a list in `columns` order\n(date, open, high, low, close, volume, and oi when requested), `date` being the candle's start as Kite sends it\n(e.g. 2026-11-03T09:15:00+0530; day candles are at 00:00).\n\nKite limits the date range of one request by interval (minute 60 days, 3/5/10minute 100, 15/30minute 200,\n60minute 400, day 2000). Longer ranges are split into several requests automatically, newest first, and the\ntool stops as soon as it holds `limit` candles (at most 2000, always the newest). When older candles may exist\nin the range, `truncated` is true and `note` explains: to read further back, call again with to_date just\nbefore the first candle returned. continuous=true gives a future's day candles across its expired contracts\n(interval must be day). oi=true adds open interest (zero or null for plain equities). Needs the paid Kite\nConnect plan; historical requests are limited to 3 per second. Output is large (a candle is about 25 tokens, so\n2000 candles are about 50k): ask for the range you need, or set `limit`.","inputs":[{"name":"continuous","type":"boolean","required":false,"description":"futures only, interval day: stitch the expired contracts of a future together"},{"name":"from_date","type":"string","required":true,"description":"start (IST): \"YYYY-MM-DD\" (from 00:00:00) or \"YYYY-MM-DD HH:MM:SS\""},{"name":"instrument","type":null,"required":true,"description":"EXCHANGE:TRADINGSYMBOL (e.g. \"NSE:INFY\", \"NSE:NIFTY 50\", \"NFO:NIFTY25NOVFUT\") or a numeric instrument_token (e.g. 408065)"},{"name":"interval","type":"string","required":true,"description":"candle size: minute, 3minute ... 60minute, or day"},{"name":"limit","type":null,"required":false,"description":"keep only the newest N candles (default and maximum 2000)"},{"name":"oi","type":"boolean","required":false,"description":"add the open interest column (futures and options)"},{"name":"to_date","type":"string","required":true,"description":"end (IST, inclusive): \"YYYY-MM-DD\" (up to 23:59:59 of that day) or \"YYYY-MM-DD HH:MM:SS\"; a time in the future means now"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":543},{"name":"search_instruments","title":"Search instruments","description":"Find instruments in Kite's daily instrument list (cached locally; see get_instruments_status). Returns a\nlist, best match first (exact tradingsymbol, then prefix, then substring; NSE before NFO before BSE), each with\nkey (EXCHANGE:TRADINGSYMBOL, the name every other tool takes), instrument_token, exchange_token, tradingsymbol,\nname, exchange, segment, instrument_type, expiry, strike, lot_size (orders on NFO / BFO must be a multiple\nof it), tick_size (INR; limit prices must be a multiple of it) and last_price (from the daily dump, NOT live:\nuse get_ltp). A full list (`limit` entries) may have more behind it: add filters. Examples:\nquery=\"NIFTY\", instrument_type=\"FUT\", exchange=\"NFO\" for index futures; query=\"RELIANCE\", expiry=\"2026-11\" for\nthat month's contracts.","inputs":[{"name":"exchange","type":null,"required":false,"description":"NSE, BSE, NFO, BFO, CDS, BCD or MCX"},{"name":"expiry","type":null,"required":false,"description":"derivatives only: \"YYYY-MM-DD\", or \"YYYY-MM\" for every expiry in that month"},{"name":"instrument_type","type":null,"required":false,"description":"EQ (also indices), FUT, CE or PE"},{"name":"limit","type":"integer","required":false,"description":"most results to return"},{"name":"query","type":"string","required":false,"description":"part of the tradingsymbol or company name, case-insensitive; every word must match, in any order (e.g. \"infy\", \"nifty bank\", \"reliance\"). May be empty when a filter is given"},{"name":"segment","type":null,"required":false,"description":"e.g. NSE, BSE, INDICES, NFO-FUT, NFO-OPT, BFO-OPT, CDS-FUT, MCX-FUT"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":376},{"name":"get_instrument","title":"Instrument details","description":"One instrument from Kite's daily instrument list: key, instrument_token, exchange_token, tradingsymbol, name,\nexchange, segment, instrument_type (EQ, FUT, CE, PE), expiry, strike, lot_size, tick_size (INR) and last_price\n(from the daily dump, not live). Use it to check the lot size and tick size before an order.","inputs":[{"name":"instrument","type":null,"required":true,"description":"EXCHANGE:TRADINGSYMBOL (e.g. \"NSE:INFY\", \"NSE:NIFTY 50\", \"NFO:NIFTY25NOVFUT\") or a numeric instrument_token (e.g. 408065)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":142},{"name":"get_instruments_status","title":"Instrument list status","description":"What the local instrument cache holds: for the instrument list and the mutual fund list, whether it is\nloaded, row counts (per exchange for the instrument list), when it was loaded, whether it is stale (Kite\npublishes a new dump every day around 08:30 IST), when it will next be refreshed and the last refresh error,\nif any. Never contacts Kite.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":89},{"name":"refresh_instruments","title":"Refresh the instrument list","description":"Download Kite's instrument list and mutual fund list into the local cache (a few MB). The cache refreshes\nitself on first use after 08:30 IST each day, so this is only needed after a failed refresh or when a brand-new\ncontract is missing. Returns the same as get_instruments_status plus `refreshed` (the lists replaced). A list\nthat fails to download keeps its old copy, and the error is shown under last_error.","inputs":[{"name":"force","type":"boolean","required":false,"description":"download both lists again even if today's are cached (default: only stale ones)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":127},{"name":"search_mf_instruments","title":"Search mutual fund schemes","description":"Find mutual fund schemes on Zerodha Coin in Kite's daily mutual fund list (cached locally). Returns a list,\nbest match first, each with tradingsymbol (the scheme's ISIN, which the MF tools take), amc, name,\npurchase_allowed, redemption_allowed, minimum_purchase_amount and purchase_amount_multiplier (INR),\nminimum_additional_purchase_amount, minimum_redemption_quantity and redemption_quantity_multiplier (units),\ndividend_type (growth / payout), scheme_type, plan (direct / regular), settlement_type, last_price (the latest\nNAV, INR) and last_price_date.","inputs":[{"name":"amc","type":null,"required":false,"description":"part of the fund house code, e.g. \"AXIS\" (codes look like AXISMUTUALFUND_MF)"},{"name":"limit","type":"integer","required":false,"description":"most results to return"},{"name":"plan","type":null,"required":false,"description":"direct or regular"},{"name":"query","type":"string","required":false,"description":"part of the fund name or its ISIN, case-insensitive; every word must match (e.g. \"axis bluechip\", \"INF846K01DP8\"). May be empty when a filter is given"},{"name":"scheme_type","type":null,"required":false,"description":"equity, debt, elss ..."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":243},{"name":"get_order_margins","title":"Margin required for orders","description":"Margin Kite would block for each of 1 to 50 orders, without placing anything (works in read-only mode too).\n\nEvery order is priced on its own, taking your existing positions and open orders into account; to price\norders as one package (hedge or spread benefit) use get_basket_margins. All amounts are INR. Each entry has\ntype (equity or commodity), span, exposure, option_premium, additional, bo, cash, var, pnl, leverage, charges\nand total, the margin to block. mode=compact returns the totals only. Leave price at 0 for MARKET and SL-M\norders. `summary` adds up the totals and the charges.","inputs":[{"name":"mode","type":null,"required":false,"description":"compact: only the totals; omit for the full breakdown"},{"name":"orders","type":"array","required":true,"description":"1 to 50 orders"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":183},{"name":"get_basket_margins","title":"Margin required for a basket of orders","description":"Margin for 1 to 50 orders taken together as one basket, without placing anything (also in read-only mode).\n\n`initial` is the total margin required to execute the orders, `final` the total margin with the spread\n(hedge) benefit, `orders` the per-order margins, and `charges` Kite's overall charges block, which can leave\nout the transaction tax when MCX and equity orders are mixed: use the per-order charges instead. All amounts\nare INR. mode=compact returns the totals only. `summary` gives the initial and final margin, the spread\nbenefit (initial minus final) and the summed per-order charges.","inputs":[{"name":"consider_positions","type":"boolean","required":false,"description":"true (default): net the basket against your open positions; false: price it alone"},{"name":"mode","type":null,"required":false,"description":"compact: only the totals; omit for the full breakdown"},{"name":"orders","type":"array","required":true,"description":"1 to 50 orders"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":202},{"name":"get_order_charges","title":"Charges for orders (virtual contract note)","description":"Charges Kite would levy on 1 to 50 executed or imaginary orders (a virtual contract note), without\nplacing anything (works in read-only mode too): brokerage, transaction tax (STT, or CTT on commodities),\nexchange and SEBI turnover charges, stamp duty and GST, all INR.\n\nGive each order's average_price (the price it was or would be executed at; must be above 0); order_id can\nbe any string. Each entry in `orders` is Kite's answer for one order: the order's fields, the price used and\na `charges` block (total plus the breakdown). `summary` has the grand total, the total per component and a\nline per order.","inputs":[{"name":"orders","type":"array","required":true,"description":"1 to 50 orders"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":169},{"name":"get_mf_holdings","title":"Mutual fund holdings","description":"Mutual fund units in your demat account, largest first. Each holding has tradingsymbol (the fund's ISIN),\nfund (name), folio, quantity (units), average_price (INR per unit paid), last_price (the last available NAV,\nINR per unit), last_price_date, pnl and pledged_quantity. `summary` covers ALL holdings, not just the page:\ninvested and current value in INR, the profit or loss and its percentage.","inputs":[{"name":"limit","type":"integer","required":false,"description":"items per page"},{"name":"offset","type":"integer","required":false,"description":"items to skip"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":126},{"name":"get_mf_orders","title":"Mutual fund orders","description":"Mutual fund orders. With order_id: that one order, however old. Without: every order of the last 7 days\n(open and executed, lump sums and SIP instalments), newest first, optionally filtered by status, with\n`status_counts` over the whole window. Each order has order_id, status, status_message, tradingsymbol (ISIN),\nfund, transaction_type, amount (INR), quantity (units allotted or sold), average_price (the NAV used),\nlast_price (latest NAV), variety (regular, sip, amc_sip), folio and tag.","inputs":[{"name":"limit","type":"integer","required":false,"description":"items per page"},{"name":"offset","type":"integer","required":false,"description":"items to skip"},{"name":"order_id","type":null,"required":false,"description":"one order, whatever its age (the list only goes back 7 days)"},{"name":"status","type":null,"required":false,"description":"list only: keep orders in this status, case-insensitive (COMPLETE, REJECTED, CANCELLED, OPEN...; status_counts shows which exist)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":207},{"name":"get_mf_sips","title":"Mutual fund SIPs","description":"Mutual fund SIPs (recurring purchases): with sip_id one SIP, else all active and paused ones with\n`status_counts`. Each has sip_id, tradingsymbol (ISIN), fund, status (ACTIVE, PAUSED, CANCELLED),\ninstalment_amount (INR), frequency (weekly, monthly, quarterly), instalment_day (monthly only, else 0),\ninstalments (the number planned; -1 means until cancelled), completed_instalments, pending_instalments,\nnext_instalment, last_instalment and tag.","inputs":[{"name":"limit","type":"integer","required":false,"description":"items per page"},{"name":"offset","type":"integer","required":false,"description":"items to skip"},{"name":"sip_id","type":null,"required":false,"description":"one SIP; omit to list them all"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":159},{"name":"ticker_subscribe","title":"Stream live ticks","description":"Start streaming live market data for instruments over Kite's WebSocket. The server opens one connection in\nthe background on the first call (it needs the paid Kite Connect plan and a current login), reconnects and\nresubscribes by itself, and keeps the latest tick of every subscribed instrument for ticker_get_ticks.\n\nModes: ltp (last price), quote (default: last price, last quantity, average price, volume, buy/sell quantity,\nOHLC, change %), full (quote plus open interest, last trade time, exchange timestamp and 5 levels of bid/offer\ndepth). Indices have no volume or depth. Subscribing an instrument again with another mode switches its mode.\nAt most KITE_MCP_TICKER_MAX_SUBSCRIPTIONS instruments (default 1000; Kite allows 3000) can be subscribed.\n\nAn empty instruments list only opens the connection, which is how to receive order updates\n(ticker_order_updates) without market data. This changes only the server's own streaming state; it places no\norders.","inputs":[{"name":"instruments","type":"array","required":true,"description":"EXCHANGE:TRADINGSYMBOL names (NSE:INFY, NSE:NIFTY 50, NFO:NIFTY25NOVFUT) and/or numeric instrument tokens (408065). Names are looked up in the instrument list; if that cannot be loaded, use tokens."},{"name":"mode","type":"string","required":false,"description":"ltp = last price only; quote = price, volume, OHLC, buy/sell quantity; full = quote plus open interest and 5-level market depth"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":329},{"name":"ticker_unsubscribe","title":"Stop streaming instruments","description":"Stop streaming instruments and drop their cached ticks. Instruments that were not subscribed are listed\nunder not_subscribed. The WebSocket connection stays open (order updates keep arriving); ticker_stop closes\nit.","inputs":[{"name":"instruments","type":"array","required":true,"description":"EXCHANGE:TRADINGSYMBOL names (NSE:INFY, NSE:NIFTY 50, NFO:NIFTY25NOVFUT) and/or numeric instrument tokens (408065). Names are looked up in the instrument list; if that cannot be loaded, use tokens."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":115},{"name":"ticker_get_ticks","title":"Latest cached ticks","description":"The latest tick received for each subscribed instrument, from the server's cache (nothing is requested from\nKite). Each tick has instrument (when known), instrument_token, mode, last_price and, for quote and full,\nlast_traded_quantity, average_traded_price, volume_traded, total_buy_quantity, total_sell_quantity,\nohlc {open, high, low, close} and change (% from the previous close); full adds oi, oi_day_high, oi_day_low,\nlast_trade_time, exchange_timestamp and depth {buy, sell} (5 levels of {quantity, price, orders}). Prices are\nin rupees, times in IST. Every tick also has received_at and age_s (seconds since it arrived): ticks stop\noutside market hours or when the connection is down, so check age_s, or pass max_age_s to be told which\ninstruments are stale. Instruments subscribed but without a tick yet are listed under no_tick_yet.","inputs":[{"name":"instruments","type":null,"required":false,"description":"which instruments (names and/or tokens); default: every subscribed instrument"},{"name":"max_age_s","type":null,"required":false,"description":"leave out ticks older than this many seconds; they are listed under stale"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":244},{"name":"ticker_status","title":"WebSocket ticker status","description":"The state of the WebSocket ticker: state (idle, connecting, connected, retrying, waiting_for_login, blocked,\nfailed), connected, connected_since, last_message_at (any frame, heartbeats included), last_tick_at,\nreconnects, subscriptions by mode, how many ticks and order updates are cached, packets_skipped (frames this\nserver could not parse), last_error, and blocked (why the ticker stopped retrying: Kite refused the token, for\nexample because the app has no paid WebSocket plan). Nothing in it is secret.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":121},{"name":"ticker_order_updates","title":"Order updates and broker messages","description":"Order updates and broker messages received by this server: the WebSocket stream (live updates for orders\nplaced anywhere on the account: web, mobile or API) and, when KITE_MCP_POSTBACK_PATH is set, Kite postbacks\nsent to the HTTP endpoint. Each item has seq, received_at, source (\"ticker\" or \"postback\"), type (\"order\";\n\"error\" or \"message\" for Kite's own text) and data. For orders, data has order_id, status (COMPLETE, REJECTED,\nCANCELLED, UPDATE...), status_message, exchange, tradingsymbol, transaction_type, order_type, product, variety,\nquantity, filled_quantity, pending_quantity, price, trigger_price, average_price and timestamps.\n\nOnly the last 500 items are kept, in memory, and items arrive only while the WebSocket is open\n(ticker_subscribe, even with an empty list, opens it) or the postback endpoint is receiving. Without since:\nthe latest items, oldest first. With since: the first items after it, so you can page forward (more=true\nmeans there are further ones). These are notifications, not the book of record: a postback is authenticated\nonly by a checksum over order_id and order_timestamp, so confirm what matters with get_order_history.","inputs":[{"name":"limit","type":"integer","required":false,"description":"at most this many items"},{"name":"since","type":null,"required":false,"description":"ISO 8601 time (IST if no offset): only items received after it, oldest first"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":312},{"name":"ticker_stop","title":"Stop the WebSocket ticker","description":"Close the WebSocket connection and forget all subscriptions and cached ticks (order updates already\nreceived stay available). Calling ticker_subscribe later starts afresh, which is also how to retry after Kite\nrefused the connection with the current token. Safe to call when nothing is running.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":64},{"name":"get_safety_status","title":"Safety settings and today's usage","description":"How this server guards writes: trading mode (dry_run or live), read-only, how live writes are confirmed,\nthe per-order / daily value caps and order count, the allow-lists, whether the kill switch is on, and what has\nbeen sent live today (counted from the audit log). Call this before planning any order.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":79},{"name":"get_audit_log","title":"Audit log of write attempts","description":"The audit log: every dry run, refusal, confirmation, live send and its result, oldest first (newest\n`limit`). Each event has a call_id tying a live_intent to its live_result / live_error / live_unknown.","inputs":[{"name":"date","type":null,"required":false,"description":"IST date YYYY-MM-DD; omit for today"},{"name":"limit","type":"integer","required":false,"description":"newest N events"},{"name":"tool","type":null,"required":false,"description":"only events of this tool, e.g. place_order"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":99},{"name":"engage_kill_switch","title":"Engage the kill switch","description":"Stop every write at once: creates the kill-switch file, after which all write tools are refused (dry runs\nstill work and say so). Only a person can switch it off again, by deleting the file on the server.","inputs":[{"name":"reason","type":"string","required":true,"description":"why writes are being stopped"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":68}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-05T09:03:37.000Z","track":"package","endpoint":null,"declaredUrl":null,"truncated":false,"tls":null,"dnssec":null,"auth":null,"httpsRedirect":null,"transports":[],"provenance":{"outcome":"verified","label":"Verified","reason":"verified","reasonLabel":"Verified","discovery":"attestation_endpoint","discoveryLabel":"Registry attestation endpoint","sourceRepo":null,"attestationSkipped":null,"attestationSkippedLabel":null},"installScripts":[{"hook":"build_backend","tier":"allowlisted"}],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":{"nodes":29,"partial":false,"deprecated":null,"stale":null,"noRepo":1}},"mismatches":[],"changelog":{"trackingSince":"2026-11-03","recent":[{"id":"chg_01a1aaf3-0dfc-726f-83ab-cb54d34058c8","kind":"score.total_changed","summary":"Trust score (64 → 65)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/techfreakworm-kite-connect-mcp/kite-connect-mcp#chg-chg_01a1aaf3-0dfc-726f-83ab-cb54d34058c8"},{"id":"chg_01a1a474-9067-7d66-9616-d0bc6928a99b","kind":"check.reverified","summary":"Stability (unverified → 0.03)","materiality":"functional","direction":"improvement","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/techfreakworm-kite-connect-mcp/kite-connect-mcp#chg-chg_01a1a474-9067-7d66-9616-d0bc6928a99b"},{"id":"chg_01a1a474-9068-7b53-ac9d-18ad7948dde6","kind":"package.version_changed","summary":"Package version (0.1.0 → 0.1.1)","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/techfreakworm-kite-connect-mcp/kite-connect-mcp#chg-chg_01a1a474-9068-7b53-ac9d-18ad7948dde6"},{"id":"chg_01a1a322-84f8-7dd5-977e-4c0b6f46a09e","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/techfreakworm-kite-connect-mcp/kite-connect-mcp#chg-chg_01a1a322-84f8-7dd5-977e-4c0b6f46a09e"}],"truncated":false,"feedUrl":"https://verifymcp.io/servers/techfreakworm-kite-connect-mcp/kite-connect-mcp/changelog.json"},"links":{"html":"https://verifymcp.io/servers/techfreakworm-kite-connect-mcp/kite-connect-mcp","markdown":"https://verifymcp.io/servers/techfreakworm-kite-connect-mcp/kite-connect-mcp.md","changelogJson":"https://verifymcp.io/servers/techfreakworm-kite-connect-mcp/kite-connect-mcp/changelog.json","changelogRss":"https://verifymcp.io/servers/techfreakworm-kite-connect-mcp/kite-connect-mcp.xml","external":[{"label":"PyPI project","href":"https://pypi.org/project/kite-connect-mcp/"},{"label":"Socket report","href":"https://socket.dev/pypi/package/kite-connect-mcp"},{"label":"Repository","href":"https://github.com/techfreakworm/kite-connect-mcp"}]}}