1. 项目概述:一个为AI助手注入金融分析能力的MCP服务器
如果你和我一样,日常重度依赖Cursor这类AI编程助手,同时又对金融市场保持关注,那你肯定有过这样的念头:能不能让我的AI助手直接帮我分析股票?比如,我正写代码写到一半,突然想到某个行业可能有投资机会,能不能直接让Cursor给我拉一份龙头公司的财务数据对比?或者,看到社交媒体上某个股票讨论火热,能不能让AI帮我快速分析一下市场情绪和基本面是否匹配?
过去,这需要我们在浏览器、金融终端、代码编辑器之间反复横跳,手动收集数据,再粘贴给AI分析,流程非常割裂。而netanelavr/trading-mcp这个项目,就是为了彻底解决这个问题而生的。它是一个基于Model Context Protocol(MCP)标准构建的服务器,专门为你的AI助手(如Cursor、Claude Desktop等)提供一整套专业的股票分析与交易洞察工具。
简单来说,它就像给你的AI助手装上了一套“金融数据外挂”。安装配置好后,你的AI助手就具备了直接调用真实市场数据的能力——从基础的股票筛选、财务指标查询,到进阶的内幕交易监控、期权市场情绪,甚至结合Reddit讨论和新闻的AI情感分析。你不再需要离开编辑器去查资料,所有分析请求都可以通过自然语言对话完成,让金融研究变得像问一个懂行的朋友一样自然流畅。
这个项目非常适合有一定编程和金融基础,并且希望提升研究效率的开发者、量化爱好者或个人投资者。它不是一个提供买卖信号的“黑箱”,而是一个强大的“数据获取与初步加工”工具,将原始、分散的市场信息,通过结构化的工具呈现给你的AI,由你和AI共同完成最终的决策分析。接下来,我将带你从零开始,深入拆解这个项目的设计思路、实战配置、核心工具的使用技巧,以及我踩过的一些坑。
2. 核心架构与设计思路拆解
2.1 为什么是MCP?协议层的关键价值
在深入代码之前,理解MCP(Model Context Protocol)是什么至关重要。你可以把它想象成AI世界的“USB协议”。在没有统一协议之前,每个AI应用(模型)想要连接外部数据源(如数据库、API),都需要自己写一套特定的“驱动程序”,既麻烦又不通用。MCP的出现,就是为了标准化AI模型与外部工具、数据源之间的通信方式。
trading-mcp项目本质上是一个“MCP服务器”。它遵循MCP协议,对外暴露一系列定义好的“工具”(Tools),比如get_fundamental_stock_metrics、analyze_reddit_sentiment。而支持MCP的客户端(如Cursor),则扮演“用户界面”和“协议调用者”的角色。当你在Cursor的聊天框里说“帮我看看苹果公司的市盈率和债务情况”,Cursor会理解你的意图,通过MCP协议调用服务器上对应的工具,获取数据后,再组织成自然语言回复给你。
这种架构带来了几个核心优势:
- 模型无关性:只要客户端支持MCP,无论背后是GPT、Claude还是其他模型,都能使用这套工具。这避免了为每个AI模型单独开发插件的重复劳动。
- 安全性:API密钥等敏感信息保存在你的本地配置文件中,由MCP服务器进程管理,不会泄露给AI模型服务商。
- 能力扩展:开发者可以专注于实现强大的数据工具,而不必操心AI模型的交互逻辑。用户则获得了一个能持续增强的AI助手。
这个项目的设计思路非常清晰:将金融数据获取与处理这一复杂、专业的任务,封装成一系列原子化的、可通过标准协议调用的函数,从而将AI的语言理解能力与专业的金融数据处理能力无缝结合。
2.2 项目结构深度解析:模块化与数据源整合
看项目的src目录结构,就能体会到作者清晰的模块化设计思想。这不是一个把所有逻辑堆在一起的脚本,而是一个具备良好可维护性和扩展性的工程化项目。
src/ ├── server.ts # MCP协议对接与工具路由 ├── config.ts # 环境变量与配置管理 ├── types/ # 统一的TypeScript类型定义 ├── adapters/ # 外部数据源适配器(核心) │ ├── finviz.ts # Finviz基本面与技术面数据 │ ├── barchart.ts # Barchart期权数据 │ ├── reddit.ts # Reddit社交媒体数据 │ └── openai.ts # OpenAI情感分析能力 └── tools/ # 面向用户的工具实现 ├── screening.ts ├── fundamentals.ts ...核心在于adapters/(适配器)目录。金融数据来源五花八门,有的提供免费API但有限制(如Reddit),有的只有网页没有API(如Finviz、Barchart),有的则是付费API(如OpenAI)。适配器模式完美地解决了这个问题。每个适配器独立封装与特定数据源交互的所有细节:网络请求、参数构造、错误处理、数据清洗和格式化。
例如,finviz.ts适配器很可能使用了类似cheerio或puppeteer的库来解析HTML页面,从Finviz的股票详情页上“抓取”市盈率、市值、技术形态等数据。而reddit.ts适配器则是正儿八经地调用Reddit官方API,使用OAuth2进行认证。这种设计使得:
- 工具层(
tools/)非常干净:工具函数只关心业务逻辑(如“计算财务健康度”),而不需要知道数据是从哪来、怎么来的。 - 替换数据源很容易:如果未来Finviz改了网页结构,或者你想换用Alpha Vantage的API,只需要修改或替换
finviz.ts适配器,上层的工具函数基本不用动。 - 便于测试和Mock:你可以为每个适配器编写独立的测试,或者用模拟数据代替真实网络请求。
tools/目录则是将适配器提供的基础数据能力,组合成对用户有直接价值的分析工具。比如comprehensive_stock_analysis这个“一站式分析”工具,它内部可能会依次调用:基本面适配器获取财务数据、内幕交易适配器获取高管买卖记录、期权适配器获取Put/Call比率、新闻适配器获取近期新闻并分析情感,最后将所有结果汇总成一个报告。这种组合创新才是工具价值的放大器。
3. 从零开始的实战配置与避坑指南
官方README给出了基础的配置步骤,但在实际搭建过程中,有几个关键细节和常见陷阱需要特别注意。下面是我从零搭建一份更详细的实操记录。
3.1 环境准备与依赖安装
首先,确保你的系统已经安装了Node.js(建议版本18或以上)和npm。然后克隆项目并安装依赖:
git clone https://github.com/netanelavr/trading-mcp.git cd trading-mcp npm install注意:如果
npm install过程中遇到关于puppeteer(一个用于网页自动化的库,很可能被用于Finviz/Barchart爬虫)的错误,这是正常的。Puppeteer会自动下载一个Chromium浏览器。如果下载失败或网络较慢,你可以尝试设置环境变量跳过下载,使用系统已安装的Chrome:# Linux/macOS export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true # Windows (PowerShell) $env:PUPPETEER_SKIP_CHROMIUM_DOWNLOAD="true"然后再运行
npm install。但之后你需要手动配置Chrome路径,可能会更麻烦。对于大多数用户,耐心等待其下载完成是最省事的选择。
安装完成后,运行构建命令,将TypeScript代码编译成JavaScript:
npm run build编译后的文件会输出到dist/目录。确保这一步没有报错。
3.2 核心难点:API密钥的获取与配置
这是项目配置中最关键、也最容易出错的一步。项目主要依赖两套外部API:OpenAI和Reddit。
1. OpenAI API Key配置:
- 前往 OpenAI平台 登录并创建API Key。
- 重要提醒:OpenAI API是付费服务。虽然新账号有免费额度,但分析新闻和社交媒体情感会消耗token。请务必在OpenAI平台设置用量限制(Usage Limits),以防意外产生高额费用。建议先从最低的限额开始。
- 得到的Key格式类似
sk-proj-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx。
2. Reddit API Credentials配置(更复杂):Reddit的API配置对于新手来说是个小门槛,因为它需要创建一个“脚本”类型的应用。
- 用你的Reddit账号登录后,访问 Reddit应用偏好设置 。
- 滚动到底部,点击“创建应用”或“创建另一个应用”按钮。
- 填写应用信息:
- 名称:任意,如
MyTradingMCP。 - 类型:务必选择
script。这是用于个人脚本的认证类型。 - 描述:可选填。
- 重定向URI:填写
http://localhost:8080。这是一个常见的用于OAuth回调的本地地址,本项目实际可能不使用完整的OAuth流程,但Reddit要求必须填写。
- 名称:任意,如
- 点击“创建应用”。
- 创建成功后,你会在应用名称下方看到两串关键信息:
- client_id:一串14-15位的字符,看起来像
XXXXXXXXXXXXXX。 - client_secret:一串更长的密钥。
- 同时,你需要提供你的Reddit账号用户名(username)和密码(password)。注意,这里是你的Reddit登录密码,用于脚本式认证。
- client_id:一串14-15位的字符,看起来像
安全警告:将Reddit密码明文放在配置文件中存在安全风险。虽然对于本地个人使用尚可接受,但如果你将配置文件同步到云端(如Git),风险极高。一个更安全的做法是使用Reddit的“刷新令牌”机制,但这需要更复杂的OAuth流程。对于初级用户,务必确保你的
mcp.json配置文件不被提交到公开的代码仓库。可以考虑将密码存储在系统环境变量中,然后在配置里引用。
3.3 MCP客户端配置详解(以Cursor为例)
项目给出的配置示例是针对Cursor的。你需要找到Cursor的MCP配置文件。通常路径是:
- macOS/Linux:
~/.cursor/mcp.json - Windows:
C:\Users\<你的用户名>\.cursor\mcp.json
如果文件不存在,就创建一个。然后添加如下配置:
{ "mcpServers": { "trading-mcp": { "command": "node", "args": ["/ABSOLUTE/PATH/TO/trading-mcp/dist/server.js"], "env": { "OPENAI_API_KEY": "sk-your-actual-key-here", "REDDIT_CLIENT_ID": "your-client-id-here", "REDDIT_CLIENT_SECRET": "your-client-secret-here", "REDDIT_USERNAME": "your-reddit-username", "REDDIT_PASSWORD": "your-reddit-password" } } } }关键点解析与避坑:
- 绝对路径:
args中的路径必须是绝对路径。你不能用./dist/server.js这样的相对路径。在macOS/Linux上,你可以用pwd命令获取当前绝对路径。例如,如果你的项目在/Users/yourname/Projects/trading-mcp,那么路径就是/Users/yourname/Projects/trading-mcp/dist/server.js。 - 环境变量:
env对象里的所有键值对都会作为环境变量传递给Node.js子进程。确保键名完全正确,特别是OPENAI_API_KEY,大小写敏感。 - 重启Cursor:修改
mcp.json后,必须完全关闭并重新启动Cursor,新的MCP服务器配置才会被加载。仅仅重启项目窗口可能不够。
配置完成后,启动Cursor。你可以通过检查Cursor的“MCP Servers”状态来确认是否成功(通常可以在设置或相关菜单中找到)。如果配置正确,你应该能在聊天中直接使用这些工具了。
4. 核心工具实战解析与高级技巧
配置成功只是第一步,真正发挥威力在于如何高效使用这些工具。下面我结合实例,深入讲解几个核心工具的使用逻辑和实战技巧。
4.1 股票筛选:从模糊想法到精确清单
screen_stocks_advanced_filters工具是你的“股票雷达”。它通过Finviz的筛选逻辑,帮你从数千只股票中快速定位符合特定条件的标的。关键在于理解filters参数。
Finviz筛选器使用一套简码系统。工具文档里提到了f和o参数,分别对应筛选条件(filter)和排序(order)。但实际使用中,你需要查阅Finviz网站上的筛选器对应关系。例如:
cap_large:市值大于100亿美元fa_pe_profitable:市盈率大于0(即盈利)ta_pattern_channeldown:技术形态为“下降通道”geo_usa:地理位置为美国
一个复杂的筛选示例:我想找美国的大型科技股(行业包含“Technology”),当前股价在50日均线以上,且过去一个季度有机构增持。
{ "f": "cap_large,ind_technology,ta_sma50_pa,fa_instown_quarteroverquarter", "o": "-marketcap" // 按市值降序排列 }实操心得:
- 从宽到窄:初次筛选时,条件不要设得太死,先看看能返回多少结果,再逐步增加条件缩窄范围。
- 善用排序:
o参数非常有用。除了marketcap(市值),还可以用-pe(市盈率升序,找估值低的)、-performance(近期表现降序)等。- 注意速率限制:这个工具背后是爬取Finviz网页,频繁调用可能会触发对方的反爬机制,导致暂时失败。建议对筛选结果进行缓存,或者将多次筛选任务间隔开。
4.2 基本面分析与财务健康度评分:穿透数字看本质
get_fundamental_stock_metrics和calculate_financial_health_score是一对组合拳。前者提供原始数据,后者提供AI驱动的综合评估。
当你查询苹果公司(AAPL)的基本面数据时,你会得到数十个指标。对于新手,面对这么多数据容易眼花缭乱。我的建议是重点关注几个核心比率群:
- 估值比率:
pe(市盈率)、forwardPE(前瞻市盈率)、peg(市盈增长比率)。peg小于1通常被认为估值具有吸引力。 - 盈利能力:
roe(净资产收益率)、profitMargin(净利率)。持续的高ROE是优秀公司的标志。 - 财务稳健性:
debtToEquity(负债权益比)、currentRatio(流动比率)。debtToEquity过高意味着财务风险大。
calculate_financial_health_score工具的价值在于,它试图用一个0-100的分数来量化公司的整体财务健康状况。其算法(根据参数权重推测)综合了:
- 盈利能力(权重0.3):公司赚钱的能力。
- 流动性(权重0.2):公司偿还短期债务的能力。
- 杠杆水平(权重0.2):公司使用债务融资的程度。
- 运营效率(权重0.15):公司利用资产产生收入的效率。
- 成长性(权重0.15):公司收入、利润的增长速度。
你可以通过weights参数调整这些维度的重视程度。例如,如果你是一个风险厌恶的投资者,可以调高liquidity和降低leverage的权重。
高级技巧:不要孤立地看一个分数。用
compare_stock_valuations工具将同一行业的多家公司放在一起对比。比如,对比['AAPL', 'MSFT', 'GOOGL', 'AMZN']的市盈率和市净率,你就能看出市场对这几家科技巨头的相对估值水平。再结合各自的财务健康分,就能发现一些潜在机会:比如一家公司估值相对较低,但财务健康分却很高,这可能就值得深入研究了。
4.3 市场情绪捕捉:期权、内幕与社交媒体的三角验证
真正的市场老手不仅看财报,更看“人气”和“聪明钱”的动向。这个项目提供了三个独特的情绪分析工具。
1. 期权市场情绪 (get_put_call_ratio):Put/Call比率是期权市场的一个经典情绪指标。比率高,说明买入看跌期权(Put)的人多,市场情绪偏悲观;比率低,则说明买入看涨期权(Call)的人多,情绪偏乐观。但这个指标需要辩证看待:
- 极端值才有意义:通常,PCR远高于1(如1.5以上)或远低于0.7时,可能预示着市场情绪过度悲观或乐观,存在反向交易机会。
- 结合价格走势:如果股价在上涨,但PCR也在同步攀升(看跌情绪加重),这可能是一个“背离”警告信号,上涨动力可能不足。
2. 内幕交易监控 (analyze_insider_activity):公司高管和董事的买卖行为是重要的信号。但并非所有买卖都同等重要:
- 关注“集群效应”:单笔交易可能是个别行为,但如果同一时间段内多位高管集体买入,这是一个非常强烈的积极信号。
- 关注交易规模:参数中的
min_transaction_value(默认1万美元)可以过滤掉无足轻重的小额交易。真正值得关注的是百万美元级别以上的买卖。 - 区分计划性与非计划性交易:很多高管买卖是根据预设的“10b5-1计划”进行的,这类交易信号意义较弱。该工具如果能区分这一点会更好,但目前看来可能没有。
3. 社交媒体情感分析 (analyze_reddit_sentiment):这是最“有趣”也最需要谨慎对待的工具。它从Reddit的股票投资社区抓取讨论,并用OpenAI的模型分析帖子内容是看涨、看跌还是中性。
- 适用场景:对于 meme 股、高波动性的科技股或近期有热点事件的股票,社交媒体情绪是重要的市场噪音指标。情绪极度狂热时,往往是风险高点;情绪极度悲观时,可能孕育机会。
- 局限性:Reddit情绪(尤其是WallStreetBets)以短线投机和情绪化著称,不能作为长期投资依据。AI的情感分析也可能误判讽刺、反语或复杂的金融术语。
三角验证法:最有效的用法是将三者结合。例如,你发现某股票:
- 期权PCR处于历史低位(市场极度乐观)。
- Reddit上关于该股的讨论热度飙升,情感分析显示极度看涨。
- 但与此同时,公司内部人士却在近期大量减持股票。
这种“大众狂热”与“内部人士谨慎”的背离,就是一个需要高度警惕的风险信号。comprehensive_stock_analysis工具的价值就在于它初步尝试了这种多维度整合,为你提供了一个全景视图的起点。
5. 常见问题、故障排查与性能优化
在实际使用中,你几乎一定会遇到一些问题。下面是我总结的常见故障及其解决方法。
5.1 连接与配置问题
问题1:Cursor提示“无法连接到MCP服务器”或工具列表不显示。
- 检查1:路径与权限:确认
mcp.json中args的路径是绝对路径且指向编译后的dist/server.js文件。确保你有该文件的读取和执行权限。 - 检查2:Node环境:在项目根目录下直接运行
node dist/server.js,看是否报错。常见的错误是缺少.env文件或API密钥未设置。MCP服务器通常需要持续运行,直接运行可能会因为缺少MCP标准输入而退出,但只要不立即报语法或模块错误,就说明基础环境OK。 - 检查3:Cursor重启:确保完全退出Cursor(包括后台进程)再重新启动。在macOS上可以使用“强制退出”,在Windows上检查任务管理器。
- 检查4:配置文件语法:检查
mcp.json的JSON格式是否正确,没有多余的逗号,引号匹配。可以使用在线的JSON验证工具。
问题2:工具调用失败,返回“API key not found”或类似错误。
- 检查1:环境变量传递:确保
mcp.json中的env字段拼写正确,且值已正确替换为你的真实密钥(去掉sk-your-...之类的占位符)。 - 检查2:密钥有效性:单独测试你的OpenAI API Key是否有效(例如,用
curl调用一个简单的OpenAI接口)。检查Reddit的客户端ID和密码是否正确,Reddit账号是否能正常登录。 - 检查3:服务器日志:MCP服务器运行时可能会将错误日志输出到标准错误流。在Cursor中查看MCP服务器连接状态有时能看到错误信息,或者尝试在终端直接以前台方式运行服务器来观察输出。
5.2 数据获取与速率限制问题
问题3:调用股票筛选或基本面工具时超时或返回空数据。
- 原因:这很可能是Finviz或Barchart的网页爬虫被限制或网站结构已更新。网页爬虫非常脆弱。
- 解决方案:
- 重试机制:工具内部可能已有简单重试,你可以稍等片刻再试。
- 降低频率:避免在短时间内对同一数据源进行高频请求。
- 检查更新:关注项目的GitHub Issues页面,看是否有其他人遇到相同问题,或作者是否发布了针对网站改动的更新。
- 备用方案:如果持续失败,考虑寻找替代数据源,但这需要修改项目源码中的适配器。
问题4:Reddit相关工具返回“Rate Limit”或“Authentication Failed”。
- 原因:Reddit API对未经验证的应用或低karma值的账号有严格的速率限制。脚本认证方式(使用用户名密码)的限额通常较低。
- 解决方案:
- 增加延迟:在工具调用间手动添加延迟,不要连续快速调用
discover_trending_stocks和analyze_reddit_sentiment。 - 使用OAuth:如果技术允许,可以考虑修改
reddit.ts适配器,使用更稳定、限额更高的OAuth流程(需要处理授权码和刷新令牌)。 - 使用备用账号:使用一个有一定发帖/点赞历史的Reddit老账号,新账号的API限制可能更严。
- 增加延迟:在工具调用间手动添加延迟,不要连续快速调用
问题5:OpenAI新闻分析耗时过长或消耗大量token。
- 原因:
analyze_news_and_market_context工具会获取多篇新闻,并发送给OpenAI的模型进行总结和情感分析,这可能会消耗大量token并增加延迟。 - 优化建议:
- 调整参数:减少
max_articles(默认10篇)和days_back(默认7天)的值。对于日常跟踪,分析最近3天的3-5篇关键新闻可能就够了。 - 使用更小模型:如果项目代码允许,可以尝试配置使用更便宜、更快的模型(如
gpt-3.5-turbo),而不是默认的gpt-4。分析准确度可能会略有下降,但成本和速度会显著改善。 - 关注成本:定期在OpenAI后台检查API使用量和费用。
- 调整参数:减少
5.3 性能与使用技巧优化
1. 将常用查询模式固化:不要每次都在聊天框里重新描述复杂需求。你可以让Cursor记住一些“查询模板”。例如,你可以对Cursor说:“以后当我提到‘快速扫描科技龙头’,你就帮我执行screen_stocks_advanced_filters,使用过滤器{"f": "cap_large,ind_technology,fa_pe_profitable", "o": "-marketcap"},并只返回前10个结果。” 虽然Cursor的上下文记忆有限,但你可以将这段描述保存在记事本中,需要时快速粘贴。
2. 结合AI的分析与你的判断:这个MCP服务器提供的是数据和初步分析,而不是投资建议。当AI助手给你返回一份comprehensive_stock_analysis报告时,你需要:
- 交叉验证:报告中的财务数据是否与公司财报或雅虎财经一致?
- 理解背景:AI分析出的“负面新闻情绪”,是因为公司产品出了问题,还是仅仅因为大盘普跌?
- 做出决策:工具告诉你内幕人士在买入,社交媒体情绪火热。但这符合你自己的投资逻辑和风险承受能力吗?不要被工具的输出牵着鼻子走。
3. 本地化与定制开发:这是一个开源项目,最大的优势在于你可以修改它来满足特定需求。
- 添加新的数据源:如果你想加入加密货币数据、宏观经济指标或某个特定数据提供商的信息,可以参照现有适配器的模式,在
adapters/目录下新增一个文件。 - 创建自定义工具:如果你有一个独特的分析指标(比如结合市盈率和营收增长的自定义评分),可以在
tools/目录下创建新的工具函数,并在server.ts中注册它。 - 优化数据缓存:为了避免重复请求和触发速率限制,可以为适配器层添加一个简单的内存或文件缓存机制,例如将股票的基本面数据缓存1小时。
这个项目是一个强大的起点,它将专业的金融数据能力无缝嵌入了你的AI工作流。它的价值不在于提供一个“圣杯”式的交易信号,而在于极大地压缩了从“产生一个投资想法”到“获取初步验证数据”之间的时间和精力成本。剩下的深度研究和决策判断,依然需要你这位“首席投资官”来完成。用好它,让它成为你延伸的数据触角和高效的分析副驾,而不是替代你思考的“黑箱”。