TradingView MCP 实战:用 CDP 与 MCP 协议让 AI 操作图表
1. 项目缘起与核心思路拆解1.1 这个项目到底在解决什么问题做量化交易或者盯盘的朋友大概率都遇到过这样的场景在 TradingView 上画了一堆趋势线、斐波那契回调位、支撑阻力区间然后想把这些信息同步到自己的策略脚本里或者想让 AI 助手帮你分析当前图表结构。但 TradingView 本身是一个封闭的 Web 应用它的图表数据、绘图对象、指标参数都锁在浏览器里外部程序很难直接读取。tradingview-mcp这个项目就是冲着这个痛点去的。它的核心思路是利用 Chrome DevTools ProtocolCDP接管一个已经登录 TradingView 的浏览器实例通过注入 JavaScript 的方式读取图表状态、绘图对象、指标数据再把这些能力包装成 MCPModel Context Protocol工具暴露给 Claude Code 这类支持 MCP 协议的 AI 客户端。这样一来你就能用自然语言让 AI 去操作 TradingView 图表比如把当前图表上所有的水平线读取出来、帮我在最新高点画一条阻力线、把 RSI 参数改成 14, 70, 30。MCP 是什么简单说它是 Anthropic 推出的一个开放协议让 AI 模型能够以标准化方式调用外部工具和数据源。你可以把它理解成AI 世界的 USB 接口——只要你的工具实现了 MCP Server任何支持 MCP 的客户端Claude Code、Claude Desktop、部分 IDE 插件等都能直接调用不需要为每个客户端单独写适配层。这个项目适合谁三类人一是做 Pine Script 策略开发、需要频繁读取图表状态的量化开发者二是想用 AI 辅助技术分析、但不想手动截图喂给模型的交易者三是对 MCP 协议感兴趣、想找一个真实项目练手 MCP Server 开发的工程师。1.2 为什么选 CDP 而不是官方 APITradingView 有官方 API 吗有但那是给券商和数据合作方用的普通用户拿不到图表级别的读写权限。官方提供的 Webhook 只能单向推送告警无法反向读取图表上的绘图对象。所以想操作图表只有两条路一是模拟鼠标键盘操作 UI二是通过 CDP 注入脚本直接调用页面内部的 JS 对象。模拟 UI 操作的问题很明显TradingView 的界面元素 class 名经常变坐标定位脆弱一旦页面布局调整就全废。而 CDP 方案的优势在于TradingView 的前端代码里维护着一套完整的图表状态对象window.tvWidget及其内部chart对象只要能拿到这个对象的引用就能以编程方式读取和修改几乎所有图表属性。这比模拟点击稳定得多也更高效。当然CDP 方案也有代价它依赖 TradingView 前端代码的内部结构如果官方重构了tvWidget的 API脚本就可能失效。所以这个项目的维护者需要持续跟进 TradingView 的版本更新。但从实际使用来看TradingView 的核心图表 API 相对稳定大版本升级才会动日常小更新基本不影响。1.3 MCP 协议在这里扮演的角色如果没有 MCP你得自己写一个 HTTP 服务然后让 Claude Code 通过 function calling 去调。但 function calling 的 schema 定义、参数校验、错误处理都得自己搞而且不同 AI 客户端的调用格式还不一样。MCP 把这些标准化了你只需要定义一个 MCP Server声明有哪些 tool、每个 tool 接受什么参数、返回什么结构剩下的协议握手、能力协商、消息路由都由 MCP 框架处理。tradingview-mcp本质上是一个 MCP Server它内部维护着一个 CDP 连接把 TradingView 图表操作封装成一个个 MCP tool。Claude Code 作为 MCP Client启动时读取 Server 的 tool 列表然后在对话中根据用户意图自动选择合适的 tool 调用。整个链路是用户自然语言 → Claude Code 解析意图 → 调用 MCP tool → MCP Server 通过 CDP 操作浏览器 → 返回结果 → Claude Code 组织语言回复用户。这个架构的好处是解耦MCP Server 只负责怎么操作 TradingViewClaude Code 只负责理解用户想干什么两边通过标准协议通信。你甚至可以把tradingview-mcp接到其他 MCP Client 上比如 Cursor、Windsurf只要它们支持 MCP。2. 环境准备与核心依赖解析2.1 基础环境清单在动手之前先把下面这些东西准备好。我按重要性排了序缺一不可Node.js 18MCP Server 通常用 TypeScript/JavaScript 写需要 Node 运行时。建议用 nvm 管理版本避免和系统自带的老版本冲突。Chrome 或 ChromiumCDP 是 Chrome 的调试协议必须用 Chrome 系浏览器。Edge 也行但有些 CDP 域的实现有差异建议直接用 Chrome。Claude Code作为 MCP Client。安装方式后面细说。TradingView 账号免费账号也能用但部分高级指标和绘图工具需要付费订阅。免费账号的图表 API 权限可能受限实测下来基础的水平线、趋势线读取没问题。一个稳定的网络环境TradingView 是海外服务国内访问需要确保网络通畅。这里不展开自行解决。2.2 Claude Code 的安装与配置Claude Code 是 Anthropic 出的命令行 AI 编程助手支持 MCP 协议。安装方式根据系统不同# macOS / Linux npm install -g anthropic-ai/claude-code # 或者用官方安装脚本 curl -fsSL https://claude.ai/install.sh | bashWindows 用户建议在 WSL2 里跑原生 Windows 支持还在完善中。安装完成后运行claude命令首次会引导你登录 Anthropic 账号。配置 MCP Server 的方式有两种一是全局配置写在~/.claude/claude_desktop_config.jsonClaude Desktop或~/.claude/settings.jsonClaude Code二是项目级配置在项目根目录放.mcp.json。推荐用项目级配置方便版本管理。一个典型的 MCP Server 配置长这样{ mcpServers: { tradingview: { command: node, args: [/path/to/tradingview-mcp/dist/index.js], env: { CDP_PORT: 9222, TV_URL: https://www.tradingview.com/chart/ } } } }command是启动 Server 的可执行文件args是参数env是环境变量。MCP Client 启动时会自动拉起这个进程通过 stdio 通信。2.3 Chrome 远程调试模式的启动CDP 要工作Chrome 必须以远程调试模式启动。关键参数是--remote-debugging-port指定一个端口比如 9222。但这里有个坑如果你直接用默认的 Chrome 用户数据目录启动Chrome 会检测到已有实例在运行然后直接把请求转发给已有实例远程调试端口不会生效。正确的做法是单独指定一个用户数据目录# macOS /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ --remote-debugging-port9222 \ --user-data-dir/tmp/chrome-tv-profile # Linux google-chrome \ --remote-debugging-port9222 \ --user-data-dir/tmp/chrome-tv-profile # Windows C:\Program Files\Google\Chrome\Application\chrome.exe ^ --remote-debugging-port9222 ^ --user-data-dirC:\temp\chrome-tv-profile用独立的用户数据目录还有一个好处你可以在这个 profile 里单独登录 TradingView不影响你日常用的 Chrome。而且这个 profile 可以保持登录状态下次启动不用重新登录。启动后访问http://localhost:9222/json/version如果能看到 Chrome 的版本信息 JSON说明 CDP 已经就绪。再访问http://localhost:9222/json/list能看到当前打开的标签页列表找到 TradingView 那个标签页的webSocketDebuggerUrl后面 MCP Server 就是通过这个 WebSocket 地址和浏览器通信的。注意远程调试端口不要暴露到公网只监听 localhost 即可。如果确实需要远程访问务必加认证层否则任何人拿到端口就能控制你的浏览器。2.4 项目源码的获取与构建tradingview-mcp的源码通常在 GitHub 上clone 下来后git clone https://github.com/xxx/tradingview-mcp.git cd tradingview-mcp npm install npm run build构建产物在dist/目录下入口文件一般是dist/index.js。如果你要改源码用npm run dev可以热重载。TypeScript 项目的话tsconfig.json里一般配了outDir: dist改完源码重新 build 就行。构建过程中可能遇到的坑Node 版本太低导致某些 ES2022 语法不支持报SyntaxError: Unexpected token ?之类的错。升级到 Node 18 以上即可。另外如果项目依赖了chrome-remote-interface这个库它内部用了ws做 WebSocket 通信某些网络环境下 npm install 会卡住可以换淘宝镜像或者用 pnpm。3. 核心机制与实操要点3.1 CDP 连接与页面注入原理MCP Server 启动后第一件事是连上 Chrome 的 CDP 端点。流程是这样的向http://localhost:9222/json/list发 HTTP 请求拿到所有标签页的信息。遍历标签页找到 URL 包含tradingview.com/chart的那个。从标签页信息里取出webSocketDebuggerUrl建立 WebSocket 连接。通过 WebSocket 发送 CDP 命令比如Runtime.evaluate来执行 JS 代码。Runtime.evaluate是核心中的核心。它允许你在页面上下文里执行任意 JavaScript并拿到返回值。比如要读取图表上所有水平线的价格// 在页面上下文执行 const chart window.tvWidget.activeChart(); const lines []; chart.getLines().forEach(line { lines.push({ price: line.getPrice(), color: line.getColor(), id: line.id }); }); JSON.stringify(lines);MCP Server 把这段代码通过 CDP 发过去页面执行后返回 JSON 字符串Server 再解析成结构化数据返回给 Claude Code。这里有个关键细节Runtime.evaluate默认在全局上下文执行但 TradingView 的tvWidget可能挂在window上也可能在某个 iframe 里。如果是 iframe需要先通过Page.getFrameTree找到目标 frame再用Runtime.evaluate的contextId参数指定执行上下文。实测下来TradingView 主图表通常在顶层 window但某些弹窗和设置面板在 iframe 里读取时要区分。3.2 TradingView 内部 API 的探索方法window.tvWidget这个对象不是官方文档里的是 TradingView 前端代码自己挂上去的。要搞清楚它有哪些方法最直接的办法是在 Chrome DevTools 的 Console 里敲Object.keys(window.tvWidget) Object.getOwnPropertyNames(Object.getPrototypeOf(window.tvWidget))然后一层层往下挖。比如tvWidget.activeChart()返回当前活动图表对象这个对象上有getLines()、getStudies()、createLine()、removeLine()等方法。不同版本的 TradingView 方法名可能有差异所以 MCP Server 里通常会做一层兼容处理比如先检测方法是否存在不存在就降级到备选方案。我自己的经验是把常用的操作整理成一个API 映射表记录每个操作对应的 JS 代码片段。这样即使 TradingView 升级导致某个方法改名也只需要改映射表里的一行不用动整个 Server 逻辑。操作JS 代码片段备注获取所有水平线tvWidget.activeChart().getLines()返回线对象数组创建水平线tvWidget.activeChart().createLine({price: 100, color: #FF0000})参数因版本而异获取当前 symboltvWidget.activeChart().symbol()返回字符串获取当前周期tvWidget.activeChart().resolution()返回如 60 表示 1 小时获取所有指标tvWidget.activeChart().getStudies()返回指标对象数组修改指标参数tvWidget.activeChart().getStudyById(id).setInputs({...})需要先拿到 study id3.3 MCP Tool 的定义与参数设计MCP Server 的核心是定义 tool。每个 tool 有 name、description、inputSchema 三部分。name 是工具名description 是给 AI 看的说明非常重要AI 靠这个判断什么时候调用inputSchema 是 JSON Schema 格式的参数定义。举个例子读取所有绘图对象的 tool{ name: get_drawings, description: 读取 TradingView 当前图表上所有的绘图对象包括水平线、趋势线、矩形等。返回每个对象的类型、价格、颜色、ID。, inputSchema: { type: object, properties: { type: { type: string, enum: [all, line, trendline, rectangle], description: 要读取的绘图类型默认 all } } } }description 的写法很讲究。AI 是根据 description 来决定是否调用这个 tool 的所以要把什么时候用、返回什么写清楚。比如读取当前图表上所有水平线就比获取绘图要好因为前者包含了触发场景。参数设计上尽量用 enum 限制取值范围减少 AI 传错参数的概率。对于可选参数给默认值并在 description 里说明。对于复杂参数用嵌套的 object schema但不要嵌套太深否则 AI 容易搞混。3.4 错误处理与超时控制CDP 调用不是百分百可靠的。页面可能正在加载、WebSocket 可能断开、JS 执行可能抛异常。MCP Server 必须做好错误处理否则一个异常就会导致整个 Server 崩溃Claude Code 那边会看到连接断开。我的做法是三层防护第一层CDP 命令加超时。用Promise.race包一下比如 5 秒没返回就抛超时错误。TradingView 页面卡顿时这个超时能防止 Server 无限等待。第二层JS 执行用 try-catch 包裹。在注入的代码里加try { // 业务逻辑 return JSON.stringify({ok: true, data: result}); } catch (e) { return JSON.stringify({ok: false, error: e.message}); }这样即使页面内部报错也能把错误信息带回 Server而不是让 CDP 抛异常。第三层MCP tool 的 handler 里再包一层 try-catch把错误转成 MCP 协议规定的错误响应格式。MCP 协议里tool 调用失败应该返回isError: true和错误内容而不是直接抛异常。实操心得调试阶段可以把每次 CDP 调用的请求和响应都打到日志里方便排查。但生产环境要关掉否则日志文件会爆炸。可以用环境变量DEBUG1控制。4. 完整实操流程与关键环节实现4.1 从零启动一个可用的 tradingview-mcp 实例假设你已经 clone 了源码、装好了依赖、build 完成下面是从零启动的完整步骤第一步启动 Chrome 远程调试实例。# 先关掉所有 Chrome 实例避免端口冲突 pkill -f Google Chrome # macOS/Linux # Windows 用任务管理器关 # 启动带远程调试的 Chrome /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ --remote-debugging-port9222 \ --user-data-dir/tmp/chrome-tv-profile \ --no-first-run \ --no-default-browser-check--no-first-run和--no-default-browser-check是为了跳过首次启动的引导页让 Chrome 直接打开空白页。第二步在 Chrome 里打开 TradingView 并登录。访问https://www.tradingview.com/chart/用你的账号登录。登录后打开一个图表随便加载一个 symbol比如 BTCUSDT。确保图表完全加载完成指标和绘图都渲染出来。第三步验证 CDP 连接。curl http://localhost:9222/json/list | jq .[] | select(.url | contains(tradingview))如果能看到 TradingView 标签页的信息说明 CDP 就绪。记下webSocketDebuggerUrl后面调试用得上。第四步配置 Claude Code 的 MCP Server。在项目根目录创建.mcp.json{ mcpServers: { tradingview: { command: node, args: [./dist/index.js], env: { CDP_PORT: 9222, TV_URL_PATTERN: tradingview.com/chart } } } }第五步启动 Claude Code 并验证。claude进入对话后输入/mcp命令应该能看到tradingviewserver 的状态是 connected并且列出了所有可用的 tool。如果显示 failed检查 Node 路径、dist 目录是否存在、CDP 端口是否可访问。第六步测试第一个 tool 调用。在 Claude Code 里输入读取当前 TradingView 图表上所有的水平线Claude Code 会解析意图调用get_drawingstoolMCP Server 通过 CDP 执行 JS返回结果。如果一切正常你会看到水平线的价格列表。4.2 读取图表状态symbol、周期、指标读取图表基础状态是最常用的操作。MCP Server 里通常有一个get_chart_statetool返回当前 symbol、周期、指标列表、绘图对象数量等。实现上注入的 JS 大概长这样(function() { try { const chart window.tvWidget.activeChart(); const state { symbol: chart.symbol(), resolution: chart.resolution(), chartType: chart.chartType(), studies: [], drawings: [] }; // 读取指标 chart.getStudies().forEach(study { state.studies.push({ id: study.id, name: study.name, inputs: study.inputs() }); }); // 读取绘图 chart.getLines().forEach(line { state.drawings.push({ type: line, price: line.getPrice(), color: line.getColor() }); }); return JSON.stringify({ok: true, data: state}); } catch (e) { return JSON.stringify({ok: false, error: e.message}); } })();这里有个细节chart.getStudies()返回的 study 对象其inputs()方法返回的是当前指标参数。比如 RSI 指标会返回{length: 14, source: close, ...}。不同指标的参数结构不同MCP Server 不需要解析具体含义原样返回给 AI 即可AI 自己会理解。周期resolution的返回值是字符串比如 1 表示 1 分钟60 表示 1 小时1D 表示日线。这个映射关系要在 tool 的 description 里说明否则 AI 可能把 60 理解成 60 分钟还是 60 秒搞混。4.3 创建与修改绘图对象创建水平线的操作比读取复杂因为要处理参数校验和坐标转换。TradingView 的绘图 API 接受的是价格值但用户可能想按当前价格的 2% 上方来画线这就需要先读取当前价格再计算。一个典型的create_hlinetool 实现(function(price, color, lineWidth) { try { const chart window.tvWidget.activeChart(); const line chart.createLine({ price: price, color: color || #FF0000, linewidth: lineWidth || 1, linestyle: 0 }); return JSON.stringify({ok: true, data: {id: line.id, price: price}}); } catch (e) { return JSON.stringify({ok: false, error: e.message}); } })(PRICE, COLOR, WIDTH);注意PRICE、COLOR、WIDTH是占位符实际执行时 MCP Server 会把用户参数拼进去。这里有个安全隐患如果用户参数里包含恶意 JS 代码直接拼接会导致代码注入。所以必须做参数转义或者用 CDP 的Runtime.callFunctionOn传参而不是字符串拼接。Runtime.callFunctionOn的用法是先Runtime.evaluate拿到一个函数对象然后callFunctionOn传参数调用。这样参数是作为 JSON 传递的不会被当成代码执行。MCP Server 里应该优先用这种方式。修改指标参数也是类似逻辑。先通过getStudies()找到目标指标的 id然后调setInputsconst study chart.getStudyById(studyId); study.setInputs({length: 20});但要注意不是所有指标都支持setInputs有些内置指标是只读的。实测下来大部分技术指标MA、RSI、MACD都支持修改但一些高级指标可能不行。MCP Server 里要做好错误捕获把不支持修改的情况友好地返回给 AI。4.4 与 Pine Script 的联动Pine Script 是 TradingView 的策略脚本语言。tradingview-mcp本身不直接执行 Pine Script但可以通过读取图表上的策略指标来间接获取 Pine Script 的输出。比如你加载了一个 Pine 策略它会在图表上画出买卖信号。这些信号通常以 label 或 line 的形式存在。MCP Server 可以通过getLabels()和getLines()读取这些信号然后返回给 AI 分析。更进一步有些 MCP Server 实现了get_pine_outputtool通过读取策略指标的plot数据来获取数值输出。这需要访问study.getPlotValues()之类的内部方法稳定性取决于 TradingView 版本。我自己的做法是不直接读 Pine 内部数据而是让 Pine 脚本把关键数值通过label.new画在图表上MCP Server 读 label 的文本内容。这样虽然绕了一层但稳定性高得多因为 label 的 API 很少变。注意Pine Script 的 label 文本有长度限制太长的内容会被截断。如果要传递复杂数据建议用 JSON 格式并分段画多个 label。5. 常见问题与排查技巧实录5.1 CDP 连接失败排查表现象可能原因排查方法解决方案ECONNREFUSED 9222Chrome 没启动或端口不对curl localhost:9222/json/version检查 Chrome 启动参数连接成功但找不到 TradingView 标签页URL 匹配规则不对curl localhost:9222/json/list调整TV_URL_PATTERNWebSocket 连上后立即断开Chrome 版本与 CDP 库不兼容看 Chrome 版本和库的 changelog升级chrome-remote-interfaceRuntime.evaluate返回 undefined执行上下文不对检查是否在 iframe 里用contextId指定 frame读取到的数据是旧值页面没刷新手动刷新 TradingView加Page.reload或等待5.2 MCP Server 启动失败的典型原因Claude Code 里/mcp显示 server failed九成是下面几个原因Node 路径问题。.mcp.json里的command写的是node但 Claude Code 启动时的 PATH 可能不包含 nvm 管理的 Node。解决办法是写绝对路径比如/Users/xxx/.nvm/versions/node/v18.0.0/bin/node。用which node查一下实际路径。dist 目录不存在。忘了npm run build或者 build 失败但没注意。手动跑node dist/index.js看报什么错。环境变量没传进去。MCP Server 依赖CDP_PORT等环境变量但.mcp.json的env字段没配。检查配置文件的 JSON 格式是否正确有没有多余的逗号。stdio 通信被污染。MCP 协议通过 stdio 通信如果 Server 在启动时往 stdout 打了日志比如console.log会干扰协议握手。所有日志应该打到 stderr用console.error。5.3 TradingView 页面结构变化导致 tool 失效TradingView 平均每个月会有小版本更新每季度有大版本。小更新一般不影响tvWidgetAPI但大版本可能会改。我遇到过两次一次是getLines()改名成了getDrawings()导致所有读取绘图的操作失效。解决办法是在 MCP Server 里做兼容const getDrawings chart.getLines || chart.getDrawings; const lines getDrawings.call(chart);另一次是createLine的参数结构变了从{price, color}变成了{points: [{price}], options: {color}}。这种就得改代码适配没法自动兼容。我的建议是在 MCP Server 里维护一个version-adapter模块根据 TradingView 的版本号选择不同的 API 调用方式。版本号可以从window.tvWidget.version()或者页面 meta 标签里读。5.4 性能优化减少 CDP 往返每次 CDP 调用都有网络往返开销大概 10-50ms。如果一个操作需要读多个数据不要分多次调用而是一次性在页面里执行完再返回。比如要读取 symbol、周期、指标、绘图四类数据不要写四个 tool 分别调而是写一个get_full_statetool在页面里一次性收集完const state { symbol: chart.symbol(), resolution: chart.resolution(), studies: chart.getStudies().map(s ({id: s.id, name: s.name})), lines: chart.getLines().map(l ({price: l.getPrice()})) }; return JSON.stringify(state);这样一次 CDP 往返就能拿到所有数据比四次调用快得多。对于需要频繁读取的场景还可以在 MCP Server 里加缓存比如 symbol 和周期缓存 5 秒避免短时间内重复读取。实操心得CDP 的Runtime.evaluate有个awaitPromise参数如果注入的 JS 返回 Promise要设成 true 才能拿到 resolve 后的值。TradingView 有些 API 是异步的比如chart.exportData()不设这个参数会拿到一个 Promise 对象而不是数据。5.5 安全与稳定性注意事项不要在生产环境暴露 CDP 端口。9222 端口如果被外部访问攻击者可以完全控制你的浏览器包括读取 cookie、执行任意 JS。确保 Chrome 只监听 localhost防火墙规则也要检查。MCP Server 的 tool 权限要最小化。只暴露必要的 tool不要给 AI 删除所有绘图、修改账户设置这类危险操作的权限。如果确实需要加二次确认机制。定期更新依赖。chrome-remote-interface、modelcontextprotocol/sdk这些库更新频繁新版本可能修复了重要的 bug 或安全漏洞。用npm audit定期检查。日志脱敏。调试日志里可能包含 TradingView 的 cookie、token 等敏感信息分享日志前记得脱敏。6. 进阶玩法与扩展方向6.1 结合 Playwright MCP 做端到端测试Playwright MCP 是另一个 MCP Server提供浏览器自动化能力。你可以把tradingview-mcp和 Playwright MCP 配合使用Playwright 负责打开页面、点击按钮、填写表单tradingview-mcp负责读取图表数据。这样就能实现完整的端到端流程比如打开 TradingView切换到 BTCUSDT 的 4 小时图读取当前所有指标参数然后截图保存。配置上两个 MCP Server 可以同时挂在 Claude Code 下AI 会根据任务自动选择调用哪个。Playwright MCP 的配置类似{ mcpServers: { playwright: { command: npx, args: [playwright/mcplatest] }, tradingview: { command: node, args: [./dist/index.js] } } }6.2 把图表数据接入本地策略回测读取到图表上的绘图对象和指标数据后可以导出成 JSON喂给你本地的回测框架。比如你画了一堆支撑阻力线可以把这些价格导出然后在 Python 里写个回测脚本验证价格触及这些线时的反转概率。MCP Server 可以加一个export_drawingstool把绘图数据写成 JSON 文件const fs require(fs); const data await getDrawings(); fs.writeFileSync(/tmp/tv_drawings.json, JSON.stringify(data, null, 2));然后 Claude Code 可以调用这个 tool再用 Bash tool 跑 Python 脚本分析。整个链路都在 Claude Code 里完成不用切换工具。6.3 多图表实例管理如果你同时开了多个 TradingView 标签页MCP Server 需要能区分它们。可以在 tool 参数里加chartIndex或chartUrlServer 根据参数选择对应的标签页。实现上/json/list返回的标签页数组里每个都有id和url。Server 维护一个映射表把用户友好的名称比如 BTC 4H映射到标签页 id。用户配置里可以预设这个映射{ charts: { btc-4h: {urlPattern: BTCUSDT.*240}, eth-1d: {urlPattern: ETHUSDT.*1D} } }这样 AI 调用时传chart: btc-4hServer 就知道该操作哪个标签页。6.4 定时任务与告警联动MCP Server 本身是被动响应式的但你可以用 Claude Code 的定时任务功能让它每隔一段时间自动调用get_chart_state检查是否有价格突破关键位。如果满足条件再调用其他 tool 发送通知比如写文件、调 webhook。这个玩法的关键是设计好检查逻辑。不要每次全量读取而是只读关键数据比如最新价格和几条关键水平线减少 CDP 开销。检查频率也不要太高1 分钟一次足够了太频繁会拖慢 TradingView 页面。我自己的实践是用 Claude Code 的/loop命令每 5 分钟跑一次检查脚本。脚本里先调get_chart_state拿最新价格再和预设的阈值比较超过就调send_alerttool。send_alert可以是个简单的 HTTP 请求打到你的通知服务上。6.5 源码本地部署的注意事项如果你要改tradingview-mcp的源码有几个地方要特别注意TypeScript 类型定义。TradingView 的内部 API 没有官方类型定义项目里通常用any或者自定义 interface。改代码时不要依赖类型检查要靠运行时验证。构建产物不要提交到 git。dist/目录应该在.gitignore里每次 build 重新生成。如果团队协作确保每个人的 Node 版本一致用.nvmrc锁定。环境变量管理。敏感配置比如 CDP 端口、TradingView 账号不要硬编码在源码里用.env文件管理.env加到.gitignore。项目里用dotenv加载。版本兼容性测试。每次 TradingView 大版本更新后跑一遍所有 tool 的测试用例。可以写个简单的测试脚本逐个调用 tool 并检查返回结构是否符合预期。这个项目后续还可以这样扩展把 MCP Server 容器化用 Docker 跑这样环境隔离更彻底或者加一个 Web UI可视化展示当前图表状态和 tool 调用历史再或者接入更多数据源比如把 TradingView 的绘图和本地数据库的持仓记录关联起来做更复杂的分析。我自己目前在用的是容器化方案Chrome 和 MCP Server 都跑在 Docker 里通过 volume 挂载用户数据目录这样换机器时迁移很方便。