Zoom MCP server
Zoom meetings, cloud recording transcripts, users, and team chat, connected with a Server-to-Server OAuth app.
How it connects
New to MCP? What is an MCP server?
- Runs on
- Statio's runtime
- Connects with
- Credentials you paste in once: Account ID, Client ID, Client Secret
- May connect to
zoom.usapi.zoom.us- Category
- Communication
What it does
This server reads a Zoom account's meetings, cloud recording transcripts, AI Companion summaries, users and Team Chat messages, and it can create, change and delete meetings and send Team Chat messages. It is @kindflow/zoom-mcp-server, an MIT-licensed community package, and Zoom does not maintain it. It signs in with a Server-to-Server OAuth app that you create in your own Zoom account, and Statio runs version 1.0.6 of it with its write tools turned on.
Zoom documents MCP servers of its own behind a gateway at mcp.zoom.us, aimed at AI Companion and custom agents. As of October 2026 that page lists no tools or setup steps, so this guide covers only the package above.
Tools
The package has 14 tools. Ten read, and four write. The write tools only load when ZOOM_MODE is set to readwrite, which Statio's catalog entry sets, so through Statio the server lists all 14 and your grants decide who gets which. None of them set annotations.
| Tool | What it does | Reads or changes |
|---|---|---|
zoom_list_recordings | Cloud recordings for one user in a date range, with the IDs needed to fetch transcripts. | Reads |
zoom_get_meeting_transcript | Downloads a recording's VTT transcript and returns it as text with timestamps and speaker names. Falls back to the AI Companion transcript, then to the meeting summary. | Reads |
zoom_get_meeting_summary | The AI Companion summary of one meeting. Needs AI Companion turned on for the account. | Reads |
zoom_list_meetings | One user's scheduled, live, upcoming or previous meetings. | Reads |
zoom_get_meeting | One meeting's settings, join URL and agenda. | Reads |
zoom_list_past_meeting_participants | Who attended a past meeting, with join and leave times. | Reads |
zoom_list_users | Every user in the account, filtered by active, inactive or pending. | Reads |
zoom_get_user | One user's email, role, timezone and department. | Reads |
zoom_list_channels | One user's Team Chat channels. | Reads |
zoom_list_chat_messages | Messages in a Team Chat channel, with sender and time, for a date range. | Reads |
The four write tools, listed only with ZOOM_MODE=readwrite:
| Tool | What it does | Reads or changes |
|---|---|---|
zoom_create_meeting | Creates an instant or scheduled meeting for a user and returns the join URL. | Changes |
zoom_update_meeting | Changes a meeting's topic, time, duration, agenda or password. | Changes |
zoom_delete_meeting | Deletes a meeting. | Changes |
zoom_send_chat_message | Sends a Team Chat message to a channel or a person, as the user you name. | Changes |
Every tool that takes a userId accepts any user's ID or email address in the account. Nothing in the server ties a call to the person who asked for it.
Set it up
Both setups need a Server-to-Server OAuth app. On the Zoom App Marketplace, open Developers, click the plus sign next to Developer and choose Build an app, then pick Server-to-Server OAuth app. You need permission to view and edit these apps, and admin-level role permissions to add the admin scopes this server uses.
Under Scopes, choose Add Scopes and add only what the agent needs. The package README lists:
cloud_recording:read:adminfor recordings and transcriptsmeeting:read:adminfor meetings and past participantsuser:read:adminfor userschat_channel:read:adminandchat_message:read:adminfor Team Chatmeeting:write:adminto create, change or delete meetings, andchat_message:write:adminto send chat messages. Leave them off the app if no agent should write, and the write tools fail on every call.
The summary tool calls Zoom's meeting summary endpoint, which the README's list doesn't mention. If it fails on scopes, add the one Zoom's API reference names for that endpoint. Activate the app, or Zoom won't issue a token. The App credentials section then shows the Account ID, Client ID and Client Secret. The server swaps them for an access token that lasts an hour and fetches a new one when it expires.
Claude Code, directly:
claude mcp add zoom \
-e ZOOM_ACCOUNT_ID=your-account-id \
-e ZOOM_CLIENT_ID=your-client-id \
-e ZOOM_CLIENT_SECRET=your-client-secret \
-- npx -y @kindflow/zoom-mcp-server@1.0.6Cursor, directly, in ~/.cursor/mcp.json or .cursor/mcp.json:
{
"mcpServers": {
"zoom": {
"command": "npx",
"args": ["-y", "@kindflow/zoom-mcp-server@1.0.6"],
"env": {
"ZOOM_ACCOUNT_ID": "${env:ZOOM_ACCOUNT_ID}",
"ZOOM_CLIENT_ID": "${env:ZOOM_CLIENT_ID}",
"ZOOM_CLIENT_SECRET": "${env:ZOOM_CLIENT_SECRET}"
}
}
}
}Add -e ZOOM_MODE=readwrite, or "ZOOM_MODE": "readwrite" in the env block, to load the four write tools. Leave it out to stay read-only. Any other value does the same.
The client tutorials, How to add MCP servers to Claude Code and How to set up MCP servers in Cursor, explain config scopes and how to keep the secret out of files you commit.
Through Statio: install Zoom from the catalog, paste the Account ID, Client ID and Client Secret under the server's Credentials, and grant tools under Permissions. A new server has no grants, so nobody can call it until you add some. The desktop app then writes your client configs. The manual entry is the local proxy URL with the server name from your dashboard, http://127.0.0.1:7777/zoom/mcp, added in Claude Code with claude mcp add --transport http zoom <url> or as a "url" in Cursor. Tools missing after that? Start a fresh session, then work through How to debug an MCP server that won't connect.
What to hold back
Start with reach. A Server-to-Server OAuth app belongs to the account, not to a person. With the admin scopes above, an agent can list every user and then read any of their recordings, transcripts, meetings and chat channels by passing their email as userId. An agent you set up to summarize your own meetings can read the CEO's one-on-ones just as easily. Nothing in this server narrows that to some users, so the limits are the scopes you add and the tools you grant.
zoom_get_meeting_transcript and zoom_get_meeting_summary are the most sensitive tools here. A transcript is everything said in the meeting, with speaker names, including the parts people assumed stayed in the room: hiring decisions, customer complaints, someone's medical leave. Once the agent reads it, it can end up in a summary, a ticket or another tool's input. Leave out cloud_recording:read:admin unless the agent's job is transcripts.
zoom_list_chat_messages is the same problem for Team Chat, and zoom_list_users and zoom_get_user hand over the company directory with roles and departments. An agent that only needs to find a meeting time needs neither.
Transcripts and chat messages are also text written by other people, including guests from outside your company. Anyone in a meeting can say something aimed at an AI that will read the transcript later. An agent that holds these reads next to write tools on another server, such as email or a ticketing system, is the setup where that becomes an action.
The four write tools act for any user you name. zoom_send_chat_message posts in someone else's name, and zoom_delete_meeting deletes a meeting other people may be planning to join. Grant them to an agent that books meetings for one person, and not to one that reads transcripts.
With Statio you grant each tool separately, so a scheduling agent can have zoom_list_meetings, zoom_get_meeting and zoom_create_meeting while a transcript agent gets the recording reads and no writes. MCP permissions covers how grants and denies combine.
Questions
mcp.zoom.us, aimed at AI Companion and custom agents. The server on this page is a community package, @kindflow/zoom-mcp-server, which signs in with your own Server-to-Server OAuth app.ZOOM_MODE=readwrite, which Statio sets, it adds create, update and delete tools for meetings and a tool that sends Team Chat messages. The app also needs the matching write scopes. Run directly without that setting, it only reads.What Statio adds
- You choose which of its tools each agent may call. A tool you hold back is removed from that agent's tool list, and a call to it is refused.
- The credentials stay encrypted in Statio, so they never sit in an agent config file.
- Every call is recorded with the agent that made it, when, how long it took and whether it succeeded.
- The outbound list above is enforced outside the server's container, so it cannot reach any other host.
Lock down your first tool in minutes.
Three MCP servers, one of them hosted, and 10,000 calls a month, free and without a card. If you outgrow it the next plan is $19.
Two steps: create your account, then install the desktop app on each machine that runs an AI client.
- Keys encrypted at rest, never handed to an agent
- Cancel anytime, nothing is deleted
- How Statio handles credentials