Skip to content

No client-suite scenarios for the tasks extension (io.modelcontextprotocol/tasks) #374

Open

Description

@maxisbey

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.

AI Disclaimer

Activity

  1. realmehmetali commented on Jul 18, 2026

    @realmehmetali

    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?

  2. dhruvtv commented on Sep 29, 2026

    @dhruvtv
  3. realmehmetali commented on Oct 6, 2026

    @realmehmetali

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions