Track MCP LogoTrack MCP
Track MCP LogoTrack MCP

The world's largest repository of Model Context Protocol servers. Discover, explore, and submit MCP tools.

Product

  • Categories
  • Top MCP
  • New & Updated
  • Submit MCP

Company

  • About

Legal

  • Privacy Policy
  • Terms of Service
  • Cookie Policy

© 2026 TrackMCP. All rights reserved.

Built with ❤️ by Krishna Goyal

    Mcp Grafana

    MCP server for Grafana Go-based implementation. Trusted by 1700+ developers. Trusted by 1700+ developers. Trusted by 1700+ developers.

    1,725 stars
    Go
    Updated Oct 19, 2025

    Table of Contents

    • Quick Start
    • Requirements
    • Features
    • Dashboards
    • Run Panel Query
    • Context Window Management
    • Datasources
    • Query Examples
    • Prometheus Querying
    • Loki Querying
    • ClickHouse Querying
    • CloudWatch Querying
    • Log Search
    • Elasticsearch Querying
    • Incidents
    • Sift Investigations
    • Alerting
    • Grafana OnCall
    • Admin
    • Navigation
    • Annotations
    • Rendering
    • RBAC Permissions
    • RBAC Scopes
    • Tools
    • CLI Flags Reference
    • Read-Only Mode
    • Usage
    • Multi-Organization Support
    • Custom HTTP Headers
    • Debug Mode
    • TLS Configuration
    • Server TLS Configuration (Streamable HTTP Transport Only)
    • Health Check Endpoint
    • Observability
    • Metrics
    • Tracing
    • Troubleshooting
    • Grafana Version Compatibility
    • Development
    • Testing
    • Linting
    • License

    Table of Contents

    • Quick Start
    • Requirements
    • Features
    • Dashboards
    • Run Panel Query
    • Context Window Management
    • Datasources
    • Query Examples
    • Prometheus Querying
    • Loki Querying
    • ClickHouse Querying
    • CloudWatch Querying
    • Log Search
    • Elasticsearch Querying
    • Incidents
    • Sift Investigations
    • Alerting
    • Grafana OnCall
    • Admin
    • Navigation
    • Annotations
    • Rendering
    • RBAC Permissions
    • RBAC Scopes
    • Tools
    • CLI Flags Reference
    • Read-Only Mode
    • Usage
    • Multi-Organization Support
    • Custom HTTP Headers
    • Debug Mode
    • TLS Configuration
    • Server TLS Configuration (Streamable HTTP Transport Only)
    • Health Check Endpoint
    • Observability
    • Metrics
    • Tracing
    • Troubleshooting
    • Grafana Version Compatibility
    • Development
    • Testing
    • Linting
    • License

    Documentation

    Grafana MCP server

    Unit Tests

    Integration Tests

    E2E Tests

    Go Reference

    MCP Catalog

    A Model Context Protocol (MCP) server for Grafana.

    This provides access to your Grafana instance and the surrounding ecosystem.

    Quick Start

    Requires uv. Add the following to your MCP client configuration (e.g. Claude Desktop, Cursor):

    json
    {
      "mcpServers": {
        "grafana": {
          "command": "uvx",
          "args": ["mcp-grafana"],
          "env": {
            "GRAFANA_URL": "http://localhost:3000",
            "GRAFANA_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.

    Requirements

    • Grafana version 9.0 or later is required for full functionality. Some features, particularly datasource-related operations, may not work correctly with earlier versions due to missing API endpoints.

    Features

    _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._

    Dashboards

    • Search for dashboards: Find dashboards by title or other metadata
    • Get dashboard by UID: Retrieve full dashboard details using its unique identifier. _Warning: Large dashboards can consume significant context window space._
    • Get dashboard summary: Get a compact overview of a dashboard including title, panel count, panel types, variables, and metadata without the full JSON to minimize context window usage
    • Get dashboard property: Extract specific parts of a dashboard using JSONPath expressions (e.g., $.title, $.panels[*].title) to fetch only needed data and reduce context window consumption
    • Update or create a dashboard: Modify existing dashboards or create new ones. _Warning: Requires full dashboard JSON which can consume large amounts of context window space._
    • Patch dashboard: Apply specific changes to a dashboard without requiring the full JSON, significantly reducing context window usage for targeted modifications
    • Get panel queries and datasource info: Get the title, query string, and datasource information (including UID and type, if available) from every panel in a dashboard

    Run Panel Query

    Note: Run panel query tools are disabled by default. To enable them, add runpanelquery to your --enabled-tools flag.

    • Run panel query: Execute a dashboard panel's query with custom time ranges and variable overrides.

    Context Window Management

    The dashboard tools now include several strategies to manage context window usage effectively (issue #101):

    • **Use get_dashboard_summary** for dashboard overview and planning modifications
    • **Use get_dashboard_property** with JSONPath when you only need specific dashboard parts
    • **Avoid get_dashboard_by_uid** unless you specifically need the complete dashboard JSON

    Datasources

    • List and fetch datasource information: View all configured datasources and retrieve detailed information about each.
    • _Supported datasource types: Prometheus, Loki, ClickHouse, CloudWatch, Elasticsearch._

    Query Examples

    Note: Query examples tools are disabled by default. To enable them, add examples to your --enabled-tools flag.

    • Get query examples: Retrieve example queries for different datasource types to learn query syntax.

    Prometheus Querying

    • Query Prometheus: Execute PromQL queries (supports both instant and range metric queries) against Prometheus datasources.
    • Query Prometheus metadata: Retrieve metric metadata, metric names, label names, and label values from Prometheus datasources.
    • Query histogram percentiles: Calculate histogram percentile values (p50, p90, p95, p99) using histogram_quantile.

    Loki Querying

    • Query Loki logs and metrics: Run both log queries and metric queries using LogQL against Loki datasources.
    • Query Loki metadata: Retrieve label names, label values, and stream statistics from Loki datasources.
    • Query Loki patterns: Retrieve log patterns detected by Loki to identify common log structures and anomalies.

    ClickHouse Querying

    Note: ClickHouse tools are disabled by default. To enable them, add clickhouse to your --enabled-tools flag.

    • List ClickHouse tables: List all tables in a ClickHouse database with row counts and sizes.
    • Describe table schema: Get column names, types, and metadata for a ClickHouse table.
    • Query ClickHouse: Execute SQL queries with Grafana macro and variable substitution support.

    CloudWatch Querying

    Note: CloudWatch tools are disabled by default. To enable them, add cloudwatch to your --enabled-tools flag.

    • List CloudWatch namespaces: Discover available AWS CloudWatch namespaces.
    • List CloudWatch metrics: List metrics available in a specific namespace.
    • List CloudWatch dimensions: Get dimensions for filtering metric queries.
    • Query CloudWatch: Execute CloudWatch metric queries with time range support.

    Log Search

    Note: Search logs tools are disabled by default. To enable them, add searchlogs to your --enabled-tools flag.

    • Search logs: High-level log search across ClickHouse (OTel format) and Loki datasources.

    Elasticsearch Querying

    Note: Elasticsearch tools are disabled by default. To enable them, add elasticsearch to your --enabled-tools flag.

    • Query Elasticsearch: Execute search queries against Elasticsearch datasources using either Lucene query syntax or Elasticsearch Query DSL. Supports filtering by time range and retrieving logs, metrics, or any indexed data. Returns documents with their index, ID, source fields, and optional relevance score.

    Incidents

    • Search, create, and update incidents: Manage incidents in Grafana Incident, including searching, creating, and adding activities to incidents.

    Sift Investigations

    • List Sift investigations: Retrieve a list of Sift investigations, with support for a limit parameter.
    • Get Sift investigation: Retrieve details of a specific Sift investigation by its UUID.
    • Get Sift analyses: Retrieve a specific analysis from a Sift investigation.
    • Find error patterns in logs: Detect elevated error patterns in Loki logs using Sift.
    • Find slow requests: Detect slow requests using Sift (Tempo).

    Alerting

    • List and fetch alert rule information: View alert rules and their statuses (firing/normal/error/etc.) in Grafana. Supports both Grafana-managed rules and datasource-managed rules from Prometheus or Loki datasources.
    • Create and update alert rules: Create new alert rules or modify existing ones.
    • Delete alert rules: Remove alert rules by UID.
    • Manage alerting routing: View notification policies, contact points, and time intervals. Supports both Grafana-managed contact points and receivers from external Alertmanager datasources (Prometheus Alertmanager, Mimir, Cortex).

    Grafana OnCall

    • List and manage schedules: View and manage on-call schedules in Grafana OnCall.
    • Get shift details: Retrieve detailed information about specific on-call shifts.
    • Get current on-call users: See which users are currently on call for a schedule.
    • List teams and users: View all OnCall teams and users.
    • List alert groups: View and filter alert groups from Grafana OnCall by various criteria including state, integration, labels, and time range.
    • Get alert group details: Retrieve detailed information about a specific alert group by its ID.

    Admin

    Note: Admin tools are disabled by default. To enable them, include admin in your --enabled-tools flag.

    • List teams: View all configured teams in Grafana.
    • List Users: View all users in an organization in Grafana.
    • List all roles: List all Grafana roles, with an optional filter for delegatable roles.
    • Get role details: Get details for a specific Grafana role by UID.
    • List assignments for a role: List all users, teams, and service accounts assigned to a role.
    • List roles for users: List all roles assigned to one or more users.
    • List roles for teams: List all roles assigned to one or more teams.
    • List permissions for a resource: List all permissions defined for a specific resource (dashboard, datasource, folder, etc.).
    • Describe a Grafana resource: List available permissions and assignment capabilities for a resource type.

    Navigation

    • Generate deeplinks: Create accurate deeplink URLs for Grafana resources instead of relying on LLM URL guessing.
    • Dashboard links: Generate direct links to dashboards using their UID (e.g., http://localhost:3000/d/dashboard-uid)
    • Panel links: Create links to specific panels within dashboards with viewPanel parameter (e.g., http://localhost:3000/d/dashboard-uid?viewPanel=5)
    • Explore links: Generate links to Grafana Explore with pre-configured datasources (e.g., http://localhost:3000/explore?left={"datasource":"prometheus-uid"})
    • Time range support: Add time range parameters to links (from=now-1h&to=now)
    • Custom parameters: Include additional query parameters like dashboard variables or refresh intervals

    Annotations

    • Get Annotations: Query annotations with filters. Supports time range, dashboard UID, tags, and match mode.
    • Create Annotation: Create a new annotation on a dashboard or panel.
    • Create Graphite Annotation: Create annotations using Graphite format (what, when, tags, data).
    • Update Annotation: Replace all fields of an existing annotation (full update).
    • Patch Annotation: Update only specific fields of an annotation (partial update).
    • Get Annotation Tags: List available annotation tags with optional filtering.

    Rendering

    • Get panel or dashboard image: Render a Grafana dashboard panel or full dashboard as a PNG image. Returns the image as base64 encoded data for use in reports, alerts, or presentations. Supports customizing dimensions, time range, theme, scale, and dashboard variables.
    • _Note: Requires the Grafana Image Renderer service to be installed and configured._

    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- 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: Grafana Incident and Sift tools use basic Grafana roles instead of fine-grained RBAC permissions:

    • Viewer role: Required for read-only operations (list incidents, get investigations)
    • Editor role: Required for write operations (create incidents, modify investigations)

    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:

    • Broad access: Use * wildcards for organization-wide access
    • datasources:* - Access to all datasources
    • dashboards:* - Access to all dashboards
    • folders:* - Access to all folders
    • teams:* - Access to all teams
    • Limited access: Use specific UIDs or IDs to restrict access to individual resources
    • datasources:uid:prometheus-uid - Access only to a specific Prometheus datasource
    • dashboards:uid:abc123 - Access only to dashboard with UID abc123
    • folders:uid:xyz789 - Access only to folder with UID xyz789
    • teams:id:5 - Access only to team with ID 5
    • global.users:id:123 - Access only to user with ID 123

    Examples:

    • Full MCP server access: Grant broad permissions for all tools
    code
    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
    code
    datasources:uid:prometheus-prod (datasources:query)
      datasources:uid:loki-prod (datasources:query)
    • Dashboard-specific access: Read only specific dashboards
    code
    dashboards:uid:monitoring-dashboard (dashboards:read)
      dashboards:uid:alerts-dashboard (dashboards:read)

    Tools

    ToolCategoryDescriptionRequired RBAC PermissionsRequired Scopes
    list_teamsAdminList all teamsteams:readteams:* or teams:id:1
    list_users_by_orgAdminList all users in an organizationusers:readglobal.users:* or global.users:id:123
    list_all_rolesAdminList all Grafana rolesroles:readroles:*
    get_role_detailsAdminGet details for a Grafana roleroles:readroles:uid:editor
    get_role_assignmentsAdminList assignments for a roleroles:readroles:uid:editor
    list_user_rolesAdminList roles for usersroles:readglobal.users:id:123
    list_team_rolesAdminList roles for teamsroles:readteams:id:7
    get_resource_permissionsAdminList permissions for a resourcepermissions:readdashboards:uid:abcd1234
    get_resource_descriptionAdminDescribe a Grafana resource typepermissions:readdashboards:*
    search_dashboardsSearchSearch for dashboardsdashboards:readdashboards:* or dashboards:uid:abc123
    get_dashboard_by_uidDashboardGet a dashboard by uiddashboards:readdashboards:uid:abc123
    update_dashboardDashboardUpdate or create a new dashboarddashboards:create, dashboards:writedashboards:*, folders:* or folders:uid:xyz789
    get_dashboard_panel_queriesDashboardGet panel title, queries, datasource UID and type from a dashboarddashboards:readdashboards:uid:abc123
    run_panel_queryRunPanelQuery*Execute one or more dashboard panel queriesdashboards:read, datasources:querydashboards:uid:*, datasources:uid:*
    get_dashboard_propertyDashboardExtract specific parts of a dashboard using JSONPath expressionsdashboards:readdashboards:uid:abc123
    get_dashboard_summaryDashboardGet a compact summary of a dashboard without full JSONdashboards:readdashboards:uid:abc123
    list_datasourcesDatasourcesList datasourcesdatasources:readdatasources:*
    get_datasourceDatasourcesGet a datasource by UID or namedatasources:readdatasources:uid:prometheus-uid
    get_query_examplesExamples*Get example queries for a datasource typedatasources:readdatasources:*
    query_prometheusPrometheusExecute a query against a Prometheus datasourcedatasources:querydatasources:uid:prometheus-uid
    list_prometheus_metric_metadataPrometheusList metric metadatadatasources:querydatasources:uid:prometheus-uid
    list_prometheus_metric_namesPrometheusList available metric namesdatasources:querydatasources:uid:prometheus-uid
    list_prometheus_label_namesPrometheusList label names matching a selectordatasources:querydatasources:uid:prometheus-uid
    list_prometheus_label_valuesPrometheusList values for a specific labeldatasources:querydatasources:uid:prometheus-uid
    query_prometheus_histogramPrometheusCalculate histogram percentile valuesdatasources:querydatasources:uid:prometheus-uid
    list_incidentsIncidentList incidents in Grafana IncidentViewer roleN/A
    create_incidentIncidentCreate an incident in Grafana IncidentEditor roleN/A
    add_activity_to_incidentIncidentAdd an activity item to an incident in Grafana IncidentEditor roleN/A
    get_incidentIncidentGet a single incident by IDViewer roleN/A
    query_loki_logsLokiQuery and retrieve logs using LogQL (either log or metric queries)datasources:querydatasources:uid:loki-uid
    list_loki_label_namesLokiList all available label names in logsdatasources:querydatasources:uid:loki-uid
    list_loki_label_valuesLokiList values for a specific log labeldatasources:querydatasources:uid:loki-uid
    query_loki_statsLokiGet statistics about log streamsdatasources:querydatasources:uid:loki-uid
    query_loki_patternsLokiQuery detected log patterns to identify common structuresdatasources:querydatasources:uid:loki-uid
    list_clickhouse_tablesClickHouse*List tables in a ClickHouse databasedatasources:querydatasources:uid:*
    describe_clickhouse_tableClickHouse*Get table schema with column typesdatasources:querydatasources:uid:*
    query_clickhouseClickHouse*Execute SQL queries with macro substitutiondatasources:querydatasources:uid:*
    list_cloudwatch_namespacesCloudWatch*List available AWS CloudWatch namespacesdatasources:querydatasources:uid:*
    list_cloudwatch_metricsCloudWatch*List metrics in a namespacedatasources:querydatasources:uid:*
    list_cloudwatch_dimensionsCloudWatch*List dimensions for a metricdatasources:querydatasources:uid:*
    query_cloudwatchCloudWatch*Execute CloudWatch metric queriesdatasources:querydatasources:uid:*
    search_logsSearchLogs*Search logs across ClickHouse and Lokidatasources:querydatasources:uid:*
    query_elasticsearchElasticsearch*Query Elasticsearch using Lucene syntax or Query DSLdatasources:querydatasources:uid:elasticsearch-uid
    alerting_manage_rulesAlertingManage alert rules (list, get, versions, create, update, delete)alert.rules:read + alert.rules:write for mutationsfolders:* or folders:uid:alerts-folder
    alerting_manage_routingAlertingManage notification policies, contact points, and time intervalsalert.notifications:readGlobal scope
    list_oncall_schedulesOnCallList schedules from Grafana OnCallgrafana-oncall-app.schedules:readPlugin-specific scopes
    get_oncall_shiftOnCallGet details for a specific OnCall shiftgrafana-oncall-app.schedules:readPlugin-specific scopes
    get_current_oncall_usersOnCallGet users currently on-call for a specific schedulegrafana-oncall-app.schedules:readPlugin-specific scopes
    list_oncall_teamsOnCallList teams from Grafana OnCallgrafana-oncall-app.user-settings:readPlugin-specific scopes
    list_oncall_usersOnCallList users from Grafana OnCallgrafana-oncall-app.user-settings:readPlugin-specific scopes
    list_alert_groupsOnCallList alert groups from Grafana OnCall with filtering optionsgrafana-oncall-app.alert-groups:readPlugin-specific scopes
    get_alert_groupOnCallGet a specific alert group from Grafana OnCall by its IDgrafana-oncall-app.alert-groups:readPlugin-specific scopes
    get_sift_investigationSiftRetrieve an existing Sift investigation by its UUIDViewer roleN/A
    get_sift_analysisSiftRetrieve a specific analysis from a Sift investigationViewer roleN/A
    list_sift_investigationsSiftRetrieve a list of Sift investigations with an optional limitViewer roleN/A
    find_error_pattern_logsSiftFinds elevated error patterns in Loki logs.Editor roleN/A
    find_slow_requestsSiftFinds slow requests from the relevant tempo datasources.Editor roleN/A
    list_pyroscope_label_namesPyroscopeList label names matching a selectordatasources:querydatasources:uid:pyroscope-uid
    list_pyroscope_label_valuesPyroscopeList label values matching a selector for a label namedatasources:querydatasources:uid:pyroscope-uid
    list_pyroscope_profile_typesPyroscopeList available profile typesdatasources:querydatasources:uid:pyroscope-uid
    fetch_pyroscope_profilePyroscopeFetches a profile in DOT format for analysisdatasources:querydatasources:uid:pyroscope-uid
    get_assertionsAssertsGet assertion summary for a given entityPlugin-specific permissionsPlugin-specific scopes
    generate_deeplinkNavigationGenerate accurate deeplink URLs for Grafana resourcesNone (read-only URL generation)N/A
    get_annotationsAnnotationsFetch annotations with filtersannotations:readannotations:* or annotations:id:123
    create_annotationAnnotationsCreate a new annotation (standard or Graphite format)annotations:writeannotations:*
    update_annotationAnnotationsUpdate specific fields of an annotation (partial update)annotations:writeannotations:*
    get_annotation_tagsAnnotationsList annotation tags with optional filteringannotations:readannotations:*
    get_panel_imageRenderingRender a dashboard panel or full dashboard as a PNG imagedashboards:readdashboards:uid:abc123

    _* Disabled by default. Add category to --enabled-tools to enable._

    CLI Flags Reference

    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: /

    Debug and Logging:

    • --debug: Enable debug mode for detailed HTTP request/response logging
    • --log-level: Log level (debug, info, warn, error) - default: info

    Observability:

    • --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

    Tool Configuration:

    • --enabled-tools: Comma-separated list of enabled categories - default: all categories except admin, to enable admin tools, add admin to the list (e.g., "search,datasource,...,admin")
    • --disable-search: Disable search tools
    • --disable-datasource: Disable datasource tools
    • --disable-incident: Disable incident tools
    • --disable-prometheus: Disable prometheus tools
    • --disable-write: Disable write tools (create/update operations)
    • --disable-loki: Disable loki tools
    • --disable-elasticsearch: Disable elasticsearch tools
    • --disable-alerting: Disable alerting tools
    • --disable-dashboard: Disable dashboard tools
    • --disable-oncall: Disable oncall tools
    • --disable-asserts: Disable asserts tools
    • --disable-sift: Disable sift tools
    • --disable-admin: Disable admin tools
    • --disable-pyroscope: Disable pyroscope tools
    • --disable-navigation: Disable navigation tools
    • --disable-rendering: Disable rendering tools (panel/dashboard image export)
    • --disable-cloudwatch: Disable CloudWatch tools
    • --disable-examples: Disable query examples tools
    • --disable-clickhouse: Disable ClickHouse tools
    • --disable-searchlogs: Disable search_logs tool
    • --disable-runpanelquery: Disable run panel query tools

    Read-Only Mode

    The --disable-write flag provides a way to run the MCP server in read-only mode, preventing any write operations to your Grafana instance. This is useful for scenarios where you want to provide safe, read-only access such as:

    • Using service accounts with limited read-only permissions
    • Providing AI assistants with observability data without modification capabilities
    • Running in production environments where write access should be restricted
    • Testing and development scenarios where you want to prevent accidental modifications

    When --disable-write is enabled, the following write operations are disabled:

    Dashboard Tools:

    • update_dashboard

    Folder Tools:

    • create_folder

    Incident Tools:

    • create_incident
    • add_activity_to_incident

    Alerting Tools:

    • alerting_manage_rules (create, update, delete operations)

    Annotation Tools:

    • create_annotation
    • update_annotation

    Sift Tools:

    • find_error_pattern_logs (creates investigations)
    • find_slow_requests (creates investigations)

    All read operations remain available, allowing you to query dashboards, run PromQL/LogQL queries, list resources, and retrieve data.

    Client TLS Configuration (for Grafana connections):

    • --tls-cert-file: Path to TLS certificate file for client authentication
    • --tls-key-file: Path to TLS private key file for client authentication
    • --tls-ca-file: Path to TLS CA certificate file for server verification
    • --tls-skip-verify: Skip TLS certificate verification (insecure)

    Server TLS Configuration (streamable-http transport only):

    • --server.tls-cert-file: Path to TLS certificate file for server HTTPS
    • --server.tls-key-file: Path to TLS private key file for server HTTPS

    Usage

    This MCP server works with both local Grafana instances and Grafana Cloud. For Grafana Cloud, use your instance URL (e.g., https://myinstance.grafana.net) instead of http://localhost:3000 in the configuration examples below.

    1. If using service account token authentication, create a service account in Grafana with enough permissions to use the tools you want to use,

    generate a service account token, and copy it to the clipboard for use in the configuration file.

    Follow the Grafana service account documentation for details on creating service account tokens.

    Tip: If you're not comfortable configuring fine-grained RBAC scopes, a simpler (but less restrictive) option is to assign the built-in Editor role to the service account. This grants broad read/write access that covers most MCP server operations — use it when convenience outweighs strict least-privilege requirements.

    Note: The environment variable GRAFANA_API_KEY is deprecated and will be removed in a future version. Please migrate to using GRAFANA_SERVICE_ACCOUNT_TOKEN instead. The old variable name will continue to work for backward compatibility but will show deprecation warnings.

    Multi-Organization Support

    You can specify which organization to interact with using either:

    • Environment variable: Set GRAFANA_ORG_ID to the numeric organization ID
    • HTTP header: Set X-Grafana-Org-Id when using SSE or streamable HTTP transports (header takes precedence over environment variable - meaning you can set a default org as well).

    When an organization ID is provided, the MCP server will set the X-Grafana-Org-Id header on all requests to Grafana, ensuring that operations are performed within the specified organization context.

    Example with organization ID:

    json
    {
      "mcpServers": {
        "grafana": {
          "command": "mcp-grafana",
          "args": [],
          "env": {
            "GRAFANA_URL": "http://localhost:3000",
            "GRAFANA_USERNAME": "",
            "GRAFANA_PASSWORD": "",
            "GRAFANA_ORG_ID": "2"
          }
        }
      }
    }

    Custom HTTP Headers

    You can add arbitrary HTTP headers to all Grafana API requests using the GRAFANA_EXTRA_HEADERS environment variable. The value should be a JSON object mapping header names to values.

    Example with custom headers:

    json
    {
      "mcpServers": {
        "grafana": {
          "command": "mcp-grafana",
          "args": [],
          "env": {
            "GRAFANA_URL": "http://localhost:3000",
            "GRAFANA_SERVICE_ACCOUNT_TOKEN": "",
            "GRAFANA_EXTRA_HEADERS": "{\"X-Custom-Header\": \"custom-value\", \"X-Tenant-ID\": \"tenant-123\"}"
          }
        }
      }
    }

    2. You have several options to install mcp-grafana:

    • uvx (recommended): If you have uv installed, no extra setup is needed — uvx will automatically download and run the server:
    bash
    uvx mcp-grafana
    • Docker image: Use the pre-built Docker image from Docker Hub.

    Important: The Docker image's entrypoint is configured to run the MCP server in SSE mode by default, but most users will want to use STDIO mode for direct integration with AI assistants like Claude Desktop:

    1. STDIO Mode: For stdio mode you must explicitly override the default with -t stdio and include the -i flag to keep stdin open:

    bash
    docker pull grafana/mcp-grafana
         # For local Grafana:
         docker run --rm -i -e GRAFANA_URL=http://localhost:3000 -e GRAFANA_SERVICE_ACCOUNT_TOKEN= grafana/mcp-grafana -t stdio
         # For Grafana Cloud:
         docker run --rm -i -e GRAFANA_URL=https://myinstance.grafana.net -e GRAFANA_SERVICE_ACCOUNT_TOKEN= grafana/mcp-grafana -t stdio

    2. SSE Mode: In this mode, the server runs as an HTTP server that clients connect to. You must expose port 8000 using the -p flag:

    bash
    docker pull grafana/mcp-grafana
         docker run --rm -p 8000:8000 -e GRAFANA_URL=http://localhost:3000 -e GRAFANA_SERVICE_ACCOUNT_TOKEN= grafana/mcp-grafana

    3. Streamable HTTP Mode: In this mode, the server operates as an independent process that can handle multiple client connections. You must expose port 8000 using the -p flag: For this mode you must explicitly override the default with -t streamable-http

    bash
    docker pull grafana/mcp-grafana
         docker run --rm -p 8000:8000 -e GRAFANA_URL=http://localhost:3000 -e GRAFANA_SERVICE_ACCOUNT_TOKEN= grafana/mcp-grafana -t streamable-http

    For HTTPS streamable HTTP mode with server TLS certificates:

    bash
    docker pull grafana/mcp-grafana
         docker run --rm -p 8443:8443 \
           -v /path/to/certs:/certs:ro \
           -e GRAFANA_URL=http://localhost:3000 \
           -e GRAFANA_SERVICE_ACCOUNT_TOKEN= \
           grafana/mcp-grafana \
           -t streamable-http \
           -addr :8443 \
           --server.tls-cert-file /certs/server.crt \
           --server.tls-key-file /certs/server.key
    • Download binary: Download the latest release of mcp-grafana from the releases page and place it in your $PATH.
    • Build from source: If you have a Go toolchain installed you can also build and install it from source, using the GOBIN environment variable

    to specify the directory where the binary should be installed. This should also be in your PATH.

    bash
    GOBIN="$HOME/go/bin" go install github.com/grafana/mcp-grafana/cmd/mcp-grafana@latest
    • Deploy to Kubernetes using Helm: use the Helm chart from the Grafana helm-charts repository
    bash
    helm repo add grafana https://grafana.github.io/helm-charts
         helm install --set grafana.apiKey= --set grafana.url= my-release grafana/grafana-mcp

    3. Add the server configuration to your client configuration file. For example, for Claude Desktop:

    If using uvx:

    json
    {
         "mcpServers": {
           "grafana": {
             "command": "uvx",
             "args": ["mcp-grafana"],
             "env": {
               "GRAFANA_URL": "http://localhost:3000",
               "GRAFANA_SERVICE_ACCOUNT_TOKEN": ""
             }
           }
         }
       }

    If using the binary:

    json
    {
         "mcpServers": {
           "grafana": {
             "command": "mcp-grafana",
             "args": [],
             "env": {
               "GRAFANA_URL": "http://localhost:3000",  // Or "https://myinstance.grafana.net" for Grafana Cloud
               "GRAFANA_SERVICE_ACCOUNT_TOKEN": "",
               // If using username/password authentication
               "GRAFANA_USERNAME": "",
               "GRAFANA_PASSWORD": "",
               // Optional: specify organization ID for multi-org support
               "GRAFANA_ORG_ID": "1"
             }
           }
         }
       }

    Note: if you see Error: spawn mcp-grafana ENOENT in Claude Desktop, you need to specify the full path to mcp-grafana.

    If using Docker:

    json
    {
      "mcpServers": {
        "grafana": {
          "command": "docker",
          "args": [
            "run",
            "--rm",
            "-i",
            "-e",
            "GRAFANA_URL",
            "-e",
            "GRAFANA_SERVICE_ACCOUNT_TOKEN",
            "grafana/mcp-grafana",
            "-t",
            "stdio"
          ],
          "env": {
            "GRAFANA_URL": "http://localhost:3000",  // Or "https://myinstance.grafana.net" for Grafana Cloud
            "GRAFANA_SERVICE_ACCOUNT_TOKEN": "",
            // If using username/password authentication
            "GRAFANA_USERNAME": "",
            "GRAFANA_PASSWORD": "",
            // Optional: specify organization ID for multi-org support
            "GRAFANA_ORG_ID": "1"
          }
        }
      }
    }

    Note: The -t stdio argument is essential here because it overrides the default SSE mode in the Docker image.

    Using VSCode with remote MCP server

    If you're using VSCode and running the MCP server in SSE mode (which is the default when using the Docker image without overriding the transport), make sure your .vscode/settings.json includes the following:

    json
    "mcp": {
      "servers": {
        "grafana": {
          "type": "sse",
          "url": "http://localhost:8000/sse"
        }
      }
    }

    For HTTPS streamable HTTP mode with server TLS certificates:

    json
    "mcp": {
      "servers": {
        "grafana": {
          "type": "sse",
          "url": "https://localhost:8443/sse"
        }
      }
    }

    Debug Mode

    You can enable debug mode for the Grafana transport by adding the -debug flag to the command. This will provide detailed logging of HTTP requests and responses between the MCP server and the Grafana API, which can be helpful for troubleshooting.

    To use debug mode with the Claude Desktop configuration, update your config as follows:

    If using the binary:

    json
    {
      "mcpServers": {
        "grafana": {
          "command": "mcp-grafana",
          "args": ["-debug"],
          "env": {
            "GRAFANA_URL": "http://localhost:3000",  // Or "https://myinstance.grafana.net" for Grafana Cloud
            "GRAFANA_SERVICE_ACCOUNT_TOKEN": ""
          }
        }
      }
    }

    If using Docker:

    json
    {
      "mcpServers": {
        "grafana": {
          "command": "docker",
          "args": [
            "run",
            "--rm",
            "-i",
            "-e",
            "GRAFANA_URL",
            "-e",
            "GRAFANA_SERVICE_ACCOUNT_TOKEN",
            "grafana/mcp-grafana",
            "-t",
            "stdio",
            "-debug"
          ],
          "env": {
            "GRAFANA_URL": "http://localhost:3000",  // Or "https://myinstance.grafana.net" for Grafana Cloud
            "GRAFANA_SERVICE_ACCOUNT_TOKEN": ""
          }
        }
      }
    }

    Note: As with the standard configuration, the -t stdio argument is required to override the default SSE mode in the Docker image.

    TLS Configuration

    If your Grafana instance is behind mTLS or requires custom TLS certificates, you can configure the MCP server to use custom certificates. The server supports the following TLS configuration options:

    • --tls-cert-file: Path to TLS certificate file for client authentication
    • --tls-key-file: Path to TLS private key file for client authentication
    • --tls-ca-file: Path to TLS CA certificate file for server verification
    • --tls-skip-verify: Skip TLS certificate verification (insecure, use only for testing)

    Example with client certificate authentication:

    json
    {
      "mcpServers": {
        "grafana": {
          "command": "mcp-grafana",
          "args": [
            "--tls-cert-file",
            "/path/to/client.crt",
            "--tls-key-file",
            "/path/to/client.key",
            "--tls-ca-file",
            "/path/to/ca.crt"
          ],
          "env": {
            "GRAFANA_URL": "https://secure-grafana.example.com",
            "GRAFANA_SERVICE_ACCOUNT_TOKEN": ""
          }
        }
      }
    }

    Example with Docker:

    json
    {
      "mcpServers": {
        "grafana": {
          "command": "docker",
          "args": [
            "run",
            "--rm",
            "-i",
            "-v",
            "/path/to/certs:/certs:ro",
            "-e",
            "GRAFANA_URL",
            "-e",
            "GRAFANA_SERVICE_ACCOUNT_TOKEN",
            "grafana/mcp-grafana",
            "-t",
            "stdio",
            "--tls-cert-file",
            "/certs/client.crt",
            "--tls-key-file",
            "/certs/client.key",
            "--tls-ca-file",
            "/certs/ca.crt"
          ],
          "env": {
            "GRAFANA_URL": "https://secure-grafana.example.com",
            "GRAFANA_SERVICE_ACCOUNT_TOKEN": ""
          }
        }
      }
    }

    The TLS configuration is applied to all HTTP clients used by the MCP server, including:

    • The main Grafana OpenAPI client
    • Prometheus datasource clients
    • Loki datasource clients
    • Incident management clients
    • Sift investigation clients
    • Alerting clients
    • Asserts clients

    Direct CLI Usage Examples:

    For testing with self-signed certificates:

    bash
    ./mcp-grafana --tls-skip-verify -debug

    With client certificate authentication:

    bash
    ./mcp-grafana \
      --tls-cert-file /path/to/client.crt \
      --tls-key-file /path/to/client.key \
      --tls-ca-file /path/to/ca.crt \
      -debug

    With custom CA certificate only:

    bash
    ./mcp-grafana --tls-ca-file /path/to/ca.crt

    Programmatic Usage:

    If you're using this library programmatically, you can also create TLS-enabled context functions:

    go
    // Using struct literals
    tlsConfig := &mcpgrafana.TLSConfig{
        CertFile: "/path/to/client.crt",
        KeyFile:  "/path/to/client.key",
        CAFile:   "/path/to/ca.crt",
    }
    grafanaConfig := mcpgrafana.GrafanaConfig{
        Debug:     true,
        TLSConfig: tlsConfig,
    }
    contextFunc := mcpgrafana.ComposedStdioContextFunc(grafanaConfig)
    
    // Or inline
    grafanaConfig := mcpgrafana.GrafanaConfig{
        Debug: true,
        TLSConfig: &mcpgrafana.TLSConfig{
            CertFile: "/path/to/client.crt",
            KeyFile:  "/path/to/client.key",
            CAFile:   "/path/to/ca.crt",
        },
    }
    contextFunc := mcpgrafana.ComposedStdioContextFunc(grafanaConfig)

    Server TLS Configuration (Streamable HTTP Transport Only)

    When using the streamable HTTP transport (-t streamable-http), you can configure the MCP server to serve HTTPS instead of HTTP. This is useful when you need to secure the connection between your MCP client and the server itself.

    The server supports the following TLS configuration options for the streamable HTTP transport:

    • --server.tls-cert-file: Path to TLS certificate file for server HTTPS (required for TLS)
    • --server.tls-key-file: Path to TLS private key file for server HTTPS (required for TLS)

    Note: These flags are completely separate from the client TLS flags documented above. The client TLS flags configure how the MCP server connects to Grafana, while these server TLS flags configure how clients connect to the MCP server when using streamable HTTP transport.

    Example with HTTPS streamable HTTP server:

    bash
    ./mcp-grafana \
      -t streamable-http \
      --server.tls-cert-file /path/to/server.crt \
      --server.tls-key-file /path/to/server.key \
      -addr :8443

    This would start the MCP server on HTTPS port 8443. Clients would then connect to https://localhost:8443/ instead of http://localhost:8000/.

    Docker example with server TLS:

    bash
    docker run --rm -p 8443:8443 \
      -v /path/to/certs:/certs:ro \
      -e GRAFANA_URL=http://localhost:3000 \
      -e GRAFANA_SERVICE_ACCOUNT_TOKEN= \
      grafana/mcp-grafana \
      -t streamable-http \
      -addr :8443 \
      --server.tls-cert-file /certs/server.crt \
      --server.tls-key-file /certs/server.key

    Health Check Endpoint

    When using the SSE (-t sse) or streamable HTTP (-t streamable-http) transports, the MCP server exposes a health check endpoint at /healthz. This endpoint can be used by load balancers, monitoring systems, or orchestration platforms to verify that the server is running and accepting connections.

    Endpoint: GET /healthz

    Response:

    • Status Code: 200 OK
    • Body: ok

    Example usage:

    bash
    # For streamable HTTP or SSE transport on default port
    curl http://localhost:8000/healthz
    
    # With custom address
    curl http://localhost:9090/healthz

    Note: The health check endpoint is only available when using SSE or streamable HTTP transports. It is not available when using the stdio transport (-t stdio), as stdio does not expose an HTTP server.

    Observability

    The MCP server supports Prometheus metrics and OpenTelemetry distributed tracing, following the OTel MCP semantic conventions.

    Metrics

    When using the SSE or streamable HTTP transports, enable Prometheus metrics with the --metrics flag:

    bash
    # Metrics served on the main server at /metrics
    ./mcp-grafana -t streamable-http --metrics
    
    # Metrics served on a separate address
    ./mcp-grafana -t streamable-http --metrics --metrics-address :9090

    Available Metrics:

    MetricTypeDescription
    mcp_server_operation_duration_secondsHistogramDuration of MCP operations (labels: mcp_method_name, gen_ai_tool_name, error_type, network_transport, mcp_protocol_version)
    mcp_server_session_duration_secondsHistogramDuration of MCP client sessions (labels: network_transport, mcp_protocol_version)
    http_server_request_duration_secondsHistogramDuration of HTTP server requests (from otelhttp)

    Note: Metrics are only available when using SSE or streamable HTTP transports. They are not available with the stdio transport.

    Tracing

    Distributed tracing is configured via standard OTEL_* environment variables and works independently of the --metrics flag. When OTEL_EXPORTER_OTLP_ENDPOINT is set, the server exports traces via OTLP/gRPC:

    bash
    # Send traces to a local Tempo instance
    OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317 \
    OTEL_EXPORTER_OTLP_INSECURE=true \
    ./mcp-grafana -t streamable-http
    
    # Send traces to Grafana Cloud with authentication
    OTEL_EXPORTER_OTLP_ENDPOINT=https://tempo-us-central1.grafana.net:443 \
    OTEL_EXPORTER_OTLP_HEADERS="Authorization=Basic ..." \
    ./mcp-grafana -t streamable-http

    Tool call spans follow semconv naming (tools/call ) and include attributes like gen_ai.tool.name, mcp.method.name, and mcp.session.id. The server also supports W3C trace context propagation from the _meta field of tool call requests.

    Docker example with metrics and tracing:

    bash
    docker run --rm -p 8000:8000 \
      -e GRAFANA_URL=http://localhost:3000 \
      -e GRAFANA_SERVICE_ACCOUNT_TOKEN= \
      -e OTEL_EXPORTER_OTLP_ENDPOINT=http://tempo:4317 \
      -e OTEL_EXPORTER_OTLP_INSECURE=true \
      grafana/mcp-grafana \
      -t streamable-http --metrics

    Troubleshooting

    Grafana Version Compatibility

    If you encounter the following error when using datasource-related tools:

    code
    get datasource by uid : [GET /datasources/uid/{uid}](400) getDataSourceByUidBadRequest {"message":"id is invalid"}

    This typically indicates that you are using a Grafana version earlier than 9.0. The /datasources/uid/{uid} API endpoint was introduced in Grafana 9.0, and datasource operations will fail on earlier versions.

    Solution: Upgrade your Grafana instance to version 9.0 or later to resolve this issue.

    Development

    Contributions are welcome! Please open an issue or submit a pull request if you have any suggestions or improvements.

    This project is written in Go. Install Go following the instructions for your platform.

    To run the server locally in STDIO mode (which is the default for local development), use:

    bash
    make run

    To run the server locally in SSE mode, use:

    bash
    go run ./cmd/mcp-grafana --transport sse

    You can also run the server using the SSE transport inside a custom built Docker image. Just like the published Docker image, this custom image's entrypoint defaults to SSE mode. To build the image, use:

    code
    make build-image

    And to run the image in SSE mode (the default), use:

    code
    docker run -it --rm -p 8000:8000 mcp-grafana:latest

    If you need to run it in STDIO mode instead, override the transport setting:

    code
    docker run -it --rm mcp-grafana:latest -t stdio

    Testing

    There are three types of tests available:

    1. Unit Tests (no external dependencies required):

    bash
    make test-unit

    You can also run unit tests with:

    bash
    make test

    2. Integration Tests (requires docker containers to be up and running):

    bash
    make test-integration

    3. Cloud Tests (requires cloud Grafana instance and credentials):

    bash
    make test-cloud

    Note: Cloud tests are automatically configured in CI. For local development, you'll need to set up your own Grafana Cloud instance and credentials.

    More comprehensive integration tests will require a Grafana instance to be running locally on port 3000; you can start one with Docker Compose:

    bash
    docker-compose up -d

    The integration tests can be run with:

    bash
    make test-all

    If you're adding more tools, please add integration tests for them. The existing tests should be a good starting point.

    Linting

    To lint the code, run:

    bash
    make lint

    This includes a custom linter that checks for unescaped commas in jsonschema struct tags. The commas in description fields must be escaped with \\, to prevent silent truncation. You can run just this linter with:

    bash
    make lint-jsonschema

    See the JSONSchema Linter documentation for more details.

    License

    This project is licensed under the Apache License, Version 2.0.

    Similar MCP

    Based on tags & features

    • AN

      Anyquery

      Go·
      1.4k
    • MC

      Mcpjungle

      Go·
      617
    • YU

      Yutu

      Go·
      317
    • MC

      Mcp Cyclops

      Go·
      29

    Trending MCP

    Most active this week

    • PL

      Playwright Mcp

      TypeScript·
      22.1k
    • SE

      Serena

      Python·
      14.5k
    • MC

      Mcp Playwright

      TypeScript·
      4.9k
    • MC

      Mcp Server Cloudflare

      TypeScript·
      3.0k
    View All MCP Servers

    Similar MCP

    Based on tags & features

    • AN

      Anyquery

      Go·
      1.4k
    • MC

      Mcpjungle

      Go·
      617
    • YU

      Yutu

      Go·
      317
    • MC

      Mcp Cyclops

      Go·
      29

    Trending MCP

    Most active this week

    • PL

      Playwright Mcp

      TypeScript·
      22.1k
    • SE

      Serena

      Python·
      14.5k
    • MC

      Mcp Playwright

      TypeScript·
      4.9k
    • MC

      Mcp Server Cloudflare

      TypeScript·
      3.0k