gmail-mcp
Gmail для вашего ИИ-ассистента — несколько аккаунтов одновременно, на вашем собственном сервере.
gmail-mcp подключает Gmail к Claude и любому другому MCP клиенту. Он умеет искать и читать письма, отправлять и отвечать всем с цитируемой историей, пересылать, работать с вложениями и встроенными изображениями, а также управлять черновиками, метками и ветками — сразу в нескольких аккаунтах Google.
Он работает как удалённый сервер на вашем собственном Cloudflare Worker, поэтому одно и то же соединение отвечает из Claude Code на ноутбуке, claude.ai в браузере и Claude на телефоне. Каждое соединение входит в один аккаунт Google, а Google refresh-токен остаётся в вашем аккаунте Cloudflare.
Сюда людей приводят две вещи. Встроенные в Claude и Google коннекторы Gmail читают почту и создают черновики, но не могут отправлять письма и привязывают один аккаунт Google к одному аккаунту ассистента. Серверы, которые умеют отправлять, обычно являются локальными процессами — хороши за рабочим столом, но недоступны с телефона.
Сравнение
gmail-mcp | ||||||
Где запускается | Cloudflare Workers | у хостинг-провайдера | ваш сервер или локально | локально | локально | локально |
Доступно с телефона | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
Несколько ящиков одновременно | ✅ привязан к соединению | ❌ | ✅ выбирается при каждом вызове | ❌ только алиасы | ❌ | ✅ выбирается при каждом вызове |
Отправка почты | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
Вложения · встроенные изображения | ✅ | не документировано | ✅ | ✅ | ❌ | ✅ |
Ответить всем с цитируемой историей | ✅ | ❌ | только черновики | без цитирования | ❌ | ✅ |
Пересылка | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ |
Учитывает кодировку каждой части | ✅ | — | ❌ предполагается UTF-8 | ❌ предполагается UTF-8 | ❌ | ❌ |
Отклоняет CRLF-инъекцию в заголовках | ✅ | — | ✅ на уровне фреймворка | ✅ удаляет | ❌ никакой | ✅ |
Настройки ящика (фильтры, отпуск) | ❌ вне области | ❌ | фильтры | фильтры | ✅ | ❌ |
Количество инструментов | 24 | 11–16 | 14 (Gmail) | 30 | 64 | 11 |
Кто хранит ваш refresh-токен | вы | вендор | вы | вы | вы | вы |
google_workspace_mcp — самый полный проект здесь. Он охватывает весь Workspace, а не только Gmail, добавляет вашу подпись Gmail и загружает вложения прямо по URL — ни того, ни другого gmail-mcp не делает. shinzo-labs/gmail-mcp через свои 64 инструмента добирается до автоответчиков, делегированных аккаунтов и S/MIME; они живут в gmail.settings.* — области, которую gmail-mcp никогда не запрашивает, так что они остаются вне его досягаемости, что бы ни случилось с разрешением.
Два различия в архитектуре определяют почти всё остальное. Маршрутизация аккаунтов по аргументу вызова позволяет одному разрешению касаться каждого подключённого почтового ящика, тогда как привязка ящика к соединению означает, что неверный аргумент не достигает ничего. А при чтении локальные серверы декодируют каждую часть как UTF-8: письма в ISO-2022-JP и Shift_JIS приходят с искажениями, а длинные сообщения, которые Gmail хранит в виде блобов-вложений, возвращаются с пустым телом.
Развёртывание
Примерно десять минут. Вам понадобятся аккаунт Cloudflare, bun и аккаунт Google. Домен в аккаунте Cloudflare необязателен — без него Worker отвечает на workers.dev.
1 · Создайте Google OAuth-клиент
PROJECT="gmail-mcp-$(openssl rand -hex 3)"
gcloud auth login
gcloud projects create "$PROJECT" --name="gmail-mcp"
gcloud config set project "$PROJECT"
gcloud services enable gmail.googleapis.comGoogle не предоставляет API для следующих двух шагов, поэтому они выполняются в Cloud console:
Экран согласия OAuth → External, затем в разделе Audience нажмите Publish app. Если оставить статус Testing, Google истекает срок действия каждого refresh-токена через 7 дней, и каждое подключение умирает вместе со своим токеном. После публикации приложение показывает предупреждение о непроверенном приложении при входе и обслуживает до 100 аккаунтов.
Credentials → Create credentials → OAuth client ID → Web application, с
https://<your-host>/callbackв качестве авторизованного URI перенаправления. Сохраните client ID и секрет.
<your-host> — это домен, который вы указываете для Worker, или имя хоста workers.dev, которое он получает в противном случае. Можно сначала развернуть, а потом вернуться и заполнить это — руководство, которое Worker отдаёт по адресу /, показывает точное значение.
2 · Разверните Worker
Кнопка копирует репозиторий в ваш аккаунт GitHub, создаёт пространство имён KV и Durable Object и запрашивает четыре секрета. Развёртывание происходит на workers.dev; пользовательский домен подключается позже через Settings → Domains & Routes.
Вместо этого из терминала:
git clone https://github.com/mkpoli/gmail-mcp && cd gmail-mcp
bun install
bun run setupbun run setup спрашивает, на каком домене отвечать, создаёт или переиспользует пространство имён OAUTH_KV, принимает client ID и секрет, генерирует ключ cookie и развёртывает. Первые два ответа попадают в wrangler.local.jsonc, который git игнорирует — wrangler.jsonc не называет ни пространство имён какого-либо аккаунта, ни чей-либо домен, поэтому клон развёртывается где угодно. Повторный запуск setup для ротации одного секрета безопасен.
3 · Подключите клиент
Оставьте поля client ID и секрета пустыми — MCP-клиенты регистрируются сами.
claude mcp add --transport http gmail-personal https://<your-host>/mcp
claude mcp add --transport http gmail-work https://<your-host>/mcp/workЗапустите /mcp в Claude Code, чтобы подписать каждое подключение на свой аккаунт Google. В claude.ai это Settings → Connectors → Add custom connector с тем же URL. Любая метка из одного сегмента работает после /mcp/ — так одно развёртывание обслуживает несколько почтовых ящиков для клиентов, которые не принимают два сервера с общим URL.
Ваше развёртывание отдаёт это руководство по адресу https://<your-host>/.
Что умеет
whoami
search_messages
get_message
get_thread
get_attachment
send_message
reply_all
forward_message
create_draft
update_draft
send_draft
delete_draft
list_drafts
stage_attachment_begin
stage_attachment_append
stage_attachment_finish
list_labels
create_label
update_label
delete_label
modify_labels
modify_thread_labels
batch_modify_messages
trash_message · untrash_message
trash_thread · untrash_thread
Письма отправляются так, как их отправляет почтовый клиент: обычный текст с HTML-альтернативой, файловые вложения и встроенные изображения, на которые ссылаются через cid:, вложенные как multipart/mixed › multipart/related › multipart/alternative. Темы и отображаемые имена используют RFC 2047, имена файлов — RFC 2231, поэтому японский, китайский и эмодзи переживают путь без потерь.
reply_all читает Reply-To, From, To и Cc исходного письма, отбрасывает ваш собственный адрес и любой адрес, с которого вы отправляете почту, отвечает с того адреса, на который писал отправитель, переносит цепочку References и цитирует оригинал в тех частях, которые вы отправляете. forward_message воспроизводит пересылаемый конверт и может повторно прикрепить файлы оригинала.
create_draft с replyToMessageId записывает ответ как черновик для редактирования перед отправкой: он присоединяется к ветке оригинала, переносит In-Reply-To и References, вычисляет получателей ответа всем и тему Re: и цитирует оригинал. update_draft изменяет только те поля, которые ему переданы; получатели, текст, файлы, добавленные вручную в любом клиенте, и ветка, на которую отвечает черновик, считываются обратно и сохраняются. Файл, чей base64 не помещается в аргументы инструмента, вместо этого разбивается на этапы: stage_attachment_begin возвращает URL для загрузки, который принимает сырые байты одним curl -T, stage_attachment_append принимает base64 частями, и каждое поле attachments принимает полученный stagingId.
Чтение намеренно ограничено: тела сообщений и веток имеют лимиты символов, весь ответ имеет потолок в байтах, а вложение возвращается встроенно только пока оно достаточно мало для чтения. Длинная ветка списка рассылки или большой файл возвращаются обрезанными с пометкой об этом, а не заполняют контекст ассистента.
Как это работает
Два потока OAuth встречаются в одном Worker. MCP-клиент аутентифицируется у Worker; Worker аутентифицируется у Google от вашего имени. Ни одна сторона не хранит учётные данные другой.
sequenceDiagram
autonumber
participant C as MCP client<br/>(Claude Code · claude.ai)
participant W as Worker<br/>(OAuthProvider + McpAgent)
participant G as Google<br/>(OAuth + Gmail API)
C->>W: POST /register (dynamic client registration)
C->>W: GET /authorize (PKCE challenge)
W->>C: approval dialog
C->>G: consent screen — pick the account
G->>W: GET /callback?code=…
W->>W: allowlist check on the verified email
W->>G: exchange code → access + refresh token
W->>C: MCP access token (Google tokens sealed inside the grant)
C->>W: POST /mcp — tools/call
W->>G: Gmail REST (token refreshed as needed)
G->>W: message / thread / label data
W->>C: tool resultСлой | Файл | Что делает |
🔐 OAuth на стороне MCP | Динамическая регистрация клиентов, PKCE, гранты в KV с запечатанными внутри токенами Google | |
🔗 OAuth на стороне Google |
| Код авторизации с офлайн-доступом, одноразовое состояние, привязанное к сессии браузера, double-submit CSRF, белый список по подтверждённому email |
🤖 Агент |
| Один Durable Object на MCP-сессию, привязанный к аккаунту, который его открыл; single-flight обновление токена, троттлинг fan-out |
✉️ Почта |
| Построение RFC 822, обход MIME-дерева, декодирование кодировок, составление ответов и пересылок |
Создано с помощью
TypeScript на Cloudflare Workers — Durable Objects держат по одной MCP-сессии, KV хранит OAuth-гранты
Hono — маршрутизация для OAuth-эндпоинтов, колбэка Google и страницы настройки по адресу
/@cloudflare/workers-oauth-provider— сервер OAuth 2.1, против которого регистрируются MCP-клиентыagents—McpAgent, MCP-транспорт поверх Durable Objects@modelcontextprotocol/sdkс Zod — определения инструментов и валидация аргументовBun, Biome, Wrangler — установка, тесты, линтинг, развёртывание
Сам Gmail вызывается через обычный fetch против REST API. Официальный SDK googleapis предполагает Node и несёт гораздо больше, чем должен поставлять Worker, поэтому построение сообщений, разбор MIME и обновление токенов живут в src/gmail.ts и src/utils.ts вместо этого.
Эндпоинты
Путь | Назначение |
| MCP-эндпоинт |
| Тот же сервер под любой меткой из одного сегмента, для клиентов, которые не принимают два сервера с общим URL |
| Это руководство по настройке |
| Механика OAuth |
Кто может войти
ALLOWED_EMAILS решает, проверяя адрес, который Google сообщает как подтверждённый — после согласия, до создания любого гранта.
Значение | Кто получает доступ |
(пусто) | никто |
| эти аккаунты |
| любой в этом домене |
| любой подтверждённый аккаунт Google |
Каждый грант достигает только того почтового ящика, который его аутентифицировал, поэтому расширение этого списка никогда не расширяет доступ к уже подключённым почтовым ящикам. Установка * позволяет посторонним использовать ваше развёртывание и квоту вашего Google-клиента для своей собственной почты.
Лимиты
Два потолка защищают общее развёртывание от истощения, оба задаются в wrangler.jsonc:
Настройка | Где | По умолчанию | Что ограничивает |
|
|
| Примерно сколько различных аккаунтов Google могут когда-либо завершить вход. Уже подключённые аккаунты продолжают работать при достижении предела; новые отклоняются. Входы, поступающие одновременно, каждый читают счётчик до того, как любой из них будет записан, поэтому итог может оказаться чуть выше этого числа. Google ограничивает непроверенные приложения 100 пользователями, поэтому оставьте запас ниже этого. |
|
|
| Вызовы Gmail, которые один аккаунт может сделать в этом окне, во всех своих сессиях. Cloudflare ведёт этот счётчик по местоположениям, поэтому аккаунт, подключающийся из двух регионов, получает примерно столько в каждом. Широкое чтение тратит несколько: |
|
|
| Регистрации клиентов, которые один адрес может сделать в этом окне. Клиент регистрируется один раз и сохраняет выданный ему id, поэтому обычное использование никогда не приближается к этому; потолок нужен потому, что регистрация не требует учётных данных и каждая записывает в KV. |
На тарифе Workers Free действует дополнительный предел: 50 исходящих запросов на один вызов. Широкое чтение тратит по одному запросу на сообщение, поэтому search_messages и list_drafts там требуют maxResults не выше 45; выше этого излишек возвращается как ошибки на каждое сообщение, а не как результаты. Платный тариф допускает 1000.
Поднимите любой из них и переразверните. Ограничитель скорости Cloudflare считывает свой потолок из привязки во время сборки, так что simple.limit на каждом из них — единственное место, где это меняется. Развёртывание для одного пользователя может оставить оба значения без изменений — обычное использование ассистента находится далеко ниже них.
Безопасность
Самостоятельный хостинг перемещает вопрос доверия, а не устраняет его, поэтому вот где всё находится.
Ваши токены остаются вашими. Refresh-токены зашифрованы внутри их OAuth-гранта в вашем пространстве имён KV. Durable Object сессии хранит часовой access-токен, а MCP-агентный фреймворк держит копию гранта там, пока жив объект, включая refresh-токен. Оба хранилища — ваш собственный аккаунт Cloudflare, зашифрованный в состоянии покоя. Почта никогда не хранится — она проходит насквозь.
Одна сессия — один почтовый ящик. MCP-сессия привязана к аккаунту, который её открыл, поэтому грант для одного ящика не может действовать на другой через заимствованный идентификатор сессии.
Минимализм областей доступа.
gmail.modifyпокрывает чтение, отправку, метки и корзину. Он исключает окончательное удаление и всеgmail.settings.*, не позволяя правилам авто-пересылки и фильтрам-эксфильтрациям — классическим бэкдорам почтового ящика — выйти за пределы того, что может сделать украденный грант. Рядом с ним запрашиваются два read-only скоупа,userinfo.emailиuserinfo.profile: именно они позволяют allowlist и привязке сессии знать, какой аккаунт вошёл, и они не касаются почты.Заголовки нельзя протащить. Каждое исходящее значение заголовка отклоняется, если содержит CR, LF или NUL, так что ни один аргумент не может вырваться из своего поля, чтобы добавить другое — например,
Bccвнутри темы письма. Типы медиа проверяются, а цитируемая история экранируется как HTML. Это не контролирует сами аргументы:bcc— реальный параметр, поэтому модель, действующая по инструкции, скрытой в теле сообщения, всё ещё может его заполнить, и ваш запрос на подтверждение в клиенте остаётся проверкой этого.Доступ можно отозвать. Сужение
ALLOWED_EMAILSостанавливает новые входы. Доступ одного аккаунта отзывается на myaccount.google.com/connections. Ротация секрета клиента Google аннулирует все гранты сразу.
Worker расшифровывает почту в памяти, обслуживая запрос, как это должен делать любой хостируемый ретранслятор. Если это неприемлемо для конкретного ящика, запустите локальный MCP-сервер для него.
Как это тестировалось
253 юнит-теста покрывают построение сообщений (вложенность MIME, переносы RFC 2047, имена файлов RFC 2231, отклонение CR/LF, перенос base64), извлечение тела в разных кодировках, составление ответов и пересылок, потоки токенов Google, allowlist входа, проверки CSRF и привязки состояния, защищающие браузерную сторону входа, и сами инструменты против подставного Gmail — владение сессией, составление получателей, выбор вложений и то, что возвращает частично неудачное чтение.
Кроме того, каждый инструмент запускался против реальных аккаунтов Gmail, а отдельный аккаунт проверял, что пришло:
Область | Результат |
Кодировка | Японские темы, перенесённые через закодированные слова; эмодзи, последовательности ZWJ, арабский RTL, комбинируемые знаки и редкие CJK прошли туда-обратно без изменений |
Вложения | CSV с именем |
Потоки |
|
Два аккаунта | Оба подключены к одному развёртыванию одновременно; идентификатор сообщения из одного вернул |
Организация | Вложенная CJK-метка создана, переименована, применена пакетно и удалена; корзина потока и сообщения обе отменены |
Масштаб | Почтовый ящик на 15 000 сообщений проиндексирован с операторами Gmail и пагинацией без срабатывания лимита запросов |
Разработка
bun run dev # wrangler dev on :8788
bun run check # biome + tsc
bun test # 253 unit tests
bun run assets # regenerate the light and dark diagrams
bun run deployВопросы и ошибки
Откройте issue.
Лицензия
Copyright © 2026 mkpoli. Выпущено под лицензией MIT.
src/workers-oauth-utils.ts является производным от remote-mcp-github-oauth demo в cloudflare/ai, Copyright © 2025 Cloudflare, Inc., используется под лицензией MIT. См. THIRD-PARTY.md.
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Manage Gmail end-to-end: search, read, send, draft, label, and organize threads. Automate workflow…
Authenticated email gateway for AI agents — per-agent inboxes, HITL approval, SPF/DKIM verified.
Authenticated email gateway for AI agents — per-agent inboxes, HITL approval, SPF/DKIM verified.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Bloody-Regina/personal-gmail-mcp-bloodyregina'
If you have feedback or need assistance with the MCP directory API, please join our Discord server