NMIS9 MCP服务器
A. 模型上下文协议 NMIS9的(MCP)服务器,实现为Perl CGI脚本。它通过标准MCP工具接口将NMIS监控数据暴露给AI助手(Claude、ChatGPT等)。
概述
MCP服务器通过HTTP POST使用JSON-RPC 2.0,提供六种工具,让AI助手从实时NMIS9安装中查询节点状态、精确可达性、指标、事件和清单。指标以OTel启发的字段名返回,以与 mqtto观察 插件。
文件
| 文件 | 安装到 | 说明 |
|---|---|---|
nmis-mcp.pl | cgi-bin/nmis-mcp.pl | MCP服务器CGI脚本 |
nmis-mcp.nmis | conf/nmis-mcp.nmis | 配置(API令牌) |
t_nmis-mcp.pl | _(仅测试)_ | 帮助程序和数据结构的测试套件 |
安装
# Copy files into place
cp nmis-mcp.pl /usr/local/nmis9/cgi-bin/nmis-mcp.pl
cp nmis-mcp.nmis /usr/local/nmis9/conf/nmis-mcp.nmis
# Set permissions
chmod 755 /usr/local/nmis9/cgi-bin/nmis-mcp.pl
# Edit the config and set a secure API token
vi /usr/local/nmis9/conf/nmis-mcp.nmisCGI脚本由Apache提供 /cgi-nmis9/nmis-mcp.pl 使用现有的NMIS CGI配置。
认证
服务器支持三种身份验证方法:
| 方法 | 标题/参数 | 注释 |
|---|---|---|
| 自定义标题 | X-API-Token: | 推荐。Apache通行证 X-* CGI的头部。 |
| 持有者代币 | Authorization: Bearer | 标准,但要求 CGIPassAuth On 在Apache。 |
| 查询参数 | ?token= | 仅用于快速测试。 |
所有方法都会检查令牌 api_token 在 conf/nmis-mcp.nmis如果没有匹配的令牌,服务器将回退到NMIS cookie身份验证(用于基于浏览器的测试)。
在Claude Desktop中使用NMIS MCP
在MAC上,编辑文件~/库/应用程序支持/Claude/Claude_desktop_config json 例如/用户/keith/库/应用程序支持/Claude/Claude_desktop_config json
添加一个mcp-servers部分,或者只是为NMIS添加一个附加部分,在这里也显示mcp_DOCKER部分。
{
"mcpServers": {
"MCP_DOCKER": {
"command": "docker",
"args": [
"mcp",
"gateway",
"run"
]
},
"nmis": {
"command": "npx",
"args": [
"mcp-remote@latest",
"https://home.packsin.com/cgi-nmis9/nmis-mcp.pl",
"--header",
"X-API-Token: ${AUTH_TOKEN}"
],
"env": {
"AUTH_TOKEN": "CHANGE-ME-your-token-from-nmis-mcp-nmis-file"
}
}
},
"preferences": {
"comment": "POSSIBLY OTHER SETTINGS"
}
}然后向Claude询问一个或多个NMIS节点的事件状态 NMIS MCP Demo
MCP工具
nmis_list_nodes
列出所有处于基本状态的受监视节点。
参数: 无
退货: 数组 {name, group, host, nodeType, nodedown, health, reachability}
curl -s -X POST http://localhost/cgi-nmis9/nmis-mcp.pl \
-H "X-API-Token: YOUR_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"nmis_list_nodes","arguments":{}}}'nmis_get_node_status
获取特定节点的详细状态和健康指标。
参数: node (必填)
退货: {node, sysName, sysDescr, nodeType, nodeModel, group, host, nodedown, snmpdown, sysUpTime, health}
这 health 对象包含来自健康子概念(可达性、可用性、响应时间等)的OTel重命名度量。
curl -s -X POST http://localhost/cgi-nmis9/nmis-mcp.pl \
-H "X-API-Token: YOUR_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"nmis_get_node_status","arguments":{"node":"myrouter"}}}'nmis_get_最新消息
获取节点和库存概念的最新收集指标。
参数: node (必填), concept (必填)
概念: catchall, interface, device, Host_Storage, diskIOTable, env-temp, service, ping
退货: 具有OTel重命名度量的实例数组。对于 catchall 和 ping,结果按子概念(健康、tcp、laload、mib2ip、systemStats、Host_health)划分。对于其他概念,每个库存实例都是一个单独的条目。
curl -s -X POST http://localhost/cgi-nmis9/nmis-mcp.pl \
-H "X-API-Token: YOUR_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"nmis_get_latest_metrics","arguments":{"node":"myrouter","concept":"interface"}}}'nmis_list_事件
列出活动(非历史)NMIS事件和警报。
参数: node (可选,按节点名称筛选)
退货: 数组 {node, event, level, element, details, startdate, ack, escalate}
curl -s -X POST http://localhost/cgi-nmis9/nmis-mcp.pl \
-H "X-API-Token: YOUR_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"nmis_list_events","arguments":{}}}'nmis_list_库存
列出节点和概念的库存实例,显示索引、描述和可用数据字段。有助于在获取指标之前发现存在哪些实例。
参数: node (必填), concept (必填)
退货: 数组 {index, description, data_fields}
curl -s -X POST http://localhost/cgi-nmis9/nmis-mcp.pl \
-H "X-API-Token: YOUR_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"nmis_list_inventory","arguments":{"node":"myrouter","concept":"Host_Storage"}}}'nmis_get_node_pecise_status
获取节点的精确可达性状态,包括每协议(SNMP、WMI、ping)状态、故障转移状态、正常运行时间和可达性指标。使用 NMISNG::Node::precise_status() 方法。
参数: node (可选), group (可选)。所有节点都省略这两个。
退货: 数组 {node, group, host, overall, overall_status, snmp_enabled, snmp_status, wmi_enabled, wmi_status, ping_enabled, ping_status, failover_status, failover_ping_status, primary_ping_status, uptime_seconds, reachability, availability}
这 overall_status 字段是人类可读的标签: reachable, degraded,或 unreachable.
# All nodes
curl -s -X POST http://localhost/cgi-nmis9/nmis-mcp.pl \
-H "X-API-Token: YOUR_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"nmis_get_node_precise_status","arguments":{}}}'
# Single node
curl -s -X POST http://localhost/cgi-nmis9/nmis-mcp.pl \
-H "X-API-Token: YOUR_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"nmis_get_node_precise_status","arguments":{"node":"myrouter"}}}'
# By group
curl -s -X POST http://localhost/cgi-nmis9/nmis-mcp.pl \
-H "X-API-Token: YOUR_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"nmis_get_node_precise_status","arguments":{"group":"Core"}}}'这是我们酒店的地盘。
度量从NMIS本机名称重命名为受OpenTetry启发的语义约定。具有已知映射的字段将获得标准名称;未知字段前缀为 nmis..以结尾的字段 _raw 被过滤掉。
接口指标
| NMIS字段 | OTel名称 |
|---|---|
ifInOctets | system.network.io.receive |
ifOutOctets | system.network.io.transmit |
ifInUcastPkts | system.network.packets.receive |
ifOutUcastPkts | system.network.packets.transmit |
ifInErrors | system.network.errors.receive |
ifOutErrors | system.network.errors.transmit |
ifInDiscards | system.network.dropped.receive |
ifOutDiscards | system.network.dropped.transmit |
健康指标
| NMIS字段 | OTel名称 |
|---|---|
reachability | nmis.node.reachability |
availability | nmis.node.availability |
health | nmis.node.health |
responsetime | nmis.node.response_time_ms |
loss | nmis.node.packet_loss |
系统统计信息
| NMIS字段 | OTel名称 |
|---|---|
ssCpuRawUser | system.cpu.time.user |
ssCpuRawSystem | system.cpu.time.system |
ssCpuRawIdle | system.cpu.time.idle |
ssIORawSent | system.disk.io.sent |
ssIORawReceived | system.disk.io.received |
ssRawInterrupts | system.cpu.interrupts |
ssRawContexts | system.cpu.context_switches |
平均负载
| NMIS字段 | OTel名称 |
|---|---|
laLoad1 | system.cpu.load_average.1m |
laLoad5 | system.cpu.load_average.5m |
传输控制协议
| NMIS字段 | OTel名称 |
|---|---|
tcpCurrEstab | system.network.tcp.connections.established |
tcpActiveOpens | system.network.tcp.connections.opened.active |
tcpPassiveOpens | system.network.tcp.connections.opened.passive |
tcpInSegs | system.network.tcp.segments.received |
tcpOutSegs | system.network.tcp.segments.sent |
tcpRetransSegs | system.network.tcp.segments.retransmitted |
拼
| NMIS字段 | OTel名称 |
|---|---|
avg_ping_time | network.peer.rtt.avg_ms |
max_ping_time | network.peer.rtt.max_ms |
min_ping_time | network.peer.rtt.min_ms |
ping_loss | network.peer.packet_loss |
JSON-RPC 2.0协议
服务器通过无状态HTTP POST实现了MCP的一个子集:
| 方法 | 目的 |
|---|---|
initialize | 协议握手,返回服务器信息和功能 |
notifications/initialized | 客户端确认(无响应) |
tools/list | 使用JSON模式返回可用工具的列表 |
tools/call | 按名称和参数执行工具 |
错误代码
| 代码 | 含义 |
|---|---|
-32700 | 解析错误(JSON无效) |
-32600 | 无效请求(不是JSON-RPC 2.0) |
-32601 | 未找到方法 |
-32602 | 参数无效(未知工具名称) |
-32000 | 需要身份验证 |
-32603 | 内部错误(NMIS配置加载失败) |
刀具级别错误返回为 isError: true 在 tools/call 结果,而不是JSON-RPC错误。
运行测试
perl contrib/nmis-mcp/t_nmis-mcp.pl测试套件(82个测试)包括:
_get_description所有概念的现场映射_apply_field_renameOTel命名和_raw过滤_filter_derived前缀过滤(08\_,16\_)_filter_derived_flat跨亚脑区变平%CONCEPT_RENAME映射- JSON-RPC 2.0请求验证
- 刀具定义结构和所需参数
%FIELD_RENAME地图覆盖率
需求
- NMIS9与工作CGI(Apache服务
/cgi-nmis9/) - Perl模块:
CGI,JSON::XS(两个标准NMIS9依赖项) - 无需额外的CPAN模块
许可证
此项目根据GNU通用公共许可证v3.0获得许可。请参阅 许可证 文件以获取详细信息。
______________________________________________________________________
建于 克劳德代码
