Skip to main content
This guide walks you through setting up Zoom MCP Server from scratch. By the end, Claude Desktop will be connected to your Zoom account and you can manage meetings using natural language. The whole process takes about 10 minutes if you already have your Zoom credentials ready.
Before you begin, make sure you have everything listed on the prerequisites page: Node.js 18+, a Zoom Server-to-Server OAuth app with the required scopes, Claude Desktop, and python3.
1

Clone the repository and install dependencies

Clone the project to your local machine and install its Node.js dependencies.
git clone https://github.com/bstef/zoommcp.git
cd zoommcp
npm install
2

Configure your Zoom credentials

Copy the example environment file and fill in your Zoom OAuth credentials.
cp .env.example .env
Open .env in a text editor and set the three required values:
ZOOM_CLIENT_ID="your_zoom_client_id_here"
ZOOM_CLIENT_SECRET="your_zoom_client_secret_here"
ZOOM_ACCOUNT_ID="your_zoom_account_id_here"
You can find these values in your Server-to-Server OAuth app on the Zoom Marketplace. The ZOOM_ACCESS_TOKEN field is populated automatically by the server — you do not need to set it manually.
3

Configure Claude Desktop

Add the Zoom MCP Server entry to your Claude Desktop configuration file.The configuration file is located at:
~/Library/Application Support/Claude/claude_desktop_config.json
Add the following mcpServers block. If the file already contains other MCP servers, add the "zoom" entry inside the existing mcpServers object.
{
  "mcpServers": {
    "zoom": {
      "command": "node",
      "args": ["/absolute/path/to/zoommcp/launch-mcp.js"]
    }
  }
}
The path in args must be an absolute path to launch-mcp.js on your machine — for example, /Users/yourname/projects/zoommcp/launch-mcp.js. Claude Desktop does not resolve relative paths or ~ shortcuts. Using launch-mcp.js as the entry point avoids shell execution issues that can occur in Claude’s MCP environment on macOS and iCloud Drive paths.
Restart Claude Desktop after saving the config file so it picks up the new server entry.
4

Make scripts executable and start the server

Before running for the first time, make all shell scripts executable:
chmod +x *.sh
Then start the server:
./run.sh
You should see the startup banner followed by confirmation that the server is running:
╔════════════════════════════════════════════════════════════════════╗
║                      ZOOM MCP SERVER                               ║
║               Connect Claude with Your Zoom Meetings               ║
╚════════════════════════════════════════════════════════════════════╝

🚀 Starting Zoom MCP Server...
✅ Claude Desktop is running
✅ Zoom token is still valid. No refresh needed.
🚀 Starting Zoom MCP server...
✅ Zoom MCP Server is running on stdio
🔄 Token monitoring active - updates every 60 seconds
🔑 Token Status: ✅ Expires in 57m 29s (at 1:51:23 PM)
The server is now running and listening for requests from Claude Desktop over stdio.
5

Test the connection in Claude

Open Claude Desktop and type a natural language request about your Zoom account:
“Show me my upcoming Zoom meetings”
Claude will call the list_meetings tool and return your meeting list. If you see meeting data in the response, everything is working correctly.
Try a few more requests to confirm the full range of tools is working: “List all active users in my Zoom account” or “Get the details for Zoom meeting ID 123456789”.

Run options

./run.sh accepts a couple of flags for different startup scenarios:
FlagBehavior
(none)Start normally — refreshes token only if expired
-f / --forceForce a new token fetch before starting, even if the current token is still valid
-h / --helpShow help message

What happens while the server runs

Once started, the server monitors your Zoom access token in the background every 60 seconds. When the token is within 5 minutes of expiring, it automatically fetches a new token, updates your Claude Desktop config, and restarts Claude — all without any action on your part. Watch the terminal for status messages if you want to track token health.