Zoom Phone + Virtual Agent MCP Server
Exposes Zoom Phone call data and Zoom Virtual Agent knowledge-base/engagement data as tools for AI clients, authenticated via server-to-server OAuth.
README
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.
2. Configure credentials
cp .env.example .env
# fill in ZOOM_ACCOUNT_ID, ZOOM_CLIENT_ID, ZOOM_CLIENT_SECRET
The 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 build
4. 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=xxx
Claude 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 |
|---|---|
phone_get_account_call_history |
Account-wide call history, by date range |
phone_get_account_call_logs |
Account-wide call logs, by date range |
phone_get_call_log_details |
Single call log detail |
phone_get_call_element |
Single call leg/segment detail |
phone_get_user_call_history |
One user's call history |
phone_get_user_call_logs |
One user's call logs |
phone_get_user_call_handling_settings |
Read business/closed/holiday hour routing for a user |
phone_update_user_call_handling_setting |
Write — update a user's call routing config |
phone_get_auto_receptionist_call_handling_settings |
Read routing for an auto receptionist (IVR) |
phone_update_auto_receptionist_call_handling_setting |
Write — update auto receptionist routing config |
Zoom Virtual Agent
| Tool | Purpose |
|---|---|
va_get_articles |
List KB articles |
va_get_article |
Get one KB article |
va_create_article |
Write — create a KB article |
va_update_article |
Write — update a KB article |
va_sync_knowledge_base |
Write — trigger an external KB sync job |
va_get_sync_status |
Poll a sync job's status |
va_get_engagements |
Bot conversation session report |
va_get_query_details |
Query-level detail (what was asked, answered or not) |
va_get_transcripts |
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 tools
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.