MCP Server 是通过标准化的协议接口,向 AI 应用提供特定功能的程序,常见的包括文件系统服务器、GitHub 服务器等。
核心功能主要包含三类
- Tools:AI 应用可以根据用户请求主动决定调用这些功能,实现类似于向数据库写数据、调用外部 API、修改文件等操作。
- Resources:被动型的数据源,提供只读的访问权限,用来获取文件内容等。
- Prompts:预先构建好的指令模板,用来指导 AI 使用特定工具和资源来完成任务(MCP Server 官方说明书)。
MCP 使用 JSON Schema 来进行验证,每个工具只执行一项操作,输入和输出都是明确定义的。
Tools
| 方法 | 用途 | 返回内容 |
|---|---|---|
tools/list | 获取可用的工具以及描述 | 包含各种工具定义的列表 |
tools/call | 执行特定的工具/命令 | 工具执行结果 |
以下是一个简单的工具定义:
{
"name": "searchFlights",
"description": "Search for available flights",
"inputSchema": {
"type": "object",
"properties": {
"origin": {
"type": "string",
"description": "Departure city"
},
"destination": {
"type": "string",
"description": "Arrival city"
},
"date": {
"type": "string",
"format": "date",
"description": "Travel date"
}
},
"required": ["origin", "destination", "date"]
}
}
示例:
searchFlights(origin: "NYC", destination: "Barcelona", date: "2024-06-15")
通常 AI 应用可以自主地发现并调用这些工具,不过 MCP 通过多种机制来确保人类可以起到监督的作用,例如:
- UI 中显示各种可用工具,让用户能够决定在特殊的交互场景中是否使用某项工具。
- 针对工具执行的确认对话框。
- 对于涉及权限的操作进行预先审批。
- 工具调用的过程以及结果的日志记录。
Resources
为 AI 应用提供结构化的方式来获取信息,随后可以用于模型的输入数据或上下文信息。
资源支持两种发现模式:
- 直接资源:指向特定数据的固定 URI。
- 资源模板:用带参数的动态 URI 实现灵活的查询。
| 方法 | 用途 | 返回值 |
|---|---|---|
resources/list | 列出可用的直接资源 | 资源描述列表 |
resources/templates/list | 列出可用的资源模板 | 资源模板定义列表 |
resources/read | 检索资源内容 | 包含元数据的资源数据 |
resources/subscribe | 监控资源变化情况 | 订阅确认 |
示例:
- 日历数据(
calendar://events/2024):查看用户的可用时间。 - 证件(
file://Documents/Travel/IdCard.pdf):查看身份证复印件。
AI 应用可以获取这些资源并决定如何处理它们,模型就能了解各种资源的可用性,并据此做出更准确的决策。
资源模板示例:
{
"uriTemplate": "weather://forecast/{city}/{date}",
"name": "weather-forecast",
"title": "Weather Forecast",
"description": "Get weather forecast for any city and date",
"mimeType": "application/json"
}
{
"uriTemplate": "travel://flights/{origin}/{destination}",
"name": "flight-search",
"title": "Flight Search",
"description": "Search available flights between cities",
"mimeType": "application/json"
}
资源模板使查询更加灵活。对于天气数据,AI 应用可以查询任意城市/日期的天气预报组合;对于航班信息,可以查询任意两个城市机场之间的航线,为 AI 应用规划行程提供详细数据。
动态资源支持参数补全,例如输入 Par 作为 weather://forecast/{city} 的参数,很可能是想输入 Paris,系统可以帮助用户在不明确了解格式要求时查到准确的数据。
Prompts
提示词是一种结构化的模板,用来定义所需的输入内容以及交互方式,由用户来控制,需要用户主动触发,还具有情景感知能力,可以利用现有的资源和工具来构建完整的工作流程。与资源类似,提示词也支持参数补全,来帮助用户确定合适的参数。
示例:
{
"name": "plan-vacation",
"title": "Plan a vacation",
"description": "Guide through vacation planning process",
"arguments": [
{
"name": "destination",
"type": "string",
"required": true
},
{
"name": "duration",
"type": "number",
"description": "days"
},
{
"name": "budget",
"type": "number",
"required": false
},
{
"name": "interests",
"type": "array",
"items": {
"type": "string"
}
}
]
}
相比于无结构的自然语言,提示词系统能够实现:
- 选择“规划假期”这个模板。
- 然后结构化输入目的地、时间、预算以及偏好。
- 并执行基于模板的标准化工作流的执行方式。
这些提示由用户自行控制,需要用户主动触发才能显示,这常意味着开发者需要设计与其风格相协调的界面,通常包含以下原则:
- 可以轻松找到可用的 Prompt。
- 对每个 Prompt 用来做什么进行详细说明。
- 透明地展示 Prompt 依赖的底层模板。
虽然很多面试题中会有一个常见的“MCP 和 Skill 有什么区别”,但是从我的感觉来看,MCP 中的 Prompt 其实就类似于一个官方的 Skill,类似于一个说明书,给出你“装了这个 MCP Server 之后都可以做什么”的一个最佳实践。MCP官方文档中还有一段关于将多个 MCP Server 组合在一起的内容,我觉得更类似于当前语境下的 Skill。