Last9
公式リアルタイムの本番コンテキスト(ログ、メトリクス、トレース)をシームレスにローカル環境に取り込み、コードの自動修正をより迅速に行えるようにします。
ドキュメント
Last9 MCP サーバー

あなたの AI エージェントは、本番環境で何が壊れているかを知りません。これを修正します。
Last9 MCP サーバー は、Claude、Cursor、Windsurf、その他 MCP 対応の AI アシスタントを、本番環境の可観測性データ (ログ、メトリクス、トレース、例外、データベースクエリ、アラート、デプロイ) に直接接続します。エージェントは推測をやめ、実際のシグナルを読み取り始めます。
30 秒で開始 (ホステッド)
インストールするバイナリはありません。管理するトークンもありません。URL を 1 つ入力し、ブラウザで 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
Settings > MCP > Add New MCP Server:
{
"mcpServers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
Connect をクリックし、OAuth を完了します。
VS Code
v1.99 以降が必要です。コマンドパレットを開き → MCP: Add Server を選択し、URL を貼り付けて認証します。
または、settings.json で直接設定します:
{
"mcp": {
"servers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
}
Windsurf
Settings > Cascade > Open MCP Marketplace > 歯車アイコン (mcp_config.json):
{
"mcpServers": {
"last9": {
"serverUrl": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
Claude Web/Desktop
Settings > Connectors > Add custom connector. 名前を 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 リリース からダウンロードします:
| プラットフォーム | アーカイブ |
|---|---|
| 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 アクセス に移動します
- Generate Token をクリックし、Write 権限を付与します
- コピーします
クライアント設定
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 > 歯車アイコン (mcp_config.json) |
| VS Code | { "mcp": { "servers": { ... } } } でラップし、settings.json に配置 — 詳細 |
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 | org デフォルト | データソース/クラスター名 — 複数の 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 ツールはここからのenvが必要ですget_service_performance_details— 完全な内訳: スループット、エラー率、p50/p90/p95/平均/最大、apdex、可用性get_service_operations_summary— HTTP エンドポイント、DB コール、メッセージング、HTTP クライアントでグループ化された操作get_service_dependency_graph— アップストリーム/ダウンストリーム/インフラのスループット、レイテンシ、エラー率を含む依存関係マップget_exceptions— サービスとスパンフィルター付きのサーバー側例外
データベース可観測性
OpenTelemetry トレーススパンから派生した、データベースパフォーマンスに直接アクセスする 4 つのツール。すでに OTel を使用している場合、追加の計装は不要です。
get_databases— インフラストラクチャ全体のすべてのデータベースを検出: DB タイプ、ホスト、スループット (クエリ/分)、p95 レイテンシ、エラー率、依存サービスの数get_database_slow_queries— 実際の最も遅いクエリ実行 (期間順)。完全なトレースにドリルダウンするためのトレース ID 付きget_database_queries— クエリパターンと集計: クエリの実行頻度、平均/p95 期間、エラー率get_database_server_metrics— DB ホスト自体からのサーバー側メトリクス (CPU、接続、バッファヒット率 — DB システムによって異なります)
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_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 ダッシュボードへの直接 URL です。エージェントがリンクを渡し、クリックすればそこに移動します。
ライブ属性キャッシュ。 起動時に、サーバーはデータから実際のログとトレース属性名を取得し、ツールの説明に埋め込みます。これにより、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 のいずれか1つが必須です。
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
パラメータはありません。組織内のすべてのカスタムダッシュボードを、id、name、およびメタデータを含むJSON配列として返します。
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 を参照してください。
