allternit-bot instead: one small command, one key you issue and can revoke.
Everything the command does goes through the same server-side checks as the connector. It can’t do more than the connector can:
- Texts and calls only reach people who contacted the number first, or whom you added as contacts. STOP always wins.
- Email is always a draft. It waits for your OK.
- The agent only sees threads it is attached to or you shared with it.
- Every message says where it came from: “Sent by Claude via Gizzi”.
Set it up
- In Allternit, open the vendor bot, then Use the phone, then Shell access. The panel works the same on Desktop, the ai.allternit.com phone layout and the m.allternit.com app.
- Choose Issue a key. The key (it starts with
abk_) is shown once. Copy it now: only a fingerprint is kept, so it can’t be shown again. - In the agent’s shell, install the command and save the key:
~/.local/bin without root (--dir picks another folder). login saves the key and bot id in ~/.config/allternit-bot/config.json, readable only by that user. Instead of login you can set ALLTERNIT_BOT_KEY and ALLTERNIT_BOT_ID in the environment. The key is never taken from the command line, where other processes could see it.
Under each key, Allternit lists the events the agent subscribed to with it, when each was last sent, and Stop to end one subscription.
To cut an agent off, choose Revoke next to its key. Its next call is refused, and any event subscriptions it made end with a signed terminated message.
Commands
Put
- as the last argument to read long text from standard input, and add --json to any command for raw output. The exit code is 0 when it worked, 1 when Allternit refused (the reason is printed, so tell the person; don’t retry around it) and 2 when Allternit couldn’t be reached or the command was wrong. If your computer is asleep, Allternit wakes it first; if that takes too long the command says so and you can run it again.
An agent that can fetch a URL can also read the same instructions from https://mcp.allternit.com/bots/<vendor bot id>/instructions, sending its key as Authorization: Bearer abk_….
For developers
The CLI iscmd/allternit-bot (Rust, reqwest with rustls, no OpenSSL). Each command is one JSON-RPC tools/call to <url>/bots/<id> with the key as Bearer, where <url> defaults to https://mcp.allternit.com/mcp (ALLTERNIT_BOT_URL or --url overrides it, for example to point at a local runtime). Its help text is cmd/allternit-api/assets/vendor-bot-instructions.txt, the same file the instructions route serves; a test checks it names every tool.
Keys live in cloud-api (migration 040_vendor_bot_keys.sql, cmd/allternit-cloud-api/src/routes/vendor_bot_keys.rs), because the public edge has to check them. Only the SHA-256 is stored. A key opens exactly one vendor bot, at most 10 live keys per bot. Routes, authenticated as the signed-in owner (Clerk session or a compute-scoped API key):
All of these answer
503 {"error":"mcp_edge_not_configured"} until MCP_PUBLIC_URL is set on cloud-api. Prod cloud migration 040 is applied by hand.
At the edge, a Bearer token that starts with abk_ skips Clerk and is looked up by hash for that bot id; the agents server and other bots’ paths refuse it. A live key is relayed to the owner’s runtime exactly like an OAuth call, with the client label cli-key:<key id>. That label shows up under Connected clients and in the audit, and revoking it there is refused on the runtime’s next call too, so revoking in either place works.
Release. .github/workflows/publish-allternit-bot.yml (run by hand with workflow_dispatch, or by pushing a tag allternit-bot-v*; it never runs on merge) builds static binaries for linux and macOS on x86_64 and aarch64 with the bot-dist profile and publishes them, with .sha256 files, to the rolling release allternit-bot-latest. The installer served at install.allternit.com/bot (the install.allternit.com Pages project) downloads from there; ALLTERNIT_BOT_DOWNLOAD_URL points it elsewhere.