
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: core
MCP capabilities are short declarations of which optional features a client or server supports. A server says "I offer tools and resources." A client says "I can ask the user questions." Each side may then use only what the other has declared.
In the 2026-07-28 spec, clients declare capabilities on every request, and servers advertise theirs through server/discover. Before that, both sides swapped capabilities once, in an initialize handshake.
This page lists every capability in the current spec, as of October 2026, using the architecture page and the official schema.
Key Takeaways
- Capabilities tell each side which optional MCP features the other supports, so neither relies on something missing.
- Clients include their capabilities in
_metaon every request; the field is required. - Servers advertise their capabilities in the
server/discoverresponse. - Server capabilities: tools, resources, prompts, completions, logging (deprecated), experimental and extensions.
- Client capabilities: elicitation, roots (deprecated), sampling (deprecated), experimental and extensions.
- If a request needs a client capability that was not declared, the server returns error
-32021.
What capabilities are
The architecture page describes "a capability-based negotiation system where clients and servers declare their supported features on each request." It adds a rule both sides must follow: "Both parties must respect declared capabilities throughout the interaction."
Capabilities are mostly empty objects. An empty {} means "supported, no extra settings." Some have flags, such as listChanged: true, meaning the server can notify you when its list changes.
Why they exist
MCP is built so "features can be added to servers and clients progressively." A tiny server might offer two tools and nothing else. A full desktop app might support every client feature. Capabilities let these very different programs work together without guessing.
They also protect users. A server "MUST NOT rely on capabilities the client has not declared," per the base protocol page. So a server cannot ask a user a question through a client that never said it could show one.
The capabilities in 2026-07-28
Server capabilities
| Capability | Meaning | Status |
|---|---|---|
tools | Offers tools; optional listChanged flag | Active |
resources | Offers readable resources; optional subscribe and listChanged flags | Active |
prompts | Offers prompt templates; optional listChanged flag | Active |
completions | Supports argument autocompletion suggestions | Active |
logging | Can send log messages to the client | Deprecated in 2026-07-28 |
experimental | Non-standard features | Active |
extensions | Optional extensions, keyed by identifier | Active, new in 2026-07-28 |
Client capabilities
| Capability | Meaning | Status |
|---|---|---|
elicitation | Can ask the user for input; form and url modes | Active |
roots | Can list filesystem roots | Deprecated in 2026-07-28 |
sampling | Can run an AI model request for the server | Deprecated in 2026-07-28 |
experimental | Non-standard features | Active |
extensions | Optional extensions, keyed by identifier | Active, new in 2026-07-28 |
The deprecation dates come from the deprecated features registry. Deprecated capabilities still work, but new implementations should not adopt them.
How capabilities are declared
Clients: on every request
Clients put capabilities in _meta under io.modelcontextprotocol/clientCapabilities. The base protocol page marks that field as required on every request. A request without it is malformed, and the server must reject it with -32602 (Invalid params).
The value should be the "client capabilities relevant to this request." So a client can send {} on a simple tool call, and include elicitation when it is ready to answer questions.
Servers: through discovery
Servers list their capabilities in the server/discover response, under capabilities. The architecture page notes that "implemented server features must be advertised in the server's capabilities," and that tool calls require "the server to declare tool capabilities."
When a capability is missing
If a server needs a client capability that was not declared, it returns a MissingRequiredClientCapabilityError. Here is the schema's example:
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32021,
"message": "Server requires the elicitation capability for this request",
"data": {
"requiredCapabilities": { "elicitation": {} }
}
}
}
On HTTP, that response must also use status 400 Bad Request. The client can then decide whether to retry with the capability declared.
The multi round-trip requests page applies the same rule. If a client does not declare elicitation, the server "MUST NOT include any elicitation/create requests" when it asks for input. See MCP multi-round-trip requests.
Extensions as capabilities
Optional extensions, such as MCP Apps or Tasks, are declared inside capabilities.extensions, keyed by an identifier like io.modelcontextprotocol/tasks. The versioning page says that if only one side supports an extension, the supporting side "MUST either revert to core protocol behavior or reject the request with an appropriate error." Our page on how MCP extensions work goes deeper.
What changed across spec versions
- 2025-03-26 added the
completionscapability, per its changelog. - 2025-11-25 exchanged capabilities once, inside
initialize. Its lifecycle page shows ataskscapability for experimental tasks, plusroots,samplingandlogging. - 2026-07-28 moved client capabilities to per-request
_metaand server capabilities toserver/discover. It added theextensionsfield, moved Tasks to theio.modelcontextprotocol/tasksextension and deprecatedroots,samplingandlogging, according to the 2026-07-28 changelog.
Common mistakes
- Declaring capabilities once and assuming they stick. In 2026-07-28 nothing carries over between requests. Send them every time.
- Using undeclared features. A server that sends an elicitation to a client without
elicitationbreaks the spec. - Advertising features you did not build. If you declare
resources.subscribe, you must handle subscriptions. - Adopting deprecated capabilities in new code. Skip
roots,samplingandlogging; use tool parameters, direct model APIs and stderr or OpenTelemetry instead. - Looking for a top-level
taskscapability. In 2026-07-28 Tasks is an extension, declared underextensions.
Next step
Capabilities are one piece of the bigger 2026 redesign. Read why MCP became stateless to see how per-request capabilities fit the new model, or browse the MCP specification hub.
Frequently asked questions
What are capabilities in MCP?
They are declarations of which optional features a client or server supports, such as tools, resources or elicitation. Each side may only use features the other has declared.
Where does an MCP client send its capabilities?
In the 2026-07-28 spec, in _meta under io.modelcontextprotocol/clientCapabilities on every request. The field is required, even if it is an empty object.
How does a client learn a server's capabilities?
By calling server/discover, which returns the server's capabilities, supported versions and identity. The call is optional; a client can also just send requests and handle errors.
What happens if a server needs a capability the client did not declare?
The server returns error -32021, MissingRequiredClientCapability, listing the capabilities it needs. On HTTP the status is 400.
Are roots and sampling still MCP capabilities?
Yes, but both are deprecated as of 2026-07-28, along with the server's logging capability. They remain usable for at least twelve months, and new implementations should not add them.











