@vercel/connect
v0.6.1
Published
SDK for obtaining scoped tokens for third-party services on behalf of apps or users. Authenticates the calling Vercel project via [`@vercel/oidc`](https://www.npmjs.com/package/@vercel/oidc) and exchanges the OIDC token for a Vercel Connect-issued credent
Keywords
Readme
@vercel/connect
SDK for obtaining scoped tokens for third-party services on behalf of apps or users. Authenticates the calling Vercel project via @vercel/oidc and exchanges the OIDC token for a Vercel Connect-issued credential.
Seven entrypoints, all ESM:
@vercel/connect— core token / authorization SDK@vercel/connect/chat— adapter helpers for the Chat SDK (chat):connectSlackAdapter,connectGitHubAdapter,connectLinearAdapter(no Chat SDK dependency — returns structural config)@vercel/connect/ai-sdk— Vercel AI SDK glue: re-exportsconnectAuthProviderfor MCP transports (optional peers:ai,@ai-sdk/mcp)@vercel/connect/mcp— canonical MCP-specOAuthClientProviderfor any MCP client (optional peer:@ai-sdk/mcp)@vercel/connect/eve— adapter helpers for Eve connections (optional peer:eve)@vercel/connect/betterauth— Better AuthgenericOAuthprovider (optional peer:better-auth)@vercel/connect/authjs— Auth.jsOAuth2Configprovider (optional peer:@auth/core)
Install
pnpm add @vercel/connectUsage
Core SDK
import { getToken } from '@vercel/connect';
const token = await getToken(process.env.CONNECTOR_LINEAR!, {
subject: { type: 'user', id: 'user_123' },
});To create an operator installation request for an app-scoped connector, use the experimental install helper:
This feature is gated while experimental. Contact Vercel to enable access before using it.
import { experimental_startInstallation } from '@vercel/connect';
const { url } = await experimental_startInstallation(
process.env.CONNECTOR_SLACK!,
{},
{ returnUrl: 'https://example.com/settings/integrations' }
);Chat SDK
Spread the helper into the matching create*Adapter factory. Each helper
wires both outbound app-scoped tokens and inbound Connect trigger-forwarded
webhook verification (Vercel OIDC), so no provider secret lives in your env.
import { createSlackAdapter } from '@chat-adapter/slack';
import { connectSlackAdapter } from '@vercel/connect/chat';
createSlackAdapter({
...connectSlackAdapter('slack/acme-slack'),
userName: 'my-bot',
});connectGitHubAdapter (installationToken) and connectLinearAdapter
(accessToken) follow the same shape. See the
Chat SDK integration guide
for connector setup, trigger forwarding, and per-platform examples.
Vercel AI SDK + MCP
import { createMCPClient } from '@ai-sdk/mcp';
import { streamText } from 'ai';
import {
connectAuthProvider,
ConsentRequiredError,
} from '@vercel/connect/ai-sdk';
const mcp = await createMCPClient({
transport: {
type: 'http',
url: 'https://mcp.linear.app',
authProvider: connectAuthProvider('oauth/linear', {
subject: { type: 'user', id: 'user_123' },
}),
},
});
try {
const result = await streamText({
model: 'openai/gpt-5.4',
tools: await mcp.tools(),
prompt,
});
return result.toUIMessageStreamResponse();
} catch (err) {
if (err instanceof ConsentRequiredError) return Response.redirect(err.url);
throw err;
}Tool-call approval (Human-in-the-Loop) is independent of Connect — use the AI
SDK's toolApproval option or wrapMcpTools from @ai-sdk/policy-opa.
Non-AI-SDK MCP clients (the official MCP TypeScript SDK, Mastra, etc.)
can import the same connectAuthProvider from @vercel/connect/mcp.
eve
import { defineMcpClientConnection } from 'eve/connections';
import { connect } from '@vercel/connect/eve';
export default defineMcpClientConnection({
url: 'https://mcp.linear.app/sse',
auth: connect('linear'),
});By default, connect() provisions or links the connector for the deploying
Vercel project on first use. Pass autoProvision: false when the connector is
managed elsewhere.
Better Auth
import { genericOAuth } from 'better-auth/plugins';
import { connect } from '@vercel/connect/betterauth';
genericOAuth({ config: [connect({ connector: 'linear' })] });Auth.js
import { connect } from '@vercel/connect/authjs';
const providers = [connect({ connector: 'linear' })];See the source under src/ for the full API (additional helpers like revokeToken, getTokenResponse, startAuthorization, experimental_startInstallation, typed error classes, and per-adapter options).
