pyATS MCP服务器

MCP服务器,封装了Cisco pyATS和Genie,让AI代理(Claude、LangGraph等)使用JSON-RPC 2.0通过STDIO运行show命令、应用配置和查询网络状态。
所有通信都是通过STDIN/STDOUT进行的——没有HTTP端口,也没有REST端点。
______________________________________________________________________
快速开始
# 1. Clone and install
git clone https://github.com/automateyournetwork/pyATS_MCP
cd pyATS_MCP
pip install -r requirements.txt
# 2. Configure your environment
cp .env.example .env
# Edit .env — see Configuration below
# 3. Run
python3 pyats_mcp_server.py______________________________________________________________________
配置
所有设备详细信息和凭据都存在于 .env file——仓库中没有硬编码。
1.复制模板
cp .env.example .env2.设置服务器变量
PYATS_TESTBED_PATH=/absolute/path/to/your/testbed.yaml
PYATS_MCP_ARTIFACTS_DIR= # default: ~/.pyats-mcp/artifacts
PYATS_MCP_KEEP_ARTIFACTS=1 # 1 = keep, 0 = delete after each run
PYATS_MCP_TESTBED_CACHE_TTL=30 # seconds before testbed reloads from disk
PYATS_MCP_CONN_CACHE_TTL=0 # seconds to keep connections alive (0 = off)
PYATS_MCP_OP_LOG_MAX=500 # max entries in the in-memory operation log3.为每个设备添加一个块
您的每个设备 testbed.yaml 用途 %ENV{VAR} 替换,因此从中读取凭据和连接详细信息 .env 在运行时。
使用 {DEVICENAME}_{FIELD} 命名约定:
# Supported os values: iosxe | iosxr | nxos | ios | eos | junos | panos | linux | windows
# Set os=generic and platform="" to let Unicon autodetect on first connect.
CORE1_IP=10.1.1.1
CORE1_PORT=22
CORE1_OS=iosxe
CORE1_PLATFORM=cat9k
CORE1_USERNAME=admin
CORE1_PASSWORD=s3cr3t
CORE1_ENABLE_PASSWORD=s3cr3t
FW1_IP=10.1.1.2
FW1_PORT=22
FW1_OS=panos
FW1_PLATFORM=
FW1_USERNAME=admin
FW1_PASSWORD=s3cr3t
# (no enable password for Palo Alto)
LINUX1_IP=10.1.1.3
LINUX1_PORT=22
LINUX1_OS=linux
LINUX1_PLATFORM=ubuntu
LINUX1_USERNAME=admin
LINUX1_PASSWORD=s3cr3t
# (no enable password for Linux)如果一组设备共享凭据,您可以定义组级变量并在设备之间引用它们:
SITE_A_USERNAME=netops
SITE_A_PASSWORD=s3cr3t
SITE_A_ENABLE_PASSWORD=s3cr3t4.引用testbed.yaml中的变量
devices:
CORE1:
alias: "Core Switch 1"
type: "switch"
os: "%ENV{CORE1_OS}"
platform: "%ENV{CORE1_PLATFORM}"
credentials:
default:
username: "%ENV{CORE1_USERNAME}"
password: "%ENV{CORE1_PASSWORD}"
enable:
password: "%ENV{CORE1_ENABLE_PASSWORD}"
connections:
cli:
protocol: ssh
ip: "%ENV{CORE1_IP}"
port: "%ENV{CORE1_PORT}"
arguments:
connection_timeout: 360对于操作系统未知的设备,设置os: "%ENV{DEVICE_OS}"和DEVICE_OS=generic在.env并可选择添加learn_os: true在...之下arguments:--Unicon将检测并缓存操作系统 在第一次连接之后。
______________________________________________________________________
码头工人
构建
docker build -t pyats-mcp-server .运行(直接传递.env)
docker run -i --rm \
--env-file /absolute/path/to/.env \
-v /absolute/path/to/testbed.yaml:/app/testbed.yaml \
pyats-mcp-serverMCP客户端配置(Docker)
{
"mcpServers": {
"pyats": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"--env-file", "/absolute/path/to/.env",
"-v", "/absolute/path/to/testbed.yaml:/app/testbed.yaml",
"pyats-mcp-server"
]
}
}
}MCP客户端配置(本地Python)
{
"mcpServers": {
"pyats": {
"command": "python3",
"args": ["-u", "/path/to/pyats_mcp_server.py"],
"env": {
"PYATS_TESTBED_PATH": "/absolute/path/to/testbed.yaml"
}
}
}
}______________________________________________________________________
可用工具
| 工具 | 说明 |
|---|---|
pyats_list_devices | 列出试验台上的所有设备 |
pyats_search_devices | 按名称或别名进行模糊搜索的设备 |
pyats_run_show_command | 运行一个经过验证的show命令;返回解析的JSON或原始输出 |
pyats_run_show_command_on_multiple_devices | 在多个设备上同时运行show命令 |
pyats_ping_from_network_device | 从网络设备执行ping |
pyats_run_linux_command | 在Linux主机上运行命令 |
pyats_configure_device | 使用安全护栏应用配置命令 |
pyats_configure_devices_multi | 同时在多个设备上应用配置 |
pyats_configure_with_diff | 应用config并返回一个before/after diff |
pyats_rollback_config | 回滚到上次保存的配置快照 |
pyats_device_health | 快照CPU、内存、接口和路由状态 |
pyats_get_neighbors | 检索CDP/LDP邻居 |
pyats_find_interface_by_ip | 查找哪个接口拥有给定的IP地址 |
pyats_run_dynamic_test | 执行沙盒pyATS测试脚本 |
pyats_get_operation_log | 检索内存中的操作日志 |
______________________________________________________________________
安全
- 显示命令已验证——管道、重定向和危险关键字已被阻止
- 检查配置更改
reload,erase,write erase,delete,format - 动态测试脚本在受限沙盒中运行(禁止导入:
os,sys,subprocess等等) - 所有凭证均来自
.env--从未存储在testbed文件或源代码中
______________________________________________________________________
项目结构
.
├── pyats_mcp_server.py # MCP server
├── test_pyats_mcp_server.py # Unit tests (85 tests)
├── Dockerfile # Container definition
├── requirements.txt # Pinned runtime dependencies
├── requirements-dev.txt # Dev/test dependencies
├── pyproject.toml # Tool config (black, isort, pytest, mypy)
├── .env.example # Configuration template — copy to .env
├── .gitignore
├── LICENSE
└── CONTRIBUTING.md______________________________________________________________________
发展
# Install dev dependencies with uv
uv venv .venv && uv pip install -r requirements-dev.txt
# Run tests
.venv/bin/python -m pytest
# Lint and format
.venv/bin/black .
.venv/bin/isort .
.venv/bin/flake8 . --max-line-length=100