modelcontextprotocol/ext-skills
Specification and documentation for Skills over MCP.
SKILL.md file and optional supporting
files, following the Agent Skills specification.
This extension defines discovery and retrieval over MCP.
Skills are useful for reusable workflows that combine several tools or require
supporting references, such as code review or document processing. Serving them
over MCP keeps those instructions with the service they describe. Clients can
discover available workflows from metadata and load instructions and supporting
files only when needed.
User Interaction Model
Host applications determine how skills are exposed to the model and user. Skills can be selected by the model based on their names and descriptions, or explicitly by the user. The extension does not mandate a specific user interaction model. ReadingSKILL.md through resources/read does not itself activate a skill.
To load the skill, the host routes the read through its skill-loading path, which
verifies the content and applies any required user approval before loading it
into model context.
Capabilities
Servers that support Skills MUST declare both theresources capability and
the io.modelcontextprotocol/skills extension in
server/discover:
skills/list and
skills/get. Skill files are served through resources/read.
The optional directoryRead setting indicates support for
resources/directory/read and defaults to false. An empty extension object
indicates support without directory reading. Clients issue skills/list and
skills/get only after observing the server’s declaration.
These examples use protocol revision
2026-07-28 or later. For brevity, the
request examples omit _meta. Every request MUST include the required
request metadata.Protocol Messages
Listing Skills
To discover available skills, clients send askills/list request. This
operation supports pagination
and caching.
Request:
A manifest MUST include
SKILL.md and every supporting file, with each file’s
URI, SHA-256 digest, and byte size. Each entry returned by skills/list is
complete; clients do not need to call skills/get for additional metadata.
When a response includes nextCursor, clients pass it as params.cursor to
retrieve the next page. List and get results MUST include
resultType: "complete", ttlMs, and cacheScope. The cache fields describe
freshness and sharing; they do not provide content integrity.
Skill identity consists of the originating server’s identity and the skill URI.
Names are labels and are not guaranteed to be unique. Hosts MUST preserve
both server identity and URI in registries, approvals, and caches. Servers
SHOULD use the skill:// scheme, but MAY use another scheme.
Hosts MUST NOT identify a resource as a skill solely by its URI scheme.
Getting a Skill
To retrieve a skill entry by URI, clients send askills/get request. The URI
may be supplied by a user, another skill, or server instructions.
Request:
result.skill, with the same shape
as an entry in skills/list, alongside resultType: "complete", ttlMs,
and cacheScope. Clients can also use this method to refresh an existing entry.
Servers MAY return empty or partial listings, but MUST respond to
skills/get for every skill they serve. Hosts MUST support loading by URI,
including skills that do not appear in a listing.
Reading Skill Content
To retrieve skill instructions or supporting files, clients send aresources/read
request. This example retrieves the SKILL.md from the listing above.
Request:
SKILL.md file MUST begin with YAML frontmatter containing name and
description. The final segment of its parent directory’s path MUST match
name.
Clients resolve relative references against the skill’s root directory. In this
example, references/checklist.md resolves to
skill://code-review/references/checklist.md. The supporting file is retrieved
from the same server using resources/read and contains:
Reading Directories
To list a directory’s direct children, clients send aresources/directory/read
request. This method is optional. Clients MUST NOT call it unless the server
declares directoryRead: true.
Request:
mimeType: "inode/directory". Clients descend by issuing another request for
a child directory. Results support cursor / nextCursor pagination and
contain direct children only.
For skills with a manifest, hosts MAY answer directory queries from that
manifest. Directory reading also supports dynamic skills and other resource
trees. Hosts MUST NOT treat a live directory result as extending the retained
manifest or expose newly listed files as part of the skill. Access to those files
requires an entry refresh and any required user approval.
Message Flow
This example shows loading a skill with a file manifest, after server capabilities have been discovered. The host’s MCP client sends the protocol requests. Skill selection and user approval are host interactions. A known URI can be loaded without listing. An entry returned byskills/list
can be reused; otherwise, the host calls skills/get. An unlisted skill may
still exist, but an unknown URI returns -32602 (Invalid params) and stops
loading. All skill reads use the originating server.
If lookup fails, approval is denied, or verification fails, the host does not load
or use the content. Recovering from a changed manifest requires refreshing the
entry and obtaining any required approval again, as described below.
Integrity and Verification
While acting on a skill, the host retains the entry used to load it. This period extends at least until the skill’sSKILL.md leaves model context. For skills
with a manifest, hosts MUST:
- Restrict file reads to URIs in the retained manifest.
- Verify each file’s raw byte size and SHA-256 digest before use.
- Parse
SKILL.mdfrontmatter and compare it field-by-field with the entry’sfrontmatter.
skills/get. Persisted approval
MUST bind to the complete set of file URIs and digests. A changed, added, or
removed file revokes that approval; the host MUST obtain approval again
before loading or executing.
Hosts SHOULD cache verified content on demand. Disk caches MUST either
prevent modification by the model, its tools, or other users and keep files
immutable, or verify cached bytes on every access. Hosts MUST exclude cached
files from filesystem-skill discovery paths and preserve their MCP origin,
including after a restart.
Digests establish consistency with the server’s manifest, not trust in its
content. For generated content without stable digests, an entry uses
"resources": "dynamic". Hosts MAY decline these skills. If accepted,
hosts MUST still verify frontmatter and MUST NOT treat persisted
approval as covering arbitrary future content.Implementation Requirements
Servers
Servers MUST:- Serve valid Agent Skills and implement the declared methods, including base Resources support.
- Preserve all frontmatter fields and publish complete manifests computed from
the bytes served, unless the skill’s resources are declared
"dynamic". - Support direct lookup independently of listing. Each skill entry is atomic; its manifest MUST NOT be split across pages.
- Support every directory in the served skill namespaces when declaring
directoryRead: true.
SKILL.md. Hosts MUST support skills up to these limits and MAY support
larger skills.
Security Considerations
Hosts MUST:- Prevent skills with the same name from silently replacing one another.
- Tag loaded content with its originating server and bind resource reads to that server using a host-assigned label. Cross-server reads require explicit per-call approval naming both servers.
- Treat skill content as untrusted input. Host-side code execution and permission
grants such as
allowed-toolsrequire explicit per-skill user approval. - Obtain fresh user consent before activating a nested skill. Reading its
SKILL.mdas supporting content does not activate it or its frontmatter.
Error Handling
Verification failures are host-side conditions rather than protocol errors.
They are handled as described in Integrity and Verification.