WhatsApp

WhatsApp из браузера

Подключите браузерное ИИ-приложение к WhatsApp CLI через туннель с настроенным доступом.

Подключите MCP-приложение в браузере или на телефоне, например ChatGPT или Claude, к wa на своём компьютере. Вы настроите HTTPS-туннель с входом, узнаете, какие действия разрешает профиль wa, и сможете остановить подключение или отозвать доступ приложения.

Термины, используемые на этой странице:

  • MCP (протокол контекста модели) — это стандартный способ, которым приложение ИИ вызывает внешние инструменты. wa personal mcp — это сервер MCP, входящий в состав wa; Руководство по серверу MCP описывает приложения на вашем компьютере.
  • Удаленное подключение означает, что приложение подключается со своих серверов через Интернет по указанному вами адресу. wa personal mcp --http предоставляет для этого те же инструменты через HTTP, что и 127.0.0.1.
  • HTTPS-туннель — это программа, которая присваивает порту вашего компьютера общедоступный HTTPS-адрес. На этой странице используется Tailscale Funnel; Cloudflare Tunnel также работает. Вам не нужно покупать домен для Funnel.
  • Публичный URL — это адрес, например https://laptop.tail1234.ts.net. Вы передаете его wa как --public-url, и приложение получает его с /mcp в конце.
  • Код доступа — это одноразовый код, который wa печатает на вашем терминале. Страница входа в приложение запрашивает это, поэтому только тот, кто видит этот терминал, может подключить приложение.
ChatGPT / Claude ──internet──▶ Tailscale Funnel ──▶ wa personal mcp --http (login) ──▶ WhatsApp

Что можно сделать

ЗадачаГде
Подключите браузерное или телефонное приложение ИИ к WhatsAppЗапустите туннель и сервер, затем подключите приложение
Запустить wa рядом с tg или maxЗапуск нескольких серверов вместе
Используйте Cloudflare вместо TailscaleАльтернатива: Туннель Cloudflare
Разрешить меньше для одного запуска сервераРазрешения для этого серверного процесса
Остановите сервер или выйдите из всех приложенийОстановить или отозвать доступ

Прежде чем начать

  • Кто бы ни вошел в систему, он читает ваш WhatsApp. Для входа требуется код доступа с вашего терминала. Никогда не ставьте туннель перед wa personal mcp без --http: в этом режиме вообще нет входа в систему.
  • Разрешения профиля определяют, что приложение может изменить. deny и readonly блокируют запись; ask и allow позволяют запрошенной записи MCP проходить без формы на сервере. Одобрение приложения является отдельным и зависит от его настроек. Список получателей и почасовой лимит по-прежнему применяются (что может делать агент, разрешения).
  • Сервер использует одно соединение устройства с serve. Чтение из локального хранилища работает во время работы serve. В отличие от терминала и wa personal mcp, HTTP-сервер не проходит через serve: отправка, редактирование или реакция приложения отклоняются до тех пор, пока serve не остановится, а serve не может запуститься, пока сервер удерживает соединение (одно соединение, совместно используемое с serve).
  • Компьютер, на котором работает wa, должен оставаться включенным. Чтобы использовать его с телефона или с ноутбука, на котором ничего не установлено, запустите все это на небольшом постоянно включенном сервере и свяжите туда wa (wa personal setup --agent none). Это еще одно подключенное устройство на вашем телефоне.
  • Кто может добавить удаленный соединитель:

Ваш аккаунт должен поддерживать добавление удалённого MCP-подключения. Перед запуском туннеля проверьте текущие требования приложения к аккаунту и региону.

Если шаг не работает, откройте проблему.

Запускаем туннель и сервер

Установите wa и сначала свяжите профиль (установка, связывание). Используйте одного и того же пользователя и профиль инструмента для настройки и для сервера MCP. При необходимости поместите профиль перед командой: wa work mcp. Tailscale представляет собой отдельную установку.

Установите Tailscale, войдите в систему и включите Funnel: сертификаты MagicDNS, HTTPS и разрешение Funnel должны быть включены в вашей Tailnet (вашей сети Tailscale). Первая команда Funnel может распечатать ссылку для подтверждения.

Держите два окна терминала открытыми. Первый управляет туннелем. Скопируйте источник HTTPS, который он печатает, во второе окно, когда его спросят. Источником является адрес без /mcp или любого другого пути. Сохраните в нем явный общедоступный порт, например :8443.

Сервер прослушивает 127.0.0.1:8765 и печатает одноразовый код доступа. Ему никогда не нужны права администратора; они могут понадобиться только туннелю. Приложение может делать собственный permissions профиля; установите их перед запуском (разрешения для этого серверного процесса).

Windows (PowerShell)

Установите приложение Tailscale для Windows и войдите в систему из его меню на панели задач. Откройте новое окно PowerShell после установки Node.js, wa и Tailscale, чтобы оно увидело обновленный PATH. Используйте .cmd для команд npm, чтобы избежать ошибок политики выполнения PowerShell.

Первое окно: запустите PowerShell от имени администратора Funnel. Оператор вызова & обрабатывает пространство в пути установки по умолчанию; измените путь, если вы установили Tailscale в другом месте.

& "$env:ProgramFiles\Tailscale\tailscale.exe" funnel 8765

Второе окно: обычный PowerShell, от имени пользователя, связавшего wa:

$mcpPublicUrl = Read-Host 'Paste the HTTPS origin printed by Funnel (no /mcp)'
wa.cmd personal mcp --http --port 8765 --public-url $mcpPublicUrl

Запустите оба процесса в самой Windows. WSL — это отдельная среда: туннель Windows, указывающий на адрес обратной связи Windows, может не достигать сервера внутри WSL.

macOS (Терминал)

Установите и войдите в приложение Tailscale. Его интерфейс командной строки поставляется вместе с приложением; используйте этот путь, если tailscale не находится в PATH (Руководство по интерфейсу командной строки Tailscale). Первое окно терминала:

TAILSCALE_BE_CLI=1 /Applications/Tailscale.app/Contents/MacOS/Tailscale funnel 8765

Второе окно терминала от имени того же пользователя, который запустил wa personal setup. Это работает как в zsh, так и в bash:

printf 'Paste the HTTPS origin printed by Funnel (no /mcp): '
IFS= read -r mcpPublicUrl
wa personal mcp --http --port 8765 --public-url "$mcpPublicUrl"

Linux (Терминал)

Установите Tailscale, следуя инструкциям Linux, затем войдите в систему с помощью sudo tailscale up. Первое окно терминала:

sudo tailscale funnel 8765

Второе окно терминала: ваш обычный пользователь без sudo, поэтому wa находит устройство, связанное с wa personal setup:

printf 'Paste the HTTPS origin printed by Funnel (no /mcp): '
IFS= read -r mcpPublicUrl
wa personal mcp --http --port 8765 --public-url "$mcpPublicUrl"

Запускаем несколько серверов вместе

Каждому серверу нужен собственный локальный порт и собственный общедоступный HTTPS-адрес. Например, сохраните tg в локальном 8765 и общедоступном 443; запустите вторую команду Funnel с помощью --https=8443 8766 и запустите wa с --port 8766. Используйте второй источник воронки с :8443 для --public-url wa и для адреса его соединителя, заканчивающегося на /mcp. Используйте команду Tailscale вашей системы сверху для второй команды Funnel. Funnel поддерживает общедоступные порты 443, 8443 и 10000 (Справочник по командам Funnel).

Приемник вебхука для бота

Номер WhatsApp Business в Cloud API получает сообщения только с помощью веб-перехватчика, поэтому его получатель публикуется таким же образом (номер WhatsApp Business в качестве бота). wa <profile> bot watch --public-url прослушивает локальный 8766. С помощью Funnel опубликуйте его на общедоступном порту, который не использует сервер MCP, например 10000:

tailscale funnel --bg --https=10000 8766
wa cloudtest bot watch --public-url https://<name>.ts.net:10000

Сначала запустите tailscale funnel status, чтобы увидеть, какие общедоступные порты заняты. С именованным туннелем Cloudflare добавьте второе общедоступное имя хоста, локальная служба которого — http://127.0.0.1:8766. Введите тот же источник, что и URL-адрес обратного вызова на панели управления приложения Meta. Получатель сохраняет только сообщения с корректной подписью приложения.

Альтернатива: туннель Cloudflare

Если вы уже используете Cloudflare, направьте его туннель на тот же локальный сервер MCP. Для фиксированного имени хоста требуется аккаунт Cloudflare и домен в Cloudflare. Следуйте настройке именованного туннеля: установите cloudflared для своей системы, создайте туннель на панели управления, запустите его соединитель и добавьте общедоступное имя хоста, например mcp.example.com. Установите для локальной службы значение http://127.0.0.1:8765 и запустите MCP на этом же компьютере.

Запустите сервер во втором терминале:

wa personal mcp --http --port 8765 --public-url https://mcp.example.com

Добавьте https://mcp.example.com/mcp в свое приложение ИИ с помощью OAuth и DCR, как описано в разделе подключение приложения. --public-url — это общедоступный источник, используемый для входа в систему, а не локальный адрес и не путь /mcp. Туннель не меняет разрешения профиля. Проверьте JSON по адресу https://mcp.example.com/.well-known/oauth-protected-resource/mcp, затем войдите в систему и просмотрите список инструментов.

Временный быстрый туннель не работает. cloudflared tunnel --url http://127.0.0.1:8765 предоставляет случайный адрес trycloudflare.com без аккаунта или домена, но быстрые туннели не поддерживают SSE (события, отправляемые сервером, то есть способ передачи ответов HTTP-сервера MCP). Выберите «Воронка» или именованный туннель.

Подключите приложение

Адрес приложения — это источник вашего туннеля с /mcp в конце, например https://<device>.<network>.ts.net/mcp. Добавьте его как удаленный разъем MCP:

  • ChatGPT или веб-сайт Codex: откройте Плагины, выберите + Добавить пользовательский сервер MCP и создайте плагин с Адрес /mcp и OAuth, как описано в Руководстве по подключению OpenAI. Подключитесь, используя код доступа, установите плагин и включите его в чате (или упомяните его с помощью @). Выберите динамическую регистрацию клиента (DCR), если она предлагается; сервер поддерживает DCR и вызов кода S256, который требуется требованиями OpenAI OAuth.
  • Claude: добавьте специальный соединитель с этим адресом, как описано в разделе Пользовательские соединители Claudeа. В настройках коннектора вы также можете установить для каждого инструмента статус «всегда разрешен», «требует одобрения» или «блокирован».

Эти три инструмента работают без подсказок, ресурсов или запросов MCP (вопросов, которые сервер задает приложению), поэтому приложения, поддерживающие только инструменты, могут их использовать.

Приложение открывает страницу входа в систему wa. Проверьте строку, в которой указано, куда идет вход в систему: это должно быть приложение, к которому вы подключаетесь, например chatgpt.com или claude.ai. Затем введите код доступа со своего терминала. Срок действия кода истекает через десять минут; новый код печатается после каждого входа в систему. Пять неправильных кодов останавливают вход в систему на 30 секунд; после этого печатается новый код.

Приложение остается в системе до тех пор, пока оно использует соединение хотя бы раз в 30 дней; он сам обновляет свой логин. Через 30 дней без использования просит новый код.

Разрешения для этого серверного процесса

Сервер не может видеть, спрашивало ли вас приложение перед вызовом инструмента. Если приложение всегда разрешает использование инструмента, следующий вызов может пройти без нового вопроса.

permissions профиля определяет, что может делать приложение. Повторите --permission key=level, чтобы сузить их только для этого серверного процесса: --permission messages.send=readonly прекращает отправку. Он никогда не ослабляется: переопределение, которое дает больше, чем профиль — от readonly до allow, deny к чему угодно — останавливает сервер при запуске с validation_error, называющим ключ. При переопределении сохраненная конфигурация, список получателей и почасовой лимит остаются без изменений. Чтобы приложение могло отправлять сообщения из профиля, доступного только для чтения, сначала измените профиль: wa personal config set permissions.messages.send allow. Ключи разрешений находятся на странице разрешения.

Остановить или отозвать доступ

Нажмите Ctrl-C в обоих окнах терминала, чтобы остановить сервер и этот туннель. Запустите их снова теми же командами; входы в приложения сохраняются при обычном перезапуске сервера. Остановка сервера также разрывает соединение устройства, поэтому serve может запуститься снова.

Если вы запустили Funnel с помощью --bg, сочетание ключей Ctrl-C не остановит этот фоновый маршрут. Проверьте tailscale funnel status и отключите только его публичный порт, например tailscale funnel --https=443 off. Не используйте funnel reset, когда другой сервер использует Funnel: он очищает все маршруты.

Отзыв доступа приложений отличается от остановки процесса. Чтобы выйти из каждого приложения для профиля:

wa personal mcp --revoke --json

Эти приложения должны снова войти в систему с новым кодом. Это не отключает устройство от WhatsApp.

Если не работает

  • Приложение сообщает, что не может подключиться: откройте https://<device>.<network>.ts.net/.well-known/oauth-protected-resource/mcp в браузере. Он должен отображать короткий JSON. Если этого не происходит, значит, Funnel не запущен, не включен в вашей сети Tailscale или указывает на другой порт.
  • На странице входа отображается сообщение «Слишком много неправильных кодов»: после пяти неправильных кодов происходит ожидание 30 секунд, затем терминал показывает новый код. Если вы их не вводили, значит кто-то нашел ваш адрес: остановите сервер и подумайте о новом имени устройства в Tailscale.
  • Приложение подключается, но инструментов нет: wa personal mcp check проверяет, запускается ли сервер MCP, и выводит список его инструментов. Он не проверяет ссылку на WhatsApp или туннель; wa personal doctor считывает состояние устройства.
  • Чтение работает, запись не работает: HTTP-сервер не проходит через serve, поэтому запись отклоняется во время работы serve; ошибка называет это. В противном случае проверьте разрешения профиля и любые переопределения --permission: уровни deny и readonly запрещают изменения независимо от одобрения приложения.
  • Нужен журнал вызовов инструментов: wa personal runs list показывает их. Успешные вызовы появляются только при включенной записи; неудавшиеся вызовы сохраняются по умолчанию, если только запись не была отключена с помощью "record": false или --no-record (диагностика).