MCP server for Zoom - access meeting transcripts and AI summaries from Claude.
- List meetings - Browse your recent Zoom meetings
- Get transcripts - Full verbatim transcripts from recorded meetings
- Get AI summaries - AI Companion meeting summaries with action items
- Search - Find meetings by keywords
- Admin queries - Admins can query any user's meetings (with proxy)
Works with any organization. Just needs a Zoom OAuth app.
- Zoom Pro, Business, or Enterprise account
- Cloud recording OR AI Companion enabled for meetings
Add to Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"zoom": {
"command": "npx",
"args": ["-y", "@sweatco/zoom-mcp"]
}
}
}Note: Requires Node.js 18+. If Claude Desktop can't find
npx, use the full path (runwhich npxto find it).
- Restart Claude after adding the config
- Ask Claude about your Zoom meetings
- Browser opens for one-time Zoom authorization
- Done! No re-authorization needed.
The basic setup uses Zoom's standard API, which has some limitations:
| Limitation | Impact |
|---|---|
| Only hosted meetings | You can only access meetings you hosted, not meetings you attended |
| 6-month history | Report API only returns meetings from the last 6 months |
| No cross-user queries | Cannot query another user's meetings, even as admin |
| Rate limits | ~10 requests/second |
To overcome these limitations, set up the Organization Proxy.
The proxy removes API limitations by indexing meeting participation in your own infrastructure (Google Cloud). Benefits:
| Feature | Without Proxy | With Proxy |
|---|---|---|
| Meetings you hosted | ✅ | ✅ |
| Meetings you attended | ❌ | ✅ |
| Historical data | 6 months | Unlimited (with backfill) |
| Admin: query any user | ❌ | ✅ |
| Admin: org-wide search | ❌ | ✅ |
- Webhook captures
meeting.endedevents and indexes all participants - Firestore stores participant records in your GCP project
- Proxy API verifies user identity and returns authorized meetings
- Backfill script imports historical data
All data stays in your organization's infrastructure.
With the proxy, Zoom Owners and Admins (role_id 0 or 1) can:
- Query any user's meetings:
list_meetingswithuser_emailparameter - Access any meeting's transcript/summary: No participation check required
- Audit access: All queries logged in Cloud Functions
Example: As admin, ask Claude "Show me meetings for user@company.com last week"
See the full Proxy Setup Guide for step-by-step instructions.
Quick overview:
- Create GCP project with Firestore
- Create Zoom Server-to-Server OAuth app with admin scopes
- Configure
meeting.endedwebhook - Deploy Cloud Functions (webhook handler, proxy API, cleanup job)
- Run backfill script for historical data
- Add
ZOOM_PROXY_URLto MCP client config
{
"mcpServers": {
"zoom": {
"command": "npx",
"args": ["-y", "@sweatco/zoom-mcp"],
"env": {
"ZOOM_PROXY_URL": "https://REGION-PROJECT.cloudfunctions.net/zoom-proxy-api"
}
}
}
}If you deployed your own OAuth function, also set ZOOM_CLIENT_ID and ZOOM_OAUTH_URL.
| Tool | Description |
|---|---|
list_meetings |
List recent meetings with transcript/summary availability |
get_transcript |
Get full meeting transcript |
get_summary |
Get AI Companion meeting summary |
get_meeting |
Get meeting details and participants |
search_meetings |
Search meetings by keywords |
With proxy configured:
list_meetings:
user_email: "user@company.com" # Query another user's meetings (admin only)
Basic:
- "Show me my Zoom meetings from last week"
- "Get the transcript from my meeting with John yesterday"
- "What were the action items from yesterday's standup?"
- "Summarize my meeting from this morning"
Admin (with proxy):
- "Show me meetings for katie@company.com last week"
- "Get the summary of the all-hands meeting"
- "What did the product team discuss in their sync?"
The MCP automatically finds the best available transcript:
| Source | When Available |
|---|---|
| Cloud Recording VTT | Meeting was cloud recorded with "Audio transcript" enabled |
| AI Companion Summary | AI Companion was enabled (recording not required) |
"No meetings found"
- Check that you have cloud recordings or AI Companion enabled
- Verify your Zoom account is Pro/Business/Enterprise
- Without proxy: you can only see meetings you hosted
"Authorization required" keeps appearing
- Run
npx @sweatco/zoom-mcp --logoutand re-authorize - Check your Zoom account permissions
"No transcript available"
- The meeting may not have been recorded
- AI Companion may not have been enabled
- Transcript may still be processing (wait ~2x meeting duration)
"Admin access required"
- Only Zoom Owners (role_id=0) and Admins (role_id=1) can query other users
- Requires proxy to be configured
Basic setup:
- Credentials stored in your OS keychain (or
~/.config/zoom-mcp/) - Data flows only between your machine and Zoom's API
With proxy:
- Meeting participant data stored in your organization's GCP Firestore
- All data stays within your infrastructure
- Monthly cleanup job removes records older than 1 year
Revoke access anytime: Zoom App Marketplace
# Install dependencies
npm install
# Build
npm run build
# Test locally
npx .
# Test with MCP Inspector
npx @modelcontextprotocol/inspector node dist/index.js
# Clear stored tokens
npx . --logoutcd cloud-functions
npm install
npm run build
# Set required env vars before deploying (only if deploying your own)
export ZOOM_CLIENT_ID=your-user-oauth-client-id # For OAuth function (optional)
export ZOOM_ADMIN_ACCOUNT_ID=your-admin-account-id # For proxy functions
export ZOOM_ADMIN_CLIENT_ID=your-admin-client-id # For proxy functions
npm run deploy:oauth # Deploy OAuth function (optional - can use hosted)
npm run deploy:webhook # Deploy webhook handler
npm run deploy:api # Deploy proxy API
npm run deploy:cleanup # Deploy cleanup job# Backfill historical data
npx tsx scripts/backfill.ts --from=2025-08-01 --to=2025-08-31
# Debug: check user meetings from Zoom API
npx tsx scripts/check-user-meetings.ts user@company.com
# Debug: check Firestore records
npx tsx scripts/check-firestore.ts user@company.comMIT