MCP协议中如何提供自定义资源
MCP(Model Context Protocol)协议支持通过注册“资源(Resource)”的方式,向大语言模型提供结构化、最新、只读的上下文信息。自定义资源是开发者为特定业务需求封装的上下文片段,例如数据库记录、本地文件、第三方 API 返回值等,便于模型使用时理解外部环境。
资源的组成结构
一个完整的 MCP 自定义资源包括以下三个部分:
1. URI(统一资源标识符) 每个资源都使用类似 URI 的格式来唯一标识。例如:
file:///data/help.txt
表示本地文件sql://db/user/42
表示数据库中的某一行api://weather/beijing
表示某个 API 响应结果custom://myapp/recent_logs
表示你自定义生成的内容
2. metadata(元信息) 帮助模型快速判断资源用途,包括:
displayName
: 给人看的名称(如 “用户资料”)description
: 简要描述内容(如 “当前登录用户的最新信息”)mimeType
: 内容类型,例如text/plain
、application/json
、image/png
等
3. content(资源内容) 资源的实际内容。可以是:
- 文本:直接以字符串方式内联
- 二进制:Base64 编码,同时加上
encoding: "base64"
字段
示例结构如下:
{
"uri": "custom://user/profile",
"metadata": {
"displayName": "用户资料",
"description": "展示当前用户的个人信息",
"mimeType": "application/json"
},
"content": {
"name": "下xa2025",
"age": 30,
"location": "Taiwan"
}
}
如何注册自定义资源
MCP 本身是协议规范,具体的资源注册方式依赖于你使用的框架或模型系统(如 OpenAI Function Call/MCP、LangGraph、Lamini 等)。通常有以下几种注册方式:
1. 静态资源注册(配置/文件加载) 将资源以 JSON 文件方式编写,应用启动时加载到内存中注册。
2. 动态资源注册(代码生成) 例如 Python/Node.js 动态生成资源内容并封装成结构体。
Python 示例:
def get_custom_resource():
return {
"uri": "custom://news/latest",
"metadata": {
"displayName": "今日要闻",
"description": "从新华社拉取的新闻摘要",
"mimeType": "text/plain"
},
"content": "中共中央今日召开会议..."
}
3. 远程资源注册(通过 API 提供) 可用后端 API 统一封装资源,然后在前端或模型调用时请求资源。
使用建议与最佳实践
- 资源不要太大:每个资源建议小于 4KB,必要时分页。
- 命名清晰:URI 命名最好有分层逻辑,方便管理。
- mimeType 精准:有助于模型判断资源内容格式。
- 定期刷新:对接外部系统的数据资源要定期更新或缓存。