Last9 MCP Server

官方

無縫地將即時生產環境上下文——日誌、指標和追蹤——帶入您的本地環境,以更快地自動修復程式碼。

文件

Last9 MCP 伺服器

last9 mcp demo

你的 AI 代理不知道生產環境中哪裡出了問題。這個工具解決了這個問題。

Last9 MCP 伺服器 將 Claude、Cursor、Windsurf 以及任何其他支援 MCP 的 AI 助理直接連接到你的生產環境可觀測性資料——日誌、指標、追蹤、例外狀況、資料庫查詢、警報和部署。代理不再猜測,而是開始讀取實際的訊號。


30 秒內開始使用(託管)

無需安裝二進位檔。無需管理權杖。一個網址,在瀏覽器中完成 OAuth,就完成了。

在你的 Last9 網址中找到你的組織 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: 新增伺服器,貼上網址,進行驗證。

或直接在 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,貼上網址,進行驗證。

需要你的 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 發行版 下載:

平台封存檔
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 發行版 下載後,解壓縮並指向完整路徑:

{
  "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 — 伺服器端例外狀況,包含服務和跨度篩選器

資料庫可觀測性

四個直接針對你的資料庫效能的工具,衍生自 OpenTelemetry 追蹤跨度。如果你已經在使用 OTel,則無需額外的檢測。

  • get_databases — 探索你基礎設施中的所有資料庫:資料庫類型、主機、吞吐量(查詢/分鐘)、p95 延遲、錯誤率、相依服務數量
  • get_database_slow_queries — 實際最慢的查詢執行,按持續時間排序,包含用於深入完整追蹤的追蹤 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 — 按確切的追蹤 ID 或服務名稱查詢追蹤。當你有追蹤 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 儀表板中該確切查詢和時間範圍的直接網址。代理可以將連結交給你;你點擊它;你就到了那裡。

即時屬性快取。 啟動時,伺服器會從你的資料中擷取實際的日誌和追蹤屬性名稱,並將它們嵌入到工具描述中。這表示 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(字串,可選):按跨度名稱篩選。
  • 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(字串,選填):依環境篩選。預設值:all。
  • 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