Announcing CIMD support for MCP Client registration
Learn more

Zapier MCP vs Zapier API for AI Agents (2026)

Saif Ali Shaik
Founding Developer Advocate

TL;DR

  • Zapier MCP exposes a fixed surface of 15 static meta-tools rather than one tool per app. The agent searches, enables, and executes actions at runtime through discover_zapier_actions, enable_zapier_action, execute_zapier_read_action, and execute_zapier_write_action. Tool count stays constant whether you connect two apps or two hundred.
  • Zapier MCP supports non-interactive credentials. A connection token or API key works as a Bearer token against https://mcp.zapier.com/api/v1/connect, so headless agents are not blocked the way they are on Notion or Salesforce MCP.
  • The real constraint is identity, not headlessness. Auto-provisioning covers only the authorizing user's own Zapier connections, app connections cannot be shared between Zapier users, and server access sharing explicitly does not let one user run tools on another's behalf. One Zapier account equals one agent identity.
  • Everything event-driven, asynchronous, or governed lives in the APIs. The Trigger Inbox API is the only path to app events, and the Actions API is the only path to idempotent async execution with callbacks. Neither is exposed as an MCP tool.
  • Cost is an architectural constraint, not a billing footnote. Every successful MCP tool call consumes two Zapier tasks from the shared account allowance, and when that allowance runs out every agent on the account stops.
  • Scalekit's Zapier MCP connector handles the OAuth flow, per-user token storage, and rotation, so the MCP versus API decision does not change your credential infrastructure.

Your agent needs to act across the apps your customers already use. Zapier ships two ways to get there: a hosted MCP server at mcp.zapier.com and a set of public APIs at api.zapier.com plus a TypeScript SDK. Unlike most tools in this series, the capability gap here is not the interesting part; Zapier MCP is headless-capable and covers most of what an agent needs to run actions. The interesting part is identity. Everything Zapier exposes is scoped to a Zapier user account, and that single fact reshapes how a multi-tenant B2B agent has to be built.

What Zapier MCP and the Zapier APIs actually are

These are two different shapes of the same underlying integration layer. One presents it as a self-navigating tool surface; the other presents it as endpoints you call explicitly.

Zapier MCP

Zapier MCP is a hosted Streamable HTTP server that fronts Zapier's integration catalog. Zapier's MCP quickstart puts that catalog at 9,000+ apps and 40,000+ actions. It shipped in 2025 and is now generally available on all Zapier plans, enabled by default at the account level, and covered by Zapier's SOC 2 Type II certification.

Three authentication methods are documented: a client-specific server URL backed by OAuth, a connection token for unlisted clients, and an API key for SDK integrations. Tokens and keys are passed as Authorization: Bearer <token> against https://mcp.zapier.com/api/v1/connect.

Official docs: Zapier MCP documentation and the Zapier MCP product page.

The meta-tool model

Most MCP servers expose one tool per capability. Zapier does not, because a per-action surface across 40,000 actions is unusable. Instead the server exposes 15 static meta-tools across action management, execution, configuration, Skills, and feedback.

In the default dynamic discovery mode, auto_provision_mcp runs on OAuth connect and provisions tools from the apps the user already connected in Zapier. The agent then expands its own reach at runtime. A manual configuration mode exists for teams that need a fixed, pre-declared toolset instead.

Zapier's API surfaces

There is no single "Zapier API." There are four surfaces an agent builder needs to distinguish, and picking the wrong one is the most common architectural mistake on this path.

The Actions API at https://api.zapier.com/actions/v1/ creates and runs stored actions against a connection_id. The Trigger Inbox API delivers app events through an SQS-style pull queue. The Workflow API creates and manages Zaps programmatically for embedded experiences. The Zapier SDK, a TypeScript package, wraps action execution with runAction, connection lookup, and a fetch escape hatch for arbitrary authenticated calls.

Auth across the public APIs is OAuth 2.0 with both authorizationCode and clientCredentials flows, scope external, token endpoint https://zapier.com/oauth/token.

Official docs: Zapier API reference and the Zapier SDK.

Comparing them where it matters for agents

Four dimensions decide this: what the agent can do, what credential model each path forces, what breaks in production, and which workloads each one actually fits.

What your agent can actually do

The MCP server owns the interactive execution loop. The APIs own everything asynchronous, event-driven, and programmatically governed.

Capability
Zapier MCP
Zapier APIs and SDK
Run a write action in a connected app
Yes, execute_zapier_write_action
Yes, Actions API and SDK runAction
Run a read or search action
Yes, execute_zapier_read_action
Yes
Discover apps and actions at runtime
Yes, discover_zapier_actions
Yes, listApps and listActions
Mutate the agent's own tool surface at runtime
Yes, enable_zapier_action
Not applicable
Provision from the user's existing connections
Yes, auto_provision_mcp
Not applicable
Reusable multi-step workflow definitions
Yes, Zapier Skills
No
Subscribe to app events
No
Yes, Trigger Inbox API
Async execution with idempotency and callbacks
No
Yes, Actions API
Paged bulk reads with cursor state
Not exposed on the meta-tool surface
Yes, read_bulk with next_page
Arbitrary authenticated calls to an app's own API
No
Yes, SDK fetch
Create and manage Zaps programmatically
No
Yes, Workflow API
Non-interactive server credentials
Yes, connection token or API key
Yes, client credentials and JWT

Where the MCP ceiling actually is

The gap is not breadth of apps; both paths reach the same catalog. The gap is execution semantics.

The Actions API runs asynchronously: you POST to /stored-actions/{id}/run, get a 202 with a run ID, and poll /runs/{run_id} or receive a callback_url POST. It accepts an idempotency_id that deduplicates identical requests within 72 hours, and results are retained for seven days. None of that exists on the MCP surface. For a nightly pipeline that must not double-post to Slack after a retry, the idempotency key alone decides the path.

The second gap is events. The Trigger Inbox API is the only way to consume app events, and it is architecturally a queue, not a tool call.

The auth path each one puts you on

Zapier MCP is the rare hosted MCP server that does not force interactive OAuth. Static credentials work, which means a background agent can authenticate without a browser. That removes the blocker that defines the Notion and Salesforce comparisons in this series.

What it does not remove is the identity ceiling. A connection token authorizes a server that belongs to one Zapier user. The Zapier SDK's client credentials, per Zapier's deployment guide, "act on behalf of the Zapier user who created them." Both paths converge on the same thing: the credential your agent holds is a Zapier user identity, not a tenant identity.

Why that breaks multi-tenant agents

Zapier's security and governance documentation is explicit about the boundaries. Auto-provisioning covers the authorizing user's own connections only; apps shared by another Zapier user are excluded. App connections cannot be shared at all. Server access sharing lets a colleague view or manage tools, but it does not let them connect a client or run tools on another user's behalf.

For a B2B agent serving 40 users across 8 customer orgs, that means 40 separate Zapier accounts, 40 server configurations, and 40 credentials. Zapier's MCP Embed narrows this by issuing a per-user server URL, but authentication still runs on a single shared embed secret. Isolation becomes a property of a URL you stored correctly, not of a credential.

The two-layer credential problem

There is a second credential layer most teams miss until an audit. Your agent holds a Zapier credential. Zapier separately holds the OAuth grant to Slack, HubSpot, or Gmail.

Revoking the Zapier token does not revoke the downstream Slack grant. Revoking the Slack grant inside Slack does not invalidate the Zapier token; the next tool call simply fails at the far end. When a customer offboards an employee, you need both layers torn down, and no single Zapier surface does both for you. This is a core challenge in credential ownership across agent tool-calling patterns.

What you own in production

Zapier manages the server, the tool schemas, and every downstream app credential. That is a genuine operational win: you are not writing an OAuth client per app, and Zapier absorbs upstream API changes.

What you still own is more than it looks. Every successful MCP tool call consumes two Zapier tasks from the account's shared allowance. Failed calls are free. Batches multiply: Zapier's own example puts "search and update 10 records" at 11 tool calls and 22 tasks. When the allowance is exhausted, MCP tool calls stop working account-wide until reset or upgrade.

Cost as a blast radius

That shared allowance is a cross-tenant coupling most teams do not model. One agent looping on a retry burns tasks that every other agent on the same Zapier account depends on. The failure is not isolated to the caller; it is account-wide, and it presents as tool calls that suddenly stop.

Governance has a similar shape. App and action restrictions cannot be scoped to MCP alone; any restriction you set applies across all Zapier features for the whole account. And the SDK's fetch method makes authenticated calls that Zapier documents as not currently subject to those org restriction policies.

Determinism and observability

Dynamic discovery is a feature for assistants and a liability for pipelines. An agent that can call enable_zapier_action mid-run can change its own tool surface between executions, which means the same prompt can produce different capabilities on Tuesday than it did on Monday. Manual configuration mode is the fix, and it should be the default for anything scheduled.

Observability is the other split. MCP tool calls are logged in Zapier's History tab and the account audit log, attributed to the Zapier user. If your agent runs on one service account, every action in that log resolves to the same identity, and correlating a Zapier action back to the customer who triggered it becomes an exercise in timestamp matching. For production systems, agent tool observability requires far more than timestamp correlation.

Deployment and residency constraints

Two constraints matter for regulated buyers. Zapier MCP runs on multi-tenant cloud infrastructure with customer data stored in AWS US-East-1; region-specific residency is not available unless separately agreed, and dedicated VPC or on-premises deployment is not offered. Security is achieved through logical segregation.

Incident response is manual: Zapier can enable or disable MCP access for an account on request through your account manager. There is no programmatic kill switch you control.

When to use MCP, when to use the API

Both lists below assume a production agent, not a prototype. The split is about execution guarantees and who the agent is acting as.

Use Zapier MCP when:

  • The agent is interactive and the user is present, and you want the agent to reach apps you did not anticipate at design time
  • You want a tool surface whose size does not grow with the number of connected apps, which keeps context cost flat as coverage expands
  • The workflow is naturally expressed as a named, reusable Skill rather than as code
  • You are validating an automation concept and want coverage across thousands of apps before writing any integration code

Use the Zapier APIs and SDK when:

  • The agent runs on a schedule and a duplicate write is unacceptable, so you need idempotency_id and async run polling
  • The agent reacts to app events, which only the Trigger Inbox API delivers
  • You need paged bulk reads, callbacks, or per-request rate limit overrides
  • You are creating or managing Zaps inside your own product through the Workflow API
  • You need the tool surface pinned at deploy time so a schema change cannot alter agent behavior mid-quarter

Building a Zapier agent with Scalekit

Scalekit ships a Zapier MCP connector under the connection name zapiermcp. It exposes 14 of Zapier's 15 meta-tools as execute_tool targets, prefixed with zapiermcp_. The custom code action tool is not in the catalog, which is the right default for production pipelines.

One connector, not two

For most tools in this series Scalekit publishes separate API and MCP connectors. Zapier is currently MCP-only in the connector catalog. If your agent needs the Actions API or Trigger Inbox API, register those endpoints through bring your own connector and they inherit the same vault, scoping, and audit chain as the prebuilt connector.

Authorize the user and provision their apps

Scalekit resolves the per-user Zapier credential at request time. The identifier you pass is your own user ID, and it is the join key between your tenant model and the Zapier account behind the connected account.

import os from scalekit.client import ScalekitClient scalekit_client = ScalekitClient( env_url=os.getenv("SCALEKIT_ENV_URL"), client_id=os.getenv("SCALEKIT_CLIENT_ID"), client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"), ) actions = scalekit_client.actions # connection_name must match the connection configured in your Scalekit dashboard CONNECTION_NAME = "zapiermcp" IDENTIFIER = "user_123" response = actions.get_or_create_connected_account( connection_name=CONNECTION_NAME, identifier=IDENTIFIER, ) if response.connected_account.status != "ACTIVE": link = actions.get_authorization_link( connection_name=CONNECTION_NAME, identifier=IDENTIFIER, ) print("Authorize Zapier MCP:", link.link) input("Press Enter after authorizing...") # Provision the server from the apps this user already connected in Zapier actions.execute_tool( tool_name="zapiermcp_auto_provision_mcp", connection_name=CONNECTION_NAME, identifier=IDENTIFIER, tool_input={}, ) enabled = actions.execute_tool( tool_name="zapiermcp_list_enabled_zapier_actions", connection_name=CONNECTION_NAME, identifier=IDENTIFIER, tool_input={}, ) print(enabled.data["result"])

The connection_name string must match the connection name configured in your Scalekit dashboard exactly. This is the single most common integration error.

The same flow in TypeScript

The Node SDK mirrors the Python surface with camelCase method names.

import { ScalekitClient } from '@scalekit-sdk/node'; import 'dotenv/config'; const scalekit = new ScalekitClient( process.env.SCALEKIT_ENV_URL!, process.env.SCALEKIT_CLIENT_ID!, process.env.SCALEKIT_CLIENT_SECRET!, ); const connector = 'zapiermcp'; const identifier = 'user_123'; const { link } = await scalekit.actions.getAuthorizationLink({ connectionName: connector, identifier, }); console.log('Authorize Zapier MCP:', link); const result = await scalekit.actions.executeTool({ connector, identifier, toolName: 'zapiermcp_execute_zapier_write_action', toolInput: { app: 'slack', action: 'send_channel_message', instructions: 'Post the weekly report summary to #reports', output: 'confirmation that the message was sent', }, }); console.log(result.data?.result);

Retrieving the authorized tool surface

Before the agent loop runs, retrieve the tools this user's connected account is authorized to call. This is not tool discovery against an unknown catalog; it is a scoped, deterministic surface derived from what the user actually authorized.

Scalekit returns native LangChain StructuredTool objects, so no schema reshaping is needed. This integrates cleanly with LangChain tool calling patterns.

from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, ToolMessage tools = actions.langchain.get_tools( identifier=IDENTIFIER, connection_names=[CONNECTION_NAME], page_size=100, # avoid missing tools 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( "Find the three most recent support emails in Gmail, " "then post a summary to the #support Slack channel." ) ] 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"]))

Full working examples for other stacks are in the Scalekit LangChain guide and the adjacent Anthropic, OpenAI, Google ADK, and Mastra samples.

Constraining the surface with a Virtual MCP server

The 14 meta-tools include four that let an agent rewrite its own capabilities: enable, disable, create Skill, delete Skill. For a scheduled agent, that is more authority than the job requires.

Virtual MCP Servers let you declare exactly which tools an agent role can see. One server definition serves every user; a short-lived session token bound to a specific user is minted before each run. The endpoint is static; the identity is not.

from datetime import timedelta from scalekit.actions.models.mcp_config import McpConfigConnectionToolMapping # Setup: once per agent role, not once per user vmcp = scalekit_client.actions.mcp.create_config( name="zapier-report-agent", connection_tool_mappings=[ McpConfigConnectionToolMapping( connection_name="zapiermcp", tools=[ "zapiermcp_list_enabled_zapier_actions", "zapiermcp_execute_zapier_read_action", "zapiermcp_execute_zapier_write_action", ], ), ], ) config_id = vmcp.config.id mcp_server_url = vmcp.config.mcp_server_url # Runtime: before each agent run accounts = scalekit_client.actions.mcp.list_mcp_connected_accounts( config_id=config_id, identifier=IDENTIFIER, include_auth_link=True, ) for account in accounts.connected_accounts: if account.connected_account_status != "ACTIVE": raise RuntimeError( f"{account.connection_name} needs auth: {account.authentication_link}" ) token_response = scalekit_client.actions.mcp.create_session_token( mcp_config_id=config_id, identifier=IDENTIFIER, expiry=timedelta(minutes=30), ) mcp_server = { "url": mcp_server_url, "headers": {"Authorization": f"Bearer {token_response.token}"}, }

Three tools instead of fourteen removes the agent's ability to expand its own reach mid-run, and it cuts the tokens spent on tool definitions before the agent does any work. Setup details are in the Virtual MCP setup guide.

Why this matters more for Zapier than for other connectors

Zapier is the connector where a shared credential is most tempting, because one Zapier account technically reaches every app your customers use. It is also the connector where a shared credential does the most damage, because a single token spans thousands of downstream systems.

Scalekit inverts that. Each user authorizes once, their credential lives in an encrypted vault namespaced per tenant, and it is resolved server-side at call time so it never enters the agent runtime or the model context.

Every tool call is logged with full attribution: who authorized it, which agent ran it, which tool executed, and what came back. Those logs export to Datadog, Splunk, or any SIEM. When a Zapier action surfaces in an audit, it resolves to a person, not a service account. This is exactly the kind of audit trail for agent auth that enterprise buyers require.

The credential problem that exists on both paths

Both paths hand you a credential per user and stop there. The MCP path gives you an OAuth session or a connection token. The API path gives you an OAuth token or a client credentials pair. Neither gives you a vault, rotation logic, or a revocation flow.

The N-credential reality

In a multi-tenant Zapier agent, every user has their own Zapier credential, and each one needs to be encrypted at rest, isolated per tenant, refreshed before expiry, and invalidated on disconnect. Fifty customers is fifty credential lifecycles.

Zapier's identity model makes this sharper than most. Because credentials are user-scoped by construction and connections cannot be shared, there is no supported shortcut to a single org-wide credential. The per-user model is not optional; it is the only correct model, and it is entirely yours to operate. Understanding how to handle token refresh for AI agents at this scale is non-trivial.

Where Scalekit fits

The Scalekit Zapier MCP connector handles the OAuth flow, per-user token storage, and automatic refresh for both paths. The MCP versus API decision does not change your auth infrastructure.

Which one to build against

If your agent is interactive and the user is present, build on Zapier MCP. The constant-size meta-tool surface is the right answer to a 40,000-action catalog, and dynamic discovery lets the agent reach apps you never anticipated.

If your agent runs on a schedule, reacts to events, or cannot tolerate a duplicate write, build on the Actions API and the Trigger Inbox API. Idempotency keys, async callbacks, and pinned schemas are what unattended execution requires, and none of them exist on the MCP surface.

Most production Zapier agents will run both. What does not change between them is that every user brings their own Zapier credential, and that credential is the part that needs production-grade infrastructure. The patterns described here mirror the broader challenge of moving tool-calling auth from single-tenant to multi-tenant architectures.

Talk to other Zapier agent builders

Building on Zapier MCP and hitting the identity ceiling, the task accounting, or the two-layer revocation problem? Come compare notes: join the Scalekit Slack community.

If you want a faster answer, talk to an engineer and walk through your architecture directly.

Browse the Scalekit Zapier MCP connector: scalekit.com/connectors/zapiermcp

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.