Grafana
公式Grafanaインスタンス内のダッシュボードを検索し、インシデントを調査し、データソースにクエリを実行します。
Grafana MCPで何ができますか?
- ダッシュボードの検索と検査 — タイトル、フォルダー、タグ、またはスター付きステータスでダッシュボードを検索し、
search_dashboards、get_dashboard_summary、またはget_dashboard_propertyを使用してサマリー、バージョン、または$.titleなどの特定のJSONPathプロパティを取得します。 - PrometheusとLokiのクエリ — PromQLまたはLogQLクエリを実行し、メトリクス/ラベルメタデータを取得し、データソースから直接ヒストグラムのパーセンタイル(p50–p99)を計算します。
- アラートとインシデントの管理 — アラートルールを一覧表示または作成し、発火ステータスを確認し、カスタムフィールドを使用してGrafanaインシデントレコードを検索または更新します。
- SQLおよびCloudWatchデータの探索 — ClickHouse、Snowflake、Athena、MySQL、PostgreSQL、またはMSSQLでテーブルを一覧表示し、スキーマを説明し、マクロを使用してSQLを実行します。また、名前空間とディメンションでCloudWatchメトリクスをクエリします。
- ダッシュボードのレンダリングとリンク生成 — パネルまたはダッシュボードをPNG画像として取得するか、時間範囲と変数を含むダッシュボード、パネル、Exploreへの正確なディープリンクを作成します。
ドキュメント
Grafana MCPサーバー
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などのその他のインストールオプションについては、Usageを参照してください。
要件
- フル機能にはGrafanaバージョン9.0以降が必要です。特にデータソース関連の操作など一部の機能は、APIエンドポイントが存在しないため、それ以前のバージョンでは正しく動作しない場合があります。
機能
以下はMCPサーバーで現在利用可能な機能です。このリストは情報提供のみを目的としており、将来の機能に関するロードマップやコミットメントを表すものではありません。
ダッシュボード
- ダッシュボードの検索: タイトル、フォルダUID、タグ、またはスター付きステータスでダッシュボードを検索します
- UIDによるダッシュボードの取得: 一意の識別子を使用してダッシュボードの完全な詳細を取得します。現在のダッシュボードの代わりに保存済みスナップショットを読み込むには、オプションの
versionを渡します。警告:大きなダッシュボードはコンテキストウィンドウの容量を大量に消費する可能性があります。 - ダッシュボードバージョンの一覧表示: ダッシュボードの保存済みバージョンをコンパクトなメタデータ(バージョン番号、作成者、タイムスタンプ、保存メッセージ)として一覧表示します
- ダッシュボードサマリーの取得: 完全なJSONを使用せずに、タイトル、パネル数、パネルタイプ、変数、メタデータを含むダッシュボードのコンパクトな概要を取得して、コンテキストウィンドウの使用を最小限に抑えます
- ダッシュボードプロパティの取得: JSONPath式(例:
$.title、$.panels[*].title)を使用してダッシュボードの特定の部分を抽出し、必要なデータのみを取得してコンテキストウィンドウの消費を削減します - ダッシュボードの更新または作成: 既存のダッシュボードの変更または新規作成を行います。警告:完全なダッシュボードJSONが必要であり、コンテキストウィンドウの容量を大量に消費する可能性があります。
- ダッシュボードのパッチ適用: 完全なJSONを必要とせずにダッシュボードに特定の変更を適用し、対象を絞った変更でのコンテキストウィンドウの使用を大幅に削減します
- パネルクエリとデータソース情報の取得: ダッシュボード内のすべてのパネルから、タイトル、クエリ文字列、データソース情報(利用可能な場合はUIDとタイプを含む)を取得します
パネルクエリの実行
注: パネルクエリ実行ツールはデフォルトでは無効です。有効にするには、
runpanelqueryを--enabled-toolsフラグに追加してください。
- パネルクエリの実行: カスタム時間範囲と変数オーバーライドを使用して、ダッシュボードパネルのクエリを実行します。
コンテキストウィンドウ管理
ダッシュボードツールには、コンテキストウィンドウの使用を効果的に管理するためのいくつかの戦略が含まれています(issue #101):
- ダッシュボードの概要と変更計画には
get_dashboard_summaryを使用 - ダッシュボードの特定の部分のみが必要な場合は、JSONPathとともに
get_dashboard_propertyを使用 - 完全なダッシュボードJSONが特に必要な場合を除き、
get_dashboard_by_uidは避ける
データソース
- データソース情報の一覧表示と取得: 設定済みのすべてのデータソースを表示し、各データソースの詳細情報を取得します。
- サポートされているデータソースタイプ:Prometheus、Loki、ClickHouse、CloudWatch、Elasticsearch、OpenSearch、Snowflake、Athena。
クエリ例
注: クエリ例ツールはデフォルトでは無効です。有効にするには、
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をサポートします。クエリはGrafanaのデータソースプラグインを経由するため、認証はデータソース設定によって処理されます。資格情報がMCPサーバーに表示されることはありません。
- データベース/スキーマ/カタログの一覧表示: SQLデータソースの組織単位を検出します。Athenaの場合、カタログを省略するとカタログが一覧表示され、カタログを渡すとデータベースが一覧表示されます。
- テーブルの一覧表示: データベースまたはスキーマ内のテーブルをメタデータ(利用可能な場合は行数、サイズ)とともに一覧表示します。
- テーブルスキーマの説明: 列名、型、NULL許容性、デフォルト値、コメントを取得します。
- SQLのクエリ: データソース固有のマクロ置換(
$__timeFilter(col)、$__from/$__to、$__interval、${varname})、自動制限適用、テンプレート変数サポートを使用してSQLクエリを実行します。
CloudWatchクエリ
注: CloudWatchツールはデフォルトでは無効です。有効にするには、
cloudwatchを--enabled-toolsフラグに追加してください。
- CloudWatch名前空間の一覧表示: 利用可能なAWS CloudWatch名前空間を検出します。
- CloudWatchメトリックの一覧表示: 特定の名前空間で利用可能なメトリックを一覧表示します。
- CloudWatchディメンションの一覧表示: メトリッククエリをフィルタリングするためのディメンションを取得します。
- CloudWatchのクエリ: 時間範囲サポート付きでCloudWatchメトリッククエリを実行します。
Google Cloud Loggingクエリ
注: Google Cloud Loggingツールはデフォルトでは無効です。有効にするには、
cloudloggingを--enabled-toolsフラグに追加してください。Google Cloud Loggingデータソースプラグイン(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レンダリングAPIクエリを実行します。
- Graphiteメトリックの一覧表示: Graphiteメトリックパスを参照および検出します。
- Graphiteタグの一覧表示: 利用可能なGraphiteタグとタグ値を一覧表示します。
- Graphite密度のクエリ: 指定されたパターンのGraphiteメトリック密度をクエリします。
Elasticsearch/OpenSearchクエリ
注: Elasticsearch/OpenSearchツールはデフォルトでは無効です。有効にするには、
elasticsearchを--enabled-toolsフラグに追加してください。
- Elasticsearch/OpenSearchのクエリ: Luceneクエリ構文またはElasticsearchクエリDSLを使用して、ElasticsearchまたはOpenSearchデータソースに対して検索クエリを実行します。時間範囲によるフィルタリングと、ログ、メトリック、またはインデックス化された任意のデータの取得をサポートします。インデックス、ID、ソースフィールド、オプションの関連性スコアを含むドキュメントを返します。
Quickwitクエリ
注: Quickwitツールはデフォルトでは無効です。有効にするには、
quickwitを--enabled-toolsフラグに追加してください。
- Quickwitのクエリ: Luceneクエリ構文または部分的なElasticsearch互換クエリDSLを使用して、Quickwitデータソースに対して検索クエリを実行します。時間範囲によるフィルタリングと、ログやその他のインデックス化されたドキュメントの取得をサポートします。インデックス、ID、ソースフィールド、オプションの関連性スコアを含むドキュメントを返します。
エージェント可観測性
注: エージェント可観測性ツールはデフォルトでは無効で、Grafana Cloudでのみ動作します。有効にするには、
agento11yを--enabled-toolsフラグに追加してください。
- 会話の一覧表示と検索: 最近のLLM会話を一覧表示したり、フィルター式(モデル、プロバイダー、エージェント、ステータス、エラータイプ、評価結果など)で時間範囲を指定して検索したりできます。検索結果には、エラー数、評価サマリー、評価結果サマリー、トレースIDが含まれます。
- 会話の詳細を取得: プロンプトと出力を含む、すべての生成結果を持つ単一の会話を取得します。
- 生成結果の詳細とスコアを取得: IDで単一の生成結果を取得し、その評価スコア(評価者、スコアキー、値、合格/不合格、説明)を取得します。
- エージェントカタログを読む: テレメトリを送信するエージェントを一覧表示し、1つのエージェントバージョンを完全に取得し(完全なシステムプロンプト、JSONスキーマを持つすべてのツール、実行されたモデル)、エージェントのバージョン履歴を確認し、バージョンごとの評価スコア集計を比較します。有効なバージョンは、ツールの変更が影響しない
sha256:ハッシュです。エージェントが独自のバージョンを報告しない場合、システムプロンプトがハッシュされるため、プロンプトを編集すると新しいバージョンが作成されます。カタログとバージョンの行にはtoken_estimateが含まれており、完全なプロンプトを取得する前に確認する価値があります。 - 評価者とテンプレートを検査: スコアの由来となった評価者、その派生元のテンプレート、LLM判定評価者が利用できる判定プロバイダーとモデルを読み取ります。書き込みツールが有効な場合は、評価者の作成、フォーク、テスト、削除も行えます。
- 評価ルールとガードを検査: 評価者を本番トラフィックにバインドする非同期評価ルールと、インラインで実行され警告または拒否できるガード(フックルール)を読み取ります。書き込みツールが有効な場合は、それらの作成、更新、プレビュー、削除も行えます。書き込み操作と、永続化されない
preview_ruleおよびtest_evaluator操作には、Agento11y管理者ロールによって付与されるgrafana-agento11y-app.eval:write権限が必要です。 - 保存された会話とコレクションをキュレーション: 保存された会話(会話に安定したID、名前、タグを提供するブックマーク)と、それらをグループ化するコレクション(各コレクションのメンバー数と、保存された会話の各行に埋め込まれたコレクションを含む)を読み取ります。書き込みツールが有効な場合は、会話のブックマーク、コレクションの作成と編集、メンバーの追加または削除も行えます。これらの書き込みには、同じ
grafana-agento11y-app.eval:write権限が必要です。 - テストスイートの読み取りと編集: オフライン実験が実行されるバージョン管理されたテストスイートを一覧表示し、完全なバージョン履歴とともに1つを読み取り、バージョンのテストケースをページングします。書き込みツールが有効な場合は、スイートの作成、名前変更または再タグ付け、ドラフトバージョンのオープン、公開、テストケースの書き込みまたは削除も行えます。公開されたバージョンは固定されているため、編集するには新しいドラフトを開く必要があります。これらの書き込みには
grafana-agento11y-app.eval:writeが必要です。 - オフライン実験を読む: テストスイートに対する評価実行を一覧表示し、主要な合格率、コスト、トークン合計とともに1つを読み取ります。テストケースごとのレポートから、トライアル、各判定者の説明付きのスコア、およびそのアーティファクトメタデータにドリルダウンします。書き込みツールが有効な場合は、実験の名前変更または再タグ付けと、実行中の実験のキャンセルも行えます。これには
grafana-agento11y-app.eval:writeが必要です。実験は、このツールではなくSDKランナーによって作成されます。
Grafanaアシスタント
注: アシスタントツールはデフォルトで無効であり、ターゲットのGrafanaインスタンスにGrafanaアシスタントプラグイン(
grafana-assistant-app)がインストールされている必要があります。また、これらは書き込みツール(アシスタントがスタック状態を変更する可能性があります)であるため、--disable-writeが設定されている場合はスキップされます。有効にするには、assistantを--enabled-toolsフラグに追加します。
- アシスタントに質問: 自然言語のプロンプトをGrafanaアシスタントに送信し、完全なテキスト返信を待ちます。アシスタントは、ツール、メトリクス、ログ、その他のスタックコンテキストを使用できます。これは、単一の独立したデータソースクエリを実行するよりも広範です。返された
contextIdをフォローアップ呼び出しで渡すと、同じ会話を続行できます。複雑なタスクには数分かかる場合があります。呼び出しは、返信が完了するか、リクエストがタイムアウトする(5分)までブロックされます。
インシデント
- インシデントの検索、作成、更新: Grafanaインシデントでインシデントを管理します。検索、作成、アクティビティの追加、カスタムフィールドの読み取りまたは設定が含まれます。
Sift調査
- Sift調査の一覧表示: 制限パラメータをサポートして、Sift調査のリストを取得します。
- Sift調査の取得: UUIDで特定のSift調査の詳細を取得します。
- Sift分析の取得: Sift調査から特定の分析を取得します。
- ログのエラーパターンを見つける: Siftを使用してLokiログの elevated エラーパターンを検出します。
- 遅いリクエストを見つける: Sift(Tempo)を使用して遅いリクエストを検出します。
アラート
- アラートルール情報の一覧表示と取得: 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) - エクスプローラーリンク: 事前設定されたデータソースを使用してGrafanaエクスプローラーへのリンクを生成します(例:
http://localhost:3000/explore?schemaVersion=1&panes={"a":{"datasource":"prometheus-uid"}})。Grafana 10.2未満はpanesを理解しないため、これらのバージョンでは代わりにレガシーの?left={...}形式が出力されます。 - 時間範囲のサポート: リンクに時間範囲パラメータを追加します(
from=now-1h&to=now) - カスタムパラメータ: ダッシュボード変数や更新間隔などの追加のクエリパラメータを含めます
- ダッシュボードリンク: UIDを使用してダッシュボードへの直接リンクを生成します(例:
注釈
- 注釈の取得: フィルター付きで注釈をクエリします。時間範囲、ダッシュボードUID、タグ、一致モードをサポートします。
- 注釈の作成: ダッシュボードまたはパネルに新しい注釈を作成します。
- Graphite注釈の作成: Graphite形式(
what、when、tags、data)を使用して注釈を作成します。 - 注釈の更新: 既存の注釈のすべてのフィールドを置き換えます(完全更新)。
- 注釈のパッチ: 注釈の特定のフィールドのみを更新します(部分更新)。
- 注釈の削除: IDで注釈を完全に削除します。
- 注釈タグの取得: オプションのフィルタリング付きで利用可能な注釈タグを一覧表示します。
スナップショット
- スナップショットの一覧表示: オプションのクエリと制限フィルターを使用して、ダッシュボードスナップショットを一覧表示します。
- スナップショットの取得: スナップショットキーでスナップショットのメタデータとダッシュボードペイロードを取得します。
- スナップショットの作成: 完全なダッシュボードペイロードからダッシュボードスナップショットを作成します。オプションの有効期限と外部スナップショットオプションがあります。
- スナップショットの削除: スナップショットキーでスナップショットを削除します。
レンダリング
- パネルまたはダッシュボード画像の取得: Grafanaダッシュボードパネルまたは完全なダッシュボードをPNG画像としてレンダリングします。レポート、アラート、プレゼンテーションで使用するために、画像をbase64エンコードデータとして返します。寸法、時間範囲、テーマ、スケール、ダッシュボード変数のカスタマイズをサポートします。また、オプションの
provisioningPreviewパラメータを介して、プロビジョニングリポジトリブランチ(例: git-sync PRプレビュー)から未適用のダッシュボードのレンダリングもサポートします。- 注: Grafana Image Rendererサービスがインストールおよび設定されている必要があります。
プロビジョニング
- プロビジョニングリポジトリの一覧表示: この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サーバー操作を許可する広範な読み取り/書き込みアクセスを付与します。手動で適用されるスコープよりも細かくない(したがって制限が少ない)ため、厳格な最小権限アクセスよりも利便性が重要な場合にのみ使用してください。
注: GrafanaインシデントおよびSiftツールは、きめ細かいRBAC権限の代わりに基本的なGrafanaロールを使用します:
- ビューアーロール: 読み取り専用操作に必要(インシデントの一覧表示、調査の取得)
- エディターロール: 書き込み操作に必要(インシデントの作成、調査の変更)
Grafana RBACの詳細については、公式ドキュメントを参照してください。
RBACスコープ
スコープは、権限が適用される特定のリソースを定義します。各アクションには、適切な権限とスコープの組み合わせの両方が必要です。
一般的なスコープパターン:
-
広範なアクセス: 組織全体へのアクセスには
*ワイルドカードを使用しますdatasources:*- すべてのデータソースへのアクセスdashboards:*- すべてのダッシュボードへのアクセスfolders:*- すべてのフォルダーへのアクセスteams:*- すべてのチームへのアクセス
-
制限付きアクセス: 特定のUIDまたはIDを使用して、個々のリソースへのアクセスを制限します
datasources:uid:prometheus-uid- 特定のPrometheusデータソースのみへのアクセスdashboards:uid:abc123- UIDabc123のダッシュボードのみへのアクセスfolders:uid:xyz789- UIDxyz789のフォルダーのみへのアクセスteams:id:5- ID5のチームのみへのアクセスglobal.users:id:123- ID123のユーザーのみへのアクセス
例:
-
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_teams | 管理 | すべてのチームを一覧表示 | teams:read | teams:* または teams:id:1 |
list_users_by_org | 管理 | 組織内のすべてのユーザーを一覧表示 | users:read | global.users:* または global.users:id:123 |
list_all_roles | 管理 | すべてのGrafanaロールを一覧表示 | roles:read | roles:* |
get_role_details | 管理 | Grafanaロールの詳細を取得 | roles:read | roles:uid:editor |
get_role_assignments | 管理 | ロールの割り当てを一覧表示 | roles:read | roles:uid:editor |
list_user_roles | 管理 | ユーザーのロールを一覧表示 | roles:read | global.users:id:123 |
list_team_roles | 管理 | チームのロールを一覧表示 | roles:read | teams:id:7 |
get_resource_permissions | 管理 | リソースの権限を一覧表示 | permissions:read | dashboards:uid:abcd1234 |
get_resource_description | 管理 | Grafanaリソースタイプを説明 | permissions:read | dashboards:* |
user_info | ユーザー | 現在のID、機能、アクセス可能な組織 | なし(サインイン済みユーザー) | — |
search_dashboards | 検索 | クエリ、フォルダUID、タグ、またはスター付きでダッシュボードを検索 | dashboards:read | dashboards:* または dashboards:uid:abc123 |
get_dashboard_by_uid | ダッシュボード | UIDでダッシュボードを取得(必要に応じて保存済みバージョン) | dashboards:read | dashboards:uid:abc123 |
list_dashboard_versions | ダッシュボード | ダッシュボードの保存済みバージョンを一覧表示(バージョン、作成者、時刻、メッセージ) | dashboards:read | dashboards:uid:abc123 |
update_dashboard | ダッシュボード | ダッシュボードを更新または新規作成 | dashboards:create、dashboards:write | dashboards:*、folders:* または folders:uid:xyz789 |
get_dashboard_panel_queries | ダッシュボード | ダッシュボードからパネルタイトル、クエリ、データソースUIDとタイプを取得 | dashboards:read | dashboards:uid:abc123 |
run_panel_query | パネルクエリ実行* | 1つ以上のダッシュボードパネルクエリを実行 | dashboards:read、datasources:query | dashboards:uid:*、datasources:uid:* |
get_dashboard_property | ダッシュボード | JSONPath式を使用してダッシュボードの特定部分を抽出 | dashboards:read | dashboards:uid:abc123 |
get_dashboard_summary | ダッシュボード | 完全なJSONなしでダッシュボードの簡潔な要約を取得 | dashboards:read | dashboards:uid:abc123 |
list_datasources | データソース | データソースを一覧表示 | datasources:read | datasources:* |
get_datasource | データソース | UIDまたは名前でデータソースを取得 | datasources:read | datasources:uid:prometheus-uid |
get_query_examples | 例* | データソースタイプのサンプルクエリを取得 | datasources:read | datasources:* |
query_prometheus | Prometheus | Prometheusデータソースに対してクエリを実行 | datasources:query | datasources:uid:prometheus-uid |
list_prometheus_metric_metadata | Prometheus | メトリックメタデータを一覧表示 | datasources:query | datasources:uid:prometheus-uid |
list_prometheus_metric_names | Prometheus | 利用可能なメトリック名を一覧表示 | datasources:query | datasources:uid:prometheus-uid |
list_prometheus_label_names | Prometheus | セレクタに一致するラベル名を一覧表示 | datasources:query | datasources:uid:prometheus-uid |
list_prometheus_label_values | Prometheus | 特定のラベルの値を一覧表示 | datasources:query | datasources:uid:prometheus-uid |
query_prometheus_histogram | Prometheus | ヒストグラムのパーセンタイル値を計算 | datasources:query | datasources:uid:prometheus-uid |
list_incidents | インシデント | Grafanaインシデントのインシデントを一覧表示(必要に応じてカスタムフィールド値も含む) | ビューアーロール | N/A |
create_incident | インシデント | Grafanaインシデントにインシデントを作成(必要に応じてカスタムフィールドを設定) | エディターロール | N/A |
add_activity_to_incident | インシデント | Grafanaインシデントのインシデントにアクティビティ項目を追加 | エディターロール | N/A |
update_incident | インシデント | Grafanaインシデントのインシデントを更新(ステータス、重大度、タイトル、またはカスタムフィールド) | エディターロール | N/A |
get_incident | インシデント | IDで単一のインシデントを取得(カスタムフィールドを含む) | ビューアーロール | N/A |
list_incident_custom_fields | インシデント | インシデント用に設定されたカスタムフィールドをタイプと選択オプション付きで一覧表示 | ビューアーロール | N/A |
query_loki_logs | Loki | LogQLを使用してログをクエリおよび取得(ログまたはメトリッククエリのいずれか) | datasources:query | datasources:uid:loki-uid |
list_loki_label_names | Loki | ログ内の利用可能なすべてのラベル名を一覧表示 | datasources:query | datasources:uid:loki-uid |
list_loki_label_values | Loki | 特定のログラベルの値を一覧表示 | datasources:query | datasources:uid:loki-uid |
query_loki_stats | Loki | ログストリームに関する統計を取得 | datasources:query | datasources:uid:loki-uid |
query_loki_patterns | Loki | 検出されたログパターンをクエリして共通構造を特定 | datasources:query | datasources:uid:loki-uid |
analyze_loki_labels | Loki | Lokiラベル戦略(ライブまたは静的)を監査し、必要に応じてクエリパフォーマンスを診断 | datasources:query | datasources:uid:loki-uid |
suggest_loki_alloy_label_config | 設定 | 承認されたラベルを強制するAlloy loki.process スニペットを生成 | N/A | N/A |
query_influxdb | InfluxDB | InfluxQL(v1)またはFlux(v2)を使用してInfluxDBをクエリする | datasources:query | datasources:uid:influxdb-uid |
list_sql_databases | SQL* | SQLデータソースからデータベース、スキーマ、またはカタログを一覧表示する | datasources:query | datasources:uid:* |
list_sql_tables | SQL* | SQLデータソース内のテーブルを一覧表示する | datasources:query | datasources:uid:* |
describe_sql_table | SQL* | テーブルのカラムスキーマを取得する | datasources:query | datasources:uid:* |
query_sql | SQL* | マクロ置換を使用してSQLクエリを実行する | datasources:query | datasources:uid:* |
list_cloudwatch_namespaces | CloudWatch* | 利用可能なAWS CloudWatch名前空間を一覧表示する | datasources:query | datasources:uid:* |
list_cloudwatch_metrics | CloudWatch* | 名前空間内のメトリクスを一覧表示する | datasources:query | datasources:uid:* |
list_cloudwatch_dimensions | CloudWatch* | メトリクスのディメンションを一覧表示する | datasources:query | datasources:uid:* |
list_cloudwatch_dimension_values | CloudWatch* | ディメンションキーの値を一覧表示する | datasources:query | datasources:uid:* |
query_cloudwatch | CloudWatch* | CloudWatchメトリクスクエリを実行する | datasources:query | datasources:uid:* |
list_cloud_logging_projects | Cloud Logging* | Google Cloud Loggingデータソースで読み取り可能なGCPプロジェクトを一覧表示する | datasources:query | datasources:uid:* |
list_cloud_logging_buckets | Cloud Logging* | GCPプロジェクト内のログバケットを一覧表示する | datasources:query | datasources:uid:* |
list_cloud_logging_views | Cloud Logging* | ログバケット内のログビューを一覧表示する | datasources:query | datasources:uid:* |
query_cloud_logging | Cloud Logging* | Cloud Loggingクエリ言語を使用してログをクエリする | datasources:query | datasources:uid:* |
query_elasticsearch | Elasticsearch/OpenSearch* | Lucene構文またはQuery DSLを使用してElasticsearchまたはOpenSearchをクエリする | datasources:query | datasources:uid:datasource-uid |
query_quickwit | Quickwit* | Lucene構文またはQuery DSLを使用してQuickwitをクエリする | datasources:query | datasources:uid:quickwit-uid |
alerting_manage_rules | Alerting | アラートルールを管理する(一覧表示、取得、バージョン、作成、更新、削除) | alert.rules:read + alert.rules:write(変更操作用) | folders:* または folders:uid:alerts-folder |
alerting_manage_routing | Alerting | 通知ポリシー、連絡先ポイント、時間間隔を管理する | alert.notifications:read | グローバルスコープ |
alerting_manage_silences | Alerting | アラートサイレンスを管理する(一覧表示、取得、作成、更新、期限切れ) | alert.instances:read + alert.instances:write(変更操作用) | グローバルスコープ |
list_oncall_schedules | OnCall | Grafana OnCallからスケジュールを一覧表示する | grafana-oncall-app.schedules:read | プラグイン固有のスコープ |
get_oncall_shift | OnCall | 特定のOnCallシフトの詳細を取得する | grafana-oncall-app.schedules:read | プラグイン固有のスコープ |
get_current_oncall_users | OnCall | 特定のスケジュールで現在オンコール中のユーザーを取得する | grafana-oncall-app.schedules:read | プラグイン固有のスコープ |
list_oncall_teams | OnCall | Grafana OnCallからチームを一覧表示する | grafana-oncall-app.user-settings:read | プラグイン固有のスコープ |
list_oncall_users | OnCall | Grafana OnCallからユーザーを一覧表示する | grafana-oncall-app.user-settings:read | プラグイン固有のスコープ |
list_alert_groups | OnCall | フィルタリングオプションを使用してGrafana OnCallからアラートグループを一覧表示する | grafana-oncall-app.alert-groups:read | プラグイン固有のスコープ |
get_alert_group | OnCall | IDでGrafana OnCallから特定のアラートグループを取得する | grafana-oncall-app.alert-groups:read | プラグイン固有のスコープ |
update_alert_group | OnCall | アラートグループを確認、未確認、解決、または未解決にする | grafana-oncall-app.alert-groups:write(および :read) | プラグイン固有のスコープ |
get_sift_investigation | Sift | UUIDで既存のSift調査を取得する | ビューアーロール | N/A |
get_sift_analysis | Sift | Sift調査から特定の分析を取得する | ビューアーロール | N/A |
list_sift_investigations | Sift | オプションの制限付きでSift調査の一覧を取得する | ビューアーロール | N/A |
find_error_pattern_logs | Sift | Lokiログ内のエラーパターンの上昇を検出する。 | エディターロール | N/A |
find_slow_requests | Sift | 関連するtempoデータソースから遅いリクエストを検出する。 | エディターロール | N/A |
list_pyroscope_label_names | Pyroscope | セレクタに一致するラベル名を一覧表示する | datasources:query | datasources:uid:pyroscope-uid |
list_pyroscope_label_values | Pyroscope | ラベル名に対してセレクタに一致するラベル値を一覧表示する | datasources:query | datasources:uid:pyroscope-uid |
list_pyroscope_profile_types | Pyroscope | 利用可能なプロファイルタイプを一覧表示する | datasources:query | datasources:uid:pyroscope-uid |
query_pyroscope | Pyroscope | Pyroscopeからプロファイル、メトリクス、またはその両方をクエリする | datasources:query | datasources:uid:pyroscope-uid |
get_assertions | Asserts | 指定されたエンティティのアサーションサマリーを取得する | プラグイン固有の権限 | プラグイン固有のスコープ |
agento11y_manage_conversations | Agent Observability* | Grafana Agent ObservabilityからLLM会話を一覧表示、検索、取得する | grafana-agento11y-app.conversations:read | N/A |
agento11y_manage_generations | Agent Observability* | Grafana Agent ObservabilityからLLM生成の詳細と評価スコアを取得する | grafana-agento11y-app.data:read | N/A |
agento11y_manage_agents | Agent Observability* | エージェントカタログを読み取る:エージェントの一覧表示、1つのエージェントバージョンの完全取得、バージョン履歴の一覧表示、バージョンごとのスコア集計 | grafana-agento11y-app.data:read | N/A |
agento11y_manage_evaluators | Agent Observability* | 評価者、評価者テンプレート、判定カタログを管理する(一覧表示、取得、アップサート、フォーク、テスト、削除) | grafana-agento11y-app.data:read + grafana-agento11y-app.eval:write(変更操作およびテスト用) | N/A |
agento11y_manage_eval_rules | Agent Observability* | 評価ルールとガードを管理する(一覧表示、取得、作成、更新、プレビュー、削除) | grafana-agento11y-app.data:read + grafana-agento11y-app.eval:write(変更操作およびプレビュー用) | N/A |
agento11y_manage_eval_collections | Agent Observability* | 保存された会話とそれらをグループ化するコレクションを管理する(一覧表示、取得、保存、作成、更新、削除、メンバーの追加と削除) | grafana-agento11y-app.data:read + grafana-agento11y-app.eval:write(変更操作用) | N/A |
agento11y_manage_experiments | Agent Observability* | オフライン実験、そのトライアル、スコア、アーティファクトメタデータを読み取り、フィルターファセットを取得し、実験を更新・キャンセルする | 変更操作には grafana-agento11y-app.data:read + grafana-agento11y-app.eval:write | N/A |
agento11y_manage_test_suites | Agent Observability* | オフライン実験が実行されるテストスイート、そのバージョン、テストケースを管理する(一覧、取得、作成、更新、下書き、公開、アップサート、削除) | 変更操作には grafana-agento11y-app.data:read + grafana-agento11y-app.eval:write | N/A |
ask_assistant | Assistant* | Grafana Assistant にプロンプトを送信し、完全なテキスト応答を返す(contextId によるマルチターン対応) | プラグイン固有の権限 | プラグイン固有のスコープ |
generate_deeplink | Navigation | Grafana リソースの正確なディープリンク URL を生成する | なし(読み取り専用の URL 生成) | N/A |
get_annotations | Annotations | フィルター付きでアノテーションを取得する | annotations:read | annotations:* または annotations:id:123 |
create_annotation | Annotations | 新しいアノテーションを作成する(標準または Graphite 形式) | annotations:write | annotations:* |
update_annotation | Annotations | アノテーションの特定フィールドを更新する(部分更新) | annotations:write | annotations:* |
delete_annotation | Annotations | ID でアノテーションを削除する | annotations:delete | annotations:* |
get_annotation_tags | Annotations | オプションのフィルタリング付きでアノテーションタグを一覧表示する | annotations:read | annotations:* |
list_snapshots | Snapshot | オプションのクエリと制限フィルター付きでダッシュボードスナップショットを一覧表示する | dashboards:read | dashboards:* または dashboards:uid:abc123 |
get_snapshot | Snapshot | スナップショットキーでスナップショットメタデータとダッシュボードペイロードを取得する | dashboards:read | dashboards:* または dashboards:uid:abc123 |
create_snapshot | Snapshot | 完全なダッシュボードペイロードからダッシュボードスナップショットを作成する | dashboards:write | dashboards:* または dashboards:uid:abc123 |
delete_snapshot | Snapshot | スナップショットキーでダッシュボードスナップショットを削除する | dashboards:write | dashboards:* または dashboards:uid:abc123 |
get_panel_image | Rendering | 保存されたダッシュボードまたはパネル、あるいはリポジトリブランチからのプロビジョニングプレビューを PNG 画像としてレンダリングする | dashboards:read | dashboards:uid:abc123 |
list_provisioning_repositories | Provisioning | プロビジョニングリポジトリ(例:git-sync ソース)を、ソース URL、ブランチ、同期状態、ヘルスとともに一覧表示する | provisioning.repositories:read | N/A |
validate_provisioning_file | Provisioning | プロビジョニングリポジトリからファイルをドライラン適用し、アドミッション検証エラーを報告する | provisioning.repositories:read | N/A |
search_docs | Docs | Grafana ドキュメントを検索するか、製品グループを一覧表示する(クエリを省略すると製品を一覧表示) | なし(公開 grafana.com/docs) | N/A |
get_doc | Docs | ドキュメントページを取得する;見出しには outline_only を、範囲指定取得には section を設定する | なし(公開 grafana.com/docs) | N/A |
_* デフォルトでは無効です。有効にするには、カテゴリを --enabled-tools に追加してください。 |
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--server-name: MCPハンドシェイクとOTelservice.nameで使用されるサーバー名 - デフォルト:mcp-grafana。GRAFANA_MCP_SERVER_NAME環境変数を上書きします。--instructions-append: 初期化時にMCPクライアントに返されるサーバー指示に追加されるテキスト。接続するすべてのエージェントがそれを確認できます。
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を検証する場合にのみ安全です。K8shttpGetプローブと外部/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>として送信する必要があるベアラートークン。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上書き(SSE / 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、環境基本認証、GRAFANA_EXTRA_HEADERS、またはクライアント証明書を使用しません。--tls-skip-verify が設定されている場合でも、TLS検証は有効のままです。設定されたCAファイルは引き続き適用されます。そのリクエストから明示的に転送されたヘッダーは引き続き適用されます。選択されたベースURLの外部へのリダイレクトおよびその他のGrafana APIリクエストはブロックされます。X-Grafana-URL のないリクエストは、通常の GRAFANA_URL および環境認証情報の動作を保持します。このオプションはSSEおよびストリーミング可能なHTTPにのみ適用されます。SSEの場合、各メッセージPOSTに両方の選択ヘッダーを含めます。初期SSE GETのヘッダーはツール呼び出しに引き継がれません。
デバッグとロギング:
--debug: 詳細なHTTPリクエスト/レスポンスロギングのデバッグモードを有効にします--log-level: ログレベル(debug、info、warn、error)- デフォルト:info
Grafanaクライアントオプション:
--grafana-timeout: Grafanaクライアントが行うリクエストの時間制限。Goの期間文字列を受け入れます(例:10s、500ms)- デフォルト:10s--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の期間文字列を受け入れます(例:500ms、5s)。デフォルトの0は、遅いリクエストのロギングを無効にします。遅いリクエストのロギングセクションを参照してください。--slow-request-log-level: 遅いリクエストイベントのログレベル(infoまたはwarn)- デフォルト:warn
匿名使用統計:
--usage-stats: 匿名使用統計レポート:enabled、disabled、またはlog(送信されるレポートをstderrに出力し、何も送信しません)。GRAFANA_USAGE_STATS環境変数を上書きし、さらにDO_NOT_TRACKを上書きします。認識されない値はレポートを無効にします。匿名使用統計セクションを参照してください。
セッション管理:
--session-idle-timeout-minutes: セッションアイドルタイムアウト(分単位)。この期間アクティビティのないセッションは自動的に再利用されます - デフォルト:30。セッションの再利用を無効にするには0に設定します。SSEおよびstreamable-httpトランスポートにのみ関連します。 ツール設定:--enabled-tools: 有効なカテゴリのカンマ区切りリスト - デフォルト:admin、agento11y、assistant、athena、clickhouse、cloudlogging、cloudwatch、elasticsearch、examples、graphite、quickwit、runpanelquery、snowflakeを除くすべてのカテゴリ。無効なカテゴリを有効にするには、リストに追加します(例:"search,datasource,...,snowflake")--max-loki-log-limit: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: 単一のquery_loki_logs呼び出しがスキャンできる最大バイト数。Loki のインデックス/統計 API を介して推定 - デフォルト:107374182400(100 GiB)。0はバイト予算チェックを無効にします。環境変数のフォールバック:GRAFANA_LOKI_GUARDRAIL_MAX_BYTES。--loki-guardrail-max-range: 単一のquery_loki_logs呼び出しの最大有効時間範囲。範囲ベクトル期間を含む - デフォルト:24h。Go の期間文字列を受け入れます。0は範囲チェックを無効にします。環境変数のフォールバック:GRAFANA_LOKI_GUARDRAIL_MAX_RANGE。--loki-enforced-matchers: 読み取り可能なログストリームを制限するために、すべてのネイティブ Loki クエリに AND で結合される LogQL ラベルマッチャー(例:environment=~"prod|staging")。--disable-apiが必要です。Loki クエリの適用 を参照してください。--loki-label-enumeration-fallback: ネガティブな適用マッチャーがスコープを制限できない場合に、ラベル列挙ツールが行う処理:reject(デフォルト)またはunfiltered。Loki クエリの適用 を参照してください。--disable-search: 検索ツールを無効にする--disable-datasource: データソースツールを無効にする--disable-incident: インシデントツールを無効にする--disable-prometheus: Prometheus ツールを無効にする--disable-write: 書き込みツール(作成/更新操作)を無効にする--disable-query: クエリツール(データソースに対してクエリを実行するツール)を無効にする。メタデータおよび検出ツールは引き続き利用可能です。--enable-query:--disable-writeが設定されている場合でも、生の SQL クエリツール(query_sql、query_influxdb)を登録したままにします。--enable-write-tools=query_sql,query_influxdbと同等です。この一般的なケースの省略形として保持されています。--enable-write-tools:--disable-writeが設定されている場合でも登録を維持する個々のツール名のカンマ区切りリスト。書き込み動作が十分にスコープされ、独立してオプトインできるツール用です(例:find_error_pattern_logs,find_slow_requests)。カテゴリ全体が無効になっているツールには効果がありません(例:--disable-sift経由)。--disable-loki: Loki ツールを無効にする--disable-elasticsearch: Elasticsearch および OpenSearch ツールを無効にする--disable-quickwit: Quickwit ツールを無効にする--disable-influxdb: InfluxDB ツールを無効にする--disable-alerting: アラートツールを無効にする--disable-dashboard: ダッシュボードツールを無効にする--disable-oncall: OnCall ツールを無効にする--disable-asserts: Asserts ツールを無効にする--disable-sift: Sift ツールを無効にする--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)を無効にする。エイリアス--disable-clickhouse、--disable-snowflake、--disable-athenaも機能します。--disable-runpanelquery: パネルクエリ実行ツールを無効にする--disable-graphite: Graphite ツールを無効にする--disable-provisioning: プロビジョニングツールを無効にする--disable-agento11y: Agent Observability ツールを無効にする--disable-assistant: Grafana Assistant ツールを無効にする--disable-docs: ドキュメントツールを無効にする
読み取り専用モード
--disable-write フラグは、MCP サーバーを読み取り専用モードで実行する方法を提供し、Grafana インスタンスへの書き込み操作を防ぎます。これは、以下のような安全な読み取り専用アクセスを提供したいシナリオで役立ちます:
- 制限された読み取り専用権限を持つサービスアカウントの使用
- AI アシスタントに変更機能なしで可観測性データを提供する
- 書き込みアクセスを制限すべき本番環境での実行
- 誤った変更を防ぎたいテストおよび開発シナリオ
--disable-write が有効な場合、以下の書き込み操作が無効になります:
ダッシュボードツール:
update_dashboard
フォルダツール:
create_folder
インシデントツール:
create_incidentadd_activity_to_incidentupdate_incident
アラートツール:
alerting_manage_rules(作成、更新、削除操作)alerting_manage_silences(作成、更新、削除操作)
OnCall ツール:
update_alert_group
注釈ツール:
create_annotationupdate_annotationdelete_annotation
Sift ツール:
find_error_pattern_logs(調査を作成)find_slow_requests(調査を作成)
これらは Sift API を介して一時的な Sift 調査レコードのみを作成します。Grafana ダッシュボード、アラート、データソースには一切触れません。これらがない場合、list_sift_investigations/get_sift_investigation/get_sift_analysis はリストまたは取得するものがありません。--enable-write-tools=find_error_pattern_logs,find_slow_requests を渡すと、--disable-write の下で登録を維持できます。
スナップショットツール:
create_snapshotdelete_snapshot
生の SQL クエリツール:
これらは、指定されたクエリを検査せずに実行するため、データソースの認証情報が許可する場合に書き込みが可能です。query_sql は DROP TABLE を実行し、query_influxdb は DELETE を実行します。したがって、読み取り専用モードではこれらは削除されます。データソースの認証情報が読み取り専用であることがわかっている場合は、--enable-query を渡して保持します。
query_sqlquery_influxdb
Agent Observability ツール:
agento11y_manage_evaluators(upsert、delete、fork、test evaluator 操作)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)は、読み取り専用モードでもクエリツールを維持します。上記の生の SQL ツールのみが削除されます。
クエリなしモード
--disable-query フラグは、データソースに対してクエリを実行するすべてのツールを削除し、メタデータおよび検出ツールはそのまま残します。これは、データソース、ダッシュボード、メトリック名、ラベル、テーブルスキーマなど、何が存在するかを探索できるアシスタントが必要な場合に役立ちます。たとえば、サービスアカウントが datasources:read を持っているが datasources:query を持っていない場合など、高コストまたはデータを明らかにする可能性のあるクエリを実行せずに探索できます。
これは 3 つのクエリ設定の中で最も強力で、--enable-query よりも優先されます:
| フラグ | 安全なクエリツール(query_prometheus、query_loki_logs、run_panel_query、…) | 生の SQL クエリツール(query_sql、query_influxdb) |
|---|---|---|
| (なし) | 登録済み | 登録済み |
--disable-write | 登録済み | 未登録 |
--disable-write --enable-query | 登録済み | 登録済み |
--disable-query | 未登録 | 未登録 |
--disable-query --enable-query | 未登録 | 未登録 |
--disable-query が有効な場合、以下のツールは登録されません:
Prometheus ツール:
query_prometheusquery_prometheus_histogram
Loki ツール:
query_loki_logsquery_loki_patterns
query_loki_stats と analyze_loki_labels は登録されたままです。両方ともデータソースにセレクタを送信しますが、インデックスを読み取り、ログコンテンツではなくストリーム、チャンク、バイト数を返します。
Elasticsearch/OpenSearch および Quickwit ツール:
query_elasticsearchquery_quickwit
InfluxDB ツール(--disable-write によっても削除されます。上記参照):
query_influxdb
SQL データソースツール(--disable-write によっても削除されます。上記参照):
query_sql
Graphite ツール:
query_graphitequery_graphite_density
CloudWatch ツール:
query_cloudwatch
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 の POST-to-/api/ds/query パスを制御しますが、データソースへのすべてのルートを監視するわけではないことに注意してください。読み取り専用モードでは、grafana_api_request はクエリツールが有効な場合にのみ /api/ds/query への POST を許可します(生の 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)を使用してください。
-
サービスアカウントトークン認証を使用する場合は、使用したいツールに十分な権限を持つサービスアカウントを Grafana で作成し、 サービスアカウントトークンを生成して、設定ファイルで使用するためにクリップボードにコピーします。 サービスアカウントトークンの作成の詳細については、Grafana サービスアカウントのドキュメント を参照してください。 ヒント: きめ細かい RBAC スコープの設定に不安がある場合は、組み込みの
Editorロールをサービスアカウントに割り当てるという、より簡単な(ただし制限が緩い)オプションがあります。これにより、ほとんどの MCP サーバー操作をカバーする広範な読み取り/書き込みアクセスが付与されます。利便性が厳格な最小権限の要件よりも優先される場合に使用してください。注: 環境変数
GRAFANA_API_KEYは非推奨であり、将来のバージョンで削除される予定です。GRAFANA_SERVICE_ACCOUNT_TOKENの使用に移行してください。古い変数名は後方互換性のために引き続き機能しますが、非推奨の警告が表示されます。
サービスアカウントトークンをファイルから読み込む
トークンをGRAFANA_SERVICE_ACCOUNT_TOKENでインラインで渡す代わりに、GRAFANA_SERVICE_ACCOUNT_TOKEN_FILEをトークンを含むファイルパスに指定できます。ファイルはリクエストごとに新しく読み込まれるため、サーバーを再起動しなくてもローテーションされたトークンが自動的に取得されます。
これはKubernetesで特に便利です。ボリュームとしてマウントされたSecretは、基盤となるSecretが変更されると(通常約1分以内に)その場で更新されます。リクエストごとのクライアントキャッシュ(トークン値でキー付けされています)と組み合わせることで、ローテーションされたトークンは透過的に新しいクライアントを生成し、ポッドの再起動やダウンタイムなしで動作します:
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ヘッダー: SSEまたはストリーミング可能なHTTPトランスポートを使用する場合に
X-Grafana-Org-Idを設定します(ヘッダーは環境変数より優先されます。つまり、デフォルトのオーガニゼーションも設定できます)。
オーガニゼーションIDが指定されると、MCPサーバーはGrafanaへのすべてのリクエストにX-Grafana-Org-Idヘッダーを設定し、指定されたオーガニゼーションコンテキスト内で操作が実行されるようにします。
動的(呼び出しごとの)オーガニゼーション選択
上記のオプションは接続全体のオーガニゼーションを固定します。単一の接続でツール呼び出しごとに異なるオーガニゼーションをターゲットにするには、--dynamic-multi-orgフラグを指定してサーバーを起動します。これはデフォルトでオフになっています。
有効にすると、すべてのツールがオプションのorgId引数を受け入れ、その呼び出しの接続のオーガニゼーションを上書きします(X-Grafana-Org-Idヘッダーと、アプリプラットフォームAPIの場合は解決されたKubernetes名前空間の両方を駆動します)。プロキシされたデータソースツールは、資格情報がアクセスできるすべてのオーガニゼーションにわたって追加で検出されます。orgIdを省略した呼び出しは、接続のデフォルトのオーガニゼーションを使用します。
これは複数のオーガニゼーションに属する資格情報(例:ユーザーまたは代理ID)でのみ機能します。サービスアカウントトークンは単一のオーガニゼーションにバインドされたままです。user_infoツールを使用して、どのorgId値が有効かを確認してください。
オーガニゼーション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トラフィックを直接送信するのではなく、フェイルクローズド(安全側に倒す)動作をします。
クライアントからのヘッダー転送(SSE/ストリーミング可能なHTTPのみ)
MCPサーバーがSSOを処理するゲートウェイまたはリバースプロキシ(例:OIDCを使用するAWS ALB)の背後で実行される場合、各ユーザーのセッションCookieがGrafanaに到達して、リクエストを認証済みユーザーに関連付ける必要があります。GRAFANA_FORWARD_HEADERS環境変数は、受信HTTPリクエストからすべての送信Grafana APIリクエストにコピーするヘッダー名のカンマ区切り許可リストを指定することで、これを有効にします。
これはSSE(-t sse)またはストリーミング可能なHTTP(-t streamable-http)トランスポートを使用する場合にのみ適用されます。stdioモードでは効果がありません。
例:セッション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)は例外です:サーバーはトレースコンテキスト自体を伝播するため、転送された値がサーバーが注入する値を上書きすることはありません。可観測性を参照してください。
-
mcp-grafanaをインストールするには、いくつかのオプションがあります:-
uvx(推奨):uvがインストールされている場合、追加のセットアップは不要です —
uvxが自動的にサーバーをダウンロードして実行します:uvx mcp-grafana -
Dockerイメージ:Docker Hubからビルド済みのDockerイメージを使用します。
重要:DockerイメージのエントリポイントはデフォルトでSSEモードでMCPサーバーを実行するように設定されていますが、ほとんどのユーザーはClaude DesktopなどのAIアシスタントと直接統合するためにSTDIOモードを使用したいでしょう:
- 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およびストリーミング可能なHTTPモードでは、コンテナはループバック以外のアドレス(
0.0.0.0:8000)にバインドされます。呼び出し元トークンがない場合、サーバーは起動しますが、セキュリティエラーをログに記録します(errorログレベルであるため、--log-levelでは隠されません。また、将来のメジャーリリースでは起動を拒否します)。クライアントからのAuthorization: Bearer <token>を要求するには、MCP_GRAFANA_SERVER_TOKENを設定します(推奨)。STDIOモードは影響を受けません。呼び出し元認証を参照してください。- 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- ストリーミング可能な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ストリーミング可能な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 - STDIOモード:stdioモードでは、
-
バイナリのダウンロード:リリースページから
mcp-grafanaの最新リリースをダウンロードし、$PATHに配置します。 -
ソースからのビルド:Goツールチェーンがインストールされている場合、ソースからビルドしてインストールすることもできます。
GOBIN環境変数を使用して、バイナリをインストールするディレクトリを指定します。これも$PATHにある必要があります。GOBIN="$HOME/go/bin" go install github.com/grafana/mcp-grafana/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
-
-
サーバー設定をクライアント設定ファイルに追加します。例として、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データソースクライアント
- インシデント管理クライアント
- Sift調査クライアント
- アラートクライアント
- 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)を使用する場合は利用できません。stdioはHTTPサーバーを公開しないためです。
匿名使用統計
このサーバーは、Grafana Labsに対して自身に関する匿名の使用統計を報告できます。どのツールが呼び出されたか、そのうちいくつが失敗したか、サーバーがどのように設定されているかが含まれます。1つのレポートは1つのサーバープロセスを対象とします(1人のユーザーや1つの会話ではありません)。レポートは4時間ごとに送信され、シャットダウン時にも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の両方がこれを上書きするため、グローバルに設定したホストでも、1つのサーバーをオプトインに戻すことができます。
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_seconds | ヒストグラム | MCP操作の所要時間(ラベル: mcp_method_name、gen_ai_tool_name、error_type、network_transport、mcp_protocol_version) |
mcp_server_session_duration_seconds | ヒストグラム | MCPクライアントセッションの所要時間(ラベル: network_transport、mcp_protocol_version) |
http_server_request_duration_seconds | ヒストグラム | HTTPサーバーリクエストの所要時間(otelhttpから) |
注: メトリクスはSSEまたはストリーミング可能なHTTPトランスポートを使用する場合にのみ利用可能です。stdioトランスポートでは利用できません。
Lokiコストガードレール(--loki-guardrail-mode)が有効な場合、その決定を記録するカウンターがさらに4つ追加されます:
| メトリクス | タイプ | 説明 |
|---|---|---|
mcp_loki_guardrail_admitted_total | カウンター | 有効なすべてのチェックを通過したクエリ(ラベル: backend) |
mcp_loki_guardrail_would_block_total | カウンター | shadowモードでチェックに失敗したが実行されたクエリ(ラベル: backend、reason) |
mcp_loki_guardrail_blocked_total | カウンター | enforceモードで拒否されたクエリ(ラベル: backend、reason) |
mcp_loki_guardrail_fail_open_total | カウンター | ガードレールが評価できず許可したクエリ(ラベル: backend、cause) |
reasonはselector、range、bytesのいずれかです。causeはunparseable、estimate_failedのいずれかです。backendはloki、victorialogs、unknownのいずれかです。複数のチェックに抵触するクエリは1回だけカウントされ、最初に実行されたチェック(selector、次にrange、次にbytes)でラベル付けされるため、4つのカウンターはガード対象の母集団を分割します。shadow → enforceのロールアウト中にこれらを読み取る方法については、可観測性を参照してください。
ライブラリ組み込みユーザーは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.method | MCPメソッド(例: 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
ツール呼び出しスパンはsemconv命名(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)。ログは、OTEL_EXPORTER_OTLP_LOGS_ENDPOINT(または汎用のOTEL_EXPORTER_OTLP_ENDPOINT)をリモートgRPCエンドポイントに指定し、OTEL_EXPORTER_OTLP_LOGS_HEADERS(またはOTEL_EXPORTER_OTLP_HEADERS)を介して認証を提供することで、OTLP/gRPCを受け入れる任意の管理バックエンド(例: Grafana Cloud)に直接送信できます。これは上記のトレーシングの例と同様です。ローカルの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エクスポーター仕様を参照してください。
設定されたコレクターに到達できない場合、ログレコードはメモリにバッファリングされ(デフォルトのキュー: 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
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
仕組み:
- マッチャーは起動時に1回解析され(無効な入力はサーバーを中止します)、各クエリのすべてのストリームセレクターに追加されます。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-sift— Sift調査はすべてのストリームにわたってLokiログをサーバー側で分析します。--disable-assistant—ask_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で書かれています。お使いのプラットフォームの指示に従ってGoをインストールしてください。
サーバーをSTDIOモード(ローカル開発のデフォルト)でローカルに実行するには、次を使用します:
make run
サーバーをSSEモードでローカルに実行するには、次を使用します:
go run ./cmd/mcp-grafana --transport sse
カスタムビルドしたDockerイメージ内でSSEトランスポートを使用してサーバーを実行することもできます。公開されているDockerイメージと同様に、このカスタムイメージのエントリポイントはデフォルトでSSEモードになります。イメージをビルドするには、次を使用します:
make build-image
そして、イメージをSSEモード(デフォルト)で実行するには、次を使用します:
docker run -it --rm -p 8000:8000 mcp-grafana:latest
代わりにSTDIOモードで実行する必要がある場合は、トランスポート設定を上書きします:
docker run -it --rm mcp-grafana:latest -t stdio
テスト
利用可能なテストには3つのタイプがあります:
- ユニットテスト(外部依存関係は不要):
make test-unit
ユニットテストは次のコマンドでも実行できます:
make test
- 統合テスト(Dockerコンテナが起動している必要があります):
make test-integration
- クラウドテスト(クラウドのGrafanaインスタンスと認証情報が必要):
make test-cloud
注:クラウドテストはCIで自動的に設定されます。ローカル開発では、独自のGrafana Cloudインスタンスと認証情報を設定する必要があります。
より包括的な統合テストには、Grafanaインスタンスがローカルのポート3000で実行されている必要があります。Docker Composeで起動できます:
docker-compose up -d
統合テストは次のコマンドで実行できます:
make test-all
さらにツールを追加する場合は、それらの統合テストも追加してください。既存のテストが良い出発点になるはずです。
リンティング
コードをリントするには、次を実行します:
make lint
これには、jsonschema構造体タグ内のエスケープされていないカンマをチェックするカスタムリンターが含まれています。descriptionフィールド内のカンマは、サイレントな切り詰めを防ぐために\\,でエスケープする必要があります。このリンターだけを実行するには:
make lint-jsonschema
詳細については、JSONSchemaリンタードキュメントを参照してください。
ライセンス
このプロジェクトはApache License, Version 2.0の下でライセンスされています。