MCP
MCP 客户端
负责发现能力、调用工具,并把可用的 Skill 目录展示给模型的一侧。
客户端职责
MCP 客户端在 AI 应用或 agent 运行时里负责能力发现、调用和结果使用。它决定有哪些服务器可用,能调用哪些工具或资源,以及结果如何进入后续推理流程。
如何支持 Skill
支持 Skill 的客户端需要一套本地或托管 Skill 文件夹的生命周期。这个模式既适用于项目级 Skill,也适用于用户级、组织级或内置 Skill。
1
发现
扫描配置目录,找出包含 SKILL.md 的子文件夹。
2
解析
提取 frontmatter 元数据,校验必填字段,保留正文供激活使用。
3
展示
只把名称和简介展示给模型,做成一个精简目录。
4
激活
只有任务匹配 Skill,或者用户明确选中时,才加载完整说明。
5
保留
已激活的 Skill 要去重,并防止在上下文压缩时丢失。
客户端小模拟
这个小脚本演示客户端侧的判断:先看用户请求,再决定要不要调用能力,最后把结果整理成回答。
import { searchDocs } from "./search-docs.js"
const capabilities = [
{
name: "search_docs",
description: "搜索 MCP 和 Skill 文档页面。",
call: searchDocs
}
]
export function answerQuestion(question) {
const shouldUseDocs = /mcp|skill|server|client|protocol/i.test(question)
if (!shouldUseDocs) {
return "这个问题不需要文档搜索能力。"
}
const tool = capabilities.find((item) => item.name === "search_docs")
const result = tool.call({ query: question, limit: 3 })
if (result.error) {
return `工具失败:${result.error.message}`
}
if (result.results.length === 0) {
return "我搜了文档,但没有找到匹配页面。"
}
return result.results
.map((page) => `- ${page.title}: ${page.url}`)
.join("\n")
}客户端通常扫描哪里
本地客户端通常会扫描项目范围和用户范围。.agents/skills/ 这一约定有利于不同工具之间互通。
| 范围 | 示例路径 | 用途 |
|---|---|---|
| 项目 | <project>/.agents/skills/ | 团队共享的仓库级 Skill。 |
| 项目原生 | <project>/.client/skills/ | 客户端特定的项目 Skill。 |
| 用户 | ~/.agents/skills/ | 跨项目可用的个人 Skill。 |
| 用户原生 | ~/.client/skills/ | 客户端特定的个人 Skill。 |
信任与权限
项目级 Skill 来自仓库,可能并不可信。客户端在让 Skill 影响模型行为或读取资源前,应该考虑目录信任、诊断和权限白名单。
冲突规则同名情况下,项目 Skill 通常覆盖用户 Skill。
坏文件无效 Skill 要警告并跳过,不要静默加载。
资源访问把允许读取的 Skill 目录列进白名单。
云端 Agent云端沙箱看不到本地文件时,需要提前托管用户或组织 Skill。
新手检查项
- 客户端展示给模型的应该是精简能力描述,而不是整份实现代码。
- 客户端应该传结构化输入,而不是一大段模糊文字。
- 客户端应该区分“结果为空”和“服务端报错”。
- 客户端在跳页面时,应该保留语言选择和当前路由。