- plugin_requirements.txt: pinned ==versions (10 plugins updated vs PyPI) - Dockerfile-Plugins: FROM netbox:latest -> netbox:v4.6-5.0.2 (reproducible) - configuration/plugins.py: fix netbox-config-diff -> netbox_config_diff key (required_settings USERNAME/PASSWORD) - docker-compose.yml: VERSION default v4.6-5.0.1 -> v4.6-5.0.2 - README-NETBOX-MCP.md: fix NetBox version 6.0.4 -> 4.6.10, mark plugins TODO done - NetBox 4.6.0 -> 4.6.10; all 14 plugins now load (config_diff, secrets, qrcode, floorplan revived) NOTE: docker-compose.override.yml (housekeeping DB env fix) is gitignored - kept local
11 KiB
NetBox MCP Server (read-only)
Интеграция NetBox с Hermes Agent через Model Context Protocol (MCP).
Сервер
- Репозиторий: skuldgerry/netbox-mcp — enhanced-версия официального netboxlabs/netbox-mcp-server с write-операциями (72 мутации).
- Установлен:
/opt/netbox-mcp-server(git clone, ветка main, релиз v1.1.0) - Python-пакет:
netbox-mcp-server(запуск черезuv --directory /opt/netbox-mcp-server run netbox-mcp-server) - Транспорт: stdio (MCP-клиент Hermes сам запускает процесс)
Конфигурация в Hermes
Файл: /opt/hermes/.hermes/config.yaml, секция mcp_servers:
mcp_servers:
netbox:
command: "uv"
args: ["--directory", "/opt/netbox-mcp-server", "run", "netbox-mcp-server"]
env:
NETBOX_URL: "http://172.19.0.5:8080/" # docker-IP контейнера netbox
NETBOX_TOKEN: "<secret>"
VERIFY_SSL: "false"
LOG_LEVEL: "INFO"
timeout: 120
connect_timeout: 60
Доступ к NetBox
- NetBox работает в docker (контейнер
netbox-netbox-1, порт8080на хосте). - Версия NetBox: 4.6.10 (Community, netbox-docker
v4.6-5.0.2), образnetbox-kupazh:latest(кастомный, с плагинами), базовыйnetboxcommunity/netbox:v4.6-5.0.2. - Внутри docker-сети
netbox_defaultконтейнер доступен по имениnetbox-netbox-1(IP 172.19.0.5). - С хоста прямой доступ к API по
127.0.0.1:8080даёт 403 (ALLOWED_HOSTS/прокси), поэтому MCP-сервер ходит по docker-IP. - Аутентификация: v1 API токен (
Authorization: Token <40-символов>), т.к. v2-токены в этой кастомной модели имеют ограничение key ≤12 символов и HMAC-дигест — с ними были проблемы в CLI-тестах.
Инструменты (read-only режим)
| Инструмент | Назначение |
|---|---|
netbox_get_objects |
Получить объекты по типу и фильтрам (dcim.device, ipam.ipaddress, ...) |
netbox_get_object_by_id |
Детали объекта по ID |
netbox_get_changelogs |
История изменений (audit trail) |
netbox_search_objects |
Глобальный поиск по типам |
Поддерживаются фильтры: {'site_id': 1, 'name': 'router'}, lookup-суффиксы __ic, __in, __gte и др. Параметр fields уменьшает объём ответа (токены).
Учётка / права
- Пользователь:
mcp-ro(служебный, без пароля,is_superuser=False) - Токен: read-only (
write_enabled=False), v1, 40 символов - ObjectPermission «MCP ReadOnly user»: действия
['view']на 117 content types (dcim, ipam, tenancy, virtualization, circuits, extras, wireless). Без ObjectPermission даже чтение даёт 403. - Намеренно только чтение: запись (
write_enabled=True+ ObjectPermission с create/update/delete) включается ПОСЛЕ отладки read-режима (см. ниже).
Проверка
# из хоста, stdio-пробе:
cd /opt/netbox-mcp-server && echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"probe","version":"1.0"}}}' | timeout 10 env NETBOX_URL=http://172.19.0.5:8080/ NETBOX_TOKEN=<token> VERIFY_SSL=false uv run netbox-mcp-server
Рабочий запрос (пример): netbox_get_objects('dcim.site', {'limit': 2}, fields=['id','name','slug']) → 2 сайта («Винный город», «Горизонт»).
План: включение записи (после отладки)
- 1. Создать отдельный write-токен (
write_enabled=True). - 2. ObjectPermission с actions
['view','add','change','delete']на нужные типы (или только нужные). - 3. В конфиге Hermes сменить
NETBOX_TOKENна write-токен. - 4. Проверить на тестовых объектах (site/tag), затем в проде.
HTTP-транспорт (внешние клиенты): рассмотрено и отклонено. Идея запускать MCP-сервер как контейнер в сети netbox_default с
MCP_AUTH_TOKENи доступом по localhost для внешних клиентов предлагалась, но не планируется — интеграция только через Hermes (stdio).
Замечания
- Плагины NetBox (netbox-dns и др.) не включены в discovery (
ENABLE_PLUGIN_DISCOVERY=false) — при необходимости включить отдельно; их запись управляетсяPLUGIN_WRITE_RULES. - Многие плагины (netbox_secrets, netbox_qrcode, netbox_floorplan) не загружались — требовали NetBox ≤4.5.99; после обновления плагинов (2026-09-03) все 14 загружаются (см. историю изменений).
История изменений
2026-09-03 — Обновление плагинов
Обновлены все 14 установленных плагинов до актуальных версий на PyPI (совместимых с NetBox 4.6), NetBox обновлён с 4.6.0 до 4.6.10 (базовый образ netboxcommunity/netbox:latest → зафиксирован v4.6-5.0.2).
| Плагин | Было | Стало |
|---|---|---|
| netbox-plugin-prometheus-sd | 1.3.0 | 2.0.0 (устранены N+1 запросы) |
| netbox-lists | 4.0.4 | 4.0.4 (=) |
| netbox-inventory | 2.6.0 | 2.6.1 |
| netbox-interface-synchronization | 4.5.8 | 4.5.8 (=) |
| netbox-documents | 0.8.2 | 0.8.5 |
| netbox-contract | 2.4.5 | 2.4.7 |
| netbox-data-flows | 1.5.2 | 1.5.4 |
| netbox-config-diff | 2.14.2 | 2.15.2 |
| netbox-attachments | 11.2.1 | 11.3.1 |
| netbox-topology-views | 4.5.1 | 4.5.1 (=) |
| netbox-reorder-rack | 1.1.4 | 1.1.4 (=) |
| netbox-secrets | 3.0.2 | 3.1.1 |
| netbox-qrcode | 0.0.20 | 0.0.21 |
| netbox-floorplan-plugin | 0.9.1 | 0.9.2 |
Ключевые результаты:
- Исправлена скрытая поломка конфига config-diff: ключ в
PLUGINS_CONFIGбыл"netbox-config-diff"(с дефисом) вместо"netbox_config_diff"(с подчёркиванием). Новая версия 2.15.2 жёстко требуетUSERNAME/PASSWORD(required_settings) — из-за неправильного ключа сборка падала на collectstatic. Ключ исправлен, значения прописаны. - Ожили 4 плагина: netbox_config_diff, netbox_secrets, netbox_qrcode, netbox_floorplan раньше не загружались (требовали NetBox ≤4.5.99). Обновлённые версии поддерживают 4.6 — теперь все 14 плагинов активны (миграции накатаны).
- netbox-qrcode: пропущен 1.0.0 (таргетит NetBox 4.7) — взят 0.0.21 (последний с поддержкой 4.6.x).
- Исправлен housekeeping: в
docker-compose.override.ymlу сервиса не былоDB_HOST/DB_NAME/DB_USER/DB_PASSWORD— контейнер падал с «connection refused» к postgres. Добавлены переменные (как у netbox). Теперь housekeeping успешно выполняется. - plugin_requirements.txt теперь с жёсткими пинами
==(было без версий) — воспроизводимая сборка. Бэкап-тег образа:netbox-kupazh:pre-upgrade-20260903.
2026-09-03 — Развёртывание и отладка
Развёрнут MCP-сервер (read-only). Ключевые находки при отладке:
- v2-токены NetBox 6 — формат
nbt_<key>.<plaintext>с HMAC-дигестом и pepper. В кастомной модели пользователей поляusernameиToken.keyограничены 12 символами, поэтому создание v2-токенов через shell приводило к"Invalid v2 token". Рабочий вариант — v1-токен (Authorization: Token <40 символов>), создаётся черезToken.objects.create(user=..., version=1, write_enabled=False)с явнымt.token = <40 символов>. - ObjectPermission обязателен — в NetBox 6 доступ к API (даже чтение) контролируется моделью
users.ObjectPermission(actions['view']), а не Django-группами. Без него API отвечает 403"You do not have permission to perform this action". - Доступ по docker-IP — с хоста API по
127.0.0.1:8080даёт 403 (ALLOWED_HOSTS/прокси). MCP-сервер ходит в docker-сетьnetbox_defaultпоhttp://172.19.0.5:8080/(IP контейнераnetbox-netbox-1). - config.yaml Hermes —
hermes config setпишет значения как строки; дляargs(список) иVERIFY_SSL(строка) это ломало запуск:uv: error: unrecognized subcommand '['и pydantic ValidationError. Исправлено прямым редактированием YAML (бэкап + python). - 76 инструментов (4 чтения + 72 записи) зарегистрированы,
hermes mcp test netboxпроходит. Write-инструменты в списке есть, но при вызове вернут 403 — запись намеренно отключена (см. план выше).
TODO (ожидающие задачи)
- Включить write-режим: write-токен (
write_enabled=True), ObjectPermission с actions['view','add','change','delete']на нужные типы, сменитьNETBOX_TOKENв конфиге Hermes, проверить на тестовых объектах (site/tag). - Обновление плагинов: сверить версии с PyPI, пересобрать образ, проверить загрузку. Выполнено 2026-09-03: все 14 плагинов обновлены до свежих версий (совместимых с NetBox 4.6), NetBox 4.6.0 → 4.6.10. Детали в истории изменений.
- (Опция) Включить plugin discovery (
ENABLE_PLUGIN_DISCOVERY=true) иPLUGIN_WRITE_RULESдля плагинов (netbox-dns и др.), после отладки core. (Отклонено) HTTP-транспорт для внешних клиентов— не планируется, интеграция только через Hermes (stdio).