Skip to content

Commit d5f5047

Browse files
committed
merge commit - v2
1 parent 161f584 commit d5f5047

6 files changed

Lines changed: 50 additions & 47 deletions

File tree

examples/server/src/simpleStreamableHttp.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,7 @@ const getServer = () => {
480480
{
481481
async createTask({ duration }, { taskStore, taskRequestedTtl }) {
482482
// Create the task
483+
if (!taskStore) throw new Error('Task store not found');
483484
const task = await taskStore.createTask({
484485
ttl: taskRequestedTtl
485486
});
@@ -503,10 +504,12 @@ const getServer = () => {
503504
};
504505
},
505506
async getTask(_args, { taskId, taskStore }) {
506-
return await taskStore.getTask(taskId);
507+
if (!taskStore) throw new Error('Task store not found');
508+
return await taskStore.getTask(taskId!);
507509
},
508510
async getTaskResult(_args, { taskId, taskStore }) {
509-
const result = await taskStore.getTaskResult(taskId);
511+
if (!taskStore) throw new Error('Task store not found');
512+
const result = await taskStore.getTaskResult(taskId!);
510513
return result as CallToolResult;
511514
}
512515
}

packages/core/src/experimental/tasks/interfaces.ts

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
* WARNING: These APIs are experimental and may change without notice.
44
*/
55

6-
import type { RequestHandlerExtra, RequestTaskStore } from '../../shared/protocol.js';
76
import type {
87
JSONRPCErrorResponse,
98
JSONRPCNotification,
@@ -12,8 +11,6 @@ import type {
1211
Request,
1312
RequestId,
1413
Result,
15-
ServerNotification,
16-
ServerRequest,
1714
Task,
1815
ToolExecution
1916
} from '../../types/types.js';
@@ -22,23 +19,6 @@ import type {
2219
// Task Handler Types (for registerToolTask)
2320
// ============================================================================
2421

25-
/**
26-
* Extended handler extra with task store for task creation.
27-
* @experimental
28-
*/
29-
export interface CreateTaskRequestHandlerExtra extends RequestHandlerExtra<ServerRequest, ServerNotification> {
30-
taskStore: RequestTaskStore;
31-
}
32-
33-
/**
34-
* Extended handler extra with task ID and store for task operations.
35-
* @experimental
36-
*/
37-
export interface TaskRequestHandlerExtra extends RequestHandlerExtra<ServerRequest, ServerNotification> {
38-
taskId: string;
39-
taskStore: RequestTaskStore;
40-
}
41-
4222
/**
4323
* Task-specific execution configuration.
4424
* taskSupport cannot be 'forbidden' for task-based tools.

packages/server/src/experimental/tasks/interfaces.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66
import type {
77
AnySchema,
88
CallToolResult,
9-
CreateTaskRequestHandlerExtra,
109
CreateTaskResult,
1110
GetTaskResult,
1211
Result,
13-
TaskRequestHandlerExtra,
12+
ServerNotification,
13+
ServerRequest,
1414
ZodRawShapeCompat
1515
} from '@modelcontextprotocol/core';
1616

17+
import type { ContextInterface } from '../../server/context.js';
1718
import type { BaseToolCallback } from '../../server/mcp.js';
1819

1920
// ============================================================================
@@ -27,7 +28,7 @@ import type { BaseToolCallback } from '../../server/mcp.js';
2728
export type CreateTaskRequestHandler<
2829
SendResultT extends Result,
2930
Args extends undefined | ZodRawShapeCompat | AnySchema = undefined
30-
> = BaseToolCallback<SendResultT, CreateTaskRequestHandlerExtra, Args>;
31+
> = BaseToolCallback<SendResultT, ContextInterface<ServerRequest, ServerNotification>, Args>;
3132

3233
/**
3334
* Handler for task operations (get, getResult).
@@ -36,7 +37,7 @@ export type CreateTaskRequestHandler<
3637
export type TaskRequestHandler<
3738
SendResultT extends Result,
3839
Args extends undefined | ZodRawShapeCompat | AnySchema = undefined
39-
> = BaseToolCallback<SendResultT, TaskRequestHandlerExtra, Args>;
40+
> = BaseToolCallback<SendResultT, ContextInterface<ServerRequest, ServerNotification>, Args>;
4041

4142
/**
4243
* Interface for task-based tool handlers.

packages/server/src/server/mcp.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import type {
1818
PromptArgument,
1919
PromptReference,
2020
ReadResourceResult,
21-
RequestHandlerExtra,
2221
Resource,
2322
ResourceTemplateReference,
2423
Result,
@@ -341,7 +340,7 @@ export class McpServer {
341340
if (tool.inputSchema) {
342341
const typedHandler = handler as ToolTaskHandler<ZodRawShapeCompat>;
343342
// eslint-disable-next-line @typescript-eslint/no-explicit-any
344-
return await Promise.resolve(typedHandler.createTask(args as any, taskExtra));
343+
return await Promise.resolve(typedHandler.createTask(args as any, extra));
345344
} else {
346345
const typedHandler = handler as ToolTaskHandler<undefined>;
347346
// eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -366,7 +365,7 @@ export class McpServer {
366365
private async handleAutomaticTaskPolling<RequestT extends CallToolRequest>(
367366
tool: RegisteredTool,
368367
request: RequestT,
369-
extra: RequestHandlerExtra<ServerRequest, ServerNotification>
368+
extra: ContextInterface<ServerRequest, ServerNotification>
370369
): Promise<CallToolResult> {
371370
if (!extra.taskStore) {
372371
throw new Error('No task store provided for task-capable tool.');
@@ -375,12 +374,11 @@ export class McpServer {
375374
// Validate input and create task
376375
const args = await this.validateToolInput(tool, request.params.arguments, request.params.name);
377376
const handler = tool.handler as ToolTaskHandler<ZodRawShapeCompat | undefined>;
378-
const taskExtra = { ...extra, taskStore: extra.taskStore };
379377

380378
const createTaskResult: CreateTaskResult = args // undefined only if tool.inputSchema is undefined
381-
? await Promise.resolve((handler as ToolTaskHandler<ZodRawShapeCompat>).createTask(args, taskExtra))
379+
? await Promise.resolve((handler as ToolTaskHandler<ZodRawShapeCompat>).createTask(args, extra))
382380
: // eslint-disable-next-line @typescript-eslint/no-explicit-any
383-
await Promise.resolve(((handler as ToolTaskHandler<undefined>).createTask as any)(taskExtra));
381+
await Promise.resolve(((handler as ToolTaskHandler<undefined>).createTask as any)(extra));
384382

385383
// Poll until completion
386384
const taskId = createTaskResult.task.taskId;

packages/server/tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"extends": "@modelcontextprotocol/tsconfig",
3-
"include": ["./", "../../test/integration/test/server/context.test.ts"],
3+
"include": ["./"],
44
"exclude": ["node_modules", "dist"],
55
"compilerOptions": {
66
"paths": {

test/integration/test/server/mcp.test.ts

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1902,16 +1902,19 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => {
19021902
},
19031903
{
19041904
createTask: async (_args, extra) => {
1905+
if (!extra.taskStore) throw new Error('Task store not found');
19051906
const task = await extra.taskStore.createTask({ ttl: 60000 });
19061907
return { task };
19071908
},
19081909
getTask: async (_args, extra) => {
1909-
const task = await extra.taskStore.getTask(extra.taskId);
1910+
if (!extra.taskStore) throw new Error('Task store not found');
1911+
const task = await extra.taskStore.getTask(extra.taskId!);
19101912
if (!task) throw new Error('Task not found');
19111913
return task;
19121914
},
19131915
getTaskResult: async (_args, extra) => {
1914-
return (await extra.taskStore.getTaskResult(extra.taskId)) as CallToolResult;
1916+
if (!extra.taskStore) throw new Error('Task store not found');
1917+
return (await extra.taskStore.getTaskResult(extra.taskId!)) as CallToolResult;
19151918
}
19161919
}
19171920
);
@@ -1971,16 +1974,17 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => {
19711974
},
19721975
{
19731976
createTask: async (_args, extra) => {
1977+
if (!extra.taskStore) throw new Error('Task store not found');
19741978
const task = await extra.taskStore.createTask({ ttl: 60000 });
19751979
return { task };
19761980
},
19771981
getTask: async (_args, extra) => {
1978-
const task = await extra.taskStore.getTask(extra.taskId);
1982+
const task = await extra.taskStore?.getTask(extra.taskId!);
19791983
if (!task) throw new Error('Task not found');
19801984
return task;
19811985
},
19821986
getTaskResult: async (_args, extra) => {
1983-
return (await extra.taskStore.getTaskResult(extra.taskId)) as CallToolResult;
1987+
return (await extra.taskStore?.getTaskResult(extra.taskId!)) as CallToolResult;
19841988
}
19851989
}
19861990
);
@@ -6304,6 +6308,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => {
63046308
},
63056309
{
63066310
createTask: async ({ input }, extra) => {
6311+
if (!extra.taskStore) throw new Error('Task store not found');
63076312
const task = await extra.taskStore.createTask({ ttl: 60000, pollInterval: 100 });
63086313

63096314
// Capture taskStore for use in setTimeout
@@ -6319,14 +6324,16 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => {
63196324
return { task };
63206325
},
63216326
getTask: async (_args, extra) => {
6322-
const task = await extra.taskStore.getTask(extra.taskId);
6327+
if (!extra.taskStore) throw new Error('Task store not found');
6328+
const task = await extra.taskStore.getTask(extra.taskId!);
63236329
if (!task) {
63246330
throw new Error('Task not found');
63256331
}
63266332
return task;
63276333
},
63286334
getTaskResult: async (_input, extra) => {
6329-
const result = await extra.taskStore.getTaskResult(extra.taskId);
6335+
if (!extra.taskStore) throw new Error('Task store not found');
6336+
const result = await extra.taskStore.getTaskResult(extra.taskId!);
63306337
return result as CallToolResult;
63316338
}
63326339
}
@@ -6409,6 +6416,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => {
64096416
},
64106417
{
64116418
createTask: async ({ value }, extra) => {
6419+
if (!extra.taskStore) throw new Error('Task store not found');
64126420
const task = await extra.taskStore.createTask({ ttl: 60000, pollInterval: 100 });
64136421

64146422
// Capture taskStore for use in setTimeout
@@ -6425,14 +6433,16 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => {
64256433
return { task };
64266434
},
64276435
getTask: async (_args, extra) => {
6428-
const task = await extra.taskStore.getTask(extra.taskId);
6436+
if (!extra.taskStore) throw new Error('Task store not found');
6437+
const task = await extra.taskStore.getTask(extra.taskId!);
64296438
if (!task) {
64306439
throw new Error('Task not found');
64316440
}
64326441
return task;
64336442
},
64346443
getTaskResult: async (_value, extra) => {
6435-
const result = await extra.taskStore.getTaskResult(extra.taskId);
6444+
if (!extra.taskStore) throw new Error('Task store not found');
6445+
const result = await extra.taskStore.getTaskResult(extra.taskId!);
64366446
return result as CallToolResult;
64376447
}
64386448
}
@@ -6517,13 +6527,15 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => {
65176527
},
65186528
{
65196529
createTask: async ({ data }, extra) => {
6530+
if (!extra.taskStore) throw new Error('Task store not found');
65206531
const task = await extra.taskStore.createTask({ ttl: 60000, pollInterval: 100 });
65216532

65226533
// Capture taskStore for use in setTimeout
65236534
const store = extra.taskStore;
65246535

65256536
// Simulate async work
65266537
setTimeout(async () => {
6538+
if (!store) throw new Error('Task store not found');
65276539
await store.storeTaskResult(task.taskId, 'completed', {
65286540
content: [{ type: 'text' as const, text: `Completed: ${data}` }]
65296541
});
@@ -6533,14 +6545,16 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => {
65336545
return { task };
65346546
},
65356547
getTask: async (_args, extra) => {
6536-
const task = await extra.taskStore.getTask(extra.taskId);
6548+
if (!extra.taskStore) throw new Error('Task store not found');
6549+
const task = await extra.taskStore.getTask(extra.taskId!);
65376550
if (!task) {
65386551
throw new Error('Task not found');
65396552
}
65406553
return task;
65416554
},
65426555
getTaskResult: async (_data, extra) => {
6543-
const result = await extra.taskStore.getTaskResult(extra.taskId);
6556+
if (!extra.taskStore) throw new Error('Task store not found');
6557+
const result = await extra.taskStore.getTaskResult(extra.taskId!);
65446558
return result as CallToolResult;
65456559
}
65466560
}
@@ -6634,6 +6648,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => {
66346648
},
66356649
{
66366650
createTask: async extra => {
6651+
if (!extra.taskStore) throw new Error('Task store not found');
66376652
const task = await extra.taskStore.createTask({ ttl: 60000, pollInterval: 100 });
66386653

66396654
// Capture taskStore for use in setTimeout
@@ -6740,6 +6755,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => {
67406755
},
67416756
{
67426757
createTask: async extra => {
6758+
if (!extra.taskStore) throw new Error('Task store not found');
67436759
const task = await extra.taskStore.createTask({ ttl: 60000, pollInterval: 100 });
67446760

67456761
// Capture taskStore for use in setTimeout
@@ -6754,14 +6770,16 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => {
67546770
return { task };
67556771
},
67566772
getTask: async extra => {
6757-
const task = await extra.taskStore.getTask(extra.taskId);
6773+
if (!extra.taskStore) throw new Error('Task store not found');
6774+
const task = await extra.taskStore.getTask(extra.taskId!);
67586775
if (!task) {
67596776
throw new Error('Task not found');
67606777
}
67616778
return task;
67626779
},
67636780
getTaskResult: async extra => {
6764-
const result = await extra.taskStore.getTaskResult(extra.taskId);
6781+
if (!extra.taskStore) throw new Error('Task store not found');
6782+
const result = await extra.taskStore.getTaskResult(extra.taskId!);
67656783
return result as CallToolResult;
67666784
}
67676785
}
@@ -6827,18 +6845,21 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => {
68276845
},
68286846
{
68296847
createTask: async (_args, extra) => {
6848+
if (!extra.taskStore) throw new Error('Task store not found');
68306849
const task = await extra.taskStore.createTask({ ttl: 60000, pollInterval: 100 });
68316850
return { task };
68326851
},
68336852
getTask: async (_args, extra) => {
6834-
const task = await extra.taskStore.getTask(extra.taskId);
6853+
if (!extra.taskStore) throw new Error('Task store not found');
6854+
const task = await extra.taskStore.getTask(extra.taskId!);
68356855
if (!task) {
68366856
throw new Error('Task not found');
68376857
}
68386858
return task;
68396859
},
68406860
getTaskResult: async (_args, extra) => {
6841-
const result = await extra.taskStore.getTaskResult(extra.taskId);
6861+
if (!extra.taskStore) throw new Error('Task store not found');
6862+
const result = await extra.taskStore.getTaskResult(extra.taskId!);
68426863
return result as CallToolResult;
68436864
}
68446865
}

0 commit comments

Comments
 (0)