使用说明
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) - 自定义参数: 包含额外的查询参数,如仪表板变量或刷新间隔
- 仪表盘链接: 使用其唯一标识符(UID)生成指向仪表板的直接链接(例如。,
工具列表是可配置的,因此您可以选择要提供给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访问仪表板abc123folders:uid:xyz789- 仅通过UID访问文件夹xyz789teams:id:5- 仅可访问具有ID的团队5global.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 在以下配置示例中。
-
如果使用服务账户令牌认证,请在Grafana中创建一个服务账户,并确保该账户拥有使用所需工具的足够权限, 生成一个服务账户令牌,并将其复制到剪贴板以便在配置文件中使用。 遵循 Grafana服务账户文档 有关创建服务帐户令牌的详细信息。
注: 环境变量
GRAFANA_API_KEY已被弃用,并将在未来版本中移除。请迁移到使用GRAFANA_SERVICE_ACCOUNT_TOKEN相反。为了保持向后兼容性,旧的变量名将继续有效,但会显示弃用警告。 -
您有多种安装选项可供选择
mcp-grafana:-
Docker 镜像使用Docker Hub上的预构建Docker镜像。
重要的Docker镜像的入口点默认配置为以SSE模式运行MCP服务器,但大多数用户希望使用STDIO模式,以便与Claude Desktop等AI助手直接集成:
- 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- 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- 可流式传输的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 - STDIO 模式对于stdio模式,您必须明确覆盖默认设置为
-
下载二进制文件下载最新版本的
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
-
-
将服务器配置添加到您的客户端配置文件中。例如,对于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
测试
有三种测试类型可供选择:
- 单元测试(无需外部依赖):
make test-unit
你也可以使用以下命令运行单元测试:
make test
- 集成测试(需要Docker容器已启动并运行):
make test-integration
- 云测试(需要云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版。
