一个由Nornir和NAPALM驱动的FastMCP服务器,提供网络自动化工具。
该服务器充当桥梁,将Nornir/NAPALM网络操作作为MCP(大规模并发处理)工具公开,使其能够通过兼容的MCP客户端轻松访问。
get_facts,get_interfaces),执行命令(如ping,traceroute),以及设备清单管理(如list_all_hosts)。conf/blacklist.yaml),以防止意外或恶意执行危险命令,例如通过send_command工具执行的reload或erase startup-config。uv进行闪电般的Python依赖管理 ⚡。开始之前,请确保已安装以下内容:
在运行服务器之前,您必须配置您的网络清单和设备凭证:
conf/目录。hosts.yaml:定义您的网络设备,包括其管理IP地址、平台、凭证和组。groups.yaml:定义具有共享属性的设备组。defaults.yaml:设置默认凭证和连接选项。
blacklist.yaml:根据您的安全策略自定义被阻止的命令和模式列表。配置完成后,您可以使用Docker Compose轻松运行服务器:
docker-compose up --build -d
此命令将在Docker容器中启动Nornir MCP服务器,主机机器上的8000端口可以访问它。容器现在使用run.py作为入口点,支持开发和生产模式。
要在本地运行服务器(不使用Docker),使用:
python run.py --dev
或者简单地:
python run.py
这将使用新的入口点逻辑在0.0.0.0:8000上启动服务器。
该项目通过HTTP传输暴露FastMCP。服务器提供了两个有用的端点:
关于传输和客户端设置的注意事项:
/mcp(主要)端点。示例MCP客户端JSON配置(HTTP/streamable-http):
{
"name": "Nornir MCP (HTTP)",
"url": "http://localhost:8000/mcp",
"transport": "http"
}
此服务器支持注册返回消息列表(MCP提示格式)的自定义提示函数。提示允许您预定义MCP客户端或LLM驱动代理可以调用的命名提示。FastMCP API通过@server.prompt()装饰器公开了注册函数的功能。
关键特性:
@server.prompt()注册同步或异步提示函数。name、title和description,使提示在MCP客户端中可发现。如何添加提示(示例):
@server.prompt(name="list-host-names", title="列出主机名", description="从清单返回主机名的简短列表")
def prompt_list_hosts() -> list:
hosts = nr_mgr.list_hosts()
return [{"role": "user", "content": f"可用主机:{', '.join(h['device_name'] for h in hosts)}"}]
异步示例带资源:
@server.prompt()
async def show_topology() -> list:
topo = await server.read_resource("resource://topology")
return [{"role": "user", "content": {"type": "resource", "resource": topo}}]
使用说明:
ListPrompts请求发现它们,并按名称调用它们。安全性:
快速入门——Docker(推荐)
docker-compose up --build -d
这将在容器中启动服务器,默认情况下在8000端口上公开。
快速入门——本地
& .venv\Scripts\Activate.ps1
# 或在Unix系统上:python -m venv .venv; source .venv/bin/activate
pip install -U pip
pip install nornir==3.5.0 nornir-napalm mcp[cli]==1.15.0 sse-starlette
python run.py
或者使用uv(当使用包含的运行器时推荐):
uv run .\run.py
如果您需要更改主机/端口,请在运行run.py时使用--host和--port标志。
资源由服务器提供
resource://inventory/hosts — 返回带有清理字段(名称、主机名、平台、组、数据)的主机JSON数组。敏感键如username、password和secret已被移除。resource://inventory/hosts/{keyword} — 同样的输出,通过关键字(大小写不敏感)过滤,匹配名称、主机名、平台、组名或数据值。resource://inventory/groups — 返回清理过的组映射。resource://topology — 解析resources/topology.json。resource://cisco_ios_commands — 解析resources/cisco_ios_commands.json。如何添加自己的资源
resources.py并添加一个名为resource_<name>的函数(例如,resource_my_tools)。nr_mgr的参数。RESOURCE_MAP添加条目;否则将使用默认URI resource://user/<name>。示例resources.py片段
def resource_my_static():
return {"hello": "world"}
def resource_my_hosts(nr_mgr):
# 返回一个可JSON序列化的主机列表
return nr_mgr.list_hosts()
安全注意事项
resource://inventory/*提供的资源中移除常见的敏感键(如username、password、secret)。贡献
许可证