はじめに
「Grafanaでダッシュボードを作りたいけど、パネルの追加・データソース設定・閾値設定…GUIでポチポチやるのが地味に面倒」と感じたことはありませんか?
IoTや製造業の現場では、設備や環境のセンサーデータを可視化したいニーズが増えています。しかし、計測項目が多くなるほどダッシュボードの構築は手間がかかり、顧客ごとのカスタマイズ対応も含めると工数が膨らみがちです。
本記事では、AnthropicのClaude Codeを使って、GrafanaのREST APIを叩き、ターミナルからダッシュボードを一発生成した過程をお伝えします。GUIを一切触らずに、データソースの追加からセンサー監視ダッシュボードの構築まで完了しました。
Claude Codeは、Anthropicが提供するターミナルベースのAIコーディングエージェントです。チャットで指示を出すと、ファイルの読み書き、コマンド実行まで自律的にこなしてくれます。
今回のポイントは、Claude Codeがcurlコマンドを自ら組み立ててGrafana APIを叩けること。「こういうダッシュボードを作って」と自然言語で伝えるだけで、APIリクエストのJSON構築から実行まで一気通貫で行えます。
この記事でわかること
- Claude CodeからGrafana REST APIを使ってダッシュボードを自動生成する手順
- Service Account Token の発行とAPIアクセスの設定方法
- IoTセンサーデータを想定したダッシュボード設計の実例
- MCP(mcp-grafana)の現状と、REST API直接方式を選んだ理由
前提条件
- Grafana(本記事ではv12.4.0 / Homebrew版)
- Claude Code(Anthropic APIキーが必要)
- macOS
今回作ったもの
IoT機器のセンサーデータ監視を想定したGrafanaダッシュボードです。
| パネル | タイプ | 内容 |
|---|---|---|
| Engine Temperature | 時系列グラフ | エンジン温度(閾値: 黄60°C / 赤80°C) |
| Fuel Pressure | 時系列グラフ | 燃料圧力(メイン/サブライン) |
| Current Status | ゲージ | RPM(閾値付きゲージ) |
| Atmospheric Pressure | 数値表示 | 気圧(hPa) |
| Sensor Alert History | テーブル | アラート履歴 |
5秒ごとに自動リフレッシュされ、リアルタイム監視のイメージを掴めるデモになっています。
Step 1:Grafanaのインストールと起動
M1 MacBook Pro(メモリ8GB)でもGrafanaは軽快に動作します。Homebrew経由なら2コマンドで完了です。
brew install grafana
brew services start grafana
これだけで http://localhost:3000 にアクセスできます。初期ログインは admin / admin です。
Grafana自体のメモリ使用量は約256MB程度。Docker不要で、M1 Macでも全く問題ありません。
Step 2:Service Account Tokenの発行
Claude CodeからGrafana APIを操作するには、認証トークンが必要です。GrafanaのService Account機能を使います。
Grafana v12では、従来のAPI Keys(/api/auth/keys)は非推奨となり、Service Account Token が推奨されています。Service Accountはユーザーとは独立した「サービス用アカウント」で、ロールベースの権限管理が可能です。
Claude Codeに発行を依頼
実はこのステップもClaude Codeに任せられます。「GrafanaのService Account Tokenを発行して」と伝えたところ、以下の2つのAPIを自動で実行してくれました。
# 1. Service Accountの作成
curl -s -X POST http://localhost:3000/api/serviceaccounts \
-H "Content-Type: application/json" \
-u "admin:<password>" \
-d '{"name":"claude-code","role":"Admin"}'
# 2. トークンの発行
curl -s -X POST http://localhost:3000/api/serviceaccounts/<id>/tokens \
-H "Content-Type: application/json" \
-u "admin:<password>" \
-d '{"name":"claude-code-token"}'
返却された glsa_ で始まるトークンを使って、以降のAPI操作を行います。
Step 3:データソースの追加
ダッシュボードにはデータソースが必要です。今回はデモ目的なので、Grafana組み込みのTestDataデータソースを使いました。外部DBのセットアップは不要です。
curl -s -X POST http://localhost:3000/api/datasources \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"name": "TestData",
"type": "grafana-testdata-datasource",
"access": "proxy",
"isDefault": true
}'
TestDataはランダムウォーク(時系列のランダムデータ)を生成できるため、センサーデータのシミュレーションに使えます。
本番環境では、ここをPostgreSQL、InfluxDB、Prometheusなどに差し替えます。
Step 4:ダッシュボードの一発生成
ここが本記事のメインです。
Claude Codeに「IoTセンサーデータの監視ダッシュボードを作って。温度、圧力、回転数ゲージ、気圧、アラート履歴のパネルを含めて」と伝えたところ、Grafana Dashboard APIに対するJSON一式を自動生成し、curlで実行してくれました。
APIリクエストの構造
Grafanaの POST /api/dashboards/db エンドポイントに、ダッシュボード定義のJSONを送信します。
curl -s -X POST http://localhost:3000/api/dashboards/db \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"dashboard": {
"title": "Ship Sensor Dashboard - Demo",
"panels": [ ... ],
"time": {"from": "now-6h", "to": "now"},
"refresh": "5s"
}
}'
Claude Codeが自動設計したパネル構成
注目すべきは、Claude Codeがセンサー監視に適したパネルタイプを自動選択した点です。
| データ特性 | 選択されたパネルタイプ | 理由 |
|---|---|---|
| 時系列データ(温度・圧力) | timeseries | トレンドの推移が視覚的にわかる |
| 瞬時値(RPM) | gauge | 現在値と危険域が一目でわかる |
| 環境値(気圧) | stat | 大きな数字で現在値を強調 |
| ログ(アラート) | table | 履歴を時系列で一覧表示 |
さらに、温度パネルには閾値(60°Cで黄色、80°Cで赤) が自動設定され、RPMゲージにも正常域・注意域・危険域の色分けが入っていました。「センサー監視」と伝えただけで、実運用で必要な閾値設定まで考慮してくれるのは、Claude Codeの文脈理解力の強さです。
レイアウト
パネルの配置(gridPos)もClaude Codeが自動で計算しています。
┌──────────────────────┬──────────────────────┐
│ Engine Temperature │ Fuel Pressure │ ← 時系列(上段)
│ (timeseries) │ (timeseries) │
├────────┬─────────────┼──────────────────────┤
│ RPM │ Atmospheric │ Alert History │ ← 現在値+履歴(下段)
│(gauge) │ (stat) │ (table) │
└────────┴─────────────┴──────────────────────┘
GUIで同じ作業をやると、パネル追加→データソース選択→クエリ設定→閾値設定→レイアウト調整…で30分〜1時間はかかります。Claude Codeなら数分です。
MCP(mcp-grafana)は使えなかったのか?
Grafana公式が提供するmcp-grafana(MCP: Model Context Protocol サーバー)を使えば、Claude CodeからGrafanaをネイティブに操作できるはずでした。今回も最初はMCP経由を試みました。
試したこと
-
go install github.com/grafana/mcp-grafana/cmd/mcp-grafana@latestでバイナリをインストール -
Claude Codeの
settings.jsonにMCPサーバーとして登録 -
環境変数
GRAFANA_URLとGRAFANA_SERVICE_ACCOUNT_TOKENを設定
結果
mcp-grafanaバイナリ自体は正常に起動するものの、Claude CodeのDeferred Toolsとして認識されませんでした。MCP接続の初期化タイミングの問題か、バージョン互換の問題か、解決できず(mcp-grafana v0.11.2 / Claude Code 2026年3月時点)。。。
REST API直接方式で十分だった
ただ結果的には、Grafana REST APIをcurlで直接叩く方式で全く問題ありませんでした。むしろこの方式には以下のメリットがあるように感じます。
| 観点 | MCP方式 | REST API直接方式 |
|---|---|---|
| セットアップ | Go/npxインストール+設定 | 不要(curlのみ) |
| デバッグ | MCPサーバーのログ確認が必要 | curlのレスポンスで即判断 |
| 再現性 | バージョン依存? | curlコマンドをそのまま再利用可 |
| 学習コスト | MCPの理解 | REST APIのドキュメントだけでOK |
MCPは今後の課題としつつ、現時点ではREST API直接方式が実用的でした。
実務への応用:本番環境ではどう使う?
今回はTestDataでデモしましたが、実務で使う場合のステップも整理しておきます。
データソースの差し替え
# PostgreSQLの例
curl -s -X POST http://localhost:3000/api/datasources \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"name": "Sensor DB",
"type": "postgres",
"url": "your-db-host:5432",
"database": "sensor_data",
"user": "grafana_reader",
"secureJsonData": {"password": "xxx"},
"jsonData": {"sslmode": "require"}
}'
InfluxDB、Prometheus、Amazon Redshiftなど、Grafanaが対応するデータソースであれば同じ要領で差し替え可能です。
アラート設定の追加
Grafana v12のUnified Alertingを使えば、閾値超過時にSlack/メール/PagerDutyへ通知を飛ばせます。これもREST APIで設定可能です。センサーデータの異常検知をリアルタイムで通知したい場合に有用です。
顧客・用途ごとのダッシュボードを量産
Claude Codeが生成したダッシュボードJSONをGitリポジトリで管理すれば、ダッシュボードのバージョン管理が実現します。テンプレートをベースに、表示項目やフィルタ条件を変えた顧客別ダッシュボードを量産するのも容易です。環境の再構築やステージング→本番の昇格も、curl 1発で完了します。
まとめ
Claude Code × Grafana REST APIの組み合わせで、ダッシュボード構築の全工程をターミナルから自動化できました。
| 工程 | 手動(GUI) | Claude Code |
|---|---|---|
| Service Account作成 | UI操作 | curl自動実行 |
| データソース追加 | UI操作 | curl自動実行 |
| ダッシュボード構築 | 30分〜1時間 | 数分 |
| 閾値・レイアウト設定 | パネルごとに手動 | JSON一括設定 |
特に印象的だったのは、「センサー監視ダッシュボード」と伝えただけで、パネルタイプの選択・閾値の設定・レイアウトの計算まで適切に行われた点です。Grafanaの機能を熟知したエンジニアが設計したかのような、実用的なダッシュボードが自然言語の指示から生成されました。
計測項目が多い現場や、顧客ごとにカスタマイズが必要なプロダクトでは、ダッシュボード構築の工数削減に大きく貢献できるアプローチです。
GUIでの手作業に時間を取られている方は、ぜひClaude Code × REST APIの組み合わせを試してみてください。一度体験すると、もうGUIには戻れなくなるかもしれません。