modelcontextprotocol / modelcontextprotocol/csharp-sdk
Add support for the Skills extension (SEP-2640)
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 theSKILL.mdURI, 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/readis an optional third method behind adirectoryReadcapability 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
- Separate package, or in Core?
- 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. ttlMs/cacheScopeonskills/listfollow the same 2026-07-28 gating astools/list(#1721). SEP-2640 currently words this as version-conditional; the Go SDK does the same thing.resources/directory/readis optional in the SEP. Leave it for a follow-up?
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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