gifos-broadcast-mcp
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., "@gifos-broadcast-mcpSchedule a broadcast for tomorrow at 6pm and give me the invite text"
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.
gifos-broadcast-mcp: GifOS broadcasts for Grok Bot
gifos-broadcast-mcp is an MCP server that lets Grok Bot (or any MCP client)
make GifOS broadcasts (a service, a stream to friends) with everything an invite needs,
run the host's booth, and follow what is said with a note-taking bot.
It runs on your own computer (self-run only; there is no hosted MCP URL). Broadcasts go out over GifOS's own peer-to-peer fan-out: every viewer's device helps carry the picture on, so no single node's bandwidth grows with the audience. No GifOS account, no API key, no model.
The shared parts (the bot, transcripts, Kokoro, links and invite details) are gifos-mcp-core, pinned to an exact commit. Its sibling for meetings is gifos-meet-mcp.
Requires GifOS 0.9.23b or newer (broadcast start time, Visit, Rebroadcast with Prerecorded, Meeting Bot contract version 2).
How it works
Grok Bot ──MCP (stdio)──▶ gifos-broadcast-mcp ─┬▶ booth: the host's seat in a headless Chromium (go live, video, end)
(the brain) └▶ Meeting Bot in its own headless Chromium: watches, writes down, speaksGrok Bot is the brain, and decides what to confirm. The tools do exactly what they say, with no confirmation step of their own.
go_live,play_videoandend_broadcastsay plainly in their descriptions that viewers will see or hear the result, so the caller can check with its user first.Scheduling without joining.
create_broadcastmints the watch link (the host's link too: the host goes live from it with the host password) and returns every invite detail: title, start and end with time zone, the link, the Visit link, description, how viewers get in, who does what, and ready-to-send text. Viewers who open the link early see when it starts, a countdown and Add to calendar (made on their own device); anyone who opens it after the end reads that it ended. Nothing goes live and nothing is sent.The booth is the host's seat on this computer.
open_boothneeds the host password (to derive the host key; it is held in memory while the booth is open and never stored) and opens off air.go_liveturns this computer's camera and microphone on for everyone watching.play_videoplays a video file live into the broadcast; viewers see Prerecorded and cannot skip or save it (no per-viewer downloads).set_start_timeandset_visit_linkchange what viewers see.end_broadcastends it for everyone.Notes.
join_broadcastputs Meeting Bot in as a viewer; it writes down what is said on the Stage, credited by name.wait_linesreturns each line the moment it lands.Speech is Kokoro (kokoro-js 1.2.1) with its default voice, for
say. Speech to text is GifOS Whisper in the headless browser.
Related MCP server: Grok Web MCP
Install
You need Node.js 20 or newer.
npx -y github:nwcnwc/gifos-broadcast-mcpor from a clone:
git clone https://github.com/nwcnwc/gifos-broadcast-mcp.git && cd gifos-broadcast-mcp
npm install --ignore-scripts
npx playwright install chromium
node bin/gifos-broadcast-mcp.js # stdio
node bin/gifos-broadcast-mcp.js --http # or streamable HTTP on http://127.0.0.1:19521/mcpInstall scripts are not needed and should be off. This package and gifos-mcp-core have none. Three
dependencies of kokoro-js do: onnxruntime-node would download CUDA libraries from GitHub on Linux x64, sharp
checks for a system libvips, protobufjs checks its version. The CPU build of ONNX Runtime and sharp's prebuilt
binary ship inside the packages, so --ignore-scripts loses nothing. The plugin's .mcp.json sets
npm_config_ignore_scripts=true and ONNXRUNTIME_NODE_INSTALL_CUDA=skip.
Grok Bot setup
As a plugin, this repository has .grok-plugin/plugin.json, .mcp.json and skills/gifos-broadcast/SKILL.md.
By hand, add a local (stdio) MCP server:
{
"mcpServers": {
"gifos-broadcast": {
"type": "stdio",
"command": "npx",
"args": ["-y", "github:nwcnwc/gifos-broadcast-mcp"],
"env": { "npm_config_ignore_scripts": "true", "ONNXRUNTIME_NODE_INSTALL_CUDA": "skip", "GIFOS_URL": "https://gifos.app" }
}
}
}It can run next to gifos-meet-mcp; give each its own GIFOS_MCP_HOME if both run at once.
Endpoints, downloads and credentials
What | Where | When | Size |
GifOS site |
| every start | — |
GifOS relay | GifOS's default relay, or | while in a broadcast (it only introduces peers) | — |
Meeting Bot and Offline Captions apps | the GifOS store on | first | small |
Whisper model | through the Offline Captions app | first transcription | about 77 MB |
Kokoro weights |
| first start, kept in | about 92 MB; each file is checked against its pinned SHA-256 |
Chromium for Playwright | Playwright's download servers ( | first start if missing, unless | about 150 MB |
npm packages | the npm registry and GitHub (gifos-mcp-core) | install | — |
Credentials. The bot's own name and password (GIFOS_MCP_HOME/bot.json, mode 0600, or
GIFOS_BOT_NAME/GIFOS_BOT_PASSWORD). The host password of a broadcast is passed to create_broadcast and
open_booth for that call; it is never stored, logged or returned, and the host key derived from it lives only
in the booth's memory while the booth is open. The server reads no other secret, sends no telemetry, and never
sends email, posts or calendar invites.
Environment variables
Variable | Default | What it does |
|
| The GifOS site. It must be 0.9.23b or newer. |
| GifOS default | A custom relay ( |
| generated | The bot's name (what people see) and password. A |
|
| The store app for speech to text. |
|
| Browser profile, bot credential, |
|
|
|
| Playwright's Chromium | Another Chromium or Chrome binary. |
|
| How long to wait for GifOS steps such as joining. |
| none | Bearer token for |
|
|
|
|
|
|
|
|
|
| none | A folder for screenshots of the bot's screens. |
|
| How often captions are copied from Meet Bot into the lines. |
|
|
|
|
| Kokoro's default voice for every line. |
| empty | A GifOS store speech app instead of Kokoro in this process. |
|
| A mirror with the Hugging Face layout for the Kokoro weights. The pinned revision and hashes still apply. |
| empty | HTTP stand-ins for speech and captions (testing). This process calls them; the page does not. |
|
| Seated meetings at once. A join over the cap is refused; a scheduled join waits. |
|
| Stage B. More than 1 makes this process a supervisor and runs each Meet Bot in its own child process and Chromium. Worker 0 keeps the bot name and |
| cap / workers, rounded up | Rooms per worker. |
| none | A |
| none | A |
|
|
|
Tools
Broadcast tools (this server):
Tool | Arguments | Returns |
|
|
|
|
| Opens the host's seat on this computer, off air. Refuses a host password the broadcast was not made with. |
|
| Starts the live broadcast: this computer's camera and microphone go out to everyone watching. |
|
| Plays a video file live into the broadcast now; viewers see Prerecorded. |
|
| Stops it. |
|
| What early viewers see (countdown, Add to calendar). Empty clears it. |
|
| The https Visit link on the picture and the ended card. Empty clears it. |
|
| Ends the broadcast for everyone; viewers read that it ended; the booth closes. |
|
| Open, on air, camera, microphone, video, watching, start time and Visit as the host page shows them. |
|
| Closes the booth without the End step. |
|
| Meeting Bot watches the broadcast and writes down what is said. |
Shared tools (from gifos-mcp-core, the same in gifos-broadcast-mcp):
Tool | Arguments | Returns |
|
| Returns as soon as there is a line after |
|
| The lines after |
|
| Plain text, one |
|
| Meet Bot says the line out loud now (Kokoro). |
|
| A chat line as the bot (up to 2000 characters). |
|
| Who is here; a PNG of the bot's page. |
|
| Stop or restart note-taking. |
|
| Saves the transcript, then the bot leaves. Other people stay. |
|
| Stores the join order, including the room password, in |
| see the schemas | Join orders. No passwords in results. |
| — | State, people, line counts, capacity. No passwords. |
|
| Connector events, including |
The resource gifos://meeting/{id}/transcript is the live transcript as newline-delimited JSON; subscribe for
notifications/resources/updated.
Example: a Sunday service
The user says: "Set up our Sunday service at 10, with the giving link, and tell the congregation." Grok Bot calls
create_broadcast({ title: "Sunday service", host_password, start: "2026-10-25T10:00", timezone: "America/Chicago", visit_url: "https://example.org/give" })and sendsinvite.textthrough the user's own channels after the user approves.At 9:55 Grok Bot calls
open_boothandjoin_broadcast. When the user says go,go_live.During the service Grok Bot follows
wait_lines. Afterwards,end_broadcast(after checking with the user) andplay_videolater in the day to rebroadcast the recording live, if the user wants that.
Privacy and security
Everything runs locally. The browser, the bot, one shared speech-to-text engine, and the transcripts are all on your machine. Media goes peer to peer between participants. GifOS's relay only helps peers find each other.
Consent is visible. A GifOS meeting is always written down, and every participant's header always shows 📝 Transcribing, also when the call is calm. The bot is a tile labelled 🤖 bot for as long as it is in the meeting.
mutestops the bot writing the meeting down;end_meetingtakes it out.The booth uses this computer's camera and microphone only after
go_live. It opens off air. Meet Bot never uses them: It joins with no camera, Meeting Bot never transcribes its own machine's microphone, and its browser is fed a silent fake microphone anyway.Only one secret. The bot name and password derive Meeting Bot's secret admin meeting, which can command the bot from another device (Meeting Bot's CONTROL mode). Keep
GIFOS_MCP_HOME/bot.jsonprivate (it is mode 0600), or pass the pair through environment variables. Anyone with the pair can command the bot.Meeting links are capabilities. Anyone with a link can join that meeting, so share links only with the people you invite.
Transcripts are stored in
GIFOS_MCP_HOME/meetings.json(mode 0600) so they survive restarts. Delete the file to forget them. It is written to a temp file then renamed, so a save cut short keeps the last good file; a file that cannot be read at start is kept asmeetings.json.bad-<ms>(mode 0600, logged) and not overwritten. Delete any*.bad-*file too (abot.json.bad-*holds an old bot password). A join whose save fails (disk nearly full) still holds its seat and reads its captions; the failure is logged and the next save writes it. The same holds forschedule.json: a clock tick whose save fails still seats, waits and ends its orders, logs the failure once until a save works, and the next save writes their phases. Anend_meeting(or a clock leave) whose saves fail still reports the leave, raisesmeeting.left, and keeps the meeting ended and its orderleft_earlyorendedin memory, so no tick seats the bot again. Ajoin_meetingwith a password whoseschedule.jsonsave fails still reports the join and raisesmeeting.joined; its order (with the room password) is keptlivein memory and the next save writes it. Amute,unmuteorget_transcriptwhosemeetings.jsonsave fails still answers with what the bot did (muted, listening, the transcript); memory keeps it and the next save writes it. A transcript line whose append totranscripts/<id>.jsonlfails keeps every caption line of that snapshot (and itsline.*event),send_chatandsaystill report what Meet Bot sent, and the kept lines are written in order at the next append that works. A file whose last line was torn is ended before the next line.No model, no key. There is no language model in this server and no model URL or API key is read. The assistant that calls the tools writes every word the bot says.
MeetingBot.setVoicereceives{ respond_to_command: false, speak: false }on every join, so Meet Bot answers nothing on its own.No outgoing messages. The server never sends email, calendar invites or anything else. Grok Bot does that through your own connectors, and you approve each send. Follow-up after the meeting is Grok Bot's job.
HTTP mode binds to 127.0.0.1, checks the
Hostheader (DNS-rebinding protection), and can require a bearer token.
Troubleshooting
Symptom | Fix |
| The host password is not this broadcast's, or the site is older than 0.9.23b. |
| Use |
| The site is older than 0.9.23b. |
| A download was cut or a mirror served other bytes. The file was removed; start again. |
| Run |
Anything else |
|
Testing instructions for marketplace reviewers
1. Unit tests (no network, no browser).
git clone https://github.com/nwcnwc/gifos-broadcast-mcp.git && cd gifos-broadcast-mcp
npm install --ignore-scripts
npm testThey run every tool over a real MCP client/server pair with a stand-in booth and bot: links carry only the host key's verifier, the host password is never returned or stored, a wrong host password cannot open the booth, and every booth action is one call with no confirmation argument.
2. Full end-to-end test against a local GifOS (what the maintainers run; see runs/).
git clone https://github.com/nwcnwc/gifos-app.git ../gifos-app
git clone https://github.com/nwcnwc/gifos-apps-source.git ../gifos-apps-source
npx playwright install chromium
GIFOS_APP_DIR=../gifos-app MEETING_BOT_SRC=../gifos-apps-source/meeting-bot \
E2E_RELAY=wss://your-gifos-0.9.23b-relay E2E_VIDEO=/path/to/short-clip.webm npm run test:e2eIt serves the GifOS checkout on 127.0.0.1:19512 with Meeting Bot in its store, runs this server over stdio,
and checks with a separate viewer browser: the early-viewer countdown, the booth opening off air, go live (the
viewer sees the picture), Meeting Bot writing down the host's words through wait_lines, Prerecorded during
play_video, and "has ended" after end_broadcast.
License
MIT. GifOS, Meeting Bot and Kokoro are separate projects with their own licenses.
This server cannot be deployed
Maintenance
Related MCP Connectors
Run a 24/7 live stream of pre-recorded videos, or live stream a recorded video at a set time.
Manage 24/7 live streams, media, playback queues, schedules, and multistreaming from AI assistants.
- sleipnirOAuthtv.sleipnir
Multistream to Twitch, YouTube and Kick; generate OBS overlays from a plain-English prompt.
BenAwf remote MCP for Strategy Lab. Streamable HTTP. Paper GA; live venue beta.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server for live X/Twitter and web search, driven by your locally logged-in Grok CLI and leveraging your X Premium or SuperGrok subscription quota.31MIT
- FlicenseNot gradedqualityDmaintenanceAutomates Grok web interface to provide chat, web search, and conversation management via MCP, supporting multiple accounts and local/remote deployment.-
- AlicenseBqualityBmaintenanceEnables Grok Bot Chiefs of Staff on separate user accounts to pair with owner approval, exchange addressed task proposals and availability windows, manage asymmetric capability grants, and revoke access through a hosted mailbox service. It runs as a standard MCP stdio client that authenticates with an owner's agent credential and supports contacts listing, message submission, cursor-based inbox polling, and idempotent retries.8Apache 2.0
- AlicenseNot gradedqualityBmaintenanceA stdio MCP server that lets Grok Bot receive spooled Telegram updates and respond through Telegram — listing and acknowledging pending messages, sending or editing replies, and showing editable progress drafts. It also exposes webhook helpers so the bot can manage its Telegram webhook configuration.MIT