createMCPClient()
Creates a lightweight Model Context Protocol (MCP) client that connects to an MCP server. The client provides:
- Tools: Automatic conversion between MCP tools and AI SDK tools
- Resources: Methods to list, read, and discover resource templates from MCP servers
- Prompts: Methods to list available prompts and retrieve prompt messages
- Completions: Methods to request autocompletion suggestions for prompt arguments and resource template variables
- Elicitation: Support for handling server requests for additional input during tool execution
It currently does not support accepting notifications from an MCP server, and custom configuration of the client.
Import
import { createMCPClient } from "@ai-sdk/mcp"API Signature
Parameters
config:
MCPClientConfig
MCPClientConfig
transport:
MCPTransportConfig | MCPTransport
MCPTransport
start:
() => Promise<void>
send:
(message: JSONRPCMessage) => Promise<void>
close:
() => Promise<void>
onclose:
() => void
onerror:
(error: Error) => void
onmessage:
(message: JSONRPCMessage) => void
MCPTransportConfig
type:
'sse' | 'http'
url:
string
headers?:
Record<string, string>
authProvider?:
OAuthClientProvider
redirect?:
'follow' | 'error'
initialSessionId?:
string
initialProtocolVersion?:
string
onSessionIdChange?:
(sessionId: string | undefined) => void
onSessionExpired?:
(sessionId: string) => void
terminateSessionOnClose?:
boolean
fetch?:
FetchFunction
initializationOptions?:
RequestOptions
clientName?:
string
name?:
string
version?:
string
onUncaughtError?:
(error: unknown) => void
maxRetries?:
number
initialInitializeResult?:
InitializeResult
capabilities?:
ClientCapabilities
Returns
Returns a Promise that resolves to an MCPClient with the following properties and methods:
initializeResult:
InitializeResult
serverInfo:
Configuration
instructions?:
string
tools:
async (options?: {
schemas?: TOOL_SCHEMAS
}) => Promise<McpToolSet<TOOL_SCHEMAS>>
options
schemas?:
TOOL_SCHEMAS
TOOL_SCHEMAS
inputSchema:
FlexibleSchema
outputSchema?:
FlexibleSchema
listTools:
async (options?: {
params?: PaginatedRequest['params'];
options?: RequestOptions;
}) => Promise<ListToolsResult>
options
params?:
PaginatedRequest['params']
options?:
RequestOptions
callTool:
async (args: {
name: string;
arguments?: Record<string, unknown>;
options?: RequestOptions;
}) => Promise<CallToolResult>
args
name:
string
arguments?:
Record<string, unknown>
options?:
RequestOptions
toolsFromDefinitions:
(definitions: ListToolsResult, options?: {
schemas?: TOOL_SCHEMAS
}) => McpToolSet<TOOL_SCHEMAS>
parameters
definitions:
ListToolsResult
schemas?:
TOOL_SCHEMAS
listResources:
async (options?: {
params?: PaginatedRequest['params'];
options?: RequestOptions;
}) => Promise<ListResourcesResult>
options
params?:
PaginatedRequest['params']
options?:
RequestOptions
readResource:
async (args: {
uri: string;
options?: RequestOptions;
}) => Promise<ReadResourceResult>
args
uri:
string
options?:
RequestOptions
listResourceTemplates:
async (options?: {
options?: RequestOptions;
}) => Promise<ListResourceTemplatesResult>
options
options?:
RequestOptions
complete:
async (args: CompleteRequestParams & {
options?: RequestOptions;
}) => Promise<CompleteResult>
args
ref:
{ type: 'ref/prompt'; name: string } | { type: 'ref/resource'; uri: string }
argument:
{ name: string; value: string }
context?:
{ arguments: Record<string, string> }
options?:
RequestOptions
experimental_listPrompts:
async (options?: {
params?: PaginatedRequest['params'];
options?: RequestOptions;
}) => Promise<ListPromptsResult>
options
params?:
PaginatedRequest['params']
options?:
RequestOptions
experimental_getPrompt:
async (args: {
name: string;
arguments?: Record<string, unknown>;
options?: RequestOptions;
}) => Promise<GetPromptResult>
args
name:
string
arguments?:
Record<string, unknown>
options?:
RequestOptions
onElicitationRequest:
(
schema: typeof ElicitationRequestSchema,
handler: (request: ElicitationRequest) => Promise<ElicitResult> | ElicitResult
) => void
parameters
schema:
typeof ElicitationRequestSchema
handler:
(request: ElicitationRequest) => Promise<ElicitResult> | ElicitResult
close:
() => Promise<void>
Example
import { createMCPClient } from '@ai-sdk/mcp';import { generateText } from 'ai';import { Experimental_StdioMCPTransport } from '@ai-sdk/mcp/mcp-stdio';
let client;
try { client = await createMCPClient({ transport: new Experimental_StdioMCPTransport({ command: 'node server.js', }), });
const tools = await client.tools();
const response = await generateText({ model: "xai/grok-4.5", tools, messages: [{ role: 'user', content: 'Query the data' }], });
console.log(response);} catch (error) { console.error('Error:', error);} finally { // ensure the client is closed even if an error occurs if (client) { await client.close(); }}Error Handling
The client throws MCPClientError for:
- Client initialization failures
- Protocol version mismatches
- Missing server capabilities
- Connection failures
For tool execution, errors are propagated as CallToolError errors.
For unknown errors, the client exposes an onUncaughtError callback that can be used to manually log or handle errors that are not covered by known error types.