文档备案控制台
免费开始使用

基于 MCP 协议接入金融行情数据的技术实践

事情是这样的。我平时会花一些时间盯盘,但你也知道,盯盘这活太磨人,盯久了眼神都涣散。我就琢磨着,能不能让 AI 帮我干这件事——我不要求它替我交易,至少能在我问“今天苹果走得怎么样”的时候,别瞎编一个股价糊弄我,而是老老实实去查一下真实的行情。

picture.image 一开始我的想法很简单:自己写个 Python 脚本,调个免费行情接口,把数据拼成 prompt 喂给 GPT。吭哧吭哧写了大半天,功能是跑通了,但每换一个模型,function calling 的格式就得重新适配。而且这种“胶水代码”越写越脏,到后面我自己都不想维护。后来一个做量化的朋友跟我说:“你试试 MCP 吧,iTick 有现成的,开箱即用,别自己造轮子了。”

我之前只是听说过 MCP(Model Context Protocol),知道它是 Anthropic 搞的一套让大模型调用外部工具的协议,但从没上手过。趁着周末,我决定认真走一遍流程,顺便把过程记录下来,给有同样需求的朋友一个参考。

一、我面对的核心问题

说白了,我想要的其实特别简单:让大模型能“看见”真实的行情数据。不是把数据手动复制给它,也不是写一堆胶水代码,而是像和人说话一样,直接问它“特斯拉现在多少钱”“帮我看一下最近 20 天的布林带”,它就自己去拉数据、算指标,然后把结果用正常人话告诉我。

这件事分两步:第一步是模型能理解我的意图,第二步是它能碰得到数据。第一步现在的大模型都能做,第二步就得靠外部工具了。而 MCP 正好解决了第二步——它把“数据获取”抽象成了标准化的工具,模型想用什么,直接通过 MCP 这个管道去调就行。

iTick 做的,就是把他们的行情数据和技术指标封装成了一个 MCP 服务,跑在本地,既不需要暴露端口,也不用我操心数据格式。

二、上手过程,真没那么玄乎

我先说我手头的环境:一台 M1 的 MacBook,Node.js 18 装好了,Python 3.11,别的没啥特殊。iTick 的 MCP 服务端是 npm 包,启动就是一行命令。

配置文件

建了个 itick-mcp.json,内容如下:

{
  "apiKey": "把刚才的KEY填进去",
  "defaultMarket": "US"
}

这文件就放在我项目根目录,没有花里胡哨的东西。

启动服务

终端里敲:

npx @itick/mcp-server --config itick-mcp.json

回车之后没有界面,就一行启动成功的日志,然后安安静静地等着。说实话我第一次看到这反应还有点慌,以为卡住了,后来才明白它走的是 stdio 通信,就是等着客户端来连。

三、用 Python 客户端试了试水

我不想一上来就接 Claude,怕哪里配错了报一堆红字影响心情。于是先写了一个最简版的 Python 脚本,看看能不能把数据拿回来。

装 MCP 的 Python SDK:

pip install mcp

然后写 test.py

import asyncio
from mcp import Client
from mcp.client.stdio import stdio_client

async def main():
    # 连接刚启动的 MCP 服务
    async with stdio_client(
        "npx", ["-y", "@itick/mcp-server", "--config", "itick-mcp.json"]
    ) as (read, write):
        async with Client(read, write) as client:
            await client.initialize()

            # 看看它提供了哪些工具
            tools = await client.list_tools()
            print("都有哪些工具可以用:", [t.name for t in tools])

            # 查一下苹果的实时报价
            quote = await client.call_tool("get_realtime_quote", {"symbol": "AAPL"})
            print("=== AAPL 实时行情 ===")
            print(quote.content[0].text)

            # 再拿一下技术指标,MA20 和布林带
            tech = await client.call_tool("get_technical_indicator", {
                "symbol": "AAPL",
                "interval": "1d",
                "period": 20,
                "indicators": ["MA", "BOLL"]
            })
            print("=== 技术指标(MA20 和布林带)===")
            print(tech.content[0].text)

asyncio.run(main())

跑起来,输出大概是这样的:

都有哪些工具可以用: ['get_realtime_quote', 'get_historical_bars', 'get_technical_indicator', 'search_instrument', 'get_financials']
=== AAPL 实时行情 ===
{
  "symbol": "AAPL",
  "price": 198.75,
  "change": 2.34,
  "changePercent": 1.19,
  "timestamp": "2026-06-23T14:30:00Z"
}
=== 技术指标(MA20 和布林带)===
{
  "ma20": 195.40,
  "boll_upper": 200.15,
  "boll_mid": 195.40,
  "boll_lower": 190.65,
  "current_price": 198.75,
  "position": "价格位于布林带上半区,接近上轨"
}

那一刻我真的有点小兴奋。要知道,我啥接口文档都没查,参数名基本靠猜(symbolintervalindicators 这种,猜得八九不离十),居然一次性跑通了。布林带上中下轨还有位置描述,直接返给我了,省得我自己再去算一堆 pandas。

四、真正爽的是接到 Claude Desktop 上

命令行跑通只是热身,MCP 最该用的地方,是让大模型自己去调这些工具。我日常用 Claude Desktop 比较多,正好它原生支持 MCP。

配置方式不复杂,找到 Claude Desktop 的 config 文件(Mac 上在 ~/Library/Application Support/Claude/claude_desktop_config.json),加上一段:

{
  "mcpServers": {
    "itick": {
      "command": "npx",
      "args": ["-y", "@itick/mcp-server", "--config", "/你的路径/itick-mcp.json"]
    }
  }
}

保存,重启 Claude Desktop,然后试着在对话框里问了一句:

帮我看下特斯拉现在股价多少,日线级别的布林带位置怎么样?

Claude 大概沉默了两秒(我猜是去调 get_realtime_quoteget_technical_indicator 了),然后回了我一段:当前价格多少,布林带上中下轨分别在哪里,还告诉我价格位于布林带上半区,接近上轨,短期可能面临阻力。我接着又问:

那英伟达呢?同样的指标,做个对比。

它又分别拉了一次数据,给我列了个表格对比两家的价格和布林带位置。我全程没离开对话框,也没有复制任何行情数字。

说实话,这种体验非常接近我理想中“能干活儿的 AI 助理”。它没有瞎编一个股价,因为根本没机会编——每一步数据都是从 iTick 的接口实时拉回来的,而且来源可追溯。

五、我踩的一个坑,顺便提醒你

晚上我试着写了一个多轮对话的测试脚本,想让它在同一段对话里连续问好几只股票。结果第二次调用工具的时候报了个 “session expired” 的错误。我查了半天,发现是自己的代码逻辑问题:我把 async with 的作用域写得太窄,第一次调用完连接就关了。

解决办法很简单,把多次工具调用都放在同一个 async with 块里,保持连接复用。iTick 的文档里有提到这一点,但因为我一开始没仔细看,就折腾了半小时。如果你也做持续交互的应用,记得把 client 的生命周期管好。

六、这东西到底适合谁?

用了一周,我的感受是:iTick 这个 MCP,它不是在卖一个黑盒产品,而是给了一个非常干净的“数据接入标准件”。优点是:

  • 部署成本极低,一条命令就能跑,不需要起一个额外的服务。
  • 返回的数据是干净的结构化 JSON,你想二次加工或者存数据库都很方便。
  • 内置的技术指标直接用,不用自己写计算逻辑(尤其是布林带,我之前手写老在边界条件上踩坑)。
  • 权限隔离做得还可以,API Key 写在配置文件里,客户端代码里完全不用出现。

但也有局限,我得诚实说:

  • 如果你需要极低延迟的高频交易场景,这玩意儿肯定不适合。它走本地 stdio 通信,天生就不是为那个设计的。
  • 如果你想用一些非常冷门的指标,它内置的可能覆盖不到,还是得自己算。
  • 服务端更新比较频繁,我这周就遇到一次版本升级,好在没破坏老接口。

所以它最适合谁呢?我稍微理了理:

  1. 个人投资者或交易爱好者,想用自然语言快速查行情、做技术分析的。
  2. 平时写量化脚本的开发者,想把数据接入这部分工作外包出去,自己只关心策略逻辑。
  3. 跟我一样喜欢把 AI 助手“武装”起来的人,让它不再是只会聊天的玩具。

最后说两句

折腾完这套,我最大的一个感触是:过去我们总抱怨大模型“不懂金融”,但其实不是模型不够聪明,是它看不见真实的市场数据。MCP 干的事,就是把这扇窗给打开了。iTick 又恰好是那个把窗户开得比较利索的——我不用操心窗户框怎么装,只要走过去推开就行。

如果你也被那些“胶水代码”折磨过,或者想让自己的 AI 助手真的能派上点用场,花个十来分钟试一下。那种“问一句就能出结果”的流畅感,确实有点上头。

github 文档

0
0
0
0
评论
未登录
暂无评论