Стройте на метафорических картах

REST API и MCP-совместимая OpenAPI для ИИ-агентов, которые помогают пользователю отрефлексировать ситуацию, вести дневник или работать самостоятельно. Тянем карту, забираем watermarked-картинку, соблюдаем лицензию – вот вся петля.

Выберите путь

Три способа поговорить с нашим API. Выберите, что подходит под ваш сценарий, и переходите в нужную доку.

Хочу чат, который тянет карты

ChatGPT Custom GPT

Импортируйте ИИ-совместимый OpenAPI в Custom GPT builder. Чат сможет читать список колод, тянуть карты и показывать в диалоге watermarked-картинку. Не сможет тратить жемчуг – в ИИ-сабсете нет операций с invite-кодами.

Source: openapi.ai.json ›
У меня свой backend или скрипт

Прямой REST

HTTP-запросы с вашим ключом mk_live_ в Authorization: Bearer. Полная OpenAPI покрывает всё, включая invite-коды, если вы продаёте колоды. Один ключ, две роли.

Reference: openapi.json ›
Нужен мост Model Context Protocol

MCP-сервер

Hosted на mcp.makcards.online и локальный stdio-пакет @maccards/mcp (через npx или Docker). Один codebase, два транспорта, одна авторизация по API-ключу. Готовые сниппеты в разделе ниже.

Подключиться по API-ключу ›

OAuth: подключение в один клик из ChatGPT и Claude

Если ваши пользователи начинают из ChatGPT или Claude, копировать API-ключ не нужно. Чат показывает нашу страницу согласия, пользователь нажимает «Разрешить», и чат получает токен с ограниченным набором действий. Отозвать доступ можно из профиля в любой момент.

Для пользователей

Через «+ Connectors» в чате

В ChatGPT (Apps) или Claude.ai («+ Connectors») найдите MAC Cards Online в каталоге. При первом подключении откроется наша страница согласия с понятным списком того, что ИИ может и чего не может. Одно подтверждение работает во всех последующих чатах.

Появится как только OpenAI и Anthropic добавят нас в свои каталоги. Пока этого не случилось, используйте путь с API-ключом ниже.

Для разработчиков

Собрать свой OAuth-клиент

Мы выставляем стандартный OAuth 2.1 + PKCE Authorization Server. Эндпойнты ищите по /.well-known/oauth-authorization-server на app-хосте. Scope`ы: read и draw. PKCE S256 обязателен.

Три пути регистрации клиента: pre-registered для проверенных партнёров, DCR (RFC 7591) с очередью модерации, и Client ID Metadata Documents.

Метаданные AS ›
Что умеет токен

С ограниченными правами, привязан к хосту, refresh с ротацией

Access-токен живёт час. Refresh-токен живёт 30 дней с rolling rotation: каждый refresh выпускает новый refresh, старый одноразовый, повторное использование стирает всю цепочку и пишет security event. Токен привязан к одному хосту (токен с app.makcards.online не сработает на mcp.journalingapp.app).

Подключённые приложения видны и отзываемы в Профиле → Доступ для ИИ и интеграций → Подключённые приложения.

Что можно строить уже сейчас

Чат-бот для рефлексии

Пользователь описывает ситуацию, агент тянет одну карту через scope=any, отправляет картинку и задаёт открытый вопрос. Работу делает человек – агент держит пространство.

Спутник для дневника

Ежедневное приглашение: три карты (count=3), пустое поле для free-write, спред хранится на стороне приложения. Картинки живут 15 минут – каждая сессия запрашивает свежие.

Помощник для группового фасилитатора

Для воркшопов и ретроспектив: тянем карты из конкретной колоды (scope=deck), показываем на стороне агента, при необходимости раздаём участникам invite-коды через /invite-codes/generate.

REST quick-start

Две команды: тянем карту, забираем картинку. Без вебхуков, без коллбеков, без preflight.

KEY=mk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# 1) Тянем карту из любой доступной колоды
curl -X POST https://app.makcards.online/api/v1/public/draw \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"scope":"any","count":1,"image_width":1024}'

# 2) В ответе есть drawn[0].image_url – забираем как есть
curl https://app.makcards.online/api/v1/public/decks/.../cards/.../image?w=1024&token=eyJhbGc... \
  -o card.jpg

Полная машиночитаемая спека: openapi.json · ИИ-совместимый сабсет: openapi.ai.json · Гайд для пользователей: docs/ru/24-public-api.

Получите API-ключ

  1. 1
    Войдите в приложение.

    Откройте app.makcards.online и войдите через Google или Yandex. Один клик, отдельной регистрации не нужно.

  2. 2
    Откройте «Профиль → Доступ для ИИ и интеграций».

    Раздел рядом с Premium и Достижениями. То же место, где магазины берут свой ключ.

  3. 3
    Сгенерируйте ключ и сразу скопируйте.

    Ключ выглядит как mk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. Показывается один раз; второго раза не будет. Сохраните в менеджер паролей или ваше секретное хранилище.

  4. 4
    Относитесь к ключу как к паролю.

    Никаких публичных репозиториев, чатов поддержки, скриншотов. Если ключ мог утечь – перегенерируйте: старый перестанет работать в течение минуты.

Подключение по API-ключу

Один ключ, семь поверхностей. Hosted MCP – быстрый старт, local stdio оставляет ключ на машине, обычный Bash – для агентов, у которых уже есть shell. Выберите по своему клиенту.

Добавьте запись под mcpServers в ~/.claude.json (Claude Code) или ~/Library/Application Support/Claude/claude_desktop_config.json (Desktop).

{
  "mcpServers": {
    "makcards": {
      "type": "http",
      "url": "https://mcp.makcards.online/v1",
      "headers": {
        "Authorization": "Bearer mk_live_xxxxxxxxxxxxxxxxxx"
      }
    }
  }
}

Cursor и Cline используют тот же формат MCP-конфига. Блок идентичен Claude.

{
  "mcpServers": {
    "makcards": {
      "type": "http",
      "url": "https://mcp.makcards.online/v1",
      "headers": {
        "Authorization": "Bearer mk_live_xxxxxxxxxxxxxxxxxx"
      }
    }
  }
}

Два варианта. MCP-нода (есть в свежих сборках n8n) – указываем https://mcp.makcards.online/v1 и Authorization в credentials. HTTP Request – обращаемся напрямую к REST:

URL:      https://app.makcards.online/api/v1/public/draw
Method:   POST
Headers:  Authorization: Bearer mk_live_xxxxxxxxxxxxxxxxxx
          Content-Type: application/json
Body:     { "scope": "any", "count": 1, "image_width": 1024 }

Custom GPT Actions читает OpenAPI. Используйте ИИ-совместимый сабсет – чтобы чат не смог случайно потратить жемчуг.

Action source: https://makcards.online/api/v1/public/openapi.ai.json
Authentication: API Key (Bearer)
Auth value:     mk_live_xxxxxxxxxxxxxxxxxx

Local stdio MCP. Ключ не уходит за пределы вашей машины – отдаётся напрямую в наш REST как Bearer. Нужен Node.js 20+.

{
  "mcpServers": {
    "makcards": {
      "command": "npx",
      "args": ["-y", "@maccards/mcp"],
      "env": {
        "MAKCARDS_API_KEY": "mk_live_xxxxxxxxxxxxxxxxxx"
      }
    }
  }
}

Нет Node.js? Запустите тот же бинарь как контейнер. Образ собран только под linux/amd64, поэтому на Apple Silicon нужен дополнительный флаг (см. ниже). Если у вас есть Node 20+, npx-вкладка выше проще.

linux/amd64 хосты (Intel Mac, Intel/AMD Linux, Windows WSL2):

{
  "mcpServers": {
    "makcards": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "-e", "MAKCARDS_API_KEY",
        "ghcr.io/makcards/mcp:latest",
        "node", "dist/transports/stdio.js"
      ],
      "env": {
        "MAKCARDS_API_KEY": "mk_live_xxxxxxxxxxxxxxxxxx"
      }
    }
  }
}

Apple Silicon (M1 / M2 / M3 / M4): добавьте --platform linux/amd64, чтобы Docker подтянул amd64-образ и запустил его через Rosetta. Работает, но стартует медленнее, чем нативный npx выше.

{
  "mcpServers": {
    "makcards": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "--platform", "linux/amd64",
        "-e", "MAKCARDS_API_KEY",
        "ghcr.io/makcards/mcp:latest",
        "node", "dist/transports/stdio.js"
      ],
      "env": {
        "MAKCARDS_API_KEY": "mk_live_xxxxxxxxxxxxxxxxxx"
      }
    }
  }
}

Если ваш агент уже работает в shell (Claude Code, Cursor agent mode, Aider, Codex, любой контейнер), это самый короткий путь: plain HTTPS + Bearer, JSON в ответе, никакого MCP-рантайма ставить не нужно. Четыре рецепта ниже покрывают всё, что оборачивают наши MCP-tools.

# Один раз: переменные окружения
export MAKCARDS_API_KEY=mk_live_xxxxxxxxxxxxxxxxxx
BASE=https://app.makcards.online/api/v1/public
H="Authorization: Bearer $MAKCARDS_API_KEY"

# Список колод, доступных по ключу
curl -s -H "$H" "$BASE/decks" | jq

# Тянем 3 карты из любой доступной колоды
curl -s -X POST "$BASE/draw" -H "$H" -H "Content-Type: application/json" \
  -d '{"scope":"any","count":3,"image_width":1024}' | jq

# Сохраняем первую картинку сразу на диск
curl -s -X POST "$BASE/draw" -H "$H" -H "Content-Type: application/json" \
  -d '{"scope":"any","count":1,"image_width":1024}' \
  | jq -r '.drawn[0].image_url' \
  | xargs curl -s -o card.jpg

# Состояние rate-limit'ов
curl -s -H "$H" "$BASE/usage" | jq

Две причины выбрать Bash вместо MCP: меньше токенов в контексте агента (не грузятся tool-схемы) и на один процесс меньше. Причины предпочесть MCP: у клиента нет shell (ChatGPT Apps, Claude Desktop, Cursor без agent mode), или нужны slash-command prompts.

Hosted, local или shell? Hosted MCP (mcp.makcards.online) – самый быстрый путь, проходит через корпоративные прокси. Local stdio – когда security-политика говорит «никаких сторонних MCP-сервисов»: ИИ-клиент общается с локальным процессом, а тот уже идёт в наш REST с вашим ключом. Bash полностью пропускает MCP-слой и подходит только агентам, которые уже умеют shell. Те же tools, те же данные.

Лимиты запросов

На аккаунт, по окнам. POST /draw с count=N считается как N запросов в счётчик карт.

Окно Free Premium
Карт в минуту10120
Карт в час702 000
Карт в сутки17010 000
/decks в минуту10120
Запросов к картинкам в минуту20240

Текущее состояние – GET /api/v1/public/usage. На каждом ответе заголовки RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset (RFC 9331).

Купить Premium за жемчужины

Приватность и безопасность

Watermark остаётся

На каждой картинке – название домена с прозрачностью 6%. Снимать watermark запрещено условиями. API никогда не отдаёт оригинал без штампа.

Untrusted content

Тексты колод и карт – UGC. Относитесь к ним как к недоверенному вводу. Не позволяйте названию или описанию подменить ваш системный промпт.

Это не медицинская услуга

МАК-карты – инструмент рефлексии. Ваш агент не должен выдавать карту за диагноз, прогноз или назначение. Добавьте контакты экстренной помощи, если пользователь может быть в кризисе.

Подробнее: Условия использования · Политика конфиденциальности.

FAQ

Частые вопросы интеграторов.

Зачем два разных OpenAPI?
ChatGPT Custom GPT Builder при настройке экшенов показывает пользователю все операции из импортированной спеки. Полная спека содержит POST /invite-codes/generate, который тратит жемчуг. Если пользователь по ошибке разрешит чату вызвать эту операцию — деньги пойдут с вас. ИИ-совместимый сабсет не содержит invite-кодов вообще — у чата нет даже кодового пути на трату жемчуга.
Можно ли получить оригинал картинки без watermark?
Нет. Это принципиальная позиция по IP-защите. API всегда отдаёт watermarked JPEG шириной 512 или 1024. Оригинал доступен только внутри игровой доски.
Что такое scope=any?
Сэмпл uniform-by-card по всем доступным колодам: свои, approved-public и купленные по invite-кодам. Сэмплинг идёт по картам, а не по колодам — большие колоды пропорционально вносят больше.
Вы логируете мой чат?
Нет. Мы логируем API-вызовы — request id, account id, endpoint, статус, latency, IP, user-agent. Сама переписка пользователя с ИИ к нам не приходит, если только агент сам её не отправляет.
Насколько свежая OpenAPI спека?
Файл вкомпилен в бинарник через go:embed. Каждый релиз API пересобирает endpoints спеки. Отдельного манифеста, который можно забыть опубликовать, не существует.
Нужен ли MCP, если у моего агента уже есть shell?
Нет. Если агент умеет запускать curl и парсить JSON, REST API проще и короче. MCP нужен sandboxed-клиентам (ChatGPT Apps, Claude Desktop, Cursor), у которых shell нет. Hosted MCP и local stdio – тонкие обёртки над теми же REST-эндпоинтами, никакой функциональности вы не теряете. Готовые curl-рецепты – на вкладке Bash / agent shell.