印度经纪商MCP服务器
连接到印度代理平台的模型上下文协议(MCP)服务器-- 成长, Zerodha风筝,以及 INDmoney --通过Claude Code、Claude Desktop或任何兼容MCP的客户端提供您的金融投资组合的统一、只读视图。
不需要付费经纪人API订阅。服务器使用 Playwright浏览器自动化 在您通过可见的Chrome窗口登录后,从代理web应用程序中捕获数据。
______________________________________________________________________
特性
- 统一的投资组合视图 跨多个经纪人
- 股票、F&O、共同基金、美国股票、黄金 --所有资产类别
- 网络侦听 从代理SPA中捕获结构化JSON(比DOM抓取更可靠)
- 持续浏览器会话 --每次会话到期后登录一次
- 加密会话存储 (AES-256-GCM)存储在内存中
- 只读 --不下单,不转账
- 优雅降级 --如果一个代理失败,则返回部分数据
经纪人支持矩阵
| 特色 | 成长 | Zerodha风筝 | INDmoney |
|---|---|---|---|
| 股票持有量 | 是 | 是 | 有 |
| F&O职位 | 是 | 是 | -- |
| 共同基金 | 是 | 是(硬币) | 是 |
| 美国股市 | 是 | -- | 是 |
| 金/SGB | 是 | -- | 是 |
| 订单 | 是 | 是 | 有 |
| 登录方式 | 电子邮件+OTP | 用户名+密码+TOTP | 电话+OTP |
______________________________________________________________________
先决条件
- Node.js 18+
- 谷歌浏览器 已安装(Playwright通过以下方式使用您的系统Chrome
channel: 'chrome') - 克劳德代码 或 克劳德桌面版 (或任何MCP客户端)
______________________________________________________________________
安装
git clone indian-broker-mcp
cd indian-broker-mcp
npm install
npx playwright install chromium
npm run build配置
复制示例env文件并根据需要进行编辑:
cp .env.example .env环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
SESSION_ENCRYPTION_KEY | 自动生成的 | 32字节十六进制密钥,用于AES-256-GCM会话加密 |
SESSION_TTL_HOURS | 6 | 会话到期时间(小时) |
BROWSER_HEADLESS | false | 设置 true 无头运行浏览器(登录仍需要头模式) |
BROWSER_SLOW_MO | 100 | 剧作家动作之间的延迟(毫秒)(有助于避免检测) |
BROWSER_DATA_DIR | ./browser-data | 持久浏览器配置文件存储 |
LOG_LEVEL | info | debug, info, warn,或 error |
RECORDINGS_DIR | ./recordings | 输出目录 learn_broker_navigation |
______________________________________________________________________
连接到MCP客户端
克劳德代码
claude mcp add indian-broker -- node /path/to/indian-broker-mcp/build/index.js克劳德桌面版
添加到您的Claude桌面配置(~/.config/claude/claude_desktop_config.json 在Linux上, ~/Library/Application Support/Claude/claude_desktop_config.json 在macOS上):
{
"mcpServers": {
"indian-broker": {
"command": "node",
"args": ["/path/to/indian-broker-mcp/build/index.js"]
}
}
}添加配置后重新启动Claude Desktop。
MCP检查员(用于测试)
npx @modelcontextprotocol/inspector node ./build/index.js在以下位置打开web UI http://localhost:5173 在那里你可以交互式地调用工具。
______________________________________________________________________
用法
步骤1:连接到经纪人
问克劳德:
“连接我到Zerodha”
这叫做 broker_connect 工具,其中:
- 打开一个可见的Chrome窗口,进入经纪人的登录页面
- 您手动登录(包括OTP/2FA)
- 服务器自动检测登录成功并捕获会话
您还可以使用浏览器的DevTools中的Cookie进行连接:
“使用这些Cookie连接到Groww: `
`"
第二步:查询您的投资组合
连接后,自然地问:
- “我持有的股票是什么?”
- “在所有经纪人中显示我的共同基金投资组合”
- “我的投资组合总价值是多少?”
- “在Zerodha上显示我的F&O位置”
- “我持有哪些美国股票?”
- “显示今天的订单”
- “搜索信实股票”
步骤3:断开连接
“断开与Zerodha的连接”
这将擦除会话数据并删除该代理的浏览器配置文件。
______________________________________________________________________
工具参考
认证
| 工具 | 参数 | 说明 |
|---|---|---|
broker_connect | broker (增长/零增长/投资), method (浏览器登录/Cookie), cookies? | 连接到经纪人 |
broker_disconnect | broker | 断开连接并擦除会话 |
broker_status | -- | 显示所有代理的连接状态 |
投资组合(只读)
| 工具 | 参数 | 说明 |
|---|---|---|
get_holdings | broker (默认:全部) | 持股 |
get_positions | broker (默认:全部) | 未结头寸(日内/交割) |
get_fno_positions | broker (默认:全部) | 具体F&O位置 |
get_mutual_funds | broker (默认:全部) | 共同基金投资组合 |
get_us_stocks | broker (默认:全部) | 美国股票持有量 |
get_gold | broker (默认:全部) | 黄金/SGB/黄金ETF持有量 |
get_orders | broker (默认:全部) | 今天的订单历史记录 |
get_portfolio_summary | -- | 所有经纪人的汇总摘要 |
市场数据
| 工具 | 参数 | 说明 |
|---|---|---|
search_stock | query, broker? | 按名称或代码搜索股票/MF |
get_quote | symbol, broker? | 股票的当前报价 |
发展
| 工具 | 参数 | 说明 |
|---|---|---|
learn_broker_navigation | broker, url? | 记录浏览器导航、XHR请求和DOM快照,以构建/更新抓取器 |
______________________________________________________________________
资源
MCP资源提供可通过URI访问的缓存数据:
| URI | 描述 |
|---|---|
broker://status | 所有经纪人的连接状态 |
broker://{name}/holdings | 特定经纪人的持股(例如。, broker://zerodha/holdings) |
broker://{name}/mutual-funds | 特定经纪商的共同基金 |
portfolio://summary | 组合汇总 |
______________________________________________________________________
建筑
MCP Client (Claude Code / Desktop)
│
│ STDIO (JSON-RPC)
▼
┌─────────────────────────────────┐
│ MCP Server (Node.js) │
│ │
│ ┌─────────┐ ┌───────┐ ┌─────┐ │
│ │ Groww │ │Zerodha│ │ IND │ │
│ │ Adapter │ │Adapter│ │money│ │
│ └────┬─────┘ └───┬───┘ └──┬──┘ │
│ │ │ │ │
│ ┌────▼───────────▼────────▼──┐ │
│ │ Playwright (Chrome) │ │
│ │ • Network interception │ │
│ │ • Page navigation │ │
│ │ • Persistent contexts │ │
│ └────────────────────────────┘ │
│ │
│ ┌────────────────────────────┐ │
│ │ Session Store (encrypted) │ │
│ └────────────────────────────┘ │
└─────────────────────────────────┘数据提取是如何工作的
- 导航 转到相关经纪人页面(例如,持股仪表板)
- 拦截 SPA对其内部API做出的XHR/fetch响应
- 解析 这些响应中的结构化JSON
- 规范化 将特定于代理的字段转换为统一类型
- 返回 以一致的格式发送给MCP客户端
网络拦截是主要策略,因为它直接从代理的内部API捕获干净、结构化的数据——比解析DOM可靠得多。
______________________________________________________________________
项目结构
src/
├── index.ts # Entry point (STDIO transport)
├── server.ts # MCP server, tool/resource registration
├── types/
│ ├── portfolio.ts # Holding, Position, MutualFundHolding, etc.
│ ├── broker.ts # BrokerAdapter interface
│ └── auth.ts # Session types
├── adapters/
│ ├── base.ts # Abstract base adapter
│ ├── groww/
│ │ ├── index.ts # Adapter + normalizers
│ │ ├── scraper.ts # Network interception logic
│ │ ├── endpoints.ts # URL patterns
│ │ ├── selectors.ts # DOM selectors (fallback)
│ │ └── types.ts # Raw API response types
│ ├── zerodha/ # Same structure
│ └── indmoney/ # Same structure
├── browser/
│ ├── manager.ts # Browser lifecycle, persistent contexts
│ ├── auth-flow.ts # Login detection + session capture
│ ├── interceptor.ts # XHR/fetch response capture engine
│ ├── recorder.ts # Navigation recorder for development
│ └── helpers.ts # Utilities (delays, screenshots)
├── auth/
│ ├── crypto.ts # AES-256-GCM encrypt/decrypt
│ └── session-store.ts # In-memory encrypted session store
├── normalizer/
│ └── index.ts # Portfolio summary aggregation
└── utils/
├── logger.ts # stderr-only logger
├── config.ts # .env config loader
└── retry.ts # Exponential backoff retry______________________________________________________________________
会话管理
- 会话已存储 在内存中加密 使用AES-256-GCM
- 浏览器配置文件保存到磁盘
browser-data/{broker}/因此,Cookie在服务器重启后仍然有效 - 会话在配置的TTL后自动过期(默认值:6小时)
- 当会话到期时,下一个数据请求将返回一个错误,提示您重新连接
broker_disconnect安全地擦除内存中的会话和磁盘上的浏览器配置文件- 每个代理在其自己的浏览器上下文中都是完全隔离的
典型会话寿命
| 经纪人 | 大约会话持续时间 |
|---|---|
| Zerodha风筝 | 6-8小时 |
| 增长 | 变化 |
| INDmoney | 几天到几周 |
______________________________________________________________________
发展
添加或更新代理抓取器
这 learn_broker_navigation 工具可帮助您发现和更新内部API端点:
- 调用工具:
learn_broker_navigation随着broker: "groww" - Chrome窗口打开——登录并导航到您关心的页面
- 记录器捕获每个URL、XHR请求/响应和DOM状态
- 录音保存到
recordings/{broker}/{timestamp}/ - 使用捕获的数据进行更新
endpoints.ts和types.ts对于那个经纪人
观看模式
npm run dev # tsc --watch关键设计决策
- DOM抓取的网络拦截:代理SPA通过内部REST API获取数据。拦截这些JSON响应比解析渲染的HTML更可靠、更结构化。
- 持久浏览器上下文:使用剧作家
launchPersistentContext因此cookies/localStorage在重启后仍然有效。用户只需在会话到期时登录。 - 反侦测:使用真正的Chrome(不是Chromium),删除
webdriver标志,在动作之间添加随机延迟。 - 灵活的响应解析:每个适配器的规范化器处理多个可能的响应形状(代理可能会更改其API结构)。字段通过回退链访问(
raw.field1 ?? raw.field2 ?? default).
______________________________________________________________________
安全
- 未存储凭据 --您手动登录;仅捕获会话Cookie
- AES-256-GCM加密 对于所有内存会话数据
- Cookie和令牌永远不会被记录 --记录器编辑敏感数据
- 所有输出都进入stderr --stdout是为MCP JSON-RPC保留的(写入stdout会破坏协议)
- 浏览器配置文件被忽略 并在断开连接时删除
- 严格只读 --没有下单、修改头寸或转移资金的工具
______________________________________________________________________
局限性
- 浏览器抓取很脆弱 --代理UI和内部API如有更改,恕不另行通知。使用
learn_broker_navigation当有东西坏了时重新校准。 - OTP登录需要用户在场 --Groww和INDmoney需要手动输入OTP。Zerodha需要TOTP/PIN码。
- 无实时流媒体 --通过导航到页面,按需获取数据。没有WebSocket或实时价格馈送。
- 速率限制 --避免快速连续调用投资组合工具。服务器在页面导航之间增加了延迟,但过度使用可能会触发代理反机器人措施。
- 服务条款 --自动访问代理网络应用程序可能会违反其条款。此工具仅供个人使用。
- 单用户 --服务器为每个代理管理一个会话。它不是为多用户或共享访问而设计的。
______________________________________________________________________
许可证
麻省理工学院
