MCP 服务器
概述
Zabbix MCP 服务器是一个允许 AI agent 使用模型上下文协议(MCP)与 Zabbix 协作的进程。 MCP 服务器与 MCP 客户端和 Zabbix API 通信。
使用 MCP 服务器,AI agent 可以:
- 获取主机组、模板组、主机、模板、监控项、LLD 规则、接口、宏、触发器、问题、维护周期和监控项历史数据(不包括二进制监控项);
- 执行问题更新:添加评论、确认或取消确认、更改严重性、抑制或取消抑制,或关闭问题;
- 创建、更新和删除维护周期。
Zabbix API 令牌用于授权;令牌会随每个请求发送。访问权限受令牌所有者的权限限制:用户只能查看其有权访问的主机组中的数据,并且用户无权执行的操作将被拒绝。
MCP 服务器是无状态的:请求之间不会保留会话。
虽然 Zabbix MCP 服务器可能适用于较旧或较新的 Zabbix 版本,但其兼容性仅正式支持与 MCP 服务器自身相同的 Zabbix 版本。
另请参阅:
安装
官方的 zabbix-mcp-server 软件包可在 Zabbix 软件源中获取。
要从源代码安装 Zabbix MCP server,请使用 make 进行构建。
要配置 Zabbix MCP server,请更新 MCP server 配置文件中的参数。
至少必须设置 FrontendURL 和 AllowedIP 参数。
默认配置文件(zabbix_mcp_server.conf)位于 /etc/zabbix/,其中禁用了最常暴露敏感数据的工具。要启用某个工具,请删除相应的 DenyTool 行。
另请参阅:安全最佳实践
运行
要启动 MCP 服务器,请运行:
zabbix_mcp_server -c /etc/zabbix/zabbix_mcp_server.conf
要检查配置文件并退出而不启动服务器,请使用 -T 选项:
zabbix_mcp_server -c /etc/zabbix/zabbix_mcp_server.conf -T
支持以下命令行选项:
| 选项 | 描述 |
|---|---|
-c <file> |
配置文件的路径。 默认值为 /etc/zabbix/zabbix_mcp_server.conf。 |
-T |
验证配置文件并退出。 |
-h |
显示帮助信息。 |
-V |
显示版本号。 |
从源代码安装 MCP 服务器时,必须手动创建 systemd 单元,例如:
[Unit]
Description=Zabbix MCP server
After=network-online.target
[Service]
User=zabbix
ExecStart=/usr/local/sbin/zabbix_mcp_server -c /etc/zabbix/zabbix_mcp_server.conf
Restart=on-failure
[Install]
WantedBy=multi-user.target
连接 MCP 客户端
任何支持 Streamable HTTP 传输的 MCP 客户端都可以连接到 MCP 服务器。 需要配置以下设置:
| 设置 | 值 |
|---|---|
| 传输 | Streamable HTTP |
| URL | https://<host>:<ListenPort>/mcp |
| 标头 | Authorization: Bearer <Zabbix API token>,每个请求都必须发送 |
每个用户都必须配置自己的 API token。
要验证设置,请向 MCP 服务器发送单个请求:
curl -sS https://mcp.example.com:8443/mcp \
-H "Authorization: Bearer $ZABBIX_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
HTTP 状态代码 200 以及响应中可用工具的列表,表示 MCP 服务器可访问并接受该 token;该列表显示已公开的工具。
其他状态代码表示以下问题:
400-Accept标头未同时包含传输所需的两种媒体类型;401- 缺少包含 token 的Authorization标头;403- 客户端地址未列在AllowedIP参数中。
审批和工具访问
如果 MCP 客户端支持表单引导,则每项更改在发送到 Zabbix 之前都必须获得用户批准。 MCP 客户端会向用户显示将要进行的更改,只有在用户确认后才会应用更改;如果用户拒绝或关闭请求,Zabbix 中不会发生任何更改。 批准有效期为五分钟,且仅适用于所显示的确切更改;在此期间可以重复使用该批准。
如果 MCP 客户端不支持表单引导(包括仅支持 URL 引导的客户端),则会立即应用更改,无需批准。 在这种情况下,请限制写入工具和 Zabbix API 权限。
审批尤其重要,因为工具输出可能包含来自受监控系统的不可信文本,这些文本可能会影响 agent。
使用 AllowTool、DenyTool、AllowToolRegexp 和 DenyToolRegexp 控制 MCP 服务器公开哪些工具。被拒绝的工具无法调用或列出,其关联资源也无法访问。
AllowTool、DenyTool、AllowToolRegexp 和 DenyToolRegexp 规则会限制 MCP 访问,但不会更改 Zabbix token 的权限。如果前端地址暴露给 AI agent,该 agent 可能会尝试直接发送 API 请求。请确保 Zabbix 前端位置和 MCP 服务器配置对 agent 不可访问,以便请求必须通过 MCP 服务器及其安全控制措施发送。
安全最佳实践
API 令牌
身份验证和授权完全由 Zabbix 处理。MCP 客户端在每个请求中发送 Zabbix API 令牌;MCP 服务器在不存储或记录该令牌的情况下将其转发,而 Zabbix 负责验证令牌、强制执行权限,并将操作记录在审计日志中。
为每个 agent 和用户使用单独的、遵循最小权限原则且会过期的令牌。将令牌存储在安全位置,并定期轮换 API 令牌。
TLS 加密
为防止令牌以明文形式发送,请设置 TLSAccept=cert,并指定证书和密钥(TLSCertFile 和 TLSKeyFile);或者在受信任的 TLS 终止反向 proxy 后运行 MCP 服务器,并设置 TLSAccept=unencrypted。
仅在受信任的网络中才可以接受未加密的 HTTP。
访问限制
将 AllowedIP 参数限制为受信任 MCP 客户端的地址,并使用 Zabbix 权限限制 API 令牌可以执行的操作。
MCP 服务器不提供请求速率限制。 每个 MCP 请求通常会产生一次 Zabbix API 调用,但在循环中运行的 agent 仍可能产生较大的负载。
敏感数据保护
监控项键可能包含凭据(例如,在 SSH、JMX、ODBC 和 HTTP agent 监控项中),宏值可能包含密码和团体字符串,接口会暴露内部地址,而日志或文本监控项值可能包含任何数据。
因此,在随附的配置文件中,item_get、lld_get、interface_get、macro_get 和 history_get 工具默认被拒绝。
为避免连接的 agent 的 LLM 提供商获取敏感宏值,请使用机密宏;其值永远不会由 API 返回。