ChatGPT или Claude в браузере
Подключите ChatGPT или Claude в браузере к Google Календарю через свой HTTPS-туннель и код входа.
Это руководство для случая, когда приложение ИИ в браузере или на телефоне — например ChatGPT или Claude — должно читать ваш Google Календарь через gcal. Такое приложение не может запустить gcal на вашем компьютере, поэтому вы даёте ему интернет-адрес. В итоге приложение подключено к gcal через отдельный HTTPS-адрес, может делать только то, что разрешает профиль, а вы знаете, как остановить подключение или отозвать доступ.
Термины в этом руководстве:
- MCP (Model Context Protocol) — стандарт, по которому приложение ИИ вызывает внешние инструменты.
gcal personal mcp serve— MCP-сервер, который входит вgcal; для приложения на своём компьютере см. агенты. - Удалённое подключение означает, что приложение обращается со своих серверов через интернет к указанному вами адресу. Для этого
gcal personal mcp serve --httpпредоставляет те же инструменты по HTTP на127.0.0.1. - HTTPS-туннель — программа, которая даёт порту вашего компьютера публичный HTTPS-адрес. Здесь используется Tailscale Funnel; подойдёт и Cloudflare Tunnel. Для Funnel не нужно покупать домен.
- Публичный URL — этот адрес, например
https://laptop.tail1234.ts.net. Вы передаёте егоgcalчерез--public-url, а приложение получает его с/mcpв конце. - Код входа — одноразовый код, который
gcalвыводит в терминале. Страница входа приложения запрашивает этот код, поэтому подключить приложение может только человек, который видит терминал.
ChatGPT / Claude ──internet──▶ Tailscale Funnel ──▶ gcal personal mcp serve --http (login) ──▶ Google CalendarЕсли Tailscale уже работает, используйте существующее подключение: второй туннель не нужен. Локальное подключение через стандартные потоки ввода и вывода продолжает работать.
Перед началом
- Тот, кто вошёл, читает ваш календарь. События, их описания, участников и людей, с которыми вы встречаетесь. Для входа нужен код входа из терминала.
- Права профиля определяют, что приложение может менять. Через MCP спросить некого, поэтому право со значением
askпропускает команду. По умолчанию это создание, изменение и удаление событий, а также открытие календаря кому угодно (права). Подтверждение в самом приложении — отдельная вещь и зависит от его настроек. Для изменений также нужно право записи в Google: профиль, вошедший без--grant write, только читает (вход). - Компьютер с
gcalдолжен оставаться включённым. Чтобы работать с телефона, запустите всё это на небольшом сервере, который всегда включён, и войдите в Google там. - Проверьте, разрешены ли в приложении или рабочем пространстве пользовательские подключения MCP. Доступность и ограничения администратора зависят от приложения. Следуйте актуальному руководству OpenAI или руководству Claude.
Не все шаги настройки проверены на каждой операционной системе. Если шаг не работает, создайте задачу.
Запустите туннель и сервер
Сначала установите gcal и войдите в Google (установка). Настраивайте и запускайте MCP-сервер под одним пользователем операционной системы и с одним профилем.
Установите Tailscale, войдите и включите Funnel: в вашей сети Tailscale (tailnet) должны быть разрешены MagicDNS, HTTPS-сертификаты и Funnel. Первая команда Funnel может вывести ссылку для подтверждения.
Оставьте открытыми два окна терминала. В первом работает туннель. Скопируйте HTTPS-адрес, который он выведет, во второе окно, без /mcp. Явно указанный публичный порт, например :8443, сохраните.
Сервер слушает 127.0.0.1:8765 (порт меняется через --port) и выводит код входа. Права администратора ему не нужны никогда; они могут понадобиться только туннелю.
В Linux, первое окно:
sudo tailscale funnel 8765В macOS, если tailscale нет в PATH (руководство по CLI Tailscale):
TAILSCALE_BE_CLI=1 /Applications/Tailscale.app/Contents/MacOS/Tailscale funnel 8765В Windows, в PowerShell от имени администратора:
& "$env:ProgramFiles\Tailscale\tailscale.exe" funnel 8765Второе окно, от вашего обычного пользователя, без sudo:
gcal personal mcp serve --http --port 8765 --public-url https://<device>.<network>.ts.netОн отвечает локальным адресом, на котором работает, адресом коннектора для приложения и кодом входа.
Чтобы запустить gcal рядом с tg, drive или другим инструментом WireCat, дайте каждому серверу свой локальный порт. Затем либо дайте каждому свой публичный HTTPS-порт, например второй Funnel с --https=8443 8766 и gcal personal mcp serve --http --port 8766 --public-url https://<device>.<network>.ts.net:8443 (Funnel поддерживает публичные порты 443, 8443 и 10000), либо используйте один адрес с отдельным путём для каждого инструмента: --public-url https://<device>.<network>.ts.net/gcal, а --set-path /gcal в Funnel направляет этот путь на нужный порт. Адрес коннектора тогда …/gcal/mcp. См. справочник команды Funnel.
Вариант: Cloudflare Tunnel
Именованный туннель Cloudflare с публичным именем, например mcp.example.com, и локальной службой http://127.0.0.1:8765 работает так же:
gcal personal mcp serve --http --port 8765 --public-url https://mcp.example.comВременный Quick Tunnel (cloudflared tunnel --url …) не подойдёт: Quick Tunnels не поддерживают SSE, а именно так HTTP-сервер MCP передаёт ответы.
Работа в фоне
Чтобы сервер продолжал работать после закрытия окна, запустите его в фоне. Он отвечает, как только начинает слушать, и выводит адрес коннектора и код входа:
gcal personal mcp server start --port 8765 --public-url https://<device>.<network>.ts.net
gcal personal mcp server status # running, port, connector address, the current login code, apps logged in
gcal personal mcp server stop # stops only a server that `mcp server start` startedСервер, запущенный так, не пишет код в свой журнал: его показывает mcp server status. Код хранится в папке состояния gcal, mcp-http/<profile>.lock, которую может читать только ваш пользователь (режим 600).
Один сервер может обслуживать несколько профилей: gcal mcp serve --http --profiles work,personal или --profiles all для всех профилей на этом компьютере. Тогда каждый вызов инструмента называет свой профиль. У набора профилей свой вход, отдельный от входа каждого профиля; mcp server start | stop | status и mcp revoke принимают тот же --profiles. Если не указан ни профиль, ни --profiles, gcal отказывается и перечисляет профили.
Подключите приложение
Адрес для приложения — ваш публичный URL с /mcp в конце, например https://<device>.<network>.ts.net/mcp. Добавьте его как удалённый MCP-коннектор:
- ChatGPT: откройте Plugins, выберите + Add custom MCP server и создайте плагин с адресом
/mcpи OAuth, как описано в руководстве OpenAI. Если предложат, выберите динамическую регистрацию клиента (DCR), затем установите плагин, прежде чем использовать его в разговоре. - Claude: добавьте пользовательский коннектор с этим адресом, как описано в руководстве по коннекторам Claude.
Приложение откроет страницу входа gcal. Проверьте строку, где сказано, куда идёт вход: там должно быть подключаемое приложение, например chatgpt.com или claude.ai. Затем введите код входа из терминала. Код действует для одного входа и десять минут; потом gcal выводит новый. После пяти неверных кодов страница отказывает тридцать секунд, а затем принимает самый новый код. Приложение остаётся в системе, пока пользуется подключением хотя бы раз в 30 дней.
Сервер предлагает те же три инструмента, что и через стандартные потоки ввода и вывода: gcal_tools_search, gcal_read и gcal_write. api call, очистка календаря, session и mcp не предлагаются никогда. Названия, описания событий и имена участников — слова других людей: приложение должно считать их данными, а не инструкциями.
Права для этого процесса сервера
Сервер не видит, спросило ли вас приложение перед вызовом. Повторяйте --permission key=level, чтобы ужесточить права только для этого процесса сервера:
gcal personal mcp serve --http --public-url https://<device>.<network>.ts.net --permission api=readonly
gcal personal mcp serve --http --public-url https://<device>.<network>.ts.net --permission api.calendar.acl=denyapi=readonly отклоняет любое изменение, включая события; api.calendar.acl=deny не даёт приложению открыть доступ к календарю. Такая настройка только ужесточает права и никогда не ослабляет уровень профиля. Чтобы разрешить больше, измените права профиля (настройки). GCAL_READ_ONLY=1 в окружении сервера тоже отклоняет любое изменение.
Остановите сервер или отзовите доступ
Нажмите Ctrl-C в обоих окнах, чтобы остановить сервер и туннель. Входы приложений сохраняются после перезапуска.
Если вы запустили Funnel с --bg, Ctrl-C не останавливает этот фоновый маршрут: проверьте tailscale funnel status и выключите только его порт, например tailscale funnel --https=443 off.
Чтобы выйти из всех приложений профиля или сервера нескольких профилей:
gcal personal mcp revoke
gcal mcp revoke --profiles allЭтим приложениям придётся войти снова с новым кодом. Вход gcal в Google при этом сохраняется; выйти из Google позволяет session end.
Если не работает
- Приложение пишет, что не может подключиться: откройте в браузере
https://<device>.<network>.ts.net/.well-known/oauth-protected-resource/mcp(с путём:…/.well-known/oauth-protected-resource/gcal/mcp). Там должен быть короткий JSON. Если его нет, Funnel не запущен, не включён в вашей сети Tailscale или направлен на другой порт. - Страница входа пишет «Too many wrong codes»: подождите тридцать секунд и введите самый новый код. Если вы их не вводили, кто-то нашёл ваш адрес: выполните
gcal personal mcp revokeи подумайте о новом имени устройства в Tailscale. - «already serves MCP over HTTP for this profile»: сервер для этого профиля уже работает, возможно в фоне.
gcal personal mcp server statusпокажет где;mcp server stopостанавливает сервер, запущенный черезserver start. - «port 8765 is in use»: порт занят другой программой; укажите другой
--portи направьте на него туннель. - «too many logged-in apps»: вход держат десять приложений. Выполните
gcal personal mcp revoke, затем подключитесь снова. - Чтение работает, запись нет: проверьте права профиля, переопределения
--permission,GCAL_READ_ONLYи право записи в Google (gcal personal session statusперечисляетgrants).