
Connects to Grafana instances (self-hosted or Cloud) via service account tokens and exposes dashboards, datasources, and query execution. You get CRUD operations on dashboards with JSONPath support for targeted updates, plus native querying against Prometheus, Loki, ClickHouse, CloudWatch, Athena, Snowflake, InfluxDB, and Graphite datasources. Most query tools are opt-in via flags to keep the surface area manageable. The run panel query feature lets you execute dashboard panel queries with custom time ranges and variable overrides. Useful when you want to pull observability data or modify dashboards programmatically without switching contexts to the Grafana UI. Requires Grafana 9.0 or later for full API support.
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.
$.title, $.panels[*].title) to fetch only needed data and reduce context window consumptionNote: Run panel query tools are disabled by default. To enable them, add
runpanelqueryto your--enabled-toolsflag.
The dashboard tools now include several strategies to manage context window usage effectively (issue #101):
get_dashboard_summary for dashboard overview and planning modificationsget_dashboard_property with JSONPath when you only need specific dashboard partsget_dashboard_by_uid unless you specifically need the complete dashboard JSONNote: Query examples tools are disabled by default. To enable them, add
examplesto your--enabled-toolsflag.
Note: InfluxDB tools are disabled by default. To enable them, add
influxdbto your--enabled-toolsflag.
dialect parameter.Note: ClickHouse tools are disabled by default. To enable them, add
clickhouseto your--enabled-toolsflag.
Note: CloudWatch tools are disabled by default. To enable them, add
cloudwatchto your--enabled-toolsflag.
Note: Graphite tools are disabled by default. To enable them, add
graphiteto your--enabled-toolsflag.
Note: Athena tools are disabled by default. To enable them, add
athenato your--enabled-toolsflag.
Note: Snowflake tools are disabled by default. To enable them, add
snowflaketo your--enabled-toolsflag.
Queries go through Grafana's Snowflake datasource (Grafana Enterprise plugin grafana-snowflake-datasource), so authentication is handled by the datasource configuration in Grafana — credentials are never seen by the MCP server. This is the same model used for the ClickHouse tools.
INFORMATION_SCHEMA.TABLES. Optional database/schema filters.SNOWFLAKE.TELEMETRY.EVENTS) for logs and traces, or any user table.
$__timeFilter(column), $__timeFrom, $__timeTo, $__from, $__to (Unix ms), $__interval (seconds), $__interval_ms, and ${varname} for template variable substitution.Note: Elasticsearch/OpenSearch tools are disabled by default. To enable them, add
elasticsearchto your--enabled-toolsflag.
Note: Quickwit tools are disabled by default. To enable them, add
quickwitto your--enabled-toolsflag.
Note: Agent Observability tools are disabled by default and work only in Grafana Cloud. To enable them, add
agento11yto 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, include
adminin 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?left={"datasource":"prometheus-uid"})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.
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: Grafana Incident and Sift tools use basic Grafana roles instead of fine-grained RBAC permissions:
For more information about Grafana RBAC, see the official documentation.
Scopes define the specific resources that permissions apply to. Each action requires both the appropriate permission and scope combination.
Common Scope Patterns:
Broad access: Use * wildcards for organization-wide access
datasources:* - Access to all datasourcesdashboards:* - Access to all dashboardsfolders:* - Access to all foldersteams:* - Access to all teamsLimited access: Use specific UIDs or IDs to restrict access to individual resources
datasources: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:
Full MCP server access: Grant broad permissions for all tools
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)
Limited datasource access: Only query specific Prometheus and Loki instances
datasources:uid:prometheus-prod (datasources:query)
datasources:uid:loki-prod (datasources:query)
Dashboard-specific access: Read only specific dashboards
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 all users in an organization | 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 | roles:uid:editor |
list_user_roles | Admin | List roles for users | roles:read | global.users:id:123 |
list_team_roles | Admin | List roles for teams | roles:read | teams:id:7 |
get_resource_permissions | Admin | List permissions for a resource | permissions:read | dashboards:uid:abcd1234 |
get_resource_description | Admin | Describe a Grafana resource type | permissions:read | dashboards:* |
user_info | User | Current identity, capabilities, and accessible organizations | None (signed-in user) | — |
search_dashboards | Search | Search for dashboards | dashboards:read | dashboards:* or dashboards:uid:abc123 |
get_dashboard_by_uid | Dashboard | Get a dashboard by uid | dashboards:read | dashboards:uid:abc123 |
update_dashboard | Dashboard | Update or create a new dashboard | dashboards:create, dashboards:write | dashboards:*, folders:* or folders:uid:xyz789 |
get_dashboard_panel_queries | Dashboard | Get panel title, queries, datasource UID and type from a dashboard | dashboards:read | dashboards:uid:abc123 |
run_panel_query | RunPanelQuery* | Execute one or more dashboard panel queries | dashboards:read, datasources:query | dashboards:uid:*, datasources:uid:* |
get_dashboard_property | Dashboard | Extract specific parts of a dashboard using JSONPath expressions | dashboards:read | dashboards:uid:abc123 |
get_dashboard_summary | Dashboard | Get a compact summary of a dashboard without full JSON | dashboards:read | dashboards:uid:abc123 |
list_datasources | Datasources | List datasources | datasources:read | datasources:* |
get_datasource | Datasources | Get a datasource by UID or name | datasources:read | datasources:uid:prometheus-uid |
get_query_examples | Examples* | Get example queries for a datasource type | datasources:read | datasources:* |
query_prometheus | Prometheus | Execute a query against a Prometheus datasource | datasources:query | datasources:uid:prometheus-uid |
list_prometheus_metric_metadata | Prometheus | List metric metadata | datasources:query | datasources:uid:prometheus-uid |
list_prometheus_metric_names | Prometheus | List available metric names | datasources:query | datasources:uid:prometheus-uid |
list_prometheus_label_names | Prometheus | List label names matching a selector | datasources:query | datasources:uid:prometheus-uid |
list_prometheus_label_values | Prometheus | List values for a specific label | datasources:query | datasources:uid:prometheus-uid |
query_prometheus_histogram | Prometheus | Calculate histogram percentile values | datasources:query | datasources:uid:prometheus-uid |
list_incidents | Incident | List incidents in Grafana Incident, optionally with their custom field values | Viewer role | N/A |
create_incident | Incident | Create an incident in Grafana Incident, optionally setting custom fields | Editor role | N/A |
add_activity_to_incident | Incident | Add an activity item to an incident in Grafana Incident | Editor role | N/A |
update_incident | Incident | Update an incident in Grafana Incident (status, severity, title, or custom fields) | Editor role | N/A |
get_incident | Incident | Get a single incident by ID, including its custom fields | Viewer role | N/A |
list_incident_custom_fields | Incident | List the custom fields configured for incidents, with their types and select options | Viewer role | N/A |
query_loki_logs | Loki | Query and retrieve logs using LogQL (either log or metric queries) | datasources:query | datasources:uid:loki-uid |
list_loki_label_names | Loki | List all available label names in logs | datasources:query | datasources:uid:loki-uid |
list_loki_label_values | Loki | List values for a specific log label | datasources:query | datasources:uid:loki-uid |
query_loki_stats | Loki | Get statistics about log streams | datasources:query | datasources:uid:loki-uid |
query_loki_patterns | Loki | Query detected log patterns to identify common structures | datasources:query | datasources:uid:loki-uid |
analyze_loki_labels | Loki | Audit a Loki label strategy (live or static) and optionally diagnose query performance | datasources:query | datasources:uid:loki-uid |
suggest_loki_alloy_label_config | Config | Generate an Alloy loki.process snippet enforcing approved labels | N/A | N/A |
query_influxdb | InfluxDB | Query InfluxDB using InfluxQL (v1) or Flux (v2) | datasources:query | datasources:uid:influxdb-uid |
list_clickhouse_tables | ClickHouse* | List tables in a ClickHouse database | datasources:query | datasources:uid:* |
describe_clickhouse_table | ClickHouse* | Get table schema with column types | datasources:query | datasources:uid:* |
query_clickhouse | ClickHouse* | Execute SQL queries with macro substitution | datasources:query | datasources:uid:* |
list_cloudwatch_namespaces | CloudWatch* | List available AWS CloudWatch namespaces | datasources:query | datasources:uid:* |
list_cloudwatch_metrics | CloudWatch* | List metrics in a namespace | datasources:query | datasources:uid:* |
list_cloudwatch_dimensions | CloudWatch* | List dimensions for a metric | datasources:query | datasources:uid:* |
query_cloudwatch | CloudWatch* | Execute CloudWatch metric queries | datasources:query | datasources:uid:* |
list_athena_catalogs | Athena* | List available Athena data catalogs | datasources:query | datasources:uid:* |
list_athena_databases | Athena* | List databases in an Athena catalog | datasources:query | datasources:uid:* |
list_athena_tables | Athena* | List tables in an Athena database | datasources:query | datasources:uid:* |
describe_athena_table | Athena* | Get column names for an Athena table | datasources:query | datasources:uid:* |
query_athena | Athena* | Execute SQL queries with macro substitution | datasources:query | datasources:uid:* |
query_elasticsearch | Elasticsearch/OpenSearch* | Query Elasticsearch or OpenSearch using Lucene syntax or Query DSL | datasources:query | datasources:uid:datasource-uid |
query_quickwit | Quickwit* | Query Quickwit using Lucene syntax or Query DSL | datasources:query | datasources:uid:quickwit-uid |
list_snowflake_tables | Snowflake* | List tables in a Snowflake database/schema via INFORMATION_SCHEMA | datasources:query | datasources:uid:* |
describe_snowflake_table | Snowflake* | Get table schema (column types, nullability, defaults, comments) | datasources:query | datasources:uid:* |
query_snowflake | Snowflake* | Execute SQL queries with macro/variable substitution | datasources:query | datasources:uid:* |
alerting_manage_rules | Alerting | Manage alert rules (list, get, versions, create, update, delete) | alert.rules:read + alert.rules:write for mutations | folders:* or folders:uid:alerts-folder |
alerting_manage_routing | Alerting | Manage notification policies, contact points, and time intervals | alert.notifications:read | Global scope |
alerting_manage_silences | Alerting | Manage alerting silences (list, get, create, update, expire) | alert.instances:read + alert.instances:write for mutations | Global scope |
list_oncall_schedules | OnCall | List schedules from Grafana OnCall | grafana-oncall-app.schedules:read | Plugin-specific scopes |
get_oncall_shift | OnCall | Get details for a specific OnCall shift | grafana-oncall-app.schedules:read | Plugin-specific scopes |
get_current_oncall_users | OnCall | Get users currently on-call for a specific schedule | grafana-oncall-app.schedules:read | Plugin-specific scopes |
list_oncall_teams | OnCall | List teams from Grafana OnCall | grafana-oncall-app.user-settings:read | Plugin-specific scopes |
list_oncall_users | OnCall | List users from Grafana OnCall | grafana-oncall-app.user-settings:read | Plugin-specific scopes |
list_alert_groups | OnCall | List alert groups from Grafana OnCall with filtering options | grafana-oncall-app.alert-groups:read | Plugin-specific scopes |
get_alert_group | OnCall | Get a specific alert group from Grafana OnCall by its ID | grafana-oncall-app.alert-groups:read | Plugin-specific scopes |
update_alert_group | OnCall | Acknowledge, unacknowledge, resolve, or unresolve an alert group | grafana-oncall-app.alert-groups:write (and :read) | Plugin-specific scopes |
get_sift_investigation | Sift | Retrieve an existing Sift investigation by its UUID | Viewer role | N/A |
get_sift_analysis | Sift | Retrieve a specific analysis from a Sift investigation | Viewer role | N/A |
list_sift_investigations | Sift | Retrieve a list of Sift investigations with an optional limit | Viewer role | N/A |
find_error_pattern_logs | Sift | Finds elevated error patterns in Loki logs. | Editor role | N/A |
find_slow_requests | Sift | Finds slow requests from the relevant tempo datasources. | Editor role | N/A |
list_pyroscope_label_names | Pyroscope | List label names matching a selector | datasources:query | datasources:uid:pyroscope-uid |
list_pyroscope_label_values | Pyroscope | List label values matching a selector for a label name | datasources:query | datasources:uid:pyroscope-uid |
list_pyroscope_profile_types | Pyroscope | List available profile types | datasources:query | datasources:uid:pyroscope-uid |
query_pyroscope | Pyroscope | Query profiles, metrics, or both from Pyroscope | datasources:query | datasources:uid:pyroscope-uid |
get_assertions | Asserts | Get assertion summary for a given entity | Plugin-specific permissions | Plugin-specific scopes |
agento11y_manage_conversations | Agent Observability* | List, search, and fetch LLM conversations from Grafana Agent Observability | grafana-agento11y-app.conversations:read | N/A |
agento11y_manage_generations | Agent Observability* | Fetch LLM generation details and evaluation scores from Grafana Agent Observability | grafana-agento11y-app.data:read | N/A |
agento11y_manage_agents | Agent Observability* | Read the agent catalog: list agents, get one agent version in full, list version history, and per-version score aggregates | grafana-agento11y-app.data:read | N/A |
agento11y_manage_evaluators | Agent Observability* | Manage evaluators, evaluator templates, and the judge catalog (list, get, upsert, fork, test, delete) | grafana-agento11y-app.data:read + grafana-agento11y-app.eval:write for mutations and tests | N/A |
agento11y_manage_eval_rules | Agent Observability* | Manage eval rules and guards (list, get, create, update, preview, delete) | grafana-agento11y-app.data:read + grafana-agento11y-app.eval:write for mutations and previews | N/A |
agento11y_manage_eval_collections | Agent Observability* | Manage saved conversations and the collections that group them (list, get, save, create, update, delete, add and remove members) | grafana-agento11y-app.data:read + grafana-agento11y-app.eval:write for mutations | N/A |
agento11y_manage_experiments | Agent Observability* | Read offline experiments, their trials, scores, artifact metadata, and filter facets; update and cancel an experiment | grafana-agento11y-app.data:read + grafana-agento11y-app.eval:write for mutations | N/A |
agento11y_manage_test_suites | Agent Observability* | Manage the test suites that offline experiments run against, their versions, and their test cases (list, get, create, update, draft, publish, upsert, delete) | grafana-agento11y-app.data:read + grafana-agento11y-app.eval:write for mutations | N/A |
ask_assistant | Assistant* | Send a prompt to Grafana Assistant and return the full text reply (multi-turn via contextId) | Plugin-specific permissions | Plugin-specific scopes |
generate_deeplink | Navigation | Generate accurate deeplink URLs for Grafana resources | None (read-only URL generation) | N/A |
get_annotations | Annotations | Fetch annotations with filters | annotations:read | annotations:* or annotations:id:123 |
create_annotation | Annotations | Create a new annotation (standard or Graphite format) | annotations:write | annotations:* |
update_annotation | Annotations | Update specific fields of an annotation (partial update) | annotations:write | annotations:* |
get_annotation_tags | Annotations | List annotation tags with optional filtering | annotations:read | annotations:* |
list_snapshots | Snapshot | List dashboard snapshots with optional query and limit filters | dashboards:read | dashboards:* or dashboards:uid:abc123 |
get_snapshot | Snapshot | Get snapshot metadata and dashboard payload by snapshot key | dashboards:read | dashboards:* or dashboards:uid:abc123 |
create_snapshot | Snapshot | Create a dashboard snapshot from a full dashboard payload | dashboards:write | dashboards:* or dashboards:uid:abc123 |
delete_snapshot | Snapshot | Delete a dashboard snapshot by snapshot key | dashboards:write | dashboards:* or dashboards:uid:abc123 |
get_panel_image | Rendering | Render a stored dashboard or panel — or a provisioning preview from a repository branch — as a PNG image | dashboards:read | dashboards:uid:abc123 |
list_provisioning_repositories | Provisioning | List provisioning repositories (e.g. git-sync sources) with their source URL, branch, sync state, and health | provisioning.repositories:read | N/A |
validate_provisioning_file | Provisioning | Dry-run-apply a file from a provisioning repository and report admission validation errors | provisioning.repositories:read | N/A |
search_docs | Docs | Search Grafana documentation or list product groups (omit query to list products) | None (public grafana.com/docs) | N/A |
get_doc | Docs | Fetch a documentation page; set outline_only for headings, or section for bounded retrieval | None (public grafana.com/docs) | N/A |
* Disabled by default. Add category to --enabled-tools to enable.
The mcp-grafana binary supports various command-line flags for configuration:
Transport Options:
-t, --transport: Transport type (stdio, sse, or streamable-http) - default: stdio--address: The host and port for SSE/streamable-http server - default: localhost:8000--base-path: Base path for the SSE/streamable-http server--endpoint-path: Endpoint path for the streamable-http server - default: /mcp--server-name: Server name used in the MCP handshake and OTel service.name - default: mcp-grafana. Overrides GRAFANA_MCP_SERVER_NAME env varHTTP Transport Security (SSE / streamable-http only):
Host/Origin validation is enforced on every route on the listener — /sse, /mcp, /healthz, and /metrics — so a DNS-rebinding browser cannot reach any of them. Stdio transport is unaffected.
--allowed-hosts: Comma-separated allowlist of Host header values. Defaults to loopback variants of --address (e.g. localhost:8000,127.0.0.1:8000,[::1]:8000). A value that parses to empty (unset, ,, ,, etc.) also falls back to the defaults so a typo cannot silently disable the check. Requests with a Host header outside the allowlist are rejected with 403. Pass * to disable the check — only safe when running behind a trusted reverse proxy that rewrites Host, or in an isolated network. K8s httpGet probes and external /metrics scrapes will need either an explicit hostname in this list, *, or a tcpSocket probe / a separate metrics port (--metrics-address).--allowed-origins: Comma-separated allowlist of Origin header values. Empty by default — any request that carries an Origin header is rejected (browsers always send one for cross-origin requests, and no browser should be calling this server directly). Set to an explicit list to permit browser-based clients, or * to disable the check.Caller Authentication (SSE / streamable-http only):
Optionally require MCP clients to authenticate to the server. This is separate from the credentials the server uses to reach Grafana. Stdio is unaffected.
--server-auth-token: Bearer token callers must send as Authorization: Bearer <token>. Falls back to the MCP_GRAFANA_SERVER_TOKEN environment variable. When set, requests without a valid token are rejected with 401 before any tool runs. Prefer the env var so the secret isn't visible in the process arguments.Caller authentication is enforced only when --server-auth-token is set. When it isn't and the server binds a non-loopback address, the server starts but logs a security error — emitted at the error log level so it isn't hidden by --log-level (loopback and stdio are unaffected); a future major release will make that a startup error. Use TLS (or TLS termination) whenever caller auth is enabled on a non-loopback address. When caller auth is enabled, the validated Authorization header is stripped before requests reach Grafana; combining --server-auth-token with GRAFANA_FORWARD_HEADERS=Authorization is rejected at startup.
Debug and Logging:
--debug: Enable debug mode for detailed HTTP request/response logging--log-level: Log level (debug, info, warn, error) - default: infoGrafana Client Options:
--grafana-timeout: Time limit for requests made by the Grafana client. Accepts Go duration strings (e.g., 10s, 500ms) - default: 10s--include-args-in-spans: Include tool call arguments in OpenTelemetry spans. Only enable in non-production environments or when arguments are known not to contain PII - default: falseObservability:
--metrics: Enable Prometheus metrics endpoint at /metrics--metrics-address: Separate address for metrics server (e.g., :9090). If empty, metrics are served on the main server--slow-request-threshold: Log an event when any MCP request (tool invocation, list, resource read, etc.) takes longer than this duration. Accepts Go duration strings (e.g., 500ms, 5s). Default 0 disables slow-request logging. See the Slow-request logging section.--slow-request-log-level: Log level for slow-request events (info or warn) - default: warn.Session Management:
--session-idle-timeout-minutes: Session idle timeout in minutes. Sessions with no activity for this duration are automatically reaped - default: 30. Set to 0 to disable session reaping. Only relevant for SSE and streamable-http transports.GRAFANA_URL*URL to your Grafana instance
GRAFANA_SERVICE_ACCOUNT_TOKENsecretService account token used to authenticate with your Grafana instance
GRAFANA_USERNAMEUsername to authenticate with your Grafana instance
GRAFANA_PASSWORDsecretPassword to authenticate with your Grafana instance
GRAFANA_ORG_IDOrganization ID for multi-org support. Can also be set via X-Grafana-Org-Id header in SSE/streamable HTTP transports.
GRAFANA_EXTRA_HEADERSJSON object of additional HTTP headers to send with all Grafana API requests
GRAFANA_FORWARD_HEADERSComma-separated list of HTTP header names to forward from the incoming request to Grafana (SSE/streamable-http only). Example: Cookie,X-Session-Id