MeetStream MCP Server
The MeetStream MCP server exposes the whole meeting-bot lifecycle as Model Context Protocol tools. Connect it once and your assistant can run real bots against your account:
“Send a bot to
https://meet.google.com/abc-defg-hijwith Deepgram transcription. When the call ends, give me the summary and the action items.”
“Bot
4f1c…never made it into the meeting. Find out why.”
“Re-transcribe yesterday’s 3 pm call with AssemblyAI and compare speaker labels with the original.”
This is the action server: it calls the MeetStream API on your account. The separate docs-search MCP (https://docs.meetstream.ai/_mcp/server) only searches these docs and needs no key. Most agents should have both.
At a glance
Quickstart
Connect your client
Pick your client in the tabs below. Most clients only need the URL https://mcp.meetstream.ai/mcp. Every option exposes the same 19 tools.
Sign in
When your client opens app.meetstream.ai, sign in and click Allow. The dashboard creates an API key for that connection, so there is no key to copy. If your client cannot sign in with OAuth, create a key yourself (it starts with ms_) and send it as the tab shows.
Claude Code
Claude Desktop & claude.ai
Cursor
VS Code
Windsurf
Codex
Gemini CLI
Any MCP client
Hosted, sign in with OAuth:
Then run /mcp in Claude Code, choose meetstream and Authenticate. Your browser opens app.meetstream.ai: sign in and click Allow.
Hosted, with an API key:
Check it with claude mcp list. Add --scope project to share the server config with your team through .mcp.json; each teammate signs in or supplies their own key.
For MeetStream-specific coding knowledge on top of the tools, also install the agent skills plugin:
The plugin ships skills only, so install it alongside the MCP server, not instead of it.
Do not use npx @meetstream/mcp. That npm package is the old Node server, frozen at 0.3.0, and it predates the audio-only create_bot defaults and later fixes. If a client config still runs it, switch it to the hosted URL.
Authentication
- OAuth or a key. Sign in with OAuth and the dashboard creates an API key for that connection, or send a key you created yourself. Each request carries its own credential and the hosted server keeps nothing between requests. Every action runs as the account that owns the key, with that account’s bots, calendars and provider settings.
Bearerhere,Tokenon REST. The MCP server expectsAuthorization: Bearer <key>. The REST API atapi.meetstream.aiexpectsAuthorization: Token <key>. SendingTokento the MCP server returns401.- No credentials, no call. A request without a key or token gets
401with setup instructions and aWWW-Authenticateheader that points OAuth clients at the sign-in flow. - Disconnect. OAuth access tokens last an hour and refresh automatically. To cut a connection off, delete the key named after the app on the API keys page.
- Is there a local version? No. MeetStream hosts the server, so it is always the current version and there is nothing to install or update. Clients that only speak the older HTTP+SSE transport use
https://mcp.meetstream.ai/sse.
Key hygiene: one key per person or per agent, stored in an environment variable or your client’s secret store rather than in a committed file. Rotate a key from the dashboard if it ever appears in a chat, a screenshot or a log.
What your agent can and cannot do
Every tool declares what kind of action it is, so your client can ask before anything with side effects.
Not exposed as tools (use the REST API, an SDK or the CLI): creating and editing MIA agent configs, connecting a calendar, custom storage, registering signed-in bot domains and accounts (Google and Teams, so passwords never pass through a chat), custom automatic_leave values and deduplication_key. create_bot can still use all of them once they exist: agent_config_id attaches a MIA agent, google_login_domain / teams_login_domain make a signed-in join, and zoom_zak_url / zoom_obf_url make an authenticated Zoom join.
Tools
Bots (7)
Transcripts (3)
Media and meeting data (4)
Live meeting (2)
Calendar and reference (3)
create_bot options
The tool uses friendlier names than the REST body. If your agent moves from prototyping over MCP to writing REST or SDK code, this is the mapping:
Every bot created over MCP also gets safe automatic_leave defaults, so a bot never sits in an empty call or a lobby indefinitely: 300 s in the waiting room, 60 s after everyone leaves, a 4 hour recording cap, and 60 s for Zoom’s recording-permission prompt.
Example workflows
Notetaker for one meeting
“Send a notetaker called ‘Acme Notes’ to https://zoom.us/j/123?pwd=abc with Deepgram. When it’s done, give me the summary, the action items with owners, and the full transcript.”
The agent calls create_bot with transcription_provider: "deepgram", checks get_bot_status while the meeting runs, then calls get_transcript with wait: true and summarizes the result.
Why didn't my bot join?
“Bot 4f1c… never showed up in the meeting. Diagnose it.”
get_bot_status and get_bot_detail show the status timeline. NotAllowed means nobody admitted it from the waiting room before the timeout. Denied means a host refused it. For Zoom meetings outside your own account, check that your Zoom app is out of development mode (production submission). The debugging guide covers the rest.
Re-transcribe with a different provider
“The speaker labels on yesterday’s standup look wrong. Re-run it with AssemblyAI and compare.”
list_bots finds the bot, transcribe_audio starts a new run with provider: "assemblyai", and list_transcriptions shows both runs side by side.
Rescue a live-only bot
“I used deepgram_streaming for this call, and now I need a proper post-call transcript.”
Streaming-only bots never produce a post-call transcript, so get_transcript stays not-ready. transcribe_audio generates one from the stored audio.
Talk into a live meeting
“Post the agenda in the meeting chat, then show our logo on the bot’s tile for 30 seconds.”
send_chat_message, then send_image with a public image URL and display_duration_seconds: 30.
Bots from the calendar
“What’s on my calendar tomorrow? Put a bot on every external call.”
list_calendar_events, then schedule_calendar_bot for each event it picks. Ask the agent to list the events it chose before it schedules anything.
Write a webhook handler that is right the first time
“Read the MeetStream webhook guide, then write an Express handler that stores transcripts when they’re ready and alerts me when a bot isn’t admitted.”
webhook_events_guide gives the agent the real payload shapes. Every ending arrives once as event: "bot.stopped" and bot_event says why (bot.stopped, bot.kicked, bot.notallowed, bot.denied, bot.failed). bot.done is the final event on every path.
create_bot recording parameters
The MCP tool’s recording arguments map onto the Create Bot API like this. The tool defaults differ from the raw API defaults on purpose, so an assistant that just says “join my meeting” gets an audio-only bot.
Ask for video explicitly (“record video of this meeting”) to get record_video: true, and say “grid view” or “gallery view” if you want the mosaic instead of speaker view.
Notes
- Stateless & scalable — the remote server treats every request independently; there’s no session to keep alive.
- Safe defaults on
create_bot— sensibleautomatic_leavetimeouts are applied so bots never sit in empty meetings. - Audio-only by default: since server
0.3.3,record_videodefaults tofalseand is always sent explicitly, and when you do ask for video the server sendsvideo_layout: "speaker_view". Per-participant video is never enabled unless you ask for it. - Destructive ops are gated —
delete_bot_datarequires explicit confirmation. - Idempotency — a retried
create_botreturns the original bot rather than creating a duplicate.
