Grafana

公式

Grafanaインスタンス内のダッシュボードを検索し、インシデントを調査し、データソースにクエリを実行します。

Grafana MCPで何ができますか?

  • ダッシュボードの検索と確認 — タイトル、フォルダー、タグ、スター付きの状態でダッシュボードを検索し、JSON全体ではなく、簡潔な概要や特定のプロパティを取得します。
  • PrometheusとLokiへのクエリ — PromQLによるメトリクスクエリ、LogQLによるログまたはメトリクスクエリを実行し、メトリクスのメタデータ、ラベル値、検出されたログパターンも取得します。
  • SQLなどのデータソースへのクエリ — ClickHouse、Snowflake、Athena、MySQL、PostgreSQL、MSSQL、BigQueryに対してSQLを実行するか、InfluxDB、CloudWatch、Graphite、Elasticsearchにクエリを実行します。
  • アラート管理 — アラートルールと発火状態の一覧表示、ルールの作成や更新、通知ポリシー、コンタクトポイント、時間間隔の確認を行います。
  • インシデントとオンコール対応 — Grafana Incidentのレコードを検索・作成し、OnCallのスケジュール、シフト、現在のオンコール担当者、アラートグループを確認します。
  • パネルとダッシュボードのレンダリング — レポート用に、カスタムのサイズ、時間範囲、テーマ、変数を指定して、ダッシュボードまたはパネルのPNG画像を生成します。

ドキュメント

Grafana MCP server

Unit Tests Integration Tests E2E Tests Go Reference MCP Catalog

Grafana 用の Model Context Protocol (MCP) サーバーです。

Grafana インスタンスとその周辺エコシステムにアクセスできます。

クイックスタート

uv が必要です。以下を MCP クライアントの設定(例: Claude Desktop、Cursor)に追加してください。

{
  "mcpServers": {
    "grafana": {
      "command": "uvx",
      "args": ["mcp-grafana"],
      "env": {
        "GRAFANA_URL": "http://localhost:3000",
        "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>"
      }
    }
  }
}

Grafana Cloud の場合は、GRAFANA_URL をインスタンス URL(例: https://myinstance.grafana.net)に置き換えてください。Docker、バイナリ、Helm など、その他のインストール方法については使用方法を参照してください。

要件

  • すべての機能を利用するには Grafana バージョン 9.0 以降が必要です。 API エンドポイントが不足しているため、特にデータソース関連の操作など、一部の機能はそれ以前のバージョンでは正しく動作しない場合があります。

機能

MCP サーバーで現在利用できる機能は以下のとおりです。この一覧は情報提供のみを目的としており、今後の機能に関するロードマップや確約を示すものではありません。

ダッシュボード

  • ダッシュボードを検索: タイトル、フォルダー UID、タグ、またはスター付きかどうかでダッシュボードを検索します
  • UID でダッシュボードを取得: 一意の識別子を使ってダッシュボードの詳細を取得します。現在のダッシュボードの代わりに保存済みスナップショットを読み込むには、オプションの version を渡します。警告: 大きなダッシュボードはコンテキストウィンドウを大量に消費する可能性があります。
  • ダッシュボードのバージョンを一覧表示: ダッシュボードの保存済みバージョンを、バージョン番号、作成者、タイムスタンプ、保存メッセージなどの簡潔なメタデータとして一覧表示します
  • ダッシュボードの概要を取得: コンテキストウィンドウの使用量を抑えるため、完全な JSON を取得せずに、タイトル、パネル数、パネルの種類、変数、メタデータなどの簡潔な概要を取得します
  • ダッシュボードのプロパティを取得: JSONPath 式(例: $.title、$.panels[*].title)を使ってダッシュボードの特定部分だけを取得し、必要なデータに絞ることでコンテキストウィンドウの消費を抑えます
  • ダッシュボードを更新または作成: 既存のダッシュボードを変更するか、新しいダッシュボードを作成します。警告: ダッシュボードの完全な JSON が必要なため、コンテキストウィンドウを大量に消費する可能性があります。
  • ダッシュボードにパッチを適用: 完全な JSON を必要とせずにダッシュボードへ特定の変更を適用し、対象を絞った変更でコンテキストウィンドウの使用量を大幅に削減します
  • パネルのクエリとデータソース情報を取得: ダッシュボード内のすべてのパネルから、タイトル、クエリ文字列、データソース情報(利用可能な場合は UID と種類を含む)を取得します

パネルクエリの実行

注: パネルクエリ実行ツールはデフォルトで無効です。有効にするには、runpanelquery を --enabled-tools フラグに追加してください。

  • パネルクエリを実行: カスタムの時間範囲と変数の上書きを指定して、ダッシュボードパネルのクエリを実行します。Infinity パネルは、クエリで backend または jq-backend パーサーを使用している場合に実行されます(Google Sheets クエリは常に該当します)。デフォルトの simple パーサーと UQL、GROQ パーサーはブラウザー内でのみ動作します。kniepdennis-neo4j-datasource プラグインの Neo4j パネルは、読み取り専用セッションを開いてプラグイン経由で Cypher クエリを実行します。Elasticsearch パネルでは、Grafana と同様に lucene 形式で Lucene クエリ内の変数を展開し、自動日付ヒストグラムには $__interval と同じ間隔を使用します。

コンテキストウィンドウの管理

ダッシュボードツールには、コンテキストウィンドウの使用量を効果的に管理するための方法がいくつか追加されました(issue #101):

  • ダッシュボードの概要を確認し、変更を計画するには get_dashboard_summary を使用
  • ダッシュボードの特定部分だけが必要な場合は、JSONPath とともに get_dashboard_property を使用
  • ダッシュボードの完全な JSON が必要な場合を除き、get_dashboard_by_uid は使用しない

データソース

  • データソース情報を一覧表示・取得: 設定済みのすべてのデータソースを表示し、それぞれの詳細情報を取得します。
    • 対応するデータソースの種類: Prometheus、Loki、ClickHouse、CloudWatch、Elasticsearch、OpenSearch、Snowflake、Athena。
  • データソースリソース: アクセス可能な各データソースは grafana://datasources/{uid} の MCP リソースとしても公開されるため、モデルに検索させる代わりに、会話へ直接添付できます(例: Claude Code で @ を使用)。データソースツールとともに無効になります。

クエリ例

注: クエリ例ツールはデフォルトで無効です。有効にするには、examples を --enabled-tools フラグに追加してください。

  • クエリ例を取得: さまざまなデータソースの種類に対応するクエリ例を取得し、クエリ構文を確認します。

Prometheus クエリ

  • Prometheus にクエリ: Prometheus データソースに対して PromQL クエリを実行します(インスタントクエリと範囲メトリクスクエリの両方に対応)。
  • Prometheus メタデータをクエリ: Prometheus データソースからメトリクスメタデータ、メトリクス名、ラベル名、ラベル値を取得します。
  • ヒストグラムのパーセンタイルをクエリ: histogram_quantile を使ってヒストグラムのパーセンタイル値(p50、p90、p95、p99)を計算します。

Loki クエリ

  • Loki のログとメトリクスをクエリ: Loki データソースに対して LogQL を使い、ログクエリとメトリクスクエリの両方を実行します。
  • Loki メタデータをクエリ: Loki データソースからラベル名、ラベル値、ストリーム統計を取得します。
  • Loki のパターンをクエリ: Loki が検出したログパターンを取得し、一般的なログ構造や異常を特定します。

InfluxDB クエリ

注: InfluxDB ツールはデフォルトで無効です。有効にするには、influxdb を --enabled-tools フラグに追加してください。

  • InfluxDB にクエリ: InfluxQL(v1.x)または Flux(v2.x)を使って InfluxDB データソースにクエリを実行します。方言はデータソースの設定から推定されますが、dialect パラメーターで明示的に指定することもできます。

SQL データソースのクエリ

注: SQL ツールはデフォルトで無効です。有効にするには、sql を --enabled-tools フラグに追加してください。後方互換性のため、clickhouse、snowflake、athena のエイリアスも使用できます。

統合 SQL ツールは、単一のツールセットを通じて ClickHouse、Snowflake、Athena、MySQL、PostgreSQL、MSSQL、BigQuery に対応します。クエリは Grafana のデータソースプラグイン経由で実行されるため、認証はデータソースの設定によって処理され、認証情報が MCP サーバーに渡ることはありません。

  • データベース/スキーマ/カタログを一覧表示: SQL データソースの組織単位を確認します。Athena では、カタログを省略するとカタログが一覧表示され、カタログを渡すとデータベースが一覧表示されます。
  • テーブルを一覧表示: データベースまたはスキーマ内のテーブルを、メタデータ(利用可能な場合は行数やサイズ)とともに一覧表示します。
  • テーブルスキーマを記述: 列名、型、NULL 許容性、デフォルト値、コメントを取得します。
  • SQL をクエリ: データソース固有のマクロ置換($__timeFilter(col)、$__from/$__to、$__interval、${varname})、自動的な上限適用、テンプレート変数に対応した SQL クエリを実行します。

BigQuery の場合は、Grafana で grafana-bigquery-datasource プラグインを設定してください。検出では、プロジェクトに database、データセットに schema を使用します。database を省略した場合、プロジェクトはデータソースの defaultProject、次にプラグインの /defaultProjects エンドポイント(GCE プロジェクトの検出を含む)をデフォルトとして使用します。メタデータは API のみを通じて取得され、クエリジョブやテーブルスキャンは実行されません。列の説明とネストされた型が含まれますが、プラグインはテーブルの説明/型、列の NULL 許容性、デフォルト値を省略します。

BigQuery クエリでは、エスケープされた文字列変数に `my-project.my_dataset.fct_events` and use the datasource's billing project. Optional location defaults to datasource processingLocation. Use ${name:sqlstring} のような完全修飾テーブル参照が必要です。行数の上限は、スキャンされるバイト数やクエリコストを制限しません。

CloudWatch クエリ

注: CloudWatch ツールはデフォルトで無効です。有効にするには、cloudwatch を --enabled-tools フラグに追加してください。

  • CloudWatch 名前空間を一覧表示: 利用可能な AWS CloudWatch 名前空間を確認します。
  • CloudWatch メトリクスを一覧表示: 特定の名前空間で利用可能なメトリクスを一覧表示します。
  • CloudWatch ディメンションを一覧表示: メトリクスクエリのフィルタリングに使うディメンションを取得します。
  • CloudWatch にクエリ: 時間範囲を指定して CloudWatch メトリクスクエリを実行します。
  • CloudWatch ロググループを一覧表示: 必要に応じて名前のプレフィックスで絞り込み、ロググループを確認します。
  • CloudWatch ロググループのフィールドを一覧表示: ロググループで利用可能なフィールドを確認します。
  • CloudWatch Logs にクエリ: 1 つ以上のロググループに対して CloudWatch Logs Insights クエリを実行します。

Google Cloud Logging クエリ

注: Google Cloud Logging ツールはデフォルトで無効です。有効にするには、cloudlogging を --enabled-tools フラグに追加してください。Google Cloud Logging datasource plugin (googlecloud-logging-datasource) のバージョン 1.8.0 以降が必要で、Grafana 11.2 以降が必要です。古いプラグインバージョンでは異なるレスポンス形式が返され、query_cloud_logging はアップグレードを求めるエラーを返します。

  • Cloud Logging プロジェクトを一覧表示: データソースがログを読み取れる GCP プロジェクト ID を確認します。
  • Cloud Logging バケットとビューを一覧表示: クエリの対象を絞るため、ログバケットとログビューを確認します。
  • Cloud Logging にクエリ: 時間範囲と上限を指定して Cloud Logging クエリ言語のフィルター(例: resource.type="k8s_container" AND severity>=ERROR)を実行します。重大度、本文、ラベル、トレース ID を含むログエントリを新しい順に返します。GCP 認証はデータソースの設定によって処理されます。

Graphite クエリ

注: Graphite ツールはデフォルトで無効です。有効にするには、graphite を --enabled-tools フラグに追加してください。

  • Graphite にクエリ: Graphite データソースに対して Graphite render API クエリを実行します。
  • Graphite メトリクスを一覧表示: Graphite のメトリクスパスを参照して確認します。
  • Graphite タグを一覧表示: 利用可能な Graphite タグとタグ値を一覧表示します。
  • Graphite の密度をクエリ: 指定したパターンに一致する Graphite メトリクスの密度をクエリします。

Elasticsearch/OpenSearch クエリ

注: Elasticsearch/OpenSearch ツールはデフォルトで無効です。有効にするには、elasticsearch を --enabled-tools フラグに追加してください。

  • Elasticsearch/OpenSearch にクエリ: Lucene クエリ構文または Elasticsearch Query DSL を使って、Elasticsearch または OpenSearch データソースに検索クエリを実行します。時間範囲での絞り込みに対応し、ログ、メトリクス、その他のインデックス済みデータを取得できます。インデックス、ID、ソースフィールド、任意の関連度スコアを含むドキュメントを返します。

Quickwit クエリ

注: Quickwit ツールはデフォルトで無効です。有効にするには、quickwit を --enabled-tools フラグに追加してください。

  • Quickwit にクエリ: Lucene クエリ構文または Elasticsearch Query DSL の一部に対応した構文を使って、Quickwit データソースに検索クエリを実行します。時間範囲での絞り込みに対応し、ログやその他のインデックス済みドキュメントを取得できます。インデックス、ID、ソースフィールド、任意の関連度スコアを含むドキュメントを返します。

エージェントのオブザーバビリティ

注: Agent Observability ツールはデフォルトで無効で、Grafana Cloud でのみ動作します。有効にするには、agento11y を --enabled-tools フラグに追加してください。

  • 会話の一覧表示と検索: 最近の LLM 会話を一覧表示するか、期間を指定してフィルター式(モデル、プロバイダー、エージェント、ステータス、エラーの種類、評価結果など)で検索します。検索結果には、エラー数、評価の概要、評価サマリー、トレース ID が含まれます。
  • 会話の詳細を取得: 1 件の会話と、そのすべての生成内容(プロンプトと出力を含む)を取得します。
  • 生成の詳細とスコアを取得: ID で 1 件の生成を取得し、その評価スコア(評価者、スコアキー、値、合格 여부、説明)を取得します。
  • エージェントカタログを読む: テレメトリーを送信するエージェントを一覧表示し、1 つのエージェントバージョンの全情報(完全なシステムプロンプト、JSON スキーマを含むすべてのツール、実行に使用したモデル)を取得し、エージェントのバージョン履歴をたどり、バージョンごとの評価スコア集計を比較します。有効なバージョンは sha256: ハッシュであり、ツールの変更による影響を受けません。独自のバージョンを報告しないエージェントの場合は、システムプロンプトをハッシュするため、プロンプトを編集すると新しいバージョンが作成されます。カタログとバージョンの各行には token_estimate が含まれているため、プロンプト全体を取得する前に確認するとよいでしょう。
  • 評価者とテンプレートを確認: スコアの元となった評価者、その評価者の派生元テンプレート、LLM 評価者が利用できる判定プロバイダーとモデルを確認します。書き込みツールが有効な場合は、評価者の作成、フォーク、テスト、削除もできます。
  • 評価ルールとガードを確認: 評価者を本番トラフィックに関連付ける非同期評価ルールと、インラインで実行され警告または拒否を行うガード(フックルール)を確認します。書き込みツールが有効な場合は、作成、更新、プレビュー、削除もできます。書き込み操作と、永続化されない preview_rule および test_evaluator 操作には grafana-agento11y-app.eval:write 権限が必要です。この権限は Agento11y Admin ロールによって付与されます。
  • 保存済み会話とコレクションを整理: 保存済み会話(会話に安定した ID、名前、タグを付与するブックマーク)と、それらをまとめるコレクションを確認します。各コレクションのメンバー数と、保存済み会話の各行に埋め込まれたコレクションも含まれます。書き込みツールが有効な場合は、会話のブックマーク、コレクションの作成と編集、メンバーの追加や削除もできます。これらの書き込みには同じ grafana-agento11y-app.eval:write 権限が必要です。
  • テストスイートの読み取りと編集: オフライン実験で使用するバージョン管理されたテストスイートを一覧表示し、1 つのテストスイートの完全なバージョン履歴を読み取り、バージョンのテストケースをページ単位で取得します。書き込みツールが有効な場合は、スイートの作成、名前やタグの変更、ドラフトバージョンの作成、公開、テストケースの書き込みや削除もできます。公開済みバージョンは固定されるため、編集するには新しいドラフトを作成します。これらの書き込みには grafana-agento11y-app.eval:write が必要です。
  • オフライン実験を読む: テストスイートに対する評価実行を一覧表示し、合格率、コスト、トークン合計の概要を含む実行を読み取ります。テストケースごとのレポートから、試行、各判定者の説明を含むスコア、アーティファクトのメタデータへと詳細を確認できます。書き込みツールが有効な場合は、実験の名前やタグの変更、実行中の実験のキャンセルもできます。これらには grafana-agento11y-app.eval:write が必要です。実験は SDK ランナーによって作成され、このツールでは作成されません。

Grafana Assistant

注: Assistant ツールはデフォルトで無効であり、対象の Grafana インスタンスに Grafana Assistant プラグイン (grafana-assistant-app) がインストールされている必要があります。また、これらは書き込みツール(Assistant がスタックの状態を変更する可能性があります)であるため、--disable-write が設定されている場合はスキップされます。有効にするには、assistant を --enabled-tools フラグに追加します。

  • Assistant に質問: Grafana Assistant に自然言語のプロンプトを送信し、完全なテキスト応答を待ちます。Assistant はツール、メトリクス、ログ、その他のスタックコンテキストを利用できます。これは、単独のデータソースクエリを 1 つ実行するよりも広範な処理です。同じ会話を続けるには、返された contextId を後続の呼び出しに渡します。複雑なタスクには数分かかることがあります。応答が完了するか、リクエストがタイムアウト(5 分)するまで、呼び出しはブロックされます。

インシデント

  • インシデントの検索、作成、更新: Grafana Incident のインシデントを管理します。検索、作成、アクティビティの追加、カスタムフィールドの読み取りや設定ができます。
  • インシデントリソース: 過去 30 日間に開始したアクティブなインシデントは、grafana://irm/incidents/{id} の MCP リソースとしても公開されるため、会話に直接添付できます(たとえば、Claude Code の @ を使用)。インシデントツールとともに無効になります。

アラート

  • アラートルール情報の一覧表示と取得: Grafana のアラートルールとそのステータス(発火中/正常/エラーなど)を表示します。Grafana 管理のルールと、Prometheus または Loki データソースが管理するルールの両方に対応しています。
  • アラートルールの作成と更新: 新しいアラートルールを作成するか、既存のルールを変更します。
  • アラートルールの削除: UID でアラートルールを削除します。
  • アラートルーティングの管理: 通知ポリシー、コンタクトポイント、時間間隔を表示します。Grafana 管理のコンタクトポイントと、外部 Alertmanager データソース(Prometheus Alertmanager、Mimir、Cortex)のレシーバーの両方に対応しています。

Grafana OnCall

  • スケジュールの一覧表示と管理: Grafana OnCall のオンコールスケジュールを表示および管理します。
  • シフトの詳細を取得: 特定のオンコールシフトの詳細情報を取得します。
  • 現在のオンコールユーザーを取得: スケジュールで現在オンコール中のユーザーを確認します。
  • チームとユーザーの一覧表示: すべての OnCall チームとユーザーを表示します。
  • アラートグループの一覧表示: 状態、インテグレーション、ラベル、期間などの条件で Grafana OnCall のアラートグループを表示およびフィルタリングします。
  • アラートグループの詳細を取得: ID で特定のアラートグループの詳細情報を取得します。

管理

注: 管理ツールはデフォルトで無効です。有効にするには、admin を --enabled-tools フラグに含めます。

  • チームの一覧表示: Grafana で設定されているすべてのチームを表示します。
  • ユーザーの一覧表示: Grafana の組織内のすべてのユーザーを表示します。
  • すべてのロールを一覧表示: Grafana のすべてのロールを一覧表示します。委任可能なロールで絞り込むこともできます。
  • ロールの詳細を取得: UID で特定の Grafana ロールの詳細を取得します。
  • ロールへの割り当てを一覧表示: ロールに割り当てられているすべてのユーザー、チーム、サービスアカウントを一覧表示します。
  • ユーザーのロールを一覧表示: 1 人以上のユーザーに割り当てられているすべてのロールを一覧表示します。
  • チームのロールを一覧表示: 1 つ以上のチームに割り当てられているすべてのロールを一覧表示します。
  • リソースの権限を一覧表示: 特定のリソース(ダッシュボード、データソース、フォルダーなど)に定義されているすべての権限を一覧表示します。
  • Grafana リソースを説明: リソースタイプで利用可能な権限と割り当て機能を一覧表示します。

ユーザー

  • ユーザー情報: 現在の Grafana ID(ログイン名、メールアドレス、名前、Grafana(サーバー)管理者かどうか、現在の組織、認証情報でアクセスできる組織とそのロール)を取得します。複数組織 リクエストで有効な orgId 値を確認するために使用します。

ナビゲーション

  • ディープリンクを生成: LLM に URL を推測させるのではなく、Grafana リソースへの正確なディープリンク URL を作成します。
    • ダッシュボードリンク: UID を使用してダッシュボードへの直接リンクを生成します(例: http://localhost:3000/d/dashboard-uid)
    • パネルリンク: viewPanel パラメーターを使用して、ダッシュボード内の特定のパネルへのリンクを作成します(例: http://localhost:3000/d/dashboard-uid?viewPanel=5)
    • Explore リンク: データソースを事前設定した Grafana Explore へのリンクを生成します(例: http://localhost:3000/explore?schemaVersion=1&panes={"a":{"datasource":"prometheus-uid"}})。Grafana 10.2 未満では panes を認識しないため、代わりに従来の ?left={...} 形式が出力されます。
    • 期間のサポート: リンクに期間パラメーターを追加します(from=now-1h&to=now)
    • カスタムパラメーター: ダッシュボード変数や更新間隔などの追加クエリパラメーターを含めます

アノテーション

  • アノテーションを取得: フィルターを指定してアノテーションを検索します。期間、ダッシュボード UID、タグ、照合モードに対応しています。
  • アノテーションを作成: ダッシュボードまたはパネルに新しいアノテーションを作成します。
  • Graphite アノテーションを作成: Graphite 形式(what、when、tags、data)を使用してアノテーションを作成します。
  • アノテーションを更新: 既存のアノテーションのすべてのフィールドを置き換えます(全体更新)。
  • アノテーションをパッチ: アノテーションの特定のフィールドのみを更新します(部分更新)。
  • アノテーションを削除: ID でアノテーションを完全に削除します。
  • アノテーションタグを取得: オプションのフィルターを指定して、利用可能なアノテーションタグを一覧表示します。

スナップショット

  • スナップショットを一覧表示: オプションのクエリと上限フィルターを指定して、ダッシュボードのスナップショットを一覧表示します。
  • スナップショットを取得: スナップショットキーでスナップショットのメタデータとダッシュボードのペイロードを取得します。
  • スナップショットを作成: 完全なダッシュボードペイロードからダッシュボードのスナップショットを作成します。有効期限と外部スナップショットのオプションも指定できます。
  • スナップショットを削除: スナップショットキーでスナップショットを削除します。

レンダリング

  • パネルまたはダッシュボードの画像を取得: Grafana ダッシュボードのパネルまたはダッシュボード全体を PNG 画像としてレンダリングします。レポート、アラート、プレゼンテーションで使用できるよう、画像を base64 エンコードしたデータとして返します。パネルのデフォルトサイズは 1000×750 CSS ピクセル、ダッシュボード全体は 1200×900 で、どちらもスケールは 1 です。Explore のデフォルトは 1000×1000、スケールは 1 です。サイズは画像レンダラーのビューポート制限の対象となります。サイズ、期間、テーマ、スケール、ダッシュボード変数をカスタマイズできます。また、オプションの provisioningPreview パラメーターを使用して、プロビジョニングリポジトリのブランチにある未適用のダッシュボード(git-sync の PR プレビューなど)をレンダリングすることもできます。

プロビジョニング

  • プロビジョニングリポジトリを一覧表示: この Grafana インスタンスに設定されているプロビジョニングリポジトリ(git-sync ソースなど)を一覧表示します。各リポジトリのスラッグ、ソース URL、ブランチ、パス、同期状態、健全性を返します。
  • プロビジョニングファイルを検証: 指定したブランチまたはコミットにあるプロビジョニングリポジトリのファイルを、ドライランで適用します。受け入れ可能かどうか、リソースの操作(作成/更新)、対象リソースの種類、構造化された検証エラー(ある場合)を返します。これは Grafana の PR コメント機能が使用するものと同じアドミッション処理です。

ツールの一覧は設定可能なため、MCP クライアントで利用可能にするツールを選択できます。 特定の機能を使用しない場合や、コンテキストウィンドウを使いすぎたくない場合に便利です。 ツールのカテゴリを無効にするには、サーバーの起動時に --disable-<category> フラグを使用します。たとえば、OnCall ツールを無効にするには --disable-oncall を使用し、ナビゲーションのディープリンク生成を無効にするには --disable-navigation を使用します。

RBAC 権限

各ツールが正しく機能するには、特定の RBAC 権限が必要です。MCP サーバー用のサービスアカウントを作成する際は、使用するツールに応じて必要な権限が付与されていることを確認してください。記載されている権限は必要最小限のアクションです。ユースケースによっては、適切なスコープ(datasources:*、dashboards:*、folders:* など)も必要になる場合があります。

ヒント: Grafana RBAC に詳しくない場合や、多数の細かなスコープを設定する代わりに、より手早く簡単に設定したい場合は、サービスアカウントに Editor などの組み込みロールを割り当てることができます。Editor ロールは広範な読み取り/書き込みアクセスを許可し、ほとんどの MCP サーバー操作を実行できます。手動で適用するスコープよりも細かさに欠け(そのため制限も緩くなる)ため、最小権限の厳守より利便性を優先する場合にのみ使用してください。

注: OnCall やその他のプラグイン連携ツールは、grafana-irm-app.schedules:read などのプラグインアクションによって認可されます。基本の Viewer ロールには読み取りアクションが、Editor ロールには書き込みアクションが含まれます。Incident ツールに必要なのは plugins.app:access のみです。IRM は基本ロールによってインシデントアクションを認可します。

group/resource:verb 形式のアクション(dashboard.grafana.app/dashboards:get など)は、代理アクセス用トークンにのみ適用されます。サービスアカウントに必要なのは、その他の記載されたアクションのみです。

Grafana RBAC の詳細については、公式ドキュメントを参照してください。

RBAC スコープ

スコープは、権限が適用される特定のリソースを定義します。各アクションには、適切な権限とスコープの組み合わせが必要です。

一般的なスコープパターン:

  • 広範なアクセス: 組織全体へのアクセスには、* ワイルドカードを使用します

    • datasources:* - すべてのデータソースへのアクセス
    • dashboards:* - すべてのダッシュボードへのアクセス
    • folders:* - すべてのフォルダーへのアクセス
    • teams:* - すべてのチームへのアクセス
  • 限定的なアクセス: 特定の UID または ID を使用して、個々のリソースへのアクセスを制限します

    • datasources:uid:prometheus-uid - 特定の Prometheus データソースのみへのアクセス
    • dashboards:uid:abc123 - UID が abc123 のダッシュボードのみへのアクセス
    • folders:uid:xyz789 - UID が xyz789 のフォルダーのみへのアクセス
    • teams:id:5 - ID が 5 のチームのみへのアクセス
    • global.users:id:123 - ID が 123 のユーザーのみへのアクセス

例:

  • MCP サーバーへのフルアクセス: すべてのツールに広範な権限を付与します

    datasources:* (datasources:read, datasources:query)
    dashboards:* (dashboards:read, dashboards:create, dashboards:write)
    folders:* (for dashboard creation and alert rules)
    teams:* (teams:read)
    global.users:* (users:read)
    
  • データソースへの限定的なアクセス: 特定の Prometheus および Loki インスタンスのみをクエリします

    datasources:uid:prometheus-prod (datasources:query)
    datasources:uid:loki-prod (datasources:query)
    
  • ダッシュボード固有のアクセス: 特定のダッシュボードのみを読み取ります

    dashboards:uid:monitoring-dashboard (dashboards:read)
    dashboards:uid:alerts-dashboard (dashboards:read)
    

ツール

ツールカテゴリ説明必要な RBAC 権限必要なスコープ
list_teamsAdmin*すべてのチームを一覧表示するteams:readteams:* または teams:id:1
list_users_by_orgAdmin*検索とページネーションを使用して、組織内のユーザーを一覧表示するorg.users:readglobal.users:* または global.users:id:123
list_all_rolesAdmin*すべての Grafana ロールを一覧表示するroles:readroles:*
get_role_detailsAdmin*Grafana ロールの詳細を取得するroles:readroles:uid:editor
get_role_assignmentsAdmin*ロールの割り当てを一覧表示するroles:read, teams.roles:read, users.roles:readroles:uid:editor
list_user_rolesAdmin*ユーザーのロールを一覧表示するusers.roles:readglobal.users:id:123
list_team_rolesAdmin*チームのロールを一覧表示するteams.roles:readteams:id:7
get_resource_permissionsAdmin*リソースの権限を一覧表示するdashboards.permissions:read, datasources.permissions:read, folders.permissions:read, serviceaccounts.permissions:read, teams.permissions:read, users.permissions:readdashboards:uid:abcd1234
get_resource_descriptionAdmin*Grafana リソースタイプを説明するdashboards.permissions:read, datasources.permissions:read, folders.permissions:read, serviceaccounts.permissions:read, teams.permissions:read, users.permissions:readdashboards:*
user_infoUser現在の ID、機能、およびアクセス可能な組織None—
search_dashboardsSearchクエリ、フォルダー UID、フォルダーパス、タグ、またはスター付きかどうかでダッシュボードを検索するdashboards:read, folders:readdashboards:* または dashboards:uid:abc123
search_foldersSearchタイトルでフォルダーを検索するfolders:readfolders:* または folders:uid:xyz789
get_dashboard_by_uidDashboardUID でダッシュボードを取得する。保存済みバージョンを指定することもできますdashboard.grafana.app/dashboards:get, dashboards:read, dashboards:writedashboards:uid:abc123
list_dashboard_versionsDashboardダッシュボードの保存済みバージョン(バージョン、作成者、時刻、メッセージ)を一覧表示するdashboards:read, dashboards:writedashboards:uid:abc123
update_dashboardDashboardダッシュボードを更新または新規作成するdashboard.grafana.app/dashboards:create, dashboard.grafana.app/dashboards:get, dashboard.grafana.app/dashboards:update, dashboards:create, dashboards:read, dashboards:write, folders:readdashboards:*, folders:* または folders:uid:xyz789
get_dashboard_panel_queriesDashboardダッシュボードからパネルのタイトル、クエリ、データソース UID、タイプを取得するdashboard.grafana.app/dashboards:get, dashboards:readdashboards:uid:abc123
run_panel_queryRunPanelQuery*1 つ以上のダッシュボードパネルクエリを実行するdashboard.grafana.app/dashboards:get, dashboards:read, datasources:query, datasources:readdashboards:uid:*, datasources:uid:*
get_dashboard_propertyDashboardJSONPath 式を使用してダッシュボードの特定の部分を抽出するdashboard.grafana.app/dashboards:get, dashboards:readdashboards:uid:abc123
get_dashboard_summaryDashboardJSON 全体を取得せずにダッシュボードの簡潔な概要を取得するdashboard.grafana.app/dashboards:get, dashboards:readdashboards:uid:abc123
create_folderダッシュボードフォルダーを作成folders:create, folders:read, folders:writefolders:*
list_datasourcesデータソースデータソースの一覧を取得datasources:readdatasources:*
get_datasourceデータソースUID または名前でデータソースを取得datasources:readdatasources:uid:prometheus-uid
check_datasources_healthデータソース1 つ以上のデータソースの健全性を確認datasources:query, datasources:readdatasources:uid:*
create_datasourceデータソースデータソースを作成datasources:create, datasources:readdatasources:*
update_datasourceデータソースデータソースを更新datasources:read, datasources:writedatasources:* または datasources:uid:abc123
get_query_examplesExamples*データソースの種類に応じたクエリ例を取得なしdatasources:*
query_prometheusPrometheusグラフを開かずに PromQL でメトリクスをクエリdatasources:query, datasources:readdatasources:uid:prometheus-uid
render_grafana_appRendering有効なクエリツールを実行し、結果をインタラクティブな Grafana App に表示datasources:query, datasources:readdatasources:* または datasources:uid:<uid>
list_prometheus_metric_metadataPrometheusメトリクスのメタデータを一覧表示datasources:query, datasources:readdatasources:uid:prometheus-uid
list_prometheus_metric_namesPrometheus利用可能なメトリクス名を一覧表示datasources:query, datasources:readdatasources:uid:prometheus-uid
list_prometheus_label_namesPrometheusセレクターに一致するラベル名を一覧表示datasources:query, datasources:readdatasources:uid:prometheus-uid
list_prometheus_label_valuesPrometheus特定のラベルの値を一覧表示datasources:query, datasources:readdatasources:uid:prometheus-uid
query_prometheus_histogramPrometheusヒストグラムのパーセンタイル値を計算datasources:query, datasources:readdatasources:uid:prometheus-uid
list_incidentsIncidentGrafana Incident のインシデントを一覧表示(カスタムフィールド値を含めることも可能)plugins.app:accessN/A
create_incidentIncidentGrafana Incident にインシデントを作成(カスタムフィールドの設定も可能)plugins.app:accessN/A
add_activity_to_incidentIncidentGrafana Incident のインシデントにアクティビティ項目を追加plugins.app:accessN/A
update_incidentIncidentGrafana Incident のインシデントを更新(ステータス、重大度、タイトル、またはカスタムフィールド)plugins.app:accessN/A
get_incidentIncidentID で単一のインシデントを取得(カスタムフィールドを含む)plugins.app:accessN/A
list_incident_custom_fieldsIncidentインシデントに設定されたカスタムフィールドを、種類と選択肢とともに一覧表示plugins.app:accessN/A
query_loki_logsLokiLogQL を使用してログをクエリおよび取得(ログクエリまたはメトリクスクエリ)datasources:query, datasources:readdatasources:uid:loki-uid
list_loki_label_namesLokiログで利用可能なすべてのラベル名を一覧表示datasources:query, datasources:readdatasources:uid:loki-uid
list_loki_label_valuesLoki特定のログラベルの値を一覧表示datasources:query, datasources:readdatasources:uid:loki-uid
query_loki_statsLokiログストリームに関する統計情報を取得datasources:query, datasources:readdatasources:uid:loki-uid
query_loki_patternsLoki検出されたログパターンをクエリして、共通の構造を特定datasources:query, datasources:readdatasources:uid:loki-uid
analyze_loki_labelsLokiLokiのラベル戦略を監査(ライブまたは静的)し、必要に応じてクエリのパフォーマンスを診断datasources:query, datasources:readdatasources:uid:loki-uid
suggest_loki_alloy_label_configConfig承認済みラベルを適用するAlloy loki.processスニペットを生成NoneN/A
query_influxdbInfluxDB*InfluxQL(v1)またはFlux(v2)を使用してInfluxDBをクエリdatasources:query, datasources:readdatasources:uid:influxdb-uid
list_sql_databasesSQL*SQLデータソースのデータベース、スキーマ、またはカタログを一覧表示datasources:query, datasources:readdatasources:uid:*
list_sql_tablesSQL*SQLデータソースのテーブルを一覧表示datasources:query, datasources:readdatasources:uid:*
describe_sql_tableSQL*テーブルのカラムスキーマを取得datasources:query, datasources:readdatasources:uid:*
query_sqlSQL*マクロ置換を使用してSQLクエリを実行datasources:query, datasources:readdatasources:uid:*
list_cloudwatch_namespacesCloudWatch*利用可能なAWS CloudWatch名前空間を一覧表示datasources:query, datasources:readdatasources:uid:*
list_cloudwatch_metricsCloudWatch*名前空間内のメトリクスを一覧表示datasources:query, datasources:readdatasources:uid:*
list_cloudwatch_dimensionsCloudWatch*メトリクスのディメンションを一覧表示datasources:query, datasources:readdatasources:uid:*
list_cloudwatch_dimension_valuesCloudWatch*ディメンションキーの値を一覧表示datasources:query, datasources:readdatasources:uid:*
query_cloudwatchCloudWatch*CloudWatchメトリクスクエリを実行datasources:query, datasources:readdatasources:uid:*
list_cloudwatch_log_groupsCloudWatch*CloudWatchロググループを一覧表示datasources:query, datasources:readdatasources:uid:*
list_cloudwatch_log_group_fieldsCloudWatch*ロググループで検出されたフィールドを一覧表示datasources:query, datasources:readdatasources:uid:*
query_cloudwatch_logsCloudWatch*CloudWatch Logs Insightsクエリを実行datasources:query, datasources:readdatasources:uid:*
list_cloud_logging_projectsCloud Logging*Google Cloud Loggingデータソースから読み取り可能なGCPプロジェクトを一覧表示datasources:query, datasources:readdatasources:uid:*
list_cloud_logging_bucketsCloud Logging*GCPプロジェクト内のログバケットを一覧表示datasources:query, datasources:readdatasources:uid:*
list_cloud_logging_viewsCloud Logging*ログバケット内のログビューを一覧表示するdatasources:query, datasources:readdatasources:uid:*
query_cloud_loggingCloud Logging*Cloud Logging クエリ言語でログをクエリするdatasources:query, datasources:readdatasources:uid:*
query_elasticsearchElasticsearch/OpenSearch*Lucene 構文または Query DSL を使用して Elasticsearch または OpenSearch をクエリするdatasources:query, datasources:readdatasources:uid:datasource-uid
query_quickwitQuickwit*Lucene 構文または Query DSL を使用して Quickwit をクエリするdatasources:query, datasources:readdatasources:uid:quickwit-uid
alerting_rules_readAlertingアラートルールを一覧表示して詳細を確認する(list、get、versions)alert.rules.external:read, alert.rules:read, datasources:read, folders:readfolders:* または folders:uid:alerts-folder
alerting_rules_writeAlertingGrafana 管理ルールの作成、更新、削除、またはデータソース管理ルールの明示的な作成alert.provisioning.provenance:write, alert.rules.external:read, alert.rules.external:write, alert.rules:create, alert.rules:delete, alert.rules:read, alert.rules:write, datasources:read, folders:readfolders:*、または外部作成の場合は datasources:uid:<uid>
alerting_manage_routingAlerting通知ポリシー、コンタクトポイント、時間間隔を管理するalert.notifications.external:read, alert.notifications.receivers:read, alert.notifications.routes:read, alert.notifications.time-intervals:read, alert.notifications:read, datasources:query, datasources:read, notifications.alerting.grafana.app/routingtrees:getグローバルスコープ
alerting_routing_writeAlertingデフォルトで Grafana 管理のコンタクトポイントを作成するか、外部 Alertmanager レシーバーを明示的に作成するalert.notifications.external:read, alert.notifications.external:write, alert.notifications.receivers:create, alert.provisioning.provenance:write, datasources:readグローバル、または外部作成の場合は datasources:uid:<uid>
alerting_silences_readAlertingアラートのサイレンスを一覧表示して詳細を確認する(list、get)alert.instances:read, alert.silences:readグローバルスコープ
alerting_silences_writeAlertingアラートのサイレンスを作成、更新、期限切れにするalert.instances:create, alert.instances:read, alert.instances:write, alert.silences:create, alert.silences:read, alert.silences:writeグローバルスコープ
list_oncall_schedulesOnCallGrafana OnCall のスケジュールを一覧表示するgrafana-irm-app.schedules:read, plugins.app:accessプラグイン固有のスコープ
get_oncall_shiftOnCall特定の OnCall シフトの詳細を取得するgrafana-irm-app.schedules:read, plugins.app:accessプラグイン固有のスコープ
get_current_oncall_usersOnCall特定のスケジュールで現在オンコール中のユーザーを取得するgrafana-irm-app.schedules:read, grafana-irm-app.user-settings:read, plugins.app:accessプラグイン固有のスコープ
list_oncall_teamsOnCallGrafana OnCall のチームを一覧表示するgrafana-irm-app.user-settings:read, plugins.app:accessプラグイン固有のスコープ
list_oncall_usersOnCallGrafana OnCall のユーザーを一覧表示するgrafana-irm-app.user-settings:read, plugins.app:accessプラグイン固有のスコープ
list_alert_groupsOnCallフィルタリングオプションを指定して Grafana OnCall のアラートグループを一覧表示するgrafana-irm-app.alert-groups:read, plugins.app:accessプラグイン固有のスコープ
get_alert_groupOnCallID を指定して Grafana OnCall の特定のアラートグループを取得するgrafana-irm-app.alert-groups:read, plugins.app:accessプラグイン固有のスコープ
update_alert_groupOnCallアラートグループを確認、確認解除、解決、または解決解除するgrafana-irm-app.alert-groups:read, grafana-irm-app.alert-groups:write, plugins.app:accessプラグイン固有のスコープ
list_pyroscope_label_namesPyroscopeセレクターに一致するラベル名を一覧表示するdatasources:query, datasources:readdatasources:uid:pyroscope-uid
list_pyroscope_label_valuesPyroscopeラベル名のセレクターに一致するラベル値を一覧表示するdatasources:query, datasources:readdatasources:uid:pyroscope-uid
list_pyroscope_profile_typesPyroscope利用可能なプロファイルタイプを一覧表示するdatasources:query, datasources:readdatasources:uid:pyroscope-uid
query_pyroscopePyroscopePyroscope からプロファイル、メトリクス、またはその両方をクエリするdatasources:query, datasources:readdatasources:uid:pyroscope-uid
get_assertionsアサーション指定したエンティティのアサーション概要を取得plugins.app:accessプラグイン固有のスコープ
agento11y_manage_conversationsAgent Observability*Grafana Agent Observability から LLM の会話を一覧表示、検索、取得grafana-agento11y-app.conversations:read, grafana-agento11y-app.data:read, plugins.app:access該当なし
agento11y_manage_generationsAgent Observability*Grafana Agent Observability から LLM の生成詳細と評価スコアを取得grafana-agento11y-app.conversations:read, grafana-agento11y-app.data:read, plugins.app:access該当なし
agento11y_manage_agentsAgent Observability*エージェントカタログを読み取る:エージェントの一覧表示、特定エージェントのバージョン全体の取得、バージョン履歴の一覧表示、バージョンごとのスコア集計の取得grafana-agento11y-app.conversations:read, grafana-agento11y-app.data:read, plugins.app:access該当なし
agento11y_manage_evaluatorsAgent Observability*評価器、評価器テンプレート、ジャッジカタログを管理(一覧表示、取得、upsert、フォーク、テスト、削除)grafana-agento11y-app.conversations:read, grafana-agento11y-app.data:read, plugins.app:access; 書き込みを有効にした場合は grafana-agento11y-app.eval:write該当なし
agento11y_manage_eval_rulesAgent Observability*評価ルールとガードを管理(一覧表示、取得、作成、更新、プレビュー、削除)grafana-agento11y-app.conversations:read, grafana-agento11y-app.data:read, plugins.app:access; 書き込みを有効にした場合は grafana-agento11y-app.eval:write該当なし
agento11y_manage_eval_collectionsAgent Observability*保存済みの会話と、それらをまとめるコレクションを管理(一覧表示、取得、保存、作成、更新、削除、メンバーの追加と削除)grafana-agento11y-app.conversations:read, grafana-agento11y-app.data:read, plugins.app:access; 書き込みを有効にした場合は grafana-agento11y-app.eval:write該当なし
agento11y_manage_experimentsAgent Observability*オフライン実験、その試行、スコア、アーティファクトのメタデータ、フィルターファセットを読み取る。実験の更新とキャンセルも可能grafana-agento11y-app.conversations:read, grafana-agento11y-app.data:read, plugins.app:access; 書き込みを有効にした場合は grafana-agento11y-app.eval:write該当なし
agento11y_manage_test_suitesAgent Observability*オフライン実験で実行するテストスイート、そのバージョン、テストケースを管理(一覧表示、取得、作成、更新、下書き、公開、upsert、削除)grafana-agento11y-app.conversations:read, grafana-agento11y-app.data:read, plugins.app:access; 書き込みを有効にした場合は grafana-agento11y-app.eval:write該当なし
ask_assistantAssistant*Grafana Assistant にプロンプトを送信し、返信全文を返す(contextId を介した複数ターンに対応)grafana-assistant-app.chats:access, plugins.app:accessプラグイン固有のスコープ
generate_deeplinkナビゲーションGrafana リソースへの正確なディープリンク URL を生成なし該当なし
get_annotationsアノテーションフィルターを指定してアノテーションを取得annotations:readannotations:* または annotations:id:123
create_annotationアノテーション新しいアノテーションを作成(標準形式または Graphite 形式)annotations:createannotations:*
update_annotationアノテーションアノテーションの特定のフィールドを更新(部分更新)annotations:read, annotations:writeannotations:*
delete_annotationアノテーションID を指定してアノテーションを削除annotations:deleteannotations:*
get_annotation_tagsアノテーションオプションのフィルタリングを指定してアノテーションタグを一覧表示annotations:readannotations:*
list_snapshotsスナップショットクエリと上限のフィルターを任意で指定してダッシュボードスナップショットを一覧表示snapshots:read該当なし
get_snapshotスナップショットスナップショットキーを指定して、スナップショットのメタデータとダッシュボードペイロードを取得なし該当なし
create_snapshotスナップショットダッシュボードの完全なペイロードからダッシュボードスナップショットを作成dashboards:read, snapshots:createdashboards:uid:abc123
delete_snapshotスナップショットスナップショットキーを指定してダッシュボードスナップショットを削除dashboards:write, snapshots:deletedashboards:uid:abc123
get_panel_imageレンダリング保存済みのダッシュボードまたはパネル、プロビジョニングのプレビュー、またはアドホックな Explore ビューを PNG 画像としてレンダリングdashboards:read, datasources:explore, datasources:query, datasources:read, provisioning.repositories:readdashboards:uid:abc123
list_provisioning_repositoriesプロビジョニングプロビジョニングリポジトリ(例:git-sync ソース)を、ソース URL、ブランチ、同期状態、ヘルス情報とともに一覧表示provisioning.grafana.app/repositories:list, provisioning.repositories:read該当なし
validate_provisioning_fileプロビジョニングプロビジョニングリポジトリ内のファイルをドライランで適用し、アドミッション検証エラーを報告するdashboard.grafana.app/dashboards:get, dashboards:read, folder.grafana.app/folders:get, folders:read, provisioning.grafana.app/repositories:get, provisioning.repositories:readN/A
search_docsドキュメントGrafana のドキュメントを検索するか、製品グループを一覧表示する(製品を一覧表示するにはクエリを省略)NoneN/A
get_docドキュメントドキュメントページを取得する。見出しを取得するには outline_only を、範囲を指定して取得するには section を設定するNoneN/A
search_tempo_tracesTempoTraceQL でトレースを検索するdatasources:query, datasources:readdatasources:uid:tempo-uid
query_tempo_metricsTempoTraceQL でトレースからメトリクスを計算するdatasources:query, datasources:readdatasources:uid:tempo-uid
get_tempo_traceTempoID でトレースを取得するdatasources:query, datasources:readdatasources:uid:tempo-uid
diff_tempo_tracesTempo2 つのトレースを比較するdatasources:query, datasources:readdatasources:uid:tempo-uid
list_tempo_attribute_namesTempoスパン属性名とリソース属性名を一覧表示するdatasources:query, datasources:readdatasources:uid:tempo-uid
list_tempo_attribute_valuesTempoトレース属性の値を一覧表示するdatasources:query, datasources:readdatasources:uid:tempo-uid
get_tempo_traceql_docsTempoTraceQL のドキュメントを取得するNoneN/A
query_graphiteGraphite*Graphite メトリクスをクエリするdatasources:query, datasources:readdatasources:uid:graphite-uid
query_graphite_densityGraphite*Graphite メトリクスの密度をクエリするdatasources:query, datasources:readdatasources:uid:graphite-uid
list_graphite_metricsGraphite*Graphite メトリクスを一覧表示するdatasources:query, datasources:readdatasources:uid:graphite-uid
list_graphite_tagsGraphite*Graphite タグを一覧表示するdatasources:query, datasources:readdatasources:uid:graphite-uid
get_pluginプラグインインストール済みプラグインを取得するplugins.app:accessN/A
search_plugin_informationプラグインgrafana.com のプラグインカタログを検索するNoneN/A
install_pluginプラグインプラグインをインストールするplugins:installN/A
grafana_api_requestAPIGrafana HTTP API エンドポイントを呼び出すNoneエンドポイントによる
* デフォルトでは無効です。有効にするには、--enabled-tools にカテゴリを追加してください。

render_grafana_app ツールは、レンダリングと対応するクエリカテゴリが有効な場合、互換性のある MCP ホストにメトリクスとトレースを表示します。ソースクエリツールは、分析用のテキストと構造化データを返します。セットアップとライブラリの埋め込みについては、MCP Apps を参照してください。

CLI フラグのリファレンス

mcp-grafana バイナリは、設定用にさまざまなコマンドラインフラグをサポートしています。

トランスポートオプション:

  • -t, --transport: トランスポートの種類(stdio、sse、または streamable-http)- デフォルト: stdio
  • --address: SSE/streamable-http サーバーのホストとポート - デフォルト: localhost:8000
  • --base-path: SSE/streamable-http サーバーのベースパス。/healthz と /metrics は、このプレフィックス配下ではなく、常にサーバーのルートで提供されます。これらはプローブとスクレイパー用の内部専用エンドポイントであり、アプリケーションのプレフィックス外に置くことで、リバースプロキシ経由で API を公開する際に、これらまで公開せずに済みます
  • --endpoint-path: streamable-http サーバーのエンドポイントパス。--base-path に追加されます - デフォルト: /mcp
  • --sse-keepalive: 各 SSE クライアントに送信する ping リクエストの間隔。リバースプロキシやロードバランサーがアイドル状態のイベントストリームを閉じて(セッションを終了して)しまうのを防ぎます。プロキシのアイドルタイムアウトより短く設定してください。たとえば、ingress-nginx のデフォルトの 60s proxy-read-timeout の背後では 30s を使用します。ping が 3 回連続で応答されず、それぞれの応答待ち時間が間隔の半分に達すると、クライアントは切断されます。Go の duration 文字列を受け付けます。最小値は 1s です - デフォルト: 0(無効)。--transport sse にのみ適用されます
  • --server-name: MCP ハンドシェイクと OTel service.name で使用するサーバー名 - デフォルト: mcp-grafana。GRAFANA_MCP_SERVER_NAME 環境変数を上書きします
  • --instructions-append: initialize 時に MCP クライアントへ返されるサーバー指示に追加するテキスト。接続するすべてのエージェントに表示されます

--address がポート 0 を使用する場合、オペレーティングシステムが空きポートを割り当て、サーバーはバインドされたアドレスを作業ディレクトリ内の mcp-grafana-address にアトミックに書き込みます。このファイルはモード 0600 で作成されます。

[!NOTE] SSE では、リクエストごとのヘッダーはツール呼び出しに引き継がれません。X-Grafana-Service-Account-Token / X-Grafana-API-Key、X-Grafana-Org-Id、および GRAFANA_FORWARD_HEADERS に記載されたヘッダーは効果がなく、ツール呼び出しではサーバーの環境認証情報が使用され、X-Grafana-URL による上書きも機能しません。呼び出し元ごとに異なる Grafana URL、認証情報、または組織が必要な場合は、streamable-http を使用してください。

HTTP トランスポートのセキュリティ(SSE / streamable-http のみ):

Host/Origin の検証は、MCP リスナー上のすべてのルート(/sse、/mcp、および同じリスナーを共有する場合の /healthz / /metrics)で強制されます。これにより、DNS リバインディングを利用するブラウザーがいずれのルートにもアクセスできなくなります。stdio トランスポートには影響しません。--healthz-address と --metrics-address は、ラップされていない別のリスナーを起動します。

  • --allowed-hosts: Host ヘッダー値のカンマ区切り許可リスト。デフォルトは --address のループバック形式(例: localhost:8000,127.0.0.1:8000,[::1]:8000)です。空として解析される値(未設定、,、, など)もデフォルトにフォールバックするため、入力ミスによって検証が気付かれないまま無効になることはありません。許可リストにない Host ヘッダーを含むリクエストは 403 で拒否されます。Host の検証を無効にするには * を指定してください。これは、信頼できるリバースプロキシが Host を検証する場合にのみ安全です。K8s の httpGet プローブと外部の /metrics スクレイプには、このリストへのホスト名の明示的な追加、*、tcpSocket プローブ、または別ポート(--healthz-address / --metrics-address)のいずれかが必要です。
  • --allowed-origins: Origin ヘッダー値のカンマ区切り許可リスト。デフォルトは空です。Origin ヘッダーを含むリクエストはすべて拒否されます(ブラウザーはクロスオリジンリクエストで常にこのヘッダーを送信し、ブラウザーからこのサーバーを直接呼び出すべきではありません)。ブラウザーベースのクライアントを許可するには明示的なリストを設定するか、検証を無効にするには * を指定してください。
  • --allow-grafana-url-override: X-Grafana-URL の選択を有効にします。GRAFANA_ALLOW_URL_OVERRIDE にフォールバックします。デフォルトでは無効です。許可リストがない場合、呼び出し元はサーバーから到達可能な任意の HTTP(S) URL を選択できます。
  • --allowed-grafana-urls: URL 上書き用の、任意のカンマ区切りの Grafana ベース URL 完全一致許可リスト。GRAFANA_ALLOWED_URLS にフォールバックします。--allow-grafana-url-override が必要です。明示的に空のフラグを指定すると、継承したリストが無効になります。

呼び出し元の認証(SSE / streamable-http のみ):

MCP クライアントに、サーバーへの認証を任意で要求できます。これは、サーバーが Grafana に接続する際に使用する認証情報とは別のものです。stdio には影響しません。

  • --server-auth-token: 呼び出し元が Authorization: Bearer <token> として送信する必要がある Bearer トークン。MCP_GRAFANA_SERVER_TOKEN 環境変数にフォールバックします。設定すると、有効なトークンを含まないリクエストは、ツールが実行される前に 401 で拒否されます。プロセス引数にシークレットが表示されないよう、環境変数を使用してください。

呼び出し元の認証は、--server-auth-token が設定されている場合にのみ強制されます。設定されておらず、サーバーがループバック以外のアドレスにバインドされる場合、サーバーは起動しますが、セキュリティエラーをログに記録します。このログは error ログレベルで出力されるため、--log-level によって隠されません(ループバックと stdio には影響しません)。将来のメジャーリリースでは、これを起動エラーにする予定です。ループバック以外のアドレスで呼び出し元の認証を有効にする場合は、TLS(または TLS 終端)を使用してください。呼び出し元の認証が有効な場合、検証済みの Authorization ヘッダーは Grafana にリクエストが届く前に削除されます。--server-auth-token と GRAFANA_FORWARD_HEADERS=Authorization の併用は起動時に拒否されます。

Grafana URL の上書き(streamable-http のみ):

[!WARNING] URL の上書きにより、MCP 呼び出し元は送信先の HTTP(S) を選択できます。許可リストは URL を制限しますが、呼び出し元を認証したり、トークンを送信先に紐付けたりするものではありません。

各送信先を認可し、クライアントが指定した URL とトークンのヘッダーを置き換え、一致するトークンを提供する認証プロキシの背後に配置してください。サーバーの送信ネットワークアクセスは、承認済みの送信先に制限してください。

許可リストがない場合、偽のリクエストトークンによって、内部サービスやメタデータサービスを含む、到達可能な任意の HTTP(S) サービスにリクエストが送信される可能性があります。

大規模なフリートで送信先の選択を有効にするには、GRAFANA_ALLOW_URL_OVERRIDE=true(または --allow-grafana-url-override)を設定します。送信先を制限するには、GRAFANA_ALLOWED_URLS=https://one.example.com,https://two.example.com/grafana(または --allowed-grafana-urls)も設定してください。

送信先を選択する各 MCP リクエストに、次のヘッダーを含めます。

X-Grafana-URL: https://one.example.com
X-Grafana-Service-Account-Token: <token for one.example.com>

--server-auth-token が設定されている場合は、Authorization: Bearer <MCP caller token> も送信してください。これは MCP サーバーへの認証に使用され、選択した Grafana インスタンス用の X-Grafana-Service-Account-Token とは別のものです。プロキシはインスタンスごとに異なる Grafana トークンを送信できます。サーバーが設定済みのトークンを複数のインスタンス間で共有することはありません。非推奨の X-Grafana-API-Key ヘッダーも使用できます。リクエストの Grafana トークンを伴わない URL ヘッダーは拒否されます。リクエストにはトークンが含まれるため、受信時には TLS を使用してください。

許可リストは、スキーム、ポート、パスを含むベース URL の完全一致で照合されます。ワイルドカードはサポートされていません。Grafana 認証は SSRF 対策にはなりません。

選択された URL では、サーバーは GRAFANA_SERVICE_ACCOUNT_TOKEN、GRAFANA_SERVICE_ACCOUNT_TOKEN_FILE、GRAFANA_API_KEY、環境変数による Basic 認証、GRAFANA_EXTRA_HEADERS、またはクライアント証明書を使用しません。--tls-skip-verify が設定されていても TLS 検証は有効なままです。設定済みの CA ファイルは引き続き適用されます。そのリクエストから明示的に転送されたヘッダーは引き続き適用されます。選択されたベース URL の範囲外へのリダイレクトや、その他の Grafana API リクエストはブロックされます。X-Grafana-URL を含まないリクエストでは、通常の GRAFANA_URL と環境認証情報の動作が維持されます。このオプションは streamable HTTP のみに適用されます。リクエストごとのヘッダーがツール呼び出しに渡されない SSE では機能しません。SSE で選択された URL は呼び出し元のトークンなしで使用されるため、呼び出しは失敗します。

デバッグとログ:

  • --debug: 詳細な HTTP リクエスト/レスポンスのログ記録を有効にするデバッグモード
  • --log-level: ログレベル(debug、info、warn、error)- デフォルト: info

Grafana クライアントオプション:

  • --grafana-timeout: Grafana クライアントが行うリクエストの制限時間。Go の duration 文字列(例: 10s、500ms)を受け付けます - デフォルト: 30s
  • --allow-cross-origin-redirects: 送信先のスキーム、ホスト、またはポートが異なる場合でも、Grafana クライアントがリダイレクトを追跡できるようにします。デフォルトは false です。GRAFANA_ALLOW_CROSS_ORIGIN_REDIRECTS は環境変数によるフォールバックです。有効にすると、Grafana の認証情報がリダイレクト先に送信される可能性があります。リクエストで選択された Grafana URL は、選択された送信先に固定されます。
  • --include-args-in-spans: OpenTelemetry スパンにツール呼び出しの引数を含めます。非本番環境、または引数に PII が含まれないと分かっている場合にのみ有効にしてください - デフォルト: false

可観測性:

  • --metrics: /metrics で Prometheus メトリクスエンドポイントを有効にします
  • --metrics-address: メトリクスサーバー用の別アドレス(例: :9090)。空の場合、メトリクスはメインサーバーで提供されます
  • --healthz-address: /healthz 用の別アドレス(例: :8080)。空の場合、/healthz はメインサーバーで提供されます。2 つのアドレスが一致する場合、--metrics-address とリスナーを共有します。サイドリスナーでは Host/Origin 検証がスキップされます。
  • --slow-request-threshold: MCP リクエスト(ツール呼び出し、一覧表示、リソース読み取りなど)の所要時間がこの期間を超えた場合にイベントをログに記録します。Go の duration 文字列(例: 500ms、5s)を受け付けます。デフォルトの 0 では、低速リクエストのログ記録は無効です。低速リクエストのログ記録 セクションを参照してください。
  • --slow-request-log-level: 低速リクエストイベントのログレベル(info または warn)- デフォルト: warn。

匿名の使用統計:

  • --usage-stats: 匿名の使用統計の報告: enabled、disabled、または log(送信されるレポートを stderr に出力し、何も送信しない)。GRAFANA_USAGE_STATS 環境変数を上書きし、この環境変数はさらに DO_NOT_TRACK を上書きします。認識されない値の場合、報告は無効になります。匿名の使用統計 セクションを参照してください。 ツールの設定:

  • --enabled-tools: 有効にするカテゴリのカンマ区切りリスト。デフォルト: admin、agento11y、assistant、athena、clickhouse、cloudlogging、cloudwatch、dsquery、elasticsearch、examples、graphite、quickwit、runpanelquery、snowflakeを除くすべてのカテゴリ。無効なカテゴリを有効にするには、リストに追加します(例: "search,datasource,...,snowflake")

  • --max-loki-log-limit: 1回のquery_loki_logs呼び出しで返されるログ行の最大数。デフォルト: 100。注: 切り詰めを検出できるよう、Lokiのサーバー側のmax_entries_limit_per_queryより少なくとも1つ小さい値に設定してください(データがさらに存在するか検出するため、ツールは内部でlimit+1を要求します)。

  • --loki-guardrail-mode: query_loki_logsに対するLokiクエリのコストガードレール。デフォルト: off。Lokiは行フィルターのないログクエリに対してmax_query_bytes_readを適用しないため、広い範囲に対する広範なセレクターはテラバイト単位のデータをスキャンする可能性があります。このガードレールは、選択性の高いストリームセレクターを要求し、範囲ベクトルの期間([30d]など)を含む実効時間範囲に上限を設け、クエリ実行前にLokiのインデックス/統計情報によるバイト数の推定値を事前確認します。shadowはブロック対象のログクエリを記録しますが、実行は許可します(インデックス/統計情報の往復処理のコストは発生します)。enforceは、LLMが対応できる書き換え方法を示してクエリを拒否します。VictoriaLogsでは、このガードレールはセレクター形式({...})のクエリにのみ適用されます。セレクターを解析できない場合(通常の波括弧なしのLogsQL形式)は、クエリはそのまま通過し、バイト予算のチェックは適用されません(低コストのインデックス推定がないため)。環境変数のフォールバック: GRAFANA_LOKI_GUARDRAIL_MODE。

  • --loki-guardrail-max-bytes: Lokiのインデックス/統計APIで推定される、1回のquery_loki_logs呼び出しでスキャンできる最大バイト数。デフォルト: 107374182400(100 GiB)。0はバイト予算のチェックを無効にします。環境変数のフォールバック: GRAFANA_LOKI_GUARDRAIL_MAX_BYTES。

  • --loki-guardrail-max-range: 範囲ベクトルの期間を含む、1回のquery_loki_logs呼び出しにおける実効時間範囲の上限。デフォルト: 24h。Goの期間文字列を受け付けます。0は範囲チェックを無効にします。環境変数のフォールバック: GRAFANA_LOKI_GUARDRAIL_MAX_RANGE。

  • --prometheus-guardrail-mode: query_prometheus、query_prometheus_histogram、およびrun_panel_queryのPrometheusクエリに対するPrometheusクエリのガードレール。デフォルト: off。このガードレールは、クエリがデータソースに到達する前に、クエリの実効時間範囲と、要求する系列ごとのポイント数に上限を設けます。独立したオプトインのセレクターポリシーでは、すべてのベクトルセレクターにおいて、メトリクス名以外に空でない正のラベル制約を必須にできます。例と制限についてはセレクターポリシーを参照してください。shadowはブロック対象のクエリを記録しますが、実行は許可します。enforceは、LLMが対応できる書き換え方法を示してクエリを拒否します(run_panel_queryは、そのパネルの結果にあるerrorsエントリで報告します)。環境変数のフォールバック: GRAFANA_PROMETHEUS_GUARDRAIL_MODE。

  • --prometheus-guardrail-require-selective-labels: 各ベクトルセレクターに、メトリクス名以外の空でない正のラベル制約を必須にします。デフォルト: false。範囲とポイントの予算とは独立しており、両方が0の場合も同様です。ガードレールモードがoffでない場合にのみ適用されます。環境変数のフォールバック: GRAFANA_PROMETHEUS_GUARDRAIL_REQUIRE_SELECTIVE_LABELS。falseを含む明示的なCLI値は、環境変数より優先されます。

  • --prometheus-guardrail-max-range: 1回のPromQLクエリにおける実効時間範囲の上限。デフォルト: 192h。実効範囲は、クエリ自体の時間範囲(インスタントクエリではゼロ)に、式内で最も長い範囲ベクトルまたはサブクエリのウィンドウを加えたものです。ネストされたサブクエリの範囲は累積されるため、max_over_time(rate(x[5m])[30d:1m])は30d5mとして読み取られます。Goの期間文字列を受け付けるため、8dではなく192hと記述してください。0は範囲チェックを無効にします。環境変数のフォールバック: GRAFANA_PROMETHEUS_GUARDRAIL_MAX_RANGE。

  • --prometheus-guardrail-max-points: 範囲クエリで要求できる系列ごとの最大ポイント数。floor(range / step) + 1。デフォルト: 11000(Prometheus独自の系列ごとの上限)。ガイダンスでは、条件を満たす最小のstepSecondsを示します。0はポイント数のチェックを無効にします。環境変数のフォールバック: GRAFANA_PROMETHEUS_GUARDRAIL_MAX_POINTS。

  • --prometheus-guardrail-max-metric-cardinality: オプトインのTSDBスコープポリシー。デフォルト: 0(無効)。この系列数のしきい値を超えると報告された正確なメトリクス名には、設定済みのスコープラベルに対する空でない完全一致マッチャーが必要です。モードがoffでない場合にのみ有効です。環境変数のフォールバック: GRAFANA_PROMETHEUS_GUARDRAIL_MAX_METRIC_CARDINALITY。

  • --prometheus-guardrail-cardinality-cache-ttl: キャッシュされたTSDBスナップショットの有効期間。デフォルト: 10m。0も10mを使用します。環境変数のフォールバック: GRAFANA_PROMETHEUS_GUARDRAIL_CARDINALITY_CACHE_TTL。

  • --prometheus-guardrail-cardinality-scope-labels: カーディナリティポリシーを満たす、空でない完全一致マッチャーのラベルをカンマ区切りで指定します。デフォルト: job,instance,namespace,pod,service,cluster。空の場合はこれらのデフォルトが使用されます。__name__は許可されません。環境変数のフォールバック: GRAFANA_PROMETHEUS_GUARDRAIL_CARDINALITY_SCOPE_LABELS。明示的なCLI設定は、対応する環境変数より優先されます。

    Prometheusガードレールの制限: ポイント数チェックで予算化するのは要求された解像度であり、系列数、サンプル数、サブクエリの評価回数ではありません。また、Grafanaが範囲を調整したり、ステップを広げたりする場合があります。offsetおよび@修飾子は無視されます。$__rate_intervalや$__rangeなどのGrafanaマクロは、式の計測前にGrafanaが使用する値で展開されます($__rate_intervalはステップの4倍です)。ダッシュボード変数($windowなど)を含む式や、別の方言でのみ受け付けられる構文など、ガードレールが解析できない式は、クエリ自体の時間範囲とステップのみを対象にチェックされ、それ以外は実行されます。run_panel_queryにはステップパラメーターがないため、Grafanaと同様に、長い範囲では1分のステップを広げて11000ポイント以内に収めます。または、enforceモードでは、より小さい--prometheus-guardrail-max-points以内に収めます。

  • --prometheus-enforced-matchers: すべてのネイティブPrometheusクエリにAND条件で追加され、読み取り可能な系列を制限するPromQLラベルマッチャー(例: environment=~"prod|staging")。--disable-apiが必要です。Prometheusクエリの強制適用を参照してください。

  • --loki-enforced-matchers: すべてのネイティブLokiクエリにAND条件で追加され、読み取り可能なログストリームを制限するLogQLラベルマッチャー(例: environment=~"prod|staging")。--disable-apiが必要です。Lokiクエリの強制適用を参照してください。

  • --loki-label-enumeration-fallback: 負の強制マッチャーでスコープを制限できない場合の、ラベル列挙ツールの動作: reject(デフォルト)またはunfiltered。Lokiクエリの強制適用を参照してください。

  • --dashboard-schema: Grafanaがダッシュボードスキーマv2を提供しているとき、新しいダッシュボードを作成する従来のv1(panels[])本文をupdate_dashboardが拒否するようにするには、v2に設定します。エラーには、再試行に使える最小限のv2本文が含まれます。既存のv1ダッシュボードは引き続き編集でき、v2に対応していないGrafanaには影響しません。デフォルト: 空(変更なし)。環境変数のフォールバック: GRAFANA_DASHBOARD_SCHEMA。

  • --disable-search: 検索ツールを無効にする

  • --disable-datasource: データソースツールを無効にする

  • --disable-incident: インシデントツールを無効にする

  • --disable-prometheus: Prometheusツールを無効にする

  • --disable-write: 書き込みツール(作成/更新操作)を無効にする

  • --disable-query: クエリツール(データソースに対してクエリを実行するツール)を無効にする。メタデータおよび検出ツールは引き続き利用可能

  • --enable-query: --disable-writeが有効な場合も、raw-SQLクエリツール(query_sql、query_influxdb)を登録したままにし、render_grafana_appのソースであるquery_datasourceも利用可能にします。raw-SQLツールについては--enable-write-tools=query_sql,query_influxdbと同等です。よくあるケース向けの短縮指定として用意されています。

  • --enable-write-tools: --disable-writeが有効な場合も登録したままにする個別ツール名のカンマ区切りリスト。書き込み動作の範囲が十分に限定され、個別に再有効化できるツールに使用します。カテゴリ全体が無効になっているツールには効果がありません。たとえば、--enable-write-tools=generate_deeplinkは--disable-writeが有効な場合もURL短縮(shorten=true)を機能させ、--enable-write-tools=alerting_rules_writeは他の書き込みツールを有効にせずにアラートルールを変更できるようにします。

  • --disable-loki: Lokiツールを無効にする

  • --disable-elasticsearch: ElasticsearchおよびOpenSearchツールを無効にする

  • --disable-quickwit: Quickwitツールを無効にする

  • --disable-influxdb: InfluxDBツールを無効にする

  • --disable-alerting: アラートツールを無効にする

  • --disable-dashboard: ダッシュボードツールを無効にする

  • --disable-oncall: OnCallツールを無効にする

  • --disable-asserts: assertsツールを無効にする

  • --disable-admin: 管理ツールを無効にする

  • --disable-pyroscope: Pyroscopeツールを無効にする

  • --disable-navigation: ナビゲーションツールを無効にする

  • --disable-rendering: レンダリングツール(パネル/ダッシュボードの画像エクスポート)を無効にする

  • --disable-snapshot: スナップショットツールを無効にする

  • --disable-cloudwatch: CloudWatchツールを無効にする

  • --disable-cloudlogging: Google Cloud Loggingツールを無効にする

  • --disable-examples: クエリ例ツールを無効にする

  • --disable-sql: SQLデータソースツール(ClickHouse、Snowflake、Athena、MySQL、PostgreSQL、MSSQL、BigQuery)を無効にする。別名の--disable-clickhouse、--disable-snowflake、--disable-athenaも使用できます。

  • --disable-runpanelquery: パネルクエリ実行ツールを無効にする

  • --disable-graphite: Graphiteツールを無効にする

  • --disable-dsquery: render_grafana_appのquery_datasourceソースを無効にする

  • --disable-provisioning: プロビジョニングツールを無効にする

  • --disable-agento11y: Agent Observabilityツールを無効にする

  • --disable-assistant: Grafana Assistantツールを無効にする

  • --disable-docs: ドキュメントツールを無効にする

読み取り専用モード

--disable-writeフラグを使うと、MCPサーバーを読み取り専用モードで実行し、Grafanaインスタンスへの書き込み操作をすべて防止できます。次のように、安全な読み取り専用アクセスを提供したい場合に便利です。

  • 読み取り専用の権限を持つサービスアカウントを使用する
  • 変更機能を与えずに、AIアシスタントへオブザーバビリティデータを提供する
  • 書き込みアクセスを制限すべき本番環境で実行する
  • 誤った変更を防ぎたいテストおよび開発環境で使用する

--disable-writeを有効にすると、次の書き込み操作が無効になります。

ダッシュボードツール:

  • update_dashboard

フォルダーツール:

  • create_folder

インシデントツール:

  • create_incident
  • add_activity_to_incident
  • update_incident

アラートツール:

  • alerting_rules_write(作成、更新、削除操作)
  • alerting_silences_write(作成、更新、削除操作)
  • alerting_routing_write(create_contact_point操作)

各アラート書き込みツールは、--enable-write-tools=<name>を使って個別に有効なままにできます。

OnCallツール:

  • update_alert_group

アノテーションツール:

  • create_annotation
  • update_annotation
  • delete_annotation

スナップショットツール:

  • create_snapshot
  • delete_snapshot

ナビゲーションツール:

  • generate_deeplink(shorten=trueは無視され、完全なURLが返されます。URL短縮を維持するには--enable-write-tools=generate_deeplinkを渡してください)

Raw-SQLクエリツール:

これらのツールは、指定されたクエリを検査せずにそのまま実行するため、データソースの認証情報で許可されていれば書き込みが可能です。query_sqlはDROP TABLEを実行し、query_influxdbはDELETEを実行します。そのため、読み取り専用モードではこれらのツールが削除されます。データソースの認証情報が読み取り専用であると分かっている場合は、--enable-queryを渡すとツールを維持できます。

  • query_sql
  • query_influxdb

Agent Observabilityツール:

  • agento11y_manage_evaluators(upsert、削除、フォーク、テスト評価器の操作)
  • agento11y_manage_eval_rules(ルールおよびガードの作成、更新、削除、プレビュー操作)
  • agento11y_manage_eval_collections(保存済み会話の保存と削除、コレクションの作成・更新・削除、コレクションメンバーの追加と削除)
  • agento11y_manage_experiments(実験の更新およびキャンセル操作)
  • agento11y_manage_test_suites(テストスイートの作成と更新、バージョンの作成と公開、テストケースのupsertと削除)

読み取り操作はすべて引き続き利用できるため、ダッシュボードのクエリ、PromQL/LogQLクエリの実行、リソースの一覧表示、データの取得が可能です。書き込みを表現できないクエリ言語(PromQL、LogQL、TraceQL、Elasticsearch DSL、Graphite、CloudWatch)は、読み取り専用モードでもクエリツールを引き続き利用できます。削除されるのは、上記のraw-SQLツールのみです。

クエリなしモード

--disable-query フラグを指定すると、データソースに対してクエリを実行するすべてのツールが削除されますが、メタデータツールと探索ツールはそのまま残ります。これは、サービスアカウントに datasources:read はあるものの datasources:query はない場合など、データソース、ダッシュボード、メトリクス名、ラベル、テーブルスキーマなど、存在するものを探索できる一方で、コストが高くなる可能性やデータを漏えいする可能性のあるクエリは実行できないアシスタントが必要な場合に便利です。

これは3つのクエリ設定の中で最も強力で、--enable-query より優先されます。

フラグ安全なクエリツール(query_prometheus、query_loki_logs、run_panel_query、…)Raw-SQL クエリツール(query_sql、query_influxdb)
(なし)登録される登録される
--disable-write登録される登録されない
--disable-write --enable-query登録される登録される
--disable-query登録されない登録されない
--disable-query --enable-query登録されない登録されない

--disable-query が有効な場合、次のツールは登録されません。

Prometheus ツール:

  • query_prometheus
  • query_prometheus_histogram

レンダリングツール:

  • render_grafana_app

Loki ツール:

  • query_loki_logs
  • query_loki_patterns

query_loki_stats と analyze_loki_labels は登録されたままです。どちらもセレクターをデータソースに送信しますが、ログの内容ではなく、インデックスを読み取ってストリーム数、チャンク数、バイト数を返します。

Elasticsearch/OpenSearch および Quickwit ツール:

  • query_elasticsearch
  • query_quickwit

InfluxDB ツール(--disable-write によっても削除されます。上記を参照):

  • query_influxdb

SQL データソースツール(--disable-write によっても削除されます。上記を参照):

  • query_sql

Graphite ツール:

  • query_graphite
  • query_graphite_density

CloudWatch ツール:

  • query_cloudwatch
  • query_cloudwatch_logs

Google Cloud Logging ツール:

  • query_cloud_logging

Pyroscope ツール:

  • query_pyroscope

パネルクエリ実行ツール:

  • run_panel_query

elasticsearch、quickwit、influxdb、runpanelquery の各カテゴリにはほかのツールがないため、クエリが無効な場合はツールが一切登録されません。それ以外のすべてのカテゴリにある関連ツール(list_prometheus_metric_names、list_loki_label_values、describe_sql_table、list_cloudwatch_metrics、list_cloud_logging_projects など)は引き続き利用できます。

--disable-query はクエリツールと grafana_api_request から /api/ds/query への POST を制御しますが、データソースへのすべての経路を制限するわけではありません。読み取り専用モードでは、grafana_api_request はクエリツールが有効な場合に限り、/api/ds/query への POST を許可します(Raw-SQL ツールと同じ制御で、--disable-write によってブロックされます。ただし --enable-query で上書きできます)。パネルをサーバー側でレンダリングする get_panel_image には影響しません。

クライアント TLS 設定(Grafana 接続用):

  • --tls-cert-file: クライアント認証用 TLS 証明書ファイルのパス
  • --tls-key-file: クライアント認証用 TLS 秘密鍵ファイルのパス
  • --tls-ca-file: サーバー検証用 TLS CA 証明書ファイルのパス
  • --tls-skip-verify: TLS 証明書の検証をスキップする(安全ではありません)

サーバー TLS 設定(streamable-http トランスポートのみ):

  • --server.tls-cert-file: サーバー HTTPS 用 TLS 証明書ファイルのパス
  • --server.tls-key-file: サーバー HTTPS 用 TLS 秘密鍵ファイルのパス

使用方法

この MCP サーバーは、ローカルの Grafana インスタンスと Grafana Cloud の両方で動作します。Grafana Cloud を使用する場合は、以下の設定例で http://localhost:3000 の代わりにインスタンス URL(例: https://myinstance.grafana.net)を使用してください。

  1. サービスアカウントトークン認証を使用する場合は、使用したいツールに必要な権限を持つサービスアカウントを Grafana で作成し、 サービスアカウントトークンを生成して、設定ファイルで使えるようクリップボードにコピーします。 サービスアカウントトークンの作成方法については、Grafana サービスアカウントのドキュメントを参照してください。 ヒント: 細かな RBAC スコープの設定に慣れていない場合は、より簡単ですが制限の緩い方法として、組み込みの Editor ロールをサービスアカウントに割り当てられます。これにより、ほとんどの MCP サーバー操作に対応する広範な読み書きアクセスが付与されます。厳格な最小権限の要件よりも利便性を優先する場合に使用してください。

    注: 環境変数 GRAFANA_API_KEY は非推奨で、今後のバージョンで削除されます。代わりに GRAFANA_SERVICE_ACCOUNT_TOKEN を使用するよう移行してください。後方互換性のため、古い変数名も引き続き使用できますが、非推奨の警告が表示されます。

ファイルからサービスアカウントトークンを読み込む

GRAFANA_SERVICE_ACCOUNT_TOKEN を使ってトークンをインラインで渡す代わりに、GRAFANA_SERVICE_ACCOUNT_TOKEN_FILE にトークンを含むファイルのパスを指定できます。ファイルはリクエストごとに新しく読み込まれるため、サーバーを再起動しなくても、ローテーションされたトークンが自動的に反映されます。

これは、基盤となる Secret が変更されると、ボリュームとしてマウントされた Secret がその場で更新される Kubernetes で特に便利です(通常は約1分以内)。リクエストごとのクライアントキャッシュ(トークン値をキーとして使用)と組み合わせることで、トークンのローテーション時に新しいクライアントが透過的に作成され、Pod の再起動もダウンタイムも発生しません。

env:
  - name: GRAFANA_SERVICE_ACCOUNT_TOKEN_FILE
    value: /var/run/secrets/grafana/token
volumeMounts:
  - name: grafana-token
    mountPath: /var/run/secrets/grafana
    readOnly: true
volumes:
  - name: grafana-token
    secret:
      secretName: grafana-mcp-token

ファイルの内容からは、末尾の改行を含む前後の空白が削除されます。GRAFANA_SERVICE_ACCOUNT_TOKEN と GRAFANA_SERVICE_ACCOUNT_TOKEN_FILE の両方が設定されている場合は、インラインのトークンが優先されます。

複数組織のサポート

操作対象の組織は、次のいずれかで指定できます。

  • 環境変数: GRAFANA_ORG_ID に数値の組織 ID を設定します
  • HTTP ヘッダー: streamable HTTP トランスポートを使用する場合は X-Grafana-Org-Id を設定します(ヘッダーは環境変数より優先されます。つまり、デフォルトの組織も設定できます)。

組織 ID が指定されると、MCP サーバーはすべての Grafana リクエストに X-Grafana-Org-Id ヘッダーを設定し、指定された組織のコンテキスト内で操作が実行されるようにします。

動的な組織選択(呼び出しごと)

上記の方法では、接続全体で使用する組織が固定されます。1つの接続からツール呼び出しごとに異なる組織を対象にするには、--dynamic-multi-org フラグを指定してサーバーを起動します。デフォルトでは無効です。

有効にすると、すべてのツールで省略可能な orgId 引数が使えるようになり、その呼び出しに限って接続の組織設定を上書きします(X-Grafana-Org-Id ヘッダーと、アプリプラットフォーム API の場合は解決される Kubernetes 名前空間の両方に反映されます)。プロキシ経由のデータソースツールも、認証情報でアクセスできるすべての組織から検出されます。orgId を省略した呼び出しでは、接続のデフォルト組織が使用されます。

これは、複数の組織に属する認証情報(ユーザーや代理 ID など)でのみ機能します。サービスアカウントトークンは、引き続き単一の組織に紐付けられます。有効な orgId 値を確認するには、user_info ツールを使用してください。

組織 ID を指定する例:

{
  "mcpServers": {
    "grafana": {
      "command": "mcp-grafana",
      "args": [],
      "env": {
        "GRAFANA_URL": "http://localhost:3000",
        "GRAFANA_USERNAME": "<your username>",
        "GRAFANA_PASSWORD": "<your password>",
        "GRAFANA_ORG_ID": "2"
      }
    }
  }
}

カスタム HTTP ヘッダー

GRAFANA_EXTRA_HEADERS 環境変数を使用すると、すべての Grafana API リクエストに任意の HTTP ヘッダーを追加できます。値には、ヘッダー名と値を対応付けた JSON オブジェクトを指定します。

カスタムヘッダーの例:

{
  "mcpServers": {
    "grafana": {
      "command": "mcp-grafana",
      "args": [],
      "env": {
        "GRAFANA_URL": "http://localhost:3000",
        "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your token>",
        "GRAFANA_EXTRA_HEADERS": "{\"X-Custom-Header\": \"custom-value\", \"X-Tenant-ID\": \"tenant-123\"}"
      }
    }
  }
}

SOCKS5 プロキシ

GRAFANA_SOCKS5_PROXY 環境変数を使用すると、このサーバーから Grafana へのすべてのリクエストを SOCKS5 プロキシ経由にできます。プロキシの適用範囲は、このサーバーの Grafana トラフィックに限られます。グローバルな HTTP_PROXY/HTTPS_PROXY 変数は変更されず、この環境変数を設定すると、Grafana トランスポートに限ってそれらのプロキシ選択が上書きされます。他の MCP サーバーやシェルセッションには影響しません。未設定の場合、動作は変わりません。

URL には socks5:// または socks5h:// スキームを使用する必要があります(Go では同じように扱われ、ホスト名の解決はプロキシに委ねられます)。認証情報を含めることもできます。例: socks5://user:pass@127.0.0.1:1080。

例:

{
  "mcpServers": {
    "grafana": {
      "command": "mcp-grafana",
      "args": [],
      "env": {
        "GRAFANA_URL": "http://localhost:3000",
        "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your token>",
        "GRAFANA_SOCKS5_PROXY": "socks5://127.0.0.1:1080"
      }
    }
  }
}

無効なプロキシ URL は起動エラーになります。また、実行時にプロキシ経由の接続を確立できない場合、サーバーは Grafana トラフィックを直接送信することなく、フェイルクローズします。

クライアントからのヘッダー転送(Streamable-HTTP のみ)

MCP サーバーが SSO を処理するゲートウェイまたはリバースプロキシ(OIDC を使用する AWS ALB など)の背後で動作する場合、Grafana がリクエストを認証済みユーザーに関連付けられるよう、各ユーザーのセッション Cookie を Grafana に渡す必要があります。GRAFANA_FORWARD_HEADERS 環境変数を使うと、カンマ区切りの許可リストでヘッダー名を指定し、受信した HTTP リクエストからすべての送信 Grafana API リクエストへコピーできます。

これは streamable-http(-t streamable-http)トランスポートを使用する場合にのみ適用されます。stdio モードや SSE モードには影響しません。

例: セッション Cookie を転送する

{
  "env": {
    "GRAFANA_URL": "https://grafana.internal",
    "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your token>",
    "GRAFANA_FORWARD_HEADERS": "Cookie"
  }
}

複数のヘッダーを転送するには、カンマで区切ります。

GRAFANA_FORWARD_HEADERS=Cookie,X-Session-Id

転送されたヘッダーは、GRAFANA_EXTRA_HEADERS で定義されたヘッダーと統合されます。同じヘッダー名が両方にある場合、そのリクエストでは受信リクエストの値が優先されます。

トレースコンテキストヘッダー(traceparent、tracestate、baggage)は例外です。サーバー自身がトレースコンテキストを伝播するため、転送された値がサーバーの設定する値を上書きすることはありません。オブザーバビリティを参照してください。

  1. mcp-grafana のインストール方法はいくつかあります。

    • uvx(推奨): uv がインストールされていれば、追加の設定は不要です。uvx がサーバーを自動的にダウンロードして実行します。

      uvx mcp-grafana
      
    • Docker イメージ: Docker Hub のビルド済み Docker イメージを使用します。

      重要: Docker イメージのエントリポイントは、デフォルトで MCP サーバーを SSE モードで実行するよう設定されています。ただし、Claude Desktop などの AI アシスタントと直接連携する場合は、通常 STDIO モードを使用します。

      1. STDIO モード: stdio モードを使用するには、-t stdio でデフォルトを明示的に上書きし、stdin を開いたままにするために -i フラグを含める必要があります。
      docker pull grafana/mcp-grafana
      # For local Grafana:
      docker run --rm -i -e GRAFANA_URL=http://localhost:3000 -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> grafana/mcp-grafana -t stdio
      # For Grafana Cloud:
      docker run --rm -i -e GRAFANA_URL=https://myinstance.grafana.net -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> grafana/mcp-grafana -t stdio
      

      注 — ネットワーク接続モードを保護する: SSE モードと streamable-http モードでは、コンテナはループバック以外のアドレス(0.0.0.0:8000)にバインドします。呼び出し元トークンがない場合、サーバーは起動しますが、セキュリティエラーをログに記録します(error ログレベルで記録されるため、--log-level によって隠されません。また、将来のメジャーリリースでは起動を拒否するようになります)。クライアントに Authorization: Bearer <token> を要求するには、MCP_GRAFANA_SERVER_TOKEN を設定してください(推奨)。STDIO モードには影響しません。呼び出し元認証を参照してください。

      1. SSE モード: このモードでは、クライアントが接続する HTTP サーバーとして動作します。-p フラグを使ってポート 8000 を公開する必要があります。
      docker pull grafana/mcp-grafana
      docker run --rm -p 8000:8000 -e GRAFANA_URL=http://localhost:3000 -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> -e MCP_GRAFANA_SERVER_TOKEN=<caller auth token> grafana/mcp-grafana
      
      1. Streamable HTTP モード: このモードでは、複数のクライアント接続を処理できる独立したプロセスとして動作します。-p フラグを使ってポート 8000 を公開する必要があります。このモードでは、-t streamable-http でデフォルトを明示的に上書きする必要があります。
      docker pull grafana/mcp-grafana
      docker run --rm -p 8000:8000 -e GRAFANA_URL=http://localhost:3000 -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> -e MCP_GRAFANA_SERVER_TOKEN=<caller auth token> grafana/mcp-grafana -t streamable-http
      

      サーバー TLS 証明書を使用する HTTPS streamable HTTP モードの場合:

      docker pull grafana/mcp-grafana
      docker run --rm -p 8443:8443 \
        -v /path/to/certs:/certs:ro \
        -e GRAFANA_URL=http://localhost:3000 \
        -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> \
        -e MCP_GRAFANA_SERVER_TOKEN=<caller auth token> \
        grafana/mcp-grafana \
        -t streamable-http \
        -addr :8443 \
        --server.tls-cert-file /certs/server.crt \
        --server.tls-key-file /certs/server.key
      
    • バイナリをダウンロード: リリースページから mcp-grafana の最新リリースをダウンロードし、$PATH に配置します。

    • ソースからビルド: Go ツールチェーンがインストールされていれば、GOBIN 環境変数でバイナリのインストール先ディレクトリを指定して、ソースからビルドおよびインストールすることもできます。このディレクトリも $PATH に含まれている必要があります。

      GOBIN="$HOME/go/bin" go install github.com/grafana/mcp-grafana/v2/cmd/mcp-grafana@latest
      
    • Helm を使って Kubernetes にデプロイ: Grafana helm-charts リポジトリの Helm チャートを使用します。

      helm repo add grafana https://grafana.github.io/helm-charts
      helm install --set grafana.apiKey=<Grafana_ApiKey> --set grafana.url=<GrafanaUrl> my-release grafana/grafana-mcp
      
  2. クライアントの設定ファイルにサーバー設定を追加します。たとえば、Claude Desktop の場合:

    uvx を使用する場合:

    {
      "mcpServers": {
        "grafana": {
          "command": "uvx",
          "args": ["mcp-grafana"],
          "env": {
            "GRAFANA_URL": "http://localhost:3000",
            "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>"
          }
        }
      }
    }
    

    バイナリを使用する場合:

    {
      "mcpServers": {
        "grafana": {
          "command": "mcp-grafana",
          "args": [],
          "env": {
            "GRAFANA_URL": "http://localhost:3000",  // Or "https://myinstance.grafana.net" for Grafana Cloud
            "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>",
            // If using username/password authentication
            "GRAFANA_USERNAME": "<your username>",
            "GRAFANA_PASSWORD": "<your password>",
            // Optional: specify organization ID for multi-org support
            "GRAFANA_ORG_ID": "1"
          }
        }
      }
    }
    

注: Claude Desktop に Error: spawn mcp-grafana ENOENT が表示される場合は、mcp-grafana のフルパスを指定する必要があります。

Docker を使用する場合:

{
  "mcpServers": {
    "grafana": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "GRAFANA_URL",
        "-e",
        "GRAFANA_SERVICE_ACCOUNT_TOKEN",
        "grafana/mcp-grafana",
        "-t",
        "stdio"
      ],
      "env": {
        "GRAFANA_URL": "http://localhost:3000",  // Or "https://myinstance.grafana.net" for Grafana Cloud
        "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>",
        // If using username/password authentication
        "GRAFANA_USERNAME": "<your username>",
        "GRAFANA_PASSWORD": "<your password>",
        // Optional: specify organization ID for multi-org support
        "GRAFANA_ORG_ID": "1"
      }
    }
  }
}

注: -t stdio 引数は、Docker イメージのデフォルトの SSE モードを上書きするため、ここでは必須です。

リモート MCP サーバーで VSCode を使用する

VSCode を使用し、MCP サーバーを SSE モードで実行している場合(トランスポートを上書きせずに Docker イメージを使用すると、これがデフォルトです)、.vscode/settings.json に次の内容が含まれていることを確認してください。

"mcp": {
  "servers": {
    "grafana": {
      "type": "sse",
      "url": "http://localhost:8000/sse"
    }
  }
}

サーバー TLS 証明書を使用する HTTPS ストリーム可能 HTTP モードの場合:

"mcp": {
  "servers": {
    "grafana": {
      "type": "sse",
      "url": "https://localhost:8443/sse"
    }
  }
}

デバッグモード

コマンドに -debug フラグを追加すると、Grafana トランスポートのデバッグモードを有効にできます。これにより、MCP サーバーと Grafana API 間の HTTP リクエストとレスポンスが詳細にログ出力され、トラブルシューティングに役立ちます。

Claude Desktop の設定でデバッグモードを使用するには、次のように設定を更新します。

バイナリを使用する場合:

{
  "mcpServers": {
    "grafana": {
      "command": "mcp-grafana",
      "args": ["-debug"],
      "env": {
        "GRAFANA_URL": "http://localhost:3000",  // Or "https://myinstance.grafana.net" for Grafana Cloud
        "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>"
      }
    }
  }
}

Docker を使用する場合:

{
  "mcpServers": {
    "grafana": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "GRAFANA_URL",
        "-e",
        "GRAFANA_SERVICE_ACCOUNT_TOKEN",
        "grafana/mcp-grafana",
        "-t",
        "stdio",
        "-debug"
      ],
      "env": {
        "GRAFANA_URL": "http://localhost:3000",  // Or "https://myinstance.grafana.net" for Grafana Cloud
        "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>"
      }
    }
  }
}

注: 標準設定と同様に、Docker イメージのデフォルトの SSE モードを上書きするには、-t stdio 引数が必要です。

TLS 設定

Grafana インスタンスが mTLS の背後にある場合、またはカスタム TLS 証明書が必要な場合は、カスタム証明書を使用するように MCP サーバーを設定できます。サーバーは次の TLS 設定オプションをサポートしています。

  • --tls-cert-file: クライアント認証用 TLS 証明書ファイルのパス
  • --tls-key-file: クライアント認証用 TLS 秘密鍵ファイルのパス
  • --tls-ca-file: サーバー検証用 TLS CA 証明書ファイルのパス
  • --tls-skip-verify: TLS 証明書の検証をスキップする(安全ではありません。テスト時のみ使用してください)

クライアント証明書認証の例:

{
  "mcpServers": {
    "grafana": {
      "command": "mcp-grafana",
      "args": [
        "--tls-cert-file",
        "/path/to/client.crt",
        "--tls-key-file",
        "/path/to/client.key",
        "--tls-ca-file",
        "/path/to/ca.crt"
      ],
      "env": {
        "GRAFANA_URL": "https://secure-grafana.example.com",
        "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>"
      }
    }
  }
}

Docker の例:

{
  "mcpServers": {
    "grafana": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-v",
        "/path/to/certs:/certs:ro",
        "-e",
        "GRAFANA_URL",
        "-e",
        "GRAFANA_SERVICE_ACCOUNT_TOKEN",
        "grafana/mcp-grafana",
        "-t",
        "stdio",
        "--tls-cert-file",
        "/certs/client.crt",
        "--tls-key-file",
        "/certs/client.key",
        "--tls-ca-file",
        "/certs/ca.crt"
      ],
      "env": {
        "GRAFANA_URL": "https://secure-grafana.example.com",
        "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>"
      }
    }
  }
}

TLS 設定は、MCP サーバーが使用するすべての HTTP クライアントに適用されます。対象は次のとおりです。

  • メインの Grafana OpenAPI クライアント
  • Prometheus データソースクライアント
  • Loki データソースクライアント
  • インシデント管理クライアント
  • アラートクライアント
  • Asserts クライアント

CLI を直接使用する例:

自己署名証明書を使ったテスト:

./mcp-grafana --tls-skip-verify -debug

クライアント証明書認証を使用する場合:

./mcp-grafana \
  --tls-cert-file /path/to/client.crt \
  --tls-key-file /path/to/client.key \
  --tls-ca-file /path/to/ca.crt \
  -debug

カスタム CA 証明書のみを使用する場合:

./mcp-grafana --tls-ca-file /path/to/ca.crt

プログラムからの使用:

このライブラリをプログラムから使用する場合は、TLS 対応のコンテキスト関数を作成することもできます。

// Using struct literals
tlsConfig := &mcpgrafana.TLSConfig{
    CertFile: "/path/to/client.crt",
    KeyFile:  "/path/to/client.key",
    CAFile:   "/path/to/ca.crt",
}
grafanaConfig := mcpgrafana.GrafanaConfig{
    Debug:     true,
    TLSConfig: tlsConfig,
}
contextFunc := mcpgrafana.ComposedStdioContextFunc(grafanaConfig)

// Or inline
grafanaConfig := mcpgrafana.GrafanaConfig{
    Debug: true,
    TLSConfig: &mcpgrafana.TLSConfig{
        CertFile: "/path/to/client.crt",
        KeyFile:  "/path/to/client.key",
        CAFile:   "/path/to/ca.crt",
    },
}
contextFunc := mcpgrafana.ComposedStdioContextFunc(grafanaConfig)

URL の検証:

NewGrafanaClient を直接呼び出す場合(stdio またはプログラムによる構築)、到達可能なパニックを避けるため、URL を事前に検証してください。

if err := mcpgrafana.ValidateGrafanaURL(urlFromHeader); err != nil {
    http.Error(w, err.Error(), http.StatusBadRequest)
    return
}
client := mcpgrafana.NewGrafanaClient(ctx, urlFromHeader, apiKey, nil)

サーバー TLS 設定(ストリーム可能 HTTP トランスポートのみ)

ストリーム可能 HTTP トランスポート(-t streamable-http)を使用する場合、MCP サーバーが HTTP ではなく HTTPS を提供するように設定できます。これは、MCP クライアントとサーバー自体の間の接続を保護する必要がある場合に便利です。

サーバーは、ストリーム可能 HTTP トランスポートについて次の TLS 設定オプションをサポートしています。

  • --server.tls-cert-file: サーバー HTTPS 用 TLS 証明書ファイルのパス(TLS に必須)
  • --server.tls-key-file: サーバー HTTPS 用 TLS 秘密鍵ファイルのパス(TLS に必須)

注: これらのフラグは、上記で説明したクライアント TLS フラグとは完全に別のものです。クライアント TLS フラグは、MCP サーバーから Grafana への接続方法を設定します。一方、これらのサーバー TLS フラグは、ストリーム可能 HTTP トランスポートを使用する際に、クライアントから MCP サーバーへの接続方法を設定します。

HTTPS ストリーム可能 HTTP サーバーの例:

./mcp-grafana \
  -t streamable-http \
  --server.tls-cert-file /path/to/server.crt \
  --server.tls-key-file /path/to/server.key \
  -addr :8443

これにより、MCP サーバーは HTTPS ポート 8443 で起動します。クライアントは http://localhost:8000/ ではなく https://localhost:8443/ に接続します。

サーバー TLS を使用する Docker の例:

docker run --rm -p 8443:8443 \
  -v /path/to/certs:/certs:ro \
  -e GRAFANA_URL=http://localhost:3000 \
  -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> \
  grafana/mcp-grafana \
  -t streamable-http \
  -addr :8443 \
  --server.tls-cert-file /certs/server.crt \
  --server.tls-key-file /certs/server.key

ヘルスチェックエンドポイント

SSE(-t sse)またはストリーム可能 HTTP(-t streamable-http)トランスポートを使用する場合、MCP サーバーは /healthz にヘルスチェックエンドポイントを公開します。このエンドポイントは、ロードバランサー、監視システム、オーケストレーションプラットフォームが、サーバーの稼働と接続の受け入れを確認するために使用できます。

エンドポイント: GET /healthz

レスポンス:

  • ステータスコード: 200 OK
  • 本文: ok

使用例:

# For streamable HTTP or SSE transport on default port
curl http://localhost:8000/healthz

# Probe a side listener while MCP stays on loopback (Kubernetes + sidecar)
./mcp-grafana -t streamable-http --address 127.0.0.1:8000 --healthz-address :8080
curl http://127.0.0.1:8080/healthz

# With --base-path /my-base the MCP routes move under the prefix
# (/my-base/sse, /my-base/mcp), but healthz does not:
curl http://localhost:8000/healthz          # 200 ok
curl http://localhost:8000/my-base/healthz  # 404

注: ヘルスチェックエンドポイントは、SSE またはストリーム可能 HTTP トランスポートを使用する場合にのみ利用できます。stdio トランスポート(-t stdio)では HTTP サーバーが公開されないため、利用できません。

匿名の使用統計

サーバーは、呼び出されたツール、そのうち失敗した呼び出しの数、サーバーの設定内容など、自身の匿名の使用統計を Grafana Labs に報告できます。1 回のレポートが対象とするのは、1 人のユーザーや 1 つの会話ではなく、1 つのサーバープロセスです。レポートは 4 時間ごとに送信され、シャットダウン時にも 1 回送信されます。レポートはデフォルトで有効です。オプトアウトするには、--usage-stats=disabled、GRAFANA_USAGE_STATS=disabled、または DO_NOT_TRACK=1 を設定します。

ツールの引数、リソース名、クエリ、ログ行、エラーメッセージ、認証情報は送信されません。フラグは名前のみが記録され、値は記録されません。また、Grafana インスタンスは cloud または self_hosted としてのみ記述され、URL、ホスト名、スタックのスラッグ、組織名が記録されることはありません。ユーザー、セッション、クライアント単位の情報は一切ありません。通信上にセッション識別子はなく、ツール呼び出しを特定のクライアントに関連付ける方法もありません。

# Turn reporting on
mcp-grafana --usage-stats=enabled

# Turn it off (or GRAFANA_USAGE_STATS=disabled)
mcp-grafana --usage-stats=disabled

# Print what would be sent, to stderr, and send nothing
GRAFANA_USAGE_STATS=log mcp-grafana

DO_NOT_TRACK=1 も、ツール間で共通の DO_NOT_TRACK 規約に従ってレポートを無効にします。効果があるのは 1 のみで、無効化しかできません。また、--usage-stats と GRAFANA_USAGE_STATS はどちらもこれを上書きするため、ホストがグローバルに設定していても、個別のサーバーで再度有効にできます。

GRAFANA_USAGE_STATS_ENDPOINT は送信先を変更します。オプトアウトにはなりません。

フィールドの全一覧、送信されない情報、データの読み方と制限事項については、匿名の使用統計 を参照してください。

可観測性

MCP サーバーは、OTel MCP セマンティック規約 に従い、Prometheus メトリクス、OpenTelemetry 分散トレース、OpenTelemetry ログエクスポートをサポートしています。トレースとログのエクスポートは標準の OTEL_* 環境変数で設定し、どのトランスポートでも使用できます。

注: mcp-grafana は現在、トレースとログの両方で OTLP/gRPC トランスポートのみをサポートしています。OTEL_EXPORTER_OTLP_PROTOCOL(およびその _TRACES_PROTOCOL / _LOGS_PROTOCOL バリアント)は適用されず、常に gRPC が使用されます。

メトリクス

SSE またはストリーム可能 HTTP トランスポートを使用する場合、--metrics フラグで Prometheus メトリクスを有効にします。

# Metrics served on the main server at /metrics
./mcp-grafana -t streamable-http --metrics

# Metrics served on a separate address
./mcp-grafana -t streamable-http --metrics --metrics-address :9090

利用可能なメトリクス:

メトリクス種類説明
mcp_server_operation_duration_secondsHistogramMCP 操作の所要時間(ラベル: mcp_method_name、gen_ai_tool_name、error_type、network_transport、mcp_protocol_version)
http_server_request_duration_secondsHistogramHTTP サーバーリクエストの所要時間(otelhttp から)

注: メトリクスは、SSE またはストリーム可能 HTTP トランスポートを使用する場合にのみ利用できます。stdio トランスポートでは利用できません。

Loki コストガードレール(--loki-guardrail-mode)が有効な場合、その判定を記録するカウンターがさらに 4 つ追加されます。

メトリクス種類説明
mcp_loki_guardrail_admitted_totalCounter有効なすべてのチェックを通過したクエリ(ラベル: backend)
mcp_loki_guardrail_would_block_totalCountershadow モードでチェックに失敗したものの、そのまま実行されたクエリ(ラベル: backend、reason)
mcp_loki_guardrail_blocked_totalCounterenforce モードで拒否されたクエリ(ラベル: backend、reason)
mcp_loki_guardrail_fail_open_totalCounterガードレールが評価できず、許可されたクエリ(ラベル: backend、cause)

reason は selector、range、bytes のいずれかです。cause は unparseable または estimate_failed のいずれかです。backend は loki、victorialogs、unknown のいずれかです。複数のチェックに該当するクエリは、最初に実行されたチェック(selector、次に range、次に bytes)のラベルを付けて 1 回だけカウントされるため、4 つのカウンターでガード対象全体を網羅します。shadow → enforce のロールアウト中にこれらを読み取る方法については、可観測性 を参照してください。

Prometheus ガードレール(--prometheus-guardrail-mode)が有効な場合も、同様に 4 つのカウンターで判定を記録します。

メトリクス種類説明
mcp_prometheus_guardrail_admitted_totalCounter有効なすべてのチェックを通過したクエリ
mcp_prometheus_guardrail_would_block_totalCountershadow モードでチェックに失敗したものの、そのまま実行されたクエリ(ラベル: reason)
mcp_prometheus_guardrail_blocked_totalCounterenforce モードで拒否されたクエリ(ラベル: reason)
mcp_prometheus_guardrail_fail_open_totalCounter有効な評価が利用できない状態で許可されたクエリ(ラベル: reason)

reason は、would_block と blocked における selector、range、points、cardinality のいずれかです。各クエリは、指定された順序で最初に失敗したチェックに対して 1 回だけカウントされます。fail_open には unparseable または cardinality_unknown が使用されます。オプションのカーディナリティポリシーは、キャッシュされた上位 N 件の TSDB 統計を使用して、カーディナリティが高いことが判明しているメトリクスに明示的なスコープ指定を要求します。選択された系列を推定したり、欠落しているメトリクスが安全であると証明したりするものではありません。サポートされていない TSDB エンドポイントでは、このポリシーはフェイルオープンになります。backend ラベルはありません。

ライブラリを組み込む場合は、GrafanaConfig.MeterProvider(GrafanaConfig.Logger に対応するメトリクス設定)を設定してください。ガードレールはツールハンドラー内で実行されるため、コンストラクターのオプションはありません。また、プロセスが noop のグローバル MeterProvider を設定していると、すべての記録が破棄されます。

遅いリクエストのログ記録

--slow-request-threshold フラグを指定すると、MCP リクエスト(ツール呼び出し、一覧表示、リソース読み取りなど)が指定した時間を超えるたびに、構造化ログイベントが出力されます。デバッグログ全体を大量に出力せずに、遅いクエリやツール呼び出しを診断するのに役立ちます。

# Warn on any request slower than 500ms (works on all transports)
./mcp-grafana -t streamable-http --slow-request-threshold 500ms

# Same thing on stdio (the feature is transport-agnostic, unlike --metrics)
./mcp-grafana -t stdio --slow-request-threshold 500ms

# Log at INFO level instead of WARN (useful during investigation)
./mcp-grafana -t streamable-http --slow-request-threshold 500ms --slow-request-log-level info

ログイベントには、次の構造化属性が含まれます。

属性説明
mcp.methodMCP メソッド(例: tools/call、tools/list、resources/read)
duration観測されたリクエストの所要時間
threshold設定されたしきい値
toolツール名(tools/call メソッドの場合のみ存在)
errorリクエストが失敗した場合のエラー値(ベストエフォートのコンテキスト。内容は上流のエラーラッピングによって決まります)
error.typeカーディナリティが制限されたエラー分類(型なしエラーの場合は _OTHER)

遅いリクエストのログ記録は、stdio を含むすべてのトランスポートで機能し、--metrics は必要ありません。デフォルトのしきい値 0 では完全に無効になります。プロキシされたツールは tools/call を経由するため、自動的に対象になります。

トレース

分散トレースは標準の OTEL_* 環境変数で設定され、--metrics フラグとは独立して動作します。OTEL_EXPORTER_OTLP_ENDPOINT(またはシグナル固有の OTEL_EXPORTER_OTLP_TRACES_ENDPOINT)が設定されている場合、サーバーは OTLP/gRPC 経由でトレースをエクスポートします。

# Send traces to a local Tempo instance
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317 \
OTEL_EXPORTER_OTLP_INSECURE=true \
./mcp-grafana -t streamable-http

# Send traces to Grafana Cloud with authentication
OTEL_EXPORTER_OTLP_ENDPOINT=https://tempo-us-central1.grafana.net:443 \
OTEL_EXPORTER_OTLP_HEADERS="Authorization=Basic ..." \
./mcp-grafana -t streamable-http

ツール呼び出しスパンはセマンティック規約に従った名前(tools/call <tool_name>)を使用し、gen_ai.tool.name、mcp.method.name、mcp.session.id などの属性を含みます。また、サーバーはツール呼び出しリクエストの _meta フィールドから W3C トレースコンテキストを伝播することもサポートしています。

ログ

OTEL_EXPORTER_OTLP_ENDPOINT(またはシグナル固有の OTEL_EXPORTER_OTLP_LOGS_ENDPOINT)が設定されている場合、既存のプレーンテキストの stderr 出力に加えて、サーバーは構造化ログも OTLP/gRPC 経由でエクスポートします。otelslog ブリッジは、アクティブなスパンから trace_id と span_id を自動的に付与するため、ログレコードをサーバーがすでに出力しているトレースと関連付けられます。 トレースとログはそれぞれ独立してエンドポイントを解決するため、2つのシグナルは個別に有効化できます。OTEL_EXPORTER_OTLP_TRACES_ENDPOINT のみを設定するとログのエクスポートなしでトレースが有効になり、OTEL_EXPORTER_OTLP_LOGS_ENDPOINT のみを設定するとトレースなしでログのエクスポートが有効になり、汎用の OTEL_EXPORTER_OTLP_ENDPOINT を設定すると両方が有効になります。

汎用の OTEL_EXPORTER_OTLP_ENDPOINT を使用していて、ログのエクスポートを無効にしたい場合(例:バックエンドが LogsService に対応していない場合)は、次のように設定します。

OTEL_LOGS_EXPORTER=none

これにより、エンドポイントの設定にかかわらず、サーバーが OTLP ログエクスポーターを作成しなくなり、unknown service opentelemetry.proto.collector.logs.v1.LogsService のようなエラーを回避できます。

OTLP ロギングが有効でも、stderr へのログ出力は変わりません。引き続きコンテナログを利用するか、必要に応じて stderr を /dev/null にパイプできます。

# Send both logs and traces to a local OTel collector
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317 \
OTEL_EXPORTER_OTLP_INSECURE=true \
./mcp-grafana -t streamable-http

トランスポートは OTLP/gRPC(デフォルトポート 4317)です。ログは、OTLP/gRPC を受け付ける任意のマネージドバックエンド(たとえば Grafana Cloud)に直接送信できます。OTEL_EXPORTER_OTLP_LOGS_ENDPOINT(または汎用の OTEL_EXPORTER_OTLP_ENDPOINT)をリモートの gRPC エンドポイントに指定し、上記のトレースの例と同様に、OTEL_EXPORTER_OTLP_LOGS_HEADERS(または OTEL_EXPORTER_OTLP_HEADERS)で認証情報を渡します。ローカルの OTel コレクターは任意です。ファンアウト、バッチ処理、複数バックエンドへのルーティングには便利ですが、必須ではありません。

シグナル固有の各バリアント OTEL_EXPORTER_OTLP_LOGS_ENDPOINT、OTEL_EXPORTER_OTLP_LOGS_HEADERS、OTEL_EXPORTER_OTLP_LOGS_INSECURE、OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE、OTEL_EXPORTER_OTLP_LOGS_TIMEOUT、OTEL_EXPORTER_OTLP_LOGS_COMPRESSION は認識され、対応する汎用の OTEL_EXPORTER_OTLP_* より優先されます。全項目と優先順位の規則については、OTel exporter spec を参照してください。

設定されたコレクターに到達できない場合、ログレコードはメモリにバッファーされます(デフォルトのキューサイズ:2048)。キューがいっぱいになると、最も古いレコードが破棄されます。サービスをブロックすることなく、プロセスは動作を続けます。障害発生中もデータを損失なくバッファーする必要がある場合は、ローカルの OTel コレクターを設定してください。

stdio トランスポートでもログはエクスポートされるため、IDE クライアントから呼び出されるローカルの mcp-grafana インスタンスのログを簡単に一元管理できます。

メトリクス、トレース、ログを含む Docker の例:

docker run --rm -p 8000:8000 \
  -e GRAFANA_URL=http://localhost:3000 \
  -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your token> \
  -e OTEL_EXPORTER_OTLP_ENDPOINT=http://tempo:4317 \
  -e OTEL_EXPORTER_OTLP_INSECURE=true \
  grafana/mcp-grafana \
  -t streamable-http --metrics

Prometheus クエリの適用制限

--prometheus-enforced-matchers を使うと、オペレーターは、サーバーが読み取れる Prometheus の系列を制限できます。サーバーが発行する各ネイティブ Prometheus クエリのすべてのベクトルセレクターに、固定の PromQL ラベルマッチャーを AND 条件で追加します。これは、データソースに公開すべきでない系列(例:機密性の高いテナントラベルや顧客ラベルを含むメトリクス)があるものの、Prometheus レイヤーでアクセスを制限できない場合に便利です。

# Only ever read prod/staging environments (allowlist)
./mcp-grafana --prometheus-enforced-matchers 'environment=~"prod|staging"' --disable-api --disable-rendering --disable-assistant

# Never read the vault or payments namespaces (exclusion)
./mcp-grafana --prometheus-enforced-matchers 'namespace!~"vault|payments"' --disable-api --disable-rendering --disable-assistant

仕組み:

  • マッチャーは起動時に一度だけ解析されます(入力が無効な場合、サーバーの起動は中止されます)。その後、各クエリのすべてのベクトルセレクターに追加されます。ユーザークエリでできるのは、適用された範囲内で結果を絞り込むことだけであり、範囲を広げることはできません。
  • query_prometheus、query_prometheus_histogram、および run_panel_query の Prometheus パネルが対象です。
  • list_prometheus_label_names、list_prometheus_label_values、list_prometheus_metric_names を通じたネイティブ Prometheus の検出にも、セレクターが指定されていない場合を含め、すべての系列セレクターにマッチャーが適用されます。
  • 適用制限が有効な間は list_prometheus_metric_metadata が拒否されます。Prometheus のメタデータエンドポイントは系列ラベルでフィルタリングできず、複数のターゲットにまたがるメタデータを統合するためです。Cloud Monitoring の検出も拒否されます。検出 API が Prometheus のマッチャーポリシー全体を適用できないためです。
  • フェイルクローズ方式です。解析できないクエリは、フィルターなしで送信されるのではなく拒否されます。

[!IMPORTANT] 有効になっている他のツールを使うと、これらのマッチャーを回避できます。grafana_api_request を --disable-api で無効にし、レンダリングツールを --disable-rendering で、Grafana Assistant を --disable-assistant(または --disable-write)で無効にしてください。特に、render_grafana_app は query_datasource ソースを通じて、フィルターされていない Prometheus クエリを送信できます。--disable-dsquery はそのソースを閉じますが、サーバー側のパネルレンダリングは無効にしません。既存のダッシュボードスナップショットにも制限のないデータが含まれる場合があります。該当する場合は --disable-snapshot を使用してください。

Loki クエリの適用制限

--loki-enforced-matchers を使うと、オペレーターは、サーバーが読み取れる Loki のログストリームを制限できます。サーバーが発行するすべてのネイティブ Loki クエリに、固定の LogQL ラベルマッチャーを AND 条件で追加します。これは、公開すべきでないストリーム(例:機密情報を含む可能性のあるログ)がデータソースにあるものの、Grafana または Loki レイヤーでアクセスを制限できない場合に便利です(OSS にはデータソース単位またはユーザー単位のラベルアクセス制御がありません)。

# Only ever read prod/staging environments (allowlist)
./mcp-grafana --loki-enforced-matchers 'environment=~"prod|staging"' --disable-api

# Never read the vault or payments namespaces (exclusion)
./mcp-grafana --loki-enforced-matchers 'namespace!~"vault|payments"' --disable-api

仕組み:

  • マッチャーは起動時に一度だけ解析されます(入力が無効な場合、サーバーの起動は中止されます)。その後、各クエリのすべてのストリームセレクターに追加されます。Loki はセレクター内のマッチャーを AND 条件で評価するため、ユーザークエリでできるのは、適用された範囲内で結果を絞り込むことだけであり、範囲を広げることはできません。ポリシーと矛盾するユーザーセレクター(除外対象の {namespace="vault"} を要求する場合など)は、何も返しません。
  • query_loki_logs、query_loki_stats、query_loki_patterns、list_loki_label_names、list_loki_label_values が対象です。
  • フェイルクローズ方式です。解析できないクエリは、フィルターなしで送信されるのではなく拒否されます。
  • VictoriaLogs データソースは安全に書き換えられない LogsQL を使用するため、適用制限が有効な間は全面的に拒否されます。
  • 肯定条件のないマッチャーだけでは、ラベル列挙エンドポイントを制限できません(Loki は肯定マッチャーのない単独のセレクターを拒否します)。この例外は --loki-label-enumeration-fallback で制御します(デフォルトは reject。unfiltered にすると、ラベルメタデータの無制限な列挙を許可します。ログ行が公開されることはありません)。肯定条件のマッチャー/許可リストのマッチャーには影響しません。

[!IMPORTANT] 適用制限は Loki クエリツールにのみ適用されます。他のツールは、適用制限のあるバックエンドを経由しない経路で Loki のログデータにアクセスできます。そのため、制限を実際に有効にするには、次のツールも無効にする必要があります。

  • --disable-api — grafana_api_request は Loki データソースのプロキシに直接クエリを送信できます(完全な回避)。
  • --disable-rendering — get_panel_image は Loki パネルをサーバー側でレンダリングし、制限のないログ行を含む画像を生成します。
  • --disable-assistant — ask_assistant は Grafana Assistant に処理を委任します。Grafana Assistant はサーバー側で全ストリームの Loki データを読み取ります。書き込みツールが有効な場合にのみ登録されるため、--disable-write でも無効にできます。

サーバーは起動時に、これらのうち有効なままのツールをそれぞれ警告ログに記録します。 run_panel_query は安全です(適用制限のあるクエリ経路を再利用します)。Tempo ツールは Loki のログではなくトレースをクエリするため、回避経路にはなりません。ダッシュボードスナップショット(--disable-snapshot)にも、適用制限の外で取得されたログパネルのデータが埋め込まれている場合があります。

トラブルシューティング

Grafana のバージョン互換性

データソース関連のツールを使用中に次のエラーが発生した場合:

get datasource by uid : [GET /datasources/uid/{uid}][400] getDataSourceByUidBadRequest {"message":"id is invalid"}

通常、Grafana のバージョンが 9.0 より前であることを示しています。/datasources/uid/{uid} API エンドポイントは Grafana 9.0 で導入されたため、それ以前のバージョンではデータソース操作に失敗します。

解決策: この問題を解決するには、Grafana インスタンスをバージョン 9.0 以降にアップグレードしてください。

開発

コントリビューションを歓迎します!まず CONTRIBUTING.md をお読みください。このサーバーに含めるべき内容と提案方法について説明しています。

新しいツールを追加する場合は、コードを書く前にツールの提案を送信してください。デフォルトで有効なツールは、すべてのユーザーのすべてのリクエストでモデルに送信されるため、完成したプルリクエストを却下するより、アイデアの段階で相談していただけると助かります。バグ修正、ドキュメント、テスト、既存ツールへのパラメーター追加には提案は不要です。そのまま PR をお送りください。

このプロジェクトは Go で書かれています。ツールのバージョンと開発タスクは mise.toml にあります。mise をインストールし、mise install を実行して固定バージョンのツールを取得し、mise tasks を実行してタスク一覧を表示してください。

ローカル開発のデフォルトである STDIO モードでサーバーをローカル実行するには、次のコマンドを使用します。

mise run run

SSE モードでサーバーをローカル実行するには、次のコマンドを使用します。

go run ./cmd/mcp-grafana --transport sse

カスタムビルドした Docker イメージ内で SSE トランスポートを使ってサーバーを実行することもできます。公開済みの Docker イメージと同様に、このカスタムイメージのエントリーポイントもデフォルトで SSE モードになります。イメージをビルドするには、次のコマンドを使用します。

mise run build-image

SSE モード(デフォルト)でイメージを実行するには、次のコマンドを使用します。

docker run -it --rm -p 8000:8000 mcp-grafana:latest

代わりに STDIO モードで実行する必要がある場合は、トランスポート設定を上書きします。

docker run -it --rm mcp-grafana:latest -t stdio

テスト

利用できるテストは次の 3 種類です。

  1. 単体テスト(外部依存関係は不要):
mise run test-unit

次のコマンドでも単体テストを実行できます。

mise run test
  1. 統合テスト(Docker コンテナが起動している必要があります):
mise run test-integration
  1. クラウドテスト(Grafana Cloud インスタンスと認証情報が必要です):
mise run test-cloud

注:クラウドテストは CI で自動的に設定されます。ローカル開発では、独自の Grafana Cloud インスタンスと認証情報を用意する必要があります。

より包括的な統合テストを実行するには、ポート 3000 で Grafana インスタンスをローカル起動する必要があります。Docker Compose で次のように起動できます。

docker-compose up -d

ツールを追加する場合は、そのツールの統合テストも追加してください。既存のテストが参考になります。

Lint

コードを lint するには、次のコマンドを実行します。

mise run lint

これには、jsonschema 構造体タグ内のエスケープされていないカンマを検出するカスタムリンターも含まれます。description フィールド内のカンマは、意図しない切り詰めを防ぐために \\, でエスケープする必要があります。このリンターだけを実行するには、次のコマンドを使用します。

mise run lint-jsonschema

詳しくは、JSONSchema Linter のドキュメントを参照してください。

ライセンス

このプロジェクトは Apache License, Version 2.0 の下でライセンスされています。