用途
Skills over MCP 让 MCP 服务器发布“智能体技能”(每个技能是一个包含 SKILL.md 的文件夹),并让客户端列出、校验与加载这些技能。该页面是 v2 版 MCP TypeScript SDK 中对应能力的使用文档,能力以 @modelcontextprotocol/server 与 @modelcontextprotocol/client 的 ext/skills 子路径发布,遵循 SEP-2640 扩展(io.modelcontextprotocol/skills)。
主要能力
- 服务端发布技能:attach 技能扩展后,服务器对外提供技能目录与技能文件。技能来源支持磁盘文件夹(loadSkills)、代码内定义(memorySkillFiles)、自定义存储适配器(SkillFiles)以及按调用方动态生成(SkillSource);前三种支持 reload()。
- 客户端消费技能:SkillsClient 提供 list() 列出技能(读取 frontmatter 与文件清单)与 read() 读取 SKILL.md 及其引用文件,并校验大小、摘要与 frontmatter;校验失败抛出 SkillVerificationError。
- 校验与刷新:服务端可用 reload() 感知文件夹变更,并通过 notify.resourcesChanged() 通知已连接客户端;客户端可用 skipInvalid 跳过无效条目。
使用方式
- 确认 SDK 版本:Skills over MCP 仅存在于 v2;v1(@modelcontextprotocol/sdk)需先升级。可用 grep 检查 node_modules/@modelcontextprotocol/server/package.json 是否包含 "./ext/skills" 导出,或用 npm view @modelcontextprotocol/server@latest exports 查看最新版。
- 判断项目角色:服务端依赖 @modelcontextprotocol/server 并创建 McpServer;客户端或宿主依赖 @modelcontextprotocol/client 并创建 Client;两者兼有则分别按各自代码处理。
- 服务端:用 loadSkills 加载技能文件夹并 attach 到服务器,需在连接前完成;路径应基于模块位置解析而非 process.cwd(),例如 fileURLToPath(new URL('../skills', import.meta.url))。若服务器由工厂函数创建(serveStdio、createMcpHandler),应在工厂内 attach。
- 客户端:用 new SkillsClient(client) 包装已连接客户端,调用 list() 获取技能,经用户或宿主策略批准后再用 read() 加载 SKILL.md,需要时用 read(entry, path) 读取引用文件。
- 验证:服务端可用 InMemoryTransport 或 StdioClientTransport 连接真实客户端,遍历列出每个技能及其文件并逐一 read;客户端应验证宿主能列出技能、加载前询问、并以 verified: true 读取 SKILL.md。
适用场景
适合使用 MCP TypeScript SDK v2 构建 MCP 服务器并希望向智能体发布可复用技能目录的开发者,以及构建 MCP 宿主或客户端、需要从多个服务器发现、校验并加载技能的项目。也适用于需要按调用方定制技能或从对象存储、数据库、Git 仓库提供技能的场景。
限制与注意事项
- 仅 v2 支持,v1 不提供该能力。
- 不得手写 skills/list 处理器或 skill:// 资源作为替代;应仅通过 SkillsExtension 提供的 API 实现。
- loadSkills 会跳过名称与文件夹不一致或包含符号链接的技能,仅发出警告;以点开头的文件与文件夹会被静默跳过,strict: true 也无法捕获。
- 技能目录保留加载时的摘要,磁盘上后续编辑需 reload() 后才生效。
- 无文件系统的运行时(如 Workers)不能使用 loadSkills,应改用 memorySkillFiles 或 SkillFiles 适配器。
- 客户端不应使用 client.readResource() 直接读取技能文件,因其跳过校验;应使用 skills.read()。