pnetlab-mcp-server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@pnetlab-mcp-serverCreate a network with two routers and a switch, then start all nodes"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
pnetlab-mcp-server
一个 MCP 服务器,让 Claude(以及其他 LLM Agent)可以通过自然语言程序化控制 PNETLab v6 网络实验环境 -- 创建拓扑、 添加节点、连线、推送配置、启动节点并读取状态、驱动设备控制台、注入链路故障。
它复刻了 axiom-works-ai/eveng-mcp-server
的工具集,但对接的是 PNETLab v6 的会话级 API,而不是 v6 已经移除的经典
EVE-NG API。
⚠️ 生成与测试说明
本项目代码完全由 AI 生成。基础功能已经过实际测试,但未做全面覆盖测试。建议在正式使用前让 Agent 自行针对你的 PNETLab 环境跑一轮验证。
为什么需要它
PNETLab v6(6.0.0+)是一次 Laravel 重写,保留了旧 EVE-NG 引擎(仍在 /api/
下),但是:
删除了经典登录(
/api/auth/login)、/api/status、/api/labs/、/api/folders/、/api/users/。把实验操作迁移到会话级 API:
/api/labs/session/*。替换了登录方式,改为 Laravel 端点:
POST /store/public/auth/login/login。
所以 eveng-mcp-server(走经典 API)在 v6 上无法工作。本服务器是针对
PNETLab 6.0.0-100 逆向工程并实际验证过的。
Related MCP server: nornir-mcp-server
安装
pip install -e .安装后提供 pnetlab-mcp-server 命令。
配置
设置环境变量(服务器在第一次调用工具时才会懒加载登录):
变量 | 示例 | 用途 |
|
| PNETLab v6 地址 |
|
| Agent 使用的工作账号(请用专用账号) |
|
| 工作账号密码 |
|
| (可选)在浏览器里查看的账号 |
|
| 查看账号密码 |
为什么要专用工作账号? v6 每个用户账号只能有一个活跃的实验会话。如果
Agent 和你的浏览器都用 admin,open_lab 会报 20039 "sandbox already exists"。给 Agent 一个独立账号(例如 mcp,admin 角色),你的浏览器就自由了。
在浏览器里实时查看。 当设置了 PNETLAB_VIEWER_* 时,open_lab 会自动把
查看账号加入 Agent 的实验会话 -- 于是两者共享同一个实时拓扑。Agent 打开实验
后,只要用查看账号登录 PNETLab 网页 UI 并打开该实验(或访问
/legacy/topology):你就能看到 Agent 的拓扑,刷新即可看到它的改动。
join_viewer 用于在你先打开了浏览器时重新加入;close_lab 也会让查看账号退出。
Claude Code(.claude.json)
{
"mcpServers": {
"pnetlab": {
"command": "pnetlab-mcp-server",
"env": {
"PNETLAB_HOST": "http://192.168.231.128",
"PNETLAB_USERNAME": "mcp",
"PNETLAB_PASSWORD": "pnet",
"PNETLAB_VIEWER_USERNAME": "admin",
"PNETLAB_VIEWER_PASSWORD": "pnet"
}
}
}
}添加后重启 Claude Code。
工具
列表与模板
工具 | 作用 |
| 列出已安装节点模板,结构化返回 |
| 列出某模板可用磁盘镜像(如 |
| 取模板完整可编辑选项(镜像、qemu 版本、各字段默认值) |
| 列出网络类型(bridge、pnet0..9、ovs) |
实验会话
工具 | 作用 |
| 按文件名打开实验,如 |
| 离开当前实验会话(同时让查看账号退出) |
| (重新)把查看账号加入 Agent 的会话,以便在浏览器里查看 |
| 信息 + 完整拓扑 + 节点状态。 |
| 每个节点的运行状态(0=已停止、1=启动中、2=运行中) |
节点
工具 | 作用 |
| 添加节点。默认自动套用模板自带默认值(image/ram/cpu/qemu_*/console/config_script),与 GUI 建的节点一致;只需 |
| 修改已有节点字段(镜像、内存、qemu_* 等)。改 image/ram 下次启动生效 |
| 两接口点对点链路。精简返回 |
| 启动节点(不传 id 启动全部)。 |
| 停止节点(不传 id 停止全部) |
| 删除节点(需先停止) |
| 推送启动配置(下次启动生效) |
| 取控制台 host:port。实际下发命令请用下面的控制台工具 |
链路与故障注入
工具 | 作用 |
| 删除链路(断开两端接口) |
| 链路 Up/Down(接口 suspend,等同拔线;仅对运行中节点生效)。状态可从 |
| 注入丢包/延迟/抖动/限速(双向;仅对运行中节点生效) |
控制台交互(免手写 telnet)
工具 | 作用 |
| 高层:自动登录 + 发命令 + 读到提示符返回输出。内置 IAC 协商、ANSI/回显清理。会话复用 |
| 低层:发送原始文本(首次自动登录)。配合 |
| 读取控制台待输出 |
| 关闭一个/全部控制台会话 |
重要注意事项(v6 专属)
每个账号一个会话。 v6 每个账号只能有一个活跃实验会话。Agent 必须用 专用账号(例如
mcp),不能用你浏览时用的账号。配置PNETLAB_VIEWER_*,open_lab会自动把你的浏览账号加入 Agent 的会话 -- 两者共享同一个实时拓扑 (见上文"配置")。所有
/api/labs/session/*调用都用 JSON body。 表单编码的 body 会被 静默丢弃,表现为40000 "missing required fields"。open_lab的 path 没有前导斜杠 -- 是"2pc_1sw.unl",不是"/2pc_1sw.unl"。add_node默认自动套用模板。 建节点时会自动拉取模板自带默认值 (image/ram/cpu/qemu_arch/qemu_nic/qemu_options/qemu_version/console/config_script) 并填入,与 GUI 建的节点完全一致 -- 所以add_node("qemu","mikrotik","R1")就能直接建出可启动、可连控制台的节点,通常无需先list_images。显式传入的 字段覆盖模板默认;template_defaults=false可关闭。想换镜像时再用list_images查可用项,传image=...覆盖。console默认telnet。 PNETLab 通过控制台端口是否在监听来判断节点 "运行中"(状态 2)。console为空时不会起qemu_wrapper_telnet转发器, 端口不监听,于是状态恒为 0、控制台也连不上 -- 看起来像"启动即崩",实际 节点在跑。add_node已默认console="telnet";如需 ssh/winbox/http 等 显式传入即可。open_lab会在服务器上创建/复用一个沙盒文件(labs<name>.unl);沙盒在 首次打开时为空。close_lab释放会话绑定但保留沙盒文件(重新打开没问题)。删除节点前必须先
stop_node。不带 id 的
start_node()/stop_node()会遍历实验的节点 id(API 的 null-id "全部" 路径不可靠)。链路质量/状态在接口层。 v6 的 network 不带 quality 字段;丢包/延迟/ suspend 都是接口级。本服务器的链路工具会自动找到链路两端的接口并下发。 仅对运行中节点生效(数据存库 + 实时下发)。
控制台会话复用。 一个 PNETLab 控制台端口同时只服务一个 telnet 客户端,
run_command/console_send/console_read按节点复用会话;用完调console_close。RouterOS 默认admin/空密码,可在run_command里传username/password覆盖。
架构
LLM agent ──MCP/stdio──► pnetlab-mcp-server ──HTTP/JSON──► PNETLab v6
(本仓库) /store/public/auth/login/login (登录)
/api/labs/session/* (实验操作)
/api/list/templates|networks (列表)
/api/labs/session/interfaces/* (链路质量/状态)
telnet <host>:<console port> (控制台)client.py 是经过验证的 v6 API 客户端(含自实现 telnet 控制台,telnetlib 在
Python 3.13+ 已移除);server.py 把它封装为 MCP 工具。
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityAmaintenanceAn MCP server that allows LLMs to create, configure, validate, and explain Cisco Packet Tracer network topologies. It provides a comprehensive suite of tools for generating deployment scripts, CLI configurations, and automated network troubleshooting.Last updated111MIT
- Flicense-qualityFmaintenanceAn MCP server that integrates Nornir with NAPALM and Netmiko, enabling LLMs to orchestrate multi-vendor network infrastructure through natural language.Last updated2
- AlicenseBqualityDmaintenanceAn MCP server that gives Claude and other LLM agents programmatic access to EVE-NG network labs, enabling creation, configuration, and management of virtual network topologies through natural language.Last updated141Apache 2.0
- AlicenseAqualityBmaintenanceA comprehensive MCP server for network device management via SSH/Telnet. Supports multiple vendors such as Cisco IOS and BDCOM, enabling AI assistants to execute commands and manage routers, switches, and firewalls.Last updated4MIT
Related MCP Connectors
MCP server for Pentest-Tools.com: run scans, manage findings and reports via your preffered LLM.
MCP server for AI dialogue using various LLM models via AceDataCloud
GibsonAI MCP server: manage your databases with natural language
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/raybiko-lab/pnetlab-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server