
This page is part of our MCP specification reference, a plain-English guide to the Model Context Protocol spec (version 2026-07-28), within The MCP Guide. Building a server? See MCP development.
Status in the 2026-07-28 spec: extension (official, io.modelcontextprotocol/tasks)
The MCP Tasks extension lets a server answer a slow tool call with a task ID instead of making the client wait. The client then checks on the task with tasks/get, sends any input the task needs with tasks/update, and collects the result when the task is done.
Tasks used to be an experimental part of the core spec. The 2026-07-28 changelog moved them "out of the core protocol and into an official extension" and redesigned them around polling. This page explains how the extension works, as of October 2026.
Key Takeaways
- Tasks turn a long tool call into a durable handle the client can poll, even after a restart.
- Both client and server must opt in through the
io.modelcontextprotocol/tasksextension. - The server decides per request whether to create a task, returning
resultType: "task". - Statuses are
working,input_required,completed,failedandcancelled. - In 2026-07-28,
tasks/resultandtasks/listwere removed andtasks/updatewas added.
Why Tasks exist
Some jobs take minutes or hours: a CI pipeline, a bulk import, an approval that waits on a manager. Holding a request open that long breaks easily. The Tasks overview lists the problems Tasks solve:
- No long-lived connections. Many clients and proxies time out after a few seconds.
- Crash resilience. "A task ID is a durable handle." A client can resume polling after it restarts.
- Progress visibility. Each task carries a status and optional status message.
- Mid-flight interaction. A task can pause for user input without the server sending its own requests.
Tasks also fit servers that wrap an API which already uses job IDs, such as cloud deployments or queued work.
How Tasks work
- Opt in. The client includes
io.modelcontextprotocol/tasksin theextensionsfield of its per-request capabilities. The server lists the same extension in itsserver/discoverresponse. - Create. When a supported request will be slow, the server returns a
CreateTaskResultwithresultType: "task", ataskId, a status, a time-to-live and a suggested polling interval. - Poll. The client calls
tasks/getwith the task ID, respectingpollIntervalMs. - Answer questions. If the status becomes
input_required, the response includes aninputRequestsmap, such as an elicitation. The client answers withtasks/update. - Finish. At
completed, theresultfield holds what the tool would have returned directly. Atfailed, theerrorfield holds the JSON-RPC error. - Cancel (optional). The client can send
tasks/cancelat any time.
Example: a task handle
This response is from the Tasks extension specification:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"resultType": "task",
"taskId": "786512e2-9e0d-44bd-8f29-789f320fe840",
"status": "working",
"statusMessage": "The operation is now in progress.",
"createdAt": "2025-11-25T10:30:00Z",
"lastUpdatedAt": "2025-11-25T10:40:00Z",
"ttlMs": 60000,
"pollIntervalMs": 5000
}
}
Task statuses
| Status | Meaning |
|---|---|
working | The job is in progress |
input_required | The server needs client input; see inputRequests |
completed | Done; result holds the output |
failed | A JSON-RPC error occurred; error has details |
cancelled | The job was cancelled (not always honored) |
The last three are terminal. Once reached, the task's state does not change.
Rules worth knowing
- Only
tools/callfor now. The extension spec saystools/callis currently the only method that supports task-augmented execution. - Durable before reply. A server "MUST NOT return
CreateTaskResultuntil the task is durably created," so atasks/getwould succeed. - Never surprise a client. Servers must not return a task to a client that did not declare the extension.
- Cancellation is cooperative. The server acknowledges
tasks/cancelbut is "not obligated to stop the work." - Push is optional. Servers can send
notifications/tasksthroughsubscriptions/listen. Polling is the default.
What changed across spec versions
| Version | Tasks change |
|---|---|
| 2025-11-25 | Added to the core spec as experimental, with polling and deferred result retrieval (changelog, SEP-1686) |
| 2026-07-28 | Moved to the official io.modelcontextprotocol/tasks extension (SEP-2663) |
The 2026-07-28 changelog lists four redesign points:
- The blocking
tasks/resultmethod was replaced by polling withtasks/get. - A new
tasks/updatemethod carries client input to a running task. tasks/listwas removed.- Servers can return task handles "unsolicited without per-request opt-in," once the client has opted in to the extension.
The extension spec lives in the ext-tasks repository. Extensions in general are covered in how MCP extensions work.
Tasks vs progress notifications
Progress notifications need the original request to stay open. If the stream breaks, the request is lost. Tasks survive that, because the handle lives on the server. Use progress for seconds and Tasks for minutes or more.
Client support
The extension support matrix, read on 28 October 2026, marked Tasks support in Claude (web), Claude Code and MCPJam. The matrix is community-maintained, so check each client's docs before you rely on it.
Common mistakes
- Returning tasks to clients that did not opt in. The overview says "Never return a task to a client that did not declare support."
- Polling too fast. Respect
pollIntervalMs. Servers may rate-limit clients that poll faster. - Losing the task ID. Clients should store task IDs durably so they can resume after a crash.
- Assuming cancel stops the work. A cancelled task may still finish as
completedorfailed. - Using old 2025-11-25 methods.
tasks/resultandtasks/listare gone in the extension. - Ignoring TTL. Servers may mark a task
failedand delete it after its time-to-live passes.
Next step
Tasks handle long jobs. To give users a rich screen for the result, read the MCP Apps extension. For a hands-on walkthrough, see Lesson 29: Long-running tasks and MCP Apps. If you are planning a server that needs Tasks, our MCP development team can help scope it.
Frequently asked questions
Are MCP Tasks part of the core spec?
Not anymore. Tasks were experimental in the 2025-11-25 core spec. The 2026-07-28 release moved them into the official io.modelcontextprotocol/tasks extension, which both sides must opt in to.
Which requests can become tasks?
Per the extension spec as of October 2026, only tools/call. The spec says it may extend tasks to other request types later.
How does a task ask the user for input?
Its status changes to input_required, and tasks/get returns an inputRequests map, for example an elicitation. The client gathers the answer and sends it with tasks/update.
What happened to tasks/list and tasks/result?
Both were removed in the 2026-07-28 redesign. Clients poll a known task with tasks/get instead of waiting on tasks/result, and there is no method to list all tasks.
Which AI apps support MCP Tasks?
On 28 October 2026, the official client matrix showed Tasks support in Claude (web), Claude Code and MCPJam. Support changes often, so check the matrix and each client's docs.











