Skip to main content
Glama
README.md
# dashmetrics

dashmetrics gives an MCP client or a terminal read access to a Grafana
instance: dashboard search and retrieval, datasource inspection,
Prometheus range queries with metric and label discovery, Loki log
queries with label discovery, and the provisioned alert rules and
contact points. It is a clean-room rebuild of the documented core of
Grafana's MCP tool surface, built from Grafana's public HTTP API
documentation.

Point it at an instance with `GRAFANA_URL` (default
`http://localhost:3000`) and authenticate with a service account token
in `GRAFANA_SERVICE_ACCOUNT_TOKEN`, sent as a Bearer token. The legacy
`GRAFANA_API_KEY` variable is accepted as a fallback when the primary
variable is unset. When no token is set, every call fails with an
error that names `GRAFANA_SERVICE_ACCOUNT_TOKEN`; when the instance is
unreachable, the error names the base URL it tried.

## Install

```bash
npx @reneturcios/dashmetrics list_datasources
```

Or run the container image:

```bash
docker run -i -e GRAFANA_URL -e GRAFANA_SERVICE_ACCOUNT_TOKEN ghcr.io/cloudcorprecords/dashmetrics
```

The container defaults to the MCP server (see below). Pass CLI
arguments to use it as a CLI instead.

## CLI

Every MCP tool is also a CLI subcommand. Tool arguments are passed as
one JSON object with `--json`:

```bash
export GRAFANA_URL=http://localhost:3000
export GRAFANA_SERVICE_ACCOUNT_TOKEN=<redacted>

dashmetrics search_dashboards --json '{"query": "api", "limit": 5}'
dashmetrics get_dashboard_by_uid --json '{"uid": "dash-1"}'
dashmetrics list_datasources
dashmetrics query_prometheus --json '{"datasourceUid": "prom1", "expr": "up", "start": "now-1h", "end": "now", "step": "15s"}'
dashmetrics query_loki_logs --json '{"datasourceUid": "loki1", "query": "{job=\"api\"}"}'
dashmetrics list_alert_rules

dashmetrics --version
```

Results print as JSON. Exit codes: `0` on success, `1` when an API
call fails (including a missing token), `2` for usage errors.

## MCP server

One bin serves both faces. The `mcp` subcommand starts a stdio MCP
server:

```bash
npx -y @reneturcios/dashmetrics mcp
```

MCP client configuration:

```json
{
  "mcpServers": {
    "dashmetrics": {
      "command": "npx",
      "args": ["-y", "@reneturcios/dashmetrics", "mcp"],
      "env": {
        "GRAFANA_URL": "http://localhost:3000",
        "GRAFANA_SERVICE_ACCOUNT_TOKEN": "your Grafana service account token"
      }
    }
  }
}
```

### Tools

| Tool | Input (required in bold) | What it does |
| --- | --- | --- |
| `search_dashboards` | `query`, `limit`, `type` | Searches dashboards/folders (`/api/search`). |
| `get_dashboard_by_uid` | **`uid`** | Returns one dashboard by uid. |
| `list_datasources` | — | Lists configured datasources. |
| `get_datasource_by_uid` | **`uid`** | Returns one datasource by uid. |
| `query_prometheus` | **`datasourceUid`**, **`expr`**, `start`, `end`, `step` | Prometheus range query via the datasource proxy. |
| `list_prometheus_metric_names` | **`datasourceUid`**, `regex` | Lists metric names, regex-filtered. |
| `list_prometheus_label_names` | **`datasourceUid`**, `metric` | Lists label names. |
| `list_prometheus_label_values` | **`datasourceUid`**, **`label`**, `metric` | Lists one label's values. |
| `query_loki_logs` | **`datasourceUid`**, **`query`**, `start`, `end`, `limit` | Loki LogQL range query via the proxy. |
| `list_loki_label_names` | **`datasourceUid`** | Lists Loki label names. |
| `list_loki_label_values` | **`datasourceUid`**, **`label`** | Lists one Loki label's values. |
| `list_alert_rules` | `limit` | Lists provisioned alert rules. |
| `get_alert_rule_by_uid` | **`uid`** | Returns one provisioned alert rule. |
| `list_contact_points` | `limit` | Lists provisioned contact points. |

Prometheus and Loki calls go through Grafana's documented datasource
proxy paths (`/api/datasources/proxy/uid/{uid}/...`). Out of scope:
incident creation/update, on-call schedules, Sift/Asserts, and
admin/user management — see BUILD-REPORT.md.

## Development

```bash
npm install
npm run build   # tsc -> dist/
npm test        # node test runner over test/*.test.ts, no network (fake fetch fixtures)
npm run dev     # run the CLI from source via tsx
```

## License

MIT — see `LICENSE`.