Runs a local HTTP proxy that injects your Beeper auth token and keeps a poke tunnel alive so the Poke agent can reach Beeper MCP from anywhere. Runs as a macOS launchd service or Linux systemd user service that starts on login and survives crashes.
Once installed, Beeper tools appear automatically in your Poke agent — no manual MCP setup required.
Poke agent (internet)
|
poke tunnel
|
poke-beeper-proxy (localhost:23374)
— injects Bearer token on every request
|
Beeper Desktop MCP (localhost:23373)
The proxy runs locally and adds your BEEPER_TOKEN to every request. The poke tunnel exposes the proxy so your Poke agent can reach it from anywhere. Once the tunnel connects, Beeper tools are automatically available in Poke.
- macOS — launchd is required for service management
- Node.js 18+ — verify with
node --version - poke CLI —
npm install -g pokethenpoke login - Beeper Desktop — running with MCP enabled
NVM users: NVM-managed node paths may not resolve correctly inside launchd. Use Homebrew node (brew install node) for reliable service operation.
git clone https://github.com/keith/poke-beeper-proxy
cd poke-beeper-proxy
npm installpoke loginnpm run install-serviceThe script prompts for your BEEPER_TOKEN, stores it in macOS Keychain, writes ~/Library/LaunchAgents/com.poke-beeper-proxy.plist, and starts the service immediately.
Open Beeper Desktop → Settings → MCP. Your token is listed there.
launchctl list com.poke-beeper-proxy # PID in first column = running
tail -f ~/Library/Logs/poke-beeper-proxy.logExpected log on healthy start:
2026-02-17T18:00:00.123Z INFO [auth] BEEPER_TOKEN loaded from Keychain
2026-02-17T18:00:00.145Z INFO [main] poke-beeper-proxy starting up
2026-02-17T18:00:00.167Z INFO [tunnel] Starting poke tunnel → http://localhost:23374/v0/mcp (name: Beeper)
2026-02-17T18:00:00.189Z INFO [proxy] Listening on http://127.0.0.1:23374
npm run uninstall-serviceRemoves the plist, unloads the service, and deletes the Keychain entry.
- Node.js 18+ — via your package manager or nvm
- systemd with a user session active
- poke CLI —
npm install -g pokethenpoke login - Beeper Desktop — running with MCP enabled
NVM users: NVM shims may not resolve in the systemd environment. If the service fails with "node: command not found", use a system Node.js install.
git clone https://github.com/keith/poke-beeper-proxy
cd poke-beeper-proxy
npm installpoke loginnpm run install-serviceThe script prompts for your BEEPER_TOKEN, stores it in ~/.config/poke-beeper-proxy/token (chmod 600), writes a systemd user unit file, and starts the service.
systemctl --user status poke-beeper-proxy
journalctl --user -u poke-beeper-proxy -fnpm run uninstall-serviceDisables and stops the service, removes the unit file, and deletes the token file.
By default, systemd user services only run while you're logged in. To start on boot regardless:
loginctl enable-linger $USERRuns in the foreground with colorized terminal output. Reads BEEPER_TOKEN from environment or .env:
BEEPER_TOKEN=your_token npm startmacOS:
launchctl list com.poke-beeper-proxy # second column = exit code
cat ~/Library/Logs/poke-beeper-proxy.logLinux:
systemctl --user status poke-beeper-proxy
journalctl --user -u poke-beeper-proxy -n 50The install script auto-selects the next free port if 23374 is occupied. To check what's using it:
lsof -i :23374The service needs poke on its PATH.
macOS: The plist PATH includes /opt/homebrew/bin. Reinstall to regenerate:
npm run uninstall-service && npm run install-serviceLinux: Edit the unit file to add your poke location:
systemctl --user edit poke-beeper-proxyAdd under [Service]:
Environment=PATH=/your/poke/bin:/usr/local/bin:/usr/bin:/binThen: systemctl --user daemon-reload && systemctl --user restart poke-beeper-proxy
macOS may show: "node wants to access Keychain item poke-beeper-proxy". Click Always Allow.
macOS — verify Keychain entry:
security find-generic-password -s poke-beeper-proxy -a beeper-tokenLinux — verify token file:
ls -la ~/.config/poke-beeper-proxy/token # should show -rw-------
cat ~/.config/poke-beeper-proxy/tokenIf missing, reinstall:
npm run uninstall-service && npm run install-service- Verify the service is running
- Check logs for sync errors
- Verify Beeper Desktop is running with MCP enabled
- Verify your token is valid:
# macOS
curl -H "Authorization: Bearer $(security find-generic-password -s poke-beeper-proxy -a beeper-token -w)" http://localhost:23373/v1/accounts
# Linux
curl -H "Authorization: Bearer $(cat ~/.config/poke-beeper-proxy/token)" http://localhost:23373/v1/accountsA valid token returns account data; an invalid token returns 401.
Verify poke is logged in:
cat ~/.config/poke/credentials.jsonIf missing, run poke login then restart:
# macOS
launchctl kickstart -k gui/$(id -u)/com.poke-beeper-proxy
# Linux
systemctl --user restart poke-beeper-proxyReinstall to update the embedded node path:
npm run uninstall-service && npm run install-servicemacOS:
launchctl unload ~/Library/LaunchAgents/com.poke-beeper-proxy.plist
launchctl load -w ~/Library/LaunchAgents/com.poke-beeper-proxy.plistLinux:
systemctl --user daemon-reload
systemctl --user restart poke-beeper-proxymacOS:
cat ~/Library/Logs/poke-beeper-proxy.log.1 ~/Library/Logs/poke-beeper-proxy.logLinux:
journalctl --user -u poke-beeper-proxy --since "1 hour ago"
# or from log file:
cat ~/.local/share/poke-beeper-proxy/poke-beeper-proxy.log