Netdisco MCP
Netdisco MCP
Полный REST API Netdisco, преобразованный в агентно-ориентированный MCP-сервер
81 инструмент · динамическое обнаружение Swagger · stdio + Streamable HTTP · UX с приоритетом подсказок для агента · аутентификация Bearer
Netdisco MCP превращает живой документ swagger.json Netdisco в полную, доступную для поиска поверхность инструментов MCP. Он не поддерживает хрупкий вручную написанный поднабор конечных точек. При запуске он определяет версию подключенного Netdisco, обновляет Swagger 2.0 до OpenAPI 3, исправляет несовместимости схем, назначает стабильные имена инструментов и публикует каждую поддерживаемую операцию через FastMCP.
Результатом является MCP-сервер, который может отвечать на операционные вопросы, проверять устройства и порты коммутаторов, искать узлы и VLAN, запускать инвентаризационные отчёты и — если это явно разрешено — отправлять или удалять задания Netdisco.
[!IMPORTANT] Живой API является источником истины. Количество инструментов может увеличиваться, когда Netdisco добавляет конечные точки. Каталог в этом README — проверенный снимок Netdisco
2.103000.
Содержание
Зачем существует этот проект
Возможность | Что это означает |
Полное покрытие API | Каждая операция, объявленная подключенным экземпляром Netdisco, становится инструментом MCP. |
Осведомлённость об обновлениях | Перезапуск контейнера перезагружает живую спецификацию и обнаруживает новые конечные точки. |
Подсказки для агента |
|
Обнаружение возможностей |
|
Безопасное исследование | Режим только для чтения удаляет операции POST, PUT, PATCH и DELETE перед генерацией инструментов. |
Защита контекста | Слишком большие ответы обрезаются с чёткой подсказкой сузить запрос. |
Гибкий транспорт | Запуск локально через stdio или удалённо через MCP Streamable HTTP. |
Удалённая аутентификация | Streamable HTTP может требовать токен Bearer, специфичный для развёртывания. |
Укреплённый контейнер | Предоставленный сервис Compose использует файловую систему только для чтения, |
Архитектура
flowchart LR
subgraph Clients["MCP clients"]
ChatGPT["ChatGPT / OpenAI"]
Codex["Codex"]
ClaudeCode["Claude Code"]
ClaudeDesktop["Claude Desktop"]
end
Proxy["TLS reverse proxy"]
subgraph Server["Netdisco MCP"]
Auth["Bearer authentication"]
Guide["Guidance gate"]
Catalog["FastMCP tool catalog"]
Limit["Response limiter"]
Adapter["Swagger 2 → OpenAPI 3 adapter"]
end
Spec["Netdisco swagger.json"]
API["Netdisco REST API"]
ChatGPT --> Proxy
Codex --> Proxy
ClaudeCode --> Proxy
ClaudeDesktop --> Proxy
Proxy --> Auth
Auth --> Guide --> Catalog --> Limit
Adapter --> Catalog
Spec --> Adapter
Catalog --> APIКонвейер запуска
sequenceDiagram
participant S as Netdisco MCP
participant N as Netdisco
participant A as Swagger adapter
participant F as FastMCP
S->>N: GET /swagger.json
N-->>S: Swagger 2.0 document
S->>A: Normalize schemas and references
A->>A: Assign stable operation IDs
A->>A: Remove mutations when read-only
A-->>S: OpenAPI 3.0.3 document
S->>F: Generate and mount tools
F-->>S: MCP server readyПродуктивный рабочий процесс агента
Сервер намеренно придерживается определённого мнения о том, как ИИ-агент должен подходить к задаче управления сетью.
flowchart TD
Start["Start a Netdisco task"] --> Guidance["Call get_guidance"]
Guidance --> Known{"Know the exact tool?"}
Known -- No --> Find["Call find_capability"]
Known -- Yes --> Read["Use search or object GET"]
Find --> Read
Read --> Evidence["Inspect current state"]
Evidence --> Change{"Is a change required?"}
Change -- No --> Report["Return evidence"]
Change -- Yes --> Confirm["Confirm target and scope"]
Confirm --> Mutate["Call mutation tool"]
Mutate --> Verify["Read current state again"]
Verify --> ReportВызовите
get_guidanceодин раз в начале рабочей сессии.Используйте
find_capability, когда правильный инструмент не очевиден.Предпочитайте инструменты поиска и объектов перед широкими отчётами.
Проверяйте текущее состояние перед любыми изменениями.
Проверяйте полученное состояние вместо того, чтобы интерпретировать тайм-аут как сбой.
Полный каталог инструментов
Проверенная поверхность Netdisco 2.103000 содержит:
Категория | Инструменты |
Помощь агенту | 2 |
Объекты | 31 |
Отчёты | 34 |
Очередь | 5 |
Поиск | 4 |
Пользователь | 2 |
Общие | 3 |
Всего | 81 |
Семь сгенерированных инструментов API используют POST, PUT или DELETE и считаются изменениями. Установите NETDISCO_READ_ONLY=1, чтобы удалить эти семь инструментов.
[!CAUTION] Netdisco предоставляет
GET /logout, который уничтожает текущий ключ API и сессию, несмотря на использование HTTP GET. Фильтрация только по методу не может классифицировать эту конечную точку как изменение. Относитесь кget_logoutкак к деструктивному.
Инструменты помощи агенту
Инструмент | Назначение |
| Возвращает встроенное руководство по эксплуатации Netdisco и может выделить раздел по теме. |
| Ищет по всему сгенерированному каталогу по задаче, маршруту, тегу, HTTP-методу или описанию. |
Метод | Инструмент | Маршрут Netdisco | Назначение |
DELETE |
|
| Удалить задания и очистить список пропусков для устройства, опционально отфильтрованный по полям. |
GET |
|
| Вернуть строку из таблицы устройств. |
GET |
|
| Вернуть строки |
GET |
|
| Вернуть строки модулей для устройства. |
GET |
|
| Вернуть отношения соседей второго уровня для устройства. |
GET |
|
| Вернуть узлы, найденные на устройстве. |
GET |
|
| Вернуть строку из таблицы |
GET |
|
| Вернуть строки активных узлов для порта. |
GET |
|
| Вернуть строки активных узлов с данными о возрасте для порта. |
GET |
|
| Вернуть запись агрегации-мастера для порта. |
GET |
|
| Вернуть запись последнего узла для порта. |
GET |
|
| Вернуть строки журнала для порта. |
GET |
|
| Вернуть запись соседа для порта. |
GET |
|
| Вернуть строки узлов для порта. |
GET |
|
| Вернуть строки узлов с данными о возрасте для порта. |
GET |
|
| Вернуть строки |
GET |
|
| Вернуть запись питания для порта. |
GET |
|
| Вернуть запись свойств для порта. |
GET |
|
| Вернуть запись SSID для порта. |
GET |
|
| Вернуть строки VLAN для порта. |
GET |
|
| Вернуть запись беспроводной сети для порта. |
GET |
|
| Вернуть строки |
GET |
|
| Вернуть строки портов для устройства. |
GET |
|
| Вернуть статус модуля PoE и агрегированную статистику портов. |
GET |
|
| Вернуть строки портов с питанием для устройства. |
GET |
|
| Вернуть строки SSID для устройства. |
GET |
|
| Вернуть строки VLAN для устройства. |
GET |
|
| Вернуть строки беспроводных портов для устройства. |
GET |
|
| Вернуть узлы, найденные в VLAN. |
PUT |
|
| Поставить в очередь задание на сохранение записей ARP, найденных на устройстве. |
PUT |
|
| Поставить в очередь задание на сохранение узлов, найденных на устройстве. |
Метод | Инструмент | Маршрут Netdisco | Описание |
GET |
|
| IP-адреса без DNS-записей. |
GET |
|
| Инвентаризация, сгруппированная по расположению. |
GET |
|
| Несоответствия имени устройства и DNS. |
GET |
|
| Инвентаризация устройств. |
GET |
|
| Устройства с несколькими адресами. |
GET |
|
| Статус Power over Ethernet. |
GET |
|
| IP-адреса, обнаруженные на нескольких устройствах. |
GET |
|
| Устройства без модели или данных об ОС. |
GET |
|
| Использование портов. |
GET |
|
| Недавно добавленные устройства. |
GET |
|
| Дублирующиеся частные сети. |
GET |
|
| Инвентаризация IP. |
GET |
|
| Использование подсетей. |
GET |
|
| Узлы с несколькими активными IP-адресами. |
GET |
|
| Узлы, обнаруженные через LLDP или CDP. |
GET |
|
| Несоответствующие настройки дуплекса. |
GET |
|
| Порты, работающие в полудуплексном режиме. |
GET |
|
| Административно отключенные порты. |
GET |
|
| Порты, заблокированные протоколом spanning tree. |
GET |
|
| Порты с несколькими подключенными узлами. |
GET |
|
| Порты, отключенные из-за ошибок. |
GET |
|
| Инвентаризация SSID портов. |
GET |
|
| Порты с наибольшим количеством VLAN. |
GET |
|
| Несоответствующие конфигурации VLAN. |
GET |
|
| Количество VLAN на устройство. |
GET |
|
| Инвентаризация VLAN. |
GET |
|
| VLAN с несколькими именами. |
GET |
|
| Известные, но никогда не настроенные VLAN. |
GET |
|
| VLAN, обнаруженные только на аплинках. |
GET |
|
| VLAN, которые больше не используются. |
GET |
|
| Распределение каналов точек доступа. |
GET |
|
| Количество клиентов точек доступа. |
GET |
|
| Радиоканал и мощность точек доступа. |
GET |
|
| Инвентаризация SSID. |
Метод | Инструмент | Маршрут Netdisco | Назначение |
GET |
|
| Список активных бэкендов Netdisco. |
GET |
|
| Возврат заданий в очереди с необязательными фильтрами. |
GET |
|
| Возврат количества заданий, сгруппированных по статусу. |
POST |
|
| Отправка заданий в очередь Netdisco. |
DELETE |
|
| Удаление заданий из очереди и записей списка пропуска с необязательными фильтрами. |
Метод | Инструмент | Маршрут Netdisco | Назначение |
GET |
|
| Поиск устройств по идентификатору, адресу, расположению, модели, ОС, вендору и другим атрибутам. |
GET |
|
| Поиск узлов, включая активные и архивные наблюдения. |
GET |
|
| Поиск портов коммутатора по описанию и характеристикам порта. |
GET |
|
| Поиск VLAN. |
Метод | Инструмент | Маршрут Netdisco | Назначение |
GET |
|
| Список пользователей с ролями и статусом токена. |
POST |
|
| Создание сервисной учетной записи только с токеном и выдача или отзыв её API-токена. |
Метод | Инструмент | Маршрут Netdisco | Назначение |
GET |
|
| Возврат последней строки статистики Netdisco. |
GET |
|
| Уничтожение текущего API-ключа и сессионного cookie; имеет разрушительный побочный эффект. |
POST |
|
| Получение API-ключа Netdisco. |
Быстрый старт
Требования
Python 3.11 или новее
Доступный экземпляр Netdisco с
swagger.jsonПостоянный API-токен Netdisco или поддерживаемые учетные данные (имя пользователя/пароль)
Docker и Docker Compose для развертывания в контейнере
Локальная разработка
git clone https://github.com/omichelbraga/netdisco-mcp.git
cd netdisco-mcp
cp .env.example .envУстановите необходимые значения в .env:
NETDISCO_URL=https://netdisco.example.net
NETDISCO_API_TOKEN=replace-with-a-permanent-netdisco-tokenУстановите, проверьте live-спецификацию и запустите:
uv sync --extra dev
uv run netdisco-mcp --check
uv run netdisco-mcpТранспорт по умолчанию — stdio.
Docker Compose
Прилагаемый файл Compose ожидает общую внешнюю сеть mcp-edge и не публикует порт хоста.
docker network create mcp-edge
docker compose up --build -dОбратный прокси на mcp-edge может получить доступ к сервису по адресу:
http://netdisco-mcp:8000/mcpСправочник по конфигурации
Настройка | По умолчанию | Назначение |
| обязательно | Базовый URL экземпляра Netdisco. |
|
| Переопределить URL живого Swagger/OpenAPI. |
| не задан | Учетные данные API Netdisco, отправляемые вышестоящему API. |
|
| Схема авторизации; используйте |
| не задан | Необязательное имя пользователя для базовой аутентификации Netdisco. |
| не задан | Необязательный пароль для базовой аутентификации Netdisco. |
|
| Проверять TLS-сертификат Netdisco. |
|
| Тайм-аут запроса к вышестоящему серверу в секундах. |
|
| Удалить инструменты POST, PUT, PATCH и DELETE при установке в |
|
| Требовать руководство перед обычным использованием инструментов. |
|
| Окно активности руководства в секундах. |
|
| Максимальный размер ответа инструмента до усечения. |
|
|
|
|
| Адрес привязки для Streamable HTTP. |
|
| Порт прослушивания внутри процесса или контейнера. |
| не задан | Статический bearer-токен, требуемый HTTP-транспортом при настройке. |
[!ПРЕДУПРЕЖДЕНИЕ]
NETDISCO_API_TOKENаутентифицирует сервер в Netdisco.NETDISCO_MCP_BEARER_TOKENаутентифицирует MCP-клиентов на этом сервере. Они защищают разные границы доверия и никогда не должны иметь одно и то же значение.
Подключение MCP-клиентов
Claude Code
claude mcp add --transport http --scope user \
netdisco-mcp https://netdisco-mcp.example.net/mcp \
--header "Authorization: Bearer <mcp-bearer-token>"Проверьте подключение:
claude mcp get netdisco-mcpCodex
Сохраните MCP bearer-токен в NETDISCO_MCP_BEARER_TOKEN, затем добавьте эту запись
в ~/.codex/config.toml:
[mcp_servers."netdisco-mcp"]
url = "https://netdisco-mcp.example.net/mcp"
bearer_token_env_var = "NETDISCO_MCP_BEARER_TOKEN"
default_tools_approval_mode = "prompt"См. официальную документацию по настройке MCP для Codex для дополнительных параметров тайм-аута, белого списка и утверждения.
Claude Desktop
Claude Desktop может использовать включенный аутентифицированный stdio-прокси. Прокси не передает удаленный bearer-токен в сообщениях протокола MCP, отправляемых Desktop, и добавляет его только при подключении к вышестоящему серверу.
fastmcp install claude-desktop \
src/netdisco_mcp/desktop_proxy.py:mcp \
--name netdisco-mcp \
--with-editable . \
--env NETDISCO_MCP_URL=https://netdisco-mcp.example.net/mcp \
--env NETDISCO_MCP_BEARER_TOKEN=<mcp-bearer-token>Перезапустите Claude Desktop после установки.
OpenAI Responses API
import os
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-5.6",
input="Call get_guidance, then summarize the Netdisco device inventory.",
tools=[
{
"type": "mcp",
"server_label": "netdisco",
"server_url": "https://netdisco-mcp.example.net/mcp",
"authorization": os.environ["NETDISCO_MCP_BEARER_TOKEN"],
"require_approval": "always",
}
],
)
print(response.output_text)Поле authorization соответствует официальному
контракту удаленного MCP-инструмента.
Установка require_approval в always уместна для этого
сервера, поскольку его живой каталог может включать инструменты для изменения данных.
Универсальный MCP-клиент
{
"mcpServers": {
"netdisco-mcp": {
"type": "http",
"url": "https://netdisco-mcp.example.net/mcp",
"headers": {
"Authorization": "Bearer <mcp-bearer-token>"
}
}
}
}Модель безопасности
flowchart LR
Client["Authenticated MCP client"]
Edge["TLS reverse proxy"]
MCP["Netdisco MCP bearer verifier"]
Credential["Internal Netdisco credential"]
Netdisco["Netdisco authorization"]
Client -- "MCP bearer token" --> Edge
Edge -- "preserved Authorization header" --> MCP
MCP -- "approved tool call" --> Credential
Credential -- "separate API token" --> NetdiscoЭлементы управления безопасностью, предоставляемые проектом:
Сравнение настроенного MCP bearer-токена за постоянное время.
Раздельные учетные данные для MCP-клиента и вышестоящего сервера Netdisco.
Необязательная фильтрация инструментов только для чтения на основе метода.
Промежуточное ПО для руководства перед использованием операционных инструментов.
Ограничение размера ответа для защиты контекста модели.
Проверка TLS для Netdisco по умолчанию.
Отсутствие порта хоста в предоставленном файле Compose.
Файловая система контейнера только для чтения и
no-new-privileges.
Рекомендуемые элементы управления для производства:
Завершайте доверенный TLS на обратном прокси.
Храните оба набора учетных данных в менеджере секретов или в среде секретов Portainer.
Меняйте учетные данные по установленному графику и после случайного раскрытия.
Ограничьте учетные данные Netdisco минимально необходимой ролью.
Оставляйте запросы на утверждение включенными для инструментов изменения данных.
Просматривайте журналы доступа обратного прокси и историю заданий Netdisco.
Используйте
NETDISCO_READ_ONLY=1для развертываний, предназначенных только для обнаружения.
Как работает генерация инструментов
Netdisco 2.103000 публикует Swagger 2.0, в то время как FastMCP использует OpenAPI 3.
Адаптер выполняет следующие преобразования без удаления поддерживаемых
операций:
Переписывает ссылки Swagger в ссылки компонентов OpenAPI.
Преобразует параметры тела и формы в тела запросов OpenAPI.
Переносит информацию о типах параметров в схемы.
Исправляет флаги
requiredна уровне свойств Netdisco.Нормализует значения по умолчанию для булевых, целочисленных и массивов.
Преобразует схемы ответов в записи содержимого типа media-type.
Назначает детерминированные, читаемые человеком идентификаторы операций.
Добавляет исходный HTTP-метод и маршрут в описание каждого инструмента.
Удаляет методы записи, когда включен режим только для чтения.
Если два маршрута получат одно и то же понятное имя, добавляется детерминированный
семизначный дайджест. Это объясняет такие имена, как
get_device_port_vlans_cd8cf56, и обеспечивает отсутствие коллизий во всей поверхности API.
Структура репозитория
netdisco-mcp/
├── src/netdisco_mcp/
│ ├── __main__.py # CLI and transport startup
│ ├── auth.py # MCP bearer-token verification
│ ├── config.py # Environment-driven settings
│ ├── desktop_proxy.py # Authenticated Claude Desktop proxy
│ ├── guidance.py # Guidance loading and enforcement
│ ├── server.py # FastMCP assembly and tool mounting
│ ├── spec.py # Swagger normalization and tool catalog
│ └── data/GUIDANCE.md # Operating instructions for AI agents
├── tests/ # Configuration, auth, and spec tests
├── compose.yaml # Internal-network container deployment
├── Dockerfile
└── pyproject.tomlРазработка и тестирование
Запустите набор тестов:
uv run pytestПроверьте подключенный живой API без запуска транспорта:
NETDISCO_URL=https://netdisco.example.net \
NETDISCO_API_TOKEN=<netdisco-api-token> \
uv run netdisco-mcp --checkПроверка сообщает о покрытии версии API, количестве операций чтения/записи, общем количестве MCP инструментов и тегах. Тесты охватывают псевдонимы транспорта, проверку bearer-токена, преобразование Swagger в OpenAPI, стабильные имена, тела запросов, исправление схем, фильтрацию только для чтения и обнаружение возможностей.
Участие в разработке
Сделайте форк репозитория и создайте тематическую ветку.
Добавьте тесты для поведенческих изменений.
Запустите полный набор тестов с репрезентативным фикстурой Swagger.
Запустите
netdisco-mcp --checkдля авторизованного экземпляра Netdisco.Откройте pull request с описанием видимого пользователю поведения и проверки.
Пожалуйста, не фиксируйте учетные данные Netdisco, MCP bearer-токены, внутренние URL или захваченные данные инфраструктуры.
Лицензия
Выпущено под лицензией MIT.
This server cannot be installed
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 Connectors
SaaS intelligence for AI agents. 5 unified tools cover 1,000+ services with 91-96% token savings.
Universal AI API Orchestrator — 1,554 tools, 96 services. One install.
Domain & company intel for AI agents: RDAP, DNS, email deliverability, tech stack. No API keys.
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/omichelbraga/netdisco-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server