Read-only MCP stdio server для структурированного поиска по текущим конфигурациям сетевых устройств в Git-репозитории Oxidized.
- Исходный неизменяемый контракт: SPEC.md
- Улучшения сверх ТЗ: IMPROVEMENTS.md
- Повторная архитектурная оценка: docs/REASSESSMENT.md
- Оставшиеся production-задачи: BACKLOG.md
- Vendor plugins: D-Link, ELTEX, SNR
- Path → content vendor detection
- VLAN, ACL, NTP, SNMP, interfaces, routing, LLDP, static MAC, Voice VLAN, SSH
- Обязательные
config_date,config_age_hours,stale_warning - Parsed config cache: TTL + invalidation по
mtime_ns/size git grepс timeout и лимитами- Stable machine-readable errors
- Redaction вероятных secrets в полном конфиге по умолчанию
- Опциональная live-телеметрия Oxidized через loopback-only
GET /nodes.json
python3 -m venv .venv
. .venv/bin/activate
python -m pip install -e ".[dev]"python -m pytest
python -m ruff check src tests
python -m bandit -q -r src
python -m buildexport OXIDIZED_CONFIG_PATH=/srv/oxidized/configs
oxidized-mcp --check
oxidized-mcp{
"mcp": {
"oxidized": {
"type": "local",
"command": ["/path/to/venv/bin/oxidized-mcp"],
"environment": {
"OXIDIZED_CONFIG_PATH": "/srv/oxidized/configs",
"OXIDIZED_REST_ENABLED": "true"
}
}
}
}Точный формат config может зависеть от версии OpenCode. Ключевое требование — запустить oxidized-mcp через stdio и передать OXIDIZED_CONFIG_PATH.
По умолчанию REST отключён: MCP читает только Git-витрину конфигураций. При OXIDIZED_REST_ENABLED=true появляется инструмент list_oxidized_nodes, который делает только GET http://127.0.0.1:8888/nodes.json и возвращает live-инвентарь с результатом последней попытки backup.
OXIDIZED_REST_ENABLED=true
OXIDIZED_REST_BASE_URL=http://127.0.0.1:8888
OXIDIZED_REST_TIMEOUT=3
OXIDIZED_REST_CACHE_TTL=30- URL принимается только как loopback HTTP base URL; произвольные host, path и credentials отклоняются.
- В ответ не попадают Oxidized
vars, чтобы не раскрывать credential-like inventory fields. - REST-данные не объединяются с Git-инструментами:
statusпоследней попытки не являетсяconfig_dateилиstale_warning. - MCP не имеет и не вызывает
/node/next, reload или другие mutation endpoints.
docker build -t oxidized-mcp:0.2.0 .
docker run --rm -i \
--read-only \
--mount type=bind,src=/srv/oxidized/configs,dst=/srv/oxidized/configs,readonly \
oxidized-mcp:0.2.0EXPOSE отсутствует намеренно: transport — stdio, TCP listener не создаётся.
Исходные инструменты Фазы 1:
list_devicesget_device_configget_device_vlansget_device_aclsget_device_ntpget_device_snmpget_device_interfacesget_device_lldpget_device_mac_tableget_device_voice_vlanget_device_sshsearch_across_devicesraw_search
Улучшения:
get_device_routingget_device_freshnessvalidate_repository- operators
present,absent,unrestrictedв глобальном поиске list_oxidized_nodesпри явномOXIDIZED_REST_ENABLED=true
Текущие файлы tests/fixtures/ являются synthetic regression fixtures из первоначального bootstrap. Код полностью исполняемый и тестируется на них, но production acceptance парсеров требует заменить/дополнить их реальными sanitized Oxidized backups разных моделей и firmware families, как требует SPEC.md.