分页
协议修订:2024-11-05
模型上下文协议(MCP)支持对可能返回大量结果集的列表操作进行分页。分页允许服务器以较小的块返回结果,而不是一次性返回全部结果。
分页在通过互联网连接到外部服务时尤为重要,但对于本地集成也很有用,可以避免处理大型数据集时的性能问题。
分页模型
MCP 中的分页采用基于不透明游标的方式,而不是编号页面。
- 游标 是一个不透明的字符串令牌,表示结果集中的一个位置
- 页面大小 由服务器决定,客户端 不得 假设页面大小固定
响应格式
分页开始于服务器发送一个包含以下内容的 响应:
- 当前页面结果
- 如果存在更多结果,则包含一个可选的
nextCursor
字段
{
"jsonrpc": "2.0",
"id": "123",
"result": {
"resources": [...],
"nextCursor": "eyJwYWdlIjogM30="
}
}
请求格式
客户端在接收到游标后,可以通过发送包含该游标的请求来 继续 分页:
{
"jsonrpc": "2.0",
"method": "resources/list",
"params": {
"cursor": "eyJwYWdlIjogMn0="
}
}
分页流程
sequenceDiagram
participant Client as 客户端
participant Server as 服务器
Client->>Server: 列表请求(无游标)
loop 分页循环
Server-->>Client: 页面结果 + nextCursor
Client->>Server: 列表请求(带游标)
end
支持分页的操作
以下 MCP 操作支持分页:
resources/list
- 列出可用资源
resources/templates/list
- 列出资源模板
prompts/list
- 列出可用提示
tools/list
- 列出可用工具
实现指南
-
服务器 应该:
-
客户端 应该:
- 将缺少
nextCursor
视为结果的结束
- 支持分页和非分页流程
-
客户端 必须 将游标视为不透明令牌:
- 不要对游标格式做任何假设
- 不要尝试解析或修改游标
- 不要跨会话持久化游标
错误处理
无效游标 应该 返回错误代码 -32602(无效参数)。