Zoom Phone + Virtual Agent MCP Server
Provides tools for managing Zoom Phone call history, logs, and call handling settings, as well as Zoom Virtual Agent knowledge base articles, engagements, and transcripts.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Zoom Phone + Virtual Agent MCP ServerGet call logs for extension 1001 from last 7 days"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Zoom Phone + Virtual Agent MCP Server
A custom MCP server exposing Zoom Phone call data and Zoom Virtual Agent knowledge-base/engagement data as tools for an AI client (Claude Code, Claude Desktop, etc). Authenticates with Server-to-Server (Account) OAuth — no end-user login flow, no browser redirect. The server acts as your Zoom account directly.
1. Create the Marketplace app (one-time)
Go to https://marketplace.zoom.us/ → Develop → Build App.
Choose Server-to-Server OAuth.
Note the Account ID, Client ID, and Client Secret shown after creation.
Under Scopes, add (granular scopes):
phone:read:call_history:adminphone:read:call_log:adminphone:read:call_historyphone:read:call_logphone:read:list_call_handling_settings:adminphone:update:call_handling_settings:adminkm:read:list_articles:admin(or the current KM read scope shown in the app's scope picker)km:write:article:adminkm:write:sync:adminvirtual_agent:read:list_engagements:adminvirtual_agent:read:list_transcripts:admin
Scope names occasionally get renamed by Zoom — use the scope picker in your app as the source of truth; add only what the tools you actually plan to call require.
Activate the app.
Related MCP server: Zoom MCP Server
2. Configure credentials
cp .env.example .env
# fill in ZOOM_ACCOUNT_ID, ZOOM_CLIENT_ID, ZOOM_CLIENT_SECRETThe server reads these from process.env — either export them in your shell, use a .env
loader of your choice, or (recommended) pass them via your MCP client's config as shown below,
so the secret never lives in a file you might commit.
3. Build
npm install
npm run build4. Register with an MCP client
Claude Code:
claude mcp add zoom-phone-va \
--command node \
--args dist/index.js \
--env ZOOM_ACCOUNT_ID=xxx \
--env ZOOM_CLIENT_ID=xxx \
--env ZOOM_CLIENT_SECRET=xxxClaude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"zoom-phone-va": {
"command": "node",
"args": ["/absolute/path/to/zoom-mcp-server/dist/index.js"],
"env": {
"ZOOM_ACCOUNT_ID": "xxx",
"ZOOM_CLIENT_ID": "xxx",
"ZOOM_CLIENT_SECRET": "xxx"
}
}
}
}Tools exposed
Zoom Phone
Tool | Purpose |
| Account-wide call history, by date range |
| Account-wide call logs, by date range |
| Single call log detail |
| Single call leg/segment detail |
| One user's call history |
| One user's call logs |
| Read business/closed/holiday hour routing for a user |
| Write — update a user's call routing config |
| Read routing for an auto receptionist (IVR) |
| Write — update auto receptionist routing config |
Zoom Virtual Agent
Tool | Purpose |
| List KB articles |
| Get one KB article |
| Write — create a KB article |
| Write — update a KB article |
| Write — trigger an external KB sync job |
| Poll a sync job's status |
| Bot conversation session report |
| Query-level detail (what was asked, answered or not) |
| Full conversation transcripts |
Notes on the auth model
S2S access tokens expire after 1 hour;
src/zoomAuth.tscaches the token in memory and transparently refreshes ~60s before expiry. There is no refresh token in this flow — a new token is simply requested.All API calls run with the account's permissions — every tool call can see data across the whole account (subject to granted scopes), not just one user's. Scope your Marketplace app's granted scopes to only what you intend these tools to do.
This flow is appropriate for backend automation on your own account. If you later need this server to act on behalf of other Zoom accounts/users, that requires switching to User OAuth (authorization code + refresh tokens) instead — a materially different auth model, not a drop-in swap.
Project layout
src/
index.ts # MCP server entry (stdio transport), registers all tools
zoomAuth.ts # S2S token fetch + in-memory cache/refresh
zoomClient.ts # Thin authenticated fetch wrapper for api.zoom.us/v2
tools/
phone.ts # Zoom Phone tools
virtualAgent.ts # Zoom Virtual Agent toolsThis server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Justin-Gladiator/zoom-phone-va-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server