Muse Relay
Enables a Meta Muse agent to exchange questions, answers, and files with a Grok Bot through a relay. Muse can ask questions and receive replies, send and receive messages and attachments, and check for messages initiated by Grok Bot.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Muse Relaysend Muse a message asking if the staging deploy passed"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Muse Relay — a two-way bridge between Meta Muse and Grok Bot
Let your Muse agent and your Grok Bot talk to each other directly — questions, answers, and files — with no laptop in the loop. Runs free on Vercel (Hobby) + Neon Postgres (free). One script sets it all up.
flowchart LR
M[Muse agent] -- "REST + MUSE_KEY<br/>/api/v1/ask (long-poll)<br/>/api/v1/messages, /files" --> R[(Muse Relay<br/>Vercel function)]
R <--> DB[(Neon Postgres<br/>threads · messages · attachments)]
R -- "webhook on new Muse msg<br/>GROK_WEBHOOK_URL + GROK_WEBHOOK_AUTH" --> W[Grok Bot webhook routine]
G[Grok Bot] -- "MCP /mcp + GROK_KEY<br/>send_to_muse, check_muse_messages, ..." --> R
W --> GHow a question flows: Muse calls POST /api/v1/ask → relay stores it and fires the webhook → Grok Bot wakes, reads it via MCP, replies with send_to_muse → the still-open /ask request returns the reply to Muse (usually < 1 min).
Quick start
Option A — paste this into your Grok Bot
Set up my own Muse relay from https://github.com/AISupplyGuy/muse-relay.
Clone it on your box, run ./setup.sh, and complete any Neon/Vercel browser
sign-ins it prints. Never print secret values. Then: add the MCP connector
from the README "Grok side" section, create a webhook routine named
"New Muse message" (ask me to copy its URL and Authorization header into
env vars), run ./set-webhook.sh and ./smoke-test.sh, and finally give me
the Muse instruction block from the README with my relay URL filled in.Option B — run it yourself (Linux/macOS, Node 20+)
git clone https://github.com/AISupplyGuy/muse-relay && cd muse-relay
./setup.sh # Neon DB + keys + Vercel deploy
# create your Grok Bot webhook routine, then:
GROK_WEBHOOK_URL='https://...' GROK_WEBHOOK_AUTH='Bearer ...' ./set-webhook.sh
./smoke-test.shsetup.sh is non-interactive except for browser sign-ins, and safe to re-run (it reuses existing projects and keys):
Installs
vercelandneonctlCLIs if missing (npm i -g --prefix ~/.local).If you're not signed in, runs
vercel login/neonctl authand prints the URL to open. No account? Both are free: neon.tech and vercel.com — GitHub or Google sign-in works.Creates a Neon project
muse-relay(regionaws-us-east-2) and takes its pooled connection string. Tables are created automatically on the first request — no SQL to run.Generates random
MUSE_KEY,GROK_KEY,WEBHOOK_SECRET.Creates/links the Vercel project, sets env vars via stdin (never echoed), deploys
--prod, checks/health, and turns off Vercel Deployment Protection if it blocks public calls.Writes everything to
~/secrets/muse-relay.env(chmod 600).
Overrides: PROJECT_NAME, NEON_REGION, VERCEL_SCOPE (team slug), DATABASE_URL (use an existing Postgres and skip Neon), MUSE_RELAY_ENV_FILE.
Related MCP server: grok-bot-mcp
Env vars
On Vercel (production):
Name | Required | Purpose |
| yes | Neon pooled Postgres URL |
| yes | Bearer key Muse sends on |
| yes | Bearer key Grok Bot sends on |
| yes | HMAC secret for |
| no | Grok Bot routine webhook URL (push on new Muse msg) |
| no | Sent verbatim as the webhook |
| no | Base URL shown in docs/openapi (setup sets it) |
| no | Tuning (defaults 3 MB, 400 MB, 1500 ms) |
Local ~/secrets/muse-relay.env: MUSE_RELAY_URL, MUSE_RELAY_GROK_KEY, MUSE_RELAY_MUSE_KEY, MUSE_RELAY_WEBHOOK_SECRET, MUSE_RELAY_DATABASE_URL.
Grok side
1. MCP connector. Add a local (stdio) MCP server to Grok Bot with this command. It reads the key from the secrets file, so the key never appears in chat:
bash -c 'set -a; . ~/secrets/muse-relay.env; set +a; exec npx -y mcp-remote "$MUSE_RELAY_URL/mcp" --transport http-only --header "Authorization:Bearer $MUSE_RELAY_GROK_KEY"'Tools: send_to_muse, check_muse_messages (supports wait_seconds ≤ 55), get_thread, get_attachment, list_threads, mark_read. Transport is streamable HTTP, stateless JSON (no SSE).
2. Wake routine. Create a webhook-triggered routine on Grok Bot (e.g. "New Muse message": check_muse_messages, answer in the same thread with send_to_muse, ask me before anything sensitive). Copy its webhook URL and Authorization header into env vars and run ./set-webhook.sh. Payload: POST {event:"muse.message.created", message:{id, cursor, thread_id, sender, text, created_at, attachments}} with headers X-Relay-Timestamp, X-Relay-Signature: sha256=HMAC(secret, "<ts>.<body>"), X-Relay-Secret. Delivery is single-shot, so the routine should also catch up with check_muse_messages each time it wakes.
Muse side — paste into Muse
Give Muse its key (MUSE_RELAY_MUSE_KEY) through Muse's own secret/credential setting if it has one, then paste:
You have a private relay to my Grok Bot at https://YOUR-RELAY.vercel.app
Read https://YOUR-RELAY.vercel.app/openapi.json. Authenticate every call with
"Authorization: Bearer <MUSE_KEY>".
- To ask Grok something, use POST /api/v1/ask {"text": "...", "wait_seconds": 240}.
It holds the request open and returns Grok's reply directly (usually < 1 min).
Use a client timeout of at least 255 s. If it returns timed_out:true, keep waiting
with GET /api/v1/messages?thread_id=<thread_id>&since=<next_cursor>&wait=240.
- Files: attachments [{filename, content_type, content_base64}], max 5 files and
3 MB per message. Download incoming files with GET /api/v1/files/:id.
- Check GET /api/v1/messages every 15 minutes for messages Grok starts.
- Don't hold listeners open around the clock: the relay runs on free Vercel/Neon
limits. Long-poll only while you're waiting on an answer.Free-tier limits & cost
Vercel Hobby: functions are billed by active CPU / memory time. Occasional
/askcalls are effectively free. Back-to-back 24/7 long-polling would use several times the monthly Hobby allowance — don't.Neon free: 0.5 GB storage, limited compute hours; the DB auto-suspends when idle. Every long-poll keeps compute awake (polls every 1.5 s).
Relay caps: 5 files and 3 MB decoded per message (HTTP 413 over), 20 000 chars of text, 400 MB total attachment storage (HTTP 507 over). No auto-cleanup — delete old threads in Neon's SQL editor (
DELETE FROM threads WHERE updated_at < now() - interval '30 days';cascades).
Security notes
Two separate random 256-bit keys: Muse's key can't call MCP, Grok's key can't use the Muse REST API (either can download files). Rotate by editing the env var on Vercel and redeploying.
Keep
~/secrets/muse-relay.envchmod 600 and never paste values into chat; the scripts never print them.Webhook calls are HMAC-signed; verify
X-Relay-Signatureif your receiver can.Anything Muse sends is untrusted input to Grok Bot. Have your routine ask you before sending messages, spending money, or sharing data on Muse's behalf.
The production URL must be public for Muse to reach it; setup turns off Vercel Authentication (Deployment Protection). Fix by hand if needed: Vercel → project → Settings → Deployment Protection → Vercel Authentication: Disabled.
API reference
Live docs at /docs (also /llms.txt) and /openapi.json on your deployment. Endpoints: GET /health, POST /api/v1/ask, GET|POST /api/v1/messages, POST /api/v1/messages/read, GET /api/v1/threads, GET /api/v1/threads/:id, GET /api/v1/files/:id, POST /mcp.
License
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
Agent-to-agent messaging: directory, public lobby, DMs, channels, search. Stateless MCP + REST.
Hosted MCP messaging across owners, tools, and machines, with readable transcripts.
Phone, SMS and email for AI agents. One remote MCP endpoint, OAuth login, zero install.
Discover MCP servers and A2A agents; verify, message, post, follow, react, and receive webhooks.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server that wraps Meta's Messenger Platform, Instagram Messaging, and comment moderation APIs as semantic tools for LLM agents to read inbox, reply, and moderate comments.16MIT
- AlicenseAqualityDmaintenanceEnables AI agents to manage Grok Bots through MCP: create, list, search, and delete bots, send and receive messages, read conversation transcripts, search message history, and check usage.113MIT
- AlicenseAqualityCmaintenanceEnables any MCP client or OpenAI-compatible application to use Meta Muse through a logged-in Chrome session, with tools for chat, attachments, session management, media retrieval, streaming, and tool-call compatibility.112MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to exchange end-to-end encrypted, threaded email-style messages across tools, vendors, and machines through a zero-install remote MCP server. Supports sending, replying, reading, and threading messages with inbox checks, read receipts, and key verification.MIT