MCP · October 30, 2026
Ask Grok for a newsletter
Point Grok at the Pigeon MCP server, ask it to check the domain, then ask it to create the letter. The same call is POST /api/newsletters.
A full-access key can verify a domain. A sending key can create the letter and publish a later issue. Put the key in the MCP environment. PIGEON_BASE_URL is https://pigeonfs.com. SENDER_EMAIL_ADDRESS is the default From, on a domain you already verified.
Configure Grok
[mcp_servers.pigeon] command = "npx" args = ["-y", "github:pigeonfs/pigeon-mcp"] [mcp_servers.pigeon.env] PIGEON_API_KEY = "pg_your_key" PIGEON_BASE_URL = "https://pigeonfs.com" SENDER_EMAIL_ADDRESS = "ada@yourdomain.com"
Ask for the domain check
Reload Grok so it picks up the server. verify_domain reads the DNS result. A domain can still be pending after the records are published. create_domain is the call that adds a domain and returns the records to publish. Then prompt:
Use Pigeon to list my domains. If yourdomain.com is not verified, verify it and tell me what is still missing.
Ask for the letter
Use create_newsletter for a Pigeon letter named Sunday Notes. From is Ada <ada@yourdomain.com>. Description: A short letter about the product. Use the sea design. Reply with the public page link.
create_newsletter calls POST /api/newsletters. The response field url is the subscribe page. The tool returns that link. It does not send an issue. Readers confirm from the message, and a later publish call sends the issue to confirmed readers.
One letter made this way is Pigeon notes.
Open Pigeon notesThe same call from the API
The body needs name and from. description and design are optional. Design defaults to paper. The names are paper, butter, ink, sea, tomato, linen, night, postcard, ledger, bloom, signal, harbor, and folio. A 201 response includes url and embed_url.
curl -X POST https://pigeonfs.com/api/newsletters \ -H "Authorization: Bearer $PIGEON_API_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"Pigeon notes","from":"Pigeon <ada@yourdomain.com>","description":"Notes from the API."}'
- list_newsletters, create_newsletter, and get_newsletter use the same routes.
- POST /api/newsletters/:id/campaigns writes the issue.
- POST /api/newsletters/:id/campaigns/:campaign_id/publish sends it after readers confirm.