Инструкция: Попросить права админа в trip2g

Trigger:

  • Агенту нужно прочитать сабмиты формы
  • Нужно создать вебхук / frontmatter-патч / любую admin-мутацию
  • Нужно применить настройки на уровне инстанса (timezone, локаль и т.п.)
  • Появилась ошибка unauthorized при GraphQL-запросе

Зачем

Базовый API-ключ trip2g даёт чтение и публикацию заметок. Для админских мутаций (вебхуки, патчи, чтение сабмитов формы, изменение настроек) нужен флажок enable_mcp_admin_tools на ключе. Без него агент получит unauthorized или пустой список GraphQL-операций.

См. документацию: trip2g — Агент-администратор.

Шаги

1. Проверь, есть ли уже админ-инструменты

Попробуй вызвать через MCP:

graphql_introspection(pattern: "admin")
  • Если вернулись типы и мутации (adminMutation, AdminFormStringValue и т.п.) → права уже включены, иди к шагу 6
  • Если ошибка unauthorized или вернулся пустой список admin-операций → иди к шагу 2 (галку реально не включали)
  • Если ошибка tool not found / tool вообще отсутствует в списке доступных MCP-инструментов → иди к шагу 1a (не зови юзера, проблема у тебя)

1a. Если graphql_introspection отсутствует у тебя как tool — это твоя конфигурация, а не админка

Признаки: в списке MCP-tools для trip2g нет graphql_introspection / graphql_request, только 6 базовых (search, similar, note_html, federated_*).

Запрос не анонимный — просто без admin scope. Сервер trip2g выдаёт admin-tools только если в запросе есть X-API-Key: <raw-api-key> header и на ключе включён enableMcpAdminTools. Без header MCP-клиент агента ходит без управляющего ключа → admin-tools не показываются вообще, независимо от состояния галки.

Известный баг текущего hermes-образа: docker/entrypoint.sh при первой генерации config.yaml регистрирует my_brain_trip2g без headers. Если контейнер запустился со старой версией entrypoint — почини руками:

  1. Открой /opt/data/config.yaml, секция mcp_servers.my_brain_trip2g. Должно быть:

    mcp_servers:
      my_brain_trip2g:
        url: https://<host>/_system/mcp
        headers:
          X-API-Key: <raw-api-key>
    

    Если headers отсутствует — допиши. Ключ бери из /opt/data/secondbrain/.obsidian/plugins/trip2g/data.json (поле syncDirs[0].apiKey) или из env TRIP2G_API_KEY. Используй raw значение, без Bearer или иных префиксов.

  2. Если CLI (hermes, secondbrain, sync) падает с ошибкой прав или ломается синк — запускай из /opt/data/secondbrain (CLI ищет конфиг и vault относительно cwd, не по абсолютному пути).

  3. После правки — перезагрузи MCP-сессию (/reload-skills, новая сессия, или перезапуск контейнера) и вернись к шагу 1.

Только если после правильного header tool всё равно отсутствует — переходи к шагу 2 (тогда галка enableMcpAdminTools действительно снята в админке).

2. Объясни пользователю простыми словами

Не лезь в технические детали. Скажи:

«Чтобы я мог [конкретное действие — читать заявки из формы / поставить настройки сайта / создать вебхук], мне нужны админ-права в твоём trip2g. Это переключатель на твоём API-ключе. Покажу как.»

3. Дай чёткие шаги для пользователя

  1. Открой {TRIP2G_URL}/admin (нужно быть залогиненным админом)
  2. Раздел API-ключи
  3. Найди ключ который синхронизирует твой vault
  4. Поставь галку Enable MCP admin tools (или «Включить admin-инструменты MCP»)
  5. Сохрани
  6. Скажи мне «готово» — проверю

4. Дождись подтверждения от пользователя

Не дёргай админку сам — это его действие. Просто жди ответ.

5. Проверь повторно

После «готово» от пользователя — снова:

graphql_introspection(pattern: "admin")
  • Получилось (вернулись admin-типы) → шаг 6 (granted)
  • Не получилось → шаг 5a (pending_verification)

5a. Если admin-инструменты не появились

Это типичная ситуация — MCP-сессия закэширована с прошлого состояния флага.

ОБЯЗАТЕЛЬНО сохрани промежуточное состояние, чтобы потом не начинать всё заново:

admin_rights: pending_verification
admin_rights_requested_at: 2026-05-22

Потом попроси пользователя:

"Похоже сессия ещё держит старое состояние. Сделай /reload-skills или просто напиши мне через минуту 'проверь админ ещё раз' — повторю проверку."

При повторной проверке — снова шаг 5. Если получилось — переписываешь admin_rights на granted.

6. Залогируй в user_settings.md

В тот же файл, где timezone (см. instructions/setup_timezone):

---
timezone: Europe/Moscow
timezone_set_at: 2026-05-22
locale: ru
admin_rights: granted
admin_rights_granted_at: 2026-05-22
---

admin_rights: granted — флаг чтобы при следующих admin-операциях не переспрашивать.

7. Подтверди пользователю и предложи настройки

«Готово, теперь могу делать админские операции. Заодно — у тебя в админке можно поставить часовой пояс инстанса. У меня записано Europe/Moscow, поставить такой же на сервере? Чтобы все логи и crons на стороне сайта тоже шли по местному времени.»

Если пользователь согласен — следуй шагу 8.

8. Применить timezone к инстансу через admin

graphql_introspection(pattern: "setting|timezone|config")

Найди мутацию настроек инстанса. Обычно updateSiteSettings или похожее. Затем:

graphql_request(
  query: "mutation($input: UpdateSiteSettingsInput!) { adminMutation { updateSiteSettings(input: $input) { ... on UpdateSiteSettingsPayload { settings { timezone } } } } }",
  variables: { input: { timezone: "Europe/Moscow" } }
)

Если такой мутации нет в схеме — сообщи пользователю что timezone хранится только в user_settings.md агента, на инстансе не применяется. Это не блокер, просто меньше единства настроек.

9. Сообщи о результате

- timezone в админке инстанса: установлен / не доступен в API
- admin_rights в user_settings.md: granted

Когда переспрашивать

  • Появляется новая ошибка unauthorized — значит галку сняли или ключ заменили
  • Через год — лёгкая проверка «всё ещё хочешь чтобы у меня были админ-права?»

Что НЕ делать

  • ❌ Не объяснять флаги через названия GraphQL-операций — пользователь это не должен знать
  • ❌ Не пытаться обойти через какой-то второй ключ — один ключ + одна галка, всё
  • ❌ Не выполнять admin-мутации «по-тихому» — каждая первая операция в категории заслуживает подтверждения у пользователя
  • ❌ Не пугать «root-паролем» — упомяни осторожность кратко, но не превращай в инструктаж по безопасности

Кейсы

Кейс 1: первая лид-форма
instructions/landing_lead_form требует чтения сабмитов через admin.formSubmits. Триггер → эта инструкция → пользователь включает галку → возвращаемся к настройке cron на проверку заявок.

Кейс 2: настройка таймзоны
Пользователь только что сказал свою таймзону по instructions/setup_timezone. Агент сразу предлагает: «Заодно поставить её и на инстансе? Тогда нужны админ-права» — двойная польза от одного разговора.

Кейс 3: вебхук на новый сабмит
Хотим уведомлять в Telegram сразу при новом сабмите формы вместо опроса каждые 4 часа. Нужен вебхук → нужен admin → эта инструкция.

Кейс 4: уже granted
В user_settings.md стоит admin_rights: granted. Перед использованием делай быструю graphql_introspection — мало ли пользователь снял галку. Если вернулось — действуй сразу, без переспроса.