Repository navigation
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Picked masnwilliams to review these related PRs (kernel/skills#49, #260): touched the changed code in |
masnwilliams
left a comment
There was a problem hiding this comment.
lgtm. two small things worth fixing before merge, plus an fyi.
fix before merge
- digest/size vs served text:
build-skills.mjshashes the raw bytes but servesnew TextDecoder("utf-8", { fatal: true }).decode(bytes), which strips a UTF-8 BOM by default. aSKILL.mdsaved with a BOM would advertise a size/digest that doesn't match whatresources/readreturns.ignoreBOM: truefixes it. (latent today, the current file has no BOM.) - cache hints on skill files:
skills/list/skills/getreturnttlMs: 1h, cacheScope: "public", but theskill://resources get the default0/privateonresources/read. passingcacheHint: SKILLS_CACHEtoregisterResourcemakes them consistent (and typingSKILLS_CACHEas the sdk'sCacheHintwould be nice).
fyi / follow-up
@modelcontextprotocol/server 2.4.0 (out 2026-10-23) ships a built-in skills extension at @modelcontextprotocol/server/ext/skills: SkillsExtension / SkillCatalog.load(memorySkillFiles(...)), skillEntry(), SKILL_LIMITS, typed cache hints, pagination, directoryRead. once we bump from 2.0.0 most of skills/index.ts, types.ts, and the digest/frontmatter/limit logic in the build script could go away, and the generated module could just be a path → content record. not worth blocking this on a 4-minor sdk bump (and attach() is still @experimental), but worth a follow-up.
nits, take or leave
BundledSkill.nameduplicatesfrontmatter.name- there are three frontmatter regexes across the build script and two tests; the one in
prompts.test.tsdoesn't handle CRLF - the check-or-write tail of
build-skills.mjsis copied frombuild-managed-auth-app.mjs; could be a shared helper - the
server/discovertest inskills.test.tsoverlaps the new modern-era test indual-era.test.ts
Summary
Adds the MCP Skills extension (
io.modelcontextprotocol/skills, SEP-2640, Final). The server now ships thekernel-mcpskill from kernel/skills along with its tools, so hosts that support the extension can find and load it from the server they're connected to.scripts/build-skills.mjsfetches kernel/skills at a pinned commit and writessrc/lib/mcp/skills/generated/skills.ts. That module holds each skill's verbatim frontmatter and its files, with sha256 digests and sizes. It's committed, the same way the managed-auth App bundle is, so neither deploys nor tests reach out to GitHub.bun run check:skillsruns in CI and fails if the module doesn't match the pin. Symlinks and skills over the spec's per-skill limits are rejected.registerSkillsdeclares the extension (withoutdirectoryRead) and implementsskills/listandskills/get. Unknown URIs return-32602, as the spec requires. Every skill file is registered as askill://<name>/<path>resource.SKILL.mdhas the skill's name and description, so clients without skills support can still see it inresources/list.Pin
SKILLS_COMMITpoints at the head of kernel/skills#49, which moves the skill out ofgrok/intoskills/kernel-mcp/. After #49 merges I'll bump the pin to the merge commit and regenerate.Testing
bun test: everything passes, including new unit tests and a/mcproute test for both v1 (initialize) and v2 (server/discover, 2026-07-28) clients.bunx tsc --noEmitis clean.bun run check:skillspasses.--method skills/list --verifyandskills/get --verify, run against the test HTTP fixture: verified 1 skill and 1 file with no conformance errors.format:checkstill flagsAGENTS.md, which was already failing before this change.Client support
The spec is final, but few hosts load skills from servers yet. MCP Inspector, fast-agent and MCPJam have partial support, and ChatGPT imports them when a plugin is submitted. Claude, Cursor and VS Code don't support it yet. This lays the groundwork; the plugin marketplaces are still the main way people get the skill.
Reviewed with sol-loop: 1 round with openai-codex/gpt-6.1-sol on extra-high reasoning. Sol verdict: approved.