MCP021 — Tasks are still served from the core protocol, not the tasks extension
| Severity | error |
| Fixed by | Upgrading your MCP SDK to a release targeting 2026-07-28 |
| Transports | stdio, http |
| Specification | 2026-07-28 |
| Changelog entry | Major change 6 (SEP-2663) |
Why this changed
SEP-2663 moved tasks out of the core protocol into the official
io.modelcontextprotocol/tasks extension, and redesigned them on the way:
polling through tasks/get replaced the blocking tasks/result, and
tasks/list was removed. A client now learns that a server supports tasks
only from the extension entry in server/discover — the core tasks
capability means nothing to it.
What the reference implementation does, which is what these checks are
calibrated against: the 2026-07-28 TypeScript SDK serves no core task
methods and strips a core tasks capability before answering a 2026 client,
and the ext-tasks client recognises support only from the extension entry.
Capabilities are read from server/discover alone. The legacy initialize
result is a 2025-11-25 answer, where a core tasks key is correct, so a
dual-era server is not faulted for it.
Running just this check
npx mcp-stateless --stdio "node dist/server.js" --only MCP021Suppressing it
If this check does not apply to your server, skip it:
npx mcp-stateless --stdio "node dist/server.js" --skip MCP021Rule ids are permanent and are never reissued, so a suppression cannot start silently matching a different check later.
Generated from src/rules/MCP021.ts by
scripts/gen-rule-docs.mjs. Edit the rule source, not this page.