mcpField
L
Last9 MCP Server

Last9 MCP Server

ローカル
last9.ioクラウド・インフラ63今日更新

Last9 MCP Server について

Last9 MCP Serverは、本番環境のオブザーバビリティデータをMCP対応AIアシスタントから調査できるようにします。ブラウザー認証を使うホスト型HTTP接続と、ローカルで動かすSTDIO構成に対応し、ツールセットや読み取り専用モードを設定できます。

主な機能

  1. 01ログ、メトリクス、トレースの検索
  2. 02サービスの状態と依存関係の確認
  3. 03例外とデータベースクエリの調査
  4. 04PromQLクエリの実行
  5. 05公開するツールセットの選択
  6. 06読み取り専用ツールへの制限

活用シーン

  1. 01本番サービスの問題を調査する
  2. 02サービス性能をベースラインと比較する
  3. 03遅いデータベースクエリを特定する
  4. 04インシデント対応中にメトリクスを照会する

MCP 対応

MCPサーバーは、ログ、メトリクス、トレース、例外、データベースクエリ、アラート、デプロイなどを扱うLast9のオブザーバビリティツールをMCPクライアントに公開します。ホスト型HTTPまたはローカルのSTDIOで接続できます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"last9": {
"command": "npx",
"args": [
"-y",
"@last9/mcp-server"
]
}
}
}
起動コマンドnpx -y @last9/mcp-server

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npm@last9/mcp-server

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

翻訳後に原文が更新されています。最新の内容は原文をご確認ください。

Last9 MCP サーバー

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 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 Access に移動します
  2. 書き込み権限を付けて Generate Token をクリックします
  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/DesktopSettings > Developer > Edit Config(claude_desktop_config.json)
CursorSettings > Cursor Settings > MCP > Add New Global MCP Server
WindsurfSettings > Cascade > MCP Marketplace > 歯車アイコン(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 Access のリフレッシュトークン
LAST9_DATASOURCE組織のデフォルトデータソース/クラスター名 — Levitate クラスターを複数使用している場合に便利です
LAST9_API_HOSTapp.last9.ioAPI ホストを上書きします
LAST9_TOOLSETSすべてのツール公開するツールセットをカンマ区切りで指定します(logs、traces、metrics、alerts、dashboards、profiles、grafana、investigate、all)。別名:LAST9_MCP_TOOLSETS
LAST9_MCP_READ_ONLYfalse読み取り専用ツールのみを提供するには true に設定します。読み取り専用モードを参照してください。ブール値以外を指定すると、起動エラーになります。別名:LAST9_READ_ONLY
LAST9_MCP_ALLOW_WRITE_TOOLS—読み取り専用モードでも提供する書き込みツールをカンマ区切りで指定します。別名:LAST9_ALLOW_WRITE_TOOLS
LAST9_MAX_GET_LOGS_ENTRIES5000分割された get_logs リクエストの最大エントリー数
LAST9_USE_LOG_SEARCH_APIfalsetrue に設定すると、クライアント側で分割する代わりに、サーバー側の検索を1回呼び出して get_logs と get_service_logs に応答します
LAST9_DEBUG_CHUNKINGfalsetrue に設定すると、get_logs、get_service_logs、get_traces の分割計画の詳細をログに記録します
LAST9_DISABLE_TELEMETRYtrue内部の OTel トレースを有効にするには false に設定します
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 を指定すると、アラートの読み取りツールに加えて mute_alert_group が提供されます。選択したツールセットに含まれない許可済みの書き込みツールは非表示のままです。
  • --http モードと dump-tools も同じフラグと環境変数に対応しています。go run . dump-tools --read-only を実行すると、読み取り専用のツール一覧が出力されます。
  • 読み取りツールの説明、スキーマ、結果、およびサーバーの指示には、非表示の書き込みツールの名前は記載されません。許可された書き込みツールが、非表示の関連ツールに言及することはあります(create_alert は無効状態のルールを作成し、patch_alert がそれを有効にします)。そのため、こうした関連ツールはまとめて許可してください。

できること

オリエンテーション
  • get_workspace_overview — リクエストでサービスやツールが指定されていない場合に、最初に呼び出すことをおすすめします(指定されている場合は、そのツールに直接進みます)。環境、過去1時間に確認されたシグナル(ログ、トレース、メトリクス)、サービス数とアラートグループ数、発火中のアラート、現在時刻を、低コストの1回の呼び出しで取得できます。その1時間に確認されなかったシグナルでも、より古いデータが存在する場合は引き続きクエリできます。サブコールが失敗した場合、そのフィールドは null になり、errors[] エントリが追加されます。すべてのツールセットで利用できます
  • get_current_time — 現在時刻と、任意の IANA タイムゾーンまたは一般的な略称での last 2h、yesterday、since yesterday 9am IST の絶対的な範囲を取得します。すべてのツールセットで利用できます
サービスの健全性
  • get_service_summary — サービス全体をランキング形式で表示する (service, env) 行です。期間内の request_count、throughput_rpm、HTTP 4xx/5xx 件数、gRPC エラー数を含みます
  • 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_apm_service_deviations — 現在の期間と同じ長さのベースライン期間を比較します。低下/改善、Apdex の整合性確認、最終的な結果(フリート全体または単一サービス)を表示します
  • get_exceptions — サービスとスパンで絞り込める、サーバー側の例外です
データベースのオブザーバビリティ

データベースのパフォーマンスを直接調べる4つのツールです。OpenTelemetry のトレーススパンからデータを取得し、トレースがない場合は CloudWatch などのインフラメトリクスを使用します。すでに OTel を使用している場合、追加の計装は必要ありません。

  • get_databases — インフラ全体のすべてのデータベースを検出します。DB の種類、ホスト、スループット(クエリ/分)、p95 レイテンシ、エラー率、依存サービス数を表示します。また、CloudWatch などのインフラメトリクスからもデータベースを検出します。この場合、トレースメトリクスの代わりにアクティビティ値が表示され、トレースの計装は必要ありません
  • get_database_slow_queries — 実際に実行されたクエリのうち、最も遅いものを実行時間順に表示します。完全なトレースを詳しく調べるためのトレース ID も含みます
  • get_database_queries — クエリパターンと集計値です。クエリの実行頻度、平均/p95 実行時間、エラー率を表示します
  • get_database_server_metrics — DB ホスト自体のサーバー側メトリクスです(CPU、接続数、バッファヒット率。使用する DB システムによって異なります)

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 を設定すると、デフォルトとは異なるデータソース/クラスターを指定できます。

ログ
  • get_logs — 集計、フィルター、フィールド抽出に対応した、JSON パイプラインログのクエリ
  • get_service_logs — サービスの生ログ行。重大度と本文の内容でフィルターできます
  • get_log_patterns — 指定期間内のサービスのログ行をメッセージテンプレートにクラスタリングし、件数、初回/最終確認日時、重大度の内訳、サンプルを表示します
  • get_emerging_log_patterns — ベースライン期間と比較し、新規、増加、減少、または消失したログテンプレートと、両期間の件数を表示します
  • get_log_attributes — 指定期間におけるログスキーマ内の属性のグローバルカタログ
  • get_log_attributes_for_pipeline — 処理中のパイプラインに実際に存在するログフィールド(スコープを絞った検出)。各フィールドの正確な filter_field も表示します
  • get_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_field も表示します
  • get_trace_attribute_values — トレース属性の個別の値。必要に応じてパイプラインで範囲を絞れます
  • get_trace_attribute_deviations — 2 つの範囲指定されたスパン群(低速と高速、エラーと非エラー、または2つの期間)で異なる属性値を順位付けします。相関関係であり、原因を示すものではありません
  • get_trace_waterfall — 1つの正確なトレースを親子関係のウォーターフォールとして表示し、区間の和集合による自己時間、最も遅いスパン、グラフの警告を表示します
変更イベントとアラート
  • get_change_events — デプロイ、設定変更、ロールバックを確認します。インシデントと変更内容を関連付けます
  • analyze_change_impact — 変更によって問題が発生したかを確認します。変更前後のサービスとその直接の呼び出し元を比較し、ゴールデンシグナル、APM とトレース属性の逸脱、新たに発報したアラート、および判定(regression likely / no significant change / insufficient data)を提示します
  • get_alert_groups — メタデータラベル、チーム、ティア、ルール数を含む、設定済みの Compass アラートグループを取得します。ルールが 0 件のグループや、発報していないグループも含みます
  • get_alert_config — アラートルールの設定を取得します。名前、重大度、タイプ、タグで検索できます
  • get_alerts — 指定した時間範囲内に現在発報しているアラートを取得します
  • get_alert_rule_state — 時間範囲内の各アラートルールの過去の発報状態(1/0)を、rule_id ごとにグループ化して取得します。アラートグループ、ルール名、ラベルフィルター、状態で絞り込めます。
  • 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 — チャネルとアラートグループの紐付けを 1 件解除します
  • 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 ツールセットでのみ公開されます。

これらのツールが作成するルール、チャネル、紐付けには、MCP クライアントの名前とバージョンとともに created_via: last9-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 は、ユーザーが対象を指定した場合を除き、マーカーの付いたリソースのみをクリーンアップするようエージェントに指示します。

カスタムダッシュボード
  • list_dashboards — 組織内のすべてのカスタムダッシュボード:ID、名前、メタデータ
  • get_dashboard — IDで指定したダッシュボードの完全な定義(パネルとクエリを含む)
  • validate_dashboard — 保存済みダッシュボードIDまたはインラインの dashboard_definition に対して、≤24時間の期間で読み取り専用のリント、実行、分類を行います。ダッシュボードの作成や更新は行いません
  • create_dashboard — 新しいカスタムダッシュボードを一度作成します(パネル、クエリ、メタデータ)。IDが返されたら、update_dashboard で調整してください。
  • update_dashboard — IDで指定した既存のダッシュボードを調整します(全体置換。読み取り専用のシステムダッシュボードではエラーが返されます)
  • delete_dashboard — IDで指定したカスタムダッシュボードを削除します
  • list_dashboard_snapshots — ダッシュボードの固定時点スナップショット(メタデータのみ)
  • get_dashboard_snapshot — RCA/共有可能なビュー向けの、パネルデータを含む完全な固定スナップショット
  • delete_dashboard_snapshot — IDで指定した固定スナップショットを削除します
継続的プロファイリング

組織で継続的プロファイリングを有効にする必要があります。まず get_profile_services でサービスを確認し、その後フレームグラフまたは関数ランキングを取得してください。

  • get_profile_services — 期間内にプロファイリングデータがあるサービス(クエリを実行する前のインデックス)
  • get_flamegraph — 1つのサービスのネストされたフレームグラフツリー(デフォルトは cpu。alloc、wall も指定可能)
  • get_top_functions — 1つのサービスの、自己サンプル数に基づくホットな関数のランキング
  • get_profile_summary — 1つのサービスのプロファイルを自然言語で簡潔にトリアージします
Grafana ダッシュボード

組織の Grafana インスタンスに対する読み取り専用ツールです(Last9 の Grafana プロキシ経由)。認証情報のフィールドがモデルに返されることはありません。LAST9_TOOLSETS=grafana を設定して有効にしてください(または、すべてのツールを利用する場合はツールセットを未設定のままにします)。

  • grafana_search_dashboards — タイトルの部分一致でダッシュボードを検索します(ページネーション対応。上限に達すると truncated: true)
  • grafana_get_dashboard — UIDで指定したダッシュボードの概要(パネル、変数、PromQLターゲット)。Grafanaの生JSONを取得するには full_json=true を指定します
  • grafana_list_folders — フォルダーのツリー
  • grafana_list_folder_dashboards — 1つのフォルダー内のダッシュボード(ページネーション対応)
  • grafana_list_datasources — 認証情報を含まないデータソース一覧
あいまいな名前の解決
  • did_you_mean — エージェントがエンティティ名を特定できない場合、カタログから最も近い候補を返します(サービス、環境、ホスト、データベース、K8sデプロイメント/名前空間、ジョブ)。類似度スコア付きで最大3件の候補を返します。名前の検索結果が空の場合、サーバーはほとんどのツールの実行前にこの処理を自動で呼び出します。
サービスプロファイル
  • get_service_profile — クエリを実行する前に、サービスのテレメトリの実態を確認できます。存在するシグナル、言語とランタイム、デプロイ環境、ログの形式、適用できる場合は推奨される取り込み修正を確認できます。トレースがないサービスではエージェントがトレースツールを使わずに済みます。また、SeverityText が空の場合に、重大度でフィルタリングして何も見つからなくなるのではなく、ログ本文から重大度を解析できます。

仕組み

すべての応答にディープリンクが含まれます。 すべてのツールは deep_link フィールドを返します。これは、該当するクエリと時間範囲を表示する Last9 ダッシュボードへの直接 URL です。エージェントからリンクを受け取り、クリックすれば、すぐに表示できます。

ツールセット。 デフォルトでは、サーバーはすべてのツールを公開します。調査(ログ/トレース/メトリクス/プロファイル)のみが必要な自動化ホストは、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 を一度も呼び出さないエージェントでも、適切なクエリを作成できます。組織固有のフィールドは 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": {}}'

有効なセットの組み合わせごとに専用のサーバーが用意され、初回リクエスト時に構築されます(数十ミリ秒)。その後、シャットダウンまで保持されます。起動時のセットをそのまま指定したリクエストは、起動時のサーバーを再利用します。削除処理はありません。名前付きツールセットのみが受け付けられるため、キャッシュに保持されるサーバーは、ツールセットの組み合わせごとに最大 1 つです(現在は 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 は、互換性のためにのみ受け付けます。
  • since yesterday 9am IST のような表現は、get_current_time を使って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}])を返します。サブ呼び出しに失敗したフィールドは、0 や false ではなく、不明を表す null になります。プローブは --toolsets によって絞り込まれません。ツールセットは提供するツールをフィルターし、APIトークンのスコープはサーバーが読み取れるデータを指定します。

get_current_time
  • range(文字列、任意):last 2h、past 30 minutes、last 7d(s、m、h、d = 24h、w = 7d、最大366d)、today、yesterday、since <point>、<point> to <point>。point にはRFC3339形式、または today / yesterday / 曜日(monday、mon:今日を含む直近の該当日)/ YYYY-MM-DD(任意で 9am、9:30pm、14:30 を指定)を指定できます。末尾のタイムゾーンは両方の境界値に適用され、timezone より優先されます。それ以外の場所にタイムゾーンがある場合はエラーになります。現在時刻のみを取得する場合は省略します。
  • 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} として返します。local はUTC以外のタイムゾーンの場合のみ表示されます。

get_exceptions
  • limit(整数、任意):例外の最大件数。デフォルト:20。
  • lookback_minutes(整数、任意):デフォルト:60。
  • start_time_iso / end_time_iso(文字列、任意):絶対時間範囲。
  • service_name(文字列、任意):サービスでフィルターします。
  • span_name(文字列、任意):スパン名でフィルターします。
  • 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
  • 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_apm_service_deviations
  • service_name(文字列、任意):フリート全体を対象にする場合は省略します。1 つのサービスとそのオペレーションの相関を対象にする場合は指定します。
  • lookback_minutes(整数、任意):現在のウィンドウです。デフォルト:60。
  • start_time_iso / end_time_iso(文字列、任意):現在のウィンドウを明示的に指定します。
  • baseline_start_time_iso / baseline_end_time_iso(文字列、任意):ベースラインを明示的に指定します。デフォルトでは、直前の同じ長さのウィンドウになります。
  • datasource(文字列、任意):比較対象を 1 つのデータソースに限定します。
  • env(文字列、任意):デフォルトは prod です。
  • max_services / max_operations(整数、任意):デフォルトはそれぞれ 10、最大 10 です。
get_databases
  • env(文字列、任意):環境でフィルタリングします。正規表現を使用できます。デフォルト:すべて。
  • lookback_minutes(整数、任意):デフォルト:60。ウィンドウは 7 日を超えることはできません。
  • 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_name(string、必須)
  • lookback_minutes(integer、任意):デフォルト:60。
  • limit(integer、任意):デフォルト:20。
  • env(string、任意)
  • severity_filters(array、任意):例:["error", "warn"]。OR ロジック。
  • body_filters(array、任意):例:["timeout", "failed"]。OR ロジック。
  • start_time_iso / end_time_iso(string、任意)
  • index(string、任意)

複数のフィルター種別は AND で組み合わせます。各配列の内部では OR が適用されます。 まず get_logs を使って広範囲の集計件数を取得し、サービス/環境/インデックスを絞り込み、対象を少数のサンプルに絞ってから get_service_logs を使ってください。

get_log_patterns
  • service_name(string、必須)
  • env(string、任意)
  • start_time_iso / end_time_iso(string、任意)
  • lookback_minutes(integer、任意):デフォルト:60。
  • severity_filters / body_filters(array、任意):get_service_logs と同様に OR ロジックです。get_service_profile で severity_set が all と報告された場合にのみ severity_filters を設定してください。none または partial の場合、severity が本文に含まれる行が除外されます。
  • index(string、任意)
  • sample_size(integer、任意):対象期間からサンプリングする行数。新しい順です。デフォルト:1000、最大:5000。
  • top_n(integer、任意):件数順に返すテンプレート数。デフォルト: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 が設定されます。patterns リストが空の場合、sample_limit_reached が false のときに限り一致するものがありません。true の場合は検索が早期終了しており、一致する行を見落としている可能性があります。

get_emerging_log_patterns

get_log_patterns のすべてのパラメーターを受け取ります(時間範囲は現在の対象期間です)。さらに次のパラメーターを受け取ります。

  • baseline_start_time_iso / baseline_end_time_iso(string、任意):両方を設定するか、どちらも設定しないでください。デフォルトは、現在の対象期間の直前にある同じ長さの期間です。
  • min_count(integer、任意):変化したパターンについて、件数が多い方の対象期間で必要となる行数。new/increased の場合は現在の対象期間、decreased/disappeared の場合はベースラインです。デフォルト:3(sample_size の方が小さい場合は sample_size)、最大:sample_size。
  • change_factor(number、任意):両方の対象期間で確認されたパターンが満たす必要のある頻度比。1より大きい値を指定します。increased の場合はこの値以上、decreased の場合はこの値の逆数以下となる必要があります。デフォルト:2。

両方のしきい値を満たす必要があります。そのため、頻度が change_factor 倍変化していない高頻度のテンプレートは報告されません。変化したテンプレート(new、increased、decreased、disappeared)のみを、current と baseline の件数とともに返します。unchanged_patterns は両方の対象期間に存在し、変化が change_factor 未満だったテンプレート数を示します。below_min_count_patterns は、min_count 未満の行数だったため除外された変化の数を示します。両方のサンプルに一致する行がすべて含まれている場合、頻度は1分あたりで比較されます。上限に達したサンプルでは、正確な total_matching_lines から1分あたりの頻度が推定されます。それ以外の場合はサンプル内の割合で比較されます。このとき increased/decreased は頻度ではなく構成比の変化を表します(comparison_basis)。patterns リストが空の場合、両方のしきい値を超える変化はありません。より小さな変化は below_min_count_patterns に集計されます。また、sample_limit_reached が設定された対象期間では、期間全体ではなくサンプル同士を比較します。

get_log_attributes
  • lookback_minutes(integer、任意):デフォルト:15。
  • start_time_iso / end_time_iso(string、任意)
  • region(string、任意)
  • index(string、任意)
get_log_attributes_for_pipeline
  • pipeline(array、必須):検出対象を絞り込むための先行フィルターステージです。例:[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}]。
  • lookback_minutes(integer、任意):デフォルト:15。
  • start_time_iso / end_time_iso(string、任意)
  • region(string、任意)
  • index(string、任意)
get_drop_rules

パラメーターはありません。GET /otel_settings/drop?region=... を使用してドロップルールの一覧を取得します。

add_drop_rule
  • name(string、必須)
  • filters(array、必須):各フィルターには 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

広範な検索や集計に使用します。トレースIDを正確に検索するには、get_service_traces を使用してください。

  • tracejson_query(array、必須)
  • start_time_iso / end_time_iso(string、任意)
  • lookback_minutes(integer、任意):デフォルト:60。
  • limit(integer、任意):デフォルト:5000。
get_service_traces

trace_id または service_name のいずれか一方を必ず指定してください。

  • trace_id(string、任意):デフォルトの検索期間:72時間。
  • service_name(string、任意):デフォルトの検索期間:60分。
  • lookback_minutes(integer、任意)
  • start_time_iso / end_time_iso(string、任意)
  • limit(integer、任意):デフォルト:10。
  • env(string、任意)
get_trace_attributes
  • lookback_minutes(integer、任意):デフォルト:15。
  • start_time_iso / end_time_iso(string、任意)
  • region(string、任意)
get_trace_attributes_for_pipeline
  • pipeline(array、必須):検出対象を絞り込むための先行フィルターステージです。例:[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}]。
  • lookback_minutes(integer、任意):デフォルト:15。
  • start_time_iso / end_time_iso(string、任意)
  • region(string、任意)
get_trace_attribute_values
  • tag_name(string、必須):get_trace_attributes で取得した属性名(例:resource_department または attributes['http.method'])。
  • pipeline(array、任意):値の対象を絞り込むための先行フィルターステージです。全体の値を対象にする場合は省略してください。
  • lookback_minutes(integer、任意):デフォルト:15。
  • start_time_iso / end_time_iso(string、任意):履歴検索のRFC3339形式の範囲です。指定すると lookback_minutes より優先されます。
  • region(string、任意)
get_trace_attribute_deviations
  • comparison_mode(string、必須):latency、errors、または time。
  • service_name(string、必須)
  • environment(string、必須):deployment.environment の完全一致する値。
  • operation(string、任意)
  • filters(array、任意):トレースJSONのフィルター条件。
  • candidate_attributes(array、任意):最大8個。範囲を限定して検出する場合は省略してください。
  • latency_threshold_ms(number、任意):latency モードでは必須です。他のモードでは指定できません。
  • start_time_iso / end_time_iso(string、任意)
  • lookback_minutes(integer、任意):デフォルト:15。最大:15。
  • baseline_start_time_iso / baseline_end_time_iso(string、任意):time モードでは必須です。対象期間と重複せず、期間の長さが同じである必要があります。
  • minimum_cohort_size(integer、任意):デフォルト:100。最小:20。
  • minimum_value_support(integer、任意):デフォルト:20。最小:10。
  • limit(integer、任意):デフォルト:10。最大:10。

コンパニオンバックエンド機能を有効にする必要があります。

get_trace_waterfall
  • trace_id(文字列、必須)
  • environment(文字列、任意)
  • start_time_iso / end_time_iso(文字列、任意)
  • lookback_minutes(整数、任意):デフォルト:4320(72 時間)。
  • selected_span_id(文字列、任意):そのスパンの属性、イベント、リンクのみを返します。
  • 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 件の呼び出し元のうち 1 つで、エラー率が 1 パーセントポイント以上上昇、p95 が 40%以上上昇、またはスループット(rpm)が 50%以上低下した場合(変更前に 100 件以上のリクエストがあり、スループットの場合は変更後にも 100 件以上あることが条件です。p95 は latency_env のリクエストのみを対象とします)。変更後にアラートの発火が始まった場合(アラートグループ名、または service、service_name、service.name ラベルで大文字と小文字を区別せずに照合し、該当しない場合はアノテーションで照合します。summary などの自由記述テキストは対象外です。env が指定されている場合、大文字と小文字を無視して別の環境がラベル付けされたアラートは除外し、環境がラベル付けされていないアラートには env_match: unlabelled を設定します)。または、get_apm_service_deviations で回帰が見つかった場合です。変更後のウィンドウが 5 分未満の場合(変更が未来の場合も含む)、サービスのリクエスト数が少なすぎる場合、またはゴールデンシグナル、直接の呼び出し元の検索、アラート、get_apm_service_deviations のいずれかが全体またはいずれかのクエリで失敗した場合(deviations.apm.unavailable に一覧表示されたクエリを含む)は、insufficient data となります。証拠が不足している場合に no significant change となることはありません。また、回帰が見つかった場合は、何が失敗したかも示されます。no significant change は有効な結果であり、失敗ではありません。トレース属性の偏差は env が設定されている場合にのみ実行され、前後それぞれ最大 15 分を対象とします。これらは判定の説明に使われますが、判定自体は決めません。そのため、スキップまたは取得に失敗しても判定は変わりません。各リストは最大 10 項目で、除外された件数も報告されます。上流呼び出しに失敗した場合、そのセクションにのみ error が設定されます。ゴールデンシグナルのレイテンシは、両方のウィンドウで 1 つの環境から取得され、その環境は latency_env に示されます。env の指定がない場合は、最も処理量の多い環境が使われます。ゴールデンシグナルのエラー率は 5xx と gRPC エラーをカウントします。deviations.apm はエラーステータスのスパンと 429 もカウントします。呼び出し元のシグナルはその呼び出し元自身のサーバースパンに基づくため、クライアントのみの呼び出し元では rpm が 0 になります。

get_alert_groups

changeboard/ラベル網羅率監査用の、設定済みCompassアラートグループ一覧です。ルールが0件のグループと、発報していないグループも含まれます。PromQLは返しません。

  • alert_group_name / alert_group_type / data_source_name(string、任意):大文字と小文字を区別せず、部分一致で検索します。
  • team / tier(string、任意):設定済みメタデータを大文字と小文字を区別せず、完全一致で検索します。
  • label_key + label_value(string、任意):両方を指定する必要があります。metadata.labels の1つのペアに対して、キーと値の両方を大文字と小文字を区別せず、完全一致で検索します。

id、name、type、entity_class、team、tier、metadata.labels、ルール件数を含む、コンパクトなJSON {"count":N,"groups":[...]} を返します。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エポック値です(開始時刻を含みます)。
  • end_time(integer、必須):範囲の終了時刻を示すUnixエポック値です(終了時刻を含みます)。
  • 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(デフォルト)はアラートグループへの添付ごとに1行を返します。id は detach_notification_channel で使用する添付IDです。channels は組織のチャンネル(id、name、type、send_resolved、created_via)を返します。id は attach_notification_channel で使用するチャンネルIDです。宛先、ヘッダー、証明書は返しません。

設定済みの通知チャンネル(Slack、PagerDuty、メール、Webhookなど)をTSVテーブルで返します。添付行(service_fqid が設定済み)は global が false、services が - です。services にはレガシーサービスの紐付けのみが一覧表示されます。添付行の send_resolved は行に保存されたデフォルト値であり、配信時に使用される値ではありません。解決通知にはチャンネル独自の send_resolved(scope=channels)が適用されます。どちらのスコープにも created_via が含まれます(MCPエージェントが作成した行は 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、必須):アラートグループ/エンティティの UUID。
  • expression(string、必須):KPI の正確な名前で指定したインジケーターを使う算術式です。例:errors / requests。インジケーターは最大 3 つまでです。スペース、ドット、ダッシュを含む名前は、そのまま記述してください(Test Alert / errors)。create_alert で保存される名前と完全に一致させてください。
  • indicators_used(object、必須、空でないこと):インジケーター名と、entity_id に属する KPI UUID の対応付けです。各 KPI の正確な名前を使用してください。このドライランでは任意の名前を受け付けますが、create_alert と update_alert では、バインドされた KPI の名前と一致しない expression_args のキーは拒否されます。

算術式のみがチェックされます(adaptive_std_cmp(...) でラップせず、内部のメトリック式を渡してください)。condition/alert_condition はチェックされません。時系列が少なくとも 1 つ存在するかのチェックは、複数のインジケーターを使用する場合にのみ実行されます。

{"valid":true} または {"valid":false,"reason":"..."} を返します。式が無効でも、通常の結果として返され、ツールエラーにはなりません。

describe_alert_chart

読み取り専用です。対応する Discover チャート上でアラート対象となるシグナル(key、unit、eval_query、query_kind)を一覧表示します。Viewer ロールのトークンは拒否されます。

  • surface(string、必須):discover-service または discover-exceptions。カスタムダッシュボードを含むその他の値は、API の呼び出し前に拒否されます(代わりに KPI を指定して create_alert を使用してください)。
  • chart_key(string、必須):例:apdex、error_rate、response_time、exception_count。
  • service_name(string、必須)
  • env(string、任意)
  • attributes(object、任意):このツールが報告するキー名を使った追加の識別ディメンションです。
create_alert

既存のアラートグループにルールを作成します。常に無効状態で作成されます(is_disabled=false が渡されても下書きになります)。最初に recommend_alert_config を呼び出し、ユーザーの確認後にのみ patch_alert の is_disabled=false で有効化してください。一度だけ作成し、返されたルール ID を保持してください。アラートグループですでに使用されている rule_name(大文字と小文字を区別しない)が指定された場合は、既存のルール ID を示して拒否され、何も作成されません。

  • entity_id(string、必須):アラートグループ/エンティティの UUID。
  • alert_rule(object、必須):primary_indicator と expression_args を含む、完全に型指定されたルール本文です。これらはエンティティの実在する KPI にバインドしてください。各 expression_args のキーは、バインド先の KPI の正確な名前である必要があります(x のようなプレースホルダーは不可)。primary_indicator と expression でもこれらの名前を使用します。静的ルールでは、condition、alert_condition、eval_window(0~60 分)が必須です。適応型ルールでは、expression に adaptive_std_cmp(<primary_indicator>, sensitivity, window) を指定します。この場合、3 つのフィールドは任意です(デフォルト値は expr > 0、count_true(result) >= 1、1)。algorithm は設定できません。対応担当者向けのコンテキストは properties(description、runbook、annotations、query_mode)に指定します。

通知のルーティングはルールではなく、アラートグループで設定します。

create_alert_from_chart

describe_alert_chart で説明されるチャートから、静的しきい値ルールを作成します。ルールは有効状態で作成され、条件を満たすとすぐに発火します。

  • surface/chart_key/service_name/signal_key/name(string、必須)
  • env(string、任意)
  • attributes(object、任意)
  • threshold(number、任意):シグナルの単位で指定します。0 以上である必要があります。apdex などスコア単位のシグナルでは、値を明示的に指定する必要があります。
  • threshold_operator(string、任意):>(デフォルト)、<、>=、<=、==、!=。
  • eval_window(integer、任意):分単位。1~60。デフォルト:5。
  • bad_minutes(integer、任意):1~eval_window。デフォルト:3。
  • severity(string、任意):breach または threat。
  • description(string、任意)
  • group_id(string、任意):通常は省略します。
update_alert

ルールの評価設定を完全に置き換えます。最初に get_alert_config または get_entity_alert_rules でルールを取得してください。ルールが存在しない場合、または別のアラートグループに属している場合は、何も変更せずに処理を拒否します。ルールがソフト削除されて再作成されることがあるため、その後は返された置換後の ID を使用してください。

  • entity_id(string、必須)
  • id(string、必須):アラートルールの UUID。
  • alert_rule(object、必須):完全な設定です。create_alert と同じ形式です。
patch_alert

ルール ID を維持したまま部分的に変更します。少なくとも 1 つ変更する必要があります。ルールが存在しない場合、または別のアラートグループに属している場合は、何も変更せずに処理を拒否します。

  • entity_id(string、必須)
  • id(string、必須):アラートルールの UUID。
  • is_disabled(boolean、任意):false は有効化し、true は一時停止します。
  • mute_until(integer、任意):Unix エポックの期限です。0 はミュートを解除します。
  • properties(object、任意):description、runbook、annotations、query_mode。指定したフィールドはそれぞれ保存済みの値を置き換えます。省略または空欄のフィールドは、保存済みの値を維持します。annotations はマップ全体を置き換えるため、維持するにはすべてのキーを送信してください。{} を指定すると消去されます。
  • recurring_mute_schedule(object、任意):週次スケジュールを置き換えます。enabled(既定値は false)、timezone(IANA 名、必須)、および weekdays(sun~sat)と 24 時間制の HH:MM 形式の start_time/end_time を指定する windows(1~20 件)を含みます。終了時刻が開始時刻以前の場合は、翌日に終了します。維持するにはすべてのウィンドウを送信してください。
  • clear_recurring_mute_schedule(boolean、任意):スケジュールを完全に削除します。recurring_mute_schedule と同時には指定できません。ウィンドウを保存したままにする enabled=false とは異なります。

Viewer ロールのユーザーが変更できるのは mute_until のみです。グループまたはエンティティがミュートされている間は、ルール単位のミュート変更は拒否されます。変更内容は get_entity_alert_rules で確認してください。この関数では mute_until、recurring_mute_schedule、properties が表示されます。

delete_alert

ルールを完全に削除します。最初に get_alert_config で確認し、ユーザーから明示的な承認を得てください。ルールが存在しない場合、または別のアラートグループに属している場合は、何も削除せずに処理を拒否します。

  • entity_id(string、必須)
  • id(string、必須):アラートルールの UUID。
mute_alert_group

グループ内の現在および将来のすべてのルールをミュートします。1 つのルールだけをミュートするには、mute_until を指定して patch_alert を使用してください。エディターアクセスが必要です。

  • entity_id(string、必須):アラートグループ/エンティティの UUID。
  • until(integer、必須):ミュートが終了する Unix エポック秒です。0 はミュートを解除します。-1 などの負の値を指定すると、無期限にミュートします。
acknowledge_alert

発報中のアラートの担当になったり、担当を解除したりします。アラートの解決やミュートは行いません。すでに担当しているアラートを確認しても、安全な何もしない操作になります。ack は、直近 1 時間以内に get_alerts がそのアラート(3 つすべての ID が一致するもの)を返していない場合、何も記録せずに処理を拒否します。

  • alert_group_id/rule_id/rule_type(string、必須):get_alerts のアラートからコピーしてください。
  • action(string、任意):ack(既定値)または unack。担当者または組織の管理者のみが unack を実行できます。
  • mute_until(integer、任意):ack のみ。mute_alert_group または patch_alert ですでに適用したミュートを記録します。ミュート自体は行いません。
reassign_alert

すでに担当者がいるアラートを別のユーザーに再割り当てします。担当者がいない場合は、先に確認してください。アラートに担当者がおらず、再割り当てが行われなかった場合は、直近 1 時間以内に 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 専用です。最大 64 KiB の PEM CA 証明書を 1 つ指定します。
  • send_resolved(boolean、任意):デフォルト:true。
attach_notification_channel

既存のチャネルを 1 つのアラートグループにルーティングします。冪等です。関連付ける際、チャネルの配信設定(ヘッダー、証明書、メンション)がコピーされます。後からチャネルの設定を変更した場合は、再度関連付けてください。

  • channel_id(integer、必須):チャネル ID(get_notification_channels の scope=channels で取得)です。関連付け ID ではありません。
  • alert_group_id(string、必須):get_alert_groups で取得します。
  • severity(string、必須):breach、threat、または both。both を指定すると 2 つの関連付けが作成されます。2 つ目が失敗した場合、1 つ目の関連付けは維持され、再試行する重大度がエラーに示されます。
detach_notification_channel

1 つの関連付けを解除します。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(string、必須):検索する名前です。部分名、誤記、省略形を指定できます。
  • type(string、任意):エンティティタイプを絞り込みます。service、environment、host、database、k8s_deployment、k8s_namespace、job を指定できます。

類似度スコア付きで、最も近い候補を最大 3 件返します。エンティティ名が不確かな場合は、ツールを呼び出す前に使用してください。前回の呼び出しで結果が空だった場合は、再試行する前にこれを試してください。

get_service_profile
  • service_name(string、必須):テレメトリプロファイルを取得するサービスです。
  • datasource(string、任意):データソース名です。デフォルトを使用する場合は省略してください。

調査の概要に続いて、プロファイル全体を未加工の JSON として返します。内容は、シグナルの有無(logs/traces/metrics が present、absent、unknown のいずれか)、言語とランタイム、デプロイ環境、ログの signal_shape(log_format、severity_set、level_field)、および該当する場合は推奨される取り込みの修正です。上流から導出され、約 15 分の TTL でキャッシュされます。

サービスにスコープを限定した調査を行う前に呼び出し、ツールの選択をサービスの実際のテレメトリに合わせてください。traces が absent の場合はトレース用ツールを省略します。また、severity_set が none または partial の場合は、severity_filters を使わず、ログ本文の level_field から重大度を解析します。v1 では metrics は常に unknown で、dependencies は未入力です。logs と traces がどちらも absent の場合は、そのサービスが監視対象外だと結論づける前に、did_you_mean で名前を確認してください。

list_dashboards

パラメーターはありません。組織内のカスタムダッシュボードをすべて、id、name、メタデータを含む JSON 配列として返します。

get_dashboard
  • id (string, required):ダッシュボードの UUID。
  • region (string, optional):パネルクエリの実行に使用するリージョン。デフォルトは、設定済みのデータソースのリージョンです。
validate_dashboard

読み取り専用です。ダッシュボードの作成や更新は行いません。dashboard_id または dashboard_definition のいずれか一方を指定してください。

  • dashboard_id (string, optional):検証する保存済みダッシュボードの UUID。
  • dashboard_definition (object, optional):インラインの未保存ダッシュボード本文(真のドライラン)。
  • start_time_iso / end_time_iso (string, optional):検証期間(RFC3339)。24 時間以内である必要があります。
  • region (string, optional):パネルクエリの実行に使用するリージョン。

dashboard_validation/v1 を返します。パネルごとのリンティングと実行分類(data / no_data / invalid / error)が含まれます。初日の空の結果は、診断プローブを行わず valid_no_data に分類されます。

create_dashboard

新規作成専用です。この呼び出しが dashboard.id を返した後は、update_dashboard で編集してください。パネルの追加、削除、修正のために再度作成しないでください。

  • dashboard (object, required):name と panels[] を含むダッシュボード定義。各パネルには name、version、layout(x、y、w、h)、visualization.type、queries[] が必要です。
  • metadata (object, optional):ダッシュボードのメタデータ。_category と _type フィールドを指定します(例:{"_category":"custom","_type":"metrics"})。
update_dashboard

作成後はこちらを優先してください。ID を指定して全体を置き換えます(本文は create と同じです)。

  • id (string, required):更新するダッシュボードの UUID。
  • dashboard (object, required):置き換えるダッシュボード本文全体(create と同じ形式)。
  • metadata (object, optional):置き換えるメタデータ。読み取り専用のシステムダッシュボードでは 403 エラーが返されます。
delete_dashboard
  • id (string, required):削除するダッシュボードの UUID。読み取り専用のシステムダッシュボードは削除できません。
list_dashboard_snapshots
  • dashboard_id (string, required):スナップショットを一覧表示するダッシュボードの UUID。

メタデータのみ(id、name、expires_at など)を返します。固定されたパネルデータを取得するには get_dashboard_snapshot を使用してください。

get_dashboard_snapshot
  • id (string, required):スナップショットの UUID。

dashboard_definition、panel_data、time_range、variables を含む、固定されたスナップショット全体を返します。

delete_dashboard_snapshot
  • id (string, required):削除するスナップショットの UUID。
get_profile_services
  • lookback_minutes / start_time_iso / end_time_iso (optional):期間。ルックバックまたは明示的な ISO 境界を指定してください(デフォルトは 60m)。
  • region (string, optional):リージョンの上書き。

指定期間にプロファイリングデータがあるサービスを返します。get_flamegraph / get_top_functions / get_profile_summary を呼び出す前に実行してください。

get_flamegraph
  • service (string, required):get_profile_services から取得したサービス名。
  • profile_type (string, optional):cpu(デフォルト)、alloc、または wall。期間を比較する場合は、タイプを固定してください。
  • env / cluster / namespace / runtime (string, optional):スコープフィルター。
  • limit (number, optional):集約されたスタック行の最大数(デフォルトは 1000、最大は 10000)。
  • lookback_minutes / start_time_iso / end_time_iso / region (optional)。

ネストされたフレームグラフツリー(name / value / self / children)を返します。truncated: true は、API の行数上限に達したことを意味します。

get_top_functions

get_flamegraph と同じフィルターを使用します。自己サンプル数に基づき、負荷の高い関数を順位付けして返します。結果が切り詰められる場合があります。truncated を確認してください。

get_profile_summary

get_flamegraph と同じフィルターを使用します。サービスのプロファイルを自然な文章で簡潔にトリアージした結果を返します。

grafana_search_dashboards
  • query (string, optional):タイトルの部分文字列。空の場合は広範囲に一覧表示します(上限 5,000 行)。

uid、title、uri、url、type、tags を含む {"dashboards":[…], "truncated":bool} を返します。grafana_get_dashboard では uid を使用してください。

grafana_get_dashboard
  • uid (string, 必須):Grafana ダッシュボードの UID。
  • full_json (boolean, 任意):true の場合、フィルタリングされた概要ではなく、Grafana の生の JSON を返します。

デフォルトの概要には、バージョン、タグ、テンプレート変数、各パネルのタイプ/データソース/gridPos/PromQL ターゲットが含まれます。不明なプラグインのパネルタイプは unsupportedPanelTypes に表示されます。

grafana_list_folders

パラメーターはありません。フォルダーのツリーを返します。

grafana_list_folder_dashboards
  • folder_uid (string, 必須):Grafana フォルダーの UID。

そのフォルダー内のダッシュボードについて、{"dashboards":[…], "truncated":bool} を返します(ページネーションを使用し、最大 5,000 件)。

grafana_list_datasources

パラメーターはありません。データソースの安全な情報(認証情報のフィールドは含まれません)を返します。


テスト

統合テストのセットアップと手順については、TESTING.md を参照してください。


MseeP.ai セキュリティ評価バッジ

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。