Grafana MCP服务器

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

  • by Mmartinez3
  • Go
  • 本地部署
  • 更新于
在 GitHub 查看 Mmartinez3/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 查询

  • 查询 Prometheus: 在Prometheus数据源上执行PromQL查询(支持即时和范围指标查询)。
  • 查询Prometheus元数据: 从Prometheus数据源中检索指标元数据、指标名称、标签名称和标签值。

Loki 查询

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

事件

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

“Sift Investigations”的中文翻译是“筛选调查”或“细致调查”,具体取决于上下文语境中对“Sift”一词的理解和强调点。在这里,“Sift”通常指的是仔细、细致地筛选或调查,所以“筛选调查”或“细致调查”是比较贴切的翻译

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

警报;提醒

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

Grafana OnCall(可译为“Grafana 呼叫告警”或“Grafana 值班通知”,具体根据上下文选择更贴切的表述)

  • 列出并管理日程: 在 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 Incident 和 Sift 工具使用基本的 Grafana 角色,而不是细粒度的基于角色的访问控制(RBAC)权限:

  • 观看者角色: 仅用于只读操作(列出事件、获取调查结果)
  • 编辑角色: 写入操作(创建事件、修改调查)所需

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

RBAC 范围

范围(Scopes)定义了权限所适用的具体资源。每个操作都需要相应的权限和范围组合。

常见的作用域模式:

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

    • 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 数据源 通过唯一标识符获取数据源 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 事件中列出事件列表 观察者角色 无适用项(N/A)
create_incident 事件 在Grafana中创建事件 编辑角色 不适用
add_activity_to_incident 事件 在Grafana事件中添加活动项 编辑角色 不适用
get_incident 事件 通过ID获取单个事件信息 观察者角色 不适用(N/A)
query_loki_logs Loki 使用 LogQL 查询和检索日志(支持日志查询或指标查询) datasources:query datasources:uid:loki-uid
list_loki_label_names Loki 列出日志中所有可用的标签名称 datasources:query datasources:uid:loki-uid
list_loki_label_values Loki 列出特定日志标签的值 datasources:query datasources:uid:loki-uid
query_loki_stats Loki 获取日志流的统计数据 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 Sift 通过 UUID 检索现有的 Sift 调查 查看者角色 无适用信息(N/A)
get_sift_analysis Sift 从Sift调查中检索特定分析 查看者角色 不适用(N/A)
list_sift_investigations Sift 获取Sift调查列表,可选限制数量 查看者角色 不适用(N/A)
find_error_pattern_logs Sift 在Loki日志中查找异常的错误模式。 编辑角色 无适用(N/A)
find_slow_requests 筛选 从相关的时间序列数据源中查找缓慢的请求。 编辑角色 不适用(N/A)
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 Pyroscope 获取DOT格式的配置文件以进行分析 datasources:query datasources:uid:pyroscope-uid
get_assertions 断言 获取给定实体的断言摘要 插件特定的权限 插件特定的作用域
generate_deeplink 导航 为Grafana资源生成准确的深度链接URL 无(仅读取URL生成) 不适用

CLI 标志参考

这个(或“该”) mcp-grafana 二进制文件支持各种用于配置的命令行标志:

交通方式:

  • -t, --transport运输类型(stdio, sse,或者 streamable-http) - 默认: stdio
  • --addressSSE/可流式HTTP服务器的主机和端口 - 默认: localhost:8000
  • --base-pathSSE/可流式HTTP服务器的基础路径
  • --endpoint-path流式HTTP服务器的端点路径 - 默认: /

调试和日志记录:

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

工具配置:

  • --enabled-tools启用工具的逗号分隔列表 - 默认:启用所有工具
  • --disable-search禁用搜索工具
  • --disable-datasource禁用数据源工具
  • --disable-incident禁用事件工具
  • --disable-prometheus禁用 Prometheus 工具
  • --disable-loki禁用 Loki 工具
  • --disable-alerting禁用警报工具
  • --disable-dashboard禁用仪表板工具
  • --disable-oncall禁用值班工具
  • --disable-asserts禁用断言工具
  • --disable-sift禁用筛选工具
  • --disable-admin禁用管理工具
  • --disable-pyroscope禁用 Pyroscope 工具
  • --disable-navigation禁用导航工具

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

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

服务器TLS配置(仅适用于streamable-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服务账户文档 有关创建服务帐户令牌的详细信息。

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

  2. 您有多种安装选项可供选择 mcp-grafana:

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

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

      1. STDIO 模式对于stdio模式,您必须明确覆盖默认设置为 -t stdio 并且包括 -i 保持标准输入打开的标志:
      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服务器运行,客户端连接到该服务器。您必须使用(指定的方法或工具)来暴露8000端口 -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模式在这种模式下,服务器作为一个独立进程运行,能够处理多个客户端连接。您必须使用(指定的方法或工具)来暴露8000端口 -p 标志:对于此模式,您必须显式地覆盖默认设置,使用 -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
      

      对于支持HTTPS流式传输的HTTP模式,需使用服务器TLS证书:

      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 图表仓库的 Helm 图表

      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
      
  3. 将服务器配置添加到您的客户端配置文件中。例如,对于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>"
          }
        }
      }
    }
    

注:如果你看到 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>"
      }
    }
  }
}

注:该 -t stdio 这里的参数是必不可少的,因为它会覆盖Docker镜像中的默认SSE模式。

使用VSCode连接远程MCP服务器

如果你正在使用VSCode并且以SSE模式运行MCP服务器(在使用Docker镜像且未覆盖传输方式时,这是默认设置),请确保你的 .vscode/settings.json 包括以下内容:

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

对于支持HTTPS流式传输的HTTP模式,需使用服务器TLS证书:

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

调试模式

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

要在Claude桌面配置中使用调试模式,请按以下方式更新您的配置:

如果使用二进制文件:

{
  "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"}

这通常表明您正在使用早于9.0版本的Grafana /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云实例和凭据。

更全面的集成测试需要在本地端口3000上运行一个Grafana实例;您可以使用Docker Compose来启动一个:

docker-compose up -d

集成测试可以使用以下方式运行:

make test-all

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

代码检查(或代码规范检查)

要对代码进行检查,请运行:

make lint

这包括一个自定义的代码检查器,用于检查未转义的逗号 jsonschema 结构体标签。其中的逗号 description 字段必须用(某种方式)转义 \\, 以防止静默截断。您可以通过以下命令仅运行此代码检查器:

make lint-jsonschema

查看 JSONSchema 验证器文档 以了解更多详情。

许可证

这个项目采用以下许可协议 Apache许可证,第2版。