交易MCP服务器
用于股票交易操作的基于Spring Boot的模型上下文协议(MCP)服务器,与Grow API和Spring AI集成。
🚀 特性
- MCP服务器集成:内置Spring AI MCP服务器,实现无缝AI集成
- 扩展API集成:从Groww获取实时和历史市场数据
- 仪器管理:金融工具的全面CRUD操作
- CSV数据摄入:通过批处理从CSV文件批量导入仪器数据
- 许可证管理:Grow API的自动令牌生成和缓存
- 历史数据检索:获取烛台数据以进行技术分析
- 控股管理:获取并监控用户持有的详细头寸信息
- 位置跟踪:按细分市场和交易品种实时跟踪头寸
- 下单:下达买入/卖出订单,支持多种订单类型(市场、限价、SL、SL-M)
- 订单管理:通过实时状态更新修改、取消和跟踪订单
- 交易执行:获取已执行的交易和详细的交易信息
- 订单历史:检索全面的订单列表和订单详细信息
- PostgreSQL数据库:使用JPA/Hibernate的持久存储
- 缓存:实现咖啡因缓存以提高性能
- 代码优化:具有集中式API处理程序(OrderServiceHelper)的重构订单服务
📋 先决条件
- Java 21
- Maven 3.6+
- PostgreSQL 12+
- 增加API证书(API密钥和秘密)
🛠️ 技术栈
- 框架:弹簧靴3.5.10
- AI集成:支持MCP服务器的Spring AI 1.1.2
- 数据库:PostgreSQL 42.7.9,带Spring数据JPA
- HTTP客户端:Apache HttpClient 5.5
- 缓存:具有Spring Cache抽象的Caffeine Cache 3.2.3
- CSV处理:Apache Commons CSV 1.11.0
- 代码生成:龙目岛项目(注释:@Data、@Builder、@Slf4j等)
- 构建工具:Maven
- Java: 21
⚙️ 配置
环境变量
创建以下环境变量:
# Database Configuration
export DB_URL=jdbc:postgresql://localhost:5432/trade_db
export DB_USERNAME=your_db_username
export DB_PASSWORD=your_db_password
# Groww API Configuration
export GROWW_API_KEY=your_groww_api_key
export GROWW_SECRET_KEY=your_groww_secret_key应用程序配置文件
在中配置设置 application.yaml:
spring:
datasource:
url: ${DB_URL}
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
ai:
mcp:
server:
enabled: true
name: trade-mcp-server
version: 1.0.0
groww:
api-key: ${GROWW_API_KEY}
secret: ${GROWW_SECRET_KEY}
base-url: https://api.groww.in/v1/
server:
port: 8082增长的API端点
该应用程序配置有以下Grow API终结点:
- 令牌生成:
token/api/access - 历史数据:
historical/candle/range - 持仓:
holdings/user - 职位:
positions/user,positions/trading-symbol - 订单:
order/list,order/create,order/details,order/modify,order/cancel,order/status,order/trades
🗄️ 数据库设置
创建数据库
首先,创建一个名为的PostgreSQL数据库 trade_db:
psql -U postgres -c "CREATE DATABASE trade_db;"运行架构脚本
然后,运行模式脚本以创建仪器表:
psql -U your_username -d trade_db -f src/main/resources/schema.sql架构详细信息
该架构包括:
- 仪器表:存储22个字段的金融工具主表
- 索引:使用以下索引优化查询:
- name (仪器名称搜索) - trading_symbol (股票代码查找) - exchange (市场交易过滤) - segment (细分市场过滤)
hibernate配置
应用程序使用 hibernate.ddl-auto=none,意思是:
- ✅ 通过SQL脚本进行手动模式管理
- ✅ 更好地控制迁移
- ✅ 对生产环境更安全
- ✅ 架构更改需要显式执行SQL
📦 安装
- 克隆存储库:
git clone
cd trade-mcp-server- 安装依赖项:
./mvnw clean install- 运行应用程序:
./mvnw spring-boot:run服务器将于启动 http://localhost:8082
🤖 MCP第一架构
此应用程序被设计为 MCP服务器 用于AI代理交互。所有交易操作都以MCP工具而不是REST API的形式公开:
- 人工智能原生:工具针对AI代理进行了优化(Claude、ChatGPT等)
- 类型安全:所有工具都使用强类型请求/响应模型
- 自我记录:工具描述嵌入在代码中,使用
@McpTool注释 - REST API:仅限于内部操作(令牌生成、CSV摄入)
要与此服务器交互,请使用Spring AI MCP协议将其连接到MCP兼容的AI客户端。
📚 MCP最佳实践
此实施遵循MCP最佳实践:
- 无状态工具设计:每个工具都是独立的,可以按任何顺序调用
- 一致性命名:工具名称遵循snake_case约定(
fetch_historic_data,create_new_order等等) - 清晰的描述:每个工具都有一个清晰的描述,解释其用途
- 类型安全:所有参数都是经过验证的强类型参数
- 错误处理:调试的全面错误响应
- 分页支持:订单跟踪工具包括分页参数
- 细分市场支持:工具识别不同的细分市场(现金、FNO、商品)
🛠️ MCP工具
此服务器为AI代理提供以下MCP工具,以与交易操作进行交互。
工具类别
- 市场数据工具 (2) :历史数据和仪器搜索
- 投资组合工具 (3) :持股和头寸管理
- 订单管理工具 (3) :订单下达、修改和取消
- 订单跟踪工具 (4) :订单状态、交易、历史和详细信息
总计: 12个MCP工具
市场数据工具
1. fetch_historic_data
检索历史烛台数据(OHLCV-开盘、高、低、收盘、成交量),用于技术分析和图表绘制。
参数:
request(HistoryDataquest):包含符号、交换、间隔、起始日期和结束日期
支持的间隔: 1m、5m、15m、30m、1h、1d、1w、1m
例子:
{
"symbol": "RELIANCE",
"exchange": "NSE",
"interval": "1D",
"from": "2026-01-01",
"to": "2026-02-05"
}2. fetch_entities
根据部分名称匹配、交换和细分从数据库中搜索和检索金融工具。
参数:
request(EntityRequest):包含名称、交换(NSE、BSE、MCX)和段(现金、FNO、商品)
退货: 具有交易品种、手数、分时大小和交易权限的工具列表
例子:
{
"name": "RELIANCE",
"exchange": "NSE",
"segment": "CASH"
}投资组合工具
3. fetch_holdings
从用户的Groww投资组合中检索所有持有量,并提供详细的数量和价格信息。
参数: 无
退货: 持有数量、平均价格、锁定数量和自由数量
4. fetch_user_positions
检索指定细分市场的当前未平仓头寸。
参数:
segment(细分市场):细分市场-现金、FNO或商品
退货: 包含贷方/借方数量、价格和已实现损益的头寸
5. fetch_position_trading_symbol
检索细分市场中特定交易品种的头寸。
参数:
segment(细分市场):细分市场-现金、FNO或商品tradingSymbol(字符串):股票交易符号(例如,“TCS”、“RELIANCE”)
退货: 包含数量、平均价格和损益的头寸详细信息
订单管理工具
6. create_new_order
创建新的买入或卖出订单,支持多种订单类型。
参数:
request(CreateOrderRequest):订单详细信息包括:
- tradingSymbol:股票代码 - quantity:股份数量 - price:订单价格 - triggerPrice:止损触发价(适用于SL订单) - validity:DAY或IOC - exchange:NSE、BSE或MCX - segment:现金、FNO或商品 - product:CNC、INTRADAY或MTF - orderType:市场、限制、SL或SL-M - transactionType:买入或卖出 - orderReferenceId:唯一的客户参考
例子:
{
"tradingSymbol": "WIPRO",
"quantity": 100,
"price": 2500,
"triggerPrice": 2450,
"validity": "DAY",
"exchange": "NSE",
"segment": "CASH",
"product": "CNC",
"orderType": "SL",
"transactionType": "BUY",
"orderReferenceId": "Ab-654321234-1628190"
}7. modify_order
修改现有订单的价格和/或数量。
参数:
request(ModifyOrderRequest):包含订单ID和新参数(价格、数量、有效期)
例子:
{
"growwOrderId": "GMK39038RDT490CCVRO",
"price": 2550,
"quantity": 150,
"validity": "DAY"
}8. cancel_order
取消现有的未结订单。
参数:
request(CancelOrderRequest):包含要取消的订单ID
例子:
{
"growwOrderId": "GMK39038RDT490CCVRO"
}订单跟踪工具
9. fetch_order_status
获取特定订单的当前状态。
参数:
request(OrderStatusRequest):包含订单ID和段
退货: 订单状态、已填写数量和订单参考
10. fetch_trades_for_order
获取与特定订单关联的所有交易。
参数:
request(OrderTradesRequest):包含订单ID、分段、页码和页面大小
退货: 已执行交易列表,包括价格、数量、时间戳和结算详细信息
11. fetch_order_list
获取特定细分市场的所有订单列表。
参数:
segment(细分):现金、FNO或商品
退货: 包含完整订单详细信息、执行状态和元数据的订单列表
12. fetch_order_details
获取特定订单的详细信息。
参数:
request(OrderStatusRequest):包含订单ID和段
退货: 完整的订单详细信息,包括执行信息和时间戳
📊 领域模型
仪器实体
表示具有以下字段的金融工具:
- 基本信息:
id,name,exchange,segment - 交易详情:
tradingSymbol,exchangeToken,growwSymbol - 元数据:
instrumentType,series,isin - 衍生品:
underlyingSymbol,expiryDate,strikePrice - 交易参数:
lotSize,tickSize,freezeQuantity - 权限:
buyAllowed,sellAllowed,isIntraday
控股公司回应
表示用户持有的详细信息:
- 持股:
isin,tradingSymbol,quantity,averagePrice - 锁详细信息:
pledgeQuantity,dematLockedQuantity,growwLockedQuantity,repledgeQuantity - 数量类型:
t1Quantity,dematFreeQuantity,corporateActionAdditionalQuantity,activeDematTransferQuantity
职位回应
通过全面的位置跟踪表示用户位置:
- 职位详情:
tradingSymbol,exchange,symbolIsin,product - 信用信息:
creditQuantity,creditPrice,carryForwardCreditQuantity,carryForwardCreditPrice - 借记信息:
debitQuantity,debitPrice,carryForwardDebitQuantity,carryForwardDebitPrice - 净值:
quantity,netPrice,netCarryForwardQuantity,netCarryForwardPrice,realisedPnl
创建订单请求
表示具有交易参数的下单请求:
- 仪器详细信息:
tradingSymbol,exchange,segment - 订单参数:
quantity,price,triggerPrice,validity - 订单类型:
orderType(市场、限额、SL、SL-M),transactionType(买入、卖出) - 产品类型:
product(CNC、日内、MTF) - 参考:
orderReferenceId(唯一订单参考)
创建订单响应
表示订单状态的订单放置响应:
- 状态:
status(成功,失败) - 有效载荷:
- growwOrderId:Groww的唯一订单ID - orderStatus:当前订单状态(未结、待处理、已执行、已取消、已拒绝) - orderReferenceId:客户提供的订单参考 - remark:有关订单的其他信息
修改订单响应
表示订单修改/取消响应:
- 状态:
status(成功,失败) - 有效载荷:
- growwOrderId:Groww的唯一订单ID - orderStatus:更新订单状态 - remark:修改确认消息
订单状态响应
用执行详细信息表示当前订单状态:
- 状态:
status(成功,失败) - 有效载荷:
- growwOrderId:Groww的唯一订单ID - orderStatus:当前订单状态 - filledQuantity:到目前为止执行的数量 - orderReferenceId:客户提供的订单参考 - remark:状态消息
订单交易响应
表示为订单执行的交易列表:
- 状态:
status(成功,失败) - 有效载荷:
- tradeList:已执行交易数组,包含: - 交易详情: price, quantity, isin, tradingSymbol - 订单参考: growwOrderId, exchangeOrderId, orderReferenceId - 贸易参考: growwTradeId, exchangeTradeId, settlementNumber - 状态和类型: tradeStatus, transactionType (买入、卖出) - 市场行情: exchange, segment, product - 时间戳: createdAt, tradeDatetime - 元数据: remark
订单列表响应
表示段的订单列表:
- 状态:
status(成功,失败) - 有效载荷:
- orderList:订单数组,包含: - 阶次辨识: growwOrderId, tradingSymbol, orderReferenceId - 订单状态: orderStatus, amoStatus - 订单参数: quantity, price, triggerPrice, validity - 执行详细信息: filledQuantity, remainingQuantity, averageFillPrice - 职位信息: deliverableQuantity - 订单类型: orderType (市场、限额、SL、SL-M), transactionType (买入、卖出) - 市场行情: exchange, segment, product - 时间戳: createdAt, exchangeTime, tradeDate - 元数据: remark
枚举
- 交换:NSE、BSE、MCX
- 片段:现金、FNO、商品
- 蜡烛间隔:1米、5米、15米、30米、1小时、1天、1瓦、1米
- 订单类型:市场、限价、SL(止损)、SL-M(止损市场)
- 订单状态:打开、待处理、已执行、已取消、已拒绝
- 产品类型:CNC(现金及套利)、INTRADAY、MTF(保证金交易工具)
- 交易类型:买入,卖出
🏗️ 建筑
该应用程序遵循分层架构模式,关注点明确分离:
com.navneet.trade/
├── config/ # Configuration classes
│ └── CacheConfig.java # Caffeine cache configuration
├── constants/ # Application constants and enums
│ ├── CandleIntervals.java # Supported candle intervals
│ ├── Exchange.java # Market exchanges (NSE, BSE, MCX)
│ ├── Segment.java # Market segments (CASH, FNO, COMMODITY)
│ ├── OrderType.java # Order types (MARKET, LIMIT, SL, SL-M)
│ ├── OrderStatus.java # Order statuses
│ ├── ProductType.java # Product types (CNC, INTRADAY, MTF)
│ ├── TransactionType.java # Transaction types (BUY, SELL)
│ └── GrowwConstants.java # Groww API constants
├── controller/ # REST controllers (internal use only)
│ ├── GrowwController.java # Token generation & CSV ingestion
│ └── OrderController.java # Disabled - testing purposes only
├── entity/ # JPA entities and data access
│ ├── Instruments.java # Instrument entity with @Entity annotation
│ ├── dto/
│ │ └── InstrumentsDto.java # DTO for data transfer
│ └── repo/
│ └── InstrumentsRepo.java # Spring Data JPA repository
├── models/ # Request/Response models for API contracts
│ ├── request/ # Request DTOs
│ │ ├── EntityRequest.java
│ │ ├── HistoricDataRequest.java
│ │ ├── TokenRequest.java
│ │ ├── CreateOrderRequest.java
│ │ ├── ModifyOrderRequest.java
│ │ ├── CancelOrderRequest.java
│ │ ├── OrderStatusRequest.java
│ │ └── OrderTradesRequest.java
│ └── response/ # Response DTOs
│ ├── TokenResponse.java
│ ├── HistoricDataResponse.java
│ ├── HoldingsResponse.java
│ ├── PositionsResponse.java
│ ├── CreateOrderResponse.java
│ ├── ModifyOrderResponse.java
│ ├── OrderStatusResponse.java
│ ├── OrderTradesResponse.java
│ └── OrderListResponse.java
├── service/ # Business logic and service layer
│ ├── GrowwService.java # Groww-related operations interface
│ ├── OrderService.java # Order management interface
│ ├── impl/ # Service implementations
│ │ ├── GrowwServiceImpl.java # Implements Groww operations
│ │ └── OrderServiceImpl.java # Implements order operations
│ └── helper/ # Helper classes for code reuse
│ ├── GrowwServiceHelper.java # Centralized Groww API calls
│ └── OrderServiceHelper.java # Centralized order API calls
└── utils/ # Utility and helper functions
├── GrowwUtils.java # Groww-specific utilities
└── RestUtils.java # REST API utilities建筑亮点
- 分层架构:控制器、服务和存储库层之间的明确分离
- 助手模式:OrderServiceHelper和GrowServiceHelper合并API调用并减少代码重复
- 仓储模式:Spring Data JPA,用于通过自定义查询访问数据库
- 服务接口模式:服务接口背后的抽象业务逻辑
- DTO模式:请求/响应模型提供API合同和验证
- 枚举模式:使用枚举而不是字符串文字键入安全常量
🔍 关键功能实现
CSV批量摄入
该系统使用迭代器模式进行内存高效的CSV处理:
- 逐行阅读:读取CSV文件,而不将整个文件加载到内存中
- 批处理:构建可配置大小的批次(例如,1000条记录)
- 大容量插入:用途
instrumentsRepo.saveAll()用于高效批量插入 - 内存效率高:非常适合处理大型CSV文件(超过10万条记录)
代码优化:OrderServiceHelper
减少订单管理操作中的代码重复:
- API集中处理:OrderServiceHelper合并所有REST API调用逻辑(POST和GET)
- 泛型方法:
executePostCall()和executeGetCall()处理所有API交互 - 响应处理:统一的JSON反序列化和错误处理
- 结果:OrderServiceImpl代码减少50%(192→96行)
- 利益:API通信中的错误修复和增强现在发生在一个地方
缓存策略
- 令牌缓存:使用可配置的过期时间缓存的API令牌增长
- 缓存删除:支持手动缓存清除
- 高性能:用于亚毫秒查找的咖啡因缓存
- Spring集成:与Spring的@Cacheable注释无缝集成
存储库查询
用于灵活仪器搜索的自定义JPA查询:
findDistinctByNameContainingIgnoreCaseAndExchangeAndSegment(
String name, String exchange, String segment
)- 案例不敏感搜索:无论情况如何,都能找到仪器
- 灵活过滤:按交换和分段同时过滤
- 不同的结果:删除重复条目
🧪 测试
使用以下工具运行测试:
./mvnw test运行应用程序
使用Maven Spring Boot插件:
./mvnw spring-boot:run使用Java JAR:
./mvnw clean package
java -jar target/trade-mcp-server-0.0.1-SNAPSHOT.jar使用环境变量:
export DB_URL=jdbc:postgresql://localhost:5432/trade_db
export DB_USERNAME=postgres
export DB_PASSWORD=yourpassword
export GROWW_API_KEY=your_key
export GROWW_SECRET_KEY=your_secret
./mvnw spring-boot:run📝 许可证
此项目根据LICENSE文件中指定的条款获得许可。
👤 作者
Navneet Prabhakar
🤝 贡献
- 克隆该仓库
- 创建要素分支(
git checkout -b feature/amazing-feature) - 提交您的更改(
git commit -m 'Add amazing feature') - 推到分支(
git push origin feature/amazing-feature) - 打开拉取请求
📞 支持
有关问题和疑问,请在存储库中打开问题。
______________________________________________________________________
备注:这是一个开发服务器。在部署到生产环境之前,确保采取了适当的安全措施。
