> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.meetstream.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.meetstream.ai/_mcp/server.

# MeetStream MCP Server

> Connect Claude Desktop, Claude Code, Cursor, and any MCP client to the MeetStream meeting-bot API. Remote (hosted) and local options, full tool list, and step-by-step setup.

This is the **action** MCP server — it *does things* against the MeetStream API (create bots, pull transcripts, send messages into a meeting). It is different from the [documentation search MCP](https://docs.meetstream.ai/build-with-ai/ai-integrations) (`docs.meetstream.ai/_mcp/server`), which only searches these docs. You can use both at once.

The MeetStream MCP server exposes the full meeting-bot lifecycle as [Model Context Protocol](https://modelcontextprotocol.io) tools. Once connected, you can just ask your assistant things like:

> "Send a MeetStream bot to `https://meet.google.com/abc-defg-hij`, record it with Deepgram transcription, and give me the transcript when it's done."

> "List my bots from today and summarize the 3 pm customer call."

## Choose how to run it

There are two ways to connect, and they authenticate differently. Pick one:

| Option              | Endpoint                        | Best for                                   | Auth                          |
| ------------------- | ------------------------------- | ------------------------------------------ | ----------------------------- |
| **Remote (hosted)** | `https://mcp.meetstream.ai/mcp` | Fastest setup, teammates, no local install | Your API key sent per request |
| **Local (npx)**     | `npx @meetstream/mcp` (stdio)   | Keeping your key only on your own machine  | `MEETSTREAM_API_KEY` env var  |

Both expose the exact same tools. The remote server is **multi-tenant and holds no key of its own** — every request must carry your MeetStream API key, so nothing is shared between users.

#### [Get your API key](https://app.meetstream.ai/api-key)

Sign in to the dashboard, open the **API** tab, and create a key. This single key is all the authentication the MCP server needs.

## Setup in Claude and other clients

#### Claude Desktop (UI)

The point-and-click connector flow, using the hosted server. No terminal, no Node.

1. Open **Settings → Connectors → Add custom connector**
2. **Name:** `MeetStream`
3. **URL:** paste your key into the URL as a query parameter:
   ```
   https://mcp.meetstream.ai/mcp?key=YOUR_API_KEY
   ```
4. Leave any OAuth / authentication fields blank — the key in the URL is the auth, so no sign-in is triggered.
5. Save, toggle it **on**, and the MeetStream tools appear in the chat's tools menu.

**Security:** with this method your key sits inside the connector URL (visible in connector settings and server access logs). It is fine for your own use. For teammates, give each person their **own** key with the same `?key=` pattern so you can revoke individuals independently.

#### Claude Desktop (config file)

Runs the server **locally** so your key never leaves your machine. Edit `claude_desktop_config.json` (**Settings → Developer → Edit Config**):

```json
{
  "mcpServers": {
    "meetstream": {
      "command": "npx",
      "args": ["-y", "@meetstream/mcp"],
      "env": { "MEETSTREAM_API_KEY": "YOUR_API_KEY" }
    }
  }
}
```

Save and fully restart Claude Desktop. You'll see `meetstream` with its tools in the tools menu.

#### Claude Code (CLI)

**Remote** (hosted, header auth):

```bash
claude mcp add --transport http meetstream https://mcp.meetstream.ai/mcp \
  --header "Authorization: Token YOUR_API_KEY"
```

**Local** (runs via npx on your machine):

```bash
claude mcp add meetstream --env MEETSTREAM_API_KEY=YOUR_API_KEY -- npx -y @meetstream/mcp
```

Verify with `claude mcp list` — it should show `meetstream ✓ connected`.

#### Cursor / Windsurf

Add to `~/.cursor/mcp.json` (or the Windsurf equivalent):

```json
{
  "mcpServers": {
    "meetstream": {
      "command": "npx",
      "args": ["-y", "@meetstream/mcp"],
      "env": { "MEETSTREAM_API_KEY": "YOUR_API_KEY" }
    }
  }
}
```

Or point a URL-based connector at `https://mcp.meetstream.ai/mcp?key=YOUR_API_KEY`.

#### Any MCP client

* **Remote:** `POST https://mcp.meetstream.ai/mcp` with your key as `Authorization: Token <key>`, `X-MeetStream-Api-Key: <key>`, or a `?key=<key>` query parameter. It speaks the MCP Streamable HTTP transport (stateless).
* **Local:** run `npx -y @meetstream/mcp` as a stdio server with `MEETSTREAM_API_KEY` set in the environment.

### Verify it's connected

Ask your assistant: *"Using meetstream, list my bots."* If it returns your bots (or a clean empty list) instead of an error, auth is working. A missing/invalid key surfaces as a clear tool error, not a silent failure.

## Tools

The server exposes 19 tools grouped by function:

#### Bot lifecycle (7)

| Tool              | What it does                                                                                                                                                                                           |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `create_bot`      | Send (or schedule with `join_at`) a bot to a Zoom / Google Meet / Microsoft Teams meeting. Configurable transcription provider, callbacks, per-participant streams, MIA agent, retention, idempotency. |
| `list_bots`       | List every bot on the account (paginated).                                                                                                                                                             |
| `get_bot_status`  | Current status: `Joining`, `InWaitingRoom`, `InMeeting`, `Recording`, `Leaving`, `Stopped`, `NotAllowed`, `Denied`, `Error`, `Done`.                                                                   |
| `get_bot_detail`  | Full session metadata, including the canonical `transcript_id`.                                                                                                                                        |
| `get_bot_summary` | MeetStream's built-in AI meeting summary.                                                                                                                                                              |
| `remove_bot`      | Make the bot leave an active meeting (data is kept).                                                                                                                                                   |
| `delete_bot_data` | Permanently delete a bot's audio, video, and transcripts (requires explicit confirmation).                                                                                                             |

#### Transcription (3)

| Tool                  | What it does                                                                                                      |
| --------------------- | ----------------------------------------------------------------------------------------------------------------- |
| `get_transcript`      | Fetch a transcript by `bot_id` — resolves the `transcript_id` automatically. Optional `wait` polling until ready. |
| `list_transcriptions` | All transcription runs for a bot, with presigned download URLs.                                                   |
| `transcribe_audio`    | (Re-)transcribe a bot's audio with a chosen provider.                                                             |

#### Media & meeting data (4)

| Tool                   | What it does                                                              |
| ---------------------- | ------------------------------------------------------------------------- |
| `get_media_urls`       | Presigned URLs for audio, video, per-participant streams, or screenshots. |
| `get_participants`     | Participants detected in the meeting.                                     |
| `get_chats`            | In-meeting chat messages.                                                 |
| `get_speaker_timeline` | Who spoke and when.                                                       |

#### Live interaction (2)

| Tool                | What it does                                               |
| ------------------- | ---------------------------------------------------------- |
| `send_chat_message` | Post a chat message into the live meeting.                 |
| `send_image`        | Show an image / GIF as the bot's video frame (public URL). |

#### Calendar & reference (3)

| Tool                    | What it does                                                                                                            |
| ----------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| `list_calendar_events`  | Upcoming events from a connected Google Calendar.                                                                       |
| `schedule_calendar_bot` | Schedule or unschedule a bot for a specific calendar event.                                                             |
| `webhook_events_guide`  | Live-verified reference for the webhook event model — have your assistant read this before writing any webhook handler. |

## Notes

* **Stateless & scalable** — the remote server treats every request independently; there's no session to keep alive.
* **Safe defaults** on `create_bot` — sensible `automatic_leave` timeouts are applied so bots never sit in empty meetings.
* **Destructive ops are gated** — `delete_bot_data` requires explicit confirmation.
* **Idempotency** — a retried `create_bot` returns the original bot rather than creating a duplicate.

## Package

The server is open source and published on npm as [`@meetstream/mcp`](https://www.npmjs.com/package/@meetstream/mcp). Prefer a terminal instead of a chat assistant? See the [MeetStream CLI](https://www.npmjs.com/package/@meetstream/cli).