Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ This monorepo publishes split packages:
- **`@modelcontextprotocol/server`**: build MCP servers
- **`@modelcontextprotocol/client`**: build MCP clients

Both packages have a **required peer dependency** on `zod` for schema validation. The SDK internally imports from `zod/v4`, but remains compatible with projects using Zod v3.25+.
Both packages have a **required peer dependency** on `zod` for schema validation. The SDK uses Zod v4.

### Middleware packages (optional)

Expand Down
4 changes: 2 additions & 2 deletions examples/client/src/elicitationUrlExample.ts
Original file line number Diff line number Diff line change
Expand Up @@ -656,7 +656,7 @@ async function listTools(): Promise<void> {
method: 'tools/list',
params: {}
};
const toolsResult = await client.request(toolsRequest, ListToolsResultSchema);
const toolsResult = await client.request(toolsRequest);

console.log('Available tools:');
if (toolsResult.tools.length === 0) {
Expand Down Expand Up @@ -687,7 +687,7 @@ async function callTool(name: string, args: Record<string, unknown>): Promise<vo
};

console.log(`Calling tool '${name}' with args:`, args);
const result = await client.request(request, CallToolResultSchema);
const result = await client.request(request);

console.log('Tool result:');
const resourceLinks: ResourceLink[] = [];
Expand Down
2 changes: 1 addition & 1 deletion examples/client/src/multipleClientsParallel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ async function createAndRunClient(config: ClientConfig): Promise<{ id: string; r
}
};

const result = await client.request(toolRequest, CallToolResultSchema);
const result = await client.request(toolRequest);
console.log(`[${config.id}] Tool call completed`);

// Keep the connection open for a bit to receive notifications
Expand Down
8 changes: 4 additions & 4 deletions examples/client/src/parallelToolCallsClient.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { CallToolResult, ListToolsRequest } from '@modelcontextprotocol/client';
import { CallToolResultSchema, Client, ListToolsResultSchema, StreamableHTTPClientTransport } from '@modelcontextprotocol/client';
import type { CallToolRequest, CallToolResult, ListToolsRequest } from '@modelcontextprotocol/client';
import { Client, StreamableHTTPClientTransport } from '@modelcontextprotocol/client';

/**
* Parallel Tool Calls MCP Client
Expand Down Expand Up @@ -86,7 +86,7 @@ async function listTools(client: Client): Promise<void> {
method: 'tools/list',
params: {}
};
const toolsResult = await client.request(toolsRequest, ListToolsResultSchema);
const toolsResult = await client.request(toolsRequest);

console.log('Available tools:');
if (toolsResult.tools.length === 0) {
Expand Down Expand Up @@ -159,7 +159,7 @@ async function startParallelNotificationTools(client: Client): Promise<Record<st
const toolPromises = toolCalls.map(({ caller, request }) => {
console.log(`Starting tool call for ${caller}...`);
return client
.request(request, CallToolResultSchema)
.request(request as CallToolRequest)
.then(result => ({ caller, result }))
.catch(error => {
console.error(`Error in tool call for ${caller}:`, error);
Expand Down
4 changes: 2 additions & 2 deletions examples/client/src/simpleOAuthClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ class InteractiveOAuthClient {
params: {}
};

const result = await this.client.request(request, ListToolsResultSchema);
const result = await this.client.request(request);

if (result.tools && result.tools.length > 0) {
console.log('\n📋 Available tools:');
Expand Down Expand Up @@ -310,7 +310,7 @@ class InteractiveOAuthClient {
}
};

const result = await this.client.request(request, CallToolResultSchema);
const result = await this.client.request(request);

console.log(`\n🔧 Tool '${toolName}' result:`);
if (result.content) {
Expand Down
30 changes: 15 additions & 15 deletions examples/client/src/simpleStreamableHttp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { createInterface } from 'node:readline';

import type {
CallToolRequest,
ElicitResult,
GetPromptRequest,
ListPromptsRequest,
ListResourcesRequest,
Expand Down Expand Up @@ -268,7 +269,7 @@ async function connect(url?: string): Promise<void> {
};

// Set up elicitation request handler with proper validation
client.setRequestHandler('elicitation/create', async request => {
client.setRequestHandler('elicitation/create', async (request): Promise<ElicitResult> => {
if (request.params.mode !== 'form') {
throw new McpError(ErrorCode.InvalidParams, `Unsupported elicitation mode: ${request.params.mode}`);
}
Expand All @@ -293,7 +294,7 @@ async function connect(url?: string): Promise<void> {
attempts++;
console.log(`\nPlease provide the following information (attempt ${attempts}/${maxAttempts}):`);

const content: Record<string, unknown> = {};
const content: Record<string, string | number | boolean | string[]> = {};
let inputCancelled = false;

// Collect input for each field
Expand Down Expand Up @@ -357,15 +358,15 @@ async function connect(url?: string): Promise<void> {
// Parse and validate the input
try {
if (answer === '' && field.default !== undefined) {
content[fieldName] = field.default;
content[fieldName] = field.default as string | number | boolean | string[];
} else if (answer === '' && !isRequired) {
// Skip optional empty fields
continue;
} else if (answer === '') {
throw new Error(`${fieldName} is required`);
} else {
// Parse the value based on type
let parsedValue: unknown;
let parsedValue: string | number | boolean | string[];

switch (field.type) {
case 'boolean': {
Expand All @@ -375,15 +376,15 @@ async function connect(url?: string): Promise<void> {
}
case 'number': {
parsedValue = Number.parseFloat(answer);
if (Number.isNaN(parsedValue as number)) {
if (Number.isNaN(parsedValue)) {
throw new TypeError(`${fieldName} must be a valid number`);
}

break;
}
case 'integer': {
parsedValue = Number.parseInt(answer, 10);
if (Number.isNaN(parsedValue as number)) {
if (Number.isNaN(parsedValue)) {
throw new TypeError(`${fieldName} must be a valid integer`);
}

Expand Down Expand Up @@ -511,8 +512,7 @@ async function connect(url?: string): Promise<void> {
{
method: 'resources/list',
params: {}
},
ListResourcesResultSchema
}
);
console.log('Available resources count:', resourcesResult.resources.length);
} catch {
Expand Down Expand Up @@ -598,7 +598,7 @@ async function listTools(): Promise<void> {
method: 'tools/list',
params: {}
};
const toolsResult = await client.request(toolsRequest, ListToolsResultSchema);
const toolsResult = await client.request(toolsRequest);

console.log('Available tools:');
if (toolsResult.tools.length === 0) {
Expand Down Expand Up @@ -629,7 +629,7 @@ async function callTool(name: string, args: Record<string, unknown>): Promise<vo
};

console.log(`Calling tool '${name}' with args:`, args);
const result = await client.request(request, CallToolResultSchema);
const result = await client.request(request);

console.log('Tool result:');
const resourceLinks: ResourceLink[] = [];
Expand Down Expand Up @@ -727,7 +727,7 @@ async function runNotificationsToolWithResumability(interval: number, count: num
console.log(`Updated resumption token: ${event}`);
};

const result = await client.request(request, CallToolResultSchema, {
const result = await client.request(request, {
resumptionToken: notificationsToolLastEventId,
onresumptiontoken: onLastEventIdUpdate
});
Expand Down Expand Up @@ -756,7 +756,7 @@ async function listPrompts(): Promise<void> {
method: 'prompts/list',
params: {}
};
const promptsResult = await client.request(promptsRequest, ListPromptsResultSchema);
const promptsResult = await client.request(promptsRequest);
console.log('Available prompts:');
if (promptsResult.prompts.length === 0) {
console.log(' No prompts available');
Expand Down Expand Up @@ -785,7 +785,7 @@ async function getPrompt(name: string, args: Record<string, unknown>): Promise<v
}
};

const promptResult = await client.request(promptRequest, GetPromptResultSchema);
const promptResult = await client.request(promptRequest);
console.log('Prompt template:');
for (const [index, msg] of promptResult.messages.entries()) {
console.log(` [${index + 1}] ${msg.role}: ${msg.content.type === 'text' ? msg.content.text : JSON.stringify(msg.content)}`);
Expand All @@ -806,7 +806,7 @@ async function listResources(): Promise<void> {
method: 'resources/list',
params: {}
};
const resourcesResult = await client.request(resourcesRequest, ListResourcesResultSchema);
const resourcesResult = await client.request(resourcesRequest);

console.log('Available resources:');
if (resourcesResult.resources.length === 0) {
Expand Down Expand Up @@ -834,7 +834,7 @@ async function readResource(uri: string): Promise<void> {
};

console.log(`Reading resource: ${uri}`);
const result = await client.request(request, ReadResourceResultSchema);
const result = await client.request(request);

console.log('Resource contents:');
for (const content of result.contents) {
Expand Down
3 changes: 1 addition & 2 deletions examples/client/src/ssePollingClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,9 @@ async function main(): Promise<void> {
arguments: {}
}
},
CallToolResultSchema,
{
// Track resumption tokens for debugging
onresumptiontoken: token => {
onresumptiontoken: (token: string) => {
lastEventId = token;
console.log(`[Event ID] ${token}`);
}
Expand Down
4 changes: 2 additions & 2 deletions examples/client/src/streamableHttpWithSseFallbackClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ async function listTools(client: Client): Promise<void> {
method: 'tools/list',
params: {}
};
const toolsResult = await client.request(toolsRequest, ListToolsResultSchema);
const toolsResult = await client.request(toolsRequest);

console.log('Available tools:');
if (toolsResult.tools.length === 0) {
Expand Down Expand Up @@ -168,7 +168,7 @@ async function startNotificationTool(client: Client): Promise<void> {
};

console.log('Calling notification tool...');
const result = await client.request(request, CallToolResultSchema);
const result = await client.request(request);

console.log('Tool result:');
for (const item of result.content) {
Expand Down
3 changes: 1 addition & 2 deletions examples/server/src/simpleStreamableHttp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -247,8 +247,7 @@ const getServer = () => {
message,
requestedSchema
}
},
ElicitResultSchema
}
);

if (result.action === 'accept') {
Expand Down
Loading
Loading