Интеграции

Как подключить агента к системам компании: опыт Redmine CLI и GraphQL

Какие инструменты нужны агенту, чтобы читать задачи, выбирать данные и работать с корпоративным процессом.

· · 5 минут

В наших компаниях GitLab и Redmine — ключевые системы разработки. Когда агент умеет менять код, довольно быстро хочется поручить ему и соседние действия: прочитать задачу с обсуждением, оформить результат, подготовить merge request. Для этого нужны удобные инструменты доступа. Под Redmine я сделал отдельный CLI.

Почему прямых запросов к API стало мало

До появления CLI мы описывали в корпоративном скилле работу с Redmine через REST API. Агент справлялся, но взаимодействие получалось многословным: приходилось собирать запросы, передавать параметры, разбираться с ответами. По моему наблюдению, на это уходило слишком много контекста. Количественного сравнения расхода токенов я в анонсе инструмента не приводил.

Для GitLab уже был glab. С Redmine подходящего мне инструмента тогда не нашлось, поэтому появился redmine-cli. Он построен на OpenAPI-описании Redmine. В опубликованном наборе возможностей есть установка через Homebrew, работа с задачами и профили для нескольких серверов.

У CLI здесь понятная роль: собрать повторяющиеся технические действия в короткие команды. Агенту по-прежнему нужно понимать задачу пользователя, выбирать нужную операцию и оценивать результат. Обёртка упрощает обращение к системе, но сама по себе этого понимания не даёт.

Что агент получает от Redmine CLI

В исходной публикации я показал команды проверки авторизации, чтения списка задач и получения задачи с историей обсуждения. Например:

redmine auth status
redmine --profile client issue list --limit 20
redmine issue show 123 --include journals

Профиль позволяет явно выбрать сервер. Это удобно, когда работаешь с внутренним Redmine и системой клиента: адрес назначения становится частью команды. Получение journals помогает прочитать историю задачи вместе с её текущим состоянием. Для агента это существенная разница: последние договорённости часто находятся в комментариях.

Рядом с кодом лежат документация команд и готовый скилл. В документации описан синтаксис команд. Корпоративные инструкции должны дополнить её правилами команды: какие поля обязательны, когда менять статус, как связывать задачу с MR. Такие правила у каждой компании свои.

Где помогает GraphQL

Другой вопрос возникает, когда агенту приходится читать большие объекты. Представим заказ, у которого много полей, а для ответа нужны только номер, дата, статус и сумма. Если инструмент каждый раз возвращает весь объект, модель получает данные, которые никак не помогают текущей задаче.

В заметке о GraphQL мне были интересны три свойства: описание типов и полей в схеме, выбор полей в запросе и получение связанных объектов. Эти возможности определены в спецификации GraphQL. В упрощённом примере запрос может выглядеть так:

{
  orders {
    number
    createdAt
    status { name }
    totalSum { amount currency }
  }
}

Это иллюстрация формы запроса, а не готовая команда для любого CRM API. Названия полей, обязательные аргументы и пагинация зависят от конкретной схемы. Если схема связывает заказы с задачами менеджеров, клиент может запросить эти данные вместе. При этом число внутренних обращений сервера к базе определяется его реализацией.

Я бы оценивал пользу на конкретных ответах: сколько лишнего текста попадает в контекст, сколько вызовов делает агент, хватает ли ему данных для вывода. Само наличие GraphQL ещё не даёт фиксированного процента экономии. Небольшой REST-ответ может быть вполне достаточным для рабочего сценария.

MCP, GraphQL и CLI решают разные задачи

Заголовок моего поста о GraphQL был категоричным. Для инженерного выбора нужно уточнение: MCP — протокол подключения инструментов и других возможностей к AI-приложению; GraphQL — язык запросов к API; CLI — интерфейс программы в командной строке. Они совместимы.

MCP-инструмент может принимать GraphQL-запрос и возвращать его результат. CLI тоже может обращаться к GraphQL. Более того, уже спецификация MCP от 18 июня 2025 года предусматривает необязательный outputSchema для описания структуры ответа. Утверждение, что MCP в принципе скрывает от модели формат результата, было бы слишком широким.

Размер ответа зависит от дизайна инструмента. Через MCP можно предоставить операцию с выбором полей, а через CLI — вернуть огромный документ. Поэтому я бы начинал с устройства конкретной интеграции: как найти нужную операцию, как ограничить выдачу и как понять ошибку.

Что стоит описать в корпоративном скилле

Ниже — рекомендации для подключения новой системы. Они дополняют описание команд правилами работы команды.

Права нужно ограничивать на стороне системы. Инструкция для модели помогает выбрать действие, но ограничения учётной записи продолжают действовать независимо от текста скилла. Особенно внимательно я бы отделял обычное чтение от массовых изменений.

Начать с одного законченного сценария

Для первой интеграции я бы взял короткую цепочку: найти задачу, прочитать обсуждение, подготовить изменение и показать результат человеку. На ней видно, где агент тратит время и какой информации ему не хватает. Затем можно добавлять новые операции, сохраняя понятные границы доступа.

Redmine CLI закрывает для меня конкретный разрыв между агентом и одной из основных рабочих систем. GraphQL полезен там, где требуется гибко выбирать связанные данные. Хорошая интеграция получается, когда интерфейс, описание процесса и права доступа согласованы между собой. Тогда агент может пройти рабочую задачу дальше редактирования файлов.

Материал может пригодиться коллегам? Отправьте им ссылку на статью.