排查生产故障时,真正拖慢节奏的往往不是缺少数据,而是在告警面板、Trace 页面、日志检索页和 IDE 之间反复跳转。Amazon OpenSearch Service 对 MCP Apps 的支持,试图把这条链路收进一次 Agent 对话:Agent 除了输出文字结论,还能返回可交互的可视化内容,让开发者在 IDE 中逐步核验告警、调用链、日志和根因判断。
核心变化不只是“让模型能搜日志”。MCP Apps 将工具调用结果从纯文本扩展为交互式界面,使 Agent 给出的每个判断都能带着可检查的数据视图。
从单次查询变成可追溯的调查路径
一个可靠的故障调查通常有明确的数据收敛顺序:
- 告警指出异常服务、时间窗口和症状,例如
checkout服务的 5xx 比例上升。 - Agent 按服务名、时间范围或 Trace ID 查询链路,定位耗时或出错的 Span。
- 它继续用 Trace ID、请求 ID 或相同时间窗口检索日志。
- 最终结论回到可验证证据,例如某个下游依赖超时、某次发布后错误类型激增,或者某个租户请求触发了异常路径。
MCP Apps 的价值在于,Agent 可以将这些中间结果以内联图表、表格或筛选界面的形式返回,而不是仅给出一句“可能是数据库慢了”。开发者可以直接查看时间序列、展开异常 Trace,或调整时间范围验证假设。文字回答负责解释推理,可视化负责承载证据。
本地 MCP Server 是连接层,不应成为数据旁路
来源描述的工作方式是运行一个本地 MCP Server,由它把 IDE 中的 Agent 与 OpenSearch Service 连接起来。这里的“本地”很重要:Agent 客户端通常通过本机进程启动 Server,凭据、工具定义和访问边界可以由开发团队控制。
这个 Server 应当保持薄:把用户问题转换为受限的 OpenSearch 查询,返回结构化结果和 MCP App 可渲染的数据,而不是复制一套观测数据或把整个集群权限交给模型。建议至少落实以下边界:
- 使用最小权限 IAM 身份,只读访问允许的索引或数据源。
- 对时间窗口、返回条数和聚合桶数设置上限,避免一次自然语言请求演变成高成本宽查询。
- 将索引名、服务名和环境做成允许列表,尤其要隔离生产与测试环境。
- 日志中可能包含令牌、邮箱或业务标识时,先做字段过滤或脱敏,再交给 Agent 和可视化组件。
- 为每次工具调用记录调用者、查询条件、耗时和结果规模,便于审计与成本分析。
可以这样实践:先把四个调查工具跑通
下面是一个最小化的本地 Python MCP Server。它展示了将告警上下文、Trace ID 和日志查询拆成独立工具的方式。示例假设你的 OpenSearch 集群兼容 REST Search API,并且本机已能通过环境变量访问它;具体索引名、认证方式和字段映射需要按实际数据模型调整。
安装依赖:
python -m venv .venv
source .venv/bin/activate
pip install "mcp[cli]" requests
export OPENSEARCH_URL="https://your-domain.region.es.amazonaws.com"
export OPENSEARCH_USER="readonly-user"
export OPENSEARCH_PASSWORD="readonly-password"
python server.py
将下面内容保存为 server.py。生产环境应优先使用 IAM 签名或企业既有的凭据链路,不要把长期密码写进源码或 MCP 客户端配置。
import os
from datetime import datetime, timedelta, timezone
import requests
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("opensearch-observability")
BASE_URL = os.environ["OPENSEARCH_URL"].rstrip("/")
AUTH = (os.environ["OPENSEARCH_USER"], os.environ["OPENSEARCH_PASSWORD"])
def search(index: str, query: dict) -> dict:
response = requests.post(
f"{BASE_URL}/{index}/_search",
auth=AUTH,
json=query,
timeout=15,
)
response.raise_for_status()
return response.json()
@mcp.tool()
def recent_error_logs(service: str, minutes: int = 15) -> dict:
"""Return recent error logs for one approved service."""
if service not in {"checkout", "catalog", "payment"}:
return {"error": "service is not in the allowed list"}
start = (datetime.now(timezone.utc) - timedelta(minutes=minutes)).isoformat()
result = search(
"logs-*",
{
"size": 50,
"sort": [{"@timestamp": "desc"}],
"query": {
"bool": {
"filter": [
{"term": {"service.name.keyword": service}},
{"range": {"@timestamp": {"gte": start}}},
{"terms": {"log.level.keyword": ["ERROR", "FATAL"]}},
]
}
},
"_source": ["@timestamp", "message", "trace.id", "error.type"],
},
)
return {"service": service, "window_minutes": minutes, "hits": result["hits"]["hits"]}
@mcp.tool()
def trace_errors(trace_id: str) -> dict:
"""Find failed spans belonging to a trace ID."""
result = search(
"traces-*",
{
"size": 100,
"sort": [{"@timestamp": "asc"}],
"query": {
"bool": {
"filter": [
{"term": {"trace.id.keyword": trace_id}},
{"term": {"status.code.keyword": "ERROR"}},
]
}
},
"_source": ["@timestamp", "service.name", "span.name", "duration", "error.message"],
},
)
return {"trace_id": trace_id, "failed_spans": result["hits"]["hits"]}
if __name__ == "__main__":
mcp.run(transport="stdio")
在 MCP 客户端配置中,将 Server 指向这个本地进程。不同 IDE 和 Agent 客户端的配置文件位置不同,但 stdio 形式通常类似下面这样:
{
"mcpServers": {
"opensearch-observability": {
"command": "/absolute/path/to/.venv/bin/python",
"args": ["/absolute/path/to/server.py"],
"env": {
"OPENSEARCH_URL": "https://your-domain.region.es.amazonaws.com",
"OPENSEARCH_USER": "readonly-user",
"OPENSEARCH_PASSWORD": "replace-with-a-secret-reference"
}
}
}
}
这段代码本身返回结构化 JSON,足以让 Agent 先完成“从日志中提取 Trace ID,再检查错误 Span”的闭环。接入 MCP Apps 时,可以将同一份聚合结果交给应用界面渲染为错误率趋势、Trace 时间线或日志表格。MCP Apps 的具体组件格式和客户端能力应以所使用的 OpenSearch Service 与 Agent 客户端文档为准;不要假定所有 MCP 客户端都已经支持交互式渲染。
让 Agent 的结论可以被反驳
把可视化加入对话,并不代表可以跳过工程验证。一个值得上线的调查工作流,应该要求 Agent 在结论中明确给出:查询时间范围、涉及的服务和索引、关键过滤条件、相关 Trace ID,以及支持结论的错误计数或日志样本。
可以在团队提示词中加入这样的约束:
调查生产告警时,先说明时间范围和目标服务。
每个根因判断必须引用至少一个可复查的 Trace ID 或日志事件。
证据不足时明确说明“不足以确认”,并提出下一条只读查询。
不得执行写入、删除、索引管理或权限变更操作。
这会把 Agent 从“看起来合理的诊断助手”约束为“能展示调查证据的只读协作者”。对值班场景尤其关键,因为错误的自然语言结论通常比一次空查询更危险。
采用前的检查清单
适合先从一个高频、边界清晰的场景开始,例如 API 5xx 告警后追踪错误请求。先验证 Agent 是否能稳定关联服务、时间窗口、Trace 和日志,再引入错误率图表、延迟分位数和跨服务依赖视图。
上线前确认以下事项:
- 本地 MCP Server 使用只读、最小权限凭据。
- 工具参数有服务、索引、时间范围和结果量限制。
- 敏感日志字段不会进入对话上下文或可视化结果。
- 每个可视化结论都能回溯到原始查询和原始事件。
- 当 MCP Apps 不可用时,Agent 仍能返回清晰的文本证据和可执行的下一步查询。
当这些控制点具备后,OpenSearch MCP Apps 可以把观测数据从分散页面中的“被动资料”,变成 IDE 对话里可连续验证的调查过程。