金融市场数据服务

一个为印度市场提供实时报价、历史数据、期权链、希腊值计算、技术信号和虚拟投资组合管理的金融市场数据服务。

  • by Prince94201
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 Prince94201/IndiaQuant-MCP

使用说明

IndiaQuant MCP

生产就绪 模型上下文协议(MCP) 连接的服务器 克劳德桌面版 印度市场情报:实时报价、历史OHLC、期权链、Black-Scholes greeks、情绪+技术信号以及SQLite支持的纸质投资组合。


🏗️ 建筑

┌───────────────────────────────────────────┐
│           Claude Desktop (Client)         │
└───────────────────────────┬───────────────┘
                            │ MCP over stdio
┌───────────────────────────▼───────────────┐
│            IndiaQuant MCP Server           │
│        src/server.ts  (Express/SSE + stdio)│
│        src/tools/mcpTools.ts (10 tools)    │
└───────────────┬───────────────┬───────────┘
                │               │
      ┌─────────▼────────┐  ┌──▼───────────┐
      │  Market Data      │  │    Options    │
      │ src/modules/      │  │ src/modules/  │
      │ marketData.ts     │  │ options.ts    │
      └─────────┬────────┘  └──┬────────────┘
                │              │
        ┌───────▼───────┐  ┌──▼────────────┐
        │    Signals     │  │    Greeks      │
        │ signals.ts     │  │ greeks.ts      │
        └───────┬───────┘  └──┬─────────────┘
                │              │
            ┌───▼──────────────▼───┐
            │      Portfolio         │
            │ portfolio.ts + SQLite  │
            └───────────┬────────────┘
                        │
     ┌──────────────────▼───────────────────┐
     │ External data sources (free tier)     │
     │  • Yahoo Finance (prices/OHLC/options)│
     │  • Alpha Vantage (fallback + sentiment)│
     │  • NewsAPI (optional sentiment)       │
     └───────────────────────────────────────┘

5个模块如何连接

  • marketData.ts → 实时报价+历史OHLC(信号+投资组合使用)
  • options.ts → 期权链+异常活动(直接由工具和希腊IV推理使用)
  • greeks.ts → 布莱克-斯科尔斯定价+希腊(在可用时使用来自连锁店的IV)
  • signals.ts → 技术指标+情绪→ 买入/卖出/持有(使用市场数据+缓存+利率限制器)
  • portfolio.ts → 纸质交易+使用实时报价的PnL(使用SQLite+marketData)

为什么这些方法

  • 工具路由器+模块 使MCP模式/路由与市场逻辑分开。
  • 提供商回退 提高了提供者失败或字段丢失时的弹性。
  • SQLite 在没有外部数据库的情况下,提供持久的纸质交易状态。
  • TTL缓存+每日限制器 减少重复请求并保护免费层配额。

✨ 功能(已实现)

  • 市场数据:实时报价+历史OHLC,供应商回退
  • 选项:获取选项链并检测基本异常活动
  • 希腊人:计算布莱克-斯科尔斯理论价格+δ/γ/θ/维加/ρ
  • 信号:技术指标(RSI/MACD/Bollinger)加上新闻情绪→ 买入/卖出/持有
  • 纸张组合:在SQLite中存储虚拟交易,并根据实时报价计算PnL
  • 扇形扫描:扫描预定义的符号集并生成简单的扇区热图

🚀 安装指南/快速入门

先决条件

  • Node.js 18+(推荐使用Node 20)
  • npm
  • macOS(克劳德桌面)

安装

  • 安装依赖项: npm install
  • 构建: npm run build
  • 在本地为Claude运行(stdio): npm start -- --stdio
  • 作为web服务运行(SSE): npm start

发展:

  • npm run dev

API密钥设置

创建一个 .env repo根目录中的文件:

  • ALPHA_VANTAGE_KEY (推荐)
  • NEWS_API_KEY (可选)

笔记:

  • 实时报价尝试 阿尔法优势 首先(内部映射),然后 雅虎财经 退路。
  • OHLC的历史用途 雅虎财经 首先使用 阿尔法优势 退路。

Claude桌面配置(macOS)

macOS上的配置文件路径:

  • ~/Library/Application Support/Claude/claude_desktop_config.json

示例配置(调整绝对路径):

{
  "mcpServers": {
    "indiaquant": {
      "command": "node",
      "args": [
        "/Users/princeagrawal/Desktop/Assignment/IndiaQuant-MCP/dist/server.js",
        "--stdio"
      ],
      "cwd": "/Users/princeagrawal/Desktop/Assignment/IndiaQuant-MCP",
      "env": {
        "ALPHA_VANTAGE_KEY": "...",
        "NEWS_API_KEY": "..."
      }
    }
  }
}

☁️ 部署(奖励积分)

MCP服务器已完全配置 24/7云可用性 通过使用服务器发送事件(SSE)传输的Express.js HTTP服务器。

部署到渲染(Web服务)

  1. 将您的存储库推送到GitHub。
  2. 在渲染面板中,创建一个新的 网络服务.
  3. 链接您的GitHub存储库。
  4. 设置构建命令: npm install && npm run build
  5. 设置启动命令: npm start
  6. 在“高级”下,添加您的 ALPHA_VANTAGE_KEY 和 NEWS_API_KEY 作为环境变量。
  7. 部署!服务器将绑定到Render提供的端口,并在以下位置持续保持活动状态 /sse.

注意:使用Claude Desktop在本地运行时 --stdio 标志绕过HTTP服务器,直接在标准输入/输出上运行。


🛠️ 工具文档

所有工具定义见 src/tools/mcpTools.ts.并且从不暴露在MCP上

习俗:

  • 符号通常是 雅虎风格 (例如。, RELIANCE.NS, TCS.NS).

1) get_live_price

获取实时报价。

输入

{ "symbol": "RELIANCE.NS" }

输出(示例)

{
  "symbol": "RELIANCE.NS",
  "price": 2985.5,
  "change": 12.3,
  "changePercent": 0.41,
  "volume": 1234567,
  "timestamp": "2026-03-11T10:05:00.000Z"
}

2) get_options_chain

获取底层和到期(可选)的完整调用/放入链。

输入

{ "symbol": "TCS.NS", "expiry": "2026-03-26" }

输出(示例)

{
  "expiry": "2026-03-26T00:00:00.000Z",
  "underlyingPrice": 4120.0,
  "calls": [{ "strike": 4100, "lastPrice": 120, "bid": 118, "ask": 122, "volume": 5400, "openInterest": 90000, "impliedVolatility": 0.21 }],
  "puts": [{ "strike": 4100, "lastPrice": 95, "bid": 93, "ask": 97, "volume": 4300, "openInterest": 87000, "impliedVolatility": 0.22 }]
}

3) analyze_sentiment

获取最近的头条新闻并计算一个简单的极性得分。

输入

{ "symbol": "INFY.NS" }

输出(示例)

{
  "score": 0.15,
  "signal": "NEUTRAL",
  "headlines": ["...", "..."]
}

4) generate_signal

将技术指标和情绪组合成买入/卖出/持有。

输入

{ "symbol": "HDFCBANK.NS", "timeframe": "short-term" }

输出(示例)

{
  "signal": "BUY",
  "confidence": 71.2,
  "reasoning": "...",
  "rsi": 42.7,
  "macd": { "macdLine": -8.1, "signalLine": -10.2, "histogram": 2.1, "crossover": "BULLISH" },
  "bollinger": { "upper": 1680.1, "middle": 1640.3, "lower": 1600.5, "isSqueeze": false },
  "sentiment": { "score": 0.1, "signal": "NEUTRAL", "headlines": [] }
}

5) get_portfolio_pnl

返回当前虚拟头寸和投资组合PnL(使用实时报价定价)。

输入

{}

输出(示例)

{
  "positions": [{
    "symbol": "TCS.NS",
    "quantity": 10,
    "avgPrice": 4000,
    "currentPrice": 4120,
    "invested": 40000,
    "currentValue": 41200,
    "pnl": 1200,
    "pnlPercent": 3
  }],
  "totalInvested": 40000,
  "currentValue": 41200,
  "totalPnL": 1200,
  "totalPnLPercent": 3,
  "cashBalance": 960000
}

6) place_virtual_trade

放置一张纸“买入/卖出”并将其持久化到SQLite。

输入

{ "symbol": "TCS.NS", "quantity": 5, "side": "BUY" }

输出(示例)

{
  "orderId": "ORD_...",
  "symbol": "TCS.NS",
  "executedPrice": 4120,
  "quantity": 5,
  "side": "BUY",
  "status": "FILLED",
  "timestamp": "2026-03-11T10:12:00.000Z"
}

7) calculate_greeks

计算布莱克-斯科尔斯理论价格和希腊。如果 impliedVolatility 如果未提供,则根据给定罢工的期权链推断(回退默认值0.20)。

输入

{ "symbol": "RELIANCE.NS", "strike": 3000, "expiry": "2026-03-26", "optionType": "CE" }

输出(示例)

{
  "delta": 0.52,
  "gamma": 0.0004,
  "theta": -2.1,
  "vega": 0.18,
  "rho": 0.09,
  "theoreticalPrice": 65.3
}

8) detect_unusual_activity

扫描选项链是否存在基本异常:

  • 体积>2倍平均值(体积>100)
  • 交易量/敞口利率>0.5(交易量>100)

输入

{ "symbol": "NIFTY" }

输出(示例)

{
  "alerts": ["Unusual volume: Call Strike 22500 ..."],
  "anomalies": [{ "type": "Call", "strike": 22500, "volume": 12000, "openInterest": 18000, "reason": "High Volume (2x Avg)" }],
  "summary": "Found 1 unusual options activities."
}

9) scan_market

扫描预定义的扇区符号列表,并返回其生成的信号与滤波器匹配的符号。

输入

{ "sector": "IT", "signal": "BUY", "limit": 3 }

输出(示例)

{
  "sector": "IT",
  "results": [
    { "symbol": "TCS.NS", "signal": { "signal": "BUY", "confidence": 68.1, "reasoning": "..." } }
  ]
}

10) get_sector_heatmap

汇总每个行业的平均变化百分比,并跟踪每个行业内的最大赢家/输家。

输入

{}

输出(示例)

{
  "sectors": [
    {
      "name": "BANKING",
      "changePercent": 0.32,
      "topGainer": { "symbol": "ICICIBANK.NS", "change": 1.2 },
      "topLoser": { "symbol": "SBIN.NS", "change": -0.4 },
      "symbols": [{ "symbol": "HDFCBANK.NS", "changePercent": 0.1 }]
    }
  ]
}

🏛️ 权衡与决策

为什么Node.js胜过Python

  • Node/TypeScript与MCP stdio服务器和模式定义工具无缝集成。
  • 作为Claude Desktop配置的单一运行时发布。

缓存策略

  • 处理本地TTL缓存以减少重复调用。
  • 重启时重置,不在进程之间共享。

Black-Scholes实施方法

  • 项目实施中的轻量级:
    • 普通PDF(精确)
    • 正常CDF(Abramowitz–Stegun近似)

⚠️ 已知限制

  • API自由时间限制 应用程序(Alpha Vantage/NewsAPI)。缓存+每日限制帮助,但您仍然可以在大量使用的情况下达到配额。
  • 场外交易时间,提供商可能会返回过时的价格或缺少的字段。
  • 雅虎财经边缘案例:一些符号/到期日可能有不完整的期权数据;新上市的股票可能没有足够的蜡烛作为指标。

📁 目录布局

  • src/server.ts –MCP服务器入口点
  • src/tools/mcpTools.ts –工具定义+调度
  • src/modules/* 市场逻辑(5个模块)
  • src/db/database.ts --SQLite热量
  • src/utils/* –缓存、速率限制器、符号格式化器
  • data/portfolio.db* –SQLite数据库文件