{ "version": 1, "routes": [ { "method": "DELETE", "path": "/api/backups/:id", "status": "mediated", "operations": [ "backups.delete" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "DELETE", "path": "/api/firewall/address-lists", "status": "mediated", "operations": [ "firewall.addressLists.delete" ], "reason": "Общий REST/MCP address-list сервис: scoped ID, human plan, консервативные защиты зависимых правил, полный stable proof, отдельная проверка expiry window, shared locks/read-back/revision/no retry." }, { "method": "DELETE", "path": "/api/firewall/rules", "status": "mediated", "operations": [ "firewall.rules.delete" ], "reason": "Общий REST/MCP сервис формы Firewall: человеческий sealed plan, scoped native ID, полный matcher/order proof, статическая цель, shared locks, read-back, отдельный статус ревизии и отсутствие retry." }, { "method": "DELETE", "path": "/api/gre/tunnels", "status": "mediated", "operations": [ "network.gre.delete" ], "reason": "Общий REST/MCP GRE business executor: интерфейс и v4/v6 адреса, staged disabled, opaque native proof/dependencies, PSK purpose reference, protections/budget/locks, per-command read-back, partial/unknown без retry; SQL/HTTP проверены." }, { "method": "DELETE", "path": "/api/ipsec/certs/:serverId", "status": "mediated", "operations": [ "network.ipsec.certificates.delete" ], "reason": "Общий REST/MCP single certificate DELETE любого выбранного сертификата: force только для peer/identity ссылок, CA/CRL guards без обхода, native ID/private proof, intent/read-back, история и exact VERIFIED; SQL/HTTP any-cert/force/alias/lost/revoke/ABA/privacy приняты. Native force-reference поведение принимается отдельно на CHR." }, { "method": "DELETE", "path": "/api/ipsec/peers/:serverId/:rosId", "status": "mediated", "operations": [ "network.ipsec.peers.delete" ], "reason": "Общий REST/MCP сервис принят SQL/HTTP: права и human approval, private source fences, bounded transport, точная семантика, partial/unknown без повторов; сетевой forwarding не заявляется." }, { "method": "DELETE", "path": "/api/ipsec/server/:serverId", "status": "mediated", "operations": [ "network.ipsec.server.delete" ], "reason": "Полный общий REST/MCP server removal: точный ordered manifest, зависимости foreign MC/pool и peer/certificate, полный certificate graph и объявленные CA cascade, preservation profiles/proposals, staged ACK/private read-back и история. Human/server/protection/budget guards; unknown не повторяется. SQL/HTTP parity, runtime countdown и dynamic policy exclusions приняты; настоящий CHR cascade отдельно не проверялся." }, { "method": "DELETE", "path": "/api/ipsec/users/:serverId/:rosId", "status": "mediated", "operations": [ "network.ipsec.users.delete" ], "reason": "Общий REST/MCP executor полного удаления клиента с необязательным сертификатом, dependency/source proofs, последовательными intent/read-back, managed-only историей и SQL/HTTP-приёмкой без replay." }, { "method": "DELETE", "path": "/api/mcp/grants/:id", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "DELETE", "path": "/api/mcp/management-channels/:id", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "DELETE", "path": "/api/mcp/oauth/clients/:id", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "DELETE", "path": "/api/mcp/protections/:id", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "DELETE", "path": "/api/servers/:id", "status": "mediated", "operations": [ "servers.delete" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "DELETE", "path": "/api/users/:id", "status": "mediated", "operations": [ "users.delete" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "DELETE", "path": "/api/users/:id/bindings/:bindingId", "status": "mediated", "operations": [ "users.binding_remove" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "DELETE", "path": "/api/wireguard/interfaces/:serverId/:rosId", "status": "mediated", "operations": [ "network.wireguard.interfaces.delete", "ros.wireguard.delete" ], "reason": "Общий REST/MCP каскад с запечатанными зависимостями, отдельным бюджетом каждой команды, read-back и остановкой без повтора; native alias не приобретает каскадных полномочий." }, { "method": "DELETE", "path": "/api/wireguard/peers/:serverId/:rosId", "status": "mediated", "operations": [ "network.wireguard.peers.delete", "ros.wireguard_peer.delete" ], "reason": "Общий REST/MCP сервис удаления peer: подтверждённый parent, привязки пользователей, полный непрозрачный private proof, защита сервера/интерфейса, drift и endpoint ABA, одна команда DELETE, проверка остальных peers, partial/unknown без повтора и отдельный receipt ревизии." }, { "method": "DELETE", "path": "/mcp", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/.well-known/oauth-authorization-server", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/.well-known/oauth-protected-resource", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/alerts", "status": "mediated", "operations": [ "alerts.read" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/alerts/outbox", "status": "mediated", "operations": [ "alerts.outbox.read" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/auth/config", "status": "excluded", "operations": [], "reason": "Bootstrap/health авторизации интерфейса; бизнес-операция MCP отсутствует." }, { "method": "GET", "path": "/api/backups", "status": "mediated", "operations": [ "backups.list" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/backups/:id/download", "status": "mediated", "operations": [ "backups.download" ], "reason": "Общий сервис REST/MCP, scoped источники и защиты, человеческое подтверждение, intent/read-back или безопасный human-only artifact, SQL/HTTP-приёмка и сверка без replay." }, { "method": "GET", "path": "/api/backups/jobs/:jobId", "status": "mediated", "operations": [ "backups.jobs.read" ], "reason": "Общий реестр фактической REST backup-очереди: доступ только к целиком разрешённой задаче, проверка устройств и прогресса, ограниченные страницы результатов, без notes/имён/путей/текстов ошибок. Временные задачи очищаются при закрытии приложения и restore; несовпадающие или неоднозначные ID не угадываются." }, { "method": "GET", "path": "/api/backups/schedule", "status": "mediated", "operations": [ "backups.schedule.read" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/backups/storage", "status": "mediated", "operations": [ "backups.storage.read" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/bfd/sessions", "status": "mediated", "operations": [ "routing.bfd.sessions.read" ], "reason": "Общие REST/MCP state-read сервисы и модели; legacy REST сохраняет defaults совместимости, MCP возвращает observed DTO с null/Unknown. Серверная область до опроса, пагинация, явные failures, areas и отдельное чтение BFD." }, { "method": "GET", "path": "/api/bgp/catalog", "status": "mediated", "operations": [ "routing.bgp.catalog.read" ], "reason": "Общие BGP catalog poll/parser; серверы ограничиваются до опроса, пагинация и failures сохраняются явно." }, { "method": "GET", "path": "/api/bgp/sessions", "status": "mediated", "operations": [ "routing.bgp.sessions.read" ], "reason": "Общий readBgpSessionsForServer/parser и pollBgpCatalog; эффективный scope до SQL/native, серверная и строковая пагинация, failures/incomplete сохраняют частичный отказ вместо успешного пустого списка." }, { "method": "GET", "path": "/api/bgp/sessions/raw/:id", "status": "mediated", "operations": [ "routing.bgp.sessions.raw.read" ], "reason": "Общий readRawBgpSessionsForServer, scope/disabled до native GET, bounded raw DTO с метаданными сервера и маскированием ключей до выдачи/аудита." }, { "method": "GET", "path": "/api/certificates", "status": "mediated", "operations": [ "certificates.state.read" ], "reason": "Общий REST/MCP источник сертификатов с проверкой schema и clock offset; refresh только повторяет чтение без записи. Область до опроса, unknown в MCP, native keys исключены; HTTP/SQL parity и malformed failure проверены." }, { "method": "GET", "path": "/api/certificates/acme-settings", "status": "mediated", "operations": [ "certificates.acme.read" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/certificates/issue/:jobId", "status": "mediated", "operations": [ "certificates.jobs.read" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/certificates/renew-settings", "status": "mediated", "operations": [ "certificates.renew.read" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/certificates/state", "status": "mediated", "operations": [ "certificates.state.read" ], "reason": "Общий сервис REST/MCP с ограниченным типизированным DTO; права и серверная область проверяются до SQL/DNS/опроса, выдача ограничена, ошибки и неизвестные значения сохраняются." }, { "method": "GET", "path": "/api/containers", "status": "mediated", "operations": [ "containers.state.read" ], "reason": "Общий REST/MCP collector контейнеров; область до опроса, стабильные страницы, explicit partial/unsupported, env values и cmd скрыты в MCP. Реальные HTTP/SQL тесты сравнивают legacy каталог и observed DTO." }, { "method": "GET", "path": "/api/containers/state", "status": "mediated", "operations": [ "containers.state.read" ], "reason": "Общий сервис REST/MCP с ограниченным типизированным DTO; права и серверная область проверяются до SQL/DNS/опроса, выдача ограничена, ошибки и неизвестные значения сохраняются." }, { "method": "GET", "path": "/api/events", "status": "mediated", "operations": [ "events.read" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/evobgp/settings", "status": "mediated", "operations": [ "evobgp.settings.read" ], "reason": "Общие readEvoBgpSettings/publicEvoBgpSettings без создания строки и без API-ключа; полный эффективный каталог проверяется до чтения." }, { "method": "GET", "path": "/api/filters/gre-tunnels", "status": "mediated", "operations": [ "routing.gre.catalog.read" ], "reason": "Общие fetchServerFilters/pollGreCatalog с REST; разрешённые серверы отбираются до опроса, выдача ограничена, IPsec secret не передаётся, ошибки устройств сохраняются." }, { "method": "GET", "path": "/api/filters/revisions", "status": "mediated", "operations": [ "config.filters.revisions.read" ], "reason": "Общий listRevisions с REST: только метаданные, максимум 50 записей; серверная область и права проверяются до SQL, payload ревизии не выдаётся." }, { "method": "GET", "path": "/api/filters/rules", "status": "mediated", "operations": [ "routing.filters.catalog.read" ], "reason": "Общий REST/MCP live/cache reader BGP-in, scope до опроса/SQL, native order/unknown flags, scoped stale fallback; MCP observer не обновляет cache/revisions и не подтверждает эффекты parser hints." }, { "method": "GET", "path": "/api/firewall/all", "status": "mediated", "operations": [ "firewall.state.read" ], "reason": "Общий listFirewallAll/fetchFirewallState с областью до HTTP; MCP получает observed flags/counters без legacy defaults, отдельные matcher-поля, пагинацию и failures. Неполные flags/ошибки не сохраняются как observed revision." }, { "method": "GET", "path": "/api/firewall/revisions", "status": "mediated", "operations": [ "config.firewall.revisions.read" ], "reason": "Общий listRevisions с REST: только метаданные, максимум 50 записей; серверная область и права проверяются до SQL, payload ревизии не выдаётся." }, { "method": "GET", "path": "/api/geoip", "status": "mediated", "operations": [ "geoip.read" ], "reason": "Общий buildGeoipStatus: только локальные readers и метаданные; глобальная эффективная область проверяется до чтения." }, { "method": "GET", "path": "/api/gre/revisions", "status": "mediated", "operations": [ "config.gre.revisions.read" ], "reason": "Общий listRevisions с REST: только метаданные, максимум 50 записей; серверная область и права проверяются до SQL, payload ревизии не выдаётся." }, { "method": "GET", "path": "/api/gre/tunnels", "status": "mediated", "operations": [ "network.gre.state.read" ], "reason": "Общий REST/MCP опрос GRE и IPv4/IPv6-адресов; ограничение серверов до чтения, страницы адресов, nullable-наблюдения, происхождение метаданных, PSK скрыт; MCP не сохраняет историю и не подтверждает forwarding." }, { "method": "GET", "path": "/api/internet-path/latest", "status": "mediated", "operations": [ "routing.internet-path.latest.read" ], "reason": "Общий latest-row REST/MCP reader, scoped JSON-проекция в SQL до разбора скрытых записей, проверка server bindings и схемы, вложенная пагинация, известные нули/unknown и secret-free whitelist. Возвращается сохранённая интерпретация с возрастом/stale/clockSkew; она не доказывает текущий маршрут или forwarding." }, { "method": "GET", "path": "/api/internet-path/settings", "status": "mediated", "operations": [ "internet-path.settings.read" ], "reason": "Общий сервис настроек коллектора; полная область серверов, защита зависимостей, подтверждённый план и проверка сохранения." }, { "method": "GET", "path": "/api/ipsec", "status": "mediated", "operations": [ "network.ipsec.state.read" ], "reason": "Общий REST polling/parser по выбранным серверам до HTTP; MCP использует safe observed DTO без key material, nullable flags/counters и явные failures. Пагинация каталогов и вложенных peers/VTEP/certificates, без обновления истории конфигурации или утверждения о forwarding." }, { "method": "GET", "path": "/api/ipsec/revisions", "status": "mediated", "operations": [ "config.ipsec.revisions.read" ], "reason": "Общий listRevisions с REST: только метаданные, максимум 50 записей; серверная область и права проверяются до SQL, payload ревизии не выдаётся." }, { "method": "GET", "path": "/api/logs", "status": "mediated", "operations": [ "logs.query" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/logs/:id", "status": "mediated", "operations": [ "logs.get" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/logs/:id/context", "status": "mediated", "operations": [ "logs.context" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/logs/export", "status": "mediated", "operations": [ "logs.export" ], "reason": "Общий REST/MCP SQL-источник с server scope до бюджета 50000 строк/8 MiB; маскированная зашифрованная выгрузка с атомарной квотой и отдельным logs.export.read для чтения частей с повторной авторизацией." }, { "method": "GET", "path": "/api/logs/live", "status": "mediated", "operations": [ "logs.follow" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/logs/settings", "status": "mediated", "operations": [ "logs.settings.read" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/logs/summary", "status": "mediated", "operations": [ "logs.summary" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/mcp/artifacts/:id", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/audit", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/catalog", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/connections", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/connections/:id/grants", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/coverage", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/database/receipts/:id", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/database/receipts/:id/audit-status", "status": "excluded", "operations": [], "reason": "Человеческая административная сверка аудита внешней квитанции восстановления: управление самим MCP, без отдельного AI-инструмента." }, { "method": "GET", "path": "/api/mcp/devices/:serverId/:resource", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/devices/catalog", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/drift", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/management-channels", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/oauth/clients", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/oauth/requests/:id", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/operations", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/overview", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/plans", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/plans/:id", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/protections", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/requests", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/routing-profiles", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/mcp/settings", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/api/ospf/all", "status": "mediated", "operations": [ "routing.ospf.state.read" ], "reason": "Общие REST/MCP state-read сервисы и модели; legacy REST сохраняет defaults совместимости, MCP возвращает observed DTO с null/Unknown. Серверная область до опроса, пагинация, явные failures, areas и отдельное чтение BFD." }, { "method": "GET", "path": "/api/ospf/catalog", "status": "mediated", "operations": [ "routing.ospf.catalog.read" ], "reason": "Общий OSPF/BFD catalog parser; область серверов ограничивается до опроса, коллекции и серверы выдаются страницами с явными failures." }, { "method": "GET", "path": "/api/ospf/instances", "status": "mediated", "operations": [ "routing.ospf.state.read" ], "reason": "Общие REST/MCP state-read сервисы и модели; legacy REST сохраняет defaults совместимости, MCP возвращает observed DTO с null/Unknown. Серверная область до опроса, пагинация, явные failures, areas и отдельное чтение BFD." }, { "method": "GET", "path": "/api/ospf/interfaces", "status": "mediated", "operations": [ "routing.ospf.state.read" ], "reason": "Общие REST/MCP state-read сервисы и модели; legacy REST сохраняет defaults совместимости, MCP возвращает observed DTO с null/Unknown. Серверная область до опроса, пагинация, явные failures, areas и отдельное чтение BFD." }, { "method": "GET", "path": "/api/ospf/neighbors", "status": "mediated", "operations": [ "routing.ospf.state.read" ], "reason": "Общие REST/MCP state-read сервисы и модели; legacy REST сохраняет defaults совместимости, MCP возвращает observed DTO с null/Unknown. Серверная область до опроса, пагинация, явные failures, areas и отдельное чтение BFD." }, { "method": "GET", "path": "/api/recursive-routes", "status": "mediated", "operations": [ "routing.recursive.routes.read" ], "reason": "Общий REST/MCP reader с явным live/stale fallback, строгими effective properties, устойчивыми логическими ID и scoped SQL. MCP observer не меняет кеш/ревизии; malformed source не объявляется успешным пустым каталогом." }, { "method": "GET", "path": "/api/recursive-routes/catalog", "status": "mediated", "operations": [ "routing.recursive.catalog.read" ], "reason": "Общий сервис REST/MCP с ограниченным типизированным DTO; права и серверная область проверяются до SQL/DNS/опроса, выдача ограничена, ошибки и неизвестные значения сохраняются." }, { "method": "GET", "path": "/api/recursive-routes/gateways", "status": "mediated", "operations": [ "routing.recursive.gateways.read" ], "reason": "Общий REST/MCP reader шлюзов приложения с агрегацией up/down/unknown, пагинацией и ограничением сервера до опроса; active не трактуется как подтверждение передачи пакетов." }, { "method": "GET", "path": "/api/recursive-routes/gateways/catalog", "status": "mediated", "operations": [ "routing.recursive.gateways.catalog.read" ], "reason": "Общий сервис REST/MCP с ограниченным типизированным DTO; права и серверная область проверяются до SQL/DNS/опроса, выдача ограничена, ошибки и неизвестные значения сохраняются." }, { "method": "GET", "path": "/api/recursive-routes/revisions", "status": "mediated", "operations": [ "config.recursive-routes.revisions.read" ], "reason": "Общий listRevisions с REST: только метаданные, максимум 50 записей; серверная область и права проверяются до SQL, payload ревизии не выдаётся." }, { "method": "GET", "path": "/api/scheduler/runs", "status": "mediated", "operations": [ "scheduler.runs" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/scheduler/status", "status": "mediated", "operations": [ "scheduler.read" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/servers", "status": "mediated", "operations": [ "servers.list" ], "reason": "Общий сервис каталога с ограничениями серверов и типизированным MCP-ответом." }, { "method": "GET", "path": "/api/servers-api-ping/settings", "status": "mediated", "operations": [ "servers.api-ping.settings.read" ], "reason": "Общий сервис настроек коллектора; полная область серверов, защита зависимостей, подтверждённый план и проверка сохранения." }, { "method": "GET", "path": "/api/servers/:id", "status": "mediated", "operations": [ "servers.list" ], "reason": "Общий сервис каталога с ограничениями серверов и типизированным MCP-ответом." }, { "method": "GET", "path": "/api/servers/:id/bgp/sessions", "status": "mediated", "operations": [ "routing.bgp.sessions.read" ], "reason": "Явный serverId в общем sessions-адаптере: общий reader/parser и poller, scope до опроса; диагностические ошибки/неизвестные счётчики не подменяются нулём." }, { "method": "GET", "path": "/api/servers/:id/containers", "status": "mediated", "operations": [ "containers.state.read" ], "reason": "Общий REST/MCP collector контейнеров; область до опроса, стабильные страницы, explicit partial/unsupported, env values и cmd скрыты в MCP. Реальные HTTP/SQL тесты сравнивают legacy каталог и observed DTO." }, { "method": "GET", "path": "/api/servers/:id/ospf", "status": "mediated", "operations": [ "routing.ospf.state.read" ], "reason": "Общие REST/MCP state-read сервисы и модели; legacy REST сохраняет defaults совместимости, MCP возвращает observed DTO с null/Unknown. Серверная область до опроса, пагинация, явные failures, areas и отдельное чтение BFD." }, { "method": "GET", "path": "/api/servers/:id/ros-src-address", "status": "mediated", "operations": [ "servers.source-address.read" ], "reason": "Общий сервис REST/MCP с ограниченным типизированным DTO; права и серверная область проверяются до SQL/DNS/опроса, выдача ограничена, ошибки и неизвестные значения сохраняются." }, { "method": "GET", "path": "/api/servers/:id/snapshots", "status": "mediated", "operations": [ "servers.snapshots.read" ], "reason": "Общий сервис REST/MCP с ограниченным типизированным DTO; права и серверная область проверяются до SQL/DNS/опроса, выдача ограничена, ошибки и неизвестные значения сохраняются." }, { "method": "GET", "path": "/api/servers/:id/vxlan", "status": "mediated", "operations": [ "network.vxlan.state.read" ], "reason": "Общий REST polling/parser по выбранным серверам до HTTP; MCP использует safe observed DTO без key material, nullable flags/counters и явные failures. Пагинация каталогов и вложенных peers/VTEP/certificates, без обновления истории конфигурации или утверждения о forwarding." }, { "method": "GET", "path": "/api/servers/:id/wan-runtime", "status": "mediated", "operations": [ "servers.wan-runtime.read" ], "reason": "Общий readWanRuntimeForServer и модель IPv4/main: scope/disabled до native GET, bound DHCP, explicit unknown/ambiguous default и адреса, ошибка источника не выдаётся за пустое состояние; forwarding не подтверждается." }, { "method": "GET", "path": "/api/sidebar-counts", "status": "mediated", "operations": [ "system.sidebar.counts.read" ], "reason": "Общий REST/MCP readSidebarCounts: SQL COUNT без DTO/привязок пользователей, global allow + все права источников, каталог до 100 серверов до native reads, coalescing, null/unknown отличается от zero, source interval и nonatomic snapshot; реальные SQL/permission/no-native-on-denial проверки." }, { "method": "GET", "path": "/api/statistics", "status": "mediated", "operations": [ "statistics.read" ], "reason": "Общий SQL-сервис статистики/pivot; MCP требует выбранный сервер и период до 31 дня, обновляет только его интерфейсы." }, { "method": "GET", "path": "/api/statistics/pivot", "status": "mediated", "operations": [ "statistics.pivot" ], "reason": "Общий SQL-сервис статистики/pivot; MCP требует выбранный сервер и период до 31 дня, обновляет только его интерфейсы." }, { "method": "GET", "path": "/api/system/database/backup", "status": "mediated", "operations": [ "database.backup" ], "reason": "Общий backup service/event: обязательное human approval, полный global/server scope, exclusive drain, bounded real pg_dump, private temporary libpq service file, encrypted signed receipt и download только JWT владельца; SQL/HTTP проверены." }, { "method": "GET", "path": "/api/traffic/bound-interfaces", "status": "mediated", "operations": [ "traffic.bindings.history.read" ], "reason": "Общий расчёт привязок по сохранённым samples: scoped user eligibility до JSON/метрик, user/server/binding pages, скрытые peer keys/comments, known zero/unknown, binding drift proof и отсутствие RouterOS/планов записи." }, { "method": "GET", "path": "/api/traffic/flow", "status": "mediated", "operations": [ "traffic.flow.talkers.read" ], "reason": "Общая REST/MCP проекция разговоров; серверная область применяется до SQL и pending, источник ограничен, глобальные runtime/host-поля не раскрываются." }, { "method": "GET", "path": "/api/traffic/flow/analytics", "status": "mediated", "operations": [ "traffic.flow.analytics.read" ], "reason": "Общий REST analytics engine в scoped режиме: сервер до SQL, topology без скрытых пользователей/ключей, обход общего кэша, bounded read и страницы, source/access/topology fences; retained данные и контекстные оценки скоростей явно разделены." }, { "method": "GET", "path": "/api/traffic/flow/clients", "status": "mediated", "operations": [ "traffic.flow.clients.read" ], "reason": "Общие REST/MCP readers: scope до SQL/агрегации и каталогов, hidden-binding exclusion, bounded pages/counters, наблюдаемые retained rows вместо выдуманных online/wire rates; клиентская attribution и coverage явно ограничены." }, { "method": "GET", "path": "/api/traffic/flow/exporters", "status": "mediated", "operations": [ "traffic.flow.exporters.read" ], "reason": "Общие REST/MCP readers: scope до SQL/агрегации и каталогов, hidden-binding exclusion, bounded pages/counters, наблюдаемые retained rows вместо выдуманных online/wire rates; клиентская attribution и coverage явно ограничены." }, { "method": "GET", "path": "/api/traffic/flow/host-files", "status": "mediated", "operations": [ "traffic.flow.hostFiles.export" ], "reason": "Общий REST builder файлов NetFlow; полный глобальный допуск и человеческий план создают зашифрованный owner-only артефакт. Ключи не возвращаются MCP; скачивание через JWT повторно проверяет credential/права/область/источник/подпись/hash/срок." }, { "method": "GET", "path": "/api/traffic/flow/host-status", "status": "mediated", "operations": [ "netflow.host.read" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/traffic/flow/live", "status": "mediated", "operations": [ "traffic.flow.live.read" ], "reason": "Ограниченное наблюдение через общий live-сервис REST/MCP: scope до источника, uncached выборки, отмена и отзыв доступа, общий лимит подписок и SQL/HTTP-приёмка." }, { "method": "GET", "path": "/api/traffic/flow/map-hops", "status": "mediated", "operations": [ "traffic.flow.map.read" ], "reason": "Общий REST map engine со scoped SQL/pending/topology, отказом от общего кэша/enrichment, проверками источника/настроек/доступа, лимитами и вложенными страницами; предполагаемые связи не выдаются за traceroute или forwarding proof." }, { "method": "GET", "path": "/api/traffic/flow/monthly", "status": "mediated", "operations": [ "traffic.flow.monthly.read" ], "reason": "Общие REST/MCP readers: scope до SQL/агрегации и каталогов, hidden-binding exclusion, bounded pages/counters, наблюдаемые retained rows вместо выдуманных online/wire rates; клиентская attribution и coverage явно ограничены." }, { "method": "GET", "path": "/api/traffic/flow/settings", "status": "mediated", "operations": [ "netflow.settings.read" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/traffic/flows", "status": "mediated", "operations": [ "traffic.flow.talkers.read" ], "reason": "Общая REST/MCP проекция разговоров; серверная область применяется до SQL и pending, источник ограничен, глобальные runtime/host-поля не раскрываются." }, { "method": "GET", "path": "/api/traffic/servers", "status": "mediated", "operations": [ "traffic.servers.history.read" ], "reason": "Общий REST/MCP reader сохранённой истории: scoped SQL/context до чтения, enabled каталог и страницы серверов, подтверждённый ноль/unknown masks, freshness, предел строк без частичных итогов, без RouterOS и observer writes." }, { "method": "GET", "path": "/api/traffic/servers/:id", "status": "mediated", "operations": [ "traffic.server.history.read" ], "reason": "Общий REST/MCP расчёт сервера/интерфейса по сохранённым counters; scoped SQL до разбора, disabled/stale/error не становятся текущим нулём, known volume отдельно от coverage, bounded range/rows, без опроса." }, { "method": "GET", "path": "/api/traffic/servers/:id/interfaces", "status": "mediated", "operations": [ "traffic.server.interfaces.read" ], "reason": "Общий REST/MCP интерфейсный reader за 24 часа: aggregate-only, nullable statusKnown/freshness, будущие samples исключены, страницы/предел строк, без current-state и forwarding claims." }, { "method": "GET", "path": "/api/traffic/servers/:id/live", "status": "mediated", "operations": [ "traffic.live.read" ], "reason": "Общий readTrafficLiveSample; MCP возвращает ограниченную серию до трёх срезов вместо бесконечного SSE. Полнота суммы, направление RX/TX, отзыв доступа и смена источника проверяются перед каждым новым native-запросом." }, { "method": "GET", "path": "/api/traffic/settings", "status": "mediated", "operations": [ "traffic.settings.read" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/traffic/users", "status": "mediated", "operations": [ "traffic.users.history.read" ], "reason": "Общий расчёт REST/MCP: eligibility/scope до SQL JSON, исключение пользователей со скрытыми привязками, страницы пользователей/серверов/привязок, явный subtotal, guarded global unbound, freshness и проверка drift без observer writes." }, { "method": "GET", "path": "/api/traffic/users/:id", "status": "mediated", "operations": [ "traffic.user.history.read" ], "reason": "Общий REST/MCP user-traffic builder с scoped SQL input вместо глобальной гидрации: nullable masks, peer-specific counters без вывода ключа, completeness выбранных источников, guards прав/server/binding proof." }, { "method": "GET", "path": "/api/uptime/overview", "status": "mediated", "operations": [ "uptime.overview.read" ], "reason": "Общий readUptimeOverview; SQL scope до samples/provenance, bounded pages/window, unknown вместо UI zeros, явный historical fallback, повторные source/probe/grant checks, только stored data без сетевых команд и секретов." }, { "method": "GET", "path": "/api/uptime/probes", "status": "mediated", "operations": [ "uptime.ping.probes.read" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/uptime/settings", "status": "mediated", "operations": [ "uptime.settings.read" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/uptime/sources/:id/interfaces", "status": "mediated", "operations": [ "uptime.ping.interfaces.read" ], "reason": "Общий reader/model интерфейсов: scope/disabled до native, effective disabled, unknown flag явно непригоден; пагинация и ошибки не подменяются пустым успехом." }, { "method": "GET", "path": "/api/uptime/speed-probes", "status": "mediated", "operations": [ "uptime.speed.probes.read" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/uptime/speed-test/endpoints/:id/interfaces", "status": "mediated", "operations": [ "uptime.speed.interfaces.read" ], "reason": "Общий reader/model с IPv4 address candidates, без выдуманных flags; bounded пагинация и адреса, неизвестное состояние видно отдельно." }, { "method": "GET", "path": "/api/uptime/speed-test/runs", "status": "mediated", "operations": [ "uptime.speed.runs.read" ], "reason": "Общий readSpeedHistoryRuns/mapSpeedHistoryRun; оба serverId ограничены в SQL до LIMIT/OFFSET и parser, стабильный порядок, unknown/zero сохранены." }, { "method": "GET", "path": "/api/users", "status": "mediated", "operations": [ "users.list" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/users/:id", "status": "mediated", "operations": [ "users.get" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "GET", "path": "/api/users/interface-catalog", "status": "mediated", "operations": [ "users.interfaces.read" ], "reason": "Общий сервис каталога с ограничениями серверов и типизированным MCP-ответом." }, { "method": "GET", "path": "/api/users/interface-catalog-state", "status": "mediated", "operations": [ "users.interfaces.state" ], "reason": "Общий сервис каталога с ограничениями серверов и типизированным MCP-ответом." }, { "method": "GET", "path": "/api/vxlan", "status": "mediated", "operations": [ "network.vxlan.state.read" ], "reason": "Общий REST polling/parser по выбранным серверам до HTTP; MCP использует safe observed DTO без key material, nullable flags/counters и явные failures. Пагинация каталогов и вложенных peers/VTEP/certificates, без обновления истории конфигурации или утверждения о forwarding." }, { "method": "GET", "path": "/api/wireguard", "status": "mediated", "operations": [ "network.wireguard.state.read" ], "reason": "Общий REST polling/parser по выбранным серверам до HTTP; MCP использует safe observed DTO без key material, nullable flags/counters и явные failures. Пагинация каталогов и вложенных peers/VTEP/certificates, без обновления истории конфигурации или утверждения о forwarding." }, { "method": "GET", "path": "/api/wireguard/revisions", "status": "mediated", "operations": [ "config.wireguard.revisions.read" ], "reason": "Общий listRevisions с REST: только метаданные, максимум 50 записей; серверная область и права проверяются до SQL, payload ревизии не выдаётся." }, { "method": "GET", "path": "/health", "status": "excluded", "operations": [], "reason": "Bootstrap/health авторизации интерфейса; бизнес-операция MCP отсутствует." }, { "method": "GET", "path": "/mcp", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "GET", "path": "/oauth/authorize", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "PATCH", "path": "/api/firewall/address-lists", "status": "mediated", "operations": [ "firewall.addressLists.toggle" ], "reason": "Общий REST/MCP address-list сервис: scoped ID, human plan, консервативные защиты зависимых правил, полный stable proof, отдельная проверка expiry window, shared locks/read-back/revision/no retry." }, { "method": "PATCH", "path": "/api/firewall/rules", "status": "mediated", "operations": [ "firewall.rules.toggle" ], "reason": "Общий REST/MCP сервис формы Firewall: человеческий sealed plan, scoped native ID, полный matcher/order proof, статическая цель, shared locks, read-back, отдельный статус ревизии и отсутствие retry." }, { "method": "PATCH", "path": "/api/gre/tunnels", "status": "mediated", "operations": [ "network.gre.update" ], "reason": "Общий REST/MCP GRE business executor: интерфейс и v4/v6 адреса, staged disabled, opaque native proof/dependencies, PSK purpose reference, protections/budget/locks, per-command read-back, partial/unknown без retry; SQL/HTTP проверены." }, { "method": "PATCH", "path": "/api/ipsec/peers/:serverId/:rosId", "status": "mediated", "operations": [ "network.ipsec.peers.update" ], "reason": "Общий REST/MCP peer PATCH всех REST-полей, same-value/native empty strings и history-only noop; certificate presence отклоняется. Native alias сохраняет comment и входит в общий private proof/intent/read-back/history. SQL/HTTP lost/ignored/collateral/reference mismatch/grant/protection/reconcile приняты; native rename gate остаётся отдельным." }, { "method": "PATCH", "path": "/api/ipsec/users/:serverId/:rosId", "status": "mediated", "operations": [ "network.ipsec.users.update" ], "reason": "Полный общий REST/MCP PATCH клиента: display name, static IPv4/pool reset, PSK reference, Remote ID/disabled, cert-only promotion/ignored fields, чужой mode-config upsert с consumer closure, история, полный private proof и staged ACK/read-back. Human/server/operation/protection guards и SQL/HTTP parity приняты; lost ACK не повторяется." }, { "method": "PATCH", "path": "/api/uptime/probes/:id", "status": "mediated", "operations": [ "uptime.ping.visibility.update" ], "reason": "Общий guarded updateProbeShowOnDashboard: scoped конфигурация, approval, защиты глобального probe ID, проверка drift/read-back без запуска сетевых измерений." }, { "method": "PATCH", "path": "/api/users/:id", "status": "mediated", "operations": [ "users.update", "users.permissions.update" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "PATCH", "path": "/api/wireguard/interfaces/:serverId/:rosId", "status": "mediated", "operations": [ "network.wireguard.interfaces.update" ], "reason": "Общий REST/MCP WireGuard PATCH: все поля, scoped key refs, rename peer/address ссылок, primary/secondary адреса, private dependency proof, actual byte limits, epoch ABA, intent/fences/read-back и exact VERIFIED reconcile без replay. Сторонние routing/firewall/application зависимости требуют отдельного плана; SQL/HTTP проверены, native readiness отдельно не заявляется." }, { "method": "PATCH", "path": "/api/wireguard/peers/:serverId/:rosId", "status": "mediated", "operations": [ "network.wireguard.peers.update", "ros.wireguard_peer.update" ], "reason": "Общий REST/MCP сервис изменения peer: зависимости, приватный proof, один PATCH, точный read-back и отдельная read-only сверка без повтора." }, { "method": "POST", "path": "/_internal/mcp/portal/revocations", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/alerts/outbox/:id/retry", "status": "mediated", "operations": [ "alerts.outbox.retry" ], "reason": "Общий REST/MCP повтор unknown: human approval, acknowledged duplicate risk, private row source proof under lock, CAS version/status and application protections; подтверждается только постановка в очередь." }, { "method": "POST", "path": "/api/alerts/telegram/test", "status": "mediated", "operations": [ "alerts.telegram.test" ], "reason": "Общий REST/MCP test payload и единственный guarded POST после человеческого подтверждения. Full global/server scope, owner/purpose secretRef, private proof и late fence; ack не delivery, reject/unknown без повтора, bounded response и запрет redirect." }, { "method": "POST", "path": "/api/backups/:id/restore", "status": "mediated", "operations": [ "backups.restore" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "POST", "path": "/api/backups/create", "status": "mediated", "operations": [ "backups.create" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "POST", "path": "/api/backups/storage/sync", "status": "mediated", "operations": [ "backups.storage.sync" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "POST", "path": "/api/backups/storage/test", "status": "mediated", "operations": [ "backups.storage.test" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "POST", "path": "/api/certificates/acme-settings/test", "status": "mediated", "operations": [ "certificates.acme.test" ], "reason": "Общий сервис REST/MCP, scoped источники и защиты, человеческое подтверждение, intent/read-back или безопасный human-only artifact, SQL/HTTP-приёмка и сверка без replay." }, { "method": "POST", "path": "/api/certificates/issue", "status": "mediated", "operations": [ "certificates.issue" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "POST", "path": "/api/certificates/refresh", "status": "mediated", "operations": [ "certificates.state.read" ], "reason": "Общий REST/MCP источник сертификатов с проверкой schema и clock offset; refresh только повторяет чтение без записи. Область до опроса, unknown в MCP, native keys исключены; HTTP/SQL parity и malformed failure проверены." }, { "method": "POST", "path": "/api/events/batch", "status": "mediated", "operations": [ "events.batch.append" ], "reason": "Общий REST/MCP client batch insert: все поля и payload, server UUID, human approval/full global scope, bounded encrypted plan, atomic insert и exact VERIFIED read-only global/portal reconcile; lost acknowledgement/tamper/late pause/protection не повторяются. Это записи журнала, не доказательства системных действий." }, { "method": "POST", "path": "/api/evobgp/catalog", "status": "mediated", "operations": [ "evobgp.catalog.read" ], "reason": "Общие parser/formatter и distinct server counts, полный эффективный scope до HTTP/SQL, credentials только из БД, bounded GET без redirects, пагинация всех коллекций с fingerprint и сохранением неизвестных счётчиков." }, { "method": "POST", "path": "/api/evobgp/test", "status": "mediated", "operations": [ "evobgp.connection.check" ], "reason": "Общий ограниченный modules GET; MCP принимает сохранённый ключ или owner/destination-bound secret reference вместо открытого секрета. Полная серверная область проверяется до HTTP, результат не отражает upstream payload и не сохраняет настройки." }, { "method": "POST", "path": "/api/filters/revisions/:id/restore", "status": "mediated", "operations": [ "filters.revision.restore" ], "reason": "Общий guarded applyFiltersToServer; scoped filters revision/checksum повторно проверяются после approval, те же зависимости/защиты и native/DB/revision read-back, human only." }, { "method": "POST", "path": "/api/firewall/address-lists", "status": "mediated", "operations": [ "firewall.addressLists.create" ], "reason": "Общий REST/MCP address-list сервис: scoped ID, human plan, консервативные защиты зависимых правил, полный stable proof, отдельная проверка expiry window, shared locks/read-back/revision/no retry." }, { "method": "POST", "path": "/api/firewall/revisions/:id/restore", "status": "mediated", "operations": [ "firewall.revision.restore" ], "reason": "Общий строгий REST/MCP restore: scoped revision fingerprint, full native proof, точный static порядок/дубликаты, staged disabled preparation, per-command read-back, защиты/бюджет/locks и no retry." }, { "method": "POST", "path": "/api/firewall/rules", "status": "mediated", "operations": [ "firewall.rules.create" ], "reason": "Общий REST/MCP сервис формы Firewall: человеческий sealed plan, scoped native ID, полный matcher/order proof, статическая цель, shared locks, read-back, отдельный статус ревизии и отсутствие retry." }, { "method": "POST", "path": "/api/firewall/rules/move", "status": "mediated", "operations": [ "firewall.rules.move" ], "reason": "Общий moveFirewallRule: точные ID/порядок и все matcher-поля без счётчиков, static source/destination, sealed человеческий план, защиты всей таблицы/сервера, fingerprint перед POST, read-back, без retry и явное состояние сохранения ревизии." }, { "method": "POST", "path": "/api/geoip/update", "status": "mediated", "operations": [ "geoip.update" ], "reason": "Общий сервис REST/MCP, scoped источники и защиты, человеческое подтверждение, intent/read-back или безопасный human-only artifact, SQL/HTTP-приёмка и сверка без replay." }, { "method": "POST", "path": "/api/gre/revisions/:id/restore", "status": "mediated", "operations": [ "network.gre.revision.restore" ], "reason": "Общий строгий REST/MCP GRE restore: весь раздел и IPv4/IPv6 адреса, зависимости и защиты, отключение перед адресами, приватные proof/PSK, human approval, поштучный read-back и отказ без повторной записи." }, { "method": "POST", "path": "/api/gre/tunnels", "status": "mediated", "operations": [ "network.gre.create" ], "reason": "Общий REST/MCP GRE business executor: интерфейс и v4/v6 адреса, staged disabled, opaque native proof/dependencies, PSK purpose reference, protections/budget/locks, per-command read-back, partial/unknown без retry; SQL/HTTP проверены." }, { "method": "POST", "path": "/api/ipsec/certs/:serverId/export", "status": "mediated", "operations": [ "network.ipsec.existing-certificates.export" ], "reason": "Общий REST/MCP executor существующего сертификата: оба selector и все роли, явный private/CA intent, human MCP plan, actor/key no-replay, exact owned file/read/cleanup, encrypted owner-only artifact/TTL; синтетическая SQL/HTTP/portal и browser приёмка. Native CHR отдельно." }, { "method": "POST", "path": "/api/ipsec/revisions/:id/restore", "status": "mediated", "operations": [ "network.ipsec.revisions.restore" ], "reason": "Общий REST/MCP revision restore: strict fingerprint/schema, private whole-state proof, PKI/profile/policy/pool dependencies, exact clears, human approval и read-back без replay. Утраченные PKI ключи не генерируются." }, { "method": "POST", "path": "/api/ipsec/server/init", "status": "mediated", "operations": [ "network.ipsec.server.init" ], "reason": "Общий REST/MCP init: полная форма, raw dependency closure, подпись только новых ACK-owned сертификатов, human approval, per-command fences/read-back и обязательная история." }, { "method": "POST", "path": "/api/ipsec/users", "status": "mediated", "operations": [ "network.ipsec.users.create" ], "reason": "Full shared guarded client creation, purpose-bound secret refs, human-approved encrypted PKCS12 artifact and owner portal; private export separately authorized" }, { "method": "POST", "path": "/api/ipsec/users/:serverId/:rosId/cert", "status": "mediated", "operations": [ "network.ipsec.existing-certificates.export" ], "reason": "Общий REST/MCP executor существующего сертификата: оба selector и все роли, явный private/CA intent, human MCP plan, actor/key no-replay, exact owned file/read/cleanup, encrypted owner-only artifact/TTL; синтетическая SQL/HTTP/portal и browser приёмка. Native CHR отдельно." }, { "method": "POST", "path": "/api/mcp/connections", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/connections/:id/check", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/connections/:id/grants", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/connections/:id/revalidate", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/connections/:id/rotate", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/connections/:id/status", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/database/archives", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/database/plan", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/devices/:serverId/:resource/plan", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/management-channels", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/oauth/clients", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/oauth/consent", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/operations/:id/reconcile", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/operations/:id/recover", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/pause", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/plans/:id/apply", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/plans/:id/decision", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/policy/preview", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/protections", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/routing-profiles/:id/check", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/routing-profiles/:id/pause", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/routing-profiles/plan", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/secrets", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/mcp/stop-automation", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/api/network/resolve-hosts", "status": "mediated", "operations": [ "network.hosts.resolve" ], "reason": "Общий bounded resolveNetworkHosts: явный global grant и network-write как в REST, IPv4/DNS/IDN validation, IPv6 literal без DNS как unsupported, дедупликация, TTL/cache/pending/deadline caps, stage access/cancel fences и различение manager resolver от RouterOS/path proof." }, { "method": "POST", "path": "/api/recursive-routes/revisions/:id/restore", "status": "mediated", "operations": [ "routing.recursive.revision.restore" ], "reason": "Общий applyRecursiveToServer/executeRecursiveApply с REST: scoped revision/fingerprint, максимум 50 маршрутов, effective properties, зависимости фильтров/таблиц/интерфейсов, полный бюджет create+delete+metadata и read-back native/revision." }, { "method": "POST", "path": "/api/scheduler/jobs/:jobKey/run-now", "status": "mediated", "operations": [ "scheduler.run" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "POST", "path": "/api/scheduler/refresh", "status": "mediated", "operations": [ "scheduler.refresh" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "POST", "path": "/api/servers", "status": "mediated", "operations": [ "servers.create" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "POST", "path": "/api/servers-api-ping/collect-now", "status": "mediated", "operations": [ "servers.api-ping.collect" ], "reason": "Общий полный manual executor REST/MCP: все включённые устройства, samples/partition maintenance/settings и отложенный глобальный alert engine. GLOBAL + весь каталог, человеческий план, явный skipped при busy, audit/idempotency и no replay; SQL/HTTP приёмка пройдена без реальных уведомлений." }, { "method": "POST", "path": "/api/servers/:id/containers/remove", "status": "mediated", "operations": [ "containers.remove" ], "reason": "Общий removeContainer/removeStoppedContainer с REST: fresh stopped-only, идентичность конфигурации/интерфейса, защиты родителя и подтверждение удаления. Native delete alias использует тот же план." }, { "method": "POST", "path": "/api/servers/:id/containers/restart", "status": "mediated", "operations": [ "containers.restart" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "POST", "path": "/api/servers/:id/containers/start", "status": "mediated", "operations": [ "containers.start" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "POST", "path": "/api/servers/:id/containers/stop", "status": "mediated", "operations": [ "containers.stop" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "POST", "path": "/api/servers/:id/exec", "status": "mediated", "operations": [ "servers.terminal.read" ], "reason": "Общий REST/MCP allowlist терминальной диагностики: 15 типизированных сценариев, все aliases и форматирование, прежнее servers:write право, полный scope/epoch до credentials, bounded transport/output и отзыв между запросами. SQL/REST parity подтверждена; произвольные CLI-команды не принимаются." }, { "method": "POST", "path": "/api/servers/:id/ospf/optimize", "status": "mediated", "operations": [ "routing.ospf.application.optimize" ], "reason": "Общий legacy REST ranker/apply; human-only полный каталог, private source/prefix proofs, native dispatch/read-back и отдельное восстановление." }, { "method": "POST", "path": "/api/servers/:id/ospf/optimize/preview", "status": "mediated", "operations": [ "routing.ospf.application.preview" ], "reason": "Общий REST/MCP reader рейтинга приложения; peer scope и probes отсекаются SQL до чтения, latest aggregate traffic требует известной дельты. MCP разделяет modeled/observed, ограничивает страницы/peers, повторно проверяет доступ/источник перед GET/POST и отменяет HTTP при остановке. Preview не создаёт план и не заменяет строгий family/VRF-aware optimizer." }, { "method": "POST", "path": "/api/servers/:id/poll", "status": "mediated", "operations": [ "servers.poll" ], "reason": "Полный human-approved servers.poll: исходный sealed допуск и actual operation ID, общий снимок/обслуживание истории, quota-bound durable журнал, сохранённая квитанция без повтора native. UI REST-обработчик сохранён; retained admission limits MCP применяются отдельно." }, { "method": "POST", "path": "/api/servers/:id/probes/run", "status": "mediated", "operations": [ "servers.probes.run" ], "reason": "Общий v2 service executor для всех6 диагностик: REST JWT/local и MCP human plan, durable stages/receipts, общие квоты, текущие права, отмена и bounded retention; публичная регистрация и SQL/HTTP/DNS приёмка проверены." }, { "method": "POST", "path": "/api/servers/test-connection", "status": "mediated", "operations": [ "servers.test-connection" ], "reason": "Общий REST/MCP сервис принят SQL/HTTP: права и human approval, private source fences, bounded transport, точная семантика, partial/unknown без повторов; сетевой forwarding не заявляется." }, { "method": "POST", "path": "/api/system/database/restore", "status": "mediated", "operations": [ "database.restore" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "POST", "path": "/api/traffic/collect-now", "status": "mediated", "operations": [ "traffic.collect" ], "reason": "Полный общий REST/MCP executor: GLOBAL и весь каталог, человеческий план, штатные samples/settings/locks и глобальный alert hook. SQL/HTTP приёмка на одноразовой БД/localhost; busy/partial/unknown без автоматического повтора, квитанция не подтверждает доставку уведомлений." }, { "method": "POST", "path": "/api/traffic/flow-overlay", "status": "mediated", "operations": [ "traffic.flow.overlay.apply" ], "reason": "Общий сервис REST/MCP, scoped источники и защиты, человеческое подтверждение, intent/read-back или безопасный human-only artifact, SQL/HTTP-приёмка и сверка без replay." }, { "method": "POST", "path": "/api/traffic/flow/host-reconcile", "status": "mediated", "operations": [ "netflow.host.reconcile" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "POST", "path": "/api/traffic/flow/overlay", "status": "mediated", "operations": [ "traffic.flow.overlay.apply" ], "reason": "Общий сервис REST/MCP, scoped источники и защиты, человеческое подтверждение, intent/read-back или безопасный human-only artifact, SQL/HTTP-приёмка и сверка без replay." }, { "method": "POST", "path": "/api/traffic/flow/purge", "status": "mediated", "operations": [ "traffic.flow.purge" ], "reason": "Полный общий REST/MCP сценарий: human/global scope, acknowledged drain всех retiring workers, транзакционная очистка, сохранение настроек/ключей/peers, утверждённый partition inventory/budget, journal/restart, SQL/HTTP-приёмка и unknown без replay." }, { "method": "POST", "path": "/api/traffic/flow/rebuild-facts", "status": "mediated", "operations": [ "traffic.flow.facts.rebuild" ], "reason": "Общий REST/MCP rebuild: обязательное human/global/full-server подтверждение, строгий drain существующих writers, атомарные кубы/событие/квитанция, source/protection guards и отдельная read-only сверка без replay. Принят на настоящей временной SQL-базе через MCP и JWT REST; живой worker отдельно не запускался." }, { "method": "POST", "path": "/api/traffic/flow/settings/generate-keys", "status": "mediated", "operations": [ "traffic.flow.settings.generate-keys" ], "reason": "Shared full-config CAS, single-use durable receipt, human approval; public key only, no collector or host apply" }, { "method": "POST", "path": "/api/uptime/collect-now", "status": "mediated", "operations": [ "uptime.collect" ], "reason": "Полный общий REST/MCP executor: GLOBAL и весь каталог, человеческий план, штатные samples/settings/locks и глобальный alert hook. SQL/HTTP приёмка на одноразовой БД/localhost; busy/partial/unknown без автоматического повтора, квитанция не подтверждает доставку уведомлений." }, { "method": "POST", "path": "/api/uptime/probes/collect-group", "status": "mediated", "operations": [ "uptime.ping.group.collect" ], "reason": "Полный общий REST/MCP executor: GLOBAL и весь каталог, человеческий план, штатные samples/settings/locks и глобальный alert hook. SQL/HTTP приёмка на одноразовой БД/localhost; busy/partial/unknown без автоматического повтора, квитанция не подтверждает доставку уведомлений." }, { "method": "POST", "path": "/api/uptime/speed-test", "status": "mediated", "operations": [ "uptime.speed.test" ], "reason": "Обычный RouterOS bandwidth-test через общий speed-сервис: MCP проверяет оба server scope, человеческое подтверждение, срок и лимит нагрузки; общие блокировки, аудит и стандартная история. Без отдельного реестра узлов, ключей и Docker-окон; no replay при unknown." }, { "method": "POST", "path": "/api/users", "status": "mediated", "operations": [ "users.create" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "POST", "path": "/api/users/:id/bindings", "status": "mediated", "operations": [ "users.binding_add" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "POST", "path": "/api/wireguard/export", "status": "mediated", "operations": [ "network.wireguard.export" ], "reason": "Общий REST/MCP export для rsc/conf/peer-conf: явный private-key opt-in, human approval, зашифрованный файл на 15 минут только владельцу через JWT; модель получает квитанцию. Полная SQL/HTTP-проверка форматов, обоих ID пира, source/grant/checkpoint и tamper; неоднозначное или невоспроизводимое состояние отклоняется." }, { "method": "POST", "path": "/api/wireguard/import", "status": "mediated", "operations": [ "network.wireguard.import.preview", "network.wireguard.import" ], "reason": "Общий REST/MCP импорт .rsc/.conf: owner/purpose/server contentRef, скрытые ключи, disabled preparation и selective activation всех peers/address/interface, отдельные object refs и полный command budget, per-command durable intent/fence/read-back, prefix checkpoint, exact VERIFIED reconcile; partial/unknown без автоматического повтора или компенсации." }, { "method": "POST", "path": "/api/wireguard/interfaces", "status": "mediated", "operations": [ "network.wireguard.interfaces.create" ], "reason": "Общий сервис REST/MCP, scoped источники и защиты, человеческое подтверждение, intent/read-back или безопасный human-only artifact, SQL/HTTP-приёмка и сверка без replay." }, { "method": "POST", "path": "/api/wireguard/peers", "status": "mediated", "operations": [ "network.wireguard.peers.create" ], "reason": "Общий REST/MCP peer create и native alias: полная форма, существующий parent/dependencies, secret refs, staged disabled, per-command fences/read-back, exact verified checkpoint, partial/unknown без retry; SQL/HTTP проверены." }, { "method": "POST", "path": "/api/wireguard/revisions/:id/restore", "status": "mediated", "operations": [ "config.wireguard.revisions.restore" ], "reason": "Общий REST/MCP whole-section restore: строгая ревизия, encrypted desired keys, полный dependency inventory, staged disable, exact clears, per-command fences и read-back без replay." }, { "method": "POST", "path": "/mcp", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/oauth/revoke", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "POST", "path": "/oauth/token", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "PUT", "path": "/api/alerts/rules", "status": "mediated", "operations": [ "alerts.replace" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "PUT", "path": "/api/alerts/telegram", "status": "mediated", "operations": [ "alerts.telegram.update" ], "reason": "Общий guarded REST/MCP selective-update сервис; полный global/server scope, человеческий план, owner/purpose secretRef или явное очищение, private source/reference proof, проверки перед записью и read-back. Сообщения не отправляются." }, { "method": "PUT", "path": "/api/backups/schedule", "status": "mediated", "operations": [ "backups.schedule.update" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "PUT", "path": "/api/backups/storage", "status": "mediated", "operations": [ "backups.storage.update" ], "reason": "Общий REST updateBackupStorageSettings: глобальный человеческий план, полный каталог серверов/защиты, owner/destination-bound secretRef вместо literal secret, keyed credential proof, защита S3-архивов и занятости, полная проверка конфигурации/сохранённого ключа, partial при несовпадении и idempotency. Настройка не объявляется проверкой доступности S3." }, { "method": "PUT", "path": "/api/certificates/acme-settings", "status": "mediated", "operations": [ "certificates.acme.update" ], "reason": "Общий REST/MCP settings executor: owner/purpose secret refs, full global scope, human approval, bounded private SQL/source proof, CAS/read-back, verified exact receipt и no replay; SQL/HTTP проверены." }, { "method": "PUT", "path": "/api/certificates/renew-settings", "status": "mediated", "operations": [ "certificates.renew.update" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "PUT", "path": "/api/evobgp/settings", "status": "mediated", "operations": [ "evobgp.settings.update" ], "reason": "Общий guarded writeEvoBgpSettings/schema; подтверждение человеком, URL-bound opaque secret вместо ключа, явное удаление ключа, fingerprint всех настроек и полного каталога, read-back включая ключ без его выдачи." }, { "method": "PUT", "path": "/api/filters/rules", "status": "mediated", "operations": [ "filters.rules.replace" ], "reason": "Общий guarded applyFiltersToServer: human approval, совместные filters/network/BGP права, HMAC источника и routing dependencies, server-wide protections, безопасный compiler, native read-back до metadata/revision, без удаления чужих правил и автоматического повтора." }, { "method": "PUT", "path": "/api/firewall/address-lists", "status": "mediated", "operations": [ "firewall.addressLists.update" ], "reason": "Общий REST/MCP address-list сервис: scoped ID, human plan, консервативные защиты зависимых правил, полный stable proof, отдельная проверка expiry window, shared locks/read-back/revision/no retry." }, { "method": "PUT", "path": "/api/firewall/rules", "status": "mediated", "operations": [ "firewall.rules.update" ], "reason": "Общий REST/MCP сервис формы Firewall: человеческий sealed plan, scoped native ID, полный matcher/order proof, статическая цель, shared locks, read-back, отдельный статус ревизии и отсутствие retry." }, { "method": "PUT", "path": "/api/geoip", "status": "mediated", "operations": [ "geoip.settings.update" ], "reason": "Общий schema/updateGeoipSettings и refreshScheduler; защищённый human-approved план, полный каталог зависимостей, fingerprint конфигурации без observer metadata и read-back сохранённых полей." }, { "method": "PUT", "path": "/api/internet-path/settings", "status": "mediated", "operations": [ "internet-path.settings.update" ], "reason": "Общий сервис настроек коллектора; полная область серверов, защита зависимостей, подтверждённый план и проверка сохранения." }, { "method": "PUT", "path": "/api/logs/settings", "status": "mediated", "operations": [ "logs.settings.update" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "PUT", "path": "/api/mcp/connections/:id", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "PUT", "path": "/api/mcp/settings", "status": "excluded", "operations": [], "reason": "Управление самим MCP, транспорт или машинная авторизация: отдельного AI-инструмента нет." }, { "method": "PUT", "path": "/api/recursive-routes", "status": "mediated", "operations": [ "routing.recursive.routes.replace" ], "reason": "Общий applyRecursiveToServer для полного apply/copy набора до 50 строк: человеческий план, стоимость create+delete+metadata, sealed native/DB/filter proof, устойчивые ID, проверка зависимостей и каждого нового/удаляемого маршрута, независимый native/cache/revision read-back и отсутствие повторов при partial/unknown." }, { "method": "PUT", "path": "/api/servers-api-ping/settings", "status": "mediated", "operations": [ "servers.api-ping.settings.update" ], "reason": "Общий сервис настроек коллектора; полная область серверов, защита зависимостей, подтверждённый план и проверка сохранения." }, { "method": "PUT", "path": "/api/servers/:id", "status": "mediated", "operations": [ "servers.update" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "PUT", "path": "/api/traffic/flow/settings", "status": "mediated", "operations": [ "netflow.settings.update" ], "reason": "Full 10-field shared CAS and fenced main/worker lifecycle, global store/RIPE scope, human approval and durable two-phase receipt; readiness separate" }, { "method": "PUT", "path": "/api/traffic/settings", "status": "mediated", "operations": [ "traffic.settings.update" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "PUT", "path": "/api/uptime/probes", "status": "mediated", "operations": [ "uptime.ping.probes.replace" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "PUT", "path": "/api/uptime/settings", "status": "mediated", "operations": [ "uptime.settings.update" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." }, { "method": "PUT", "path": "/api/uptime/speed-probes", "status": "mediated", "operations": [ "uptime.speed.probes.replace" ], "reason": "Типизированный MCP-адаптер этого сервисного сценария; применяются собственные scopes, лимиты, проверка зависимостей и подтверждение записи." } ] }