Announcing CIMD support for MCP Client registration
Learn more

Zoom MCP vs Zoom API for AI Agents (2026)

Nishant Choudhary
Tech Evangelist

TL;DR

  • Zoom ships seven remote MCP servers, not one. Each has its own endpoint, its own granular scope set, and its own registry entry. An agent spanning meetings, chat, and docs registers against three of them.
  • No Zoom MCP server exposes a meeting create, update, or delete tool. The dedicated Meetings MCP server has four read-oriented tools, and Zoom's own guidance routes meeting CRUD to REST. Any scheduling agent is a REST agent.
  • Zoom MCP requires user-level OAuth with manual client registration. Dynamic Client Registration and Client ID Metadata Documents are both unsupported, and PKCE is required on the exchange because Zoom runs OAuth 2.0 while MCP mandates 2.1.
  • Zoom access tokens live one hour, refresh tokens live 90 days and are single-use, and the latest refresh token must always be used for the next request. A lost refresh response permanently disconnects that user on either path.
  • Scalekit's Zoom connector handles the per-user OAuth flow, vaulted token storage, and rotating-refresh handling for both paths, so the MCP versus API decision does not change your credential infrastructure.

Your agent needs to schedule a meeting, pull the transcript afterward, and post the recap to Team Chat. Zoom now ships remote MCP servers alongside the REST API your backend has been calling for years. The obvious move is to reach for MCP and stop thinking about it. That instinct breaks on the first requirement: no Zoom MCP server exposes a tool that creates a meeting. Here is the decision framework, grounded in what Zoom actually publishes.

What Zoom MCP and the Zoom API actually are

These are not two versions of the same thing. One is a set of hosted, LLM-shaped retrieval surfaces layered on top of Zoom Workplace. The other is the full platform control plane. Understanding which is which decides most of the architecture for you.

Zoom's remote MCP servers

Zoom hosts its MCP servers over streamable HTTP and publishes them to the Model Context Protocol registry under the io.github.zoom namespace. There is no single "Zoom MCP server"; there are seven, split by product area, each with a distinct URL and a distinct scope set.

Connection requires a General app created on the Zoom App Marketplace, a user OAuth authorization code exchange, and a bearer token on every request. Full details live in Zoom's MCP documentation and the Zoom MCP Server reference.

The Zoom REST API

The REST API exposes more than 600 endpoints at https://api.zoom.us/v2, covering meetings, webinars, users, cloud recordings, reports, Team Chat, Zoom Phone, Zoom Rooms, and Contact Center. Regional base URLs such as https://api-eu.zoom.us/v2 exist for data residency, and the api_url field in the OAuth token response tells you which region a user belongs to.

Auth supports user OAuth with authorization code, PKCE, device code, and Server-to-Server OAuth using the account_credentials grant. The Marketplace JWT app type is deprecated; this does not affect JWT signatures used by the Video SDK. The full surface is documented in the Zoom API Hub.

The tool surface, from the official source

Most MCP comparison writing guesses at the tool list. That is the one thing you cannot guess, because the entire capability argument collapses if the inventory is wrong. Everything in this section is transcribed from Zoom's published registry metadata and its own tool documentation, verified against tools/list.

Seven servers, seven endpoints

Server
Details
Workspace
/mcp/zoom/streamable — Meetings, Chat, Docs, Hub. 9 tools
Meetings
/mcp/meeting/streamable — Search, recordings, assets. 4 tools
Team Chat
/mcp/chat/streamable — Channels, messages, contacts, files
Docs
/mcp/docs/streamable — Create from Markdown, export
Whiteboard
/mcp/whiteboard/streamable — Board and diagram creation
Tasks
/mcp/tasks/streamable — Create, update, assign, sync
Revenue Accelerator
/mcp/revenue_accelerator/streamable — Deal intelligence. SSE fallback available on Workspace server at /mcp/zoom/sse. Registry namespace: io.github.zoom

The operational consequence shows up immediately. A recap agent that reads meeting content, reads a Zoom Doc, and posts to a channel is not integrating with "Zoom MCP." It is integrating with three endpoints, each requiring its own scope grant.

What the Workspace server exposes

The Workspace server is the broadest single surface, and it is the one most teams connect first. Nine tools, each mapped to a granular scope.

Tool
Required granular scope
search_meetings
meeting:read:search
search_zoom
ai_companion:read:search
get_meeting_assets
meeting:read:assets
recordings_list
cloud_recording:read:list_user_recordings
get_recording_resource
cloud_recording:read:content
create_new_file_with_markdown
docs:write:import
get_file_content
docs:read:export
hub_create_file_from_content
hub:write:content
hub_get_file_content
hub:read:content

What the Meetings server exposes

The dedicated Meetings server exposes exactly four tools: search_meetings, get_meeting_assets, recordings_list, and get_recording_resource. That is the complete surface.

Read that list again against the name of the server. There is no create_meeting, no update_meeting, and no delete_meeting on any Zoom MCP server, and Zoom's own guidance explicitly routes deterministic meeting CRUD to the REST API. For a product category where "put a meeting on the calendar" is the single most requested agent action, this is the fact that decides your architecture.

Where writes do exist on MCP

The gap is meeting lifecycle specifically, not writes generally, and it would be unfair to leave the impression that Zoom MCP is a read-only surface. Team Chat MCP reads, searches, writes, and updates messages, files, contacts, channels, and channel members. Tasks MCP creates, updates, and assigns. Docs MCP creates documents from Markdown, and Whiteboard MCP creates editable boards and diagrams from prompts.

What Zoom has built is a retrieval and artifact-creation layer. What it has not built is a lifecycle control plane.

Comparing them where it matters for agents

Before the gaps, the thing MCP genuinely does better, because it is not a convenience argument. It is a capability argument, and it does not have a REST workaround.

What your agent can actually do

search_meetings runs AI Companion retrieval rather than a plain metadata filter, so an agent can ask "where did we discuss the Q4 pricing change" and get back ranked meetings with summaries, linked documents, and recording references. search_zoom extends that across Team Chat messages, Zoom Docs, and My Notes in a single call. Neither has a REST equivalent. If you build on REST alone, you are rebuilding semantic retrieval over transcripts yourself.

Everything below is the honest inventory in both directions.

Capability
Zoom MCP
Zoom REST API
Semantic meeting search (AI Companion)
Yes, search_meetings
No equivalent
Cross-product search over chat, docs, notes
Yes, search_zoom
No equivalent
Meeting assets and recap retrieval
Yes, get_meeting_assets
Partial, via separate endpoints
List cloud recordings
Yes, recordings_list
Yes
Retrieve recording content and transcripts
Yes, get_recording_resource
Yes, with bearer auth and redirects
Create, update, or delete a meeting
No
Yes
Webinars and registrant management
No
Yes
Team Chat messaging and channels
Yes, separate server
Yes
Zoom Docs, Whiteboard, Tasks creation
Yes, separate server per product
Yes
User provisioning and SCIM 2.0
No
Yes
Real-time events (webhooks, WebSockets)
No
Yes, 100+ event types
Live media and transcripts (RTMS)
No
Yes, WebSocket, credit-based
Zoom Phone, Rooms, Contact Center
No
Yes

Where the ceiling is

Layer
Description
Zoom MCP
Zoom REST API
Retrieval and recap
Semantic search, transcripts, meeting assets, recordings
Covered
Partial
Artifact creation
Zoom Docs, Whiteboard, Tasks, Team Chat messages
Covered
Covered
Meeting lifecycle
Create, update, delete, end, registrants, webinars
Not available
Covered
Account control plane
User provisioning, SCIM 2.0, Phone, Rooms, Contact Center
Not available
Covered
Events and media plane
Webhooks, WebSockets, Realtime Media Streams
Architecturally out of scope
Covered

Realtime Media Streams is the clearest case, and it is worth being precise about why. RTMS delivers per-participant live audio, video, transcript, chat, and screen share over WebSockets, without a bot appearing in the participant list, driven by meeting.rtms_started and meeting.rtms_stopped webhooks and the meeting:read:meeting_transcripts scope.

MCP is a request and response protocol. RTMS is a media pipeline. No future tool release closes that gap, because it is not a missing feature; it is a different transport class.

The auth path each one puts you on

Both paths are OAuth, which makes them look interchangeable at a glance. They are not. Three specific constraints on the MCP path change what your deployment story looks like.

MCP path — user-level OAuth is the recommended execution path:

  1. Create a General app on the Marketplace — Manual registration only. No DCR. No CIMD.
  2. Add MCP granular scopes — meeting:read:search, ai_companion:read:search, docs:write:import
  3. Authorization code exchange with PKCE — Zoom runs OAuth 2.0; MCP mandates 2.1, so send code_verifier
  4. Bearer token on every MCP request — Authorization header against mcp.zoom.us

Server-to-Server caveat: S2S can initialize and complete tools/list, but Zoom recommends user OAuth for actual tool execution.

REST path — choose your identity model per workload:

  • Option A: User OAuth — Authorization code, PKCE, or device code. Agent inherits exactly what the user can do. Rule: user-level apps must use the me keyword. Correct attribution in Zoom's own audit logs.
  • Option B: Server-to-Server OAuthgrant_type=account_credentials with an account_id. No interactive flow. Correct for headless runs. Rule: S2S apps must not use the me keyword. Tradeoff: every action looks like a service account.
  • Deprecated: The Marketplace JWT app type. This does not affect JWT signatures used by the Video SDK.

Manual registration is the constraint most teams underestimate. Without Dynamic Client Registration or Client ID Metadata Documents, every MCP client you ship is a hand-created Marketplace app, and every Zoom MCP endpoint you touch needs its scopes configured on it.

MCP scopes and REST scopes are separate universes

meeting:read:search is an MCP scope. meeting:read is a REST scope. They are not aliases. Zoom's own documentation is explicit that the MCP scope set differs from the older broad REST scopes.

The consequence is architectural, not cosmetic. A token minted for the MCP surface does not authorize REST calls, and a REST token does not authorize MCP tool calls. The moment your agent reads over MCP and writes over REST — which the meeting CRUD gap forces on most teams — you are managing two authorization surfaces per user, per tenant, with two consent moments and two revocation paths.

MCP scope universe
REST scope universe
meeting:read:search
meeting:read
meeting:read:assets
meeting:write
ai_companion:read:search
recording:read
cloud_recording:read:content
user:read:admin
docs:write:import
chat_message:write
Grants tool calls against mcp.zoom.us. Nothing else.
Grants calls against api.zoom.us/v2. Nothing else.

What you own in production

Zoom manages MCP hosting, tool schemas, and AI Companion retrieval quality. That is real operational relief, and it is the strongest practical argument for the MCP path.

What Zoom does not manage on either path is the credential lifecycle, the account feature prerequisites, or your quota budget. Those three break agents in production far more often than a missing endpoint does.

Feature prerequisites are not scopes

This one deserves its own warning because it fails silently. Semantic meeting search, meeting assets, and recording-content retrieval depend on account features such as Smart Recording and Meeting Summary being enabled. Correct scopes do not substitute for them.

An agent with perfect scopes on an account without those features does not get a 403. It gets a successful response with an empty result set, and the model cheerfully reports that it could not find anything. Verify account features during tenant onboarding, not at first agent run.

The quota math changes with agents

Zoom rate limits are per-account and shared across every app on the account, not per-app. One heavy internal integration can throttle your agent, and your agent can throttle it back.

Plan
Light requests/sec
Medium requests/sec
Heavy requests/sec
Free
4
2
1
Pro
30
20
10
Business and above
80
60
40

Separately, meeting and webinar create and update operations are capped at 100 per day per user, resetting at 00:00 UTC. An agentic scheduling workflow that proposes, corrects, and reschedules consumes that budget several times faster than a deterministic integration issuing one call per action. Monitor X-RateLimit-Remaining from day one, and distribute bulk operations across host users.

The API sharp edges that break agents first

Four gotchas account for most first-week failures on the REST path. The me keyword is mandatory for user-level OAuth apps and forbidden for Server-to-Server apps. Meeting UUIDs beginning with / or containing // must be double URL-encoded. Recording download_url values require bearer auth and may redirect, so follow redirects. Pagination uses next_page_token; page_number is legacy and being phased out.

When to use Zoom MCP

  • Your agent's core job is retrieval and recap, and search_meetings or search_zoom gives you AI Companion semantics you would otherwise rebuild over raw transcripts
  • Your agent's output artifact is a Zoom Doc, a whiteboard, or a task, so create_new_file_with_markdown and the Tasks server do the work directly
  • Your agent is interactive with the user present, so a per-user OAuth consent moment is natural rather than an onboarding obstacle
  • Your workflow lives inside one Zoom product area, so you register against one endpoint instead of three

When to use the Zoom REST API

  • Your agent schedules, reschedules, ends, or cancels meetings, or manages registrants and webinars. There is no MCP path for any of this
  • You need user provisioning, SCIM 2.0, Zoom Phone, Zoom Rooms, or Contact Center
  • You need real-time events through webhooks or WebSockets, or live media and transcripts through RTMS
  • Your agent runs headless on a schedule, where Server-to-Server OAuth is the correct identity model and no user is present to consent
  • You are building a deterministic pipeline where you pin behavior and an unplanned schema change is an incident

The credential problem that exists on both paths

Both paths hand you a token per user. Neither hands you a vault, rotation logic, or a revocation flow. The token type differs; the infrastructure required does not.

With Zoom specifically, the numbers make this sharper than usual.

Zoom's rotating refresh tokens are a specific failure mode

Access tokens expire after one hour. Refresh tokens expire after 90 days. Critically, refresh tokens are single-use and rotate: every refresh returns a new access token and a new refresh token, the previous refresh token is invalidated, and Zoom's documentation states that the latest refresh token must always be used for the next refresh request.

That produces a precise, reproducible way to permanently break a user's connection.

The lost-response failure
What happens
t0
Your service holds refresh_token_n. Access token expires.
t1
POST /oauth/token with token_n. Zoom accepts it.
t2
Zoom invalidates token_n, issues n+1. Rotation is server-side.
t3
Response lost, or your write fails before commit. You still hold token_n.
Result
token_n is dead at Zoom. token_n+1 never reached you. User is permanently disconnected. Only a fresh consent flow recovers it.

Two agent threads refreshing concurrently produce the same outcome. Reactive refresh makes this more likely, not less. Waiting for a 401 means multiple agent threads discover expiry simultaneously and race each other into the rotation window. Refresh must be proactive, driven by expires_in, and serialized with a distributed lock.

The N-credential problem, doubled on hybrid architectures

For 40 users across 8 tenants, that is 40 credentials to encrypt at rest, 40 proactive refresh schedules, and 40 revocations to execute at offboarding. That is the baseline cost of either path.

Because the MCP and REST scope sets are distinct, a hybrid agent that reads over MCP and writes over REST can require two credentials per user rather than one. Eighty stored secrets, eighty rotation schedules, two consent moments per person during onboarding. That is not a Zoom design flaw; it is the consequence of two authorization surfaces on the same platform, and it is yours to operate.

For a deeper look at secure token management for AI agents at scale, including proactive refresh and distributed locking patterns, the linked post covers the full infrastructure model.

Where Scalekit fits

Scalekit's Zoom connector handles the per-user OAuth flow, vaulted token storage, and rotating-refresh handling for both paths, so the MCP versus API decision does not change your credential infrastructure.

Building a Zoom agent with Scalekit

The setup is a one-time configuration per environment. You need a Zoom General app with its client ID and secret, the Scalekit redirect URI pasted into both the Zoom OAuth redirect field and the OAuth allow list, and a connection created in the Scalekit dashboard.

One warning before any code: the connection_name string in your code must match the connection name configured in the Scalekit dashboard exactly. This is the single most common integration error. Full setup steps live in the Zoom connector documentation.

Retrieve the tools authorized for this connected account

Before the code, the important distinction. The agent is not loading a flat catalog of every Zoom tool the connector supports. It is loading the tools that this specific user's connected account is authorized to call, resolved at request time against their Zoom grant.

That distinction is also a cost lever. The Zoom connector ships 28 tools. A scheduling agent needs five. At roughly 200 tokens per tool schema, filtering the surface removes about 4,600 tokens from every context window on every run, before the agent does any work.

import os from scalekit.client import ScalekitClient scalekit_client = ScalekitClient( client_id=os.getenv("SCALEKIT_CLIENT_ID"), client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"), env_url=os.getenv("SCALEKIT_ENV_URL"), ) actions = scalekit_client.actions # connection_name must match the connection configured in the Scalekit dashboard response = actions.get_or_create_connected_account( connection_name="zoom", identifier="user_123", ) if response.connected_account.status != "ACTIVE": link = actions.get_authorization_link( connection_name="zoom", identifier="user_123", ) print("Authorize Zoom:", link.link) input("Press Enter after authorizing...")

Run the agent loop with LangChain

Scalekit returns native LangChain StructuredTool objects, so there is no schema reshaping step between the connector and the model.

from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, ToolMessage tools = actions.langchain.get_tools( identifier="user_123", connection_names=["zoom"], page_size=100, # avoid truncation when a connector exceeds the default page ) tool_map = {t.name: t for t in tools} llm = ChatOpenAI(model="gpt-4o").bind_tools(tools) messages = [ HumanMessage( "Schedule a 30 minute Q4 planning sync tomorrow at 10:00 UTC, " "then list my recordings from last week" ) ] while True: response = llm.invoke(messages) messages.append(response) if not response.tool_calls: print(response.content) break for tc in response.tool_calls: result = tool_map[tc["name"]].invoke(tc["args"]) messages.append(ToolMessage(content=str(result), tool_call_id=tc["id"]))

That agent just created a Zoom meeting, which is the operation no Zoom MCP server exposes. It works because the connector calls the REST API underneath while keeping per-user identity intact. This is the same pattern described in the LangChain tool calling deep dive.

The same pattern in TypeScript with the Claude SDK

Scalekit returns tool schemas with input_schema, the exact shape Anthropic's tool use API expects, so the mapping is a rename rather than a conversion. The toolNames filter is where you enforce least privilege.

import { ScalekitClient } from '@scalekit-sdk/node'; import Anthropic from '@anthropic-ai/sdk'; const scalekit = new ScalekitClient( process.env.SCALEKIT_ENV_URL!, process.env.SCALEKIT_CLIENT_ID!, process.env.SCALEKIT_CLIENT_SECRET!, ); const anthropic = new Anthropic(); const { tools } = await scalekit.tools.listScopedTools('user_123', { filter: { connectionNames: ['zoom'], toolNames: [ 'zoom_meetings_list', 'zoom_meeting_create', 'zoom_meeting_update', 'zoom_recordings_list', 'zoom_chat_message_send', ], }, pageSize: 100, }); const llmTools = tools.map((t) => ({ name: t.tool.definition.name, description: t.tool.definition.description, input_schema: t.tool.definition.input_schema, })); const messages: Anthropic.MessageParam[] = [ { role: 'user', content: "Summarize last week's recordings and post the recap to the #eng channel", }, ]; while (true) { const response = await anthropic.messages.create({ model: 'claude-sonnet-4-6', max_tokens: 1024, tools: llmTools, messages, }); if (response.stop_reason === 'end_turn') { const text = response.content.find((b) => b.type === 'text'); if (text?.type === 'text') console.log(text.text); break; } const toolResults: Anthropic.ToolResultBlockParam[] = []; for (const block of response.content) { if (block.type === 'tool_use') { const result = await scalekit.actions.executeTool({ toolName: block.name, toolInput: block.input as Record, identifier: 'user_123', }); toolResults.push({ type: 'tool_result', tool_use_id: block.id, content: JSON.stringify(result.data), }); } } messages.push({ role: 'assistant', content: response.content }); messages.push({ role: 'user', content: toolResults }); }

Reaching endpoints the tool catalog does not cover

Zoom's REST surface is 600+ endpoints and the connector ships 28 prebuilt tools, so there will be calls you need that no tool wraps. Webinars, reports, and Zoom Phone are the usual ones.

The proxy path calls any Zoom endpoint with the user's token injected server-side. Your agent never sees a credential, and you do not build a second auth integration to reach the long tail.

const response = await scalekit.actions.request({ connectionName: 'zoom', identifier: 'user_123', path: '/v2/users/me/webinars', method: 'GET', queryParams: { page_size: 30 }, }); console.log(response.data);

Why Virtual MCP matters for multi-tool, multi-tenant Zoom agents

Come back to the seven-endpoint problem, because this is where it gets expensive. A recap agent that searches meetings, reads a Zoom Doc, and posts to a channel touches three Zoom MCP endpoints. Three registrations, three granular scope sets, three consent surfaces, with no DCR or CIMD to automate any of it. Multiply by every tenant you onboard.

Virtual MCP servers collapse that into one endpoint you define once.

Without Virtual MCP

Component
What you operate
Meetings /mcp/meeting
4 scopes, separate Marketplace registration
Docs /mcp/docs
2 scopes, separate Marketplace registration
Team Chat /mcp/chat
Separate scope set, separate Marketplace registration
Total burden
3 hand-created Marketplace registrations, 3 scope sets to keep in sync per tenant, full tool surface exposed on every server, per-user tokens managed by you per endpoint

With Virtual MCP

Component
What you operate
Recap agent
One static mcp_server_url plus a short-lived per-user session token
Credential handling
Scalekit resolves the user credential server-side, never in the agent runtime
Total burden
1 server definition created once per agent role, explicit tool allowlist, static endpoint, identity resolved per session

You create the server once per agent role, not once per user, declaring which connections and which specific tools are exposed. The response gives you a config_id and a static mcp_server_url you reuse for every user and every session.

import os from scalekit import ScalekitClient from scalekit.actions.models.mcp_config import McpConfigConnectionToolMapping scalekit_client = ScalekitClient( env_url=os.environ["SCALEKIT_ENV_URL"], client_id=os.environ["SCALEKIT_CLIENT_ID"], client_secret=os.environ["SCALEKIT_CLIENT_SECRET"], ) vmcp_response = scalekit_client.actions.mcp.create_config( name="zoom-meeting-agent", connection_tool_mappings=[ McpConfigConnectionToolMapping( connection_name="zoom", tools=[ "zoom_meetings_list", "zoom_meeting_create", "zoom_meeting_update", "zoom_recordings_list", "zoom_chat_message_send", ], ), ], ) config_id = vmcp_response.config.id mcp_server_url = vmcp_response.config.mcp_server_url

Per-user isolation through session tokens

Before each run, confirm the user's connections are still active, then mint a short-lived token bound to that user. OAuth grants can be revoked at any moment, so checking first is what turns a mid-task failure into a clean re-auth prompt.

from datetime import timedelta accounts_response = scalekit_client.actions.mcp.list_mcp_connected_accounts( config_id=config_id, identifier="user_123", include_auth_link=True, ) for account in accounts_response.connected_accounts: if account.connected_account_status != "ACTIVE": print(f"{account.connection_name} needs auth: {account.authentication_link}") token_response = scalekit_client.actions.mcp.create_session_token( mcp_config_id=config_id, identifier="user_123", expiry=timedelta(minutes=30), ) mcp_server = { "url": mcp_server_url, "headers": {"Authorization": f"Bearer {token_response.token}"}, }

Least privilege at the tool level

Zoom's Team Chat MCP server exposes write and update tools for messages, channels, and channel members. A recap agent needs to send one message. Point it at the full server and it also holds channel deletion and member removal it will never legitimately use.

The agent sees only the tools you explicitly allow, not everything the connector exposes. One server definition serves all users, and each run gets a short-lived session token scoped to that user's connected accounts. Setup happens once per agent role; runtime is a token mint.

Observability for downstream Zoom tool calls

The audit question a Zoom deployment eventually gets is not "did the agent work." It is "whose authorization was used to pull that recording, and who approved it." That question has a bad answer if your agent runs on a shared Server-to-Server credential.

Understanding agent tool observability is key to answering that question confidently in production.

Every call attributed to the authorizing user

Model
What Zoom sees / what you can answer
Shared Server-to-Server credential
Every action shows actor: svc_agent_bot. "Who authorized this recording access?" is unanswerable from the logs. Scope is the union of every user; blast radius is account-wide.
Per-user connected accounts
Credential resolved per call, tied to a real person. Every call carries an executionId. 90 days of history, exportable to your SIEM. Scope is whatever that one user authorized, and nothing more.

A shared credential makes every recording fetch and every deleted meeting look identical, both in your logs and in Zoom's own account audit trail. Per-user connected accounts mean each call is attributed to the human whose grant permitted it, with 90 days of retained history you can export. This is the same principle behind audit trails for agent auth in B2B SaaS.

Correlating a tool call back to a Zoom-side action

executeTool returns an executionId alongside the tool output. Carry it into your own structured logs, keyed to the agent run and the triggering user.

When a Zoom-side incident surfaces later — a recording accessed or a meeting deleted — that identifier is what connects the action to the authorization event that permitted it. Without it, you are reconstructing intent from timestamps.

Which one to build against

If your Zoom agent retrieves and recaps, build on the MCP servers. search_meetings and search_zoom give you AI Companion semantics that REST cannot reproduce, and Docs, Whiteboard, and Tasks writes are already there.

If your agent schedules, provisions, reacts to events, or touches live media, build against the REST API. Meeting CRUD, webhooks, and RTMS have no MCP path, and none is coming, because the constraint is architectural rather than a missing tool.

Most production Zoom agents will use both, which means two scope universes and two token surfaces per user. The credential management problem is identical either way, and it is the part that needs production-grade infrastructure regardless of which path you are on. The broader patterns that apply here are covered in agent tool calling auth production problems, patterns, and anti-patterns.

Get started

Browse the Scalekit Zoom connector or read the Zoom connector docs.

Building a Zoom agent and want a second pair of eyes on the auth model? Join the Scalekit Slack community, or talk to us for immediate help.

No items found.
Agent
Auth Quickstart
On this page
Share this article
Agent
Auth Quickstart

Acquire enterprise customers with
zero upfront cost.

Every feature unlocked. No hidden fees.