1. 线上 CPU 飙高时Arthas 的命令行为什么还是让人卡壳Arthas 在 JVM 排障圈子里几乎是标配工具。不重启、不改代码attach 上去就能看线程、追方法、查类加载dashboard、thread、trace、watch这几板斧救过不少深夜告警。但用久了你会发现一个尴尬的现实真正拖慢排障速度的往往不是 Arthas 本身而是“下一步该敲什么”。线上订单服务 CPU 冲到 98%你dashboard看到某个http-nio线程占了大头接着要thread id看堆栈再顺着堆栈找到业务类然后trace或watch去验证。每一步命令都不难难的是在告警压力下快速做出正确决策还要记住参数怎么写、OGNL 怎么拼、采样次数怎么限。对已经熟练的团队来说这是肌肉记忆对偶尔上手的人来说就是一道道坎。Arthas 接入 MCP 之后这条链路有了新的走法。MCPModel Context Protocol把 Arthas 的诊断能力封装成标准化的 JSON-RPC 2.0 工具接口AI 客户端可以通过统一的协议去调用dashboard、thread、trace这些命令并自动解析返回结果。你不再需要逐条敲命令而是用自然语言描述问题由 AI 按排障剧本一步步调用工具、收敛证据、给出结论。这篇文章面向已经在用 Arthas 的 JVM 团队重点不是介绍 Arthas 是什么而是把 MCP 通道接进现有诊断流程MCP 服务端怎么配、JSON-RPC 怎么调、一次线上问题定位怎么验证、调用凭证怎么用统一 Key/API 通道管理。全程给可复制的配置和命令照着做就能跑通。2. 接入前先把 TaoToken 的 Key 和通道准备好Arthas MCP Server 本身是本地或内网部署的诊断服务它负责把 Arthas 命令暴露成 JSON-RPC 工具。但如果你想让 AI 客户端稳定地调用这些工具、并且统一管理调用凭证就需要一个能集中管理 Key 和 API 通道的地方。TaoToken 在这里扮演的就是凭证与通道管理的角色官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。先注册并登录控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 。在控制台里创建 API Key地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。创建时建议按用途命名比如arthas-mcp-prod、arthas-mcp-test这样后面排查调用来源时不会混。拿到 Key 之后先别急着往 Arthas 里塞。你要明确一件事Arthas MCP Server 的 Bearer Token 认证和 TaoToken 的 API Key 是两个层面的东西。前者保护的是 Arthas MCP 服务端本身的访问后者保护的是你通过统一通道调用模型或工具时的凭证。两者可以配合使用但不要混为一谈。建议的做法是Arthas MCP Server 用独立的 Bearer TokenTaoToken 的 Key 用于 AI 客户端侧的模型调用和工具编排这样职责清晰出问题也好定位。如果你还没决定用哪个模型来驱动这套排障流程可以先到模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 试一下确认模型能正常响应工具调用类的指令。对于长期做编码和 Agent 编排的团队Coding Plan 页面 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 里有更细的套餐说明适合把 Arthas MCP 接进日常研发流程的场景。3. Arthas MCP Server 配置骨架与 JSON-RPC 调用示例Arthas MCP Server 是 Arthas 的一个实验性模块通过 HTTP/Netty 提供 JSON-RPC 2.0 接口。它支持两种协议模式STREAMABLE 模式基于 SSE 推送流式响应适合实时监控STATELESS 模式是传统请求-响应适合简单集成。下面给一份可直接改的配置骨架。先准备 Arthas MCP Server 的启动参数。假设你已经下载了 arthas-mcp-server 的 jar 包启动命令大致如下java -jar arthas-mcp-server.jar \ --server.port8765 \ --arthas.target127.0.0.1:3658 \ --mcp.modeSTATELESS \ --auth.tokenyour-arthas-mcp-token参数说明用表格对照更清楚参数作用建议值server.portMCP Server 监听端口8765避免和业务端口冲突arthas.target目标 JVM 的 Arthas 端口默认 3658按实际 attach 端口改mcp.mode协议模式STATELESS 适合初次接入STREAMABLE 适合实时监控auth.tokenBearer Token独立生成不要和 TaoToken Key 混用启动后MCP Server 会暴露一个 JSON-RPC 端点通常是http://127.0.0.1:8765/mcp。你可以先用 curl 验证服务是否活着curl -X POST http://127.0.0.1:8765/mcp \ -H Content-Type: application/json \ -H Authorization: Bearer your-arthas-mcp-token \ -d { jsonrpc: 2.0, id: 1, method: tools/list, params: {} }如果返回里能看到dashboard、thread、trace、watch这些工具名说明 MCP Server 已经正常把 Arthas 命令暴露出来了。目前集成的核心诊断工具覆盖三大类JVM 相关 12 个dashboard、heapdump、jvm、memory、thread、sysprop、sysenv、vmoption、perfcounter、vmtool、getstatic、ognl类加载相关 8 个sc、sm、jad、classloader、mc、redefine、retransform、dump监控诊断 6 个monitor、stack、trace、watch、tt、profiler。接下来是调用单个工具的 JSON-RPC 示例。比如调用dashboard看整体线程情况curl -X POST http://127.0.0.1:8765/mcp \ -H Content-Type: application/json \ -H Authorization: Bearer your-arthas-mcp-token \ -d { jsonrpc: 2.0, id: 2, method: tools/call, params: { name: dashboard, arguments: {} } }再比如调用thread看指定线程的堆栈参数里传线程 IDcurl -X POST http://127.0.0.1:8765/mcp \ -H Content-Type: application/json \ -H Authorization: Bearer your-arthas-mcp-token \ -d { jsonrpc: 2.0, id: 3, method: tools/call, params: { name: thread, arguments: { id: 29 } } }这两个调用跑通说明 MCP 通道和 Arthas 之间的链路已经打通。注意arguments里的字段名要和工具定义一致thread的线程 ID 参数在不同版本里可能是id或threadId以tools/list返回的 schema 为准。4. 一次线上 CPU 飙高的验证请求与成功结果配置跑通之后用一次真实的排障动作来验证整条链路。假设订单服务在晚高峰 CPU 冲到 98%你通过 AI 客户端发起排查。AI 客户端侧需要配置 MCP Server 地址和 Bearer Token同时用 TaoToken 的 Key 来驱动模型调用。模型对话入口在 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有客户端配置的详细说明。AI 收到“订单服务 CPU 飙到 98%帮我排查哪个线程导致的高 CPU”之后会按排障剧本自动执行。第一步调用dashboard返回数据里能看到类似这样的线程信息ID NAME CPU% STATE 29 http-nio-8080-exec-8 89.2 RUNNABLE 12 DubboServerHandler-... 3.1 RUNNABLEAI 解析出线程 ID 29、CPU 89.2%、状态 RUNNABLE接着自动调用thread并传入id: 29。返回的堆栈里能看到关键调用链http-nio-8080-exec-8 #29 prio5 os_prio0 tid0x00007f8e2c001800 nid0x4f runnable java.lang.Thread.State: RUNNABLE at java.util.regex.Pattern$GroupHead.match(Pattern.java:4660) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4719) 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 会给出分析结论线程卡在java.util.regex.Pattern的正则匹配里调用链指向LogAspect.java:47的日志切面。根因是脱敏正则在处理超过 10KB 的 JSON 请求体时发生灾难性回溯导致 CPU 占满。修复建议也很具体临时关闭该日志切面根本修复是把.*改成[^]*避免回溯或者改用indexOf替代正则同时给日志切面加长度限制超过 2000 字符不做脱敏。验证成功的标志有三个tools/list能列出工具、tools/call能返回结构化结果、AI 能基于返回结果给出可执行的修复建议。如果这三步都走通说明 Arthas MCP 已经可以接进你的线上诊断流程。对于需要长期跑 Agent 编排的团队Coding Plan 页面 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 里有更完整的接入方案。5. 本篇常见错排查连接、认证、参数与结果解析接入过程中最容易卡在几个地方这里按出现频率排一下。第一个是 MCP Server 连不上 Arthas。表现是tools/list能返回工具列表但调用dashboard时报连接超时或 attach 失败。原因通常是arthas.target配错了或者目标 JVM 没有以可 attach 的方式启动。先确认目标进程的 Arthas 端口是否在监听再检查arthas.target的 IP 和端口是否和实际一致。如果是容器环境注意端口映射和网络命名空间。第二个是认证失败。表现是返回 401 或Unauthorized。检查Authorization头里的 Bearer Token 是否和启动参数auth.token一致注意不要多空格、不要漏Bearer前缀。如果你同时用了 TaoToken 的 Key确认两个 Token 没有混用。TaoToken 的 Key 在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 管理Arthas MCP 的 Token 在启动参数里配两者分开。第三个是参数名不匹配。表现是调用thread时返回参数校验错误。不同版本的 Arthas MCP Server 对工具参数的命名可能有差异比如线程 ID 可能是id、threadId或thread_id。最稳妥的做法是先调tools/list看返回的 schema 里inputSchema定义的字段名按 schema 传参。第四个是结果解析问题。STREAMABLE 模式下返回的是 SSE 流如果你用普通 HTTP 客户端直接解析可能会拿到不完整的数据。初次接入建议先用 STATELESS 模式等链路稳定后再切 STREAMABLE。另外dashboard返回的线程列表可能很长AI 客户端侧要设置合理的超时和截断策略避免一次拉取过多数据导致响应变慢。第五个是权限和范围问题。Arthas MCP 暴露的是诊断能力redefine、retransform这类工具能修改字节码生产环境要严格控制谁能调用。建议在 MCP Server 前面加一层网关或访问控制只对可信的 AI 客户端开放并且按环境区分 Token。测试环境和生产环境用不同的auth.token避免误操作。6. 把 MCP 通道接进现有诊断流程的下一步Arthas 接入 MCP 之后排障的入口从命令行变成了自然语言但底层的诊断能力没有变。你依然需要理解线程、堆栈、正则回溯这些概念只是 AI 帮你把“敲哪条命令、传什么参数、怎么解读结果”这部分自动化了。对已经熟练使用 Arthas 的团队来说这不是替代而是把重复的决策路径固化下来让排障更快收敛。下一步可以做的是把 MCP 通道接进现有的告警和值班流程。比如告警触发后自动拉起 AI 客户端带上服务名和告警指标让 AI 先跑一轮dashboard和thread把初步结论推到值班群。也可以把常用的排障剧本沉淀成模板针对 CPU 飙高、接口变慢、内存泄漏、死锁这几类场景分别定义工具调用顺序。调用凭证统一走 TaoToken 的 Key 和 API 通道接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 模型对话在 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 长期编码和 Agent 编排看 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。先把tools/list和一次thread调用跑通再逐步把更多诊断场景交给 MCP 通道这样每一步都有验证不会一次性铺太大。
