grafana-mcp
by daanrongen
README.md
# grafana-mcp
MCP server for [Grafana](https://grafana.com/) — manage dashboards, datasources, alert rules, folders, and annotations over stdio.
## Installation
```bash
bunx @daanrongen/grafana-mcp
```
## Tools (17 total)
| Domain | Tools | Coverage |
| --------------- | -------------------------------------------------------------------------------------------- | ---------------------------------------------- |
| **Dashboards** | `list_dashboards`, `get_dashboard`, `create_dashboard`, `update_dashboard`, `delete_dashboard` | Full dashboard lifecycle |
| **Datasources** | `list_datasources`, `get_datasource`, `create_datasource`, `delete_datasource` | Datasource management |
| **Alerts** | `list_alert_rules`, `get_alert_rule`, `list_alert_instances` | Alert rules and firing Alertmanager instances |
| **Folders** | `list_folders`, `create_folder`, `delete_folder` | Folder organisation |
| **Annotations** | `list_annotations`, `create_annotation` | Dashboard and global annotations |
| **Health** | `health_check` | Grafana instance status |
## Configuration
| Variable | Required | Description |
| ----------------- | -------- | ----------------------------------------------- |
| `GRAFANA_URL` | Yes | Grafana base URL (e.g. `http://localhost:3000`) |
| `GRAFANA_API_KEY` | Yes | Grafana service account token or API key |
## Setup
### Claude Desktop
Edit `~/Library/Application Support/Claude/claude_desktop_config.json`:
```json
{
"mcpServers": {
"grafana": {
"type": "stdio",
"command": "bunx",
"args": ["@daanrongen/grafana-mcp"],
"env": {
"GRAFANA_URL": "http://localhost:3000",
"GRAFANA_API_KEY": "your-service-account-token"
}
}
}
}
```
### Claude Code CLI
```bash
claude mcp add grafana \
-e GRAFANA_URL=http://localhost:3000 \
-e GRAFANA_API_KEY=your-service-account-token \
-- bunx @daanrongen/grafana-mcp
```
## Development
```bash
bun install
bun run dev # run with --watch
bun test # run test suite
bun run typecheck # type-check with tsc
bun run lint # biome lint
bun run format # biome format
bun run build # bundle to dist/main.js
```
## Inspecting locally
Use the MCP Inspector to browse and call tools interactively against a real Grafana instance:
```bash
GRAFANA_URL=http://localhost:3000 \
GRAFANA_API_KEY=your-service-account-token \
bun run inspect
```
This opens the MCP Inspector UI in the browser, pointed at the locally built server.
## Architecture
```
src/
├── config.ts # Effect Config — GRAFANA_URL, GRAFANA_API_KEY
├── main.ts # Entry point — ManagedRuntime + StdioServerTransport
├── domain/
│ ├── GrafanaClient.ts # Context.Tag service interface (port)
│ ├── errors.ts # GrafanaError, NotFoundError
│ ├── models.ts # Schema.Class models (Dashboard, Datasource, AlertRule, …)
│ ├── dashboards.test.ts # Domain tests using GrafanaClientTest
│ ├── datasources.test.ts # Domain tests using GrafanaClientTest
│ └── health.test.ts # Domain tests using GrafanaClientTest
├── infra/
│ ├── GrafanaClientLive.ts # Layer using fetch against the Grafana HTTP API
│ └── GrafanaClientTest.ts # In-memory Ref-based test adapter
└── mcp/
├── server.ts # McpServer wired to ManagedRuntime
├── utils.ts # formatSuccess, formatError
└── tools/ # dashboards.ts, datasources.ts, alerts.ts, folders.ts, annotations.ts, health.ts
```
## License
MIT
This server cannot be deployed
Maintenance
ActivityNo data
ResponsivenessResponsive