Announcing CIMD support for MCP Client registration
Learn more

Vercel MCP vs Vercel API for AI Agents (2026)

TL;DR

  • Vercel MCP is in Beta with roughly two dozen tools: docs search, teams, projects, deployments, logs, domains, toolbar threads, Agent Runs. Environment variables, DNS, drains, webhooks, firewall config, and rolling releases are REST-only.
  • Vercel MCP only accepts AI clients Vercel has reviewed and approved. That is a client allowlist, not a scope check, and it gates your product's agent no matter how correct your OAuth is.
  • The REST API supports three credential models: account or team access tokens, integration OAuth tokens, and Sign in with Vercel tokens (vca_ valid one hour, vcr_ valid 30 days, rotated on use).
  • Adding a scope to a Vercel integration triggers a confirmation flow for every affected user and team owner. One new tool can stall behind a re-consent campaign.
  • Scalekit ships two Vercel connectors, REST and MCP, both using your own Vercel OAuth credentials. Token storage, refresh, per-user scoping, and auth logs are identical on either path.

Your agent needs to deploy, inspect, and debug Vercel projects. Vercel ships a hosted MCP server at mcp.vercel.com and a REST API at api.vercel.com, and both are official. They are not two views of the same surface: different capability coverage, different auth models, and one constraint on the MCP side that disqualifies most production agents before capability even matters. Here is how to pick.

What Vercel MCP and the Vercel API actually are

Two objects, two audiences. One is aimed at the developer sitting in front of an AI assistant, the other at software you deploy.

Vercel MCP

Vercel MCP is Vercel's official remote MCP server, hosted at https://mcp.vercel.com, implementing the MCP Authorization and Streamable HTTP specifications. Auth is browser-based OAuth. It is available in Beta on all plans.

The documented client list is a list of assistants: Claude Code, Claude, ChatGPT, Codex CLI, Cursor, VS Code with Copilot, Devin, Raycast, Goose, Windsurf, and the Gemini tools. Official docs: Use Vercel's MCP server and the tools reference.

The Vercel REST API

The REST API lives under https://api.vercel.com and is authenticated with Authorization: Bearer <TOKEN>. Team-owned resources are reached by appending teamId as a query parameter. Rate limit state comes back in X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset, with a 429 when you exceed it.

The current reference index lists more than 300 endpoints across 36 resource groups, including deployments, projects, environment, dns, drains, webhooks, security, rolling-release, sandboxes, and web-analytics. Official docs: Vercel REST API Reference.

Comparing them where it matters for agents

The capability gap is real, and it is not evenly distributed. MCP covers the read-and-debug loop well. Everything that configures the platform is REST-only.

What your agent can actually do

Capability
Vercel MCP
Vercel REST API
Search Vercel documentation
Yes (search_documentation)
No
List teams and projects
Yes (list_teams, list_projects)
Yes
Inspect deployments
Yes (list_deployments, get_deployment)
Yes
Build logs and runtime logs
Yes (get_deployment_build_logs, get_runtime_logs)
Yes
Trigger a deployment
Yes (deploy_to_vercel, current project)
Yes (POST /v13/deployments)
Cancel or delete a deployment
No
Yes
Environment variables
No
Yes
DNS records, domains config, certs
No
Yes
Domain availability and purchase
Yes (check_domain_availability_and_price, buy_domain)
Yes
Webhooks
No
Yes (/v1/webhooks)
Drains for logs, traces, and analytics
No
Yes (/v1/drains)
Firewall and WAF configuration
No
Yes (/v1/security/firewall/config)
Rolling releases, promote, rollback
No
Yes
Edge cache invalidation
No
Yes (/v1/edge-cache/invalidate-by-tags)
Team member management
No
Yes (/v3/teams/{teamId}/members)
Web Analytics queries
Not in the current tools reference
Yes (/v1/query/web-analytics/...)
Toolbar comment threads
Yes (list_toolbar_threads, reply_to_toolbar_thread)
No
Agent Runs traces
Yes (list_agent_runs, get_agent_run_trace)
No

Where the MCP ceiling sits

The MCP server is built for a human debugging a project through an assistant. It reads deployments, reads logs, searches docs, and resolves toolbar comments. Two areas are genuinely ahead of the documented REST surface: Agent Runs traces and Vercel Toolbar threads.

Everything that changes platform configuration is absent. No environment variables, no DNS, no drains, no webhooks, no firewall rules, no rollbacks. A release-management agent or an incident-response agent hits that wall on its second real task.

The tool surface is not pinned

Vercel MCP is Beta and the tool list moves. Vercel's MCP overview page advertises Web Analytics querying, which the tools reference does not currently enumerate. There is no version header to pin, so a schema change arrives whenever Vercel ships one.

The auth path each one puts you on

This is where the decision actually gets made for production agents, and it is not the usual OAuth-versus-API-key argument.

Vercel MCP: browser OAuth, approved clients only

Vercel maintains an allowlist of approved MCP clients and requires an explicit consent screen on every client connection, which is how it defends against the confused deputy problem. Vercel is clear about the intent: only clients that meet its standards for authorization, data handling, and protocol adherence are approved.

For an IDE assistant, this is a security feature. For your product, it is a gate. Teams building third-party agent platforms have reported that dynamic client registration against mcp.vercel.com is rejected with invalid_redirect_uri until their redirect URI is approved, and they have had to request allowlisting through Vercel's community forum.

What that means for a B2B agent

Your agent is not Cursor. If you are building a deployment copilot inside your own SaaS product, the direct path to mcp.vercel.com is not open to you by default, and the fix is a human approval process at Vercel rather than a configuration change on your side.

That is an architectural constraint, not a scope you forgot to request. Plan around it or take the API path.

The Vercel API: static tokens you create

The REST API gives you three credential models with different lifecycle properties. The first one you own outright.

Account or team access tokens are created in account settings, scoped to the account or to specific teams at creation time, with a selectable expiration. The value is shown once. They are right for internal tooling and single-tenant automation, and wrong for multi-tenant products, because the credential is yours rather than the end user's.

The Vercel API: tokens your users grant

The other two models are delegated, and they differ sharply in lifetime.

  • Integration OAuth tokens: created through the Integrations Console. The authorization code is valid for 30 minutes and can be exchanged exactly once at POST https://api.vercel.com/v2/oauth/access_token for a long-lived access token. Each install is tracked as a configuration (icfg_), which gives you per-install revocation.
  • Sign in with Vercel tokens: OIDC-based. Access tokens (vca_) are valid for one hour; refresh tokens (vcr_) last 30 days, are single use, and rotate on every exchange. Vercel documents permissions for issuing API requests and interacting with team resources as being in private beta.

The scope change trap nobody plans for

Vercel integration scopes are not a one-time decision. Additions and upgrades require review and confirmation, and every affected user and team owner is emailed to complete it. Removals and downgrades apply immediately without confirmation.

Translate that into agent terms. Ship a new tool that needs project-env-vars and you have not shipped a feature; you have started a re-consent campaign across every tenant. Provision the scope set your roadmap needs before you have users, not after. This is one of the more subtle tool calling auth production problems teams run into.

The teamId tax

Nearly every authenticated Vercel MCP tool requires teamId, and list_projects requires it too. An agent with no cached team context spends its first tool call on list_teams before it can do anything useful.

On the REST side, teamId is a query parameter you set once from your own tenant record. Small difference per call, real difference across thousands of runs.

What you own in production

Both paths hand you an operational surface. They are not the same surface, and neither one includes credential lifecycle.

On the MCP path

Vercel owns hosting, transport, and tool schemas. You own the OAuth consent flow per user, the token that flow produces, refresh behavior, revocation handling, and adapting when the Beta tool list changes underneath you.

You also own the failure mode where a user revokes access in Vercel and your agent finds out through a 401 mid-run.

On the API path

You own more, and you get determinism in exchange. Endpoint selection, per-endpoint versioning (/v13/deployments and /v10/projects are versioned independently), pagination, retry logic against X-RateLimit-Reset, and the full token lifecycle.

One specific failure to instrument: when an integration configuration is disabled, API requests fail with 403 and a code of integration_configuration_disabled, and drains stop receiving logs. That is a silent data gap unless you are watching for it.

Schema drift and versioning

MCP tool schemas change when Vercel updates the hosted server, with no version contract available to you. REST endpoints are versioned per endpoint and deprecations go through the changelog.

For a scheduled pipeline where an unexpected schema change is an incident, the versioned surface is the more predictable dependency. This tradeoff is a core theme when comparing MCP against lower-level interfaces.

When to use Vercel MCP, when to use the Vercel API

Both are correct answers for different agents. The split is cleaner here than for most tools in this series.

Use Vercel MCP when

  • Your agent runs inside an approved client: Claude Code, Cursor, VS Code with Copilot, Codex, or another assistant on Vercel's supported list, with the developer present for the consent screen
  • The job is read-and-diagnose: pulling build logs for a failed deployment, searching Vercel docs mid-task, checking which deployment is live
  • You want Agent Runs traces or Vercel Toolbar comment threads, which the documented REST surface does not expose
  • You are prototyping and want a working Vercel context in an assistant in under a minute

Use the Vercel API when

  • You are building a multi-tenant product where your own agent acts on behalf of each customer's Vercel account, and Vercel's client allowlist is not a process you want in your release path
  • The agent runs headless: nightly deployment digests, automated rollback on error-rate thresholds, environment variable sync, drain provisioning
  • The work touches configuration: env vars, DNS, certs, firewall rules, rolling releases, edge cache invalidation, team membership
  • You need webhooks or drains to react to deployment events instead of polling
  • You are running a deterministic pipeline and cannot absorb an unannounced tool schema change

The credential problem that exists on both paths

Pick either path and you still end up holding one Vercel credential per user. The token type differs; the infrastructure does not.

N users, N Vercel credentials

Forty engineers across eight customer teams means forty OAuth grants to store encrypted and isolated per tenant. Sign in with Vercel access tokens expire hourly, and their refresh tokens are single use, so a lost rotation is a broken connection rather than a retryable error.

Users can also revoke at any time from Vercel, and revoking an access token revokes its refresh token with it. Your agent has no way to know that happened until a call fails. This is the core challenge covered in depth in our guide on how to handle token refresh for AI agents.

Where Scalekit fits

Scalekit's Vercel connectors handle the OAuth flow, encrypted token storage, proactive refresh, and per-user scoping for both paths, so the MCP versus API decision does not change your auth infrastructure. Credentials never touch the agent runtime or the model context.

Building a Vercel agent with Scalekit

Scalekit ships both objects as separate connectors so you can use either surface, or both, behind one credential layer.

Two connectors, one auth layer

The Vercel connector wraps the REST API and exposes 56 tools spanning aliases, checks, deployments, DNS, domains, Edge Config, environment variables, projects, teams, and webhooks. The Vercel MCP connector wraps Vercel MCP and exposes 19 tools including vercelmcp_getruntimelogs, vercelmcp_getdeploymentbuildlogs, and vercelmcp_searchverceldocumentation.

Both are configured with an OAuth integration you create in the Vercel Integrations Console, so you supply your own client ID and secret rather than relying on dynamic client registration.

One setup rule that breaks most first integrations

The scope string you enter in Scalekit must match exactly what you enabled on the Permissions tab of your Vercel integration, or authorization fails with invalid_scope. Scalekit's walkthrough shows the identity scopes (openid, profile, email, offline_access); the resource scopes your REST tools actually call include deployment, project, project-env-vars, team, user, domain, edge-config, and log-drain.

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

Connect the user once

Install the SDK and create a connected account for the user. Scalekit returns an authorization link when the account is not yet active.

pip install scalekit-sdk-python langchain-openai
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 # Must match the connection name configured in AgentKit > Connections CONNECTION_NAME = "vercel" IDENTIFIER = "user_123" account = actions.get_or_create_connected_account( connection_name=CONNECTION_NAME, identifier=IDENTIFIER, ) if account.connected_account.status != "ACTIVE": magic_link = actions.get_authorization_link( connection_name=CONNECTION_NAME, identifier=IDENTIFIER, ) print("Authorize Vercel:", magic_link.link)

Retrieve the tools this user is authorized to call

Before the agent sees a single tool, decide what it is allowed to see. list_scoped_tools does not return a connector catalog; it returns the tools the current user's connected account is authorized to call, which is the distinction between a per-user agent and a shared-credential agent.

scoped = actions.tools.list_scoped_tools( identifier=IDENTIFIER, page_size=100, ) for tool in scoped.tools: print(tool.name)

Why the scoped surface matters for Vercel specifically

The Vercel connector exposes 56 tools. At roughly 200 tokens each, handing the model the full catalog burns about 11,000 tokens before the agent does any work, and it gives a deployment-diagnosis agent the ability to call vercel_project_delete.

Scoping to the five or six tools the task needs cuts that overhead and shrinks the decision space the model chooses from. Surface reduction is the lever. Model upgrades help. They are not the lever. This pattern is central to how tool calling auth changes when you move from single-tenant to multi-tenant.

Run the agent loop with LangChain

actions.langchain.get_tools() returns native StructuredTool objects, so the agent code carries no Scalekit-specific logic past initialization.

from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, ToolMessage tools = actions.langchain.get_tools( identifier=IDENTIFIER, connection_names=["vercel"], page_size=100, ) tool_map = {t.name: t for t in tools} llm = ChatOpenAI(model="gpt-4o").bind_tools(tools) messages = [ HumanMessage( "List the failed production deployments for project prj_123, " "then pull the build log events for the most recent failure." ) ] while True: response = llm.invoke(messages) messages.append(response) if not response.tool_calls: print(response.content) break for call in response.tool_calls: result = tool_map[call["name"]].invoke(call["args"]) messages.append( ToolMessage(content=str(result), tool_call_id=call["id"]) )

Calling Vercel MCP tools through the same layer

If you want the MCP-side capabilities, the code shape does not change. Configure the vercelmcp connection, then call execute_tool with the MCP tool name.

result = actions.execute_tool( tool_name="vercelmcp_getruntimelogs", tool_input={ "projectId": "prj_123", "teamId": "team_456", "limit": 100, }, identifier=IDENTIFIER, ) print(result.data)

One Virtual MCP server for multi-tool, multi-tenant agents

A standard MCP server exposes everything it has. A Virtual MCP server declares exactly which tools an agent can see and whose credentials it acts with, across multiple connections, behind one static endpoint.

Create the server once per agent role, not once per user.

from scalekit.actions.models.mcp_config import McpConfigConnectionToolMapping vmcp = scalekit_client.actions.mcp.create_config( name="vercel-release-agent", connection_tool_mappings=[ McpConfigConnectionToolMapping( connection_name="vercel", tools=[ "vercel_deployments_list", "vercel_deployment_get", "vercel_deployment_events_list", ], ), McpConfigConnectionToolMapping( connection_name="vercelmcp", tools=["vercelmcp_getruntimelogs"], ), ], ) config_id = vmcp.config.id mcp_server_url = vmcp.config.mcp_server_url

Mint a session token before each run

The endpoint is static; the identity is not. Check that every connection is still active for this user, then mint a short-lived token bound to that user.

from datetime import timedelta 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": 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=IDENTIFIER, expiry=timedelta(minutes=30), ) mcp_server = { "url": mcp_server_url, "headers": {"Authorization": f"Bearer {token_response.token}"}, }

What the release agent cannot do

Note the negative space. The agent above cannot call vercel_project_delete, cannot mint an Edge Config read token, and cannot invite a team member, because those tools were never mapped onto its server. The agent sees only what you explicitly allow, not everything the connector exposes.

That is least privilege enforced at the tool level, and it is the difference between a demo and something you let run unattended against production deployments. This approach to credential ownership across agent tool-calling patterns determines your actual security posture in production.

Auth logs are the observability the MCP path does not give you

Connect an assistant directly to mcp.vercel.com and the audit story ends at Vercel's own account activity. You cannot answer which of your users triggered which downstream call, under which grant, at which time.

Scalekit's auth logs record the authorization and token lifecycle behind every connected account, so a tool call against Vercel traces back to the user who authorized it and the grant it ran under. Logs can be exported to your SIEM or warehouse for alerting and compliance workflows. This kind of traceability is covered in detail in our post on audit trails for agent auth in B2B SaaS.

Which one to build against

If your agent lives inside an approved AI client and its job is reading deployments, pulling logs, and searching docs with a developer present, use Vercel MCP. The setup cost is one command and Vercel maintains the server.

If your agent is your product, runs headless, or touches platform configuration, build against the Vercel REST API. The client allowlist is not a workaround problem, and the configuration surface simply is not on the MCP server.

Most production teams end up running both: MCP for the interactive developer experience, REST for the background pipeline. The credential layer underneath is identical either way, and that is the part that needs production-grade infrastructure.

Talk to other Vercel agent builders

Building deployment agents, incident-response agents, or release-notes agents on Vercel? Join the Scalekit Slack community and compare notes with other teams shipping the same thing.

Need help now: talk to an engineer.

Browse the connectors: Vercel connector docs and Vercel MCP connector docs.

FAQs

What is Vercel MCP and how does it differ from the Vercel REST API?

Vercel MCP is a hosted remote MCP server at mcp.vercel.com that exposes roughly two dozen tools for reading deployments, logs, and docs via browser-based OAuth. The Vercel REST API is a versioned HTTP API with over 300 endpoints covering every platform capability. MCP is designed for developer assistants; the REST API is designed for software.

Can I use Vercel MCP inside my own SaaS product or AI agent?

Not by default. Vercel maintains an allowlist of approved MCP clients. If your product is not on that list, dynamic client registration against mcp.vercel.com will be rejected. You must request allowlisting through Vercel, which is a human approval process rather than a configuration fix.

What Vercel capabilities are only available via the REST API and not MCP?

Environment variables, DNS records, webhooks, log drains, firewall and WAF configuration, rolling releases, edge cache invalidation, team member management, canceling or deleting deployments, and web analytics queries are all REST-only as of the current tool reference.

What are the Vercel API credential types for agents?

Three types: account or team access tokens (static, created in settings), integration OAuth tokens (long-lived, exchanged from a 30-minute authorization code), and Sign in with Vercel tokens (OIDC-based, one-hour access tokens with 30-day rotating refresh tokens).

Why does adding a scope to a Vercel integration require a re-consent campaign?

Vercel requires every affected user and team owner to confirm scope additions and upgrades by email. One new scope for a new tool means every existing tenant must re-authorize before the feature works for them. You should provision your full intended scope set before acquiring users.

How does Scalekit help with Vercel agent auth?

Scalekit provides two Vercel connectors — one for the REST API (56 tools) and one for Vercel MCP (19 tools) — both backed by the same OAuth credential layer. It handles token storage, proactive refresh, per-user scoping, and auth logs so credentials never reach the agent runtime or model context.

When should I use both Vercel MCP and the Vercel REST API together?

When you need MCP-exclusive capabilities (Agent Runs traces, Toolbar threads) for interactive developer workflows alongside REST-only operations (env vars, DNS, firewall rules) for background pipelines. Scalekit's Virtual MCP server lets you combine both behind one endpoint with per-agent tool mapping.

What happens when a user revokes Vercel access mid-run?

Revoking a Vercel access token also revokes its associated refresh token. Your agent has no advance warning and will receive a 401 on the next API call. Without proactive token monitoring and graceful reconnection flows, this causes silent failures in production.

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.