✨🤖 Cisco RADKit MCP Server
A stand-alone MCP server built with FastMCP that exposes key functionalities of the Cisco RADKit SDK as MCP tools. It is designed to be connected to any MCP client and LLM of your choice, enabling intelligent interaction with network devices through Cisco RADKit.
免责声明:此MCP服务器不是思科官方产品。它是为实验和学习目的而开发的。
______________________________________________________________________
目录
- 选项1:本地证书(开发) - 选项2:环境变量(容器) - 选项3:直接RPC
______________________________________________________________________
🚀 概述
此MCP服务器充当 思科RADKit 服务和A MCP兼容客户端它允许LLM检查RADKit清单中已登录的设备并与之交互,获取设备属性,并执行CLI命令——所有这些都是通过结构化的MCP工具完成的。
⚙️ 特性
- 🔌 即插即用 --适用于任何兼容MCP的客户端。
- 🔍 库存发现 --列出所有已登录的网络设备。
- 🧠 设备自检 --获取设备属性和功能。
- 🖥️ 命令执行 --在具有超时和截断控制的网络设备上运行CLI命令。
- 📦 完全键入提示工具 为了清晰和可扩展性。
🧩 需求
- Python 3.12+
- 主动思科RADKit服务(安装指南)
uvPython包管理器- RADKit服务中至少有一个只读或读写用户登录
Python依赖关系 (固定 pyproject.toml):
| 包 | 版本 |
|---|---|
cisco_radkit_client | 1.9.6 |
cisco_radkit_common | 1.9.6 |
cisco_radkit_service | 1.9.6 |
fastmcp | 2.13.1 |
🧰 可用的MCP工具
| 工具 | 描述 | 返回 | |
|---|---|---|---|
get_device_inventory_names() | 返回RADKit资源清册中所有设备的名称。 | str | |
get_device_attributes(target_device) | 返回特定设备的详细JSON属性(名称、主机、类型、SNMP/NETCONF状态、功能等)。 | str (JSON) | |
exec_cli_commands_in_device(target_device, cli_commands, timeout?, max_lines?, service_serial?) | 在设备上执行一个或多个CLI命令。返回原始字符串输出。 | str | |
snmp_get(device_name, oid, service_serial?, timeout?) | 对设备上的一个或多个OID执行SNMP GET。 | list[dict] | |
exec_command(device_name, command, service_serial?, timeout?, max_lines?) | 执行命令并返回结构化输出(状态、截断信息)。 | `dict\ | list[dict]` |
- 从...开始
get_device_inventory_names()以发现可用设备。 - 使用
get_device_attributes()在运行命令之前检查设备。 - 使用
exec_cli_commands_in_device()用于原始CLI输出;使用exec_command()当需要结构化响应元数据时。 - 使用
snmp_get()无需CLI访问即可轮询指标或检索MIB值。
🚗 可用的运输选项
| 模式 | 描述 |
|---|---|
stdio | 标准I/O——用于本地客户端(Claude Desktop等) |
sse | 服务器通过HTTP发送事件——适用于多个网络客户端 |
http | HTTP——用于HTTP环境 |
🛠️ 安装
克隆存储库并创建本地虚拟环境:
git clone https://github.com/ponchotitlan/radkit-mcp-server.git
cd radkit-mcp-server
uv sync --extra onboarding对于Docker、Docker Compose或Kubernetes部署,请参阅 容器部署.
🔐 认证
服务器支持三种身份验证方法,按以下优先级顺序进行评估:
- 直接RPC --如果
RADKIT_DIRECT_HOST和RADKIT_DIRECT_TOKEN设置。 - 环境变量 --如果
RADKIT_CERT_B64已设置。 - 本地证书文件 --从
~/.radkit/identities/.
______________________________________________________________________
选项1:本地证书(建议用于开发)
使用交互式入职脚本生成证书和 .env 文件:
uv run python radkit_onboarding.py步骤1——生成证书
选择选项 1 并完成基于浏览器的身份验证流程。系统将要求您为私钥设置密码。
? Choose an option: 1. 👾 Onboard user to non-interactive Cisco RADKit authentication
? Enter Cisco RADKit username: ponchotitlan@cisco.com
A browser window was opened to continue the authentication process.
Authentication result received.
New private key password: ***********
Confirm: ***********重要提示: 保存此密码短语——您将在步骤2中需要它。
步骤2——生成.env文件
选择选项 2 并提供所需的详细信息:
? Choose an option: 2. 📚 Generate .env file for Cisco RADKit MCP server
? Enter Cisco RADKit username: ponchotitlan@cisco.com
? Enter Cisco RADKit service code: aaaa-bbbb-cccc
? Enter non-interactive authentication password: ***********
? Select MCP transport mode: stdio如果您选择 http 或 sse,系统还将提示您输入主机和端口:
? Select MCP transport mode: http
? Enter MCP host: 0.0.0.0
? Enter MCP port: 8000这 .env 文件保存在项目根目录中。服务器自动检测来自的证书 ~/.radkit/identities/ --不需要额外的配置。
✅ 您的MCP服务器已准备好运行。
______________________________________________________________________
选项2:环境变量(建议用于容器)
将此方法用于Docker、Kubernetes或任何没有本地文件访问权限的环境。
生成 .env 从现有的本地证书中创建文件:
python scripts/build_env.py此脚本从以下位置读取您的RADKit证书 ~/.radkit/identities/,Base64对它们进行编码,并写入 .env 包含以下变量的文件:
RADKIT_IDENTITY=user@cisco.com
RADKIT_DEFAULT_SERVICE_SERIAL=service-serial
RADKIT_CERT_B64=
RADKIT_KEY_B64=
RADKIT_CA_B64=
RADKIT_KEY_PASSWORD_B64=______________________________________________________________________
选项3:直接RPC
通过本地网络直接连接到RADKit服务器,无需基于云的身份验证。非常适合内部部署或气隙部署。
步骤1 --登录您的RADKit Web UI,并为您的用户帐户复制E2EE验证令牌。
步骤2 --将以下内容添加到您的 .env 文件:
RADKIT_IDENTITY=user@example.com
RADKIT_DIRECT_HOST=192.168.1.100 # IP or hostname of your RADKit server
RADKIT_DIRECT_TOKEN=your-e2ee-token # E2EE validation token from the Web UI
# RADKIT_DIRECT_PORT=8181 # Optional, default is 8181
MCP_TRANSPORT=sse # or stdio / http
MCP_HOST=0.0.0.0
MCP_PORT=8000RADKIT_DEFAULT_SERVICE_SERIAL 是 不 在直接RPC模式下需要。步骤3 --启动服务器。成功连接后,您将看到:
Using authentication mode: direct_rpc
Connecting directly to RADKit server at 192.168.1.100:8181...
✓ Connected directly to RADKit server at 192.168.1.100:8181🚀 运行服务器
方法1:直接使用Python
python mcp_server.py方法2:FastMCP开发模式(文件更改时自动重新加载)
fastmcp dev src/radkit_mcp/server.py方法3:FastMCP运行
# STDIO (for local clients like Claude Desktop)
fastmcp run src/radkit_mcp/server.py
# SSE (for network access)
fastmcp run src/radkit_mcp/server.py --transport sse --port 8000
# HTTPS (secure network access)
fastmcp run src/radkit_mcp/server.py --transport https --port 8000方法4:Python模块
python -m radkit_mcp.server🐳 容器部署
Dockerfile示例
FROM python:3.12-slim
WORKDIR /app
# Install dependencies from the default public index.
RUN pip install --no-cache-dir \
fastmcp==2.13.1 \
python-dotenv>=1.0.0 \
pydantic-settings>=2.0.0
# Install RADKit dependencies using RADKit index in addition to PyPI.
RUN pip install --no-cache-dir --extra-index-url https://radkit.cisco.com/pip \
cisco-radkit-client==1.9.6 \
cisco-radkit-common==1.9.6 \
cisco-radkit-service==1.9.6
# Copy application code.
COPY src ./src
# Run server
CMD ["python", "-m", "radkit_mcp.server"]Docker编写示例
services:
radkit-mcp:
build: .
environment:
- RADKIT_IDENTITY=user@cisco.com
- RADKIT_DEFAULT_SERVICE_SERIAL=service-serial
- RADKIT_CERT_B64=${RADKIT_CERT_B64}
- RADKIT_KEY_B64=${RADKIT_KEY_B64}
- RADKIT_CA_B64=${RADKIT_CA_B64}
- RADKIT_KEY_PASSWORD_B64=${RADKIT_KEY_PASSWORD_B64}
- MCP_TRANSPORT=sse
- MCP_HOST=0.0.0.0
- MCP_PORT=8000
ports:
- "8000:8000"Kubernetes部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: radkit-mcp-server
spec:
replicas: 1
selector:
matchLabels:
app: radkit-mcp
template:
metadata:
labels:
app: radkit-mcp
spec:
containers:
- name: radkit-mcp
image: your-registry/radkit-mcp:2.0
env:
- name: RADKIT_IDENTITY
value: "user@cisco.com"
- name: RADKIT_DEFAULT_SERVICE_SERIAL
value: "service-serial"
- name: RADKIT_CERT_B64
valueFrom:
secretKeyRef:
name: radkit-certs
key: certificate
- name: RADKIT_KEY_B64
valueFrom:
secretKeyRef:
name: radkit-certs
key: private-key
# ... other env vars from secret🔌 直接RPC连接
除了标准的基于云的连接外,此服务器还支持通过网络直接连接到RADKit服务器,使用 直接RPC这非常适合于云连接不可用或不需要的本地部署或气隙环境。
何时使用Direct RPC: 当您的RADKit服务器可以通过本地网络访问,并且您希望完全避免基于云的证书身份验证时,请选择此方法。
服务器不通过Cisco RADKit云,而是使用从RADKit Web UI获得的E2EE验证令牌直接连接到RADKit服务器的IP地址或主机名。不需要证书。
当 RADKIT_DIRECT_HOST 和 RADKIT_DIRECT_TOKEN 如果两者都已设置,则直接RPC模式将自动激活,并优先于所有其他身份验证方法。
步骤1:获取您的E2EE验证令牌
登录您的RADKit Web UI,并为您的用户帐户复制E2EE验证令牌。此令牌充当直接RPC连接的密码。
步骤2:设置环境变量
将以下变量添加到您的 .env 文件:
# Your RADKit username (email)
RADKIT_IDENTITY=user@example.com
# IP address or hostname of your RADKit server
RADKIT_DIRECT_HOST=192.168.1.100
# E2EE validation token from the RADKit Web UI
RADKIT_DIRECT_TOKEN=your-e2ee-validation-token
# Optional: port to connect to (default is 8181)
# RADKIT_DIRECT_PORT=8181
# Your MCP server details
MCP_TRANSPORT=sse|stdio|http
MCP_HOST=0.0.0.0
MCP_PORT=8000注: RADKIT_DEFAULT_SERVICE_SERIAL 是 不 使用直接RPC模式时需要。步骤3:运行服务器
使用任何支持的方法正常启动服务器:
python mcp_server.py当Direct RPC模式处于活动状态时,服务器将在启动时记录以下内容:
Using authentication mode: direct_rpc
Connecting directly to RADKit server at 192.168.1.100:8181...
✓ Connected directly to RADKit server at 192.168.1.100:8181Docker Compose
要在Docker部署中使用Direct RPC,请在您的 docker-compose.yml:
services:
radkit-mcp:
build: .
environment:
- RADKIT_IDENTITY=user@example.com
- RADKIT_DIRECT_HOST=192.168.1.100
- RADKIT_DIRECT_PORT=8181
- RADKIT_DIRECT_TOKEN=your-e2ee-validation-token
- MCP_TRANSPORT=sse
- MCP_HOST=0.0.0.0
- MCP_PORT=8000
ports:
- "8000:8000"
- "8081:8081"
networks:
- radkit-net
networks:
radkit-net:
driver: bridge🧪 测试
全面的测试套件,覆盖率超过95%!
运行所有测试
.venv/bin/pytest tests/ -v运行特定测试套件
# Integration tests (RADKit API)
.venv/bin/pytest tests/test_integration.py -v
# MCP protocol tests
.venv/bin/pytest tests/test_mcp_client.py -v测试覆盖率报告
.venv/bin/pytest tests/ --cov=src/radkit_mcp --cov-report=html⚡️ 使用示例:Claude Desktop
Claude Desktop应用程序提供了一个集成了Claude LLM和与此MCP服务器兼容的丰富MCP客户端的环境。
要开始,请下载 Claude桌面应用程序 对于您的主机操作系统,请选择最适合您需求的LLM使用计划。
之后,编辑 radkit-mcp服务器/claude_desktop_config json 此存储库中包含的文件指向 绝对路径 你的 _.venv_ 和 _mcp_server.py_ 文件夹:
{
"mcpServers": {
"radkit-mcp-server": {
"command": "/Users/ponchotitlan/Documents/radkit-mcp-server-community/.venv/bin/python",
"args": [
"/Users/ponchotitlan/Documents/radkit-mcp-server-community/mcp_server.py"
],
"description": "Cisco RADKit MCP Server - Community"
}
}
}然后,将此文件复制到Claude Desktop应用程序配置的位置。目录因主机操作系统而异:
🍎 MacOS:
cp claude_desktop_config.json ~/Library/Application\ Support/Claude 🪟 窗户:
cp claude_desktop_config.json %APPDATA%\Claude\🐧 Linux:
cp claude_desktop_config.json ~/.config/Claude/现在,重新启动您的Claude Desktop应用程序。之后,如果您导航到 配置/开发人员/,您应该看到MCP服务器已启动并正在运行:
✨ 提示示例
📚 显示Cisco RADKit服务的清单
MCP服务器工具之一提供设备名称列表。
🎰 询问有关设备的具体问题
另一个MCP服务器工具提供设备的信息(如果可以直接在Cisco RADKit SDK中获得)。
否则,通过MCP服务器工具在设备中执行命令以获取所需信息。
🗺️ 使用网络数据进行复杂查询
LLM可以使用来自多个数据网络查询的信息来构建例如拓扑图。
稍后可以根据需要使用来自网络的更多信息来细化此图。
⬇️ 推送配置
并非所有信息都是查询信息! 如果MCP服务器中登录的Cisco RADKit用户启用了写权限,可以进行提交操作。
这些只是使用此MCP服务器可以完成的一些示例!
______________________________________________________________________
