Files
crank/docs/protocols/graphql.md
T
2026-04-06 01:45:48 +03:00

6.3 KiB
Raw Blame History

GraphQL

1. Роль протокола в проекте

GraphQL поддерживается как отдельный тип интеграции, но на слое MCP намеренно ограничивается. Цель платформы не в том, чтобы дать LLM универсальный доступ ко всему GraphQL endpoint, а в том, чтобы превратить конкретный GraphQL-запрос в узкий и предсказуемый MCP tool.

2. Что поддерживается в MVP

  • query
  • mutation
  • один GraphQL endpoint на operation
  • фиксированный query_template
  • фиксированный selection set
  • загрузка примера выходного JSON
  • схема переменных
  • variables mapping
  • response extraction из data
  • разбор errors
  • auth и headers
  • автогенерация чернового mapping
  • ручная донастройка через JSONPath
  • тестовый вызов перед публикацией

3. Что не входит в MVP

  • subscription
  • универсальный GraphQL explorer для LLM
  • передача произвольного GraphQL-документа от LLM
  • визуальный конструктор сложных selection set
  • обязательная зависимость от introspection
  • автоматическое построение любого запроса по полной GraphQL schema

subscription допускается только как future scope после появления отдельного websocket/subscription adapter и controlled streaming lifecycle.

4. Ключевое архитектурное ограничение

Платформа не должна публиковать в MCP общий GraphQL tool, который умеет получать любые поля и принимать любые параметры в зависимости от намерения LLM.

Правильная модель только одна:

  • один tool;
  • один конкретный query или mutation;
  • один заранее зафиксированный selection set;
  • фиксированный набор входных параметров;
  • один предсказуемый формат ответа.

Иными словами, на MCP-слое GraphQL сознательно сужается до модели, близкой к RPC или REST operation. Это делается потому, что LLM должен работать с понятным контрактом, а не конструировать произвольный GraphQL-запрос на лету.

5. Внутренняя модель GraphQL operation

GraphQL operation должна включать:

  • endpoint
  • operation_type
  • operation_name
  • query_template
  • variables_schema
  • input_mapping
  • response_path
  • error_policy
  • headers
  • auth_profile

6. Как оператор настраивает GraphQL operation

  1. Указывает GraphQL endpoint.
  2. Выбирает query или mutation.
  3. Задает имя операции.
  4. Вставляет готовый шаблон запроса.
  5. Описывает переменные, которые разрешено передавать в эту операцию.
  6. При необходимости загружает пример JSON-ответа.
  7. Система строит черновую схему ответа и стартовый mapping.
  8. Настраивает маппинг MCP input -> GraphQL variables.
  9. Указывает response_path, по которому извлекается полезный результат из data.
  10. При необходимости уточняет mapping через JSONPath.
  11. Выполняет тест.
  12. Публикует operation как MCP tool.

7. Поведение runtime

При выполнении GraphQL operation runtime должен:

  1. Валидировать вход по фиксированной схеме переменных.
  2. Применить input mapping.
  3. Собрать GraphQL payload вида query + variables.
  4. Выполнить HTTP request.
  5. Отдельно разобрать data и errors.
  6. Применить output mapping или response_path.
  7. Вернуть нормализованный результат.

8. Критические нюансы

  • HTTP 200 OK не означает успешное выполнение, если в теле присутствует errors.
  • структура ответа зависит от selection set, значит она должна быть фиксирована заранее;
  • GraphQL endpoint обычно один, поэтому операция определяется не URL, а телом запроса;
  • variables должны быть строго ограничены, иначе один tool станет слишком широким и плохо управляемым;
  • subscription не входит в текущий scope, потому что требует отдельной lifecycle-модели, близкой к session mode, и отдельного transport adapter.
  • JSONPath используется для точечного извлечения вложенных данных из data и для управления структурой итогового ответа.

9. Почему GraphQL не считается "почти REST"

GraphQL похож на REST только тем, что часто передается по HTTP. Но с точки зрения платформы это другой тип контракта:

  • смысл операции задается не endpoint, а запросом;
  • ответ зависит от selection set;
  • ошибки живут в теле ответа, а не только в HTTP status;
  • одна и та же точка входа может обслуживать много операций.

Поэтому GraphQL в системе должен иметь отдельный адаптер и отдельную конфигурационную модель.