You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
No client-suite scenarios for the tasks extension (io.modelcontextprotocol/tasks) #374
The server suite has 10 tasks-* scenarios, but the client suite has none. SEP-2663 places normative requirements on clients too — most importantly:
A client that has negotiated this extension MUST be prepared to handle either CallToolResult or CreateTaskResult in response to any supported request it issues.
plus the tasks/get polling flow (pollIntervalMs handling), issuing tasks/update / tasks/cancel, and the Mcp-Name: <taskId> routing header on tasks/* requests.
python-sdk is landing a client-side transparent polling driver (modelcontextprotocol/python-sdk#3005) and currently has no way to verify it against the harness — client conformance can't observe any of the above.
Suggested client-suite scenarios:
tasks-client-create-handling — the harness server task-augments a tools/call; the client must handle the CreateTaskResult and fetch the result via tasks/get.
tasks-client-poll-interval — the client honors pollIntervalMs between polls.
tasks-client-routing-headers — the client stamps Mcp-Name: <taskId> on tasks/* POSTs.
tasks-client-terminal-handling — failed / cancelled tasks are surfaced rather than polled forever.
I would like to take a focused first slice of this. After reviewing the current client-scenario harness, AGENTS.md, and src/seps/sep-2663.yaml, I propose one end-to-end tasks-client-lifecycle scenario rather than separate create/poll/header scenarios.
The mock server would negotiate io.modelcontextprotocol/tasks, return a normal CallToolResult for one supported call and a CreateTaskResult for a task-capable call, then expose working → completed states through tasks/get. One run can emit checks for:
sep-2663-client-handles-polymorphic-result: the client handles both result shapes after negotiating the extension.
The client follows the returned taskId with tasks/get rather than treating the task envelope as a completed tool result.
sep-2663-client-emits-mcp-name-on-tasks-methods: each observed tasks/get carries Mcp-Name: <taskId>.
The client reaches and handles the terminal completed result without continuing to poll.
I would extend the existing everything-client as the passing implementation and add deliberately broken client handlers for at least “treat CreateTaskResult as complete / never call tasks/get” and “poll without Mcp-Name”, with tests asserting the corresponding failures.
I would leave pollIntervalMs cadence out of this first PR because the traceability YAML currently marks it excluded as client-internal behavior, and leave “CreateTaskResult on an unsupported request type” for a separate mutually-exclusive negative scenario. Does that boundary match the WG’s intended client-suite design?
Thanks for taking this forward, @dhruvtv. One lifecycle scenario matches the shape I proposed. The review on #405 is worth preserving: validate the extension capability on every task operation exercised, and separately test a client that polls but omits that capability, alongside the no-poll and missing Mcp-Name cases. The current traceability YAML still excludes polling cadence, so I would keep that out of this first slice. Maintainers should confirm the final scope and check IDs.
Activity
realmehmetali commentedon Jul 18, 2026
I would like to take a focused first slice of this. After reviewing the current client-scenario harness,
AGENTS.md, andsrc/seps/sep-2663.yaml, I propose one end-to-endtasks-client-lifecyclescenario rather than separate create/poll/header scenarios.The mock server would negotiate
io.modelcontextprotocol/tasks, return a normalCallToolResultfor one supported call and aCreateTaskResultfor a task-capable call, then expose working → completed states throughtasks/get. One run can emit checks for:sep-2663-client-handles-polymorphic-result: the client handles both result shapes after negotiating the extension.taskIdwithtasks/getrather than treating the task envelope as a completed tool result.sep-2663-client-emits-mcp-name-on-tasks-methods: each observedtasks/getcarriesMcp-Name: <taskId>.I would extend the existing everything-client as the passing implementation and add deliberately broken client handlers for at least “treat CreateTaskResult as complete / never call tasks/get” and “poll without Mcp-Name”, with tests asserting the corresponding failures.
I would leave
pollIntervalMscadence out of this first PR because the traceability YAML currently marks it excluded as client-internal behavior, and leave “CreateTaskResult on an unsupported request type” for a separate mutually-exclusive negative scenario. Does that boundary match the WG’s intended client-suite design?dhruvtv commentedon Sep 29, 2026
tasks-client-lifecyclescenario (as suggested above) that also covers Add client conformance for SEP-2663 task results #405's review point: the tasks capability on every task operation.realmehmetali commentedon Oct 6, 2026
Thanks for taking this forward, @dhruvtv. One lifecycle scenario matches the shape I proposed. The review on #405 is worth preserving: validate the extension capability on every task operation exercised, and separately test a client that polls but omits that capability, alongside the no-poll and missing
Mcp-Namecases. The current traceability YAML still excludes polling cadence, so I would keep that out of this first slice. Maintainers should confirm the final scope and check IDs.