Для ИИ-агентов

MCP-сервер SendHQ

Дайте ИИ-агенту полный и безопасный контроль над одним рабочим пространством SendHQ: отправка и получение писем, подтверждение доменов, публикация шаблонов и расследование проблем с доставляемостью через 59 строго типизированных инструментов. Написано в первую очередь для агентов, но людям тоже будет полезно.

59 инструментовтранспорт stdio, одна команда0 инструментов для управления ключами
Установка и подключение (Claude Code)
curl -fsSL https://downloads.sendhq.cc/install.sh | sh
claude mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcp

Что это за сервер

MCP-сервер SendHQ позволяет ИИ-агенту управлять одним рабочим пространством SendHQ через Model Context Protocol: отправлять письма (по одному, пакетами, по шаблонам, ответами, с вложениями, с идемпотентными повторами), читать и искать отправленные и полученные письма (по темам, текстам и именам вложений) и их события доставки, раскладывать письма по меткам с правилами автосортировки, управлять черновиками и закрытыми вложениями, создавать и публиковать хранимые шаблоны, добавлять и подтверждать домены и их DNS, настраивать приём входящей почты и входящие адреса, анализировать доставляемость, отказы, жалобы и стоп-лист, а также читать данные об использовании аккаунта, состоянии оплаты, аналитику и метаданные API-ключей.

Это локальный stdio-сервер, встроенный в CLI-бинарник sendhq. Ваш MCP-клиент запускает sendhq mcp как дочерний процесс и общается с ним по JSON-RPC через stdin/stdout. Каждый вызов инструмента превращается в один документированный запрос к REST API SendHQ по адресу https://sendhq.cc/api/v1, аутентифицированный API-ключом вашего рабочего пространства, поэтому у MCP-сервера ровно те же права, что и у этого ключа, и не больше.

  • 59 инструментов в 8 группах, сгенерированных из единого каталога, который также опубликован как tools.json.
  • Строгие JSON Schema: неизвестные аргументы, неверные типы и отсутствующие обязательные поля отклоняются локально, до того как что-либо попадёт в SendHQ.
  • Структурированные ошибки со стабильным code, HTTP-статусом status, пояснением explanation, конкретным способом исправления remedy и признаком того, поможет ли повторная попытка.
  • Каждый инструмент, который отправляет реальные письма или удаляет данные, сообщает об этом в первых словах своего описания и снабжён аннотациями безопасности MCP.
  • Режим --read-only скрывает все инструменты, которые отправляют письма или что-либо изменяют.
  • Ничего не логируется. В stdout передаются только сообщения протокола; API-ключ и содержимое писем никогда не попадают в логи.
Это не MCP-эндпоинт документации.SendHQ также размещает небольшой MCP-эндпоинт документации только для чтения по адресу https://sendhq.cc/api/mcp (поиск по ценам и документации, без доступа к аккаунту). Сервер, описанный на этой странице, — полноценный, с доступом к аккаунту; он работает локально или как размещённый коннектор, описанный ниже.

SendHQ в Claude и ChatGPT

Установка не нужна: SendHQ также запускает этот сервер как размещённый коннектор по адресу https://mcp.sendhq.cc/mcp с теми же инструментами. Вместо того чтобы вставлять ключ, вы входите в свой аккаунт SendHQ.

Claude

  1. Откройте Settings → Connectors и найдите SendHQ в каталоге или выберите Add custom connector и вставьте https://mcp.sendhq.cc/mcp.
  2. Нажмите Connect, войдите в SendHQ, проверьте запрашиваемый доступ и нажмите Allow.
  3. Попросите Claude проверить ваш почтовый ящик, отправить письмо с вашего подтверждённого домена или объяснить причину отказа.

ChatGPT

  1. Open Settings → Security and login and turn on Developer mode.
  2. Go to chatgpt.com/plugins, click Create MCP app, name it SendHQ and enter https://mcp.sendhq.cc/mcp.
  3. Sign in to SendHQ and click Allow, then pick SendHQ from the tools menu in a new chat.

Muse by Meta

In Muse, open Connectors and search for SendHQ. Click Connect, sign in to SendHQ and click Allow.

Подтверждение действий и отключение

  • The request_feature tool sends a feature request to the SendHQ team with your account details, so we can follow up by email.
  • Инструменты, которые отправляют реальные письма или удаляют данные, помечены соответствующим образом. Будет ли ассистент сначала спрашивать вас, настраивается для каждого инструмента в самом ассистенте: в Claude выберите Needs approval для этих инструментов в разделе Settings → Connectors → SendHQ.
  • Коннектор получает собственный API-ключ, названный по имени ассистента (например, «Claude (AI connector)»). Удалите его в разделе API Keys, чтобы немедленно отключить коннектор.
  • Он не может создавать или отзывать API-ключи и менять настройки оплаты. Вложения отправляются и возвращаются в base64; доступа к локальным файлам нет.
  • Неоплаченные рабочие пространства (пробный период для интеграции) могут доставлять письма только на email аккаунта или на адрес симулятора AWS SES.

Вопросы: postmaster@sendhq.cc. Конфиденциальность: sendhq.cc/privacy.

Установка

Установите бинарник sendhq (Linux, macOS и Windows на x86-64 и arm64). Установщик проверяет контрольную сумму релиза и по умолчанию помещает бинарник в ~/.local/bin.

macOS и Linux
curl -fsSL https://downloads.sendhq.cc/install.sh | sh
Windows PowerShell
irm https://downloads.sendhq.cc/install.ps1 | iex
Проверка установки
sendhq version
SENDHQ_API_KEY=re_your_key sendhq doctor

Создайте API-ключ в панели управления по адресу https://sendhq.cc/app#/keys. MCP-сервер не умеет создавать ключи. Сервер запускается одной командой:

Запуск stdio-сервера
SENDHQ_API_KEY=re_your_key sendhq mcp

Обычно вручную её запускать не нужно: это делает MCP-клиент. Если запустить её в терминале, она будет ждать JSON-RPC на stdin.

Настройка клиента

Claude Code

claude mcp add
claude mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcp

# read-only variant
claude mcp add sendhq-readonly --env SENDHQ_API_KEY=re_your_key -- sendhq mcp --read-only

Добавьте --scope user, чтобы сервер был доступен во всех проектах, или --scope project, чтобы записать его в .mcp.json проекта. Для общего .mcp.json берите ключ из переменной окружения, а не коммитьте его; Claude Code подставляет значения ${VAR} в .mcp.json.

.mcp.json
{
  "mcpServers": {
    "sendhq": {
      "command": "sendhq",
      "args": [
        "mcp"
      ],
      "env": {
        "SENDHQ_API_KEY": "${SENDHQ_API_KEY}"
      }
    }
  }
}

OpenAI Codex

~/.codex/config.toml
[mcp_servers.sendhq]
command = "sendhq"
args = ["mcp"]
env = { SENDHQ_API_KEY = "re_your_key" }

Или из командной строки: codex mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcp.

Claude Desktop

Отредактируйте claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\) и перезапустите приложение. Десктопные приложения не наследуют PATH вашей оболочки, поэтому укажите абсолютный путь к бинарнику (which sendhq).

claude_desktop_config.json
{
  "mcpServers": {
    "sendhq": {
      "command": "/Users/you/.local/bin/sendhq",
      "args": [
        "mcp"
      ],
      "env": {
        "SENDHQ_API_KEY": "re_your_key"
      }
    }
  }
}

Любой другой MCP-клиент

Настройте stdio-сервер с командой sendhq, аргументами ["mcp"] (при необходимости "--read-only") и переменными окружения, перечисленными ниже. Сервер поддерживает версии протокола MCP 2024-11-05, 2025-03-26, 2025-06-18 и 2025-11-25 и реализует initialize, ping, tools/list и tools/call. Результаты инструментов содержат и текстовый JSON-блок, и structuredContent.

Простейшая проверка через stdio (передайте на вход sendhq mcp)
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}}
{"jsonrpc":"2.0","method":"notifications/initialized"}
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"get_service_health","arguments":{}}}

Размещённого HTTP-транспорта для сервера с доступом к аккаунту нет. Удалённому MCP-эндпоинту с правом записи потребовался бы OAuth для каждого пользователя, которого SendHQ не предлагает; локальный бинарник хранит ключ на той машине, где он и так уже есть.

Переменные окружения и флаги

Переменная или флагОбязательнаНазначение
SENDHQ_API_KEYдаAPI-ключ рабочего пространства (re_…). Нужен всем инструментам, кроме get_service_health. Без него сервер всё равно запускается, но каждый вызов возвращает структурированную ошибку auth_error с объяснением, как это исправить.
SENDHQ_API_BASE_URLнетБазовый URL API. По умолчанию https://sendhq.cc/api/v1. Используйте только для локального или тестового (staging) развёртывания. SENDHQ_BASE_URL принимается как устаревший псевдоним.
SENDHQ_MCP_READ_ONLYнет1, true или yes работают как --read-only.
--read-onlyнетОткрывать только инструменты, которые не отправляют письма и не меняют состояние. Скрытые инструменты также отклоняются при вызове по имени.
SENDHQ_PROFILE / --profileнетИспользовать ключ, сохранённый командой sendhq auth login в хранилище ключей ОС, вместо SENDHQ_API_KEY. Если заданы оба, приоритет у переменной окружения.

Ключ передаётся только в заголовке Authorization: Bearer на настроенный базовый URL. Он никогда не выводится, не логируется, не повторяется в ошибках и не включается в результаты инструментов.

Модель безопасности для агентов

  • Отправляет реальные письма. send_email, send_batch и send_template_test доставляют письма реальным людям и расходуют кредиты на доставку. Их описания начинаются с SENDS REAL EMAIL. Вызывайте их, только когда пользователь явно попросил отправить именно это письмо, подтвердив получателей, отправителя и содержание.
  • Деструктивно. delete_email, delete_draft, delete_attachment, delete_domain, delete_inbox и remove_suppression помечены destructiveHint: true, а их описания начинаются с DESTRUCTIVE. Сначала получите подтверждение пользователя. remove_suppression ослабляет защитную блокировку и уместен, только когда человек подтвердил, что адрес снова работает.
  • Изменяет состояние. Создание и изменение черновиков, шаблонов, доменов и почтовых ящиков, публикация шаблонов и запуск проверки меняют рабочее пространство, но не отправляют писем.
  • Только чтение. Все остальные инструменты имеют readOnlyHint: true, и их можно свободно вызывать.
  • Этот сервер никогда не меняет DNS. add_domain возвращает записи, которые должен опубликовать человек; get_domain_connect_link возвращает URL согласия, который человек должен открыть и одобрить у своего DNS-провайдера.
  • Этот сервер никогда не меняет оплату. get_account только читает тариф, использование и состояние подписки.
  • Неоплаченные рабочие пространства (пробный период для интеграции) могут доставлять письма только на email владельца аккаунта (get_account → user.email) или на адрес симулятора AWS SES, например success@simulator.amazonses.com, и не могут отправлять вложения.
  • Принято — не значит доставлено. Успешная отправка возвращает ID; сведения о доставке, отказе и жалобе появляются позже в list_email_events. Никогда не утверждайте, что письмо попало во «Входящие» или что человек его прочитал.
  • Не переключайтесь на другой адрес From, чтобы обойти приостановку 423, и никогда не добавляйте повторно получателей, которые отписались или пожаловались.

API-ключи вне зоны действия сервера

Намеренно нет инструментов, которые создают, изменяют, ротируют, отзывают или удаляют API-ключи. Агент не должен выпускать или уничтожать учётные данные. list_api_keys возвращает только имена, несекретные префиксы и время последнего использования. Управление ключами остаётся в панели управления за человеком, вошедшим в аккаунт.

Сценарии работы

1. Первая отправка

  1. get_service_health подтверждает, что API доступен (работает без ключа).
  2. get_account показывает тариф (access.tier), оставшуюся квоту и user.email. В пробном периоде этот email — единственный разрешённый реальный получатель.
  3. list_sending_identities перечисляет адреса From, которые можно использовать. Если список пуст, сначала пройдите сценарий подключения домена.
  4. Подтвердите с пользователем отправителя, получателя, тему и текст, затем вызовите send_email с idempotency_key.
  5. list_email_events с возвращённым id покажет delivery, bounce, complaint или reject, как только провайдер сообщит результат (обычно от нескольких секунд до минут).
Первая отправка
{
  "name": "send_email",
  "arguments": {
    "from": "Acme <hello@example.com>",
    "to": [
      "owner@example.com"
    ],
    "subject": "SendHQ is connected",
    "text": "It works.",
    "idempotency_key": "first-send-2026-09-26"
  }
}

2. Подтверждение домена от начала до конца

  1. add_domain с name: "example.com". Результат содержит DNS-записи (CNAME для DKIM, подтверждение SES, SPF, рекомендуемый DMARC).
  2. get_dns_provider с domain_id определяет авторитетного DNS-провайдера и возвращает точный относительный хост, который нужно указать для каждой записи у этого провайдера.
  3. Если providers.domainConnect.available равно true, get_domain_connect_link возвращает URL согласия. Передайте его человеку: ничего не изменится, пока он не одобрит изменение у провайдера. В противном случае передайте человеку записи для публикации. Никогда не публикуйте вторую SPF-запись: добавьте include:amazonses.com в существующее значение v=spf1.
  4. verify_domain повторно проверяет DNS и SES. Статус проходит через pending, checking и propagating до verified. Опрашивайте verify_domain или get_domain каждые 30–60 секунд; обновление DNS может занять от нескольких минут до нескольких часов.
  5. Когда status становится verified, адреса домена появляются в list_sending_identities.

3. Отказы, жалобы и стоп-лист

  1. list_blocked_recipients возвращает все заблокированные адреса с причиной (bounce, complaint, unsubscribe) и сводным количеством.
  2. list_suppressions возвращает записи стоп-листа из-за жёстких отказов и жалоб; deliverability_stats даёт доли доставки, отказов и жалоб за 30 дней; list_sender_reputation показывает, какие адреса From ограничены или приостановлены.
  3. Отправка, среди получателей которой есть адрес из стоп-листа, завершается ошибкой 422 recipient_suppressed. Уберите этого получателя и отправьте снова.
  4. Вызывайте remove_suppression, только когда человек подтвердил, что ящик, давший отказ, теперь работает. Записи о жалобах в стоп-листе постоянны (409 complaint_suppression_locked).

4. Приём входящей почты

  1. Домен (часто поддомен, например inbound.example.com) должен быть подтверждён.
  2. setup_inbound настраивает приём и возвращает одну MX-запись. Её публикует человек.
  3. Вызывайте verify_inbound, пока status не станет ready.
  4. create_inbox с domain_id и local_part (например, support) создаёт support@inbound.example.com.
  5. Опрашивайте list_emails с direction: "in" и unread: true (при необходимости с inbox_id). Читайте письмо через get_email, переписку — через get_thread, вложения — через download_attachment, а обработанное письмо отмечайте через mark_email (read: true).
  6. Отвечайте в той же цепочке через send_email с reply_to_email_id; SendHQ сам выставит In-Reply-To, References и цепочку.

5. Вебхуки и уведомления о событиях

Сейчас SendHQ не предлагает настраиваемых клиентом вебхуков, поэтому инструмента для вебхуков нет. Уведомления провайдера обрабатываются внутри SendHQ и доступны через операции чтения. Вместо этого используйте опрос: list_email_events — для результата одного письма, list_emails со status (например, bounced) или after — для недавних изменений, list_emails с direction: "in" и unread: true — для новых входящих писем, list_blocked_recipients — для новых записей в стоп-листе. Опрашивайте не чаще примерно раза в минуту на каждый вопрос.

6. Диагностика сбоя доставки

  1. Найдите письмо: list_emails с direction: "out" и to или query либо get_email, если ID известен. status: failed означает, что SendHQ или провайдер отклонили письмо при передаче; причина указана в ошибке письма.
  2. list_email_events: bounce (постоянный или временный, с диагностикой провайдера), complaint, reject или delivery. Если событий ещё нет, провайдер пока не сообщил результат; подождите и проверьте снова.
  3. Если завершился ошибкой сам вызов отправки, посмотрите code ошибки: sender_domain_unverified → завершите подтверждение домена; recipient_suppressed → адрес ранее дал жёсткий отказ или на него поступила жалоба; sender_paused → изучите list_sender_reputation и исправьте источник списка; trial_recipient_restricted → ограничения пробного периода; quota_exhausted → использование в get_account.
  4. get_domain проверяет, что DKIM, SPF и DMARC по-прежнему опубликованы; deliverability_stats показывает, касается ли проблема одного письма или это тенденция.
  5. Сообщайте то, что показывают факты. Событие delivery означает, что сервер получателя принял письмо, а не что оно попало во «Входящие» или было прочитано.

7. Собственная группа для задач (метки)

  1. create_label с name (например, Agent/Orders) и skip_inbox: true. Это превращает метку в группу: полученные письма с этой меткой архивируются, поэтому отображаются только в метке и никогда — во «Входящих» человека.
  2. Отправляйте письма по задачам через send_email (или send_batch) с labels: ["Agent/Orders"]. Ответы в этой переписке автоматически наследуют метку и минуют «Входящие».
  3. Для писем, которые начинаются вне ваших переписок, добавьте правило сортировки: create_label_rule с inbox_id (выделенный адрес, например orders@…), from, to или subject. Передайте apply_to_existing: true, чтобы разложить уже полученные письма.
  4. Работа с группой: list_emails с label: "Agent/Orders", direction: "in" и unread: true; читайте через get_email или get_thread, отвечайте через send_email с reply_to_email_id, а после обработки вызывайте mark_email с read: true.
  5. Чтобы переместить случайно попавшее не туда письмо в группу или из неё, используйте label_email (add / remove). Добавление метки группы к полученному письму также архивирует его.
  6. При необходимости set_inbox_forwarding отправляет копию всех писем, приходящих на адрес получения, в другой почтовый ящик (получатель сначала подтверждает это по email).
Отправка в группу
{
  "name": "send_email",
  "arguments": {
    "from": "Orders <orders@example.com>",
    "to": [
      "customer@example.net"
    ],
    "subject": "Order 1042: confirm delivery window",
    "text": "Reply with a time that works.",
    "labels": [
      "Agent/Orders"
    ],
    "idempotency_key": "order-1042-window"
  }
}

8. Вложения и шаблоны

На платном тарифе прикрепляйте до 10 файлов через attachments в send_email (для каждого нужен content_base64 или локальный file_path; filename по умолчанию — базовое имя файла). Для хранимых шаблонов: create_template → update_template_draft → render_template для предпросмотра на тестовых данных → send_template_test (отправляет одно реальное тестовое письмо) → publish_template, затем отправляйте через send_email или send_batch с template: {key, data} и ровно одним получателем в to.

Результаты, пагинация и ошибки

Успешный вызов возвращает JSON-объект API в виде structuredContent и в виде текстового JSON-блока. Каждый инструмент list_* принимает limit (1–200, по умолчанию 50) и offset и добавляет объект pagination. Продолжайте вызывать с offset: pagination.next_offset, пока has_more равно true.

Постраничный результат
{
  "data": [
    "…"
  ],
  "count": 50,
  "pagination": {
    "offset": 0,
    "limit": 50,
    "returned": 50,
    "total": 180,
    "has_more": true,
    "next_offset": 50
  }
}

Неудачный вызов возвращает isError: true со структурированной ошибкой. Следуйте remedy, а не повторяйте вслепую; повторяйте, только если retryable равно true.

Структурированная ошибка инструмента
{
  "error": {
    "code": "trial_recipient_restricted",
    "status": 402,
    "message": "The integration trial can deliver only to your account email or an AWS SES simulator address",
    "retryable": false,
    "explanation": "This workspace is on the unpaid integration trial. Trial sends can be delivered only to the account owner's email address or an AWS SES simulator address.",
    "remedy": "Send to the account email (get_account -> user.email) or a simulator address such as success@simulator.amazonses.com to test. To email anyone else, the account owner must activate a paid plan in the dashboard (Profile & Billing). Do not retry the same recipients."
  }
}

Необязательные поля ошибки: request_id (сообщите его в поддержку), retry_after_seconds, problems (список нарушений схемы для invalid_arguments) и idempotent_replayed (см. раздел «Идемпотентность»).

Идемпотентность

send_email и send_batch принимают idempotency_key (не более 200 символов), который передаётся в заголовке Idempotency-Key. Создавайте один стабильный ключ на каждое логическое письмо, например invoice-4812-receipt.

  • При повторе нужно использовать тот же ключ И идентичное тело запроса. Тот же ключ с любым изменением (получатель, тема, текст, заголовок, данные шаблона, даже значения аргументов) возвращает 409 idempotency_conflict.
  • Тот же ключ, то же тело, исходный запрос завершён: SendHQ возвращает сохранённый результат без повторной отправки. Так можно безопасно повторить запрос после тайм-аута или network_error.
  • Тот же ключ, пока исходный запрос ещё выполняется: 409 idempotency_in_progress, можно повторить после короткого ожидания.
  • Для нового логического письма нужен новый ключ.
  • Сохранённые ошибки тоже воспроизводятся. Если первая попытка завершилась ошибкой, повтор с тем же ключом вернёт ту же ошибку с idempotent_replayed: true и retryable: false. Проверьте через list_emails (direction: out), что ничего не ушло, устраните причину и отправьте с новым ключом.
  • Сервер никогда сам не повторяет POST-запросы. Автоматически повторяются только GET-запросы на чтение (до 3 попыток при сетевых ошибках, 429 и 5xx).
  • send_email со встроенными attachments не принимает idempotency_key, потому что выполняет несколько запросов. Для безопасной с точки зрения повторов отправки вложений: create_draft → upload_attachment → send_email с draft_id и idempotency_key.
Безопасная отправка с повтором (при тайм-ауте повторите в точности)
{
  "name": "send_email",
  "arguments": {
    "from": "Acme <billing@example.com>",
    "to": [
      "owner@example.com"
    ],
    "subject": "Receipt #4812",
    "text": "Thanks for your payment.",
    "idempotency_key": "receipt-4812"
  }
}

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

SendHQ не публикует фиксированный лимит запросов в секунду для API. На практике агент сталкивается с лимитами использования, которые возвращаются как 429:

  • Месячный лимит доставок получателям по тарифу. Каждый адрес в To, Cc и Bcc считается одной доставкой. См. get_account → usage.recipientDeliveries в сравнении с usage.emailQuotaMonth.
  • Дневной лимит получателей для конкретного адреса From, который задаётся состоянием репутации этого отправителя (list_sender_reputation → dailyLimit, по умолчанию 2 000 на платных тарифах).
  • Пробный период для интеграции: всего 100 получателей и только на email аккаунта или адреса симулятора SES.
  • Вложения: не более 10 файлов и 10 МБ на письмо; 10 ГБ передачи вложений в месяц с учётом числа получателей на платных тарифах.
  • На один запрос: To + Cc + Bcc — до 100 адресов; send_batch — до 100 писем.
  • Репутационный предохранитель: если в скользящем 7-дневном окне отказы или жалобы превышают порог, отправка с конкретного адреса From ограничивается или приостанавливается (423 sender_paused). Когда показатели снижаются, адрес восстанавливается автоматически.

quota_exhausted нельзя повторять, пока не начнётся новый период или не сменится тариф. rate_limited можно повторить через retry_after_seconds; для отправок повторяйте с тем же idempotency_key и идентичным телом.

Каталог ошибок

code стабилен; ветвите логику по нему, а не по message.

codeHTTPПовторять?Что это значит и что делать
invalid_arguments—нетАргументы не прошли локальную проверку JSON Schema инструмента; в SendHQ ничего не отправлено. Исправьте поля, перечисленные в problems.
auth_error401нетAPI-ключ отсутствует, отозван или неверен. Задайте SENDHQ_API_KEY для процесса сервера; ключи создаёт человек в панели управления.
trial_recipient_restricted402нетВ пробном периоде для интеграции можно доставлять письма только на email аккаунта или адрес симулятора SES. Отправьте туда либо попросите владельца активировать платный тариф.
payment_required402нетФункция требует платного тарифа (например, вложения). Отправьте без неё или перейдите на платный тариф.
sender_domain_not_owned403нетДомен From не относится к этому рабочему пространству. Используйте list_sending_identities или add_domain.
sender_domain_unverified403нетДомен From ещё не подтверждён. get_domain, опубликуйте недостающие записи, verify_domain.
domain_limit_reached403нетДостигнут лимит доменов по тарифу. Удалите неиспользуемый домен (с согласия человека) или перейдите на старший тариф.
marketing_not_enabled403нетМаркетинговый класс не включён для этого домена или тарифа. Используйте transactional, только если письмо действительно транзакционное.
forbidden403нетПолитика не разрешает эту операцию. Измените запрос.
not_found404нетЭтот ID не относится к рабочему пространству. Запросите список ресурсов, чтобы найти правильный ID; архивные шаблоны сначала восстановите.
idempotency_conflict409нетКлюч повторно использован с другим телом. Отправьте в точности исходный запрос или используйте новый ключ для нового письма.
idempotency_in_progress409даИсходный запрос ещё выполняется. Подождите, затем повторите с тем же ключом и телом.
revision_conflict409нетЧерновик шаблона изменился с момента чтения. get_template, объедините изменения, сохраните снова.
complaint_suppression_locked409нетПолучатель пожаловался. Никогда больше ему не пишите.
inbound_not_ready409нетПриём входящей почты не готов. setup_inbound, опубликуйте MX, verify_inbound.
conflict409нетРесурс уже существует или находится в неподходящем состоянии. Прочитайте его и скорректируйте запрос.
attachments_too_large413нетБольше 10 файлов или 10 МБ. Уберите или уменьшите вложения.
recipient_suppressed422нетПолучатель ранее дал жёсткий отказ или пожаловался. Уберите его; см. list_blocked_recipients.
recipient_unsubscribed422нетПолучатель отписался от маркетинговых писем. Уберите его навсегда.
validation_failed422нетСодержимое отклонено, например данные шаблона нарушают контракт переменных. Исправьте входные данные.
sender_paused423нетЭтот адрес From приостановлен 7-дневным предохранителем по отказам и жалобам. Остановитесь, исправьте список, дождитесь автоматического восстановления.
quota_exhausted429нетДостигнут месячный, дневной (на отправителя), лимит на вложения или лимит пробного периода. Проверьте get_account; дождитесь сброса или перейдите на старший тариф.
rate_limited429даСнизьте темп; подождите retry_after_seconds. Для отправок: тот же ключ, то же тело.
server_error5xxдаВременный сбой SendHQ или провайдера. Сделайте паузу и повторите; отправки — с тем же ключом и телом. Если idempotent_replayed равно true, используйте новый ключ, убедившись, что ничего не было отправлено.
network_error—даЗапрос или ответ потерян. Повторите; для отправок безопасность повтора обеспечивает тот же idempotency_key.
invalid_request400нетНекорректный запрос. Прочитайте message и исправьте его.
tool_error—нетЛокальный сбой внутри MCP-сервера (например, нечитаемый file_path). Прочитайте message.

Справочник инструментов

Все инструменты с классом безопасности, вызываемым REST-эндпоинтом, параметрами, форматом ответа и примером объекта параметров tools/call. Параметры указаны точно: сервер отклоняет всё, чего нет в списке.

Письма и цепочки: send_email, send_batch, list_emails, get_email, mark_email, delete_email, list_email_events, get_thread
Метки и правила автосортировки: list_labels, get_label, create_label, update_label, delete_label, create_label_rule, delete_label_rule, label_email
Черновики, вложения и адреса отправителя: list_sending_identities, create_draft, list_drafts, get_draft, update_draft, delete_draft, upload_attachment, download_attachment, delete_attachment
Хранимые шаблоны: list_templates, create_template, get_template, update_template_draft, create_template_draft, render_template, send_template_test, publish_template, archive_template, restore_template
Домены и DNS: list_domains, get_domain, add_domain, verify_domain, delete_domain, get_dns_provider, get_domain_connect_link
Входящая почта: setup_inbound, verify_inbound, list_inboxes, get_inbox, create_inbox, update_inbox, set_inbox_forwarding, delete_inbox
Доставляемость, отказы и стоп-лист: deliverability_stats, list_sender_reputation, list_suppressions, remove_suppression, list_blocked_recipients
Аккаунт, использование, аналитика и ключи: get_account, get_analytics, list_api_keys, get_service_health

Письма и цепочки

Отправляет реальные письмаsend_email
POST /emails

Отправить одно письмо

SENDS REAL EMAIL. Отправляет одно письмо с подтверждённого домена: готовый html/текст, опубликованный хранимый шаблон, ответ в существующей цепочке или письмо с вложениями. Передавайте idempotency_key, чтобы повтор не привёл к двойной отправке; при повторе нужно использовать тот же ключ И идентичный запрос, иначе SendHQ вернёт 409. attachments — вспомогательная возможность: создаёт черновик, загружает каждый файл и отправляет с этим черновиком; её нельзя сочетать с idempotency_key или draft_id (для безопасной с точки зрения повторов отправки вложений используйте create_draft + upload_attachment + send_email с draft_id). Неоплаченные рабочие пространства (пробный период для интеграции) могут доставлять письма только на email аккаунта или адрес симулятора AWS SES и не могут отправлять вложения.

Укажите хотя бы одно из: html, text, template.

ПараметрТипОбязательнаОписание
fromstringдаОтправитель, например Acme <hello@example.com>. Домен должен быть подтверждён в этом рабочем пространстве (см. list_sending_identities). (макс. 998 символов)
tostring[]даПолучатели. Каждый элемент — адрес, при необходимости с отображаемым именем. В сумме To+cc+bcc — не более 100; каждый адресат расходует один кредит на доставку. (1–100 элементов)
ccstring[]нетПолучатели копии. (0–100 элементов)
bccstring[]нетПолучатели скрытой копии. (0–100 элементов)
subjectstringнетТема письма. Не указывайте при отправке шаблона. (макс. 998 символов)
textstringнетТекстовая версия письма. Укажите text, html или template.
htmlstringнетHTML-версия письма. SendHQ очищает её и формирует текст, если text не указан.
reply_tostringнетАдрес Reply-To.
headersobjectнетДополнительные безопасные пользовательские заголовки (строковые значения), например {"X-Entity-Ref-ID": "123"}. Заголовками маршрутизации, такими как From/To/Message-ID, управляет SendHQ.
message_classstringнетtransactional (по умолчанию) или marketing. Для маркетинговых писем нужен тариф или домен с включённым маркетингом; добавляется обработка отписки. (одно из transactional, marketing)
reply_to_email_idstringнетОтвет внутри существующей переписки: ID вида em_… письма, на которое вы отвечаете. SendHQ выставляет In-Reply-To/References и цепочку.
thread_idstringнетЯвный ID цепочки, к которой относится письмо.
draft_idstringнетОтправить с этим письмом вложения сохранённого черновика (dr_…). После успешной отправки черновик удаляется.
templateobjectнетОтправить опубликованный хранимый шаблон вместо готового html/текста. Требуется ровно один получатель в to и никаких cc/bcc; тему задаёт шаблон. Укажите хотя бы одно из: id, key.
template.idstringнетID шаблона (tmpl_…). Укажите id или key.
template.keystringнетКлюч шаблона, например account-welcome. Укажите id или key.
template.version_idstringнетНеобязательный ID опубликованного релиза (tmplv_…). По умолчанию — текущий опубликованный релиз.
template.dataobjectнетЗначения типизированных переменных шаблона.
labelsstring[]нетИмена меток или ID вида lbl_…, под которыми сохранить письмо. Неизвестные имена создаются. Ответы в переписке наследуют метки, а метка группы (skip_inbox) не пускает эти ответы во «Входящие». Не более 10. (0–10 элементов)
idempotency_keystringнетЗаголовок Idempotency-Key (макс. 200 символов). Используйте его повторно, только чтобы повторить этот же запрос. (макс. 200 символов)
attachmentsobject[]нетФайлы для вложения (не более 10 файлов, 10 МБ в сумме). Для каждого нужен content_base64 (плюс filename) или локальный file_path. (0–10 элементов) Укажите хотя бы одно из: content_base64, file_path.
attachments[].filenamestringнетИмя файла, которое увидит получатель. Обязательно при content_base64; по умолчанию — базовое имя из file_path. (макс. 255 символов)
attachments[].content_typestringнетMIME-тип, например application/pdf. По умолчанию application/octet-stream.
attachments[].content_base64stringнетСодержимое файла в стандартном base64.
attachments[].file_pathstringнетАбсолютный путь к локальному файлу, доступному для чтения процессу MCP-сервера.
Возвращает{id: em_…, providerMessageId, threadId, templateId, templateVersionId, isTest}. Принято — не значит доставлено: проверьте результат через list_email_events.
Пример параметров tools/call
{
  "name": "send_email",
  "arguments": {
    "from": "Acme <hello@example.com>",
    "to": [
      "owner@example.com"
    ],
    "subject": "Your export is ready",
    "text": "Download it from your dashboard.",
    "idempotency_key": "export-ready-42"
  }
}
Отправляет реальные письмаsend_batch
POST /emails/batch

Отправить пакет индивидуальных писем

SENDS REAL EMAIL. Отправляет от 1 до 100 независимых писем одним запросом (используйте для персонализации шаблона под каждого получателя). Каждый элемент имеет ту же структуру, что и send_email (без attachments/idempotency_key). Элементы выполняются или завершаются ошибкой по отдельности: HTTP 207 означает частичный успех; проверяйте data[i].ok и data[i].error для каждого. Один idempotency_key покрывает всё тело пакета.

ПараметрТипОбязательнаОписание
emailsobject[]даПисьма для отправки. (1–100 элементов) Укажите хотя бы одно из: html, text, template.
idempotency_keystringнетIdempotency-Key для всего пакета (макс. 200 символов). (макс. 200 символов)
Возвращает{data: [{index, ok, id?, error?: {message, status}}], count, successful, failed}.
Пример параметров tools/call
{
  "name": "send_batch",
  "arguments": {
    "emails": [
      {
        "from": "Acme <hello@example.com>",
        "to": [
          "owner@example.com"
        ],
        "template": {
          "key": "account-welcome",
          "data": {
            "first_name": "Asha"
          }
        }
      }
    ],
    "idempotency_key": "welcome-batch-2026-09-26"
  }
}
Только чтениеlist_emails
GET /emails

Список писем и поиск

Список отправленных (direction: out) и полученных (direction: in) писем от новых к старым с фильтрами. Полученные письма классифицируются: чтобы читать «Входящие» человека, используйте direction: in, archived: false, category: primary; для приоритизации — important: true; спам скрыт, если не указано category: spam или include_spam: true. Результат разбит на страницы: он содержит pagination {offset, limit, returned, total?, has_more, next_offset}.

ПараметрТипОбязательнаОписание
directionstringнетin — полученные, out — отправленные. (одно из in, out)
statusstringнетФильтр по статусу, например queued, sent, delivered, bounced, complained, failed.
domainstringнетТолько письма для этого домена или списка доменов через запятую (совпадение с любым).
inbox_idstringнетТолько письма, полученные этим почтовым ящиком (inb_…).
labelstringнетТолько письма с этой меткой: ID метки lbl_… или точное имя либо список через запятую (совпадение с любым). Папки можно посмотреть через list_labels.
archivedbooleanнетfalse — представление «Входящие» (полученные неархивные письма), true — только архивные. Не указывайте, чтобы получить все письма.
categorystringнетprimary (люди), updates (рассылки, массовые и автоматические письма) или spam; либо список через запятую. Спам скрыт, если его не запросить.
importantbooleanнетtrue — только письма, помеченные как важные (ответы на начатые вами переписки и письма от отправителей, отмеченных как важные).
include_spambooleanнетВключить спам в результаты (для поиска по всем папкам).
fromstringнетАдрес отправителя содержит это значение.
tostringнетАдрес получателя содержит это значение.
unreadbooleanнетtrue — только непрочитанные, false — только прочитанные.
afterstringнетМетка времени ISO-8601; только письма, созданные после неё. (date-time)
beforestringнетМетка времени ISO-8601; только письма, созданные до неё. (date-time)
querystringнетПолнотекстовый поиск по темам, текстам, адресам отправителей и получателей и именам файлов вложений. (макс. 200 символов)
limitintegerнетРазмер страницы. По умолчанию 50. (по умолчанию 50; 1–200)
offsetintegerнетКоличество пропускаемых записей. Используйте pagination.next_offset из предыдущей страницы. (по умолчанию 0; 0–…)
Возвращает{data: [email summaries], count, pagination}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "list_emails",
  "arguments": {
    "direction": "in",
    "unread": true,
    "limit": 25
  }
}
Только чтениеget_email
GET /emails/:email_id

Получить одно письмо

Получает одно письмо с заголовками, html/текстом, статусом, метаданными цепочки и метаданными вложений (сами байты скачивайте через download_attachment).

ПараметрТипОбязательнаОписание
email_idstringдаID письма (начинается с em_), возвращённый инструментом списка или создания. (макс. 128 символов)
ВозвращаетОбъект письма: {id, direction, status, from, to, cc, bcc, subject, html, text, threadId, messageId, providerMessageId, readAt, createdAt, attachments: [{id, filename, contentType, sizeBytes, available}]}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "get_email",
  "arguments": {
    "email_id": "em_123"
  }
}
Изменяет состояниеmark_email
PATCH /emails/:email_id

Отметить как прочитанное, архивное, спам или важное

Изменяет одно письмо: read, archived, category (primary, updates, spam; только для полученных) и important. Пометка как спама или как важного обучает SendHQ в отношении этого отправителя для будущих писем; передайте learn: false, чтобы изменить только это письмо. Передайте хотя бы одно поле.

ПараметрТипОбязательнаОписание
email_idstringдаID письма (начинается с em_), возвращённый инструментом списка или создания. (макс. 128 символов)
readbooleanнетtrue — прочитано, false — не прочитано.
archivedbooleanнетtrue — архивировать (убрать из «Входящих»), false — вернуть во «Входящие».
categorystringнетПереместить полученное письмо в primary, updates или spam. (одно из primary, updates, spam)
importantbooleanнетПоставить или снять отметку важности.
learnbooleanнетfalse — не запоминать это решение для отправителя (по умолчанию true).
ВозвращаетОбновлённый объект письма.
АннотацииidempotentHint
Пример параметров tools/call
{
  "name": "mark_email",
  "arguments": {
    "email_id": "em_123",
    "read": true
  }
}
Деструктивноdelete_email
DELETE /emails/:email_id

Удалить письмо

DESTRUCTIVE: безвозвратно удаляет сохранённое письмо и его вложения из SendHQ. Уже доставленное письмо при этом не отзывается.

ПараметрТипОбязательнаОписание
email_idstringдаID письма (начинается с em_), возвращённый инструментом списка или создания. (макс. 128 символов)
Возвращает{ok: true}.
АннотацииdestructiveHint idempotentHint
Пример параметров tools/call
{
  "name": "delete_email",
  "arguments": {
    "email_id": "em_123"
  }
}
Только чтениеlist_email_events
GET /emails/:email_id/events

Список событий доставки письма

События провайдера для одного отправленного письма: delivery, bounce, complaint, reject, open, click. Это доказательство того, было ли письмо доставлено или почему произошёл сбой. Результат разбит на страницы: он содержит pagination {offset, limit, returned, total?, has_more, next_offset}.

ПараметрТипОбязательнаОписание
email_idstringдаID письма (начинается с em_), возвращённый инструментом списка или создания. (макс. 128 символов)
limitintegerнетРазмер страницы. По умолчанию 50. (по умолчанию 50; 1–200)
offsetintegerнетКоличество пропускаемых записей. Используйте pagination.next_offset из предыдущей страницы. (по умолчанию 0; 0–…)
Возвращает{data: [{event_type, recipient, reason, created_at, …}], count, pagination}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "list_email_events",
  "arguments": {
    "email_id": "em_123"
  }
}
Только чтениеget_thread
GET /threads/:thread_id

Получить переписку

Получает все письма переписки в хронологическом порядке (отправленные и полученные), каждое с метаданными вложений.

ПараметрТипОбязательнаОписание
thread_idstringдаID цепочки (обычно ID вида em_… первого письма; см. threadId у любого письма). (макс. 128 символов)
Возвращает{id, subject, data: [emails]}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "get_thread",
  "arguments": {
    "thread_id": "em_123"
  }
}

Метки и правила автосортировки

Только чтениеlist_labels
GET /labels

Список меток

Список меток (папок) рабочего пространства с общим числом писем, числом непрочитанных и правилами автосортировки. Результат разбит на страницы: он содержит pagination {offset, limit, returned, total?, has_more, next_offset}.

ПараметрТипОбязательнаОписание
limitintegerнетРазмер страницы. По умолчанию 50. (по умолчанию 50; 1–200)
offsetintegerнетКоличество пропускаемых записей. Используйте pagination.next_offset из предыдущей страницы. (по умолчанию 0; 0–…)
Возвращает{data: [{id, name, color, totalCount, unreadCount, rules: [...]}], count, pagination}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "list_labels",
  "arguments": {}
}
Только чтениеget_label
GET /labels/:label_id

Получить метку

Получает одну метку со счётчиками и правилами автосортировки.

ПараметрТипОбязательнаОписание
label_idstringдаID метки (начинается с lbl_) или точное имя метки. (макс. 128 символов)
ВозвращаетОбъект метки.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "get_label",
  "arguments": {
    "label_id": "Billing"
  }
}
Изменяет состояниеcreate_label
POST /labels

Создать метку

Создаёт метку-папку. Укажите skip_inbox: true, чтобы сделать её группой, которой владеет агент: отправляйте с labels: [name], и ответы будут попадать в метку, минуя «Входящие». Необязательные правила автосортировки раскладывают новые отправленные и полученные письма (должны совпасть все условия правила). Укажите apply_to_existing, чтобы разложить и уже сохранённые письма.

ПараметрТипОбязательнаОписание
namestringдаИмя метки, например Billing или Clients/Acme. Уникально в рамках рабочего пространства (без учёта регистра). (макс. 64 символа)
colorstringнетЦвет в HEX, например #1a73e8. Необязательно.
skip_inboxbooleanнетРежим группы: полученные письма с этой меткой (по правилу, как ответ на переписку, отправленную с этой меткой, или вручную) архивируются и отображаются только в метке, а не во «Входящих».
rulesobject[]нетНеобязательные правила автосортировки (не более 20). Для каждого нужно хотя бы одно из: inbox_id, from, to, subject. (0–20 элементов)
rules[].directionstringнетТолько письма in (полученные) или out (отправленные). Не указывайте, чтобы учитывать оба направления. (одно из in, out)
rules[].inbox_idstringнетТолько письма, полученные этим почтовым ящиком (inb_…). Раскладывает письма каждого адреса получения в отдельную папку.
rules[].fromstringнетОтправитель содержит этот текст (без учёта регистра), например @stripe.com. (макс. 200 символов)
rules[].tostringнетTo/Cc содержит этот текст (без учёта регистра). (макс. 200 символов)
rules[].subjectstringнетТема содержит этот текст (без учёта регистра). (макс. 200 символов)
rules[].skip_inboxbooleanнетАрхивировать подходящие полученные письма, чтобы они отображались только в папке метки, а не во «Входящих».
apply_to_existingbooleanнетРазложить также уже сохранённые письма, подходящие под правила.
ВозвращаетСозданную метку с правилами.
Пример параметров tools/call
{
  "name": "create_label",
  "arguments": {
    "name": "Agent/Orders",
    "skip_inbox": true,
    "rules": [
      {
        "from": "@stripe.com"
      }
    ]
  }
}
Изменяет состояниеupdate_label
PATCH /labels/:label_id

Переименовать метку, изменить цвет или сделать группой

Переименовывает метку, меняет её цвет или включает/выключает режим группы (skip_inbox). При включении режима группы полученные письма, уже имеющие эту метку, архивируются.

ПараметрТипОбязательнаОписание
label_idstringдаID метки (начинается с lbl_) или точное имя метки. (макс. 128 символов)
namestringнетНовое имя. (макс. 64 символа)
colorstringнетНовый цвет в HEX.
skip_inboxbooleanнетРежим группы: полученные письма с этой меткой (по правилу, как ответ на переписку, отправленную с этой меткой, или вручную) архивируются и отображаются только в метке, а не во «Входящих».
ВозвращаетОбновлённую метку.
АннотацииidempotentHint
Пример параметров tools/call
{
  "name": "update_label",
  "arguments": {
    "label_id": "lbl_123",
    "name": "Finance/Billing"
  }
}
Деструктивноdelete_label
DELETE /labels/:label_id

Удалить метку

DESTRUCTIVE: удаляет метку и её правила. Сами письма сохраняются; с них лишь снимается эта метка.

ПараметрТипОбязательнаОписание
label_idstringдаID метки (начинается с lbl_) или точное имя метки. (макс. 128 символов)
Возвращает{ok: true}.
АннотацииdestructiveHint idempotentHint
Пример параметров tools/call
{
  "name": "delete_label",
  "arguments": {
    "label_id": "lbl_123"
  }
}
Изменяет состояниеcreate_label_rule
POST /labels/:label_id/rules

Добавить правило автосортировки

Добавляет к метке правило, чтобы подходящие новые письма раскладывались автоматически. Должны совпасть все заданные условия. Используйте inbox_id, чтобы выделить адресу получения отдельную папку; добавьте skip_inbox, чтобы такие письма не попадали во «Входящие».

ПараметрТипОбязательнаОписание
label_idstringдаID метки (начинается с lbl_) или точное имя метки. (макс. 128 символов)
directionstringнетТолько письма in (полученные) или out (отправленные). Не указывайте, чтобы учитывать оба направления. (одно из in, out)
inbox_idstringнетТолько письма, полученные этим почтовым ящиком (inb_…). Раскладывает письма каждого адреса получения в отдельную папку.
fromstringнетОтправитель содержит этот текст (без учёта регистра), например @stripe.com. (макс. 200 символов)
tostringнетTo/Cc содержит этот текст (без учёта регистра). (макс. 200 символов)
subjectstringнетТема содержит этот текст (без учёта регистра). (макс. 200 символов)
skip_inboxbooleanнетАрхивировать подходящие полученные письма, чтобы они отображались только в папке метки, а не во «Входящих».
apply_to_existingbooleanнетРазложить также уже сохранённые подходящие письма.
Возвращает{id: lrule_…, labelId, direction, inboxId, from, to, subject, skipInbox}.
Пример параметров tools/call
{
  "name": "create_label_rule",
  "arguments": {
    "label_id": "Billing",
    "inbox_id": "inb_123",
    "skip_inbox": true
  }
}
Деструктивноdelete_label_rule
DELETE /labels/:label_id/rules/:rule_id

Удалить правило автосортировки

DESTRUCTIVE: удаляет одно правило автосортировки. Уже разложенные письма сохраняют метку.

ПараметрТипОбязательнаОписание
label_idstringдаID метки (начинается с lbl_) или точное имя метки. (макс. 128 символов)
rule_idstringдаID правила (начинается с lrule_) из get_label. (макс. 128 символов)
Возвращает{ok: true}.
АннотацииdestructiveHint idempotentHint
Пример параметров tools/call
{
  "name": "delete_label_rule",
  "arguments": {
    "label_id": "lbl_123",
    "rule_id": "lrule_123"
  }
}
Изменяет состояниеlabel_email
POST /emails/:email_id/labels

Добавить или снять метки с письма

Перемещает письмо между папками: добавляет и/или снимает метки по имени или ID вида lbl_…. Неизвестные имена в add создаются, если create не равно false.

ПараметрТипОбязательнаОписание
email_idstringдаID письма (начинается с em_), возвращённый инструментом списка или создания. (макс. 128 символов)
addstring[]нетМетки для добавления. (0–10 элементов)
removestring[]нетМетки для снятия. (0–10 элементов)
createbooleanнетСоздавать неизвестные метки из add (по умолчанию true).
ВозвращаетОбновлённое письмо с labels.
АннотацииidempotentHint
Пример параметров tools/call
{
  "name": "label_email",
  "arguments": {
    "email_id": "em_123",
    "add": [
      "Billing"
    ],
    "remove": [
      "Support"
    ]
  }
}

Черновики, вложения и адреса отправителя

Только чтениеlist_sending_identities
GET /sending-identities

Список подтверждённых адресов отправителя

Адреса и домены, с которых это рабочее пространство может отправлять письма прямо сейчас (подтверждённые домены, их адрес From по умолчанию и активные адреса почтовых ящиков). Вызывайте перед send_email, чтобы выбрать допустимый from.

Без параметров.

Возвращает{domains: [verified domain names], addresses: [sender addresses], localParts: [...]}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "list_sending_identities",
  "arguments": {}
}
Изменяет состояниеcreate_draft
POST /drafts

Создать черновик

Создаёт черновик в редакторе. В черновиках хранятся вложения: создайте черновик, вызовите upload_attachment, затем send_email с draft_id. Ничего не отправляет.

ПараметрТипОбязательнаОписание
fromstringнетАдрес отправителя на подтверждённом домене (при создании черновика может быть пустым).
tostring[]нетПолучатели. (0–100 элементов)
ccstring[]нетПолучатели копии. (0–100 элементов)
bccstring[]нетПолучатели скрытой копии. (0–100 элементов)
subjectstringнетТема письма. (макс. 998 символов)
htmlstringнетHTML-версия письма.
textstringнетТекстовая версия письма.
reply_to_email_idstringнетID письма, на которое отвечает этот черновик.
thread_idstringнетID цепочки, к которой относится черновик.
ВозвращаетОбъект черновика {id: dr_…, from, to, cc, bcc, subject, html, text, attachments: []}.
Пример параметров tools/call
{
  "name": "create_draft",
  "arguments": {
    "from": "hello@example.com",
    "to": [
      "owner@example.com"
    ],
    "subject": "Invoice"
  }
}
Только чтениеlist_drafts
GET /drafts

Список черновиков

Список черновиков редактора, начиная с последних изменённых. Результат разбит на страницы: он содержит pagination {offset, limit, returned, total?, has_more, next_offset}.

ПараметрТипОбязательнаОписание
limitintegerнетРазмер страницы. По умолчанию 50. (по умолчанию 50; 1–200)
offsetintegerнетКоличество пропускаемых записей. Используйте pagination.next_offset из предыдущей страницы. (по умолчанию 0; 0–…)
Возвращает{data: [drafts], count, pagination}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "list_drafts",
  "arguments": {}
}
Только чтениеget_draft
GET /drafts/:draft_id

Получить черновик

Получает один черновик с метаданными вложений.

ПараметрТипОбязательнаОписание
draft_idstringдаID черновика (начинается с dr_), возвращённый инструментом списка или создания. (макс. 128 символов)
ВозвращаетОбъект черновика с attachments.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "get_draft",
  "arguments": {
    "draft_id": "dr_123"
  }
}
Изменяет состояниеupdate_draft
PUT /drafts/:draft_id

Заменить содержимое черновика

Заменяет содержимое и получателей черновика. Это полная замена: пропущенные поля очищаются, поэтому сначала прочитайте get_draft и передайте все поля, которые хотите сохранить. Вложения не затрагиваются.

ПараметрТипОбязательнаОписание
draft_idstringдаID черновика (начинается с dr_), возвращённый инструментом списка или создания. (макс. 128 символов)
fromstringнетАдрес отправителя на подтверждённом домене (при создании черновика может быть пустым).
tostring[]нетПолучатели. (0–100 элементов)
ccstring[]нетПолучатели копии. (0–100 элементов)
bccstring[]нетПолучатели скрытой копии. (0–100 элементов)
subjectstringнетТема письма. (макс. 998 символов)
htmlstringнетHTML-версия письма.
textstringнетТекстовая версия письма.
reply_to_email_idstringнетID письма, на которое отвечает этот черновик.
thread_idstringнетID цепочки, к которой относится черновик.
ВозвращаетОбновлённый объект черновика.
АннотацииidempotentHint
Пример параметров tools/call
{
  "name": "update_draft",
  "arguments": {
    "draft_id": "dr_123",
    "from": "hello@example.com",
    "to": [
      "owner@example.com"
    ],
    "subject": "Invoice (updated)",
    "text": "Attached."
  }
}
Деструктивноdelete_draft
DELETE /drafts/:draft_id

Удалить черновик

DESTRUCTIVE: удаляет черновик и безвозвратно удаляет его сохранённые вложения.

ПараметрТипОбязательнаОписание
draft_idstringдаID черновика (начинается с dr_), возвращённый инструментом списка или создания. (макс. 128 символов)
Возвращает{ok: true}.
АннотацииdestructiveHint idempotentHint
Пример параметров tools/call
{
  "name": "delete_draft",
  "arguments": {
    "draft_id": "dr_123"
  }
}
Изменяет состояниеupload_attachment
POST /drafts/:draft_id/attachments

Загрузить вложение в черновик

Загружает один файл в черновик (не более 10 файлов и 10 МБ в сумме на письмо). Укажите content_base64 или локальный file_path. Для отправки вложений нужен платный тариф.

Укажите хотя бы одно из: content_base64, file_path.

ПараметрТипОбязательнаОписание
draft_idstringдаID черновика (начинается с dr_), возвращённый инструментом списка или создания. (макс. 128 символов)
filenamestringнетИмя файла, которое увидит получатель. По умолчанию — базовое имя из file_path. (макс. 255 символов)
content_typestringнетMIME-тип, например application/pdf. По умолчанию application/octet-stream.
content_base64stringнетСодержимое файла в стандартном base64.
file_pathstringнетАбсолютный путь к локальному файлу, доступному для чтения процессу MCP-сервера.
Возвращает{id: att_…, filename, contentType, sizeBytes, available}.
Пример параметров tools/call
{
  "name": "upload_attachment",
  "arguments": {
    "draft_id": "dr_123",
    "filename": "invoice.pdf",
    "content_type": "application/pdf",
    "file_path": "/tmp/invoice.pdf"
  }
}
Только чтениеdownload_attachment
GET /attachments/:attachment_id

Скачать вложение

Скачивает закрытое вложение (отправленного, полученного письма или черновика). Возвращает содержимое в base64 или записывает файл, если задан save_to_path (не перезаписывает существующий файл, если overwrite не равно true).

ПараметрТипОбязательнаОписание
attachment_idstringдаID вложения (начинается с att_), возвращённый инструментом списка или создания. (макс. 128 символов)
save_to_pathstringнетНеобязательный абсолютный локальный путь, по которому записать файл вместо возврата base64.
overwritebooleanнетРазрешить замену существующего файла по пути save_to_path. По умолчанию false.
Возвращает{attachment_id, filename, content_type, size_bytes, content_base64} or {attachment_id, filename, content_type, size_bytes, saved_to}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "download_attachment",
  "arguments": {
    "attachment_id": "att_123",
    "save_to_path": "/tmp/invoice.pdf"
  }
}
Деструктивноdelete_attachment
DELETE /attachments/:attachment_id

Удалить вложение

DESTRUCTIVE: безвозвратно удаляет сохранённое вложение (например, чтобы убрать файл из черновика перед отправкой).

ПараметрТипОбязательнаОписание
attachment_idstringдаID вложения (начинается с att_), возвращённый инструментом списка или создания. (макс. 128 символов)
Возвращает{ok: true}.
АннотацииdestructiveHint idempotentHint
Пример параметров tools/call
{
  "name": "delete_attachment",
  "arguments": {
    "attachment_id": "att_123"
  }
}

Хранимые шаблоны

Только чтениеlist_templates
GET /templates

Список хранимых шаблонов

Список хранимых шаблонов писем с состоянием публикации и статистикой использования. Результат разбит на страницы: он содержит pagination {offset, limit, returned, total?, has_more, next_offset}.

ПараметрТипОбязательнаОписание
lifecyclestringнетactive (по умолчанию), archived или all. (одно из active, archived, all)
querystringнетПоиск по имени или ключу. (макс. 120 символов)
limitintegerнетРазмер страницы. По умолчанию 50. (по умолчанию 50; 1–200)
offsetintegerнетКоличество пропускаемых записей. Используйте pagination.next_offset из предыдущей страницы. (по умолчанию 0; 0–…)
Возвращает{data: [templates], count, pagination}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "list_templates",
  "arguments": {
    "lifecycle": "active"
  }
}
Изменяет состояниеcreate_template
POST /templates

Создать хранимый шаблон

Создаёт шаблон с редактируемым черновиком, при необходимости на основе заготовки (welcome, reset, receipt или blank). Перед отправкой по ключу шаблон нужно опубликовать.

ПараметрТипОбязательнаОписание
namestringдаНазвание для людей. (макс. 120 символов)
keystringнетСтабильный ключ для отправки: строчные латинские буквы, цифры, дефисы; начинается с буквы (2–64 символа). Если не указан, формируется из названия.
starterstringнетНачальное содержимое. (одно из blank, welcome, reset, receipt)
Возвращает{template, draft, activeVersion, versions, usage}.
Пример параметров tools/call
{
  "name": "create_template",
  "arguments": {
    "name": "Account welcome",
    "key": "account-welcome",
    "starter": "welcome"
  }
}
Только чтениеget_template
GET /templates/:template_id

Получить шаблон

Получает текущий черновик шаблона (с revision), активный опубликованный релиз, историю релизов и статистику использования. Принимает ID или ключ.

ПараметрТипОбязательнаОписание
template_idstringдаID шаблона (tmpl_…) или ключ. (макс. 128 символов)
Возвращает{template, draft: {id, revision, subjectTemplate, htmlTemplate, textTemplate, variables, sampleData, …} | null, activeVersion, versions, usage}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "get_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Изменяет состояниеupdate_template_draft
PUT /templates/:template_id/draft

Сохранить черновик шаблона

Сохраняет редактируемый черновик шаблона с оптимистичной блокировкой: передайте текущую revision из get_template (409 означает, что кто-то сохранил раньше; перечитайте и повторите). Это полная замена содержимого черновика: пропущенные поля очищаются, поэтому передавайте все поля, которые хотите сохранить. Используйте плейсхолдеры {{variable}}.

ПараметрТипОбязательнаОписание
template_idstringдаID или ключ шаблона. (макс. 128 символов)
revisionintegerдаТекущая ревизия черновика из get_template. (1–…)
namestringнетНазвание шаблона. (макс. 120 символов)
subject_templatestringнетТема с плейсхолдерами. (макс. 998 символов)
preheader_templatestringнетТекст предпросмотра. (макс. 240 символов)
html_templatestringнетHTML-версия письма с плейсхолдерами.
text_templatestringнетТекстовая версия письма с плейсхолдерами.
fromstringнетОтправитель по умолчанию для отправок этого шаблона.
reply_tostringнетReply-To по умолчанию.
variablesobject[]нетТипизированный контракт переменных. Каждый элемент: {key (строчные буквы/подчёркивания), label, type: text|number|url|boolean, required (по умолчанию true), fallback, description}.
variables[].keystringда
variables[].labelstringнет
variables[].typestringнет(одно из text, number, url, boolean)
variables[].requiredbooleanнет
variables[].fallbackanyнет
variables[].descriptionstringнет
sample_dataobjectнетТестовые значения для предпросмотра и тестов.
Возвращает{template, draft: {revision: next}, validation: {valid, findings}}.
Пример параметров tools/call
{
  "name": "update_template_draft",
  "arguments": {
    "template_id": "account-welcome",
    "revision": 3,
    "name": "Account welcome",
    "subject_template": "Welcome, {{first_name}}",
    "text_template": "Hi {{first_name}}",
    "variables": [
      {
        "key": "first_name",
        "type": "text",
        "required": true
      }
    ],
    "sample_data": {
      "first_name": "Asha"
    }
  }
}
Изменяет состояниеcreate_template_draft
POST /templates/:template_id/draft

Начать новый черновик на основе опубликованного релиза

Создаёт новый редактируемый черновик как копию текущего опубликованного релиза (409, если черновик уже существует или ничего не опубликовано).

ПараметрТипОбязательнаОписание
template_idstringдаID или ключ шаблона. (макс. 128 символов)
Возвращает{draft}.
Пример параметров tools/call
{
  "name": "create_template_draft",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Только чтениеrender_template
POST /templates/:template_id/render

Отрендерить предпросмотр шаблона

Рендерит точный результат на сервере (subject, html, text) для черновика, опубликованного релиза или конкретной версии с переданными данными. Ничего не отправляет. Возвращает 422 с findings, если данные нарушают контракт переменных.

ПараметрТипОбязательнаОписание
template_idstringдаID или ключ шаблона. (макс. 128 символов)
version_idstringнетНеобязательный ID версии; по умолчанию — черновик, затем опубликованный релиз.
dataobjectнетЗначения переменных; по умолчанию — тестовые данные версии.
Возвращает{subject, html, text, preheader, versionId, versionNumber, isDraft, findings}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "render_template",
  "arguments": {
    "template_id": "account-welcome",
    "data": {
      "first_name": "Asha"
    }
  }
}
Отправляет реальные письмаsend_template_test
POST /templates/:template_id/test

Отправить тестовое письмо по шаблону

SENDS REAL EMAIL. Отправляет снимок черновика (или указанной версии) с префиксом [Test] указанным получателям. Учитывается в использовании; рабочие пространства в пробном периоде могут отправлять только на email аккаунта или адрес симулятора SES.

ПараметрТипОбязательнаОписание
template_idstringдаID или ключ шаблона. (макс. 128 символов)
tostring[]даТестовые получатели. (1–100 элементов)
fromstringнетОтправитель на подтверждённом домене; по умолчанию — From шаблона.
version_idstringнетНеобязательный ID версии.
dataobjectнетЗначения переменных; по умолчанию — тестовые данные.
Возвращает{id: em_…, providerMessageId, threadId, isTest: true}.
Пример параметров tools/call
{
  "name": "send_template_test",
  "arguments": {
    "template_id": "account-welcome",
    "to": [
      "owner@example.com"
    ]
  }
}
Изменяет состояниеpublish_template
POST /templates/:template_id/publish

Опубликовать релиз шаблона

Публикует текущий черновик как неизменяемый релиз, который будет использовать send_email с template.key. Завершается ошибкой 422 с findings при ошибках валидации или 409, если публикация нарушит действующий контракт переменных шаблона, уже используемого в продакшене.

ПараметрТипОбязательнаОписание
template_idstringдаID или ключ шаблона. (макс. 128 символов)
Возвращает{template, published}.
Пример параметров tools/call
{
  "name": "publish_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Изменяет состояниеarchive_template
POST /templates/:template_id/archive

Архивировать шаблон

Останавливает новые отправки по этому шаблону (история сохраняется; можно отменить через restore_template). Любая интеграция, отправляющая по этому ключу, начнёт получать ошибку 404.

ПараметрТипОбязательнаОписание
template_idstringдаID или ключ шаблона. (макс. 128 символов)
Возвращает{template}.
АннотацииidempotentHint
Пример параметров tools/call
{
  "name": "archive_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Изменяет состояниеrestore_template
POST /templates/:template_id/restore

Восстановить шаблон из архива

Снова делает архивный шаблон активным.

ПараметрТипОбязательнаОписание
template_idstringдаID или ключ шаблона. (макс. 128 символов)
Возвращает{template}.
АннотацииidempotentHint
Пример параметров tools/call
{
  "name": "restore_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}

Домены и DNS

Только чтениеlist_domains
GET /domains

Список доменов

Список доменов отправки со сводным setup_status (verified | checking | pending), состоянием DNS по каждой записи и статусом входящей почты. Может работать медленно: неподтверждённые домены перепроверяются в реальном времени. Результат разбит на страницы: он содержит pagination {offset, limit, returned, total?, has_more, next_offset}.

ПараметрТипОбязательнаОписание
limitintegerнетРазмер страницы. По умолчанию 50. (по умолчанию 50; 1–200)
offsetintegerнетКоличество пропускаемых записей. Используйте pagination.next_offset из предыдущей страницы. (по умолчанию 0; 0–…)
Возвращает{data: [domains with records], count, pagination}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "list_domains",
  "arguments": {}
}
Только чтениеget_domain
GET /domains/:domain_id

Получить параметры настройки домена

Получает один домен с точными DNS-записями для публикации (type, name, value), текущим состоянием каждой записи по данным двух публичных резолверов, dns_issues со способами исправления и статусом входящей почты.

ПараметрТипОбязательнаОписание
domain_idstringдаID домена (начинается с dom_), возвращённый инструментом списка или создания. (макс. 128 символов)
Возвращает{id, name, status, setup_status, dns_propagating, records: [{type, name, value, verified, dns_state}], dns_issues: [{code, message, …}], inbound_domain, inbound_status}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "get_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Изменяет состояниеadd_domain
POST /domains

Добавить домен отправки

Регистрирует домен, которым вы управляете, для отправки. Возвращает DNS-записи (CNAME для SES Easy DKIM), которые должен опубликовать владелец. Сам DNS не меняет. Учитывается в лимите доменов по тарифу.

ПараметрТипОбязательнаОписание
namestringдаГолое доменное имя, например example.com или mail.example.com. (макс. 253 символа)
default_fromstringнетНеобязательный адрес отправителя по умолчанию на этом домене.
Возвращает{id: dom_…, name, status: pending, records: [...], ses: {configured}}.
Пример параметров tools/call
{
  "name": "add_domain",
  "arguments": {
    "name": "example.com"
  }
}
Изменяет состояниеverify_domain
POST /domains/:domain_id/verify

Подтвердить домен

Запускает проверку SES/DNS в реальном времени. Можно безопасно повторять; после изменения DNS опрашивайте каждые 30–60 с (распространение может занять от нескольких минут до нескольких часов). Отправка разрешается, когда статус станет verified.

ПараметрТипОбязательнаОписание
domain_idstringдаID домена (начинается с dom_), возвращённый инструментом списка или создания. (макс. 128 символов)
Возвращает{domain, checks: {ses, dkim, dkim_status}, status: verified|pending}.
АннотацииidempotentHint
Пример параметров tools/call
{
  "name": "verify_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Деструктивноdelete_domain
DELETE /domains/:domain_id

Удалить домен

DESTRUCTIVE: удаляет домен из рабочего пространства вместе с маршрутом приёма входящей почты. Отправки с него сразу после этого начнут завершаться ошибкой. DNS-записи у вашего DNS-провайдера не удаляются.

ПараметрТипОбязательнаОписание
domain_idstringдаID домена (начинается с dom_), возвращённый инструментом списка или создания. (макс. 128 символов)
Возвращает{ok: true}.
АннотацииdestructiveHint idempotentHint
Пример параметров tools/call
{
  "name": "delete_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Только чтениеget_dns_provider
GET /dns/provider

Определить DNS-провайдера и хосты записей

Определяет авторитетного DNS-провайдера домена и возвращает относительный хост, который нужно ввести у этого провайдера для каждой записи, рекомендуемую DMARC-запись, рекомендации по входящей MX-записи и доступность настройки в один клик (Domain Connect).

ПараметрТипОбязательнаОписание
domain_idstringдаID домена (начинается с dom_), возвращённый инструментом списка или создания. (макс. 128 символов)
Возвращает{detectionStatus, detected, zone, nameservers, recordHosts: {recordId: host}, inbound, recommendations, authentication, providers: {domainConnect: {available, providerName}}}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "get_dns_provider",
  "arguments": {
    "domain_id": "dom_123"
  }
}

Входящая почта

Изменяет состояниеsetup_inbound
POST /domains/:domain_id/inbound/setup

Включить приём входящей почты для домена

Настраивает приём входящей почты через SES для подтверждённого домена. Использует корневой домен, если у него нет конфликтующей MX-записи, иначе inbound.<domain>. Возвращает MX-запись, которую должен опубликовать владелец; DNS не редактирует.

ПараметрТипОбязательнаОписание
domain_idstringдаID домена (начинается с dom_), возвращённый инструментом списка или создания. (макс. 128 символов)
Возвращает{domain: receiving domain, status: dns_pending|ready, record: {type: MX, name, value}}.
АннотацииidempotentHint
Пример параметров tools/call
{
  "name": "setup_inbound",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Изменяет состояниеverify_inbound
POST /domains/:domain_id/inbound/verify

Проверить входящую MX-запись

Повторно проверяет входящую MX-запись. Статус становится ready, когда её видят оба публичных резолвера.

ПараметрТипОбязательнаОписание
domain_idstringдаID домена (начинается с dom_), возвращённый инструментом списка или создания. (макс. 128 символов)
Возвращает{domain, status: ready|dns_pending|propagating|checking, record}.
АннотацииidempotentHint
Пример параметров tools/call
{
  "name": "verify_inbound",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Только чтениеlist_inboxes
GET /inboxes

Список входящих адресов

Список адресов получения, при необходимости для одного домена. Результат разбит на страницы: он содержит pagination {offset, limit, returned, total?, has_more, next_offset}.

ПараметрТипОбязательнаОписание
domain_idstringнетНеобязательный фильтр по ID домена.
limitintegerнетРазмер страницы. По умолчанию 50. (по умолчанию 50; 1–200)
offsetintegerнетКоличество пропускаемых записей. Используйте pagination.next_offset из предыдущей страницы. (по умолчанию 0; 0–…)
Возвращает{data: [{id, address, name, status, domainId}], count, pagination}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "list_inboxes",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Только чтениеget_inbox
GET /inboxes/:inbox_id

Получить почтовый ящик

Получает один входящий адрес.

ПараметрТипОбязательнаОписание
inbox_idstringдаID почтового ящика (начинается с inb_), возвращённый инструментом списка или создания. (макс. 128 символов)
ВозвращаетОбъект почтового ящика.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "get_inbox",
  "arguments": {
    "inbox_id": "inb_123"
  }
}
Изменяет состояниеcreate_inbox
POST /inboxes

Создать входящий адрес

Создаёт адрес вида support@<receiving domain> на домене со статусом входящей почты ready (сначала выполните setup_inbound и verify_inbound). Полученные письма появляются в list_emails с direction in.

ПараметрТипОбязательнаОписание
domain_idstringдаID домена (начинается с dom_), возвращённый инструментом списка или создания. (макс. 128 символов)
local_partstringдаЧасть адреса до @, например support. (макс. 64 символа)
namestringнетНеобязательное отображаемое имя.
Возвращает{id: inb_…, address, name, status: active}.
Пример параметров tools/call
{
  "name": "create_inbox",
  "arguments": {
    "domain_id": "dom_123",
    "local_part": "support",
    "name": "Support"
  }
}
Изменяет состояниеupdate_inbox
PATCH /inboxes/:inbox_id

Переименовать, включить или отключить почтовый ящик

Переименовывает почтовый ящик или задаёт его статус active / disabled.

ПараметрТипОбязательнаОписание
inbox_idstringдаID почтового ящика (начинается с inb_), возвращённый инструментом списка или создания. (макс. 128 символов)
namestringнетНовое отображаемое имя.
statusstringнетНовый статус. (одно из active, disabled)
ВозвращаетОбновлённый почтовый ящик.
АннотацииidempotentHint
Пример параметров tools/call
{
  "name": "update_inbox",
  "arguments": {
    "inbox_id": "inb_123",
    "status": "disabled"
  }
}
Отправляет реальные письмаset_inbox_forwarding
PUT /inboxes/:inbox_id/forwarding

Пересылать письма из почтового ящика на другой адрес

SENDS REAL EMAIL при пересылке кому-либо, кроме владельца аккаунта: задаёт, куда пересылаются полученные письма почтового ящика. Собственный адрес владельца активируется сразу; на любой другой адрес приходит письмо с подтверждением, и пересылка остаётся в статусе pending, пока там её не подтвердят. Передайте forward_to: null, чтобы отключить пересылку. Пересланные копии приходят с адреса ящика, исходный отправитель указывается в Reply-To.

ПараметрТипОбязательнаОписание
inbox_idstringдаID почтового ящика (начинается с inb_), возвращённый инструментом списка или создания. (макс. 128 символов)
forward_tostring,nullдаEmail-адрес, на который пересылать письма, или null, чтобы отключить пересылку. (макс. 254 символа)
ВозвращаетПочтовый ящик с forwardTo и forwardStatus (off, pending или active).
АннотацииidempotentHint
Пример параметров tools/call
{
  "name": "set_inbox_forwarding",
  "arguments": {
    "inbox_id": "inb_123",
    "forward_to": "team@example.net"
  }
}
Деструктивноdelete_inbox
DELETE /inboxes/:inbox_id

Удалить почтовый ящик

DESTRUCTIVE: удаляет входящий адрес. Уже полученные письма сохраняются; новые письма на этот адрес больше в него не попадают.

ПараметрТипОбязательнаОписание
inbox_idstringдаID почтового ящика (начинается с inb_), возвращённый инструментом списка или создания. (макс. 128 символов)
Возвращает{ok: true}.
АннотацииdestructiveHint idempotentHint
Пример параметров tools/call
{
  "name": "delete_inbox",
  "arguments": {
    "inbox_id": "inb_123"
  }
}

Доставляемость, отказы и стоп-лист

Только чтениеdeliverability_stats
GET /deliverability/stats

Статистика доставки за 30 дней

Итоги за 30 дней по всему рабочему пространству: sent, delivery, bounce, complaint, reject, open, click и deliveryRate (%).

Без параметров.

Возвращает{window: 30d, sent, delivery, bounce, complaint, reject, open, click, deliveryRate}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "deliverability_stats",
  "arguments": {}
}
Только чтениеlist_sender_reputation
GET /deliverability/reputation

Репутация отправителей

Состояние репутации по каждому конкретному адресу From: active, throttled (сниженный дневной лимит) или paused (отправки возвращают 423) с причиной и дневным лимитом. Проверяйте, когда отправки завершаются ошибкой 423 или 429. Результат разбит на страницы: он содержит pagination {offset, limit, returned, total?, has_more, next_offset}.

ПараметрТипОбязательнаОписание
limitintegerнетРазмер страницы. По умолчанию 50. (по умолчанию 50; 1–200)
offsetintegerнетКоличество пропускаемых записей. Используйте pagination.next_offset из предыдущей страницы. (по умолчанию 0; 0–…)
Возвращает{data: [{sender, status, dailyLimit, reason, cleanSince, warnedAt, pausedAt, evaluatedAt}], count, pagination}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "list_sender_reputation",
  "arguments": {}
}
Только чтениеlist_suppressions
GET /suppressions

Стоп-лист

Стоп-лист рабочего пространства: получатели, заблокированные после постоянного отказа или жалобы на спам. Отправки им завершаются ошибкой 422. Результат разбит на страницы: он содержит pagination {offset, limit, returned, total?, has_more, next_offset}.

ПараметрТипОбязательнаОписание
limitintegerнетРазмер страницы. По умолчанию 50. (по умолчанию 50; 1–200)
offsetintegerнетКоличество пропускаемых записей. Используйте pagination.next_offset из предыдущей страницы. (по умолчанию 0; 0–…)
Возвращает{data: [{email, reason, detail, created_at}], count, pagination}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "list_suppressions",
  "arguments": {}
}
Деструктивноremove_suppression
DELETE /suppressions/:email

Удалить запись об отказе из стоп-листа

DESTRUCTIVE (ослабляет защитную блокировку): удаляет запись об отказе из стоп-листа, чтобы на адрес снова можно было писать. Делайте это, только когда человек подтвердил, что адрес снова действителен. Записи о жалобах удалить нельзя (409).

ПараметрТипОбязательнаОписание
emailstringдаАдрес получателя в стоп-листе. (макс. 320 символов)
Возвращает{ok: true}.
АннотацииdestructiveHint idempotentHint
Пример параметров tools/call
{
  "name": "remove_suppression",
  "arguments": {
    "email": "fixed-mailbox@example.net"
  }
}
Только чтениеlist_blocked_recipients
GET /blocked-recipients

Список заблокированных получателей

Все получатели, которым SendHQ откажет в отправке: отказы, жалобы и отписки от маркетинговых писем в рамках домена, со сводкой по типам. Читает до 500 самых свежих записей. Результат разбит на страницы: он содержит pagination {offset, limit, returned, total?, has_more, next_offset}.

ПараметрТипОбязательнаОписание
limitintegerнетРазмер страницы. По умолчанию 50. (по умолчанию 50; 1–200)
offsetintegerнетКоличество пропускаемых записей. Используйте pagination.next_offset из предыдущей страницы. (по умолчанию 0; 0–…)
Возвращает{data: [{email, domain, kind: bounce|complaint|unsubscribe, reason, detail, source, status, created_at}], count, summary: {total, bounce, complaint, unsubscribe}, pagination}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "list_blocked_recipients",
  "arguments": {}
}

Аккаунт, использование, аналитика и ключи

Только чтениеget_account
GET /account

Получить аккаунт, использование и оплату

Email владельца аккаунта, тариф/уровень доступа, использованные в текущем периоде доставки получателям в сравнении с квотой, использованные домены в сравнении с лимитом, объём передачи вложений, сводка по репутации, состояние подписки, опубликованные тарифы и счётчики рабочего пространства. Используйте, чтобы проверить оставшуюся квоту или на какой адрес можно доставлять письма в пробном периоде (email аккаунта).

Без параметров.

Возвращает{user: {email, …}, usage: {domainsUsed, domainLimit, recipientDeliveries, emailQuotaMonth, attachmentBytes, attachmentByteLimit, periodKey}, access: {tier, planCode}, reputation, infrastructure, billing: {status, subscriptions, …}, plans, workspace: {mailer, stats}}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "get_account",
  "arguments": {}
}
Только чтениеget_analytics
GET /analytics

Получить аналитику отправки

Аналитика панели управления за последние 7, 30 или 90 дней: итоги по отправленным, полученным, доставленным, отказам, заблокированным, открытиям, кликам и жалобам, ежедневная динамика, основные домены отправки и самые частые темы.

ПараметрТипОбязательнаОписание
daysintegerнетОкно в днях: 7, 30 (по умолчанию) или 90. (одно из 7, 30, 90)
Возвращает{window, days, metrics, timeline: [{day, sent, received}], domains, topContent}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "get_analytics",
  "arguments": {
    "days": 30
  }
}
Только чтениеlist_api_keys
GET /keys

Метаданные API-ключей

Список имён API-ключей, несекретных префиксов и времени последнего использования. Только чтение: этот MCP-сервер не может создавать, ротировать или отзывать ключи; это делает человек в панели управления. Результат разбит на страницы: он содержит pagination {offset, limit, returned, total?, has_more, next_offset}.

ПараметрТипОбязательнаОписание
limitintegerнетРазмер страницы. По умолчанию 50. (по умолчанию 50; 1–200)
offsetintegerнетКоличество пропускаемых записей. Используйте pagination.next_offset из предыдущей страницы. (по умолчанию 0; 0–…)
Возвращает{data: [{id, name, prefix, lastUsedAt, createdAt}], count, pagination}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "list_api_keys",
  "arguments": {}
}
Только чтениеget_service_health
GET /health

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

Проверяет, что API SendHQ работает, и какой почтовый провайдер активен. Действительный API-ключ не нужен.

Без параметров.

Возвращает{ok, service, mailer}.
АннотацииreadOnlyHint idempotentHint
Пример параметров tools/call
{
  "name": "get_service_health",
  "arguments": {}
}

Покрытие API

Все операции публичного API и инструменты, которые их покрывают. Покрыто всё, что пользователь может сделать в панели управления и для чего есть API; перечисленные ниже исключения сделаны намеренно.

ЭндпоинтИнструментПримечания
POST /emailssend_emailОтправить одно письмо
POST /emails/batchsend_batchОтправить до 100 индивидуальных писем
GET /emailslist_emailsСписок отправленных и полученных писем
GET /emails/:idget_emailПолучить письмо и его вложения
PATCH /emails/:idmark_emailИзменить статус прочтения, архивации, спама, категорию или важность
POST /emails/:id/labelslabel_emailДобавить или снять метки с письма
DELETE /emails/:iddelete_emailУдалить сохранённое письмо
GET /emails/:id/eventslist_email_eventsСписок событий доставки письма
GET /threads/:idget_threadПолучить переписку в хронологическом порядке
GET /labelslist_labelsСписок меток с количеством писем и правилами сортировки
POST /labelscreate_labelСоздать метку, при необходимости с правилами автосортировки
GET /labels/:idget_labelПолучить метку по ID или имени
PATCH /labels/:idupdate_labelПереименовать метку, изменить её цвет или превратить в группу
DELETE /labels/:iddelete_labelУдалить метку, не удаляя её письма
POST /labels/:id/rulescreate_label_ruleДобавить к метке правило автосортировки
DELETE /labels/:id/rules/:rule_iddelete_label_ruleУдалить правило автосортировки
POST /draftscreate_draftСоздать черновик в редакторе
GET /draftslist_draftsСписок черновиков редактора
GET /drafts/:idget_draftПолучить черновик и вложения
PUT /drafts/:idupdate_draftЗаменить содержимое черновика
DELETE /drafts/:iddelete_draftУдалить черновик
POST /drafts/:id/attachmentsupload_attachmentЗагрузить вложение в черновик
GET /attachments/:iddownload_attachmentСкачать закрытое вложение
DELETE /attachments/:iddelete_attachmentУдалить закрытое вложение
GET /sending-identitieslist_sending_identitiesСписок подтверждённых адресов отправителя
GET /templateslist_templatesСписок хранимых шаблонов
POST /templatescreate_templateСоздать хранимый шаблон
GET /templates/:idget_templateПолучить черновики, релизы и статистику использования
PUT /templates/:id/draftupdate_template_draftАвтосохранение черновика шаблона
POST /templates/:id/draftcreate_template_draftСоздать новый черновик на основе опубликованного релиза
POST /templates/:id/renderrender_templateОтрендерить точный результат на сервере
POST /templates/:id/testsend_template_testОтправить тестовый снимок
POST /templates/:id/publishpublish_templateОпубликовать неизменяемый релиз шаблона
POST /templates/:id/archivearchive_templateАрхивировать шаблон
POST /templates/:id/restorerestore_templateВосстановить шаблон из архива
POST /domainsadd_domainДобавить домен отправки
GET /domainslist_domainsСписок доменов и кешированное состояние DNS
GET /domains/:idget_domainПолучить параметры настройки домена
POST /domains/:id/verifyverify_domainОбновить статус подтверждения в SES и DNS
POST /domains/:id/inbound/setupsetup_inboundНастроить приём входящей почты через SES
POST /domains/:id/inbound/verifyverify_inboundПроверить маршрутизацию входящей почты по MX
DELETE /domains/:iddelete_domainУдалить домен
GET /dns/providerget_dns_providerОпределить авторитетного DNS-провайдера и относительные хосты записей
GET /dns/domain-connect/connectget_domain_connect_linkСоздать ссылку согласия Domain Connect для настройки DNS в один клик
POST /inboxescreate_inboxСоздать входящий адрес
GET /inboxeslist_inboxesСписок входящих адресов
GET /inboxes/:idget_inboxПолучить входящий адрес
PATCH /inboxes/:idupdate_inboxПереименовать, включить или отключить почтовый ящик
PUT /inboxes/:id/forwardingset_inbox_forwardingПересылать полученные письма почтового ящика на другой адрес
DELETE /inboxes/:iddelete_inboxУдалить почтовый ящик с сохранением писем
GET /deliverability/statsdeliverability_statsПолучить статистику доставки за 30 дней
GET /deliverability/reputationlist_sender_reputationСостояние репутации по точному адресу отправителя
GET /suppressionslist_suppressionsСтоп-лист рабочего пространства
DELETE /suppressions/:emailremove_suppressionУдалить из стоп-листа допустимую запись об отказе
GET /blocked-recipientslist_blocked_recipientsСписок отказов, жалоб и отписок
GET /accountget_accountПолучить аккаунт, использование, состояние оплаты и счётчики рабочего пространства с помощью API-ключа
GET /analyticsget_analyticsПолучить аналитику отправки из панели управления за 7, 30 или 90 дней
GET /profileget_accountДвойник GET /account, доступный только в сессии; MCP-сервер читает маршрут с API-ключом.
POST /billing/checkoutне предоставляетсяИзменения оплаты намеренно доступны только в сессии и требуют действия владельца аккаунта в панели управления. Состояние оплаты можно прочитать через get_account.
POST /billing/cancelне предоставляетсяИзменения оплаты намеренно доступны только в сессии и требуют действия владельца аккаунта в панели управления. Состояние оплаты можно прочитать через get_account.
POST /keysне предоставляетсяНамеренно исключено: агент не должен выпускать или уничтожать учётные данные. Ключами управляет человек в панели управления.
GET /keyslist_api_keysСписок метаданных API-ключей
DELETE /keys/:idне предоставляетсяНамеренно исключено: агент не должен выпускать или уничтожать учётные данные. Ключами управляет человек в панели управления.

Намеренно недоступно

ВозможностьЭндпоинтыПричина
Создание, ротация, отзыв или удаление API-ключейPOST /keys, DELETE /keys/:idНамеренно исключено: агент не должен выпускать или уничтожать учётные данные. Ключами управляет человек в панели управления.
Оформление оплаты или отмена подпискиPOST /billing/checkout, POST /billing/cancelИзменения оплаты намеренно доступны только в сессии и требуют действия владельца аккаунта в панели управления. Состояние оплаты можно прочитать через get_account.
Настройка DNS Cloudflare в один клик (OAuth)GET /api/dns/cloudflare/connectТребует интерактивной сессии в браузере и согласия через OAuth Cloudflare. Вместо этого используйте записи из get_domain, хосты из get_dns_provider или get_domain_connect_link.
Регистрация, вход, выход, привязка аккаунта Google/api/auth/*Аутентификация человека в браузере; MCP-сервер аутентифицируется с помощью API-ключа.
Форма обращения в поддержкуPOST /api/contactПубличная форма на маркетинговом сайте для людей, а не операция рабочего пространства.

Машиночитаемый каталог: /docs/mcp/tools.json (схемы, аннотации, соответствие эндпоинтам, исключения). Версия этой страницы в Markdown: /docs/mcp.md. Если установлен CLI, команда sendhq commands --format json выводит тот же каталог.