MCP Moves Tasks Out of Core Into an Extension

A terminal window showing the verbatim MCP 2026-07-28 changelog entry: moved experimental tasks to official extension io.modelcontextprotocol/tasks, replaced blocking tasks/result with polling
On this page

What’s actually changing

The specification changelog states it directly:

“Moved experimental tasks to official extension io.modelcontextprotocol/tasks; replaced blocking tasks/result with polling via tasks/get and new tasks/update

The extension introduces three methods: tasks/get, tasks/update, and tasks/cancel, plus a polymorphic-result discriminator (resultType: "task") and a Task shape carrying status, any in-progress server-to-client requests, and a final result or error. Reads (tasks/get) and writes (tasks/update) are kept separate deliberately, so polling stays idempotent and cacheable rather than mutating state as a side effect of checking on it.

Structural Comparison Matrix

Operational AspectBefore (experimental core)After (io.modelcontextprotocol/tasks extension)
NamespaceExperimental core protocolFormal extension, io.modelcontextprotocol/tasks
Getting a resultBlocking tasks/result callPoll tasks/get until terminal status
Updating a taskNot separated from readsDedicated tasks/update call
Canceling a taskNot presentNew tasks/cancel method

Fix it: rewrite blocking waits into a polling loop

before: blocking tasks/result (removed)
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tasks/result",
  "params": { "taskId": "task_abc123" }
}
after: poll tasks/get on an interval until terminal
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tasks/get",
  "params": { "taskId": "task_abc123" }
}

Respect the server's pollIntervalMs

Don’t hardcode a polling interval on the client. The server communicates its expected pollIntervalMs, and polling faster than that wastes requests without getting the result any sooner, while polling much slower delays how quickly the client notices completion.

Client code written around a single blocking tasks/result call needs a real control-flow rewrite: a loop that calls tasks/get, checks the returned status, and exits once that status is terminal, carrying either the final result or an error, rather than treating one call as sufficient.

Confirmed version

Sourced from the official Model Context Protocol specification changelog, 2026-07-28 revision, published 2026-07-28, and the Tasks extension’s own specification (SEP-2663) for the method names and polling pattern. Browse more posts like this in the AI Productivity archive.

Frequently asked

Is the tasks feature itself going away?

No, the opposite: it graduates from experimental core to a formal, official extension (tracked under SEP-2663) with a more complete set of methods (tasks/get, tasks/update, and a new tasks/cancel) than the experimental version had.

Why did the interaction pattern change from blocking to polling?

A blocking tasks/result call ties up a request/response cycle for however long the underlying operation takes, which conflicts with the protocol's broader move toward statelessness and per-request negotiation. Polling with tasks/get lets the client control timing and keeps individual requests short-lived.

Emitted as FAQPage JSON-LD from the same frontmatter — one source, no duplicated prose.

Recent posts

Full-text search via Pagefind · ↑↓ to navigate · ↵ to open