Grafana MCP服务器

Grafana MCP服务器提供对Grafana实例及其生态系统的访问,支持仪表板管理、数据源查询、事件处理和警报管理等功能。

  • by ashishnagargoje0
  • Go
  • 本地部署
  • 更新于
在 GitHub 查看 ashishnagargoje0/mcp-grafana

使用说明

Grafana MCP服务器

A. 模型上下文协议 Grafana的MCP服务器。

这提供了对Grafana实例和周围生态系统的访问。

需求

  • Grafana 9.0或更高版本 是完整功能所必需的。由于缺少API端点,某些功能,特别是与数据源相关的操作,可能无法与早期版本正确工作。

特性

MCP服务器目前提供以下功能。此列表仅供参考,并不代表对未来功能的路线图或承诺。

仪表盘

  • 搜索仪表板: 按标题或其他元数据查找仪表板
  • 按UID获取仪表板: 使用其唯一标识符检索完整的仪表板详细信息。 警告:大型仪表板可能会占用大量上下文窗口空间。
  • 获取仪表板摘要: 获取仪表板的简洁概述,包括标题、面板数量、面板类型、变量和元数据,而无需完整的JSON,以最大限度地减少上下文窗口的使用
  • 获取仪表板属性: 使用JSONPath表达式提取仪表板的特定部分(例如。, $.title, $.panels[*].title)仅获取所需数据并减少上下文窗口消耗
  • 更新或创建仪表板: 修改现有仪表板或创建新仪表板。 警告:需要完整的仪表板JSON,这可能会消耗大量的上下文窗口空间。
  • 补丁控制面板: 将特定更改应用于仪表板,而不需要完整的JSON,从而大大减少了针对性修改的上下文窗口使用
  • 获取面板查询和数据源信息: 从仪表板中的每个面板获取标题、查询字符串和数据源信息(包括UID和类型,如果可用)

上下文窗口管理

仪表板工具现在包括几种有效管理上下文窗口使用的策略(问题#101):

  • 使用 get_dashboard_summary 用于仪表板概述和计划修改
  • 使用 get_dashboard_property 当您只需要特定的仪表板部件时,使用JSONPath
  • 避免 get_dashboard_by_uid 除非您特别需要完整的仪表板JSON

数据源

  • 列出并获取数据源信息: 查看所有已配置的数据源,并检索每个数据源的详细信息。
    • 支持的数据源类型:Prometheus、Loki。

普罗米修斯查询

  • 查询普罗米修斯: 对Prometheus数据源执行PromQL查询(支持即时和范围度量查询)。
  • 查询Prometheus元数据: 从Prometheus数据源检索度量元数据、度量名称、标签名称和标签值。

洛基查询

  • 查询Loki日志和指标: 使用LogQL对Loki数据源运行日志查询和度量查询。
  • 查询Loki元数据: 从Loki数据源检索标签名称、标签值和流统计信息。

事件

  • 搜索、创建和更新事件: 管理Grafana事件中的事件,包括搜索、创建和向事件添加活动。

筛选调查

  • 列出筛选调查: 检索支持限制参数的筛选调查列表。
  • 获取筛选调查: 通过UUID检索特定Sift调查的详细信息。
  • 获取筛选分析: 从Sift调查中检索特定分析。
  • 在日志中查找错误模式: 使用Sift检测Loki日志中升高的错误模式。
  • 查找慢速请求: 使用Sift(Tempo)检测慢速请求。

告警

  • 列出并获取警报规则信息: 在Grafana中查看警报规则及其状态(触发/正常/错误等)。
  • 列出联系点: 查看Grafana中配置的通知联系人。

Grafana OnCall

  • 列出并管理时间表: 在Grafana OnCall中查看和管理随叫随到时间表。
  • 获取班次详细信息: 检索有关特定随叫随到轮班的详细信息。
  • 获取当前随叫随到的用户: 查看哪些用户当前处于待命状态以获取日程安排。
  • 列出团队和用户: 查看所有OnCall团队和用户。
  • 列出警报组: 根据各种条件(包括状态、集成、标签和时间范围)查看和筛选Grafana OnCall中的警报组。
  • 获取警报组详细信息: 按ID检索特定警报组的详细信息。

管理员

  • 列出团队: 查看Grafana中所有已配置的团队。
  • 列出用户: 在Grafana中查看组织中的所有用户。

导航

  • 生成深度链接: 为Grafana资源创建准确的深度链接URL,而不是依赖LLM URL猜测。
    • 仪表板链接: 使用仪表板的UID生成到仪表板的直接链接(例如。, http://localhost:3000/d/dashboard-uid)
    • 面板链接: 使用viewPanel参数创建指向仪表板内特定面板的链接(例如。, http://localhost:3000/d/dashboard-uid?viewPanel=5)
    • 浏览链接: 使用预配置的数据源生成指向Grafana Explore的链接(例如。, http://localhost:3000/explore?left={"datasource":"prometheus-uid"})
    • 时间范围支持: 向链接添加时间范围参数(from=now-1h&to=now)
    • 自定义参数: 包括其他查询参数,如仪表板变量或刷新间隔

工具列表是可配置的,因此您可以选择要向MCP客户端提供哪些工具。 如果你不使用某些功能,或者你不想占用太多的上下文窗口,这很有用。 要禁用某类工具,请使用 --disable-<category> 启动服务器时标记。例如,要禁用 OnCall工具,使用 --disable-oncall,或禁用导航深度链接生成,请使用 --disable-navigation.

RBAC权限

每个工具都需要特定的RBAC权限才能正常运行。为MCP服务器创建服务帐户时,根据您计划使用的工具,确保它具有必要的权限。列出的权限是所需的最小操作,您可能还需要适当的范围(例如。, datasources:*, dashboards:*, folders:*)这取决于你的用例。

提示:如果你不熟悉Grafana RBAC,或者你想要一个更快、更简单的设置,而不是配置许多粒度范围,你可以分配一个内置角色,例如 Editor 到服务帐户。这 Editor 角色授予广泛的读/写访问权限,允许大多数MCP服务器操作;它比手动应用的作用域粒度小(因此限制性也小),因此只有在方便性比严格的最低权限访问更重要时才使用它。

注: Grafana Incident和Sift工具使用基本的Grafana角色,而不是细粒度的RBAC权限:

  • 查看器角色: 只读操作所需(列出事件,获取调查)
  • 编辑角色: 写入操作(创建事件、修改调查)所需

有关Grafana RBAC的更多信息,请参阅 官方文件.

RBAC作用域

作用域定义了应用权限的特定资源。每个操作都需要适当的权限和作用域组合。

常见作用域模式:

  • 广泛的访问: 使用 * 用于组织范围访问的通配符

    • datasources:* -访问所有数据源
    • dashboards:* -访问所有仪表板
    • folders:* -访问所有文件夹
    • teams:* -访问所有团队
  • 访问受限: 使用特定的UID或ID来限制对单个资源的访问

    • datasources:uid:prometheus-uid -仅访问特定的Prometheus数据源
    • dashboards:uid:abc123 -仅使用UID访问仪表板 abc123
    • folders:uid:xyz789 -仅访问具有UID的文件夹 xyz789
    • teams:id:5 -仅限具有ID的团队访问 5
    • global.users:id:123 -仅限ID为的用户访问 123

示例:

  • 完全访问MCP服务器: 为所有工具授予广泛权限

    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)
    
  • 数据源访问受限: 仅查询特定的Prometheus和Loki实例

    datasources:uid:prometheus-prod (datasources:query)
    datasources:uid:loki-prod (datasources:query)
    
  • 仪表板特定访问: 只读特定仪表板

    dashboards:uid:monitoring-dashboard (dashboards:read)
    dashboards:uid:alerts-dashboard (dashboards:read)
    

工具

工具 类别 描述 所需RBAC权限 所需范围
list_teams 管理员 列出所有团队 teams:read teams:* 或 teams:id:1
list_users_by_org 管理员 列出组织中的所有用户 users:read global.users:* 或 global.users:id:123
search_dashboards 搜索 搜索仪表板 dashboards:read dashboards:* 或 dashboards:uid:abc123
get_dashboard_by_uid 仪表板 通过uid获取仪表板 dashboards:read dashboards:uid:abc123
update_dashboard 仪表板 更新或创建新的仪表板 dashboards:create, dashboards:write dashboards:*, folders:* 或 folders:uid:xyz789
get_dashboard_panel_queries 仪表板 从仪表板获取面板标题、查询、数据源UID和类型 dashboards:read dashboards:uid:abc123
get_dashboard_property 仪表板 使用JSONPath表达式提取仪表板的特定部分 dashboards:read dashboards:uid:abc123
get_dashboard_summary 仪表板 获取仪表板的简洁摘要,无需完整的JSON dashboards:read dashboards:uid:abc123
list_datasources 数据源 列出数据源 datasources:read datasources:*
get_datasource_by_uid 数据源 通过uid获取数据源 datasources:read datasources:uid:prometheus-uid
get_datasource_by_name 数据源 按名称获取数据源 datasources:read datasources:* 或 datasources:uid:loki-uid
query_prometheus Prometheus 对Prometheus数据源执行查询 datasources:query datasources:uid:prometheus-uid
list_prometheus_metric_metadata Prometheus 列出度量元数据 datasources:query datasources:uid:prometheus-uid
list_prometheus_metric_names Prometheus 列出可用指标名称 datasources:query datasources:uid:prometheus-uid
list_prometheus_label_names Prometheus 列出与选择器匹配的标签名称 datasources:query datasources:uid:prometheus-uid
list_prometheus_label_values Prometheus 列出特定标签的值 datasources:query datasources:uid:prometheus-uid
list_incidents 事件 在Grafana事件中列出事件 查看器角色 不适用
create_incident 事件 在Grafana事件中创建事件 编辑角色 不适用
add_activity_to_incident 事件 在Grafana事件中向事件添加活动项 编辑角色 不适用
get_incident 事件 按ID获取单个事件 查看器角色 不适用
query_loki_logs Loki 使用LogQL查询和检索日志(日志或度量查询) datasources:query datasources:uid:loki-uid
list_loki_label_names 洛基 在日志中列出所有可用的标签名称 datasources:query datasources:uid:loki-uid
list_loki_label_values Loki 列出特定日志标签的值 datasources:query datasources:uid:loki-uid
query_loki_stats 洛基 获取日志流的统计信息 datasources:query datasources:uid:loki-uid
list_alert_rules 警报 列出警报规则 alert.rules:read folders:* 或 folders:uid:alerts-folder
get_alert_rule_by_uid 警报 按UID获取警报规则 alert.rules:read folders:uid:alerts-folder
list_contact_points 警报 列出通知联系人 alert.notifications:read 全球范围
list_oncall_schedules OnCall 列出Grafana OnCall的计划 grafana-oncall-app.schedules:read 插件特定作用域
get_oncall_shift OnCall 获取特定OnCall班次的详细信息 grafana-oncall-app.schedules:read 插件特定作用域
get_current_oncall_users OnCall 让当前随叫随到的用户按照特定的日程安排 grafana-oncall-app.schedules:read 插件特定作用域
list_oncall_teams OnCall 列出Grafana OnCall的团队 grafana-oncall-app.user-settings:read 插件特定作用域
list_oncall_users OnCall 列出Grafana OnCall中的用户 grafana-oncall-app.user-settings:read 插件特定作用域
list_alert_groups OnCall 列出Grafana OnCall中的警报组及其过滤选项 grafana-oncall-app.alert-groups:read 插件特定作用域
get_alert_group OnCall 通过ID从Grafana OnCall获取特定的警报组 grafana-oncall-app.alert-groups:read 插件特定作用域
get_sift_investigation 筛选 按UUID检索现有的筛选调查 查看器角色 不适用
get_sift_analysis 筛选 从筛选调查中检索特定分析 查看者角色 不适用
list_sift_investigations 筛选 检索具有可选限制的筛选调查列表 查看器角色 不适用
find_error_pattern_logs Sift 在Loki日志中查找提升的错误模式。 编辑角色 不适用
find_slow_requests 筛选 从相关节奏数据源中查找慢速请求。 编辑角色 不适用
list_pyroscope_label_names Pyroscope 列出与选择器匹配的标签名称 datasources:query datasources:uid:pyroscope-uid
list_pyroscope_label_values Pyroscope 列出与标签名称的选择器匹配的标签值 datasources:query datasources:uid:pyroscope-uid
list_pyroscope_profile_types Pyroscope 列出可用的配置文件类型 datasources:query datasources:uid:pyroscope-uid
fetch_pyroscope_profile 高温计 获取DOT格式的轮廓进行分析 datasources:query datasources:uid:pyroscope-uid
get_assertions 断言 获取给定实体的断言摘要 插件特定权限 插件特定范围
generate_deeplink 导航 为Grafana资源生成准确的深度链接URL 无(只读URL生成) 不适用

CLI标志参考

这 mcp-grafana binary支持各种命令行标志进行配置:

运输选项:

  • -t, --transport:运输类型(stdio, sse,或 streamable-http)-默认值: stdio
  • --address:SSE/流式http服务器的主机和端口-默认值: localhost:8000
  • --base-path:SSE/可流式传输http服务器的基本路径
  • --endpoint-path:可流式传输http服务器的终结点路径-默认值: /

调试和日志记录:

  • --debug:启用调试模式以记录详细的HTTP请求/响应日志

工具配置:

  • --enabled-tools:逗号分隔的已启用类别列表-默认值:所有类别均已启用-示例:“loki,datasources”
  • --disable-search:禁用搜索工具
  • --disable-datasource:禁用数据源工具
  • --disable-incident:禁用事件工具
  • --disable-prometheus:禁用普罗米修斯工具
  • --disable-loki:禁用loki工具
  • --disable-alerting:禁用警报工具
  • --disable-dashboard:禁用仪表板工具
  • --disable-oncall:禁用oncall工具
  • --disable-asserts:禁用断言工具
  • --disable-sift:禁用筛选工具
  • --disable-admin:禁用管理工具
  • --disable-pyroscope:禁用检流计工具
  • --disable-navigation:禁用导航工具

客户端TLS配置(用于Grafana连接):

  • --tls-cert-file:客户端身份验证的TLS证书文件的路径
  • --tls-key-file:客户端身份验证的TLS私钥文件的路径
  • --tls-ca-file:用于服务器验证的TLS CA证书文件的路径
  • --tls-skip-verify:跳过TLS证书验证(不安全)

服务器TLS配置(仅限流式http传输):

  • --server.tls-cert-file:服务器HTTPS的TLS证书文件路径
  • --server.tls-key-file:服务器HTTPS的TLS私钥文件路径

用法

此MCP服务器可与本地Grafana实例和Grafana Cloud一起使用。对于Grafana Cloud,请使用您的实例URL(例如。, https://myinstance.grafana.net)而不是 http://localhost:3000 在下面的配置示例中。

  1. 如果使用服务帐户令牌身份验证,请在Grafana中创建一个具有足够权限的服务帐户,以使用您要使用的工具, 生成服务帐户令牌,并将其复制到剪贴板以在配置文件中使用。 跟随 Grafana服务帐户文档 有关创建服务帐户令牌的详细信息。 提示:如果您不习惯配置细粒度RBAC作用域,一个更简单(但限制较少)的选项是分配内置 Editor 将角色添加到服务帐户。这授予了涵盖大多数MCP服务器操作的广泛读/写访问权限——当便利性超过严格的最低权限要求时使用它。

    注: 环境变量 GRAFANA_API_KEY 已弃用,将在未来版本中删除。请迁移到使用 GRAFANA_SERVICE_ACCOUNT_TOKEN 相反。旧的变量名将继续用于向后兼容性,但会显示弃用警告。

多组织支持

您可以使用以下任一方式指定要与哪个组织交互:

  • 环境变量: 集 GRAFANA_ORG_ID 到数字组织ID
  • HTTP标头: 集 X-Grafana-Org-Id 使用SSE或流式HTTP传输时(标头优先于环境变量,这意味着您也可以设置默认组织)。

提供组织ID后,MCP服务器将设置 X-Grafana-Org-Id Grafana的所有请求的标头,确保操作在指定的组织上下文中执行。

组织ID示例:

{
  "mcpServers": {
    "grafana": {
      "command": "mcp-grafana",
      "args": [],
      "env": {
        "GRAFANA_URL": "http://localhost:3000",
        "GRAFANA_USERNAME": "<your username>",
        "GRAFANA_PASSWORD": "<your password>",
        "GRAFANA_ORG_ID": "2"
      }
    }
  }
}
  1. 您有几个安装选项 mcp-grafana:

    • Docker镜像:使用Docker Hub中的预构建Docker镜像。

      重要Docker镜像的入口点默认配置为在SSE模式下运行MCP服务器,但大多数用户希望使用STDIO模式与Claude Desktop等AI助手直接集成:

      1. STDIO模式:对于stdio模式,您必须用以下命令显式覆盖默认值 -t stdio 并包括 -i 用于保持stdin打开的标志:
      docker pull mcp/grafana
      # For local Grafana:
      docker run --rm -i -e GRAFANA_URL=http://localhost:3000 -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> mcp/grafana -t stdio
      # For Grafana Cloud:
      docker run --rm -i -e GRAFANA_URL=https://myinstance.grafana.net -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> mcp/grafana -t stdio
      
      1. SSE模式:在此模式下,服务器作为客户端连接的HTTP服务器运行。您必须使用 -p 标志:
      docker pull mcp/grafana
      docker run --rm -p 8000:8000 -e GRAFANA_URL=http://localhost:3000 -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> mcp/grafana
      
      1. 流式HTTP模式:在这种模式下,服务器作为一个独立的进程运行,可以处理多个客户端连接。您必须使用 -p flag:对于此模式,您必须使用以下命令显式覆盖默认值 -t streamable-http
      docker pull mcp/grafana
      docker run --rm -p 8000:8000 -e GRAFANA_URL=http://localhost:3000 -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> mcp/grafana -t streamable-http
      

      对于具有服务器TLS证书的HTTPS流式HTTP模式:

      docker pull 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=<your service account token> \
        mcp/grafana \
        -t streamable-http \
        -addr :8443 \
        --server.tls-cert-file /certs/server.crt \
        --server.tls-key-file /certs/server.key
      
    • 下载二进制文件:下载最新版本的 mcp-grafana 从 发布页面 然后把它放在你的 $PATH.

    • 从源代码构建:如果你安装了Go工具链,你也可以使用 GOBIN 环境变量 指定应安装二进制文件的目录。这也应该在你的 PATH.

      GOBIN="$HOME/go/bin" go install github.com/grafana/mcp-grafana/cmd/mcp-grafana@latest
      
    • 使用Helm部署到Kubernetes:使用 Grafana Helm charts存储库中的Helm chart

      helm repo add grafana https://grafana.github.io/helm-charts
      helm install --set grafana.apiKey=<Grafana_ApiKey> --set grafana.url=<GrafanaUrl> my-release grafana/grafana-mcp
      
  2. 将服务器配置添加到客户端配置文件中。例如,对于Claude Desktop:

    如果使用二进制:

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

注意:如果你看到 Error: spawn mcp-grafana ENOENT 在Claude Desktop中,您需要指定以下内容的完整路径 mcp-grafana.

如果使用Docker:

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

注: -t stdio 这个参数在这里很重要,因为它覆盖了Docker镜像中的默认SSE模式。

在远程MCP服务器上使用VSCode

如果您使用VSCode并在SSE模式下运行MCP服务器(这是在不覆盖传输的情况下使用Docker映像时的默认模式),请确保 .vscode/settings.json 包括以下内容:

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

对于具有服务器TLS证书的HTTPS流式HTTP模式:

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

调试模式

您可以通过添加以下命令为Grafana传输启用调试模式 -debug 标志到命令。这将提供MCP服务器和Grafana API之间HTTP请求和响应的详细日志记录,这有助于故障排除。

要在Claude Desktop配置中使用调试模式,请按如下方式更新配置:

如果使用二进制:

{
  "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": "<your service account token>"
      }
    }
  }
}

如果使用Docker:

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

注:与标准配置一样 -t stdio 需要参数来覆盖Docker映像中的默认SSE模式。

TLS配置

如果您的Grafana实例位于mTLS之后或需要自定义TLS证书,则可以将MCP服务器配置为使用自定义证书。服务器支持以下TLS配置选项:

  • --tls-cert-file:客户端身份验证的TLS证书文件的路径
  • --tls-key-file:客户端身份验证的TLS私钥文件的路径
  • --tls-ca-file:用于服务器验证的TLS CA证书文件的路径
  • --tls-skip-verify:跳过TLS证书验证(不安全,仅用于测试)

客户端证书身份验证示例:

{
  "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": "<your service account token>"
      }
    }
  }
}

Docker示例:

{
  "mcpServers": {
    "grafana": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-v",
        "/path/to/certs:/certs:ro",
        "-e",
        "GRAFANA_URL",
        "-e",
        "GRAFANA_SERVICE_ACCOUNT_TOKEN",
        "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": "<your service account token>"
      }
    }
  }
}

TLS配置应用于MCP服务器使用的所有HTTP客户端,包括:

  • Grafana OpenAPI的主要客户端
  • Prometheus数据源客户端
  • Loki数据源客户端
  • 事件管理客户端
  • 筛选调查客户
  • 提醒客户
  • 断言客户

直接CLI使用示例:

对于使用自签名证书的测试:

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

使用客户端证书身份验证:

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

仅使用自定义CA证书:

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

程序化使用:

如果您以编程方式使用此库,您还可以创建启用TLS的上下文函数:

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

服务器TLS配置(仅限流式HTTP传输)

使用流式HTTP传输时(-t streamable-http),您可以将MCP服务器配置为提供HTTPS而不是HTTP。当您需要保护MCP客户端和服务器本身之间的连接时,这很有用。

服务器支持以下用于流式HTTP传输的TLS配置选项:

  • --server.tls-cert-file:服务器HTTPS的TLS证书文件路径(TLS需要)
  • --server.tls-key-file:服务器HTTPS的TLS私钥文件路径(TLS需要)

备注:这些标志与上面记录的客户端TLS标志完全分开。客户端TLS标志配置MCP服务器如何连接到Grafana,而这些服务器TLS标志配置客户端在使用流式HTTP传输时如何连接到MCP服务器。

HTTPS流式HTTP服务器示例:

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

这将启动HTTPS端口8443上的MCP服务器。然后,客户端将连接到 https://localhost:8443/ 而不是 http://localhost:8000/.

使用服务器TLS的Docker示例:

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

健康检查端点

使用SSE时(-t sse)或可流式传输的HTTP(-t streamable-http)传输时,MCP服务器在以下位置公开健康检查端点 /healthz此端点可由负载平衡器、监控系统或编排平台使用,以验证服务器是否正在运行并接受连接。

端点: GET /healthz

答复:

  • 状态代码: 200 OK
  • 主体: ok

示例用法:

# For streamable HTTP or SSE transport on default port
curl http://localhost:8000/healthz

# With custom address
curl http://localhost:9090/healthz

注: 健康检查端点仅在使用SSE或流式HTTP传输时可用。使用stdio传输时不可用(-t stdio),因为stdio不公开HTTP服务器。

故障排除

Grafana版本兼容性

如果在使用数据源相关工具时遇到以下错误:

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

这通常表示您使用的Grafana版本早于9.0。这 /datasources/uid/{uid} API端点是在Grafana 9.0中引入的,数据源操作将在早期版本中失败。

解决方案: 将Grafana实例升级到9.0或更高版本以解决此问题。

发展

欢迎投稿!如果您有任何建议或改进,请打开问题或提交拉取请求。

这个项目是用Go编写的。按照您平台的说明安装Go。

要在STDIO模式下本地运行服务器(这是本地开发的默认模式),请使用:

make run

要在本地以SSE模式运行服务器,请使用:

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

您还可以在自定义构建的Docker映像中使用SSE传输来运行服务器。与已发布的Docker镜像一样,此自定义镜像的入口点默认为SSE模式。要构建映像,请使用:

make build-image

要在SSE模式(默认)下运行映像,请使用:

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

如果您需要在STDIO模式下运行它,请覆盖传输设置:

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

测试

有三种类型的测试可供选择:

  1. 单元测试(无需外部依赖):
make test-unit

您还可以使用以下命令运行单元测试:

make test
  1. 集成测试(需要docker容器启动并运行):
make test-integration
  1. 云测试(需要云Grafana实例和凭据):
make test-cloud

注意:云测试是在CI中自动配置的。对于本地开发,您需要设置自己的Grafana Cloud实例和凭据。

更全面的集成测试将要求Grafana实例在端口3000上本地运行;你可以从Docker Compose开始:

docker-compose up -d

集成测试可以通过以下方式运行:

make test-all

如果您要添加更多工具,请为它们添加集成测试。现有的测试应该是一个很好的起点。

代码检查

要提取代码,请运行:

make lint

这包括一个自定义的linter,用于检查中的未转义逗号 jsonschema 结构标签。逗号在 description 字段必须用转义符 \\, 以防止无声截断。您可以使用以下命令运行此linter:

make lint-jsonschema

看 JSONSchema Linter文档 了解更多详情。

许可证

该项目根据 Apache许可证,版本2.0.