modelcontextprotocol / modelcontextprotocol/csharp-sdk

Add support for the Skills extension (SEP-2640)

Open
#1,863 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
C#
Stars
4.5k
Forks
814
Avg merge
9d 19h
Merged PRs (30d)
4

Description

Summary

Add support for the MCP Skills extension, SEP-2640 (io.modelcontextprotocol/skills, accepted 2026-09-01), so that .NET servers can publish Agent Skills and .NET hosts can discover, retrieve, and verify them.

Specification: https://github.com/modelcontextprotocol/ext-skills/blob/main/specification/stable/skills.mdx
SEP: https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2640

What the extension defines

  • skills/list: paginated enumeration of the skills a server serves. Each entry carries the SKILL.md URI, the file's YAML frontmatter rendered as a JSON object, and a complete manifest of the skill's files with SHA-256 digests and sizes (or the string "dynamic" for generated content).
  • skills/get: the same entry for a single skill by URI, including skills a server serves but does not list.
  • Skill files themselves are ordinary resources read through resources/read. Hosts verify every read against the manifest, and treat an unlisted file as a change to the skill.
  • resources/directory/read is an optional third method behind a directoryRead capability setting.

Why now

The working group asked for reference implementations in Tier 1 SDKs. The Go SDK has one in flight, and the conformance suite has scenarios for it (modelcontextprotocol/conformance#330). Two PRs against this repo exist: #1856 and a fuller one I am opening alongside this issue.

Proposed shape

A separate package, ModelContextProtocol.Extensions.Skills, matching how Extensions.Apps and Extensions.Tasks ship. It needs one small Core change: the constructors of PaginatedRequestParams and PaginatedResult are private protected, so no package outside Core can implement a paginated method.

Server side: an IMcpSkillCatalog behind skills/list and skills/get, plus an authoring model that reads a skill directory (or in-memory files), parses the SKILL.md frontmatter, computes the manifest from the bytes it serves, and registers the file resources, so a server author points at a directory of skills and is done.

Client side: SupportsSkills, ListSkillsAsync, GetSkillAsync, and a verified read that checks size and digest against the held entry and refuses unlisted files.

Open questions for maintainers

  1. Separate package, or in Core?
  2. Is a strict YAML-subset frontmatter reader acceptable, given the SDK takes no third-party dependencies? The alternative is requiring authors to restate the frontmatter as a JsonObject, which duplicates what is already in the file.
  3. ttlMs / cacheScope on skills/list follow the same 2026-07-28 gating as tools/list (#1721). SEP-2640 currently words this as version-conditional; the Go SDK does the same thing.
  4. resources/directory/read is optional in the SEP. Leave it for a follow-up?

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by comparing the Extensions.Apps and Extensions.Tasks packages, then inspect Core's PaginatedRequestParams and PaginatedResult constructors. Review the proposed IMcpSkillCatalog, client methods, and conformance scenarios for the required skills/list, skills/get, and verified resource reads. Done means the package shape and open questions are resolved and the listed server and client capabilities are covered.

Written by the indexing model from the issue text.

Assessment

Tech stack
csharp
Domain
api, backend
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.