{"slug": "i-built-an-open-source-mcp-server-that-gives-any-ai-assistant-live-nse-bse-stock", "title": "I built an open-source MCP server that gives any AI assistant live NSE + BSE stock data", "summary": "A developer built and open-sourced an MCP server that provides live NSE and BSE stock data to AI assistants like ChatGPT and Claude. The server runs as a stateless Cloudflare Worker, supporting over 8,200 stocks with fundamentals, technicals, and institutional flows. It implements OAuth authentication and refunds quota for failed API calls due to hallucinated arguments.", "body_md": "Ask ChatGPT or Claude \"what was Reliance's operating margin last quarter?\" and you get one of two answers: a polite \"I don't have live data,\" or a confident, wrong number. The reasoning is great. The data access is nonexistent — these models are blind to anything past their training cut-off, and they have zero native window into NSE/BSE.\n\nSo I built an MCP server to fix it, and open-sourced it. This is the build story + a quick-start if you want to plug it into your own setup.\n\nThe **Model Context Protocol** is an open standard that lets AI assistants call external tools through a consistent interface. Instead of guessing, the model issues a structured request — `get_stock_quote`\n\nfor `RELIANCE`\n\n— gets real data back, and reasons over it. One protocol, and Claude, ChatGPT, Cursor, Gemini, and Grok can all hit the same data source.\n\nIt's basically USB-C for AI tools.\n\n```\nsearch_stocks            screen_stocks (326 fundamental filters)\nscreen_stocks_technical  get_company_profile   get_financials\nget_stock_quote          get_price_history     get_shareholding\nget_fii_dii_detail       market_ipo            market_fno_ban\nget_user_portfolio       add_to_watchlist      ...and 21 more\n```\n\nCoverage: all ~8,200 NSE + BSE stocks, fundamentals, technicals, institutional flows, market data, and portfolio tracking. (It's a research tool, not a broker — it doesn't place trades.)\n\nThe big one: **remote-first, on the edge.**\n\n```\n┌─────────────────┐   JSON-RPC / HTTPS   ┌──────────────────────┐\n│  AI Assistant   │ ───────────────────► │  Cloudflare Worker   │\n│ (Claude, etc.)  │ ◄─────────────────── │  (stateless MCP)     │\n└─────────────────┘                       └──────────────────────┘\n                                              │\n                                   D1 (users, tokens, usage)\n                                   KV (rate limits, auth codes)\n```\n\nMost MCP servers ship as local stdio processes you have to install and run. That's a friction wall for non-developers. I wanted someone to paste one URL into claude.ai and be done — so the server runs as a Cloudflare Worker. Globally distributed, no servers to babysit.\n\nThe MCP SDK's `WebStandardStreamableHTTPServerTransport`\n\nin stateless mode maps perfectly onto Workers — any request hits any edge location and is served identically:\n\n``` js\nconst server = createServer(env, ph, userId);\nconst transport = new WebStandardStreamableHTTPServerTransport({\n  sessionIdGenerator: undefined,  // stateless\n  enableJsonResponse: true,\n});\nawait server.connect(transport);\n```\n\nMCP clients vary wildly. Chat apps (Claude.ai, ChatGPT) expect a full OAuth flow with **Dynamic Client Registration (RFC 7591)** plus discovery endpoints (RFC 8414, RFC 9728). Code editors often just want a bearer token.\n\nThe trick that makes the OAuth handshake \"just work\": return a `401`\n\nwith a `WWW-Authenticate`\n\nheader on the first `initialize`\n\n. That's the signal that kicks off the client's built-in OAuth flow.\n\n```\nif (!authHeader?.startsWith(\"Bearer \") && !isPublicMethod) {\n  return Response.json(\n    { error: \"authentication_required\" },\n    { status: 401, headers: {\n        \"WWW-Authenticate\":\n          `Bearer resource_metadata=\"${metadataUrl}\", scope=\"openid email\"`,\n    }},\n  );\n}\n```\n\nSo the server accepts **both** short-lived HMAC access tokens and long-lived personal tokens, distinguished by prefix (`tpt_rt_…`\n\n). One auth surface, two credential types. `tools/list`\n\nand `ping`\n\nstay public so registries can discover the catalog without auth.\n\nTwo independent layers:\n\n`UPSERT`\n\nreserves a unit The part I'm happiest with: **failed calls get refunded.** The MCP SDK throws `InvalidParams`\n\nwhenever a tool argument fails schema validation — and LLMs hallucinate bad arguments constantly. Charging a user's quota because their model fumbled an argument would be infuriating.\n\n```\nif (quotaConsumed && userId) {\n  quotaConsumed = false;            // guard against double-refund\n  if (hasError) {\n    ctx.waitUntil(refundRateLimitV2(env.DB, userId, date, month));\n  } else {\n    ctx.waitUntil(trackToolCall(env.DB, userId, src));\n  }\n}\n```\n\nFor stdio-only clients there's a tiny npm package — ~300 lines, zero runtime deps. No business logic: it reads JSON-RPC from stdin, forwards to the Worker over HTTPS, writes responses to stdout. It auto-detects message framing (Content-Length vs newline-delimited JSON, which differ across clients) and refreshes the access token before expiry. All tool logic lives on the server, so new tools ship instantly without anyone running `npm update`\n\n.\n\n**No install** (claude.ai, ChatGPT, Gemini, Grok) — paste the URL, sign in with Google:\n\n```\nhttps://mcp.tapetide.com/mcp\n```\n\n**Local via npm** (Cursor, Windsurf, Claude Desktop):\n\n```\n{\n  \"mcpServers\": {\n    \"tapetide\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"tapetide-mcp\"],\n      \"env\": { \"TAPETIDE_TOKEN\": \"your_token_here\" }\n    }\n  }\n}\n```\n\nThen just ask:\n\n\"Find mid-caps where FII holding rose last quarter, ROE above 15%, and RSI under 40.\"\n\n`npx`\n\ncommand for reach.`.well-known`\n\ndiscovery endpoints precisely.Free and open source under MIT. Source, all 34 tools, and setup guides:\n\n🔗 [https://github.com/Tapetide-hq/nse-bse-indian-stock-market-data-mcp](https://github.com/Tapetide-hq/nse-bse-indian-stock-market-data-mcp)\n\nIf you build something on top of it or have ideas for tools you'd want, I'd love to hear it in the comments.", "url": "https://wpnews.pro/news/i-built-an-open-source-mcp-server-that-gives-any-ai-assistant-live-nse-bse-stock", "canonical_source": "https://dev.to/govind_sisara/i-built-an-open-source-mcp-server-that-gives-any-ai-assistant-live-nse-bse-stock-data-5f8h", "published_at": "2026-06-20 02:54:53+00:00", "updated_at": "2026-06-20 03:06:43.185976+00:00", "lang": "en", "topics": ["developer-tools", "large-language-models", "artificial-intelligence", "ai-agents", "ai-infrastructure"], "entities": ["NSE", "BSE", "Cloudflare", "Claude", "ChatGPT", "MCP", "Cursor", "Gemini"], "alternates": {"html": "https://wpnews.pro/news/i-built-an-open-source-mcp-server-that-gives-any-ai-assistant-live-nse-bse-stock", "markdown": "https://wpnews.pro/news/i-built-an-open-source-mcp-server-that-gives-any-ai-assistant-live-nse-bse-stock.md", "text": "https://wpnews.pro/news/i-built-an-open-source-mcp-server-that-gives-any-ai-assistant-live-nse-bse-stock.txt", "jsonld": "https://wpnews.pro/news/i-built-an-open-source-mcp-server-that-gives-any-ai-assistant-live-nse-bse-stock.jsonld"}}