skip to content

In MCP, what is an optional extension, and which ones are official?

level: juniorimportance: should knowfreq 52%

answer

  1. optional, deliberately outside the core
  2. declared in a capabilities map
  3. reverse-DNS style prefixed identifiers
  4. Tasks and MCP Apps are the official two

basics

~10 s

An MCP extension is an optional feature layered on top of the core protocol and used only when both peers declare it. Revision 2026-07-28 names two official ones: io.modelcontextprotocol/tasks (Tasks) and io.modelcontextprotocol/ui (MCP Apps).

solid answer

~40 s

In MCP revision 2026-07-28, an extension is a feature that deliberately sits outside the core protocol and exists for a given client-server pair only when both sides opt in. Support is declared in the `extensions` field of `ClientCapabilities` and `ServerCapabilities`, a map from a prefixed extension identifier to a settings object. The spec itself carries two official identifiers: `io.modelcontextprotocol/tasks`, the Tasks extension for long-running work, and `io.modelcontextprotocol/ui`, known as MCP Apps. Tasks is the clearest illustration of the mechanism — it was a core protocol feature in the 2025-11-25 design and was moved out into an extension in 2026-07-28. Anyone may define their own extension under their own prefix; the `io.modelcontextprotocol` prefix belongs to the spec's own extensions.

go deeper

for a junior

Be able to say that an extension is an optional feature declared in a capabilities map rather than something every implementation must support, and name the two official identifiers io.modelcontextprotocol/tasks and io.modelcontextprotocol/ui.

for a middle

Explain the map's shape — prefixed identifier to settings object — and why identifiers are namespaced. Being able to say that Tasks moved out of core into an extension in revision 2026-07-28 shows you have read the current spec.

for a senior

Show that you design against uneven support: an extension you rely on may be absent from the peer in front of you, so plan the degraded path before you plan the happy path.

for a principal

Own the argument for keeping the mandatory core small. Be ready to say which features earn a place in core, which belong behind an extension identifier, and what that choice costs the ecosystem in fragmentation.

## The idea A protocol has to decide what every implementation is obliged to support. Anything in the core of MCP is a floor: a conforming implementation has to handle it. Anything outside the core is optional, and MCP gives optional features a single, uniform home — the **extensions** mechanism. An extension is a named, self-describing bundle of behaviour that two peers may agree to use, and that they simply do not use if either of them lacks it. This is the whole point: extensions let the ecosystem grow without raising the bar that every implementer must clear. ## Where support is declared Both capability objects in MCP revision 2026-07-28 — `ClientCapabilities` and `ServerCapabilities` — carry an `extensions` field. It is a **map**: the key is the extension identifier, the value is a settings object for that extension. An empty settings object (`{}`) is meaningful and normal: it says "I support this extension, and I have no settings to pass". It does **not** mean unsupported. Identifiers are namespace-prefixed, following the same naming shape MCP uses for prefixed `_meta` keys: a dot-separated, reverse-DNS-style prefix, a slash, then a name — for example `io.modelcontextprotocol/ui`. The prefix is what keeps an extension defined by one vendor from colliding with an unrelated extension of the same short name defined by someone else. ## The two official extensions **`io.modelcontextprotocol/tasks` — Tasks.** The extension for work that does not finish inside a single request/response. A client that supports it opts in once through the extension capability; there is no per-tool flag. The lifecycle mechanics themselves are the Tasks extension's own subject; what matters here is that they are reachable only after both sides have declared the identifier. **`io.modelcontextprotocol/ui` — MCP Apps.** The extension covering interactive UI surfaces served through MCP. Both live under the `io.modelcontextprotocol` prefix because both are defined by the specification project itself. A third party writing its own extension uses its own prefix. ## Why Tasks became an extension In the 2025-11-25 design, task-shaped asynchronous execution was part of the core protocol. Revision 2026-07-28 removed it from core and re-issued it as the `io.modelcontextprotocol/tasks` extension. The migration is instructive: the feature is genuinely useful, but not every server has long-running work and not every client wants to poll and manage a task lifecycle. Making it mandatory taxed every implementation for a feature many would never exercise. As an extension, servers that need it advertise it, clients that can drive it advertise it, and everyone else interoperates over plain core calls. ## What extensions are not - **Not protocol versions.** MCP revisions are `YYYY-MM-DD` strings naming the date of the last backwards-incompatible change, and they partition the fleet into eras. An extension is additive and negotiated per peer pair; a peer that does not have it still speaks the same revision perfectly well. - **Not host configuration.** Whether a particular desktop product exposes a server is a product concern. The extensions map is a protocol-level declaration exchanged between a client and a server. - **Not implicit.** There is no "on by default unless you opt out". Silence means the extension is not in play, for both directions. - **Not a licence to assume.** A client cannot infer that a server supports an extension because a previous request seemed to work, and a server cannot infer a client's support from anything other than the capabilities that accompany the request in front of it. ## What an interviewer is checking Mostly two things. First, that you know optional features have a designated, discoverable home rather than being smuggled in as extra fields. Second, that you can name the two official ones and, ideally, tell the Tasks story — because knowing that Tasks used to be core and is now an extension is a reliable signal that you have read the 2026-07-28 revision rather than older material.

  • Does declaring an extension in your capabilities oblige you to use it on every request?
    No. Declaring it advertises support, nothing more. The extension only engages when both peers support it and the interaction actually calls for it — a client that supports Tasks still receives ordinary results from calls that complete immediately. The declaration is an offer, not a mode switch.
  • How would a third party define its own MCP extension?
    Under its own prefix — a reverse-DNS-style namespace it controls, a slash, then a name — publishing the settings-object shape both sides exchange and, importantly, what a peer should do when the other side lacks it. The `io.modelcontextprotocol` prefix is reserved for the specification's own extensions, so a vendor extension never sits there.

saying these in an interview costs you the question

  • Says extensions are negotiated once in an initialize handshake, removed in 2026-07-28
  • Claims extensions are enabled by default unless a peer opts out
  • Treats Tasks as still part of the core protocol in 2026-07-28
  • Assumes any identifier is fine, ignoring the namespace prefix
  • Confuses an extension with a new protocol revision date

context