关于 Last9 MCP Server
Last9 MCP Server 让兼容 MCP 的 AI 助手访问生产环境可观测性数据,以调查服务状态和事件。它支持通过浏览器 OAuth 使用托管 HTTP,也可本地运行 STDIO,并能配置工具集及只读模式。
主要功能
- 01查询日志、指标和追踪
- 02检查服务健康状态与依赖
- 03调查异常和数据库查询
- 04运行 PromQL 查询
- 05选择公开的工具集
- 06限制为只读工具
适用场景
- 01调查生产服务故障
- 02将服务性能与基线比较
- 03查找耗时较长的数据库查询
- 04在事件排查期间查询指标
MCP 相关
该 MCP 服务向 MCP 客户端提供 Last9 可观测性工具,可访问日志、指标、追踪、异常、数据库查询、告警和部署信息。支持托管 HTTP 连接或本地 STDIO 运行。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Last9 MCP 服务

你的 AI Agent 不知道生产环境出了什么问题。这个工具可以解决。
Last9 MCP 服务 可将 Claude、Cursor、Windsurf 及其他支持 MCP 的 AI 助手直接连接到你的生产环境可观测性数据,包括日志、指标、追踪、异常、数据库查询、告警和部署。Agent 不再靠猜测,而是开始读取实际信号。
30 秒快速开始(托管版)
无需安装二进制文件,也无需管理令牌。只需一个 URL,在浏览器中完成 OAuth,即可使用。
在 Last9 URL 中找到你的组织 slug:app.last9.io/<org_slug>/...
Claude Code
claude mcp add --transport http last9 https://app.last9.io/api/v4/organizations/<org_slug>/mcp
输入 /mcp,选择 last9 并完成身份验证。就这么简单。
Cursor
设置 > MCP > 添加新的 MCP 服务:
{
"mcpServers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
点击连接,完成 OAuth。
VS Code
需要 v1.99+。打开命令面板 → MCP: 添加服务器,粘贴 URL 并完成身份验证。
也可以直接编辑 settings.json:
{
"mcp": {
"servers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
}
Windsurf
设置 > Cascade > 打开 MCP 市场 > 齿轮图标(mcp_config.json):
{
"mcpServers": {
"last9": {
"serverUrl": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
Claude 网页版/桌面版
设置 > 连接器 > 添加自定义连接器。 将其命名为 last9,粘贴 URL 并完成身份验证。
需要拥有 Claude 组织的管理员权限。
可自托管(STDIO)
当你的 MCP 客户端不支持 HTTP 传输,或需要在本地运行服务时,请使用此方式。
安装
Homebrew:
brew install last9/tap/last9-mcp
NPM:
需要 Node.js 22.23.4+、24.22.1+ 或 26.12.1+:较早版本在安装程序下载二进制文件时,会接受来自已泄露的 eMudhra 中间证书的 TLS 证书。
npm install -g @last9/mcp-server@latest
# or directly:
npx -y @last9/mcp-server@latest
二进制发行版(Windows / 手动安装):
从 GitHub Releases 下载:
| 平台 | 压缩包 |
|---|---|
| Windows (x64) | last9-mcp-server_Windows_x86_64.zip |
| Windows (ARM64) | last9-mcp-server_Windows_arm64.zip |
| Linux (x64) | last9-mcp-server_Linux_x86_64.tar.gz |
| Linux (ARM64) | last9-mcp-server_Linux_arm64.tar.gz |
| macOS (x64) | last9-mcp-server_Darwin_x86_64.tar.gz |
| macOS (ARM64) | last9-mcp-server_Darwin_arm64.tar.gz |
获取刷新令牌
只有管理员才能创建令牌。
- 前往 API 访问权限
- 点击生成令牌并授予写入权限
- 复制令牌
客户端配置
Homebrew:
{
"mcpServers": {
"last9": {
"command": "/opt/homebrew/bin/last9-mcp",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
NPM:
{
"mcpServers": {
"last9": {
"command": "npx",
"args": ["-y", "@last9/mcp-server@latest"],
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
粘贴位置:
| 客户端 | 位置 |
|---|---|
| Claude Web/Desktop | Settings > Developer > Edit Config (claude_desktop_config.json) |
| Cursor | Settings > Cursor Settings > MCP > Add New Global MCP Server |
| Windsurf | Settings > Cascade > MCP Marketplace > gear icon (mcp_config.json) |
| VS Code | 在 settings.json 中封装为 { "mcp": { "servers": { ... } } } — 详情 |
VS Code STDIO 配置
{
"mcp": {
"servers": {
"last9": {
"type": "stdio",
"command": "/opt/homebrew/bin/last9-mcp",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
}
对于 NPM:使用 "command": "npx",并添加 "args": ["-y", "@last9/mcp-server@latest"]。
Windows
从 GitHub Releases 下载后,解压并指定完整路径:
{
"mcpServers": {
"last9": {
"command": "C:\\Users\\<user>\\AppData\\Local\\Programs\\last9-mcp-server.exe",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
在 Windows 上使用 NPM 方式更简单——无需管理路径。
环境变量
| 变量 | 默认值 | 说明 |
|---|---|---|
LAST9_REFRESH_TOKEN | (必需) | 从 API Access 获取的刷新令牌 |
LAST9_DATASOURCE | 组织默认值 | 数据源/集群名称——当你有多个 Levitate 集群时很有用 |
LAST9_API_HOST | app.last9.io | 覆盖 API 主机 |
LAST9_TOOLSETS | 所有工具 | 要公开的工具集,使用逗号分隔(logs、traces、metrics、alerts、dashboards、profiles、grafana、investigate、all)。别名:LAST9_MCP_TOOLSETS |
LAST9_MCP_READ_ONLY | false | 设置为 true 以仅提供只读工具;请参阅只读模式。非布尔值会导致启动错误。别名:LAST9_READ_ONLY |
LAST9_MCP_ALLOW_WRITE_TOOLS | — | 只读模式下仍提供的写入工具,以逗号分隔。别名:LAST9_ALLOW_WRITE_TOOLS |
LAST9_MAX_GET_LOGS_ENTRIES | 5000 | 分块 get_logs 请求的最大条目数 |
LAST9_USE_LOG_SEARCH_API | false | 设置为 true,通过一次服务端搜索调用而非客户端分块来响应 get_logs 和 get_service_logs。每次调用最多等待 90 秒,之后会返回缩小时间范围的建议;遇到 502 或 503 时会在此时间内重试一次 |
LAST9_DEBUG_CHUNKING | false | 设置为 true,记录 get_logs、get_service_logs、get_traces 的分块规划详情 |
LAST9_DISABLE_TELEMETRY | true | 设置为 false 以启用内部 OTel 跟踪 |
OTEL_SDK_DISABLED | — | 标准 OTel 环境变量。优先于 LAST9_DISABLE_TELEMETRY |
OTEL_EXPORTER_OTLP_ENDPOINT | — | OTLP 收集器端点(仅在启用遥测时使用) |
OTEL_EXPORTER_OTLP_HEADERS | — | OTLP 身份验证标头(仅在启用遥测时使用) |
只读模式
--read-only(或 LAST9_MCP_READ_ONLY=true)仅提供标注了 readOnlyHint: true 的工具,因此没有工具可以创建、更改或删除告警规则、通知渠道、仪表板或丢弃规则,也无法确认或重新分配告警,或静默告警组。未标注的工具会被视为写入工具并隐藏。
若要保留少数写入工具,请通过 --allow-write-tools(或 LAST9_MCP_ALLOW_WRITE_TOOLS)列出它们:
last9-mcp --read-only --allow-write-tools=acknowledge_alert,mute_alert_group
- 如果允许的名称不是写入工具(例如拼写错误,或读工具的名称),服务将拒绝启动;错误信息会列出有效的写入工具。
- 未搭配
--read-only使用--allow-write-tools会导致启动错误,因为所有写入工具本来就会提供。 - 只读模式与
--toolsets组合生效:工具只有同时满足两者条件才会提供。--toolsets=alerts --read-only --allow-write-tools=mute_alert_group会提供 alerts 读工具以及mute_alert_group;所选工具集之外的获准写入工具仍会隐藏。 --http模式和dump-tools也遵循相同的标志和环境变量:go run . dump-tools --read-only会打印只读接口,并在instructions中列出它提供的服务说明。- 读工具的说明、架构和结果,以及服务说明中,都不会提及隐藏的写入工具。获准的写入工具仍可能提及其隐藏的同类工具(
create_alert会创建一条已禁用的规则,之后由patch_alert启用),因此应将这类工具配对一并允许。
它能做什么
概览
get_workspace_overview— 当请求未指定服务或工具时(指定了则直接调用对应工具),建议首先调用此工具:一次低成本调用即可获取环境、过去一小时内出现过的信号(日志、追踪、指标)、服务和告警组数量、正在触发的告警,以及当前时间。某个信号在这一小时内未出现,并不代表没有更早的数据,因此仍可查询。子调用失败时,其字段会设为null,并添加一条errors[]记录。此工具集适用于所有工具集get_current_time— 获取当前时间,以及last 2h、yesterday或since yesterday 9am IST的绝对时间范围;支持任意 IANA 时区或常见缩写。此工具集适用于所有工具集
服务健康状况
get_service_summary— 按排名列出的服务(service, env)行:时间区间内的 request_count、throughput_rpm、HTTP 4xx/5xx 计数和 gRPC 错误计数get_service_environments— 获取服务可用的环境。请先运行此工具——其他 APM 工具需要使用从这里获取的envget_service_performance_details— 完整的性能细分:吞吐量、错误率、p50/p90/p95/avg/max、apdex、可用性(默认提供汇总;使用include_series可获取完整序列)get_service_operations_summary— 按 HTTP 端点、数据库调用、消息传递和 HTTP 客户端分组的操作get_service_dependency_graph— 上游、下游和基础设施的依赖关系图,包含吞吐量、延迟和错误率get_apm_service_deviations— 将当前时间窗口与等时长基线进行比较:回归/改进、Apdex 核对,以及最终结果(整个服务群或单个服务)get_exceptions— 服务端异常,支持按服务和 span 进行筛选
数据库可观测性
以下 4 个工具可直接查看数据库性能数据,这些数据源自 OpenTelemetry 跟踪跨度;如果没有跟踪数据,则使用 CloudWatch 等基础设施指标。如果你已经在使用 OTel,就无需额外埋点。
get_databases— 发现基础设施中的所有数据库:数据库类型、主机、吞吐量(查询次数/分钟)、p95 延迟、错误率、依赖服务数量。也可从 CloudWatch 等基础设施指标中发现数据库,无需跟踪埋点——这些记录会显示活动值,而非跟踪指标get_database_slow_queries— 按执行时长排序的实际慢查询执行记录,并附带跟踪 ID,便于深入查看完整跟踪数据get_database_queries— 查询模式和聚合数据:查询执行频率、平均/p95 执行时长、错误率get_database_server_metrics— 来自数据库主机本身的服务器端指标(CPU、连接数、缓冲区命中率等,具体取决于数据库系统)
支持 PostgreSQL、MySQL、MongoDB、Redis、Aerospike,以及任何带有 db_system 属性的 OTel 跟踪数据所覆盖的数据库;还支持从 CloudWatch 等基础设施指标中发现的数据库,其记录会显示活动值,而非跟踪指标。
Prometheus / PromQL
prometheus_range_query— 对任意指标执行 PromQL 范围查询prometheus_instant_query— 即时查询;使用avg_over_time、sum_over_time等汇总函数prometheus_label_values— 获取指定序列的标签值prometheus_labels— 获取指定序列的所有可用标签
设置 LAST9_DATASOURCE,或在单次调用中设置 datasource,即可将这些工具指向默认数据源/集群以外的目标。省略 datasource 时使用默认数据源;若名称近似(大小写、分隔符有差异,少一个、多一个或字母顺序颠倒),则使用最接近的匹配项;但如果是不同的单词、数字、环境或区域,则不会匹配。匹配较宽松(有两处拼写错误、是子字符串、有一个字母不同,或有两个字母互换且它们各自可能是国家代码,例如 es 与 se)或名称不明确时,会返回候选项且不执行查询(这不算错误)。如果你输入的名称与实际使用的数据源名称不完全一致,系统会在额外的内容块中注明所用的数据源。get_metric_status 和 get_service_profile 也会以相同方式解析 datasource。
日志
get_logs— 完整的 JSON 流水线日志查询(聚合、筛选、字段提取)get_service_logs— 获取服务的日志行,可按严重级别和正文内容筛选;除非response_mode为raw,否则会将超过 20 行的结果汇总get_log_patterns— 将时间窗口内服务的日志行聚类为消息模板,并提供计数、首次/最后一次出现时间、严重级别分布和示例get_emerging_log_patterns— 与基线时间窗口相比,新增、增多、减少或消失的日志模板,并提供两个时间窗口的计数get_log_attributes— 获取指定时间窗口内日志架构中属性的全局目录get_log_attributes_for_pipeline— 获取正在进行的流水线中实际存在的日志字段(范围限定的发现),并为每个字段提供其准确的filter_fieldget_drop_rules— 获取 Last9 Control Plane 中的日志丢弃规则add_drop_rule— 创建新的丢弃规则,从源头减少日志量
追踪
get_traces— 用于广泛搜索和聚合的 JSON 管道追踪查询get_service_traces— 按精确追踪 ID 或服务名称查询追踪。有追踪 ID 时使用此工具——速度更快get_trace_attributes— 追踪架构中的全局属性目录get_trace_attributes_for_pipeline— 正在进行的管道中实际存在的属性(限定范围的发现),每个属性都带有其精确的filter_fieldget_trace_attribute_values— 获取追踪属性的不同值,可选择限定到某个管道get_trace_attribute_deviations— 对两个有界 Span 群组之间存在差异的属性值进行排名(慢与快、错误与非错误,或两个时间窗口)。表示相关性,而非因果关系get_trace_waterfall— 将一条精确追踪以父级/子级瀑布图的形式呈现,并显示区间并集自耗时、最慢的 Span 和图结构警告
变更事件与告警
get_change_events— 部署、配置变更、回滚。将事故与变更内容关联起来analyze_change_impact— 某项变更是否造成了问题?对比变更前后某项服务及其直接调用方的黄金信号、APM 和追踪属性偏差、新触发的告警,并给出判断(regression likely/no significant change/insufficient data)get_alert_groups— 已配置的 Compass 告警组及其元数据标签、团队、层级和规则数量,包括没有规则的告警组和未触发告警的告警组get_alert_config— 告警规则配置,可按名称、严重性、类型和标签搜索get_alerts— 指定时间窗口内当前正在触发的告警get_alert_rule_state— 按rule_id分组,查看指定时间范围内各告警规则的历史触发状态(1/0)。可按告警组、规则名称、标签筛选条件和状态筛选。get_notification_channels— 已配置的通知渠道(Slack、PagerDuty、电子邮件等)。scope=channels列出渠道本身(用于关联的 ID);默认的attached列出各告警组关联的渠道recommend_alert_config— 创建告警规则前的只读设计指导(生命周期、验证门槛、响应人员上下文)validate_alert_expression— 对告警组的 KPI 试运行告警表达式,不保存任何内容describe_alert_chart— 只读:Discover 图表(discover-service、discover-exceptions)上可用于告警的信号(键、单位)create_alert— 在现有告警组中创建告警规则(静态规则,或通过adaptive_std_cmp创建自适应规则);始终以禁用的草稿状态创建。只需创建一次;之后使用update_alert/patch_alert进行调整create_alert_from_chart— 一次调用即可从 Discover 图表创建静态阈值告警规则。与create_alert一样,规则会以禁用的草稿状态创建update_alert— 完整替换规则的评估配置(可能返回替换后的规则 ID)patch_alert— 部分修改规则:启用/暂停、mute_until、响应人员properties、每周recurring_mute_schedule(或clear_recurring_mute_schedule)delete_alert— 永久删除告警规则mute_alert_group— 将告警组中的每条规则静音(或取消静音)至截止时间acknowledge_alert— 认领正在触发的告警,或释放认领reassign_alert— 将已认领的告警转交给其他用户create_notification_channel— 创建 Slack、PagerDuty、Opsgenie、电子邮件或通用 webhook 渠道attach_notification_channel— 将现有渠道关联到告警组,以接收breach、threat或两者的通知detach_notification_channel— 移除一项渠道与告警组之间的关联delete_notification_channel— 永久删除没有任何关联的渠道
告警写入工具(create_alert、update_alert、patch_alert、delete_alert、create_alert_from_chart、mute_alert_group、acknowledge_alert、reassign_alert、create_notification_channel、attach_notification_channel、detach_notification_channel、delete_notification_channel)需要具有写入权限范围的令牌;delete_alert、detach_notification_channel 和 delete_notification_channel 则需要删除权限范围。这些工具仅在 alerts 工具集内提供。
这些工具创建的规则、渠道和关联会标记 created_via: last9-mcp,并附带 MCP 客户端的名称和版本(规则上使用 _l9_created_via_ 和 _l9_created_via_client_ 注解;patch_alert 和 update_alert 会保留这些注解,调用方无法设置)。get_entity_alert_rules 和 get_notification_channels 会显示此标记;delete_alert、detach_notification_channel 和 delete_notification_channel 会指示 Agent 仅清理带有此标记的资源,除非用户指定了其他资源。
自定义仪表板
list_dashboards— 组织中的所有自定义仪表板:ID、名称和元数据get_dashboard— 按 ID 获取完整的仪表板定义,包括面板和查询validate_dashboard— 对已保存的仪表板 ID 或内联dashboard_definition在不超过 24 小时的时间窗口内执行只读 lint、执行和分类。绝不会创建或更新仪表板create_dashboard— 一次性创建全新的自定义仪表板(面板、查询、元数据)。返回 ID 后,使用patch_dashboard编辑面板。update_dashboard— 按 ID 重构现有仪表板的大部分内容(完整替换;只读系统仪表板会返回错误)。如需单独编辑面板,请使用patch_dashboardpatch_dashboard— 按 ID 对现有仪表板进行定向编辑(添加/更新/移除/移动面板、设置标题、设置变量);返回精简差异,而非完整仪表板delete_dashboard— 按 ID 删除自定义仪表板list_dashboard_snapshots— 查看仪表板冻结的时间点快照(仅元数据)get_dashboard_snapshot— 获取包含面板数据的完整冻结快照,用于 RCA/可分享视图delete_dashboard_snapshot— 按 ID 删除冻结快照
持续性能分析
要求组织已启用持续性能分析。请先使用 get_profile_services 查找服务,然后获取火焰图或函数排名。
get_profile_services— 在时间窗口内有性能分析数据的服务(查询前先索引)get_flamegraph— 单个服务的嵌套火焰图树(默认为cpu;也支持alloc、wall)get_top_functions— 单个服务中最热函数的自采样排名get_profile_summary— 对单个服务的性能分析进行简短的自然语言分诊
Grafana 仪表板
针对组织 Grafana 实例的只读工具(通过 Last9 的 Grafana 代理)。凭据字段绝不会返回给模型。通过 LAST9_TOOLSETS=grafana 启用(或不设置工具集以启用所有工具)。
grafana_search_dashboards— 按标题子字符串搜索仪表板(分页;达到上限时truncated: true)grafana_get_dashboard— 按 uid 获取仪表板摘要(面板、变量、PromQL 目标);设置full_json=true可获取原始 Grafana JSONgrafana_list_folders— 文件夹树grafana_list_folder_dashboards— 获取一个文件夹中的仪表板(分页)grafana_list_datasources— 不含凭据的数据源清单
模糊名称解析
did_you_mean— 当 Agent 不确定实体名称时,此工具会从目录中返回最接近的匹配项(服务、环境、主机、数据库、K8s 部署/命名空间、作业)。最多提供 3 个建议,并附上相似度评分。当名称查找结果为空时,服务端会在调用大多数工具前自动调用此工具。
服务概况
get_service_profile— 在查询服务前,了解其遥测数据的实际情况:存在的信号、语言和运行时、部署环境、日志结构,以及适用时推荐的采集修复方法。这有助于 Agent 在服务没有跟踪数据时跳过跟踪工具;当SeverityText为空时,也可以从日志正文解析严重性,而不是据此筛选后发现没有结果。
工作原理
每个响应都包含深层链接。 每个工具都会返回一个 deep_link 字段,这是指向 Last9 控制面板中对应查询和时间范围的直接 URL。Agent 可以把链接发给你;点击后即可打开对应页面。
工具集。 默认情况下,服务会公开所有工具。仅需进行调查(日志/追踪/指标/性能分析)的自动化宿主可以设置 LAST9_TOOLSETS=investigate(或传入 --toolsets=investigate),让 tools/list 保持精简,无需在客户端批量禁用工具。命名工具集:logs、traces、metrics、alerts、dashboards、profiles、grafana、investigate、all。遇到未知名称时会立即报错。每个工具集都会提供 get_current_time 和 get_workspace_overview。在 HTTP 模式下,可以通过 X-Last9-Toolsets 标头进一步缩小单个请求的工具范围(参见按请求指定工具集)。单独使用 metrics 工具集不包含 list_datasources 或 did_you_mean;需要这些发现辅助工具时,请使用 investigate(或组合多个工具集)。
工具参考资源。 完整的 logjson/tracejson/service-logs/metrics 手册属于 MCP 资源(last9://reference/logjson、last9://reference/tracejson、last9://reference/service_logs、last9://reference/metrics、last9://reference/investigation),不会始终显示在工具描述中。关键查询规则会保留在工具描述中,以便从未调用 resources/read 的 Agent 也能获得正确的构造指导。使用 get_log_attributes/get_log_attributes_for_pipeline(以及对应的追踪工具)查找组织专属字段;这些字段不会注入工具描述。
分块处理大型结果。 get_logs 和 get_traces 会通过分块处理大型结果集,而非截断结果。日志的默认上限为 5000 条;可通过 LAST9_MAX_GET_LOGS_ENTRIES 配置。
开发
HTTP 模式、curl 测试、从源代码构建
以 HTTP 模式运行
export LAST9_REFRESH_TOKEN="your_refresh_token"
export LAST9_HTTP=true
export LAST9_PORT=8080
./last9-mcp-server
服务会在 http://localhost:8080/mcp 启动。
使用 curl 测试
Streamable HTTP 处理器以无状态模式运行,因此每个请求都会独立处理。initialize 握手和 Mcp-Session-Id 标头都是可选的;发送这些内容的客户端仍可正常工作(标头会被接受并忽略),客户端也可以直接调用 tools/list/tools/call。每个工具调用都是独立的请求/响应查询;服务不会向客户端发送通知,因此 GET /mcp(SSE 流)会返回 405。
# List tools — a session handshake is optional in stateless mode
curl -s -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}'
# Call a tool
curl -s -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_service_logs",
"arguments": {
"service_name": "your-service-name",
"lookback_minutes": 30,
"limit": 10
}
}
}'
按请求指定工具集
在 HTTP 模式下,可以通过 X-Last9-Toolsets 标头缩小单个请求的工具范围;对于无法设置标头的客户端,也可以使用 toolsets 查询参数(/mcp?toolsets=logs,traces)。如果同时发送两者,非空白标头优先。该值使用与 --toolsets 相同的逗号分隔名称。请求可见的工具集是其与启动时 --toolsets 的交集:只能缩小范围,不能扩大;all 或空值则保留启动时的工具集。遇到未知名称时会返回指出该名称的 400 错误。tools/list、tools/call 和 initialize 说明都会遵循生效的工具集;get_current_time 和 get_workspace_overview 则始终包含在每个工具集中。
curl -s -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "X-Last9-Toolsets: logs,alerts" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}'
每个不同的生效工具集都有专属服务,该服务在首次收到请求时构建(耗时几十毫秒),并一直保留到关机;如果请求指定的工具集与启动时相同,则会复用启动时的服务。不会进行淘汰:由于只接受命名工具集,缓存中每种组合最多对应一个服务(目前共 135 种组合,合计约占用 75 MB 活跃堆内存;测试中缓存完全填满并稳定后,常驻内存接近 230 MB)。
从源代码构建
git clone https://github.com/last9/last9-mcp-server.git
cd last9-mcp-server
go build -o last9-mcp-server
LAST9_HTTP=true ./last9-mcp-server
LAST9_HTTP=true 用于本地开发。实际使用时,托管 HTTP 端点更方便。
工具参考
所有参数、时间输入规范和详细信息
### 时间输入- 绝对时间(
start_time_iso/end_time_iso或time_iso)优先于lookback_minutes。 - 对于相对时间范围:使用
lookback_minutes。 - 对于绝对时间范围:使用 RFC3339/ISO8601 格式,例如
2026-02-09T15:04:05Z。 - 为兼容性,仅接受旧版
YYYY-MM-DD HH:MM:SS格式。 - 使用
get_current_time将since yesterday 9am IST之类的表达解析为 RFC3339 时间边界。
get_workspace_overview
无参数。并发检查最近 60 分钟的数据,每个子调用都设有较短的超时时间,并返回 current_time、lookback_minutes、environments、telemetry(logs/traces/metrics 布尔值)、service_count(get_service_summary 排名中的不同服务数,涵盖每个环境)、alert_group_count、firing_alert_count 和 errors([{field, error}])。子调用失败的字段值为 null(未知),绝不会是 0 或 false。检查不会因 --toolsets 而缩小范围:toolset 用于筛选所提供的工具,API 令牌则决定服务可读取的内容。
get_current_time
range(字符串,可选):last 2h、past 30 minutes、last 7d(s、m、h、d 分别表示秒、分钟、小时、24 小时;w 表示 7 天;最长 366 天);today;yesterday;since <point>;<point> to <point>。时间点可以是 RFC3339,或today/yesterday/ 星期几(monday、mon:最近一次出现的日期,含今天)/YYYY-MM-DD,并可选加上9am、9:30pm或14:30。末尾的时区会覆盖两个时间边界的timezone;其他位置出现时区则会报错。省略时仅返回now。timezone(字符串,可选):IANA 名称或缩写(IST = Asia/Kolkata、PST/PDT、EST/EDT、UTC、GMT)。默认为 UTC。未知时区会报错,含义不明确的CST也会报错(请传入America/Chicago或Asia/Shanghai)。
返回的 now(以及指定 range 时的 start/end)格式为 {iso, epoch_seconds, local};仅当时区非 UTC 时才会包含 local。
get_exceptions
limit(整数,可选):异常数量上限。默认值:20。lookback_minutes(整数,可选):默认值:60。start_time_iso/end_time_iso(字符串,可选):绝对时间范围。service_name(字符串,可选):按服务筛选。span_name(字符串,可选):按 span 名称筛选。env(字符串,可选):按环境筛选。
get_service_summary
start_time_iso/end_time_iso(字符串,可选)env(字符串,可选):PromQL 正则表达式。默认为.*。精确匹配需要使用锚点(例如^prod$)。sort_by(字符串,可选):request_count(默认值)、throughput_rpm、http_4xx_count、http_5xx_count或grpc_error_count。limit(整数,可选):排名行数上限。省略或设为 0 表示 10;大于 100 的值会限制为 100。
get_service_environments
start_time_iso/end_time_iso(字符串,可选)
所有其他 APM 工具都需要
env值。如果此处返回空值,请使用""。
get_service_performance_details
默认返回按序列汇总的数据:points、missing_points(没有流量的可用性时间桶,不纳入统计)、min、p50、p90、p99(最近秩)、max、mean、last、baseline_mean(有效点前半部分的均值,而非时间窗口的均值)、delta_pct(有效点后半部分相对于基线的变化;基线为 0 时不返回),以及最多 3 个 change_points(timestamp、before_mean、after_mean)。每个指标最多返回 4 个序列,并涵盖每个响应时间分位数(按均值从高到低排列;series_omitted 统计其余序列)。points: 0 的序列不包含统计数据,baseline_mean/delta_pct 至少需要 6 个点(每半部分 3 个)。full_series 表示可通过 include_series 获取原始点。
service_name(string,必填)lookback_minutes(integer,可选):默认值:60。start_time_iso/end_time_iso(string,可选)env(string,可选):默认为prod。top_n(integer,可选):每个 top-operations/top-errors 列表的最大条目数。默认值:5;include_series=true时为 10。最大值:100。include_series(boolean,可选):返回每个序列的所有点,而非汇总数据。默认值:false。
get_service_operations_summary
service_name(string,必填)lookback_minutes(integer,可选):默认值:60。start_time_iso/end_time_iso(string,可选)env(string,可选):默认为prod。
get_service_dependency_graph
service_name(string,可选)lookback_minutes(integer,可选):默认值:60。start_time_iso/end_time_iso(string,可选)env(string,可选):默认为prod。
get_apm_service_deviations
service_name(string,可选):留空表示整个集群范围;指定后仅分析单个服务及其操作关联。lookback_minutes(integer,可选):当前时间窗口。默认值:60。start_time_iso/end_time_iso(string,可选):指定当前时间窗口。baseline_start_time_iso/baseline_end_time_iso(string,可选):指定基线。默认使用紧邻当前窗口之前、时长相同的时间窗口。datasource(string,可选):将比较范围限制为单个数据源。env(string,可选):默认为prod。max_services/max_operations(integer,可选):默认值均为 10,每项最大值均为 10。
get_databases
env(string,可选):按环境筛选。接受正则表达式。默认值:全部。lookback_minutes(integer,可选):默认值:60。时间窗口不得超过 7 天。start_time_iso/end_time_iso(string,可选)
get_database_slow_queries
db_system(string,可选):例如postgresql、mysql、mongodb、redis。host(string,可选):数据库主机(net_peer_name)。service_name(string,可选):调用方服务名称。env(string,可选)min_duration_ms(float,可选):查询时长下限,单位为毫秒。lookback_minutes(integer,可选):默认值:60。start_time_iso/end_time_iso(string,可选)limit(integer,可选):默认值:20。
get_database_queries
db_system(string,可选)host(string,可选)service_name(string,可选)env(string,可选)lookback_minutes(integer,可选):默认值:60。start_time_iso/end_time_iso(string,可选)limit(integer,可选):默认值:20。
get_database_server_metrics
db_system(string,必填):例如postgresql、mysql、mongodb、redis、aerospike。host(string,可选)lookback_minutes(integer,可选):默认值:60。start_time_iso/end_time_iso(string,可选)
prometheus_range_query
query(string,必填):PromQL 查询。start_time_iso/end_time_iso(string,可选):默认为最近 60 min。lookback_minutes(float,可选):默认值:60。
prometheus_instant_query
query(字符串,必填)time_iso(字符串,可选):默认为当前时间。lookback_minutes(浮点数,可选)
prometheus_label_values
match_query(字符串,可选):PromQL 过滤条件。label(字符串,必填):标签名称。lookback_minutes(浮点数,可选):默认值:60。start_time_iso/end_time_iso(字符串,可选)
如果未指定时间窗口,且 match_query 指定了一个指标(metric{...} 或 {__name__="metric"}),则当 60 分钟的查询结果为空时,会在 4 天的时间范围内重试一次;第二个文本块会说明结果覆盖的时间范围。
prometheus_labels
match_query(字符串,可选):PromQL 过滤条件。lookback_minutes(浮点数,可选):默认值:60。start_time_iso/end_time_iso(字符串,可选)
与 prometheus_label_values 一样,当针对单个指标的查询结果为空时,会在 4 天的时间范围内重试。
get_logs
logjson_query(数组,必填):JSON 管道查询。lookback_minutes(整数,可选):默认值:5。start_time_iso/end_time_iso(字符串,可选)limit(整数,可选):服务端默认值:5000。index(字符串,可选):physical_index:<name>或rehydration_index:<block_name>。response_mode(字符串,可选):summary(默认值;null时也使用此值)或raw。当原始行结果超过 20 行时,将以summary返回:lines_summarized、severity_counts(前六个标签,其余归入other_severities)、first_timestamp/last_timestamp、覆盖查询时间窗口的 10 桶histogram(基于返回的行统计;如果结果因达到 limit 而被截断,则包含truncated: true),以及排名靠前的patterns(包含template、count、最多两个samples;其余汇总到other),总长度不超过 4000 个字符;如果顶层元数据仍无法容纳,则会丢弃这些元数据,并在dropped_fields中列出。raw会返回日志行。聚合结果不会被汇总。
对于基于日志的服务清单,请先查询 physical_index_service_count:
sum by (name, service_name, env) (physical_index_service_count{destination="logs"})
使用 service_name 作为 ServiceName,(若存在)使用 env 作为环境,使用 name 作为物理索引名称。如果 name="default",则省略 index;如果用户选择了非默认物理索引,则传入 index: "physical_index:<name>"。如果后端拒绝显式物理索引过滤,则移除 index 重试,并报告该后端不支持显式物理索引过滤。
get_service_logs
service_name(字符串,必填)lookback_minutes(整数,可选):默认值:60。limit(整数,可选):默认值:100;当response_mode: "raw"时为 20。env(字符串,可选)severity_filters(数组,可选):例如["error", "warn"]。采用 OR 逻辑。body_filters(数组,可选):例如["timeout", "failed"]。采用 OR 逻辑。start_time_iso/end_time_iso(字符串,可选)index(字符串,可选)response_mode(字符串,可选):summary(默认值;null时也使用此值)或raw。超过 20 行时,logs会替换为与get_logs相同的summary,其他字段保持不变;raw会返回日志条目。
多种过滤类型组合时采用 AND 逻辑。每个数组内部采用 OR 逻辑。
应先使用 get_logs 查询较宽泛的聚合计数;仅在将范围缩小到特定服务、环境或索引,并确定一小组样本后,才使用 get_service_logs。
get_log_patterns
service_name(字符串,必填)env(字符串,可选)start_time_iso/end_time_iso(字符串,可选)lookback_minutes(整数,可选):默认值:60。severity_filters/body_filters(数组,可选):采用 OR 逻辑,与get_service_logs相同。仅当get_service_profile报告severity_set为all时才设置severity_filters;若为none或partial,则会丢弃正文中严重级别符合条件的行。index(字符串,可选)sample_size(整数,可选):从时间窗口中采样的行数,按时间从新到旧排列。默认值:1000,最大值:5000。top_n(整数,可选):按数量返回的模板数。默认值:20,最大值:100。其余模板会合计到other中。
聚类会在 MCP 服务中对采样行执行,因此计数、first_seen 和 last_seen 均限于样本;当样本可能遗漏匹配行时,window.sample_limit_reached 会标明这一点(样本包含 sample_size 行,且 API 报告的精确 total_matching_lines 不等于该值,或搜索结果为 logs_truncated),此时样本仅包含时间窗口中最新的行。每个 template 和 sample 都会截断到 500 个字符,并以 … 结尾,因此无法聚类的正文(例如没有 message 字段的 JSON)不会占满响应。包含失败分块的搜索会产生工具错误;搜索被截断或达到上限时仍会返回模式,并通过 sample_limit_reached 标记。只有在 sample_limit_reached 为 false 时,空的 patterns 列表才表示没有匹配项;如果为 true,则表示搜索提前停止,可能遗漏了匹配行。
get_emerging_log_patterns
接受 get_log_patterns 的所有参数(时间范围为当前窗口),另加:
baseline_start_time_iso/baseline_end_time_iso(字符串,可选):要么同时设置,要么都不设置。默认值:当前窗口之前、长度相同的紧邻窗口。min_count(整数,可选):模式发生变化的那个窗口中,该模式所需的行数:对于new/increased,指当前窗口;对于decreased/disappeared,指基线窗口。默认值:3(若更小,则采用sample_size),最大值:sample_size。change_factor(数字,可选):频率比,必须大于 1。对于两个窗口中都出现的模式,其频率必须达到该值(increased),或降至其倒数(decreased)。默认值:2。
两个阈值都必须满足,因此频率未按 change_factor 变化的高频模板不会被报告。仅返回发生变化的模板(new、increased、decreased、disappeared),并附上 current 和 baseline 计数;unchanged_patterns 统计两个窗口中均出现且变化幅度小于 change_factor 的模板数量,below_min_count_patterns 统计因行数少于 min_count 而被排除的变化数量。当两个样本包含所有匹配行时,按每分钟的频率进行比较;对于达到上限的样本,则根据精确的 total_matching_lines 估算每分钟频率;其他情况下按样本占比比较,此时 increased / decreased 描述的是组成变化,而非频率变化(comparison_basis)。空的 patterns 列表表示没有变化同时超过这两个阈值,并不表示日志没有变化:较少见的变化会计入 below_min_count_patterns;若某个窗口的 sample_limit_reached 为 true,则比较的是样本,而非整个窗口。
get_log_attributes
lookback_minutes(整数,可选):默认值:15。start_time_iso/end_time_iso(字符串,可选)region(字符串,可选)index(字符串,可选)
get_log_attributes_for_pipeline
pipeline(数组,必填):用于限定发现范围的前置筛选阶段,例如[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}]。lookback_minutes(整数,可选):默认值:15。start_time_iso/end_time_iso(字符串,可选)region(字符串,可选)index(字符串,可选)
get_drop_rules
无参数。通过 GET /otel_settings/drop?region=... 列出丢弃规则。
add_drop_rule
name(字符串,必填)filters(数组,必填):每个筛选条件包含:key、value、operator(equals/not_equals)、conjunction(and)。- 筛选键必须使用
attributes["key_name"]或resource.attributes["key_name"](Last9 API 要求)。 - 通过
POST /otel_settings/drop?region=...&cluster_id=...创建规则。
get_traces
用于广泛搜索和聚合。要查找确切的 Trace ID,请使用 get_service_traces。
tracejson_query(数组,必填)start_time_iso/end_time_iso(字符串,可选)lookback_minutes(整数,可选):默认值:60。limit(整数,可选):默认值:5000。
get_service_traces
必须且只能提供 trace_id 或 service_name 中的一个。
trace_id(字符串,可选):默认回溯时间:72 小时。service_name(字符串,可选):默认回溯时间:60 分钟。lookback_minutes(整数,可选)start_time_iso/end_time_iso(字符串,可选)limit(整数,可选):默认值:10。env(字符串,可选)
get_trace_attributes
lookback_minutes(整数,可选):默认值:15。start_time_iso/end_time_iso(字符串,可选)region(字符串,可选)
get_trace_attributes_for_pipeline
pipeline(数组,必填):用于限定发现范围的前置筛选阶段,例如[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}]。lookback_minutes(整数,可选):默认值:15。start_time_iso/end_time_iso(字符串,可选)region(字符串,可选)
get_trace_attribute_values
tag_name(字符串,必填):来自get_trace_attributes的属性名称(例如resource_department或attributes['http.method'])。pipeline(数组,可选):用于限定值范围的前置筛选阶段;若要获取全局值,请省略。lookback_minutes(整数,可选):默认值:15。start_time_iso/end_time_iso(字符串,可选):历史 RFC3339 时间范围;优先于lookback_minutes。region(字符串,可选)
get_trace_attribute_deviations
comparison_mode(字符串,必填):latency、errors或time。service_name(字符串,必填)environment(字符串,必填):确切的deployment.environment值。operation(字符串,可选)filters(数组,可选):Trace JSON 筛选条件。candidate_attributes(数组,可选):最多 8 个;若要进行有界发现,请省略。latency_threshold_ms(数字,可选):latency模式必填;其他模式不接受此参数。start_time_iso/end_time_iso(字符串,可选)lookback_minutes(整数,可选):默认值:15。最大值:15。baseline_start_time_iso/baseline_end_time_iso(字符串,可选):time模式必填;时间范围不得重叠,且持续时间必须与目标时间窗口相同。minimum_cohort_size(整数,可选):默认值:100。最小值:20。minimum_value_support(整数,可选):默认值:20。最小值:10。limit(整数,可选):默认值:10。最大值:10。
需要启用配套后端功能。
get_trace_waterfall
trace_id(字符串,必填)environment(字符串,可选)start_time_iso/end_time_iso(字符串,可选)lookback_minutes(整数,可选):默认值:4320(72 小时)。selected_span_id(字符串,可选):仅返回该 Span 的属性、事件和链接。max_spans(整数,可选):默认值:500。最大值:1000。
返回一个 investigation-evidence/v1 信封;瀑布图位于 data 下。
get_change_events
start_time_iso/end_time_iso(字符串,可选)lookback_minutes(整数,可选):默认值:60。service_name(字符串,可选)env(字符串,可选)event_name(字符串,可选):首次调用时不传此参数,以获取available_event_names。
analyze_change_impact
必须且只能传入 change_event 或 service + timestamp。
change_event(对象,可选):get_change_events的change_events[]中的一个元素,保持原样。使用metric.service、metric.deployment_environment和最早的values[].timestamp。service(字符串,可选):省略change_event时,必须与timestamp一起提供。timestamp(字符串,可选):RFC3339 或 Unix 秒数,向下取整到分钟。env(字符串,可选):精确环境。默认值:事件中的环境;否则为全部环境。baseline_minutes(整数,可选):默认值:60。限制在 30..120 范围内。after_minutes(整数,可选):默认值:baseline_minutes。限制在 30..120 范围内,且不超过当前时间。
满足以下任一条件时,判定为 regression likely:服务或其吞吐量排名前 10 的调用方之一(按两个时间窗口的合计吞吐量排名;变更前至少有 100 个请求,吞吐量指标还要求变更后也至少有 100 个请求)的错误率上升至少 1 个百分点、p95 上升至少 40%,或吞吐量(rpm)下降至少 50%(p95 仅统计 latency_env 中的请求);它们的告警在变更后开始触发,并在 after 窗口结束时仍在触发(按告警组名称或 service、service_name 或 service.name 标签进行不区分大小写的匹配,否则匹配注释(绝不匹配 summary 等自由文本);设置 env 时,丢弃标记了其他环境的告警(忽略大小写),未标记环境的告警则标记为 env_match: unlabelled);或 get_apm_service_deviations 检测到回归。若 after 窗口不足 5 分钟(包括未来发生的变更)、服务请求数过少,或黄金信号、直接调用方查询、告警或 get_apm_service_deviations 整体失败,或在 deviations.apm.unavailable 列出的任何查询失败,则判定为 insufficient data:证据缺失绝不会得出 no significant change;即使仍发现回归,也会注明失败项。no significant change 是有效结论,不是失败。只有设置了 env 时才会运行 Trace 属性偏差分析,且每侧最多分析 15 分钟;它们用于解释判定结果,但不会决定判定结果,因此跳过或获取失败都不会改变判定结果。每个列表最多保留 10 个条目,并报告丢弃了多少条;上游调用失败时,仅在对应部分留下 error。黄金信号的延迟指标在两个窗口中都来自同一环境,该环境在 latency_env 中注明;未设置 env 时,使用请求量最大的环境。黄金信号错误率统计 5xx 和 gRPC 错误;deviations.apm 还统计错误状态 span 和 429。调用方的信号来自其自身的服务端 span,因此仅有客户端 span 的调用方显示为 0 rpm。
regressions 会按 reason 中的顺序,为 regression likely 背后的每个触发条件列出一个条目;其他判定结果对应 []。每个条目包含 service、role(changed 或 dependent)、env、metric(必须且只能是 error_rate_pct、latency_p95_ms、throughput_rpm、alert、apm_deviation 之一),以及以该指标单位表示的 baseline/after(%、ms、rpm 或 APM 信号自身的值;alert 时为 null)。alert 条目还会添加 rule_id 和 state,即列出该告警实例的 after 窗口中最新 alerts-monitor 时间片里的状态,且始终为 firing:在变更后开始触发、但在 after 窗口结束前已恢复的告警不算回归,因此不会生成工单;它会连同 state 保留在 alerts.started 中,并计入 reason。env 是指标的测量环境:若指定了 env,则使用该环境;否则错误率和吞吐量汇总所有环境(env: ""),而 p95 使用请求量最大的环境,即 latency_env;告警使用其自身的环境标签,APM 偏差使用其自身的环境。每个回归都针对整个服务,因此不会指定端点。
get_alert_groups
用于变更看板/标签覆盖率审计的已配置 Compass 告警组清单。包含规则数为 0 的组和未触发的组。不返回 PromQL。
alert_group_name/alert_group_type/data_source_name(string,可选):不区分大小写的子串匹配。team/tier(string,可选):对已配置元数据进行不区分大小写的精确匹配。label_key+label_value(string,可选):必须同时设置。对一个metadata.labels键值对进行不区分大小写的精确匹配——键和值都必须匹配。
返回精简 JSON {"count":N,"groups":[...]},包含 id、name、type、entity_class、team、tier、metadata.labels 和规则计数。空的 team / labels 表示未设置。
get_alert_config
search_term(string,可选):跨名称、组、数据源和标签进行全文搜索。rule_name(string,可选)severity(string,可选)rule_type(string,可选):static或anomaly。alert_group_name/alert_group_type/data_source_name(string,可选)tags(array,可选):所有标签都必须匹配(AND 逻辑)。
get_alerts
time_iso(string,可选):RFC3339 格式的评估时间。window(integer,可选):回溯秒数。默认值:900。范围:60–86400。lookback_minutes(integer,可选):范围:1–1440。
get_alert_rule_state
start_time(integer,必填):范围起始时间的 Unix epoch(包含)。end_time(integer,必填):范围结束时间的 Unix epoch(包含)。step(integer,必填):样本之间的分辨率,单位为秒。样本数((end_time - start_time) / step + 1)上限为 100。alert_group_id(string,可选):按告警组 ID 筛选。rule_name(string,可选):按规则名称进行正则表达式筛选。alert_group_name(string,可选):按告警组名称进行正则表达式筛选。label_filters(string,可选):以逗号分隔的key=value标签筛选条件。state(string,可选):按状态筛选(例如firing)。
返回 rule_id -> [{timestamp, is_firing}] 的 JSON 映射。上游响应中缺少某条规则的时间戳会报告为 is_firing=0——这表示“未观察到正在触发”,而非已确认处于正常状态。
get_notification_channels
scope(string,可选):attached(默认值)返回每个告警组关联对应的一行;id是关联 ID,与detach_notification_channel所用的 ID 一致。channels返回组织的渠道(id、name、type、send_resolved、created_via);id是渠道 ID,与attach_notification_channel所用的 ID 一致。不会返回目标地址、标头和证书。
以 TSV 表格形式返回已配置的通知渠道(Slack、PagerDuty、电子邮件、webhook 等)。关联行(已设置 service_fqid)的 global 为 false,services 为 -;services 仅列出旧版服务绑定。在关联行中,send_resolved 是该行存储的默认值,并非实际投递时使用的值;解决通知遵循渠道自身的 send_resolved(scope=channels)。两个范围都包含 created_via(由 MCP Agent 创建的行显示 last9-mcp,否则显示 -)。
recommend_alert_config
只读。返回生命周期指导、验证门槛和响应人员上下文要求;它本身不构成证据,因此应使用遥测工具为阈值提供依据。
signal(string,必填):指标或用户影响信号,包括单位和维度。objective(string,必填):要检测的症状或用户影响。rule_type(string,可选):static(默认值)或anomaly。severity(string,可选):breach(默认值)或threat。environment(string,可选):环境和流量配置。
validate_alert_expression
试运行表达式,不会保存。请在使用 create_alert / update_alert 前调用。
entity_id(string, required):告警组/实体 UUID。expression(string, required):对指标进行运算,指标名称必须与其 KPI 的确切名称一致,例如errors / requests。最多使用 3 个指标。名称中含空格、点或连字符时,按原样书写(Test Alert / errors),与create_alert保存的名称完全一致。indicators_used(object, required, non-empty):从指标名称映射到由entity_id所属的 KPI UUID。请使用每个 KPI 的确切名称:此次试运行接受任意名称,但create_alert和update_alert会拒绝expression_args中与所绑定 KPI 名称不一致的键。
只会检查算术表达式(传入内部指标表达式,不要传入 adaptive_std_cmp(...) 封装);不会检查 condition / alert_condition。仅在使用多个指标时,才会检查至少存在一个时间序列。
返回 {"valid":true} 或 {"valid":false,"reason":"..."};表达式无效属于正常结果,不是工具错误。
describe_alert_chart
只读。列出受支持的 Discover 图表上可用于告警的信号(key、unit、eval_query、query_kind)。不接受 Viewer 角色令牌。
surface(string, required):discover-service或discover-exceptions;不接受其他 surface,包括自定义仪表板(请改用带有 KPI 的create_alert)。chart_key(string, required):例如apdex、error_rate、response_time、exception_count。service_name(string, required)env(string, optional)attributes(object, optional):额外的身份维度,使用此工具报告的键名。
create_alert
在现有告警组中创建规则,始终处于禁用状态(即草稿,即使传入 is_disabled=false 也一样)。请先调用 recommend_alert_config,仅在用户确认后,再通过 patch_alert 设置 is_disabled=false 以启用规则。创建一次后,请保留返回的规则 ID。如果告警组中已有同名 rule_name(不区分大小写),则会拒绝创建,不会创建任何内容,并指出现有规则的 ID。
entity_id(string, required):告警组/实体 UUID。alert_rule(object, required):完整的类型化规则主体,包括绑定到实体实际 KPI 的primary_indicator和expression_args。每个expression_args键都必须与所绑定 KPI 的确切名称一致(不能使用x之类的占位符),且primary_indicator和expression也要使用这些名称。静态规则需要condition、alert_condition和eval_window(0–60 分钟)。自适应规则使用expression=adaptive_std_cmp(<primary_indicator>, sensitivity, window);此时这三个字段均为可选项(默认值为expr > 0、count_true(result) >= 1、1)。不能设置algorithm。响应人员上下文信息放在properties中(description、runbook、annotations、query_mode)。
通知路由在告警组上配置,而不是在规则上配置。
create_alert_from_chart
根据 describe_alert_chart 所描述的图表创建静态阈值规则。与 create_alert 一样,规则会以已禁用的草稿状态创建,不会触发;只有在用户确认后,才使用 patch_alert 将 is_disabled=false 来启用规则。图表 API 会创建已启用的规则,因此该工具会在创建后立即禁用规则;如果禁用失败,结果会返回错误并指出规则 ID,该规则可能处于启用状态。
surface/chart_key/service_name/signal_key/name(字符串,必填)env(字符串,可选)attributes(对象,可选)threshold(数字,可选):单位与信号的单位相同;必须大于或等于 0。apdex 等分数单位的信号必须明确指定值。threshold_operator(字符串,可选):>(默认)、<、>=、<=、==、!=。eval_window(整数,可选):分钟数,范围为 1–60。默认值:5。bad_minutes(整数,可选):范围为 1–eval_window。默认值:3。severity(字符串,可选):breach或threat。description(字符串,可选)group_id(字符串,可选):通常省略。
update_alert
完整替换规则的评估配置。请先使用 get_alert_config 或 get_entity_alert_rules 获取规则。如果规则不存在或属于其他告警组,则会拒绝操作且不做任何更改。此操作可能会软删除并重新创建规则,因此之后请使用返回的替换规则 ID。
entity_id(字符串,必填)id(字符串,必填):告警规则 UUID。alert_rule(对象,必填):完整配置;结构与create_alert相同。
patch_alert
部分修改规则并保留规则 ID。至少需要进行一项修改。如果规则不存在或属于其他告警组,则会拒绝操作且不做任何更改。
entity_id(字符串,必填)id(字符串,必填):告警规则 UUID。is_disabled(布尔值,可选):false启用规则,true暂停规则。mute_until(整数,可选):Unix 纪元截止时间;0取消静音。properties(对象,可选):description、runbook、annotations、query_mode。每个已发送字段都会替换存储值;省略或留空的字段保留其存储值。annotations会替换整个映射,因此若要保留现有内容,请发送所有键;发送{}可清空映射。recurring_mute_schedule(对象,可选):替换每周计划:enabled(默认为 false)、timezone(必填,IANA 名称)和windows(1–20 个时间窗口;weekdays取值范围为sun..sat,start_time/end_time使用 24 小时制HH:MM)。结束时间早于或等于开始时间时,表示次日结束。若要保留现有时间窗口,请发送所有窗口。clear_recurring_mute_schedule(布尔值,可选):彻底移除计划;不能与recurring_mute_schedule同时使用。此操作不同于enabled=false,后者会保留已存储的时间窗口。
查看者角色的用户只能更改 mute_until。组或实体已静音时,拒绝更改单条规则的静音设置。使用 get_entity_alert_rules 查看更改结果,其中会显示 mute_until、recurring_mute_schedule 和 properties。
delete_alert
永久删除规则。请先使用 get_alert_config 验证规则,并取得用户的明确确认。如果规则不存在或属于其他告警组,则会拒绝删除且不做任何更改。
entity_id(字符串,必填)id(字符串,必填):告警规则 UUID。
mute_alert_group
将组内所有现有及未来的规则设为静音;若要将单条规则设为静音,请使用 patch_alert 并设置 mute_until。需要编辑者权限。
entity_id(字符串,必填):告警组/实体 UUID。until(整数,必填):静音结束时间,以 Unix 纪元秒数表示。0取消静音;-1等负值表示无限期静音。
acknowledge_alert
接管正在触发的告警,或释放告警。不会解决或静默告警。确认自己已经接管的告警是安全的空操作。除非 get_alerts 在过去一小时内列出了该告警(包含全部 3 个 ID),否则 ack 会拒绝操作,且不会记录任何内容。
alert_group_id/rule_id/rule_type(string,必填):从get_alerts中的告警复制。action(string,可选):ack(默认)或unack。只有所有者或组织管理员可以取消确认。mute_until(integer,可选):仅适用于ack。记录你已通过mute_alert_group或patch_alert应用的静默;不会静默任何内容。
reassign_alert
将已分配给某位所有者的告警转交给另一位用户;如果告警没有所有者,请先确认告警。当告警没有所有者而无法转交时,会说明 get_alerts 是否在过去一小时内列出过该告警。Last9 不会通知新所有者。
alert_group_id/rule_id/rule_type(string,必填):从get_alerts中的告警复制。owner_email(string,可选):优先使用;会与组织内的活跃用户进行不区分大小写的匹配。owner_user_id(string,可选):owner_email和owner_user_id必须且只能提供其中一个。
create_notification_channel
创建一个渠道;在使用 attach_notification_channel 将其关联之前,该渠道不会路由任何内容。创建一次并保留其 ID;没有更新工具。仅返回 id、name、type 和 send_resolved。
name(string,必填):同一类型内唯一;不能包含冒号。type(string,必填):slack、pagerduty、opsgenie、email或generic_webhook。destination(string,必填):Slack Incoming Webhook URL(或在使用slack_app_mode时填写频道 ID)、PagerDuty 路由密钥、Opsgenie API 密钥、逗号分隔的工作邮箱地址(可使用任何域名,不限于组织的域名;API 会拒绝 Gmail 等个人邮箱服务提供商的地址,而使用个人账号登录的组织只能使用其管理员的地址),或 HTTPS webhook URL。slack_app_mode(boolean,可选):仅适用于 Slack。默认值:false。mention_handles(string,可选):逗号分隔,例如user|U123ABC|name、special|here、special|channel。webhook_headers(object,可选):仅适用于generic_webhook。webhook_ca_certificate(string,可选):仅适用于generic_webhook;一个 PEM CA 证书,最大为 64 KiB。send_resolved(boolean,可选):默认值:true。
attach_notification_channel
将现有渠道路由到一个告警组。此操作具有幂等性。关联时会复制渠道的投递设置(标头、证书、提及);如果之后更改了渠道设置,请重新关联。
channel_id(integer,必填):渠道 ID(使用get_notification_channels并设置scope=channels获取),不是关联 ID。alert_group_id(string,必填):来自get_alert_groups。severity(string,必填):breach、threat或both。both会创建两个关联;如果第二个关联失败,第一个仍会保留,错误中会指出需要重试的严重级别。
detach_notification_channel
移除一个关联。需要具有 delete 作用域的令牌;write 作用域的令牌无法解除关联。
attachment_id(integer,必填):在get_notification_channels中设置scope=attached时返回的id。不接受渠道 ID。alert_group_id(string,可选):如果该关联属于其他告警组,则拒绝操作。
delete_notification_channel
永久删除一个没有任何关联的渠道;请先解除其关联。需要具有 delete 作用域的令牌。通过重新列出渠道来确认删除。
channel_id(integer,必填):在get_notification_channels中设置scope=channels时返回的id。不接受关联 ID。
did_you_mean
query(字符串,必填):要搜索的名称,可以是不完整、拼写错误或缩写形式。type(字符串,可选):限制实体类型:service、environment、host、database、k8s_deployment、k8s_namespace、job。
最多返回 3 个最接近的匹配项及其相似度分数。实体名称不确定时,在调用任何工具前使用此工具。如果之前的调用返回空结果,请在重试前使用此工具。
get_service_profile
service_name(字符串,必填):要为其生成遥测配置的服务。datasource(字符串,可选):数据源名称。省略时使用默认数据源;近似名称的解析方式与 Prometheus 工具相同。
返回一份简短的调查摘要,后接完整的原始 JSON 配置:信号是否存在(logs/traces/metrics 的值为 present、absent 或 unknown)、语言和运行时、部署环境、日志 signal_shape(log_format、severity_set、level_field、trace_context_in_logs),以及适用时推荐的采集修复方案。当后端报告 freshness 时,摘要会增加一行 last seen,包含 freshness.logs.last_seen 和 freshness.traces.last_seen(RFC3339 格式;为 null 时显示 none);如果 freshness.traces_stale 为 true,还会显示 traces stale 警告:这表示日志仍在持续,而 spans 已停止,因此应调查 freshness.traces.last_seen 附近的回归问题,而非缺少配置。数据源自上游并经过缓存,TTL 约为 15 分钟。
在任何特定于服务的调查之前调用此工具,以便根据服务的实际遥测情况选择工具——如果 traces 为 absent,则跳过 trace 工具;如果 severity_set 为 none 或 partial,则从日志正文中的 level_field 解析严重性,而不要使用 severity_filters。metrics 始终为 unknown,且 v1 中未填充 dependencies。如果 logs 和 traces 均为 absent,请先用 did_you_mean 确认名称,再判定该服务未受监控。
list_dashboards
无参数。以 JSON 数组形式返回组织中的所有自定义仪表板,包含 id、name 和元数据。
get_dashboard
id(字符串,必填):仪表板 UUID。region(字符串,可选):用于填充面板查询的区域。默认为已配置数据源的区域。
validate_dashboard
只读。绝不创建或更新仪表板。必须且只能提供 dashboard_id 或 dashboard_definition 中的一个。
dashboard_id(字符串,可选):要验证的已保存仪表板 UUID。dashboard_definition(对象,可选):内联的未保存仪表板正文(真正的试运行)。start_time_iso/end_time_iso(字符串,可选):验证时间窗口(RFC3339)。时长必须 ≤ 24h。region(字符串,可选):用于执行面板查询的区域。
返回 dashboard_validation/v1:逐面板的 lint 和执行分类(data / no_data / invalid / error)。首日空结果会归类为 valid_no_data,不会执行诊断探测。
create_dashboard
仅用于全新创建。此调用返回 dashboard.id 后,请使用 patch_dashboard 编辑面板(或使用 update_dashboard 调整结构)——不要为了添加、删减或修复面板而再次创建。
dashboard(对象,必填):仪表板定义,包含name和panels[]。每个面板都必须包含name、version、layout(x、y、w、h)、visualization.type和queries[]。metadata(对象,可选):仪表板元数据——_category和_type字段(例如{"_category":"custom","_type":"metrics"})。
update_dashboard
仅用于调整仪表板的大部分结构;添加、编辑、移除或移动单个面板时,请使用 patch_dashboard。按 ID 完整替换(正文与创建时相同):必须重新传入每个面板,且内容保持一致。
id(字符串,必填):要更新的仪表板 UUID。dashboard(对象,必填):完整替换的仪表板正文(结构与创建时相同)。metadata(对象,可选):替换元数据。只读系统仪表板会返回 403 错误。
patch_dashboard
对于小幅调整,优先使用此工具,而不是 update_dashboard:不会重新发送未更改的面板。该工具会读取仪表板,按顺序应用 ops 并写回,因此读取和写入之间在其他位置所做的编辑会被覆盖。返回 {dashboard_id, changes[]};仪表板已满足的 ops 会被省略;如果没有任何内容发生变化,则不会写入。写入后会重新读取并核对差异:面板 fields 显示已存储的值,not_stored 列出被 API 丢弃的键,not_removed 列出其值为 null 但仍被保留的键。超过 200 个字符的差异值会就地缩短,同时保留其 JSON 类型。
id(字符串,必填):要修补的仪表板 UUID。ops(数组,必填):按顺序应用的 ops;如果其中任何一项无效,则不会写入,并且错误会指出该项为ops[i]。add_panel:panel(完整的面板对象;version默认为 1),可选的index(从 0 开始的插入位置,默认追加)。update_panel:panel_id、fields(要替换的顶层面板键;null会移除键;不能更改id)。remove_panel:panel_id。move_panel:panel_id、index(移动后从 0 开始的位置)。set_title:title(仪表板名称)。set_variable:variable;替换具有相同target的变量,否则追加。
delete_dashboard
id(字符串,必填):要删除的仪表板 UUID。无法删除只读系统仪表板。
list_dashboard_snapshots
dashboard_id(字符串,必填):要列出其快照的仪表板 UUID。
仅返回元数据(id、name、expires_at 等)。如需获取冻结的面板数据,请使用 get_dashboard_snapshot。
get_dashboard_snapshot
id(字符串,必填):快照 UUID。
返回完整的冻结快照,包括 dashboard_definition、panel_data、time_range 和 variables。
delete_dashboard_snapshot
id(字符串,必填):要删除的快照 UUID。
get_profile_services
lookback_minutes/start_time_iso/end_time_iso(可选):时间窗口;优先使用回溯时长或明确的 ISO 时间边界(默认 60m)。region(字符串,可选):区域覆盖值。
返回该时间窗口内有性能分析数据的服务。请在调用 get_flamegraph / get_top_functions / get_profile_summary 前调用此工具。
get_flamegraph
service(字符串,必填):来自get_profile_services的服务名称。profile_type(字符串,可选):cpu(默认)、alloc或wall。比较不同时间窗口时,请固定类型。env/cluster/namespace/runtime(字符串,可选):范围过滤器。limit(数字,可选):聚合堆栈行数上限(默认 1000,最大 10000)。lookback_minutes/start_time_iso/end_time_iso/region(可选)。
返回嵌套的火焰图树(name / value / self / children)。truncated: true 表示已达到 API 行数限制。
get_top_functions
过滤条件与 get_flamegraph 相同。返回按最热点函数排列的自身采样排名。结果可能会被截断;请检查 truncated。
get_profile_summary
过滤条件与 get_flamegraph 相同。返回针对该服务性能分析的简短自然语言排查摘要。
grafana_search_dashboards
query(字符串,可选):标题子字符串。留空时会广泛列出(受 5,000 行上限约束)。
返回 {"dashboards":[…], "truncated":bool},其中包含 uid、title、uri、url、type 和 tags。使用 uid 调用 grafana_get_dashboard。
grafana_get_dashboard
uid(字符串,必填):Grafana 仪表板 uid。full_json(布尔值,可选):为 true 时,返回原始 Grafana JSON,而非经过筛选的摘要。
默认摘要包括版本、标签、模板变量,以及每个面板的类型、数据源、gridPos 和 promQL 目标。未知的插件面板类型会显示在 unsupportedPanelTypes 中。
grafana_list_folders
无参数。返回文件夹树。
grafana_list_folder_dashboards
folder_uid(字符串,必填):Grafana 文件夹 uid。
返回该文件夹中的仪表板,格式为 {"dashboards":[…], "truncated":bool}(分页查询,最多 5,000 个)。
grafana_list_datasources
无参数。返回数据源的安全信息视图(不包含凭据字段)。
测试
集成测试设置和说明请参阅 TESTING.md。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。
