内容
# MDS MCP 服务器
一款轻量级的 [FastMCP](https://github.com/jlowin/fastmcp) 服务器,暴露 **只读** 的 Cisco MDS NX-OS `show` 命令作为 [模型上下文协议](https://modelcontextprotocol.io) 工具。指向一个或多个 MDS 交换机,让 LLM 客户端(VS Code、Claude、LangChain 代理等)以纯语言检查您的 SAN 结构。
- **只读和安全** — 每个工具都映射到 NX-API(JSON-RPC)上的 `show` 命令。
- **多交换机** — 注册任意多个交换机;客户端每次调用选择一个。
- **两种传输方式** — `stdio`(每个客户端一个进程)或 `http`(一个共享服务器)。
- **61 种工具**,涵盖区域划分、设备别名、FLOGI/FCNS、VSAN、接口、收发器、计数器、环境、日志和库存。
## 要求
- Python **3.13+**
- [`uv`](https://docs.astral.sh/uv/)
- Cisco MDS 交换机(交换机)启用 **NX-API** (`feature nxapi`)
## 配置
交换机通过 **索引环境变量** 声明。添加更多交换机时重复此块(允许有空隙):
| 变量 | 必需 | 默认值 | 描述 |
|---|---|---|---|
| `MCP_TRANSPORT` | | `http` | `stdio` 或 `http` |
| `MCP_HOST` | | `0.0.0.0` | HTTP 绑定地址 |
| `MCP_PORT` | | `8000` | HTTP 绑定端口 |
| `MDS_<N>_HOST` | ✅ | - | 交换机 IP 或主机名 |
| `MDS_<N>_USERNAME` | ✅ | - | NX-API 用户名 |
| `MDS_<N>_PASSWORD` | ✅ | - | NX-API 密码 |
| `MDS_<N>_NAME` | | 主机名 | `switch` 参数使用的友好名称 |
| `MDS_<N>_PORT` | | `8443` | NX-API HTTPS 端口 |
| `MDS_<N>_VERIFY_SSL` | | `false` | 验证 TLS 证书 |
```dotenv
MDS_1_NAME=mds-fab-a
MDS_1_HOST=192.0.2.10
MDS_1_USERNAME=admin
MDS_1_PASSWORD=secret
MDS_2_NAME=mds-fab-b
MDS_2_HOST=192.0.2.11
MDS_2_USERNAME=admin
MDS_2_PASSWORD=secret
```
复制 [.env.example](.env.example) 到 `.env` 并填写。服务器启动时读取此 `.env` 文件,因此您不必手动导出变量。在实际环境(shell、Docker 或 MCP 客户端的 `env` 块)中设置的变量优先于 `.env`。
## 运行
安装依赖项后,启动服务器:
```bash
uv sync # 创建虚拟环境并安装依赖项
uv run python main.py # 启动服务器(默认为 http://localhost:8000/mcp)
```
要使用 stdio 而不是 HTTP,请设置 `MCP_TRANSPORT=stdio` — 在 `.env` 中(`MCP_TRANSPORT=stdio`)或为单个运行内联:
```bash
MCP_TRANSPORT=stdio uv run python main.py
```
### Docker / Podman
构建镜像,然后使用您的 `.env` 提供交换机凭证运行它。下面命令使用 `docker`;如果您更喜欢,可以替换为 `podman`(语法相同):
```bash
docker build -t mds-mcp .
docker run --rm -p 8000:8000 --env-file .env mds-mcp # HTTP on http://localhost:8000/mcp
```
## 从客户端使用(Visual Studio Code)
此处以 **Visual Studio Code** 为例,但任何支持 MCP 的 LLM 客户端的工作方式都差不多。
您在 `mcp.json` 文件中注册服务器:`.vscode/mcp.json` 仅适用于此工作区,或您的 **用户** `mcp.json`(命令面板 → *MCP: 打开用户配置*)以在任何地方使用。选择以下两个选项之一,将其粘贴到该文件,然后打开命令面板 → *MCP: 列出服务器* → `cisco-mds` → **启动**。
### 选项 A — HTTP
您自己运行服务器;VS Code 只需连接到它。
1. 在 `.env` 中配置您的交换机(参见 [配置](#配置))。
2. 启动服务器:`uv run python main.py`。
3. 将以下内容添加到 `mcp.json`:
```json
{
"servers": {
"cisco-mds": { "type": "http", "url": "http://localhost:8000/mcp" }
}
}
```
### 选项 B — stdio
VS Code 为您启动进程。设置 `cwd` 到您克隆存储库的位置,以便服务器找到您的 `.env`。下面的 `env` 块是可选的 — 仅当您没有 `.env` 文件时使用它来设置或覆盖变量(请记住它优先于 `.env`):
```json
{
"servers": {
"cisco-mds": {
"type": "stdio",
"command": "uv",
"args": ["run", "python", "main.py"],
"cwd": "/path/to/mds-mcp",
"env": {
"MCP_TRANSPORT": "stdio",
"MDS_1_HOST": "192.0.2.10",
"MDS_1_USERNAME": "admin",
"MDS_1_PASSWORD": "secret"
}
}
}
}
```
启动后,打开 Copilot Chat,`cisco-mds` 工具对模型可用。
## 用法
用纯语言询问模型关于您的 SAN 结构的问题。示例:
- "列出已配置的交换机及其软件版本。"
- "VSAN 20 上哪些区域处于活动状态?"
- "显示两个交换机上的 FLOGI 数据库。"
- "列出所有设备别名,并告诉我哪些设备当前未登录。"
- "将 pwwn `50:00:00:00:00:00:00:01` 解析为设备别名并显示其 FCNS 条目。"
- "mds-fab-b 上是否有任何接口出现 CRC 错误或链路故障?"
- "比较所有 fc 接口的收发器 Rx/Tx 功率,并标记低于 -7 dBm 的任何功率。"
- "哪些端口是端口通道 220 的成员,其协商速度是多少?"
- "显示接口 fc1/3 的流量计数器 — 其发送和接收量是多少?"
- "哪些接口在 mds-fab-a 上看到最多的 txwait 或丢弃帧?"
- "汇总两个结构上的 VSAN 成员资格。"
- "检查环境和模块状态 — 有任何故障的风扇、电源或模块吗?"
## 工具目录
所有工具均为只读。
| 区域 | 工具 |
|---|---|
| 发现 | `list_switches` |
| 分区 | `show_zone`, `show_zone_active`, `show_zoneset_active_vsan`, `show_zone_name`, `show_zone_vsan`, `show_zone_name_vsan`, `show_zone_status`, `show_zoneset`, `show_zoneset_active`, `show_zoneset_name`, `show_zoneset_vsan`, `show_zoneset_name_vsan` |
| 设备别名 | `show_device_alias_database`, `show_device_alias_name`, `show_device_alias_pwwn` |
| 名称服务器 / 登录 | `show_flogi_database`, `show_flogi_database_for`, `show_flogi_database_vsan`, `show_fcns_database`, `show_fcns_database_vsan`, `show_fcns_database_detail` |
| VSAN | `show_vsan`, `show_vsan_id`, `show_vsan_usage`, `show_vsan_membership`, `show_vsan_membership_for` |
| 接口 | `show_interface_brief`, `show_interface_brief_for`, `show_interface_for`, `show_interface_description`, `show_interface_description_for`, `show_interface_bbcredit`, `show_interface_bbcredit_for`, `show_interface_transceiver`, `show_interface_transceiver_for`, `show_interface_transceiver_detail`, `show_interface_transceiver_detail_for`, `show_interface_mgmt`, `show_running_config_interface_for` |
| 计数器 | `show_interface_counters`, `show_interface_counters_brief`, `show_interface_counters_for`, `show_interface_counters_brief_for`, `show_interface_counters_detailed_for`, `show_interface_aggregate_counters_for` |
| 端口通道 | `show_port_channel_summary`, `show_port_channel_usage` |
| 系统 / 库存 | `show_version`, `show_hardware`, `show_inventory`, `show_module`, `show_module_uptime`, `show_boot`, `show_switchname`, `show_environment`, `show_cdp_neighbors`, `show_hosts` |
| 操作 | `show_users`, `show_accounting_log`, `show_logging` |