Перейти к содержимому

MCP

То же API, адресованное ассистенту, а не сценарию. MCP-клиент выбирает, что вызвать, во время работы — по описаниям инструментов, — поэтому он достаёт ровно то, что достают его учётные данные, и под каждым инструментом лежит вызов публичного API.

Один адрес

Всё идёт на POST /v1/mcp. Сессию открывать нечего, поток держать тоже: GET и DELETE отвечают 405, и каждое сообщение — отдельный запрос.

POST https://api.mosaqo.app/v1/mcp
Authorization: Bearer $MOSAQO_KEY
MCP-Protocol-Version: 2026-07-28

Ревизии протокола от 2025-03-26 до 2026-07-28 обслуживаются все. Клиент, открывающий initialize, получает ожидаемый хендшейк; тот, что называет версию в каждом запросе, обслуживается так.

Подключение ключом API

Самый быстрый путь и правильный для инструмента, который вы держите сами. Любой ключ работает как bearer-токен, а набор инструментов урезается до скоупов этого ключа.

Большинство клиентов принимает такой блок:

{
  "mcpServers": {
    "mosaqo": {
      "type": "http",
      "url": "https://api.mosaqo.app/v1/mcp",
      "headers": { "Authorization": "Bearer $MOSAQO_KEY" }
    }
  }
}
curl -X POST https://api.mosaqo.app/v1/mcp \
  -H "Authorization: Bearer $MOSAQO_KEY" \
  -H "Content-Type: application/json" \
  -H "MCP-Protocol-Version: 2026-07-28" \
  -H "Mcp-Method: tools/list" \
  -d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/list" }'

Подключение через OAuth

Для коннектора в чужом каталоге, где человек ключа вообще не касается. Обнаружение по RFC 9728 и RFC 8414, клиенты регистрируются сами по RFC 7591, каждая авторизация — PKCE с S256.

curl https://api.mosaqo.app/.well-known/oauth-protected-resource
curl https://api.mosaqo.app/.well-known/oauth-authorization-server

Неавторизованный вызов сам говорит, куда идти и что просить:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="Mosaqo MCP",
  resource_metadata="https://api.mosaqo.app/.well-known/oauth-protected-resource",
  scope="qr:read analytics:read reviews:read exports:read"

Тот, кто подтверждает, вошёл в Mosaqo, выбирает, какого пространства это касается, и может это сделать только там, где он владелец или администратор — та же граница, что решает, кто выдаёт ключ API. Отключить можно потом в Bulk & API.

Что ассистент может

Те же скоупы, что уже знакомы. Инструмент, который учётные данные не разрешают, в tools/list не попадает и не вызывается, даже если назвать его по имени, — поэтому живой ответ для любого подключения это и есть tools/list.

СкоупДаёт право
qr:readЧитать список и содержимое QR-кодов, папки и шаблоны
qr:writeСоздавать, изменять, перенацеливать, публиковать, архивировать и удалять
exports:readСкачивать отрисованные карточки
analytics:readСводную аналитику и отдельные сканирования
bulk:writeСоздавать и читать пакетные задания
webhooks:writeУправлять подписками на webhooks
reviews:readМеста, опросы и то, как они идут — но не сами ответы

Чего он не достанет никогда

Того, что люди написали в опросе. reviews:read открывает ваши места, опросы и то, как они идут, — количества, оценки, распределение ответов по каждому вопросу. Предложения, которые набрал посетитель, здесь отдаются не больше, чем где-либо ещё, куда достают учётные данные, — по той же причине, по которой события feedback.* несут оценку и никогда слова.

Удаление кода. REST-маршрут требует набранного подтверждения, потому что уничтожение редиректа за напечатанным кодом необратимо, а такое подтверждение ассистент за человека не даёт. Вместо этого есть архивация, и она обратима.

Запись помечена как запись. Инструмент, который что-то меняет, несёт readOnlyHint: false, а архивация — destructiveHint: true: именно поэтому клиент останавливается и спрашивает человека перед запуском.