grafana — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited grafana (Plugin) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A [Model Context Protocol][mcp] (MCP) server for Grafana.
This provides access to your Grafana instance and the surrounding ecosystem.
Requires uv. Add the following to your MCP client configuration (e.g. Claude Desktop, Cursor):
{
"mcpServers": {
"grafana": {
"command": "uvx",
"args": ["mcp-grafana"],
"env": {
"GRAFANA_URL": "http://localhost:3000",
"GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>"
}
}
}
}For Grafana Cloud, replace GRAFANA_URL with your instance URL (e.g. https://myinstance.grafana.net). See Usage for more installation options including Docker, binary, and Helm.
_The following features are currently available in MCP server. This list is for informational purposes only and does not represent a roadmap or commitment to future features._
version to load a saved snapshot instead of the current dashboard. _Warning: Large dashboards can consume significant context window space._$.title, $.panels[*].title) to fetch only needed data and reduce context window consumptionNote: Run panel query tools are disabled by default. To enable them, addrunpanelqueryto your--enabled-toolsflag.
backend or jq-backend parser (Google Sheets queries always do); the default simple parser and the UQL and GROQ parsers work only in the browser. Neo4j panels on the kniepdennis-neo4j-datasource plugin run their Cypher query through the plugin, which opens read-only sessions.#### Context Window Management
The dashboard tools now include several strategies to manage context window usage effectively (issue #101):
grafana://datasources/{uid}, so you can attach one to a conversation directly (for example with @ in Claude Code) instead of the model looking it up. Disabled along with the datasource tools.Note: Query examples tools are disabled by default. To enable them, addexamplesto your--enabled-toolsflag.
Note: InfluxDB tools are disabled by default. To enable them, addinfluxdbto your--enabled-toolsflag.
dialect parameter.Note: SQL tools are disabled by default. To enable them, addsqlto your--enabled-toolsflag. Back-compat aliasesclickhouse,snowflake, andathenaalso work.
Unified SQL tools support ClickHouse, Snowflake, Athena, MySQL, PostgreSQL, MSSQL, and BigQuery through a single set of tools. Queries go through Grafana's datasource plugins, so authentication is handled by datasource configuration — credentials are never seen by the MCP server.
$__timeFilter(col), $__from/$__to, $__interval, ${varname}), automatic limit enforcement, and template variable support.For BigQuery, configure the grafana-bigquery-datasource plugin in Grafana. Discovery uses database for the project and schema for the dataset. If database is omitted, the project defaults to datasource defaultProject, then the plugin's /defaultProjects endpoint (including GCE project discovery). Metadata is fetched through APIs only, without query jobs or table scans. Column descriptions and nested types are included; the plugin omits table descriptions/types, column nullability, and defaults.
BigQuery queries require qualified table references such as ` my-project.my_dataset.fct_events and use the datasource's billing project. Optional location defaults to datasource processingLocation. Use ${name:sqlstring}` for escaped string variables. Row limits do not limit bytes scanned or query costs.
Note: CloudWatch tools are disabled by default. To enable them, addcloudwatchto your--enabled-toolsflag.
Note: Google Cloud Logging tools are disabled by default. To enable them, addcloudloggingto your--enabled-toolsflag. Requires the Google Cloud Logging datasource plugin (googlecloud-logging-datasource) version 1.8.0 or later, which needs Grafana 11.2+. Older plugin versions return a different response layout andquery_cloud_loggingreports an error asking for an upgrade.
resource.type="k8s_container" AND severity>=ERROR) with time range and limit; returns entries newest-first with severity, body, labels, and trace ID. GCP authentication is handled by the datasource configuration.Note: Graphite tools are disabled by default. To enable them, addgraphiteto your--enabled-toolsflag.
Note: Elasticsearch/OpenSearch tools are disabled by default. To enable them, addelasticsearchto your--enabled-toolsflag.
Note: Quickwit tools are disabled by default. To enable them, addquickwitto your--enabled-toolsflag.
Note: Agent Observability tools are disabled by default and work only in Grafana Cloud. To enable them, addagento11yto your--enabled-toolsflag.
sha256: hashes that a tool change never affects; for an agent that reports no version of its own they hash the system prompt, so a prompt edit mints a new version. Catalog and version rows carry a token_estimate, which is worth checking before fetching a full prompt.preview_rule and test_evaluator operations need the grafana-agento11y-app.eval:write permission, granted by the Agento11y Admin role.grafana-agento11y-app.eval:write permission.grafana-agento11y-app.eval:write.grafana-agento11y-app.eval:write. Experiments are created by SDK runners, not by this tool.Note: Assistant tools are disabled by default and require the Grafana Assistant plugin (grafana-assistant-app) to be installed on the target Grafana instance. They are also write tools (the assistant may mutate stack state), so they are skipped when--disable-writeis set. To enable them, addassistantto your--enabled-toolsflag.
contextId back in a follow-up call to continue the same conversation. Complex tasks can take several minutes; the call blocks until the reply is done or the request times out (5 minutes).Note: Admin tools are disabled by default. To enable them, includeadminin your--enabled-toolsflag.
orgId values for multi-organization requests.http://localhost:3000/d/dashboard-uid)http://localhost:3000/d/dashboard-uid?viewPanel=5)http://localhost:3000/explore?schemaVersion=1&panes={"a":{"datasource":"prometheus-uid"}}). Grafana below 10.2 does not understand panes, so the legacy ?left={...} format is emitted for those versions instead.from=now-1h&to=now)what, when, tags, data).provisioningPreview parameter.The list of tools is configurable, so you can choose which tools you want to make available to the MCP client. This is useful if you don't use certain functionality or if you don't want to take up too much of the context window. To disable a category of tools, use the --disable-<category> flag when starting the server. For example, to disable the OnCall tools, use --disable-oncall, or to disable navigation deeplink generation, use --disable-navigation.
#### RBAC Permissions
Each tool requires specific RBAC permissions to function properly. When creating a service account for the MCP server, ensure it has the necessary permissions based on which tools you plan to use. The permissions listed are the minimum required actions - you may also need appropriate scopes (e.g., datasources:*, dashboards:*, folders:*) depending on your use case.
Tip: If you're not familiar with Grafana RBAC or you want a quicker, simpler setup instead of configuring many granular scopes, you can assign a built-in role such as Editor to the service account. The Editor role grants broad read/write access that will allow most MCP server operations; it is less granular (and therefore less restrictive) than manually-applied scopes, so use it only when convenience is more important than strict least-privilege access.
Note: OnCall and other plugin-backed tools are authorized by plugin actions such as grafana-irm-app.schedules:read. The basic Viewer role includes the read actions and Editor the write actions. Incident tools need only plugins.app:access; IRM authorizes incident actions by basic role.
Actions in group/resource:verb form, such as dashboard.grafana.app/dashboards:get, apply only to on-behalf-of access tokens. A service account needs only the other actions listed.
For more information about Grafana RBAC, see the official documentation.
#### RBAC Scopes
Scopes define the specific resources that permissions apply to. Each action requires both the appropriate permission and scope combination.
Common Scope Patterns:
* wildcards for organization-wide accessdatasources:* - Access to all datasourcesdashboards:* - Access to all dashboardsfolders:* - Access to all foldersteams:* - Access to all teamsdatasources:uid:prometheus-uid - Access only to a specific Prometheus datasourcedashboards:uid:abc123 - Access only to dashboard with UID abc123folders:uid:xyz789 - Access only to folder with UID xyz789teams:id:5 - Access only to team with ID 5global.users:id:123 - Access only to user with ID 123Examples:
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) datasources:uid:prometheus-prod (datasources:query)
datasources:uid:loki-prod (datasources:query) dashboards:uid:monitoring-dashboard (dashboards:read)
dashboards:uid:alerts-dashboard (dashboards:read)| Tool | Category | Description | Required RBAC Permissions | Required Scopes |
|---|---|---|---|---|
list_teams | Admin* | List all teams | teams:read | teams:* or teams:id:1 |
list_users_by_org | Admin* | List users in an organization, with search and pagination | org.users:read | global.users:* or global.users:id:123 |
list_all_roles | Admin* | List all Grafana roles | roles:read | roles:* |
get_role_details | Admin* | Get details for a Grafana role | roles:read | roles:uid:editor |
get_role_assignments | Admin* | List assignments for a role | roles:read, teams.roles:read, users.roles:read | roles:uid:editor |
list_user_roles | Admin* | List roles for users | users.roles:read | global.users:id:123 |
list_team_roles | Admin* | List roles for teams | teams.roles:read | teams:id:7 |
get_resource_permissions | Admin* | List permissions for a resource | dashboards.permissions:read, datasources.permissions:read, folders.permissions:read, serviceaccounts.permissions:read, teams.permissions:read, users.permissions:read | dashboards:uid:abcd1234 |
get_resource_description | Admin* | Describe a Grafana resource type | dashboards.permissions:read, datasources.permissions:read, folders.permissions:read, serviceaccounts.permissions:read, teams.permissions:read, users.permissions:read | dashboards:* |
user_info | User | Current identity, capabilities, and accessible organizations | None | — |
search_dashboards | Search | Search for dashboards by query, folder UID, folder path, tag, or starred | dashboards:read, folders:read | dashboards:* or dashboards:uid:abc123 |
search_folders | Search | Search for folders by title | folders:read | folders:* or folders:uid:xyz789 |
get_dashboard_by_uid | Dashboard | Get a dashboard by uid, optionally a saved version | dashboard.grafana.app/dashboards:get, dashboards:read, dashboards:write | dashboards:uid:abc123 |
list_dashboard_versions | Dashboard | List saved versions of a dashboard (version, author, time, message) | dashboards:read, dashboards:write | dashboards:uid:abc123 |
update_dashboard | Dashboard | Update or create a new dashboard | dashboard.grafana.app/dashboards:create, dashboard.grafana.app/dashboards:get, dashboard.grafana.app/dashboards:update, dashboards:create, dashboards:read, dashboards:write, folders:read | dashboards:*, folders:* or folders:uid:xyz789 |
get_dashboard_panel_queries | Dashboard | Get panel title, queries, datasource UID and type from a dashboard | dashboard.grafana.app/dashboards:get, dashboards:read | dashboards:uid:abc123 |
run_panel_query | RunPanelQuery* | Execute one or more dashboard panel queries | dashboard.grafana.app/dashboards:get, dashboards:read, datasources:query, datasources:read | dashboards:uid:*, datasources:uid:* |
get_dashboard_property | Dashboard | Extract specific parts of a dashboard using JSONPath expressions | dashboard.grafana.app/dashboards:get, dashboards:read | dashboards:uid:abc123 |
get_dashboard_summary | Dashboard | Get a compact summary of a dashboard without full JSON | dashboard.grafana.app/dashboards:get, dashboards:read | dashboards:uid:abc123 |
create_folder | Dashboard | Create a folder | folders:create, folders:read, folders:write | folders:* |
list_datasources | Datasources | List datasources | datasources:read | datasources:* |
get_datasource | Datasources | Get a datasource by UID or name | datasources:read | datasources:uid:prometheus-uid |
check_datasources_health | Datasources | Check the health of one or more datasources | datasources:query, datasources:read | datasources:uid:* |
create_datasource | Datasources | Create a datasource | datasources:create, datasources:read | datasources:* |
update_datasource | Datasources | Update a datasource | datasources:read, datasources:write | datasources:* or datasources:uid:abc123 |
get_query_examples | Examples* | Get example queries for a datasource type | None | datasources:* |
query_prometheus | Prometheus | Query metrics using PromQL without opening a chart | datasources:query, datasources:read | datasources:uid:prometheus-uid |
render_grafana_app | Rendering | Run an enabled query tool and display its result in the interactive Grafana App | datasources:query, datasources:read | datasources:* or datasources:uid:<uid> |
list_prometheus_metric_metadata | Prometheus | List metric metadata | datasources:query, datasources:read | datasources:uid:prometheus-uid |
list_prometheus_metric_names | Prometheus | List available metric names | datasources:query, datasources:read | datasources:uid:prometheus-uid |
list_prometheus_label_names | Prometheus | List label names matching a selector | datasources:query, datasources:read | datasources:uid:prometheus-uid |
list_prometheus_label_values | Prometheus | List values for a specific label | datasources:query, datasources:read | datasources:uid:prometheus-uid |
query_prometheus_histogram | Prometheus | Calculate histogram percentile values | datasources:query, datasources:read | datasources:uid:prometheus-uid |
list_incidents | Incident | List incidents in Grafana Incident, optionally with their custom field values | plugins.app:access | N/A |
create_incident | Incident | Create an incident in Grafana Incident, optionally setting custom fields | plugins.app:access | N/A |
add_activity_to_incident | Incident | Add an activity item to an incident in Grafana Incident | plugins.app:access | N/A |
update_incident | Incident | Update an incident in Grafana Incident (status, severity, title, or custom fields) | plugins.app:access | N/A |
get_incident | Incident | Get a single incident by ID, including its custom fields | plugins.app:access | N/A |
list_incident_custom_fields | Incident | List the custom fields configured for incidents, with their types and select options | plugins.app:access | N/A |
query_loki_logs | Loki | Query and retrieve logs using LogQL (either log or metric queries) | datasources:query, datasources:read | datasources:uid:loki-uid |
list_loki_label_names | Loki | List all available label names in logs | datasources:query, datasources:read | datasources:uid:loki-uid |
list_loki_label_values | Loki | List values for a specific log label | datasources:query, datasources:read | datasources:uid:loki-uid |
query_loki_stats | Loki | Get statistics about log streams | datasources:query, datasources:read | datasources:uid:loki-uid |
query_loki_patterns | Loki | Query detected log patterns to identify common structures | datasources:query, datasources:read | datasources:uid:loki-uid |
analyze_loki_labels | Loki | Audit a Loki label strategy (live or static) and optionally diagnose query performance | datasources:query, datasources:read | datasources:uid:loki-uid |
suggest_loki_alloy_label_config | Config | Generate an Alloy loki.process snippet enforcing approved labels | None | N/A |
query_influxdb | InfluxDB* | Query InfluxDB using InfluxQL (v1) or Flux (v2) | datasources:query, datasources:read | datasources:uid:influxdb-uid |
list_sql_databases | SQL* | List databases, schemas, or catalogs from a SQL datasource | datasources:query, datasources:read | datasources:uid:* |
list_sql_tables | SQL* | List tables in a SQL datasource | datasources:query, datasources:read | datasources:uid:* |
describe_sql_table | SQL* | Get column schema for a table | datasources:query, datasources:read | datasources:uid:* |
query_sql | SQL* | Execute SQL queries with macro substitution | datasources:query, datasources:read | datasources:uid:* |
list_cloudwatch_namespaces | CloudWatch* | List available AWS CloudWatch namespaces | datasources:query, datasources:read | datasources:uid:* |
list_cloudwatch_metrics | CloudWatch* | List metrics in a namespace | datasources:query, datasources:read | datasources:uid:* |
list_cloudwatch_dimensions | CloudWatch* | List dimensions for a metric | datasources:query, datasources:read | datasources:uid:* |
list_cloudwatch_dimension_values | CloudWatch* | List values for a dimension key | datasources:query, datasources:read | datasources:uid:* |
query_cloudwatch | CloudWatch* | Execute CloudWatch metric queries | datasources:query, datasources:read | datasources:uid:* |
list_cloudwatch_log_groups | CloudWatch* | List CloudWatch log groups | datasources:query, datasources:read | datasources:uid:* |
list_cloudwatch_log_group_fields | CloudWatch* | List fields discovered in a log group | datasources:query, datasources:read | datasources:uid:* |
query_cloudwatch_logs | CloudWatch* | Execute CloudWatch Logs Insights queries | datasources:query, datasources:read | datasources:uid:* |
list_cloud_logging_projects | Cloud Logging* | List GCP projects readable by a Google Cloud Logging datasource | datasources:query, datasources:read | datasources:uid:* |
list_cloud_logging_buckets | Cloud Logging* | List log buckets in a GCP project | datasources:query, datasources:read | datasources:uid:* |
list_cloud_logging_views | Cloud Logging* | List log views in a log bucket | datasources:query, datasources:read | datasources:uid:* |
query_cloud_logging | Cloud Logging* | Query logs with the Cloud Logging query language | datasources:query, datasources:read | datasources:uid:* |
query_elasticsearch | Elasticsearch/OpenSearch* | Query Elasticsearch or OpenSearch using Lucene syntax or Query DSL | datasources:query, datasources:read | datasources:uid:datasource-uid |
query_quickwit | Quickwit* | Query Quickwit using Lucene syntax or Query DSL | datasources:query, datasources:read | datasources:uid:quickwit-uid |
alerting_rules_read | Alerting | List and inspect alert rules (list, get, versions) | alert.rules.external:read, alert.rules:read, datasources:read, folders:read | folders:* or folders:uid:alerts-folder |
alerting_rules_write | Alerting | Create, update and delete Grafana-managed rules, or explicitly create datasource-managed rules | 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:read | folders:*, or datasources:uid:<uid> for external creation |
alerting_manage_routing | Alerting | Manage notification policies, contact points, and time intervals | 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 | Global scope |
alerting_routing_write | Alerting | Create Grafana-managed contact points by default, or explicitly create external Alertmanager receivers | alert.notifications.external:read, alert.notifications.external:write, alert.notifications.receivers:create, alert.provisioning.provenance:write, datasources:read |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.