Назад к статьям
Статья

Как мы ведём бэклог в Boards через Claude Code и MCP

Наш бэклог лежит в Laraue Boards — трекере задач, который мы делаем. У Boards есть удалённый MCP-сервер, поэтому ИИ-агент может читать и обновлять доску. Мы пользуемся этим каждый день: спрашиваем Claude Code, над чем работать, он смотрит на доску и на код, мы выбираем задачу — и он берётся за дело. Вот как мы к этому пришли.

Зачем мы это сделали

Мы постоянно слышали про MCP-серверы, а лучший известный нам способ понять технологию — собрать с ней что-то своё. Поэтому мы поставили небольшую цель: сделать MCP-сервер для Boards вместе с Claude и посмотреть, как это работает изнутри. Первая версия заняла около двух часов.

Это API, написанное для модели

MCP-сервер похож на API-хост, но для моделей. Вместо документации для разработчика у каждого метода и каждого параметра есть описание, которое объясняет модели, когда и как им пользоваться. Сверху идёт набор инструкций для всего сервера, который клиент получает при подключении. На C# инструмент выглядит так (описания сокращены):

[McpServerTool]
[Description("Moves an issue to a different status by id, optionally posting a comment in the same call. Requires canEdit ...")]
public Task EditIssueStatus(
    [Description("The issue's key, e.g. 'BRD-42'.")] string issueKey,
    [Description("The target status's id, from list_statuses. ...")] long statusId,
    [Description("A comment to post on the issue as part of this status change ...")] string? comment = null,
    CancellationToken cancellationToken = default)

А вот несколько строк из инструкций сервера:

- When the user mentions an issue, fetch it with get_issue instead of asking them to paste it.
- Tools take ids, not names: space keys from list_spaces, epic ids from list_epics,
  status ids from list_statuses, ...
- A failed call says why ('NotFound: ...', 'Forbidden: ...', or 'BadRequest: ...' with a line
  per invalid field) - fix the request instead of retrying it unchanged.

Писать код было несложно. Основные размышления ушли на эти фразы.

Два решения: охват и доступ

Мы ограничили охват. Сервер покрывает основной сценарий — работу с задачами: список, просмотр, создание, редактирование, перенос и комментарии. Управление организацией, спейсами и эпиками мы намеренно оставили за скобками — об этом ниже.

Доступ идёт через API-ключи, которые выдаются в Boards на уровне организации. Ключ даёт агенту доступ только к одной организации. Агент действует от имени пользователя, создавшего ключ, и ровно с его правами, а ключ можно отозвать в любой момент. Изменения, сделанные через ключ, отображаются в истории issue со значком ключа, так что всегда видно, что сделал агент.

Первая версия была недостаточно хороша

Мы начали с промпта примерно такого вида: сделай MCP-хост, используй API-хост как образец и предложи, какие методы создать. Из предложенного мы выбрали только основные.

В первом результате были реальные проблемы. Главная — со справочниками: статусами, эпиками, атрибутами, участниками. Почти все они адресовались по названию, а не по id, поэтому, например, issues фильтровались по названию статуса. Поэтому в инструкциях сервера выше теперь написано «tools take ids, not names». Кроме того, не хватало методов, нужных агенту: не было способа получить список эпиков, из-за чего часть базовой работы была невозможна. Чтобы получить стабильную версию, потребовалось несколько итераций за один-два дня.

Мы уже писали о том, почему ревью кода, сгенерированного ИИ, дорого, поэтому здесь действовали аккуратно. Инструменты — тонкий слой над теми же сервисами и проверками прав, что и веб-API, что ограничивает объём ревью: в основном описания и параметры, а не бизнес-логика. Код мы проверили вручную. Затем отправили сервер в Glama — каталог MCP-серверов, который оценивает серверы и перечисляет проблемы, — и исправляли замечания, пока не получили оценку A. Только после этого мы подключили его к Claude Code.

Подключение

API-ключ и одна команда:

claude mcp add --transport http boards https://boards.laraue.com/boards-mcp/mcp \
  --header "X-Api-Key: ВАШ_API_КЛЮЧ"

Полные шаги для Claude Code, Cursor и Claude на десктопе — на странице про MCP.

Первый тест и цикл работы

Для первого теста мы написали: «Check actual Laraue Boards tasks. Let's choose with you the most prioritized from them.» Claude использовал четырнадцать инструментов. Он прочитал доску, а ещё заглянул в код задачи, которая уже была в работе, чтобы понять, как далеко она на самом деле продвинулась. Потом он рекомендовал сначала закончить именно её, объяснил, какие другие задачи от неё зависят, расставил остальные по порядку и предложил создать ветку и начать.

Claude Code читает доску и код и предлагает, с чего начать

После этого мы попросили перенести одну задачу в In Progress и приступить к работе. Когда работа была готова, мы попросили завершить задачу и предложить следующую. Это тот цикл, которым мы пользуемся каждый день.

Иногда мы открываем журнал истории, чтобы посмотреть, что изменилось за последние сутки, а иногда — веб-интерфейс, чтобы увидеть доски визуально. Но когда мы работаем над задачами, проще делать всё из чата, не переключая контекст. Задачи приходят и из Telegram: сообщение, пересланное боту, попадает в Бэклог и готово к тому, чтобы взять его в работу тем же способом.

Что изменилось, когда мы начали пользоваться сами

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

Последнее важнее, чем кажется. Когда в вызове не хватало обязательного аргумента, SDK подменял причину общим «An error occurred invoking…», и агенту оставалось только повторять вслепую. Теперь сервер сначала сверяет аргументы со схемой самого инструмента и отвечает BadRequest: Bad request со строкой вроде - title: Is required. Модель способна исправить ошибку, которую может прочитать, поэтому текст ошибки — часть интерфейса.

Чего он не умеет — намеренно

Сервер работает только с issues. Агент может смотреть структуру вокруг них (спейсы, эпики, статусы, атрибуты и участников), но не может её создавать или менять. Самую опасную работу мы через MCP не разрешили: управление организацией, спейсами и эпиками. Ошибка там затрагивает куда больше, чем одну задачу, и нам спокойнее с агентом, который может ошибиться в одном issue, чем с тем, который способен перестроить всю доску.

Возможно, мы вернёмся к этому позже и добавим области доступа (scopes) к API-ключам, чтобы ключу можно было разрешить ровно то, что вы выберете.

Есть и менее существенные ограничения. Вложения — только изображения (JPEG и PNG, до 3 МБ), и агент работает с одним issue за раз: массовых операций нет.

Что стоит знать, прежде чем пробовать

  • Дайте агенту отдельный ключ. Его можно отозвать, не трогая свой доступ, а его изменения легко отличить в истории.
  • Ограничивайте его правами. Если не хотите, чтобы он удалял issues, используйте аккаунт без права удаления в этом спейсе.

Попробуйте

Создайте API-ключ, добавьте сервер в Claude Code или Cursor и попросите: «Покажи спейсы в моей организации Boards». Если агент ответил вашими спейсами — вы подключены. В руководстве по бэклогу — что попросить дальше, а сам Boards — на boards.laraue.com.