ИИ-агенты и MCP

Почтовый ящик для Claude Code, Cursor и Windsurf через MCP

Любой кодинг-агент останавливается на одной и той же фразе: «проверьте почту и введите код». Решение — один MCP-сервер, один URL, ни ключа, ни аккаунта, — но настройка в каждом клиенте своя. Вот она для Claude Code, Claude Desktop, Cursor, Windsurf, VS Code, Codex CLI и Gemini CLI, вместе с четырьмя вызовами инструментов, которые проводят регистрацию от начала до конца, и абзацем, который стоит добавить в собственные инструкции агента.

  • Начальный
  • 14 мин на чтение
Открытый серый ноутбук, в бок которого вставлен синий конверт наподобие USB-накопителя, и синяя вилка в серой розетке впереди

Один сервер, семь клиентов

Сервер — это единственный HTTPS-эндпоинт, говорящий на Model Context Protocol через Streamable HTTP: один POST с JSON-RPC внутри, один JSON-ответ, никакого держащегося открытым потока. На публичных доменах ничего не нужно устанавливать, ничего запускать локально и никуда регистрироваться — вся настройка сводится к одному URL:

Эндпоинт MCPhttps://grabmail.io/mcp

Любой клиент MCP умеет работать с удалённым HTTP-сервером, но каждый хранит настройку в своём файле и под слегка отличающимся именем ключа. В разделах ниже — точная строка для каждого. Форматы приведены по состоянию на сентябрь 2026 года; если что-то с тех пор изменилось, авторитетный источник — собственная документация клиента.

Проверьте, что сервер отвечает, из shell

Прежде чем трогать какой-либо клиент, убедитесь, что сервер на месте, и посмотрите, что он предлагает. Поскольку транспорт — это обычный HTTP, хватит одного curl:

получить список инструментов
$ curl -s -X POST https://grabmail.io/mcp -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | jq '.result.tools[].name'
что приходит в ответ
"create_inbox"
"list_domains"
"list_messages"
"read_message"
"wait_for_message"
"delete_message"

Если это работает, заработает и любой клиент ниже, а если конкретный клиент всё же не срабатывает, дело в его настройке, а не в сервере. Если не работает даже это, проверьте, что ваша сеть разрешает исходящий HTTPS к grabmail.io, — это весь сетевой след целиком.

Claude Code

Одна команда, из любого каталога. Она регистрирует сервер для вашего пользователя, поэтому он становится доступен в любом проекте:

shell
$ claude mcp add --transport http grabmail https://grabmail.io/mcp

Чтобы вместо этого поделиться сервером с командой через репозиторий, ограничьте область действия проектом. Это запишет .mcp.json в корень, который попадает под контроль версий, и коллегам будет предложено подтвердить его использование:

shell — область проекта
$ claude mcp add --transport http --scope project grabmail https://grabmail.io/mcp
.mcp.json — что записывает область проекта
{
  "mcpServers": {
    "grabmail": {
      "type": "http",
      "url": "https://grabmail.io/mcp"
    }
  }
}

Перезапустите Claude Code, выполните /mcp — и grabmail появится в списке со всеми шестью инструментами. Сервер также отвечает на протокольный вызов initialize коротким абзацем инструкций, который Claude Code передаёт модели, — так что агент сразу знает, что нужно отдавать алиас и ждать по адресу.

Claude Desktop

Удалённые серверы добавляются через само приложение, а не через файл настройки:

  1. Settings → Connectors → Add custom connector.
  2. Вставьте https://grabmail.io/mcp в качестве URL и дайте ему имя.
  3. Начните новый диалог — и инструменты появятся под этим коннектором.

В версии, которая принимает только локальные серверы в claude_desktop_config.json, свяжите удалённый эндпоинт через mcp-remote — он выполняется как локальный процесс и перенаправляет вызовы на URL:

claude_desktop_config.json — через мост mcp-remote
{
  "mcpServers": {
    "grabmail": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://grabmail.io/mcp"]
    }
  }
}

Cursor

Cursor читает .cursor/mcp.json в проекте (либо ~/.cursor/mcp.json для всех проектов сразу). Удалённый сервер задаётся через url:

.cursor/mcp.json
{
  "mcpServers": {
    "grabmail": {
      "url": "https://grabmail.io/mcp"
    }
  }
}

Откройте Cursor Settings → MCP, чтобы увидеть сервер в списке и включить его инструменты. В режиме Agent модель вызывает их сама; в чате их можно запросить по имени.

Windsurf

Windsurf хранит свои серверы в ~/.codeium/windsurf/mcp_config.json, и ключ для удалённого сервера — serverUrl, а не url, — единственное место, где формат отличается:

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "grabmail": {
      "serverUrl": "https://grabmail.io/mcp"
    }
  }
}

Cascade показывает сервер в списке после обновления панели MCP. К тому же файлу можно попасть через Windsurf Settings → Cascade → MCP servers → View raw config.

VS Code

Режим агента в VS Code читает .vscode/mcp.json в рабочей области, либо файл уровня пользователя, который создаёт команда MCP: Add Server в палитре команд. Серверы живут в разделе servers, а не mcpServers, и удалённый сервер объявляет свой транспорт:

.vscode/mcp.json
{
  "servers": {
    "grabmail": {
      "type": "http",
      "url": "https://grabmail.io/mcp"
    }
  }
}

Над записью в редакторе появляется небольшая ссылка «Start»; после этого инструменты показываются в выборе инструментов чата, а режим агента вызывает их без дополнительных просьб.

Codex CLI и Gemini CLI

Codex CLI хранит настройку в TOML по пути ~/.codex/config.toml. Удалённый сервер — это таблица с url:

~/.codex/config.toml
[mcp_servers.grabmail]
url = "https://grabmail.io/mcp"

Gemini CLI читает ~/.gemini/settings.json (либо .gemini/settings.json в проекте), и ключ для сервера Streamable HTTP — httpUrl:

~/.gemini/settings.json
{
  "mcpServers": {
    "grabmail": {
      "httpUrl": "https://grabmail.io/mcp"
    }
  }
}

Версия любого из них, принимающая только локальные серверы, может достучаться до эндпоинта через тот же мост mcp-remote, что показан для Claude Desktop: command = "npx", args = ["-y", "mcp-remote", "https://grabmail.io/mcp"].

Шесть инструментов

Независимо от клиента модель видит одни и те же шесть инструментов под одними и теми же именами. Между вызовами не нужно поддерживать состояние, и ни одному из них не нужен аргумент, которого не вернул предыдущий вызов.

create_inbox
Придумывает новый адрес и возвращает его вместе с алиасом и полем next_step, объясняющим, что использовать где. На сервере ничего не резервируется, поэтому вызов не может провалиться. Принимает необязательный, удобочитаемый prefix.
wait_for_message
Блокирует вызов до прихода письма на адрес, максимум на 25 секунд, а затем возвращает его целиком — тему, отправителя, обычный текст, HTML. Фильтруйте через subject_contains или from_contains; передайте since_id, чтобы игнорировать то, что уже было. После тихого ожидания отвечает timed_out и просит вызвать себя снова.
read_message
Одно письмо целиком по id. Нужен редко, потому что ожидание и так уже возвращает письмо целиком.
list_messages
Всё, что ждёт по адресу, от новых к старым, сразу же — в том числе когда там ничего нет.
list_domains
Публичные домены, которыми может пользоваться кто угодно, — на случай, если форма только что отказала одному из них.
delete_message
Удаляет письмо сразу, а не через 5 дней. Идемпотентно, так что повторный вызов агентом ничего не стоит.

Цикл регистрации за четыре вызова

Эта последовательность нужна почти в любой задаче, и клиент её не меняет:

  1. create_inbox. В ответ приходят адрес, алиас и пометка, что есть что.
  2. Алиас идёт в форму. Сайт получает рабочий адрес, который доставляет почту в ящик, но не может использоваться, чтобы этот ящик открыть.
  3. wait_for_message по адресу, сразу после отправки формы, с subject_contains, выставленным на слово, которое будет в письме с подтверждением. Вызов блокируется; агенту не нужно строить собственный цикл.
  4. Код извлекается из письма, которое вернуло ожидание. Дальнейших вызовов обычно вообще не требуется.
промпт, который проходит весь цикл целиком
Sign up for a trial at https://app.example.com/signup with a fresh GrabMail inbox.
Use the ALIAS in the form, wait for the confirmation code with wait_for_message
on the ADDRESS, enter it, and tell me the resulting login.

Что добавить в собственные инструкции агента

Сервер сообщает модели, как им пользоваться, ещё в момент подключения, но модель, прочитавшая те же четыре правила в собственных инструкциях проекта, следует им каждый раз, а не почти каждый. Добавьте это в CLAUDE.md, .cursor/rules, .windsurfrules, AGENTS.md или GEMINI.md — смотря что читает ваш клиент:

CLAUDE.md, .cursor/rules, AGENTS.md — один и тот же абзац
## Email

- To receive email, use the `grabmail` MCP server. Call `create_inbox` once per task.
- Put the **alias** it returns into forms; poll the **address** it returns with `wait_for_message`.
- Call `wait_for_message` right after submitting a form, with `subject_contains` set to a word
  you expect ("code", "verify", "confirm"). If it returns `timed_out`, call it again — up to
  three times — before concluding the mail was not sent.
- Never reuse an inbox across tasks. Never send anything confidential to one: it is public.

Два самых важных правила — это как раз то, что агент делает неправильно, если ему не сказать: вставлять в форму алиас, а опрашивать адрес, и относиться к timed_out как к «вызови снова», а не как к «письмо так и не отправили». В «Ящик, который может прочитать AI-агент» оба этих правила разобраны подробно, включая то, почему ожидание может завершиться раньше, чем придёт почта.

Когда что-то не работает

СимптомПричинаРешение
Сервер не появляется в спискеФайл настройки лежит не там, использует не тот ключ (url / serverUrl / httpUrl / servers), либо клиент не был перезапущен.Скопируйте блок для вашего клиента без изменений, перезапустите его и выполните curl выше, чтобы исключить проблему на стороне сервера.
Инструменты в списке есть, но модель их не вызываетИнструменты отключены в панели MCP клиента, либо модели не сообщили, что в задаче есть почтовый шаг.Включите их и добавьте абзац с инструкциями выше.
wait_for_message постоянно возвращает timed_outФорма так и не была отправлена, алиас введён с опечаткой, сайт отказал домену, либо уже выполняется 8 ожиданий.Вызовите снова, до трёх раз; проверьте собственную ошибку формы; прочитайте «Почему формы регистрации блокируют одноразовую почту».
Сайт говорит, что адрес недействителенПубличный домен есть в чёрном списке одноразовой почты.Используйте собственный домен (одна MX-запись) или домен из пула, который держат подальше от списков.
Мост (mcp-remote) не запускаетсяНа машине нет Node, либо npx не может достучаться до реестра.Установите Node 18 или новее, либо используйте версию клиента, принимающую URL напрямую.

Прежде чем считать задачу закрытой

  • curl выше возвращает шесть инструментов с вашей машины.
  • После перезапуска сервер появляется в панели MCP клиента, инструменты включены.
  • Абзац с инструкциями лежит в файле, который читает ваш клиент.
  • Тестовый промпт довёл регистрацию до конца: алиас в форме, ожидание по адресу, код считан.
  • На эти ящики никогда не отправится ничего конфиденциального — они публичные.

Вот и вся настройка. Тот же сервер работает из любого фреймворка, который говорит на MCP, а для агентов, построенных без MCP, — обычной функции-инструмента в LangChain, OpenAI Agents SDK или вашем собственном цикле — в «Почта для AI-агентов» показана REST-версия тех же четырёх шагов.

Вопросы

Нужен ли API-ключ или аккаунт для MCP-сервера?

Нет. Публичные домены не требуют ни ключа, ни аккаунта, ни заголовка, а MCP-сервер отдаёт ровно то же самое, что и REST API. Bearer-токен, передаваемый заголовком Authorization на эндпоинте, используется только для платного пула доменов, которые держат подальше от чёрных списков одноразовой почты.

Это Streamable HTTP или SSE?

Streamable HTTP: один POST, один JSON-ответ. Держать открытым поток событий не нужно, поэтому wait_for_message и ограничен 25 секундами, — а клиенту, открывающему GET в ожидании SSE, обычным JSON сообщают, что такового не предусмотрено.

Могут ли несколько агентов использовать сервер одновременно?

Да. Состояния сессии не существует; каждый вызов несёт в себе всё необходимое. Единственное общее ограничение — не больше 8 вызовов wait_for_message одновременно на всех сразу; при превышении инструмент сразу отвечает timed_out и просит вызвать себя снова, а это уже покрывается абзацем с инструкциями выше.

Почему wait_for_message завершается раньше, чем приходит почта?

Потому что серверный воркер, спящий по несколько минут, — это воркер, которым не может воспользоваться никто другой. Ожидание ограничено 25 секундами и честно отвечает timed_out, а не падает с ошибкой; агент просто вызывает его снова. Три вызова — это больше минуты ожидания, чего хватает для любого транзакционного письма, которое действительно было отправлено.

Может ли агент ещё и отправлять почту?

Нет. Сервис специально сделан только для приёма: бесплатный сервер без аккаунта, который умел бы ещё и отправлять почту, за час превратился бы в ретранслятор спама. Агенту, которому нужно отправлять почту, требуется провайдер отправки; этот сервер — для чтения того, что приходит в ответ.

Приватен ли ящик для моего агента?

Нет. Прочитать его может любой, кто знает адрес, — и на публичном домене, и на вашем собственном. Именно для этого существует алиас: сайт получает адрес, который доставляет почту в ящик, но не может использоваться, чтобы этот ящик открыть. Никогда не позволяйте агенту отправлять на эти ящики что-либо конфиденциальное.

Какая настройка клиента считается эталонной, если что-то из этого изменится?

Собственная документация каждого клиента. Форматы выше приведены по состоянию на сентябрь 2026 года; серверная сторона от них не зависит — это один URL, и его может вызвать любой клиент, умеющий обращаться к удалённому MCP-серверу по HTTP.

Читать дальше

Попробуйте, пока свежо

Адрес — это один клик, без аккаунта и карты. Всё из этого руководства сразу заработает на нём.

С возвращением

Ваши ящики и ваши домены в одном месте.