McpClient — API reference
Your Agent can connect to external Model Context Protocol (MCP) ↗ servers to access tools, resources, and prompts. The Agent class provides three methods to manage MCP connections:
import { Agent } from "agents";
export class MyAgent extends Agent { async onRequest(request) { const url = new URL(request.url);
if (url.pathname === "/connect" && request.method === "POST") { const { id, authUrl } = await this.addMcpServer( "Weather API", "https://weather-mcp.example.com/mcp", );
if (authUrl) { return new Response(JSON.stringify({ authUrl }), { headers: { "Content-Type": "application/json" }, }); }
return new Response(`Connected: ${id}`, { status: 200 }); } }}import { Agent, type AgentNamespace } from "agents";
type Env = { MyAgent: AgentNamespace<MyAgent>;};
export class MyAgent extends Agent<Env, never> { async onRequest(request: Request): Promise<Response> { const url = new URL(request.url);
if (url.pathname === "/connect" && request.method === "POST") { const { id, authUrl } = await this.addMcpServer( "Weather API", "https://weather-mcp.example.com/mcp", );
if (authUrl) { return new Response(JSON.stringify({ authUrl }), { headers: { "Content-Type": "application/json" }, }); }
return new Response(`Connected: ${id}`, { status: 200 }); } }}Connections persist in the Agent's SQL storage, and when an Agent connects to an MCP server, all tools from that server become available automatically.
Add a connection to an MCP server and make its tools available to your Agent.
async addMcpServer( serverName: string, url: string, callbackHost?: string, agentsPrefix?: string, options?: { client?: ConstructorParameters<typeof Client>[1]; transport?: { headers?: HeadersInit; type?: "sse" | "streamable-http" | "auto"; }; }): Promise<{ id: string; authUrl: string | undefined }>serverName(string, required) — Display name for the MCP serverurl(string, required) — URL of the MCP server endpointcallbackHost(string, optional) — Host for OAuth callback URL. If omitted, automatically derived from the incoming requestagentsPrefix(string, optional) — URL prefix for OAuth callback path. Default:"agents"options(object, optional) — Connection configuration:client— MCP client configuration options (passed to@modelcontextprotocol/sdkClient constructor)transport— Transport layer configuration:headers— Custom HTTP headers for authenticationtype— Transport type:"sse","streamable-http", or"auto"(tries streamable-http first, falls back to sse)
A Promise that resolves to an object containing:
id(string) — Unique identifier for this server connectionauthUrl(string | undefined) — OAuth authorization URL if authentication is required, otherwiseundefined
export class MyAgent extends Agent { async onRequest(request) { const { id, authUrl } = await this.addMcpServer( "Weather API", "https://weather-mcp.example.com/mcp", );
if (authUrl) { // User needs to complete OAuth flow return new Response(JSON.stringify({ serverId: id, authUrl }), { headers: { "Content-Type": "application/json" }, }); }
return new Response("Connected", { status: 200 }); }}export class MyAgent extends Agent<Env, never> { async onRequest(request: Request): Promise<Response> { const { id, authUrl } = await this.addMcpServer( "Weather API", "https://weather-mcp.example.com/mcp", );
if (authUrl) { // User needs to complete OAuth flow return new Response(JSON.stringify({ serverId: id, authUrl }), { headers: { "Content-Type": "application/json" }, }); }
return new Response("Connected", { status: 200 }); }}If the MCP server requires OAuth authentication, authUrl will be returned for user authentication. Connections persist across requests and the Agent will automatically reconnect if the connection is lost.
Related:
Disconnect from an MCP server and clean up its resources.
async removeMcpServer(id: string): Promise<void>id(string, required) — Server connection ID returned fromaddMcpServer()
A Promise that resolves when disconnection is complete.
export class MyAgent extends Agent { async onRequest(request) { const url = new URL(request.url);
if (url.pathname === "/disconnect" && request.method === "POST") { const { serverId } = await request.json(); await this.removeMcpServer(serverId);
return new Response("Disconnected", { status: 200 }); } }}export class MyAgent extends Agent<Env, never> { async onRequest(request: Request): Promise<Response> { const url = new URL(request.url);
if (url.pathname === "/disconnect" && request.method === "POST") { const { serverId } = await request.json(); await this.removeMcpServer(serverId);
return new Response("Disconnected", { status: 200 }); } }}Disconnects from the MCP server, removes all related resources, and deletes the server record from storage.
Get the current state of all MCP server connections.
getMcpServers(): MCPServersStateNone.
An MCPServersState object containing:
{ servers: Record< string, { name: string; server_url: string; auth_url: string | null; state: | "authenticating" | "connecting" | "ready" | "discovering" | "failed"; capabilities: ServerCapabilities | null; instructions: string | null; } >; tools: Array<Tool & { serverId: string }>; prompts: Array<Prompt & { serverId: string }>; resources: Array<Resource & { serverId: string }>;}export class MyAgent extends Agent { async onRequest(request) { const url = new URL(request.url);
if (url.pathname === "/mcp-state") { const mcpState = this.getMcpServers();
return new Response(JSON.stringify(mcpState, null, 2), { headers: { "Content-Type": "application/json" }, }); } }}export class MyAgent extends Agent<Env, never> { async onRequest(request: Request): Promise<Response> { const url = new URL(request.url);
if (url.pathname === "/mcp-state") { const mcpState = this.getMcpServers();
return new Response(JSON.stringify(mcpState, null, 2), { headers: { "Content-Type": "application/json" }, }); } }}The state field can be: authenticating, connecting, ready, discovering, or failed. Use this method to monitor connection status, list available tools, or build UI for connected servers.
Customize OAuth callback behavior using this.mcp.configureOAuthCallback():
export class MyAgent extends Agent { onStart() { this.mcp.configureOAuthCallback({ successRedirect: "/connected", errorRedirect: "/auth-failed", }); }}export class MyAgent extends Agent<Env, never> { onStart() { this.mcp.configureOAuthCallback({ successRedirect: "/connected", errorRedirect: "/auth-failed", }); }}You can also provide a customHandler function for full control over the callback response. Refer to the OAuth handling guide for details.
Use error detection utilities to handle connection errors:
import { isUnauthorized, isTransportNotImplemented } from "agents/mcp";
export class MyAgent extends Agent { async onRequest(request) { try { await this.addMcpServer("Server", "https://mcp.example.com/mcp"); } catch (error) { if (isUnauthorized(error)) { return new Response("Authentication required", { status: 401 }); } else if (isTransportNotImplemented(error)) { return new Response("Transport not supported", { status: 400 }); } throw error; } }}import { isUnauthorized, isTransportNotImplemented } from "agents/mcp";
export class MyAgent extends Agent<Env, never> { async onRequest(request: Request): Promise<Response> { try { await this.addMcpServer("Server", "https://mcp.example.com/mcp"); } catch (error) { if (isUnauthorized(error)) { return new Response("Authentication required", { status: 401 }); } else if (isTransportNotImplemented(error)) { return new Response("Transport not supported", { status: 400 }); } throw error; } }}- Connect your first MCP server — Tutorial to get started
- Handle OAuth flows — Complete OAuth integration guide
Was this helpful?
- Resources
- API
- New to Cloudflare?
- Directory
- Sponsorships
- Open Source
- Support
- Help Center
- System Status
- Compliance
- GDPR
- Company
- cloudflare.com
- Our team
- Careers
- © 2025 Cloudflare, Inc.
- Privacy Policy
- Terms of Use
- Report Security Issues
- Trademark
-