gifos-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-mcpcreate a GifOS meeting and send the note-taking bot"
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-mcp: GifOS Meet connector for Grok Bot
gifos-mcp is an MCP server that lets Grok Bot (or any MCP client) create
GifOS meetings, put a note-taking bot in them, and read back the transcript.
It runs on your own computer. It starts a headless Chromium running GifOS, installs the Meeting Bot app from the GifOS app store, and drives it. Meetings stay peer to peer between the people in them. Transcripts stay on your computer. No GifOS account or API key is involved.
Requires GifOS 0.9.23 or newer, the release that ships the Meeting Bot store app. Until it is live on gifos.app, point
GIFOS_URLat a GifOS 0.9.23 site (see Testing).
How it works
Grok Bot ──MCP (stdio)──▶ gifos-mcp ──▶ headless Chromium (one profile in ~/.gifos-mcp)
└─ GifOS desktop
├─ Meeting Bot, running as the bot (RUN mode)
│ driven through its local control API, window.MeetingBot v1
└─ Offline Captions (Whisper), the speech-to-text providercreate_meetingonly mints a meeting link. Nothing joins yet.start_meetingorjoin_meetingsends the bot into the meeting. Everyone in the meeting sees it as a tile labelled 🤖 bot with a 📝 transcribing chip. The bot has no camera and never sends audio.Speech is turned into text on your computer by the Offline Captions (Whisper) app from the GifOS store. The bot writes down each participant who is unmuted, credited by name. It never writes down its own machine's microphone.
get_transcriptreads the transcript straight from the bot. Meeting Bot's control contract (version 1) is the only interface this server relies on.
Grok Bot does the timing and the invites. A Grok Bot routine calls start_meeting at meeting time. Invites
go out through your own email or calendar connector in Grok Bot, and you approve each send. This server never
sends email or calendar invites.
The server must be running at meeting time. If the machine is asleep or the server is stopped when the routine fires, the bot is not in the meeting. Run it on a machine that is always on. The always-on box that already runs Grok Bot is the best place.
Related MCP server: grok-oauth-mcp
Install
You need Node.js 20 or newer. The first start downloads Chromium for Playwright (about 150 MB), and the first transcription downloads the Whisper model (about 77 MB).
Run it straight from GitHub:
npx -y github:nwcnwc/gifos-mcpnpx gifos-mcp works the same once the package is published to npm.
Or from a clone:
git clone https://github.com/nwcnwc/gifos-mcp.git
cd gifos-mcp
npm install
npx playwright install chromium
node bin/gifos-mcp.js # stdio
node bin/gifos-mcp.js --http # or streamable HTTP on http://127.0.0.1:19520/mcpIf Chromium is missing, the server runs playwright install chromium by itself on first start. Set
GIFOS_MCP_NO_INSTALL=1 to turn that off.
Grok Bot setup
Add a local (stdio) MCP server in Grok Bot's MCP / connector settings. The configuration is the standard
mcpServers JSON:
{
"mcpServers": {
"gifos-meet": {
"type": "stdio",
"command": "npx",
"args": ["-y", "github:nwcnwc/gifos-mcp"],
"env": {
"GIFOS_URL": "https://gifos.app"
}
}
}
}From a clone, use "command": "node" and "args": ["/path/to/gifos-mcp/bin/gifos-mcp.js"].
The server warms up in the background as soon as Grok Bot starts it, so the first start_meeting doesn't wait
for the browser. A cold start takes about 10 seconds, plus downloads on the very first run.
If your client can only reach MCP over HTTP, run gifos-mcp --http [port]. It listens on 127.0.0.1 only. Set
GIFOS_MCP_HTTP_TOKEN to require Authorization: Bearer <token>.
Environment variables
Variable | Default | What it does |
|
| The GifOS site to use. It must be 0.9.23 or newer with Meeting Bot in its store. |
| GifOS default | A custom relay ( |
| generated | The Meeting Bot name and password. They derive the bot's secret admin meeting. The name is what participants see. If unset, a strong pair is generated once and kept in |
|
| The store app that turns speech into text. |
|
| The browser profile, the bot credential, and |
|
|
|
| Playwright's Chromium | Path to another Chromium or Chrome binary. |
|
| How long to wait for GifOS steps such as joining. |
| none | A bearer token for |
|
|
|
|
|
|
| none | A folder for screenshots of the bot's screens (for debugging). |
Tools
Tool | Arguments | Returns |
|
|
|
|
| The bot joins and starts transcribing. |
|
| The bot joins someone else's GifOS meeting ( |
|
| The bot stops transcribing, and the transcribing chip goes away. The bot never sends audio, so this is the only mute it has. |
|
| The bot transcribes again. |
|
| Posts text or a link (up to 2000 characters) into the meeting chat as the bot. There is no screen sharing, because the bot has no screen. |
|
| Plain text, one |
|
| Saves the transcript, then the bot leaves. Everyone else can stay, because GifOS meetings have no owner who can close them. |
| none | Every meeting this server created or joined, with its state ( |
| none | Browser state, bot name, the bot's live sessions, and its last heartbeat. |
Errors come back as MCP tool errors with a readable message, for example Unknown meeting_id … or
Meeting m_… is scheduled. Call start_meeting first.
Example: a 5 PM meeting
The user tells Grok Bot: "Set up a demo meeting with Alice and Bob at 5 PM, take notes, and send me a summary."
Invite (now). Grok Bot calls
create_meeting({topic: "Demo meeting", start_time: "17:00"})and gets alink. It drafts a calendar invite to Alice and Bob containing the link, in the user's own calendar. The user approves the send.Timing (a routine at 17:00). Grok Bot calls
start_meeting({meeting_id}). The bot joins and transcribes.gifos-mcphas to be running at this point.Meeting (17:00 onward). Alice and Bob open the link and see the 🤖 bot tile with the transcribing chip. Grok Bot can
share_contentthe agenda. When the meeting is over (a second routine, or the user saying so), Grok Bot callsend_meetingandget_transcript, writes the summary, and drafts it to the user.
Privacy and security
Everything runs locally. The browser, the bot, speech-to-text (Whisper runs inside the browser) 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. The bot is labelled 🤖 bot and shows 📝 transcribing whenever it listens.
muteremoves the chip.The bot never uses your microphone or camera. 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.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.
HTTP mode binds to 127.0.0.1, checks the
Hostheader (DNS-rebinding protection), and can require a bearer token.
Troubleshooting
Symptom | Fix |
| That GifOS is older than 0.9.23. Set |
| Same cause: the site's build is older than the one Meeting Bot needs. |
| Another |
| Somebody has to speak with their mic on. The first transcription downloads the Whisper model (about 77 MB), which takes a minute. Run with |
| The store's Meeting Bot is older than the control contract v1. Update it from the store (the server presses Update when the store offers it). |
| Run |
The routine's | The server wasn't running, or the machine was asleep. Keep it on an always-on machine. |
Tool calls time out in the client | The first call after launch can take about 10 seconds while the browser starts. Leave |
Anything else |
|
Testing instructions for marketplace reviewers
1. Unit tests (no network, no browser, under a minute).
git clone https://github.com/nwcnwc/gifos-mcp.git && cd gifos-mcp
npm install
npm testThese run the ten tools over a real MCP client/server pair with a fake bot, plus the --http transport through
the real binary.
2. Try it live (needs GifOS 0.9.23 or newer on gifos.app).
Add the server to Grok Bot with the config above, or run
npx -y github:nwcnwc/gifos-mcpunder any MCP client.Ask: "Create a GifOS meeting called Demo meeting and start it." You get a link back.
Open the link in a normal browser, allow the microphone, turn your mic on, and say a sentence or two. You should see a tile labelled 🤖 bot with 📝 transcribing.
Ask: "Share 'Hello from Grok' in the meeting." It appears in the meeting chat.
After about 30 seconds (longer the first time, while the Whisper model downloads), ask: "Get the transcript." Your words come back as
YourName: …lines.Ask: "End the meeting." The bot tile disappears.
get_transcriptstill returns the saved text.
3. Full end-to-end test against a local GifOS (what the maintainers run; see PROOF.md).
git clone -b release/0.9.23 https://github.com/nwcnwc/gifos-app.git ../gifos-app
git clone -b meet-bot https://github.com/nwcnwc/gifos-apps-source.git ../gifos-apps-source
GIFOS_APP_DIR=../gifos-app \
MEETING_BOT_SRC=../gifos-apps-source/meeting-bot \
E2E_RELAY=wss://your-gifos-0.9.23-relay \
E2E_SPEECH_WAV=/path/to/someone-speaking.wav \
npm run test:e2eIt serves the GifOS checkout on 127.0.0.1:19510, adds Meeting Bot to that site's store (from
MEETING_BOT_SRC; leave it unset when the checkout already lists apps/meeting-bot), and spawns
gifos-mcp over stdio. Then it runs create_meeting → start_meeting. A second headless browser joins as
"Alice" and plays the WAV. The test checks that get_transcript returns Alice's words, then runs
share_content, mute/unmute, list_meetings and end_meeting. Screenshots go to .e2e/proof/.
Variants:
E2E_STT=syntheticswaps Whisper for a tiny test provider, so no WAV and no model download are needed.RELAY_SCRIPT=<path>starts a local GifOS relay on127.0.0.1:19511instead of usingE2E_RELAY.
License
MIT. GifOS and Meeting Bot are separate projects with their own licenses.
Available Tools
10 toolscreate_meetingCreate a GifOS meetingA
Creates a new GifOS meeting link. Nothing joins yet: share the link (for example in a calendar invite the user approves), then call start_meeting at meeting time. start_time is stored as given, for your own scheduling; this server does not schedule anything.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | What the meeting is about, e.g. "Demo meeting". | |
| start_time | No | When it should start, e.g. "2026-10-15T17:00:00-07:00". Informational only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and it does useful work: it discloses that no one joins on creation, that start_time is stored verbatim and never triggers scheduling, and that the output is a shareable link. It does not mention auth/permission requirements or limits, but the non-obvious semantics are covered well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and then the sequencing caveat and the scheduling caveat. Every sentence carries distinct information; nothing repeats the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter creation tool with no annotations and no output schema, the description covers what is produced (a link), how it is consumed, and the next tool in the flow. There is no meaningful gap an agent would need filled to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description goes beyond the schema's terse "Informational only" for start_time by spelling out the consequence: it is stored as given for the agent's own scheduling and the server never schedules. That added implication is real value over the field text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Creates a new GifOS meeting link") and immediately clarifies the non-obvious distinction from a meeting actually running ("Nothing joins yet"), which separates it from siblings like start_meeting and join_meeting. An agent can pick this tool without reading any other schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly prescribes the workflow: create the link, share it (e.g. in a calendar invite the user approves), then call start_meeting at meeting time. It also states what this tool does NOT do (schedule anything), which is a clear exclusion rather than implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
end_meetingEnd the meeting for the botA
Saves the transcript, then the bot leaves. Other participants can stay; GifOS meetings have no owner who can close them for everyone.
| Name | Required | Description | Default |
|---|---|---|---|
| meeting_id | Yes | The meeting_id returned by create_meeting or join_meeting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does reasonably well: it discloses two concrete side effects (transcript is saved before exit; the bot leaves while others stay). It omits the safety profile an agent might want — whether the call is idempotent, what happens on an already-ended or invalid meeting, and whether it requires the bot to be in the meeting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, no filler. The primary effect (transcript saved, bot leaves) is front-loaded and the clarifying scope constraint follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, no-output-schema tool the description covers what the agent needs to know about the action and its blast radius. It falls just short on failure/edge-case behavior (already-ended meetings, invalid or other-user meeting_id) and on whether the saved transcript can be retrieved afterwards via get_transcript.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One required parameter at 100% schema description coverage, and the schema already explains meeting_id's provenance (create_meeting or join_meeting). The description adds nothing about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (end the meeting by saving the transcript and having the bot leave) and immediately scopes it: only the bot exits, other participants remain. It also preempts a wrong mental model ("no owner who can close them for everyone"), which separates it from start_meeting/join_meeting and from any generic 'close meeting' assumption.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: an agent can infer this is the way to remove the bot from an active meeting it has joined. There is no explicit when-to-use vs when-not-to-use guidance and no named alternative (e.g., what to do instead if you want to keep the bot but stop recording). Minimum viable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transcriptGet the meeting transcriptA
Returns the transcript as plain text, one "speaker: words" line per caption. Works while the meeting is live and after end_meeting.
| Name | Required | Description | Default |
|---|---|---|---|
| meeting_id | Yes | The meeting_id returned by create_meeting or join_meeting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses output format (plain text, speaker-prefixed lines) and availability (live and post-meeting). However, it omits permissions, error behavior, rate limits, and whether the transcript is complete or partial. Some behavioral context is provided, but the full burden is not met.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the return format and followed by availability. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read tool with no output schema and no annotations, the description covers the essential call context: what is returned, its format, and when it can be used. It could mention invalid meeting_id handling or transcript completeness, but those are minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the single required parameter meeting_id is fully documented in the schema. The description does not add parameter-level meaning, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Returns') and resource ('the transcript') and defines the output format as plain text with 'speaker: words' lines. No sibling tool provides transcripts, so it is inherently distinguishable; it also references end_meeting to clarify temporal scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly states the tool works both while the meeting is live and after end_meeting, giving the agent temporal context for when it can be called. It does not enumerate when-not or alternative approaches, but no sibling tool offers transcript retrieval, so the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
join_meetingJoin an existing GifOS meeting by linkA
The Meeting Bot joins a GifOS meeting someone else created (a /run.html#v=… or /meet/… link) and starts transcribing. Returns a meeting_id for the other tools.
| Name | Required | Description | Default |
|---|---|---|---|
| link | Yes | The GifOS meeting link. | |
| topic | No | ||
| password | No | The meeting password, if the meeting has one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It usefully reveals two non-obvious behaviors: a bot joins on your behalf and transcription begins, and a meeting_id is returned for downstream calls. It does not state auth requirements, whether the join blocks or is async, or what happens on a bad/expired link.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the action and its precondition come first, the return value second. No filler, no restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since there is no output schema, the description usefully compensates by explaining that a meeting_id is returned. For a low-complexity 3-parameter action the remaining gap (error/edge behavior, password prerequisites) is minor but real.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% (topic has no description), and the description adds no field-level guidance. However, it does supplement the link parameter by naming the accepted formats (/run.html#v=…, /meet/…), which the schema's bare 'The GifOS meeting link.' does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('joins a GifOS meeting... and starts transcribing') and explicitly scopes it to meetings 'someone else created', which cleanly separates it from sibling create_meeting/start_meeting. The 'bots joins' framing also identifies the actor.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'someone else created' gives a clear condition for using this tool versus hosting your own meeting, and the link formats given imply what input to supply. It stops short of naming the alternative sibling tools (create_meeting/start_meeting) as explicit exclusions, so it is not a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_meetingsList meetingsA
Meetings this server created or joined, newest first, with their state (scheduled, live, ended).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses ordering ('newest first') and the state vocabulary ('scheduled, live, ended'), which is genuine behavioral context about the payload. It says nothing about pagination, result limits, auth requirements, or whether the list is scoped to the caller.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler; scope, ordering, and state are front-loaded in one pass. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with no output schema, the description covers the essentials: what is listed, in what order, and the state values returned. The main remaining gap is unbounded-result behavior (pagination or truncation), which matters for a list tool but is a single omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. No parameter claims are made that could mislead.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource ('Meetings') and pins down scope ('this server created or joined'), ordering ('newest first'), and the returned state field. It reads as a noun phrase rather than an action statement, and it never names a sibling, but no other tool in the set enumerates meetings, so an agent can still place it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the enumeration tool, and the scope qualifier ('this server created or joined') hints at when results apply. There is no explicit when-to-use, no exclusion, and no routing against adjacent tools such as 'status' or 'get_transcript'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muteMute the bot (stop listening)A
Stops the bot transcribing this meeting; the transcribing chip goes away. The bot never sends audio, so this is the only kind of mute it has.
| Name | Required | Description | Default |
|---|---|---|---|
| meeting_id | Yes | The meeting_id returned by create_meeting or join_meeting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does meaningful work: it discloses the primary effect (transcription stops), a side effect (the transcribing chip disappears), and a non-obvious behavioral fact that the bot never sends audio. It omits reversibility and permission requirements, but the core behavior is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the core effect front-loaded and zero filler. The second sentence resolves a genuine ambiguity about whether other mute variants exist, so every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, annotation-free tool with no output schema, the description is nearly sufficient: the effect and scope are covered, and the 'no audio' clarification prevents misreading. Only the reversibility/permission story is left to inference via the unmute sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
A single required parameter with 100% schema description coverage, so the schema already documents meeting_id fully. The description adds no syntax or scoping detail about the parameter, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and its effect on the resource: it stops the bot transcribing this meeting. That distinguishes it from read/status siblings, but it never names the obvious counterpart 'unmute', so the differentiation is left implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated – an agent can infer this is an in-meeting action keyed by meeting_id that halts transcription. It adds a mild clarification ('this is the only kind of mute it has') but gives no explicit when-to-use/when-not guidance or pointer to unmute for reversal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_meetingStart a meeting (the bot joins and transcribes)B
The headless Meeting Bot joins the meeting created with create_meeting and starts transcribing. Participants see a 🤖 bot badge and a transcribing chip.
| Name | Required | Description | Default |
|---|---|---|---|
| meeting_id | Yes | The meeting_id returned by create_meeting or join_meeting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the visible side effects (participants see a robot badge and a transcribing chip) and that the bot is headless, but says nothing about idempotency, permissions, failure modes, or what happens on a meeting already in progress.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the action front-loaded and the prerequisite/observable effects following. No filler; the UI-detail sentence earns its place by describing visible behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so return values need not be explained, but as a state-changing start operation with no annotations the description should say more about re-invocation behavior, error conditions, or required permissions. Adequate but with a clear gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single meeting_id parameter is fully documented in the schema, including its origin. The description adds no parameter-level detail beyond what the schema already states, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete action: the headless Meeting Bot joins the meeting and begins transcribing. It implicitly distinguishes itself from create_meeting by naming it as the prerequisite and from join_meeting by specifying that a bot (not a user) joins, though it never names join_meeting directly as the alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The prerequisite is clear — the meeting must already exist via create_meeting. However, there is no explicit guidance on when to choose this over join_meeting, nor what happens if the bot is already in the meeting or the meeting has ended; usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statusConnector statusA
Is the headless GifOS browser up, which GifOS it uses, and which meetings the bot is in right now.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It implicitly signals a side-effect-free read (framed as questions about current state) and enumerates what is inspected, which is useful. It says nothing about auth requirements, behavior when the browser is down, or cost/latency, so meaningful gaps remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler, front-loading the primary question (is the browser up) before the secondary detail (which GifOS, which meetings). Every clause conveys a distinct field of information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because there is no output schema, the description must convey return content, and it does so by enumerating the three values returned. For a zero-parameter read-only diagnostic this is close to sufficient; only edge behavior (e.g., what is returned when the browser is down) is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a parameterless tool applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names three concrete things the tool reports: GifOS browser liveness, which GifOS is in use, and which meetings the bot currently occupies. That is a specific, checkable answer rather than a restatement of the name 'status'. It does not, however, explicitly separate itself from the sibling list_meetings, which also surfaces meeting membership.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'right now' implies a live snapshot and therefore a polling/diagnostic use case, but the description never states when to call this versus list_meetings or any prerequisite. Usage is inferable rather than stated, which matches the 'implied usage' level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unmuteUnmute the bot (listen again)B
Turns transcription back on for this meeting.
| Name | Required | Description | Default |
|---|---|---|---|
| meeting_id | Yes | The meeting_id returned by create_meeting or join_meeting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden; it does clarify the semantic effect (transcription resumes), which goes beyond the bare name 'unmute'. It says nothing about permissions, idempotency, whether other participants are affected, or what happens if the bot was never muted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is proportionate to a one-parameter toggle and wastes nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple toggle with one fully documented parameter and no output schema, the definition is largely sufficient. It falls short only on operational context such as whether the meeting must be in progress or whether unmuting is reversible.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is fully documented there, including its provenance (returned by create_meeting or join_meeting). The phrase 'for this meeting' only restates the schema, adding no new syntax or format detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete action and target: re-enabling transcription for a meeting. Combined with the name 'unmute' and its sibling 'mute', an agent can identify this as the inverse toggle without opening the schema. It does not, however, explicitly name the sibling it pairs with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no exclusion rules, and no mention of the 'mute' counterpart or any prerequisite (e.g. meeting must be active). The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.1.0- First observed
create_meeting - First observed
end_meeting - First observed
get_transcript - First observed
join_meeting - First observed
list_meetings - First observed
mute - First observed
share_content - First observed
start_meeting - First observed
status - First observed
unmute
TDQS
Scored across 10 tools
Each tool targets a distinct action, and the descriptions actively disambiguate the subtle create_meeting vs start_meeting vs join_meeting distinction (create only makes a link, start joins your own, join handles someone else's). mute/unmute and share_content/get_transcript are obviously separable. No two tools appear to do the same thing.
The set is dominated by a clean snake_case verb_noun pattern (list_meetings, create_meeting, start_meeting, join_meeting, share_content, get_transcript, end_meeting). The single-word tools mute, unmute, and status are minor deviations from that pattern but remain clear and readable.
Ten tools is well within the ideal range and each one covers a real stage of the meeting-bot lifecycle. Nothing feels padded or redundant; the surface is tightly scoped to the server's purpose.
The lifecycle is largely covered: create, start, join, list, mute/unmute, share, retrieve transcript, end, and status. Minor gaps remain (e.g. no tool to fetch or delete a single meeting, and no way to remove/inspect an ended meeting beyond the transcript), but core workflows are usable end to end.
Maintenance
Related MCP Connectors
MCP server for RiverScript, an AI transcription platform - fetches transcripts shared via a link.
Memoket — access your recording transcripts, summaries, and key takeaways over MCP.
Search, read, analyze and create HappyScribe transcripts and meeting notes from any MCP client
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceOpen-source meeting bot API with MCP server. Search, retrieve, and analyze meeting transcripts from Google Meet, Zoom, and Microsoft Teams directly from your AI tools.02,869Apache 2.0
- AlicenseBqualityCmaintenanceEnables local MCP clients to interact with xAI Grok through OAuth PKCE, supporting chat, X search, image/video generation, TTS, and transcription.99 npm2MIT
- FlicenseNot gradedqualityDmaintenanceAutomates Grok web interface to provide chat, web search, and conversation management via MCP, supporting multiple accounts and local/remote deployment.-
- AlicenseAqualityAmaintenanceLocal-first CLI + MCP server for meeting recordings - Whisper transcription,91MIT