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

你的 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 |
取得重新整理權杖
只有管理員可以建立權杖。
- 前往 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/桌面版 | 設定 > 開發人員 > 編輯設定 (claude_desktop_config.json) |
| Cursor | 設定 > Cursor 設定 > MCP > 新增全域 MCP 伺服器 |
| Windsurf | 設定 > Cascade > MCP 市集 > 齒輪圖示 (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 發行版 下載後,解壓縮並指向完整路徑:
{
"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_HOST | app.last9.io | 覆寫 API 主機 |
LAST9_MAX_GET_LOGS_ENTRIES | 5000 | 分塊 get_logs 請求的最大條目數 |
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 驗證標頭(僅在啟用遙測時) |
它能做什麼
服務健康狀態
get_service_summary— 所有服務的吞吐量、錯誤率、p95 回應時間get_service_environments— 你的服務可用的環境。先執行這個——其他 APM 工具需要從這裡取得envget_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— 實際最慢的查詢執行,按持續時間排序,包含用於深入完整追蹤的追蹤 IDget_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_time、sum_over_time的彙總函式prometheus_label_values— 給定序列的標籤值prometheus_labels— 序列可用的所有標籤
透過設定 LAST9_DATASOURCE,將這些指向與預設值不同的資料來源/叢集。
日誌
get_logs— 完整的 JSON 管線日誌查詢(聚合、篩選器、欄位提取)get_service_logs— 服務的原始日誌行,可按嚴重性和內文內容篩選get_log_attributes— 時間範圍內日誌結構描述中屬性的全域目錄get_log_attributes_for_pipeline— 進行中管線實際存在的日誌欄位(限定範圍的探索),每個欄位都有其確切的filter_fieldget_drop_rules— 來自 Last9 控制平面 的日誌丟棄規則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_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_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 測試
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(字串,選填):例如postgresql、mysql、mongodb、redis。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(字串,必填):例如postgresql、mysql、mongodb、redis、aerospike。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(陣列,必填):每個篩選器:key、value、operator(equals/not_equals)、conjunction(and)。
get_traces
用於廣泛搜尋和彙總。若要精確查詢追蹤 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(陣列,選填):用於界定值範圍的前置篩選階段;若要取得全域值則省略。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(字串,選填):static或anomaly。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(字串,選填):限制實體類型:service、environment、host、database、k8s_deployment、k8s_namespace、job。
回傳最多 3 個最接近的匹配項及其相似度分數。在任何實體名稱不確定的工具呼叫前使用此功能。如果先前的呼叫回傳空結果,請在重試前嘗試此功能。
list_dashboards
無參數。以 JSON 陣列回傳組織中的所有自訂儀表板,包含 id、name 及中繼資料。
get_dashboard
id(字串,必填):儀表板 UUID。region(字串,選填):用於面板查詢填充的區域。預設為已設定的資料來源區域。
create_dashboard
dashboard(物件,必填):儀表板定義,包含name和panels[]。每個面板需要name、version、layout(x、y、w、h)、visualization.type和queries[]。metadata(物件,選填):儀表板中繼資料 ——_category和_type欄位(例如{"_category":"custom","_type":"metrics"})。
update_dashboard
id(字串,必填):要更新的儀表板 UUID。dashboard(物件,必填):完整的替換儀表板內容(與建立時的結構相同)。metadata(物件,選填):替換的中繼資料。唯讀的系統儀表板會回傳 403 錯誤。
delete_dashboard
id(字串,必填):要刪除的儀表板 UUID。唯讀的系統儀表板無法刪除。
測試
請參閱 TESTING.md 以取得整合測試設定與說明。
