NMIS9 MCP服务器

NMIS9 MCP服务器是一个基于Perl CGI脚本实现的模型上下文协议服务器,用于向AI助手提供NMIS监控数据。

  • by kcsinclair
  • Perl
  • 本地部署
  • 更新于
在 GitHub 查看 kcsinclair/nmis-mcp

使用说明

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.nmis

CGI脚本由Apache提供 /cgi-nmis9/nmis-mcp.pl 使用现有的NMIS CGI配置。

认证

服务器支持三种身份验证方法:

方法 标题/参数 注释
自定义标题 X-API-Token: <token> 推荐。Apache通行证 X-* CGI的头部。
持有者代币 Authorization: Bearer <token> 标准,但要求 CGIPassAuth On 在Apache。
查询参数 ?token=<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节点的事件状态

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_rename OTel命名和 _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获得许可。请参阅 许可证 文件以获取详细信息。


建于 克劳德代码