Skip to main content
Glama
REVREBEL

Google Calendar MCP OAuth Proxy

by REVREBEL

Google Calendar MCP OAuth-прокси

Этот Worker выступает в роли OAuth-границы между MCP-клиентом, таким как Codex, и официальным Calendar MCP от Google.

Codex / MCP client
        |
        | OAuth to this Worker
        v
Cloudflare OAuth Provider
        |
        | Google OAuth (client ID + client secret)
        v
Google OAuth
        |
        | Google access token
        v
Google Calendar MCP
https://calendarmcp.googleapis.com/mcp/v1

Клиент никогда не получает OAuth-клиентский секрет Google. Access- и refresh-токены Google хранятся в зашифрованных свойствах OAuth-grant, управляемых Cloudflare OAuth-провайдером. Защищённый обработчик /mcp перед передачей MCP-трафика наверх заменяет локальный bearer-токен клиента на Google access-токен пользователя.

Области Google

В wrangler.jsonc области Google Calendar задаются в переменной GOOGLE_OAUTH_SCOPES:

https://www.googleapis.com/auth/calendar.calendarlist.readonly
https://www.googleapis.com/auth/calendar.events.freebusy
https://www.googleapis.com/auth/calendar.events.readonly
https://www.googleapis.com/auth/calendar.calendars

Worker автоматически добавляет email profile, потому что при обратном вызове для идентификации авторизованного пользователя используется user-info endpoint Google.

В запросе авторизации Google также используются параметры access_type=offline и prompt=consent, чтобы Google возвращал refresh-токен.

Related MCP server: google-mcp-server

Локальные секреты

Скопируйте файл-пример:

cp .dev.vars.example .dev.vars

Задайте:

GOOGLE_CLIENT_ID=<Google OAuth web client ID>
GOOGLE_CLIENT_SECRET=<Google OAuth client secret>
COOKIE_ENCRYPTION_KEY=<strong random secret>
HOSTED_DOMAIN=<optional Google Workspace domain restriction>

GOOGLE_OAUTH_SCOPES и GOOGLE_MCP_URL — это несекретные переменные Worker в wrangler.jsonc.

OAuth-клиент Google Cloud

Используйте OAuth-клиент Google типа веб-приложение.

Авторизованный redirect URI должен быть публичным именем хоста этого Worker или туннеля с добавлением /callback:

https://mcp-auth.example.com/callback

Добавьте указанные выше области Calendar в конфигурацию согласия и доступа к данным Google Auth Platform.

Локальный запуск

Установите зависимости и сгенерируйте типы Worker:

npm install
npm run cf-typegen

Запустите Wrangler локально на порту 5555:

npm run dev

Локальный endpoint:

http://localhost:5555/mcp

OAuth requires public HTTPS callback, поэтому для полного локального тестирования используйте Cloudflare Tunnel.

Stable named tunnel

Стабильное имя хоста предпочтительно, потому что один и тот же callback должен быть зарегистрирован в Google Cloud.

npx wrangler dev --tunnel-name=mcp-google-auth --tunnel

Настройте имя хоста именованного туннеля так, чтобы оно вело на разработочённый сервер Wrangler. Например:

https://mcp-auth.example.com  ->  local Wrangler dev server

Затем укажите:

https://mcp-auth.example.com/callback

в качестве redirect URI для Google OAuth.

URL MCP, который видит Codex:

https://mcp-auth.example.com/mcp

Конфигурация Codex

Поскольку для Codex этот Worker является OAuth-сервером авторизации, Codex не нужен Google client ID или Google client secret.

[mcp_servers.google_calendar_proxy]
enabled = true
url = "https://mcp-auth.example.com/mcp"
auth = "oauth"

Затем выполните аутентификацию:

codex mcp login google_calendar_proxy

Ожидаемый процесс:

  1. Codex обнаруживает OAuth-эндпоинты этого Worker.

  2. Codex регистрируется на этом Worker или проходит аутентификацию.

  3. Worker перенаправляет браузер в Google.

  4. Google возвращается на /callback на Worker/туннеле.

  5. Worker обменивает код авторизации Google на токены, используя GOOGLE_CLIENT_SECRET.

  6. Codex получает OAuth-токен, выпущенный Worker.

  7. Вызовы /mcp перенаправляются в официальный Calendar MCP Google с использованием Google access-токена пользователя.

Поведение при обновлении токенов

Google refresh-токен сохраняется в зашифрованных свойствах OAuth-grant. Прокси хранит ограниченный LRU-кэш Google access-токенов, локальный для изолята, удаляет записи при наступлении окна обновления и ограничивает кэш 100 пользователями. Если сохранённый access-токен истёк или Google MCP возвращает 401, Worker использует Google refresh-токен и клиентский секрет на стороне Worker, чтобы выпустить новый Google access-токен, и повторяет запрос один раз.

Кэш в памяти — лишь оптимизация. Новый изоляnированный Worker в любой момент может выполнить обновление из зашифрованных свойств grant.

Устаревшие гранты

OAuth-гранты, созданные до появления поддержки refresh-токенов, содержат только исходный Google access-токен и метаданные пользователя. Прокси обнаруживает такие гранты и продолжает использовать их существующий access-токен, пока Google его принимает. Когда Google отклоняет этот токен, Worker возвращает 401 invalid_token, чтобы подключение MCP можно было авторизовать заново, а не пытаться выполнить обновление с отсутствующими учётными данными.

Related MCP Connectors

Related MCP Servers