1. 线上 CPU 飙高时,Arthas MCP 到底解决了什么问题
线上问题定位最怕的不是没有工具,而是工具太多、命令太碎、时间太紧。CPU 突然打到 98%,接口 RT 从 80ms 涨到 3s,用户投诉电话一个接一个,你登录机器打开 Arthas,面对 dashboard、thread、trace、watch、ognl 一大堆命令,脑子里第一反应往往是:先敲哪个?参数怎么写?会不会刷屏把终端打爆?
Arthas 本身是 Java 线上排障的“瑞士军刀”,它能在不重启应用的前提下查看线程栈、追踪方法耗时、监控入参返回值、反编译类、甚至动态重定义类。但它的门槛也很真实:你得知道 trace 后面跟全限定类名和方法名,得知道 watch 的 condition 怎么写 OGNL,得知道 thread -n 3 只看最忙的三个线程。真正耗时的不是敲命令,而是每一步“该看什么”的决策。
Arthas 接入 MCP 之后,这件事的性质变了。MCP 是 Model Context Protocol,你可以把它理解成 AI 工具和外部能力之间的“USB-C 接口”:Arthas 把 26 个核心诊断命令封装成标准工具,AI 客户端通过一个统一的 endpoint 就能调用。你只需要用自然语言描述现象,比如“订单服务 CPU 飙到 98%,帮我看看哪个线程卡住了”,AI 就会按内置的排障路径依次调用 dashboard、thread、trace,把结果解析后告诉你根因。
但这里有个现实问题:AI 客户端要稳定调用 Arthas MCP Server,网络链路和鉴权必须可靠。很多人在本地配好 MCP 后,遇到 401、local proxy failed、SSE 断流,排查半天发现是 endpoint 或 token 的问题。这篇就聚焦一件事:把 AI 工具的 MCP 端点改到 TaoToken 的稳定接入层,给出可复制的配置片段,并演示一次真实报错的完整排查闭环。适合正在用 Cursor、Claude Code、Cline 做 Java 排障的开发者,也适合刚接触 MCP 想跑通第一个诊断工具的新人。
2. 前置准备:TaoToken 接入层与 Arthas MCP Server 的关系
在动手改配置之前,先把链路讲清楚,不然后面报错你都不知道是哪一段出的问题。
Arthas MCP Server 是 Arthas 官方提供的实验性模块,通过 HTTP/Netty 暴露 JSON-RPC 2.0 接口,支持 STREAMABLE(SSE 流式)和 STATELESS(请求-响应)两种模式。它默认监听本地端口,带一个 Bearer Token 做鉴权。AI 客户端(MCP Host)通过 MCP Client 去连这个 Server,把工具调用转成 JSON-RPC 请求。
问题在于:AI 客户端和 Arthas MCP Server 之间的连接,如果直接点对点,会遇到几个麻烦。一是 token 管理分散,每个客户端配一遍;二是网络链路不稳定时,SSE 流容易断,报 local proxy failed;三是团队协作时,每个人的 endpoint 和 key 不一致,排障经验没法复用。
TaoToken 在这里扮演的是统一接入层的角色。你把 AI 工具的 MCP 端点指向 TaoToken 的 API 地址,由它来承接鉴权和转发,Arthas MCP Server 的 Bearer Token 和 endpoint 只需要在 TaoToken 侧配置一次。这样做的直接好处是:客户端配置统一、token 不散落、链路可观测。
需要提前准备的东西:
第一,一个可用的 TaoToken API Key。到 API Keys 页面创建,复制出来,后面配置里要用。地址是 https://taotoken.net/api-keys ,注意这个页面不要加 UTM 参数,直接访问即可。
第二,确认你的 Arthas MCP Server 已经启动。Arthas 3.7.x 之后自带 MCP 模块,启动方式是在 attach 目标进程后执行 mcp-server 相关命令,或者用独立 jar 启动。启动后记下它监听的端口和 Bearer Token。
第三,选一个支持 MCP 的 AI 客户端。Cursor、Claude Code、Cline 都可以。本文以 Claude Code 和 Cline 的配置为例,因为这两个在 Java 排障场景里用得最多。
第四,确认你的模型 ID。TaoToken 支持多种模型,排障场景建议用推理能力强的,比如 claude-sonnet 系列或 gpt 系列。模型 ID 在模型对话页面可以查到,地址 https://taotoken.net/models 。
这里要强调一个配置三件套的概念:Base URL、API Key、Model ID。无论你用 Claude Code、Cline 还是 Codex,这三个值必须同时正确,缺一个就会报鉴权或模型不存在的错。后面第五节会专门拿真实报错来对照。
关于 TaoToken 的定位,需要说清楚:它是 AI 能力的统一接入层,不是非法的中间转发。你用它来管理 API Key、切换模型、统一 MCP endpoint,所有调用都走标准协议。官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 上有完整的接入文档,配置前建议扫一眼。
3. 可复制配置:把 MCP endpoint 改到 TaoToken
这一节是全文最核心的部分,所有片段都可以直接复制,路径和原文保持一致。我按客户端分开写,你对号入座。
3.1 Claude Code 的 settings 配置
Claude Code 的 MCP 配置放在项目根目录的.mcp.json或者用户级的~/.claude/settings.json里。推荐用项目级,方便团队共享。在.mcp.json中写入:
{ "mcpServers": { "arthas-diagnose": { "type": "http", "url": "https://taotoken.net/api/mcp/arthas", "headers": { "Authorization": "Bearer sk-your-taotoken-api-key", "Content-Type": "application/json" } } } }注意三个点:type写http,因为 TaoToken 接入层走的是 HTTP 传输;url指向 TaoToken 的 MCP 接入路径;Authorization里的 key 换成你在 API Keys 页面创建的那串。不要把 Arthas 本地的 Bearer Token 写在这里,那个 token 在 TaoToken 侧配置。
如果你用的是 Claude Code 的 CLI 模式,也可以用命令添加:
claude mcp add arthas-diagnose \ --transport http \ --url https://taotoken.net/api/mcp/arthas \ --header "Authorization: Bearer sk-your-taotoken-api-key"添加完用claude mcp list确认状态是 connected。
3.2 Cline 的 MCP settings 配置
Cline 的 MCP 配置在 VS Code 的设置里,路径是cline.mcpServers。打开 settings.json,加入:
{ "cline.mcpServers": { "arthas-diagnose": { "url": "https://taotoken.net/api/mcp/arthas", "transport": "http", "headers": { "Authorization": "Bearer sk-your-taotoken-api-key" }, "autoApprove": ["dashboard", "thread", "jvm", "memory"] } } }autoApprove这个字段值得说一下。Arthas 的诊断命令里,dashboard、thread、jvm、memory 这几个是只读的,不会改应用状态,可以设成自动批准,省去每次点确认。但 trace、watch、redefine 这类会插入字节码或改类的命令,建议保留手动确认,避免误操作。
3.3 Codex 的 auth.json 配置
如果你用 Codex CLI,配置在~/.codex/auth.json:
{ "base_url": "https://taotoken.net/api", "api_key": "sk-your-taotoken-api-key", "model": "claude-sonnet-4-20250514", "mcp_servers": { "arthas-diagnose": { "url": "https://taotoken.net/api/mcp/arthas", "transport": "http" } } }这里base_url指向 TaoToken 的 API 根地址,api_key是同一个 key,model填你在模型对话页面确认过的模型 ID。三件套齐了,Codex 才能既调模型又调 MCP。
3.4 Arthas MCP Server 侧的 Bearer Token 配置
TaoToken 接入层需要知道你的 Arthas MCP Server 在哪、token 是什么。这部分在 TaoToken 控制台的 MCP 配置里填,不在客户端。你需要提供:
[arthas_mcp] endpoint = "http://127.0.0.1:8563/mcp" bearer_token = "your-arthas-local-token" mode = "streamable" timeout_ms = 30000endpoint是你 Arthas MCP Server 实际监听的地址,bearer_token是 Arthas 启动时生成的 token,mode选 streamable 适合实时监控,选 stateless 适合简单集成。timeout_ms建议给到 30000,因为 heapdump 这类命令耗时较长。
配置保存后,TaoToken 侧会做一次连通性检查。如果这里填错,客户端调用时会报 502 或 local proxy failed,第五节会详细讲怎么排查。
4. 验证请求:从一次 CPU 飙高诊断跑通闭环
配置写完不算完,得跑一次真实请求,确认链路通了、工具能调、结果能解析。这一节用一个模拟的 CPU 飙高场景,带你走完从提问到拿到根因的全过程。
4.1 启动 Arthas MCP Server 并 attach 目标进程
假设你的订单服务进程 PID 是 12345。先 attach:
java -jar arthas-boot.jar 12345attach 成功后,在 Arthas 交互界面启动 MCP Server:
mcp-server --port 8563 --mode streamable看到MCP server started on port 8563就说明起来了。记下这个端口,和第三节 TaoToken 侧配置的 endpoint 要一致。
4.2 在 AI 客户端发起诊断请求
打开 Claude Code 或 Cline,输入:
订单服务 CPU 飙到 98%,帮我排查哪个线程导致的高 CPU,它卡在哪里了AI 会先调用dashboard工具。你可以在客户端的工具调用日志里看到类似这样的请求:
{ "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "dashboard", "arguments": {} }, "id": 1 }Arthas 返回的 dashboard 数据里,AI 会解析出 CPU 占用最高的线程。假设返回:
ID NAME CPU% STATE 29 http-nio-8080-exec-8 89.2 RUNNABLE 12 DubboServerHandler-... 3.1 RUNNABLEAI 识别到线程 29 占用 89.2%,接着调用thread工具:
{ "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "thread", "arguments": { "id": 29 } }, "id": 2 }返回的堆栈里,AI 会定位到具体方法。假设堆栈显示:
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4660) at java.util.regex.Pattern$Curly.match(Pattern.java:4238) at com.example.logging.LogAspect.logAround(LogAspect.java:47) at com.example.order.service.OrderService.getOrder(OrderService.java:123)AI 的分析结论会是:线程卡在正则匹配,调用链指向 LogAspect 第 47 行的日志切面,该切面在处理超长 JSON 请求体时触发了灾难性回溯。
4.3 用 trace 命令进一步收敛
如果你想确认耗时具体在哪个方法,可以让 AI 继续调用trace:
帮我 trace 一下 com.example.order.service.OrderService getOrder,看哪个子调用最慢AI 会调用:
{ "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "trace", "arguments": { "classPattern": "com.example.order.service.OrderService", "methodPattern": "getOrder", "condition": "#cost > 100" } }, "id": 3 }返回的耗时树里,LogAspect.logAround占了 2800ms,其他子调用都在 50ms 以内。根因确认。
4.4 验证成功的标志
一次完整的成功验证,你会看到三个信号:客户端工具调用日志里有tools/call的请求和响应;AI 输出的分析里引用了 Arthas 返回的具体线程 ID 和类名行号;你能根据 AI 的建议直接去改代码,比如把.*改成[^"]*或者加长度限制。
如果这三个信号都出现了,说明从客户端到 TaoToken 到 Arthas MCP Server 的链路完全通了。接下来就是排错环节,把常见的坑提前填掉。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
这一节拿真实报错来对照,每个报错给出原因和修复动作。你遇到问题时直接按图索骥。
5.1 401 Unauthorized
报错原文:
Error: MCP server returned 401 Unauthorized {"error":"invalid_token","error_description":"Bearer token is missing or invalid"}原因有三种可能:客户端的Authorizationheader 没写或写错;TaoToken 侧的 Arthas Bearer Token 和 Arthas MCP Server 实际 token 不一致;key 过期或被删。
排查动作:先确认客户端配置里的Bearer sk-...是完整的,没有多余空格。然后到 API Keys 页面确认这个 key 状态是 active。最后检查 TaoToken 控制台里填的 Arthas token,和 Arthas 启动日志里打印的 token 是否一致。三处都对,401 就会消失。
5.2 local proxy failed
报错原文:
Error: local proxy failed: dial tcp 127.0.0.1:8563: connect: connection refused这个报错的意思是 TaoToken 接入层尝试连你配置的 Arthas endpoint,但连不上。原因通常是 Arthas MCP Server 没启动,或者端口写错,或者 endpoint 写成了localhost而 TaoToken 侧解析不到。
排查动作:在服务器上执行netstat -tlnp | grep 8563,确认端口在监听。如果没监听,回到 Arthas 里重新执行mcp-server --port 8563。如果监听了但还报错,把 endpoint 从localhost改成127.0.0.1,避免 DNS 解析问题。
5.3 reading choices 报错
报错原文:
Error: failed to parse response: reading 'choices' field: unexpected end of JSON input这个报错通常出现在模型调用环节,不是 MCP 环节。原因是模型返回的响应体不完整,或者 Model ID 填错了导致返回了非预期格式。
排查动作:到模型对话页面确认你填的 Model ID 是存在的。然后在客户端配置里检查model字段,确保没有拼写错误。如果用的是 Claude Code,检查~/.claude/settings.json里的 model 和 MCP 配置是否冲突。修复后重启客户端。
5.4 OAuth 相关报错
报错原文:
Error: OAuth flow failed: invalid_client有些 MCP 客户端默认走 OAuth 流程,但 TaoToken 接入层用的是 Bearer Token,不走 OAuth。这个报错说明客户端在尝试 OAuth 授权。
排查动作:在客户端配置里显式指定auth_type: "bearer"或者transport: "http",禁用 OAuth。Claude Code 里可以用--transport http参数强制走 HTTP。Cline 里确认transport字段是http而不是sse或oauth。
5.5 配置三件套自检清单
遇到任何报错,先按这个清单过一遍:
| 检查项 | 正确值 | 常见错误 |
|---|---|---|
| Base URL | https://taotoken.net/api | 多了斜杠或少了 /api |
| API Key | sk- 开头完整串 | 复制时漏字符或有空格 |
| Model ID | 模型对话页面确认过的 | 拼写错误或用了不存在的模型 |
| MCP endpoint | https://taotoken.net/api/mcp/arthas | 写成了本地地址 |
| Arthas token | 与启动日志一致 | 用了旧 token |
这五项全对,基本不会再有鉴权和链路问题。如果还有,到接入文档页面查最新的配置示例。
6. 把 Arthas MCP 用进日常排障:从配置到复现的闭环
配置跑通只是起点,真正有价值的是把它变成日常排障的固定动作。我自己的习惯是:线上告警一响,先不急着登录机器,而是在 AI 客户端里把现象描述清楚,让 AI 通过 Arthas MCP 先拉一轮 dashboard 和 thread,拿到初步证据再决定要不要深入。
这样做的好处是,排障路径被标准化了。以前新人遇到 CPU 飙高,可能连 dashboard 都不知道要敲,现在 AI 会按内置剧本一步步走:先看整体线程,再定位高 CPU 线程,再看堆栈,再 trace 收敛。每一步的返回结果都留在对话记录里,事后复盘有据可查。
有几个实用技巧值得记下来。第一,把常用的诊断请求存成 prompt 模板,比如“CPU 飙高排查”“接口变慢排查”“内存泄漏排查”,需要时直接调用,不用每次重新描述。第二,autoApprove只对只读命令开,trace、watch、redefine 保持手动确认,避免 AI 在你不注意时改了线上类。第三,heapdump 这类重命令记得设 timeout,30 秒起步,不然容易断流。
如果你还没配好,现在就可以动手:到 API Keys 页面创建一个 key,按第三节的片段改客户端配置,然后 attach 一个测试进程,跑一次 dashboard 调用。第一次看到 AI 自动解析出线程 ID 和堆栈行号的时候,你会明白为什么这件事值得折腾。
长期做 Java 线上排障和 Agent 开发的,建议直接上 Coding Plan,把模型调用和 MCP 接入的额度一起管起来,省得每次单独配。地址是 https://taotoken.net/coding-plan 。需要查模型和调试对话的,走模型对话页面 https://taotoken.net/models 。配置过程中卡住了,接入文档 https://taotoken.net/doc 里有最新的示例和排错说明。