Сейчас у нас, как и почти везде, идёт переход на ИИ: каждому сотруднику пытаются выдать своего ИИ-агента. Очень быстро выяснилось, что раздать агентов — полдела. Дальше начинается управление ими: кто агенту говорит, что ему можно, откуда он знает, как устроена компания, и кто отвечает на его вопросы, когда он упирается в стену.
У нас на этом месте оказался я — единственный администратор примерно на 60 сотрудников. Агенты сотрудников писали мне письма, я пересылал их своему агенту и отправлял ответ обратно. Пользователи шутят, что мы стали прокладками между несколькими ИИ.
В статье — как мы пришли к профильному ИТ-суперагенту, как он устроен внутри (MCP, два RAG-источника, права, проверки на серверах, эскалация в мессенджер) и на какие грабли наступили. Это не продукт и не реклама — рабочий прототип, который сейчас крутится в пилоте.
Что пробовали до этого
Сначала делали агентов под конкретные задачи. Каждый раз оказывалось, что не учтены нюансы, о которых знает только конкретный исполнитель. Допиливание растягивалось надолго.
Потом решили, что сотрудники будут собирать агентов сами. Взяли Paperclip — платформу в духе «компания из агентов»: агент-аналитик помогает создавать других агентов, у него инструкции и доступ к базе знаний компании, а над всеми — агент-«гендиректор». Не взлетело по двум причинам. Создание агента — трудоёмкая штука: я на своих потратил кучу времени и до сих пор их доделываю, а сотрудники просто не понимали, как это делать. И сам Paperclip оказался для меня слишком непрозрачным: что-то происходит за кулисами, агенты зацикливаются, уходят решать задачи, не связанные с исходной. Токены уходят, результата часто нет.
Claude Code сотрудникам и две проблемы
Дальше пошли проще. У нас было несколько сотрудников, которые давно и грамотно работали с ИИ в вебе. Им выдали Claude Code с преднастроенными инструкциями и доступом к инфраструктуре на чтение: аналитика и задачи, 1С, CRM, сайты, почта.
Сначала всё жило на виндовом терминальном сервере. Я как администратор видел их профили и мог своим Claude поправить им инструкции, разрешения, режимы — фактически управлял их агентами. Но два-три человека с несколькими сессиями Claude быстро съели всю оперативку терминала. Выделять каждому виртуалку мы не стали: всё давно ушло в веб, люди работают с домашних машин через VPN. Агенты переехали туда же.
И появились две проблемы:
Централизованное управление пропало. Доступа к их md-файлам и конфигам Claude на домашних компьютерах у меня нет.
Админ-прокладка. Агент сотрудника не находит что-то в инфраструктуре или ему не хватает прав — он пишет мне письмо. Я отдаю письмо своему Claude, который знает, как всё устроено, он готовит ответ для агента сотрудника, я пересылаю.
Идея: профильный суперагент
Сеть агентов — идея не новая. Но в мультиагентных платформах всё замкнуто в одной программе. Мне хотелось наоборот: у каждого сотрудника свой агент, любой, а в компании есть профильный суперагент, к которому эти агенты обращаются.
Почему именно профильный. ИИ учился на теории — на том, что нашёл в интернете. Он применяет лучшие практики без практики. В реальной работе лучшие практики всегда идут с добавками реальности: особенностями конкретной инфраструктуры, историей, договорённостями. Поэтому, когда непрофильный человек решает задачу с ИИ, часто получается «всё по учебнику, а результат не тот». Суперагент — это место, где на лучшие практики накладывается опыт конкретной компании. Суперагенты, по идее, должны быть по направлениям: ИТ, юристы, маркетинг. Начал я, понятно, с ИТ.

Как устроено
Прототип — около 4 тысяч строк на Python, FastAPI + MCP, SQLite в режиме WAL. Собирал несколько дней, в паре с Claude Code. Крутится на внутреннем сервере за nginx, снаружи доступен только через VPN.
Подключение: MCP поверх HTTP
Суперагент — обычный HTTP-сервис, а для агентов сотрудников он выглядит как MCP-сервер (streamable HTTP). Сотрудник подключает его одной командой с личным токеном:
claude mcp add --transport http superagent https://<внутренний-адрес>/superagent/mcp \ --header "Authorization: Bearer <личный-токен>"
После этого у агента появляются инструменты:
Инструмент | Зачем |
|---|---|
ask | детали инфраструктуры: серверы, адреса, службы, базы |
get_instructions | правила работы и права сотрудника на задачу |
inspect | проверка факта на сервере: диск, службы, журнал, размеры баз |
consult | беседа, когда нужно решение администратора |
check | забрать ответ администратора |
Агенту без разницы, что внутри, а суперагенту без разницы, какой у сотрудника агент. Сейчас это Claude Code, но MCP понимают и другие клиенты.
Централизованное управление — одним файлом
Это решило первую проблему. Правила для агентов лежат в одном markdown-файле на стороне суперагента. MCP-сервер отдаёт их в instructions при подключении, и они же приходят в каждом ответе. Поправил файл, перезапустил сервис — поменялось поведение всех подключённых агентов, где бы они ни работали.
Со стороны сотрудника в его CLAUDE.md достаточно пары строк вроде:
Факты по инфраструктуре — superagent.ask, права на задачу — superagent.get_instructions. Если нужно спросить администратора (нет данных, нужен доступ, решение) — superagent.consult. Изменения в пределах прав выполняй сам.
Знания: два RAG-источника
Суперагент отвечает не «из головы» модели, а из двух баз знаний.
Первая — административная: каталог серверов, который я веду для своего Codex/Claude. По папке на сервер, внутри meta, os, software, configs, network, changes, notes. Каталог синхронизируется через GitLab, суперагент держит зеркало и раскладывает его в отдельную векторную таблицу: около 570 файлов, порядка 940 фрагментов, разбиение по заголовкам с перекрытием. Полная индексация на CPU — минут девять, дальше инкрементально по хешам файлов, раз в 10 минут.
Отдельная таблица — не случайность. Админские знания живут своим циклом (меняются каждый день вместе с инфраструктурой) и фильтруются по правам до фрагмента: сотрудник никогда не получит кусок описания сервера, которого он не видит.
Вторая — общая корпоративная база знаний компании на pgvector: регламенты, описания процессов, инструкции. Суперагент берёт из неё ИТ-область и добавляет к ответу вместе с источниками. Доступна она тоже не всем, а только ролям с широкой видимостью.
Поиск по админской части гибридный: SQLite FTS5 плюс эмбеддинги (локальная Ollama), результаты сливаются через RRF. На каждый вопрос агент сотрудника получает отобранные фрагменты с указанием, откуда они взяты, — так ответ можно проверить, а не верить на слово.
Файл с доступами (access.md) в индекс не попадает вообще. Из него суперагент берёт только хост и порт. Логины и ключи он не выдаёт и не хранит: у каждого сотрудника свои учётки, и всё, что он делает, записывается на него.
На обычные вопросы — без LLM
Неочевидная, но очень полезная вещь. На ask и get_instructions суперагент модель не вызывает. Код проверяет права, отбирает из реестра только то, что сотруднику видно, и отдаёт агенту контекст плюс правила. Формулирует ответ уже агент сотрудника — на своей подписке.
У каждого сотрудника своя подписка Claude. LLM на стороне суперагента нужна только там, где надо подумать: беседа consult и разбор ответов администратора. Так быстрее и не съедает общий лимит.
Права проверяет код
Сотрудники в группах, у групп — гранты на серверы (имя, IP или маска вроде 1c-*):
Уровень | Что можно |
|---|---|
0 | сервер невидим — нет ни в ответах, ни в поиске |
1 read | чтение, диагностика |
2 operate | перезапуск |
3 change | конфиги, установка |
4 admin | firewall, удаление |
Плюс личные гранты со сроком — «дежурство на неделю». Модель в проверке прав не участвует, поэтому уговорить её бесполезно. Нет прав — агент получает «доступ запрещён, обратитесь к администратору». Сразу оговорюсь про слабое место: тип действия в запросе пока определяется по ключевым словам. Для пилота это терпимо, потому что у сотрудников только чтение, а всё, что они меняют, они меняют сами под своими учётками.
LLM без рук
Модель на стороне суперагента запускается вообще без инструментов: claude -p с пустым списком tools, без MCP, в отдельном рабочем каталоге с запретом всего. Зайти на сервер или выполнить команду она не может.
Если в беседе ей нужно что-то проверить, она возвращает в JSON-ответе просьбу вида {"inspect": [{"server": "...", "check": "disk"}]}. Выполняет код — с правами того сотрудника, который ведёт беседу, не больше трёх проверок за ответ и не больше двух раундов. Результат возвращается модели следующим сообщением.
Сами проверки ограничены ещё и на серверах. Там заведена учётка без sudo, а её ключ привязан к одной команде:
command="/usr/local/bin/sa-inspect",no-port-forwarding,no-pty,no-agent-forwarding,from="<IP суперагента>" ssh-ed25519 AAAA...
sa-inspect понимает только имена проверок из белого списка: disk, mem, svc, journal, pg-dbs, pg-activity, my-processlist и т. п., с валидацией аргументов и ограничением вывода. Роли в БД — pg_monitor в PostgreSQL и PROCESS без SELECT в MariaDB: статистика есть, данных нет. Даже если ключ утечёт, выполнить произвольную команду с ним не выйдет.
Администратор — одной кнопкой
Это решило вторую проблему. consult — многоходовая беседа агента сотрудника с суперагентом. Каждый ответ модели — один из статусов: answered, need_info, escalate, resolved. В большинстве случаев они договариваются сами.
При escalate мне в Яндекс Мессенджер приходит готовый вопрос: что просят, зачем, что суперагент предлагает, и кнопки ✅ / ❌. Нажал — решение ушло в беседу, агент сотрудника забирает его через check. Если отвечаю текстом, его разбирает отдельный LLM-помощник и превращает в решение или сообщение агенту. Обо всём, что решилось без меня, в 19:00 приходит дайджест.

Безопасность и журнал
Прозрачность — то, чего мне не хватило в Paperclip, — закладывал с первого дня:
журнал всех вызовов: кто, что спросил, что получил, какие проверки, решения администратора; хранится 90 дней;
аудит всех изменений прав (кто, когда, через что: CLI, админка или бот) — в той же транзакции, что и изменение;
маскирование секретов в контексте, ответах и журнале;
детектор ПДн: телефоны, email, ИНН и СНИЛС с проверкой контрольных сумм, карты по Луну, паспорт рядом со словом «паспорт». Больше 10 записей в ответе — маскирование, больше 50 или любые карты/паспорта — сигнал мне;
сигналы: всплеск запросов относительно обычного поведения сотрудника, серия отказов по правам, «выгрузи всех клиентов» /
pg_dump/SELECT *безWHERE, просьбы паролей, попытки prompt injection, ночные обращения к проду;квоты на сотрудника и на сам суперагент; если не удалось проверить лимит — отказ, а не «авось».
Почему так строго: агент сотрудника работает на домашнем компьютере, а «только чтение» базы — это тоже возможность всё слить. Заодно, пока внедряли, нашли у себя несколько старых дыр в инфраструктуре. Часть закрыли, часть в плане.
Где я ошибся в идее
Главной фишкой я считал проверку планов: агент сотрудника готовит план, суперагент правит его с учётом реальности, агент выполняет — как будто им руководит профильный специалист. Метод review_plan был готов в первый же день.
В пилоте его убрали из MCP. У сотрудников права только на чтение — проверять нечего. А мне ревьюить собственные планы своим же агентом бессмысленно. Метод остался в REST как «второе мнение по запросу». Подозреваю, что для юристов и маркетинга он вернётся, но пока это открытый вопрос.
Что пригодится, если будете делать похожее
Несколько вещей, на которые я потратил время и которые можно не повторять.
Длинные ответы — асинхронно, и поднимите таймаут клиента
Ответ суперагента с LLM может идти до двух минут, а у Claude Code таймаут на вызов MCP-инструмента короче. Клиент обрывает вызов, сервер ответ дописывает и сохраняет, но агент сотрудника его уже не получит. Снаружи это выглядит как «суперагент молчит».
Два вывода. Первый — таймаут на клиенте поднимается переменной окружения в ~/.claude/settings.json:
{ "env": { "MCP_TOOL_TIMEOUT": "330000" } }
Второй, важнее: всё долгое лучше сразу делать асинхронно. У меня так устроена пара consult / check: беседа живёт на сервере, и даже если вызов оборвался или ответ ждёт решения администратора, агент заберёт его следующим check. Ничего не теряется.
Внутренний сервис по HTTPS: Claude Code не доверяет самоподписанному сертификату
Claude Code — это Node.js, и самоподписанный сертификат сервера он не примет. Правильный путь — выпустить сертификат от корпоративного CA и сказать клиенту, что этому CA можно доверять:
{ "env": { "NODE_EXTRA_CA_CERTS": "/Users/you/.claude/company-ca.crt" } }
Если своего CA в компании нет, его можно поднять за пару минут — для внутреннего сервиса этого достаточно:
# корневой CA (ключ храните отдельно и с правами 600) openssl req -x509 -new -nodes -newkey rsa:4096 -days 3650 \ -keyout ca.key -out ca.crt -subj "/CN=Company Internal CA" # сертификат сервиса, подписанный этим CA openssl req -new -nodes -newkey rsa:2048 \ -keyout server.key -out server.csr -subj "/CN=ai.company.local" openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \ -days 825 -out server.crt \ -extfile <(printf "subjectAltName=DNS:ai.company.local")
server.crt и server.key — в nginx, ca.crt — сотрудникам (заодно отпечаток, чтобы они могли сверить). Обратите внимание на subjectAltName: без него современные клиенты сертификат не примут, даже если имя в CN совпадает.
LLM на сервисе — общий ресурс, ставьте предохранитель
У подписки есть лимит в скользящем окне. Если сервис может упереться в него вместе с другими потребителями той же подписки, рано или поздно упрётся — и откажет всем сразу. Что помогло:
не звать LLM там, где хватает кода: у меня
askиget_instructionsвообще без модели;один вызов LLM за раз, очередь с таймаутом, потолки в час и в сутки;
перед каждым вызовом — проверка общего расхода, и fail-closed: если проверить не получилось, лучше честный отказ, чем внезапный 429 у всех.
Эмбеддинги и русский язык
Популярные англоязычные модели эмбеддингов плохо ищут по русскому тексту вперемешку с именами серверов, IP и аббревиатурами вроде 1С. Помогли две вещи: многоязычная модель (bge-m3 через Ollama) и гибридный поиск с FTS5, где точные совпадения по именам и адресам добирает полнотекстовый индекс. Качество поиска меряю небольшим набором эталонных вопросов — без этого любые «стало лучше» на глаз ничего не значат.
Бот на long-poll и шумный httpx
Бот администратора опрашивает Яндекс Мессенджер long-poll запросами через httpx. А httpx по умолчанию пишет в лог на уровне INFO каждый HTTP-запрос — то есть каждый пустой getUpdates. У меня это около 8 тысяч строк в сутки, за которыми не видно ничего полезного. Если делаете бота на long-poll — сразу приглушите логгер:
import logging logging.getLogger("httpx").setLevel(logging.WARNING)
Что есть на рынке
Я не первый, кто думает о сети агентов. Есть Paperclip, CrewAI, LangGraph. Есть протокол A2A для общения агентов разных производителей — он под Linux Foundation и, если понадобится общение между компаниями, его можно поднять поверх. Есть корпоративные инструменты управления агентами у самих вендоров.
А вот профильного суперагента, который знает практику конкретной компании и через которого идут и знания, и права, и решения администратора, я в готовом виде не нашёл. Если вы видели — напишите в комментариях, правда интересно.
Что получилось и что дальше
Пилот: группа аналитики продаж, четыре человека, чтение баз 1С и CRM. Подключение нового сотрудника по инструкции — минут десять. Письма мне больше не пишут: агенты договариваются с суперагентом сами, а я отвечаю кнопкой, когда нужно решение. Правила для всех агентов меняются в одном месте.
Открытых вопросов больше, чем закрытых:
как заставить агента сотрудника идти к суперагенту, а не изобретать своё (MCP не принуждает, сейчас это держится на инструкциях);
как масштабировать на всю компанию и не упереться в лимиты;
как наполнять базу знаний не только документацией, но и живым опытом.
По последнему пункту уже работаем. RAG есть и используется — дальше вопрос, чем его наполнять. Задача от руководителя: общая база должна пополняться из того, как сотрудники обучают своих агентов, из транскрибаций конференций, общения с клиентами и записей звонков. По сути — источник того самого человеческого опыта для суперагентов. Плюс через неделю-другую пилота будут цифры: сколько вопросов закрывается без меня и сколько доходит до кнопки. Расскажу в следующей части.
Напоследок мысль, ради которой всё это затевалось. Когда ИИ только появился, нам говорили: это экзоскелет, который усиливает человека. Сейчас, по-моему, всё наоборот: ИИ нужен человеческий опыт, чтобы становиться умнее. Не зря даже роботов сейчас учат по видео с камер на головах обычных рабочих. С агентами в компании то же самое.
Забавно: 13 лет назад я писал здесь про машину Больцмана и задачу коммивояжёра на нейросети. Теперь — про агентов, которые разбираются в инфраструктуре компании. Кажется, всё только начинается.

