Last9 MCP Server

官方

无缝地将实时生产环境上下文——日志、指标和追踪——引入本地环境,从而更快地自动修复代码。

文档

Last9 MCP 服务器

last9 mcp demo

你的 AI 代理不知道生产环境中哪里出了问题。这个工具解决了这个问题。

Last9 MCP 服务器 将 Claude、Cursor、Windsurf 以及任何其他支持 MCP 的 AI 助手直接连接到你的生产可观测性数据——日志、指标、链路追踪、异常、数据库查询、告警和部署。代理不再猜测,而是读取实际信号。


30 秒快速开始(托管版)

无需安装二进制文件。无需管理令牌。一个 URL,在浏览器中完成 OAuth 认证,即可使用。

在你的 Last9 URL 中找到你的组织标识: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 Web/桌面版

设置 > 连接器 > 添加自定义连接器。 将其命名为 last9,粘贴 URL,完成认证。

需要你的 Claude 组织的管理员访问权限。


自托管版(STDIO)

当你的 MCP 客户端不支持 HTTP 传输,或者你需要在本地运行服务器时,使用此方式。

安装

Homebrew:

brew install last9/tap/last9-mcp

NPM:

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

获取刷新令牌

只有 管理员 可以创建令牌。

  1. 前往 API 访问
  2. 点击 生成令牌 并赋予写入权限
  3. 复制令牌

客户端配置

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/桌面版设置 > 开发者 > 编辑配置 (claude_desktop_config.json)
Cursor设置 > Cursor 设置 > MCP > 添加新的全局 MCP 服务器
Windsurf设置 > Cascade > MCP 市场 > 齿轮图标 (mcp_config.json)
VS Codesettings.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 访问 的刷新令牌
LAST9_DATASOURCE组织默认值数据源/集群名称——当你有多个 Levitate 集群时很有用
LAST9_API_HOSTapp.last9.io覆盖 API 主机地址
LAST9_MAX_GET_LOGS_ENTRIES5000分块 get_logs 请求的最大条目数
LAST9_DEBUG_CHUNKINGfalse设置为 true 以记录 get_logsget_service_logsget_traces 的分块规划详情
LAST9_DISABLE_TELEMETRYtrue设置为 false 以启用内部 OTel 链路追踪
OTEL_SDK_DISABLED标准 OTel 环境变量。覆盖 LAST9_DISABLE_TELEMETRY
OTEL_EXPORTER_OTLP_ENDPOINTOTLP 收集器端点(仅在启用遥测时有效)
OTEL_EXPORTER_OTLP_HEADERSOTLP 认证头信息(仅在启用遥测时有效)

它能做什么

服务健康

  • get_service_summary — 所有服务的吞吐量、错误率、p95 响应时间
  • get_service_environments — 你的服务可用的环境。首先运行此工具——其他 APM 工具需要此处的 env
  • get_service_performance_details — 完整细分:吞吐量、错误率、p50/p90/p95/平均值/最大值、apdex、可用性
  • get_service_operations_summary — 按 HTTP 端点、数据库调用、消息传递、HTTP 客户端分组的操作
  • get_service_dependency_graph — 依赖关系图,包含上游/下游/基础设施的吞吐量、延迟和错误率
  • get_exceptions — 服务器端异常,可按服务和 Span 筛选

数据库可观测性

四个直接针对数据库性能的工具,源自 OpenTelemetry 链路追踪 Span。如果你已经在使用 OTel,则无需额外的埋点。

  • get_databases — 发现你基础设施中的所有数据库:数据库类型、主机、吞吐量(查询/分钟)、p95 延迟、错误率、依赖服务数量
  • get_database_slow_queries — 实际最慢的查询执行,按持续时间排序,包含用于深入分析完整链路的 Trace ID
  • get_database_queries — 查询模式和聚合:查询运行频率、平均/p95 持续时间、错误率
  • get_database_server_metrics — 来自数据库主机本身的服务器端指标(CPU、连接数、缓冲区命中率——取决于你的数据库系统)

支持 PostgreSQL、MySQL、MongoDB、Redis、Aerospike 以及任何其他带有 db_system 属性的 OTel 链路追踪。

Prometheus / PromQL

  • prometheus_range_query — 对任何指标进行 PromQL 范围查询
  • prometheus_instant_query — 即时查询;使用如 avg_over_timesum_over_time 等汇总函数
  • prometheus_label_values — 给定序列的标签值
  • prometheus_labels — 序列可用的所有标签

通过设置 LAST9_DATASOURCE,将这些工具指向不同于默认值的数据源/集群。

日志

  • get_logs — 完整的 JSON 管道日志查询(聚合、过滤、字段提取)
  • get_service_logs — 服务的原始日志行,可按严重性和正文内容筛选
  • get_log_attributes — 时间窗口内日志模式中属性的全局目录
  • get_log_attributes_for_pipeline — 正在进行的管道中实际存在的日志字段(范围发现),每个字段都有其确切的 filter_field
  • get_drop_rules — 来自 Last9 控制平面 的日志丢弃规则
  • add_drop_rule — 创建新的丢弃规则以从源头减少日志量

链路追踪

  • get_traces — 用于广泛搜索和聚合的 JSON 管道链路追踪查询
  • get_service_traces — 按确切的 Trace ID 或服务名称查询链路追踪。当你拥有 Trace ID 时使用此工具——速度更快
  • get_trace_attributes — 链路追踪模式中属性的全局目录
  • get_trace_attributes_for_pipeline — 正在进行的管道中实际存在的属性(范围发现),每个属性都有其确切的 filter_field
  • get_trace_attribute_values — 链路追踪属性的不同值,可选择限定到某个管道

变更事件与告警

  • get_change_events — 部署、配置变更、回滚。将事件与变更关联起来
  • get_alert_config — 告警规则配置——可按名称、严重性、类型、标签搜索
  • get_alerts — 时间窗口内当前正在触发的告警
  • get_alert_rule_state — 每个告警规则在时间范围内的历史触发状态(1/0),按 rule_id 分组。可按告警组、规则名称、标签过滤器和状态筛选。
  • get_notification_channels — 已配置的通知渠道(Slack、PagerDuty、电子邮件等)

自定义仪表板

  • list_dashboards — 你组织中的所有自定义仪表板:ID、名称和元数据
  • get_dashboard — 按 ID 获取完整的仪表板定义,包括面板和查询
  • create_dashboard — 创建包含面板、查询和元数据的新自定义仪表板
  • update_dashboard — 按 ID 更新现有仪表板(只读系统仪表板会返回错误)
  • delete_dashboard — 按 ID 删除自定义仪表板

模糊名称解析

  • did_you_mean — 当代理不确定实体名称时,此工具会从你的目录中返回最接近的匹配项(服务、环境、主机、数据库、K8s 部署/命名空间、作业)。最多 3 个建议,并附带相似度分数。当名称查找返回空时,服务器会在大多数工具之前自动调用此工具。

工作原理

每个响应都包含深层链接。 每个工具都返回一个 deep_link 字段——一个直接指向 Last9 仪表板中该确切查询和时间范围的 URL。代理可以将链接交给你;你点击它;你就到了那里。

实时属性缓存。 启动时,服务器会从你的数据中获取实际的日志和链路追踪属性名称,并将它们嵌入到工具描述中。这意味着 AI 助手知道你的模式中存在哪些字段,而不仅仅是一个通用列表。缓存每 2 小时刷新一次。

分块处理大型结果。 get_logsget_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 测试

MCP 可流式 HTTP 需要先进行初始化握手。不要在第一个请求上设置 Mcp-Session-Id

# Step 1: Initialize
SESSION_ID=$(curl -si -X POST http://localhost:8080/mcp \
    -H "Content-Type: application/json" \
    -d '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "initialize",
      "params": {
        "protocolVersion": "2024-11-05",
        "capabilities": {},
        "clientInfo": {"name": "curl-test", "version": "1.0"}
      }
    }' | grep -i "^Mcp-Session-Id:" | awk '{print $2}' | tr -d '\r')
echo "Session: $SESSION_ID"

# Step 2: Send initialized notification
curl -s -X POST http://localhost:8080/mcp \
    -H "Content-Type: application/json" \
    -H "Mcp-Session-Id: $SESSION_ID" \
    -d '{"jsonrpc": "2.0", "method": "notifications/initialized", "params": {}}'

# Step 3: List tools
curl -s -X POST http://localhost:8080/mcp \
    -H "Content-Type: application/json" \
    -H "Mcp-Session-Id: $SESSION_ID" \
    -d '{"jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {}}'

# Step 4: Call a tool
curl -s -X POST http://localhost:8080/mcp \
    -H "Content-Type: application/json" \
    -H "Mcp-Session-Id: $SESSION_ID" \
    -d '{
      "jsonrpc": "2.0",
      "id": 3,
      "method": "tools/call",
      "params": {
        "name": "get_service_logs",
        "arguments": {
          "service": "your-service-name",
          "lookback_minutes": 30,
          "limit": 10
        }
      }
    }'

从源代码构建

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_exceptions

  • limit(整数,可选):最大异常数。默认值:20。
  • lookback_minutes(整数,可选):默认值:60。
  • start_time_iso / end_time_iso(字符串,可选):绝对时间范围。
  • service_name(字符串,可选):按服务筛选。
  • span_name(字符串,可选):按 Span 名称筛选。
  • deployment_environment(字符串,可选):按环境筛选。

get_service_summary

  • start_time_iso / end_time_iso(字符串,可选)
  • env(字符串,可选):默认为 prod

get_service_environments

  • start_time_iso / end_time_iso(字符串,可选)

所有其他 APM 工具都需要一个 env 值。如果此工具返回空,请使用 ""

get_service_performance_details

  • service_name(字符串,必填)
  • lookback_minutes(整数,可选):默认值:60。
  • start_time_iso / end_time_iso(字符串,可选)
  • env(字符串,可选):默认为 prod

get_service_operations_summary

  • service_name(字符串,必填)
  • lookback_minutes(整数,可选):默认值:60。
  • start_time_iso / end_time_iso(字符串,可选)
  • env(字符串,可选):默认值为 prod

get_service_dependency_graph

  • service_name(字符串,可选)
  • lookback_minutes(整数,可选):默认值:60。
  • start_time_iso / end_time_iso(字符串,可选)
  • env(字符串,可选):默认值为 prod

get_databases

  • env(字符串,可选):按环境过滤。默认值:全部。
  • lookback_minutes(整数,可选):默认值:60。
  • start_time_iso / end_time_iso(字符串,可选)

get_database_slow_queries

  • db_system(字符串,可选):例如 postgresqlmysqlmongodbredis
  • host(字符串,可选):数据库主机(net_peer_name)。
  • service_name(字符串,可选):调用服务名称。
  • env(字符串,可选)
  • min_duration_ms(浮点数,可选):最小查询持续时间(毫秒)。
  • lookback_minutes(整数,可选):默认值:60。
  • start_time_iso / end_time_iso(字符串,可选)
  • limit(整数,可选):默认值:20。

get_database_queries

  • db_system(字符串,可选)
  • host(字符串,可选)
  • service_name(字符串,可选)
  • env(字符串,可选)
  • lookback_minutes(整数,可选):默认值:60。
  • start_time_iso / end_time_iso(字符串,可选)
  • limit(整数,可选):默认值:20。

get_database_server_metrics

  • db_system(字符串,必填):例如 postgresqlmysqlmongodbredisaerospike
  • host(字符串,可选)
  • lookback_minutes(整数,可选):默认值:60。
  • start_time_iso / end_time_iso(字符串,可选)

prometheus_range_query

  • query(字符串,必填):PromQL 查询。
  • start_time_iso / end_time_iso(字符串,可选):默认值为最近 60 分钟。
  • lookback_minutes(浮点数,可选):默认值:60。

prometheus_instant_query

  • query(字符串,必填)
  • time_iso(字符串,可选):默认值为当前时间。
  • lookback_minutes(浮点数,可选)

prometheus_label_values

  • match_query(字符串,可选):PromQL 过滤器。
  • label(字符串,必填):标签名称。
  • start_time_iso / end_time_iso(字符串,可选)

prometheus_labels

  • match_query(字符串,可选):PromQL 过滤器。
  • start_time_iso / end_time_iso(字符串,可选)

get_logs

  • logjson_query(数组,必填):JSON 管道查询。
  • lookback_minutes(整数,可选):默认值:5。
  • start_time_iso / end_time_iso(字符串,可选)
  • limit(整数,可选):服务器默认值:5000。
  • index(字符串,可选):physical_index:<name>rehydration_index:<block_name>

对于基于日志的服务清单,首先查询 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(字符串,必填)
  • lookback_minutes(整数,可选):默认值:60。
  • limit(整数,可选):默认值:20。
  • env(字符串,可选)
  • severity_filters(数组,可选):例如 ["error", "warn"]。OR 逻辑。
  • body_filters(数组,可选):例如 ["timeout", "failed"]。OR 逻辑。
  • start_time_iso / end_time_iso(字符串,可选)
  • index(字符串,可选)

多种过滤器类型通过 AND 组合。每个数组内部使用 OR。 首先使用 get_logs 获取广泛的聚合计数;仅在缩小到服务/环境/索引和小样本集后使用 get_service_logs

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

无参数。

add_drop_rule

  • name(字符串,必填)
  • filters(数组,必填):每个过滤器:keyvalueoperatorequals/not_equals)、conjunctionand)。

get_traces

用于广泛搜索和聚合。对于精确的跟踪 ID 查找,请使用 get_service_traces

  • tracejson_query(数组,必填)
  • start_time_iso / end_time_iso(字符串,可选)
  • lookback_minutes(整数,可选):默认值:60。
  • limit(整数,可选):默认值:5000。

get_service_traces

trace_idservice_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_departmentattributes['http.method'])。
  • pipeline(数组,可选):用于限定值范围的先前过滤阶段;省略以获取全局值。
  • region(字符串,可选)

get_change_events

  • start_time_iso / end_time_iso(字符串,可选)
  • lookback_minutes(整数,可选):默认值:60。
  • service(字符串,可选)
  • environment(字符串,可选)
  • event_name(字符串,可选):首先在不使用此参数的情况下调用以获取 available_event_names

get_alert_config

  • search_term(字符串,可选):跨名称、组、数据源、标签的自由文本搜索。
  • rule_name(字符串,可选)
  • severity(字符串,可选)
  • rule_type(字符串,可选):staticanomaly
  • alert_group_name / alert_group_type / data_source_name(字符串,可选)
  • tags(数组,可选):所有条件都必须匹配(AND 逻辑)。

get_alerts

  • time_iso(字符串,可选):RFC3339 格式的评估时间。
  • window(整数,可选):回溯时间(秒)。默认值:900。范围:60–86400。
  • lookback_minutes(整数,可选):范围:1–1440。

get_alert_rule_state

  • start_time(整数,必填):范围的 Unix 纪元开始时间(含)。
  • end_time(整数,必填):范围的 Unix 纪元结束时间(含)。
  • step(整数,必填):采样之间的分辨率(秒)。采样数量 ((end_time - start_time) / step + 1) 上限为 100。
  • alert_group_id(字符串,可选):按警报组 ID 过滤。
  • rule_name(字符串,可选):对规则名称的正则表达式过滤。
  • alert_group_name(字符串,可选):对警报组名称的正则表达式过滤。
  • label_filters(字符串,可选):逗号分隔的 key=value 标签过滤器。
  • state(字符串,可选):按状态过滤(例如 firing)。

返回 rule_id -> [{timestamp, is_firing}] 的 JSON 映射。规则在上游响应中缺失的时间戳报告为 is_firing=0 —— 这意味着“未观察到触发”,而不是确认的正常状态。

get_notification_channels

无参数。返回所有已配置的通知渠道(Slack、PagerDuty、电子邮件、Webhook 等)。

did_you_mean

  • query(字符串,必填):要搜索的名称 —— 部分、拼写错误或缩写。
  • type(字符串,可选):限制实体类型:serviceenvironmenthostdatabasek8s_deploymentk8s_namespacejob

返回最多 3 个最接近的匹配项及其相似度分数。在实体名称不确定的任何工具调用之前使用此功能。如果之前的调用返回空结果,请在重试之前尝试此功能。

list_dashboards

无参数。以 JSON 数组形式返回组织中的所有自定义仪表板,包含 idname 和元数据。

get_dashboard

  • id(字符串,必填):仪表板 UUID。
  • region(字符串,可选):面板查询填充的区域。默认值为配置的数据源区域。

create_dashboard

  • dashboard(对象,必填):包含 namepanels[] 的仪表板定义。每个面板需要 nameversionlayoutxywh)、visualization.typequeries[]
  • metadata(对象,可选):仪表板元数据 —— _category_type 字段(例如 {"_category":"custom","_type":"metrics"})。

update_dashboard

  • id(字符串,必填):要更新的仪表板 UUID。
  • dashboard(对象,必填):完整的替换仪表板主体(与创建时的形状相同)。
  • metadata(对象,可选):替换元数据。只读系统仪表板返回 403 错误。

delete_dashboard

  • id(字符串,必填):要删除的仪表板 UUID。只读系统仪表板无法删除。

测试

有关集成测试设置和说明,请参阅 TESTING.md


MseeP.ai Security Assessment Badge