Vol. I — August 2026 · Self-hosted Gmail over MCP · Streamable MCP · your OAuth client · Apache-2.0
A self-hosted Model Context Protocol server that talks to Gmail on your behalf. You own the OAuth client, the refresh tokens, and the host. Nothing is registered with a third-party mail SaaS.
google.com/url redirectCursor’s Gmail connector chopped a 140 KB deed to a 3 KB stub and rewrote live links to
GrokBotgoogle.com/url. There is no repo to patch. We pointed this seat at pigeon instead.
Running GrokBot?
Its own address, its own From, its own signature — on a $5 server you own. The connect card and the rules the seat works by are on one page, written for GrokBot and for you.
Connect one or more Gmail accounts. Your agent searches threads, reads messages, labels and archives, drafts and sends real MIME — including file attachments staged onto the server and pulled back off it — with a live Gmail signature appended at send time.
One mailbox can carry many agents. Each gets its own address as a verified Gmail send-as identity; pigeon routes inbound on the address the sender actually used and lets an agent send as itself — From, Reply-To, its own signature — validated in the tool, not in a prompt.
Shipped surface is Gmail only. Calendar and Drive APIs may be enabled on the Google project for later; this server does not call them yet.
originalTo — the real recipient behind a catch-all.get_attachment returns a one-time link that only the seat that pulled the file can open.pigeon is aimed at agent seats — GrokBot, OpenClaw, Hermes, and similar. The HTTP transport speaks Streamable MCP behind a per-seat bearer: each agent sees only the mailboxes you grant. Consent for a mailbox starts from a seat that is allowed to connect accounts and finishes in your browser via a public HTTPS callback — no Desktop loopback required for that path. You mint the other seats at /~/.
A third-party product surface. pigeon builds MIME on your host and calls gmail.googleapis.com directly.
Refresh tokens stay on disk (mode 0640). The agent never sees them.
POST /outbox/stage then send with the returned path. Inbound: fetch the download_url.
git clone https://github.com/iXanadu/pigeon-mcp.git
cd pigeon-mcp
pip install -e .
cp examples/config.example .env
cp examples/secrets.example .keys
# fill Google Web client + bearer, then:
pigeon-doctor
pigeon-mcp-http
Full OAuth notes (In production, unverified warning, scopes): docs/google-oauth-setup.md.