1. 从 Kibana 手动排查到 Agentic 调查:Kubernetes 可观测性为什么需要 MCP
Kubernetes 集群出问题时,大多数人的第一反应是打开 Kibana,切到 Discover,敲一段 KQL,翻日志、看指标、对时间线。这套流程本身没问题,问题在于它把「找证据」和「下判断」两件事都压在了人身上。一个 CrashLoopBackOff 的 Pod,背后可能是 OOMKilled、可能是准入 Webhook 阻塞、可能是镜像拉取失败,也可能是节点磁盘压力触发的驱逐。你要在四五个数据源之间来回跳,才能拼出一个大概的结论。
Agentic 可观测性想解决的就是这个断层。它不是说把 Dashboard 做得更花哨,而是让一个 AI Agent 主动去查数据、主动去关联证据、主动给出带置信度的根因假设。你收到的不是一条告警链接,而是一份「已经调查完」的报告。这个转变的关键,在于 Agent 得有一个标准化的方式去访问 Elasticsearch、Kibana、ML 异常检测这些后端能力——这就是 MCP(Model Context Protocol)的位置。
MCP 是 Anthropic 提出的模型上下文协议,它把「AI 模型调用外部工具」这件事标准化了。在 Elastic 的 Kubernetes 可观测性场景里,MCP Server 暴露一组工具(集群健康、服务依赖图谱、异常详情、爆炸半径分析、告警管理),AI 客户端通过 MCP 调用这些工具,拿到结构化数据后注入对话上下文,再渲染成可交互的视图。Agent 不需要为每个数据源写适配代码,工具返回的也不只是文本,还可以是内联的 React 组件。
这套架构落地时,有一个容易被忽略的工程细节:MCP Server 访问 Elasticsearch 的 endpoint 配置。默认情况下它指向你自建的 ES 集群,但在做接入实验、多环境切换、或者想把模型调用和可观测性数据访问统一走一个通道时,把 endpoint 改到一个统一的 API 网关会更可控。我下面会围绕这个改动展开,给出可复制的配置片段和连通性验证动作,让你能在 K8s 观测链路里完成一次可回滚的接入实验。
适合谁看:已经在跑 Elastic Stack + Kubernetes 集成、想试 Agentic 调查工作流的 SRE;正在搭 MCP Server、需要把 ES endpoint 配置讲清楚的平台工程师;以及想理解 MCP 在可观测性里到底怎么落地、而不是停留在概念层面的技术负责人。
2. TaoToken 前置准备:MCP Server 访问 Elasticsearch 的 endpoint 与 Key 配置
在动手改 endpoint 之前,先把「谁访问谁」理清楚。Elastic Observability MCP App 是一个 Node.js 进程,它内部会调用 Elasticsearch 的查询接口、Kibana 的 Alerting API、以及 ML 的异常结果索引。这些调用都需要一个 Base URL 和一个认证凭据。默认配置里,Base URL 指向你的 Kibana/ES 地址,凭据用 API Key 或用户名密码。
当你想把这层访问统一到一个 API 通道时,TaoToken 提供的就是这个入口。它的 API 地址是https://taotoken.net/api,官网是https://taotoken.net/?utm_source=taotoken_aicg_blog_end。你需要先在控制台创建一个 API Key,然后把它填到 MCP Server 的配置里。这里要强调一点:TaoToken 在这里扮演的是「统一 Key/API 通道」的角色,不是让你把生产库直连出去,也不是替代 Elasticsearch 本身。你的数据仍然在 ES 里,MCP Server 只是换了一个访问入口。
具体要准备三样东西:
第一,Base URL。MCP Server 配置里的ELASTICSEARCH_URL或等价的字段,改成https://taotoken.net/api。注意不要带 UTM 参数,API 地址就是干净的https://taotoken.net/api。
第二,API Key。在 TaoToken 控制台的 API Keys 页面创建,格式通常是一串以sk-开头的字符串。这个 Key 要填到 MCP Server 的认证配置里,字段名可能是ELASTICSEARCH_API_KEY或TAOTOKEN_API_KEY,取决于你的 MCP Server 实现。
第三,Model ID。如果你同时用 TaoToken 做模型调用(比如让 Claude 或 GPT 系列模型来驱动 Agent 的推理),还需要指定模型 ID。这一步和 ES endpoint 是两回事,但配置上经常放在同一个文件里,所以一起说清楚。
我试过在本地用 Docker 跑 MCP Server,配置改完后重启容器,然后在 Claude Desktop 里发一句「what's broken?」,看它能不能正常返回集群健康视图。如果返回的是 401 或者连接超时,基本就是 Key 或 Base URL 的问题。下面一节给出完整的可复制配置。
3. 可复制配置:MCP Server 的 JSON/TOML/settings 片段与 endpoint 改写
这一节是全文最核心的部分,所有片段都可以直接复制。我按三种常见的 MCP Server 配置方式来写:Claude Desktop 的claude_desktop_config.json、Cline 的 MCP settings、以及 Codex 的auth.json。你按自己用的客户端选一个就行。
先说 Claude Desktop。它的配置文件在 macOS 上是~/Library/Application Support/Claude/claude_desktop_config.json,Windows 上是%APPDATA%\Claude\claude_desktop_config.json。内容长这样:
{ "mcpServers": { "elastic-observability": { "command": "node", "args": ["/path/to/elastic-mcp-app/dist/index.js"], "env": { "ELASTICSEARCH_URL": "https://taotoken.net/api", "ELASTICSEARCH_API_KEY": "sk-your-taotoken-key", "KIBANA_URL": "https://taotoken.net/api", "MODEL_ID": "claude-sonnet-4-20250514", "ML_ANOMALY_INDEX": ".ml-anomalies-*" } } } }这里ELASTICSEARCH_URL和KIBANA_URL都指向https://taotoken.net/api,ELASTICSEARCH_API_KEY填你在 TaoToken 控制台创建的 Key,MODEL_ID填你要用的模型 ID。ML_ANOMALY_INDEX保持默认,除非你改过 ML 作业的输出索引。
如果你用的是 Cline(VS Code 插件),它的 MCP 配置在settings.json里,结构略有不同:
{ "cline.mcpServers": { "elastic-observability": { "command": "node", "args": ["/path/to/elastic-mcp-app/dist/index.js"], "env": { "ELASTICSEARCH_URL": "https://taotoken.net/api", "ELASTICSEARCH_API_KEY": "sk-your-taotoken-key", "KIBANA_URL": "https://taotoken.net/api", "MODEL_ID": "claude-sonnet-4-20250514" }, "disabled": false, "autoApprove": ["cluster_health", "observe"] } } }autoApprove里列的是不需要每次确认就能调用的工具,建议只放只读类的,比如cluster_health和observe。写操作类的工具(比如创建告警规则)不要放进去。
Codex 的auth.json通常在~/.codex/auth.json,它的字段名和上面不太一样:
{ "base_url": "https://taotoken.net/api", "api_key": "sk-your-taotoken-key", "model": "claude-sonnet-4-20250514", "mcp_servers": { "elastic-observability": { "command": "node", "args": ["/path/to/elastic-mcp-app/dist/index.js"], "env": { "ELASTICSEARCH_URL": "https://taotoken.net/api", "ELASTICSEARCH_API_KEY": "sk-your-taotoken-key" } } } }三件套在这里都齐了:Base URL 是https://taotoken.net/api,Key 是sk-your-taotoken-key,Model ID 是claude-sonnet-4-20250514。你换成自己实际的值就行。
改完配置后,重启对应的客户端。Claude Desktop 需要完全退出再打开,Cline 需要 reload window,Codex 重新跑一次命令即可。这一步别偷懒,很多「配置没生效」的问题都是因为客户端没重启。
注意:如果你之前用的是自建 ES 的地址,建议先把原配置备份一份,改完后如果验证不通过,直接回滚备份文件就能恢复。这就是「可回滚」的意思——改动只在一个配置文件里,不涉及数据迁移。
4. 验证请求与成功结果:从 MCP 工具调用到集群健康视图
配置改完后,怎么确认它真的通了?不要一上来就问复杂问题,先用最简单的工具调用验证链路。
第一步,在 Claude Desktop 或 Cline 里发一句:
what's broken?这句话会触发cluster_health工具。如果链路正常,你会看到一个集群健康总览视图,包含整体健康徽章(绿/黄/红)、降级服务列表、Top Pod 内存消耗者、异常严重度分布。如果返回的是「缺少数据」提示,说明工具调通了,但后端数据源没接上——这其实是优雅降级,不是报错。
第二步,验证服务依赖图谱:
show me the topology of frontend这会调用service_dependency_graph工具,参数是service_name="frontend"。成功的话,你会看到一个可缩放、可悬停的依赖图谱,节点是服务,边是调用关系,边上标注协议类型和调用量。数据来源是 APM 的service_destination聚合。
第三步,验证 ML 异常检测:
what's anomalous in checkout?这会调用anomaly_details工具,查询.ml-anomalies-*索引。如果 ML 作业在跑,你会看到异常分数、实际值 vs 典型值对比条、偏差百分比。如果 ML 作业没启用,工具会明确告诉你「缺少 ML 信号」,而不是报错。
第四步,验证告警管理:
alert me if frontend memory goes above 75MB这会先调用observe拿基线数据,再调用alert_management创建 Kibana 告警规则。成功后你会看到一张规则卡片,展示规则名、条件、时间窗口、检查间隔、KQL 过滤条件。这个规则是持久化的,对话结束后继续运行。
四个步骤走完,基本可以确认 MCP Server 到 Elasticsearch 的链路是通的。如果某一步失败,看下一节的排查对照。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
这一节按真实报错来写,你遇到哪个就对照哪个。
401 Unauthorized。这是最常见的。原因通常是 API Key 填错、Key 过期、或者 Base URL 和 Key 不匹配。排查顺序:先确认ELASTICSEARCH_API_KEY的值是不是完整的sk-开头字符串,有没有多余空格;再确认ELASTICSEARCH_URL是不是https://taotoken.net/api,有没有多写路径;最后去 TaoToken 控制台看这个 Key 是否还在有效期内。如果 Key 是在别的环境创建的,确认它有没有绑定正确的权限范围。
local proxy failed。这个报错通常出现在 MCP Server 启动阶段,意思是它尝试连接 Base URL 时失败了。可能原因:网络不通、Base URL 写错、或者本地有防火墙拦截。排查方法:先在终端里用curl -I https://taotoken.net/api看能不能通,如果 curl 都不通,那就是网络层的问题,跟 MCP 配置无关。如果 curl 通但 MCP Server 报这个错,检查 MCP Server 的启动日志,看它实际请求的 URL 是什么。
reading choices 相关报错。这个通常出现在模型返回阶段,报错信息里带reading 'choices'或Cannot read properties of undefined (reading 'choices')。意思是 MCP 客户端期望模型返回一个标准的 chat completion 结构(带choices数组),但实际返回的不是这个结构。原因可能是 Model ID 填错了,或者 Base URL 指向的端点不支持该模型。排查:确认MODEL_ID是你实际有权限调用的模型,确认 Base URL 是https://taotoken.net/api而不是别的路径。
OAuth 相关报错。如果你用的是需要 OAuth 的客户端(比如某些版本的 Claude Desktop),可能会看到 OAuth token 获取失败的提示。这种情况通常是因为客户端的 OAuth 流程和 MCP Server 的认证方式冲突了。解决办法:在 MCP Server 配置里显式指定 API Key 认证,不要依赖客户端的 OAuth 流程。上面给的配置片段里ELASTICSEARCH_API_KEY就是干这个的。
工具调用返回空结果。这个不算报错,但很常见。比如你问「what's anomalous?」,返回的是「无活跃异常」。这不代表链路断了,而是 ML 作业确实没检测到异常。这时候可以换一个查询,比如「show me the cluster health」,如果这个能返回数据,说明链路是通的。
配置改了但没生效。九成是因为客户端没重启。Claude Desktop 要完全退出(不是关窗口),Cline 要 reload window,Codex 要重新执行。另外检查一下你是不是改了错误的配置文件——有些客户端有多个配置文件,比如 Claude Desktop 在 macOS 和 Windows 上的路径就不一样。
排障时如果拿不准,可以去 TaoToken 的接入文档页面看最新的配置示例,地址是https://taotoken.net/doc。API Keys 管理在https://taotoken.net/api-keys。这两个页面上的信息比配置文件里的注释更及时。
6. 语义一致的 CTA:把这次接入实验变成可复用的观测链路
走到这里,你应该已经完成了一次可回滚的 endpoint 接入实验:改了 MCP Server 的 Base URL 和 Key,验证了四个核心工具调用,排查了可能遇到的报错。接下来怎么把这套东西用起来,取决于你的场景。
如果你主要是在做排障和接入验证,建议先把 API Keys 和接入文档这两个页面过一遍。API Keys 页面在https://taotoken.net/api-keys,接入文档在https://taotoken.net/doc。文档里有针对不同客户端的完整配置示例,包括 Claude Desktop、Cline、Codex 的字段对照,比你自己试错快很多。
如果你想先验证模型对话本身的效果,比如让 Agent 解释一段异常检测结果、或者让它根据集群健康数据给出排查建议,可以直接用模型对话页面,地址是https://taotoken.net/model-chat。这个页面不需要配 MCP Server,适合先感受一下模型在可观测性场景下的推理能力。
如果你打算长期跑编码和 Agent 任务,比如让 Agent 持续监控集群、自动生成调查报告、或者在 CI 里做变更影响分析,那 Coding Plan 更合适,地址是https://taotoken.net/coding-plan。它面向的是持续性的任务,不是一次性的问答。
最后说一个实际经验:MCP Server 的 endpoint 配置改完后,建议在团队内部同步一份配置模板,把 Base URL、Key 的获取方式、Model ID 的选型都写清楚。这样新同学接入时不用重新踩一遍坑,也方便在 Key 轮换时统一更新。观测链路的稳定性,很多时候不取决于工具多先进,而取决于配置管理有没有章法。