这篇适合谁,读完能做到什么
这篇讲 MCP 的 sampling:服务器在工具调用过程中,怎样请客户端背后的大模型帮忙。读完你能说清它的请求和响应流程,知道客户端怎样打开这个功能,并能读懂文中的博客摘要例子。同时你也会明白,为什么新项目不应该再用它[1]。
先说状态:2026-07-28 规范已弃用 sampling
sampling 在 MCP 2026-07-28 中已经弃用,只为旧实现保留。新的服务器应该直接对接大模型厂商的 API[1][2]。规范保留它是为了兼容,并说明它可能在 2027 年 7 月 28 日当天或之后发布的第一个修订版里被移除[1]。这里的示例可能用的是实现 2025-11-25 的 SDK 接口[1]。
sampling 的流程
在旧实现里,sampling 让 MCP 服务器请求客户端管理的大模型帮忙[1]。以博客为例:用户让客户端写一篇博客,客户端调用服务器上的工具;服务器发出 sampling 请求,要一段摘要;客户端调用大模型,把摘要返回给服务器;服务器最后把草稿和摘要一起返回[1]。
请求和响应长什么样
sampling 请求是一条 JSON-RPC 消息,方法名是 sampling/createMessage。它的 params 里有 messages、modelPreferences、systemPrompt 和 maxTokens[1]。modelPreferences 只是一个建议,用户可以选择接受或改掉。systemPrompt 是系统提示词,给模型设定角色和指令;maxTokens 是建议用的 token 数[1]。
客户端调用模型后,把结果发回服务器。示例里,客户端根据服务器的偏好选了正在可用的 gpt-5.1 部署。偏好只是建议,所以客户端需要时可以换成其他可用部署[1]:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"role": "assistant",
"content": {
"type": "text",
"text": "Here's your abstract <ABSTRACT>"
},
"model": "gpt-5.1",
"stopReason": "endTurn"
}
}sampling 的消息不只限于文本,也能带图片和音频。图片内容的类型是 image,数据是 base64 编码,并带上 mimeType,如 image/jpeg;音频类似,类型是 audio,mimeType 如 audio/wav[1]。
客户端怎么开启 sampling
如果你只写服务器,客户端这边基本不用做什么。客户端需要在 capabilities 里声明 sampling[1]:
{
"capabilities": {
"sampling": {}
}
}例子:工具请客户端的大模型写摘要
示例工具叫 create_blog,接收标题、正文和一个 Context 参数。它先发出 sampling 请求,等待回答,再把结果返回[1]:
@mcp.tool()
async def create_blog(title: str, content: str, ctx: Context[ServerSession, None]) -> str:
"""Create a blog post and generate a summary"""工具内部先构造博客对象,写好提示词,再用 ctx.session.create_message 发出请求,并设置 max_tokens=100[1]:
post = BlogPost(
id=len(posts) + 1,
title=title,
content=content,
abstract=""
)
prompt = f"Create an abstract of the following blog post: title: {title} and draft: {content} "
result = await ctx.session.create_message(
messages=[
SamplingMessage(
role="user",
content=TextContent(type="text", text=prompt),
)
],
max_tokens=100,
)拿到结果后,示例把摘要存起来,再以 JSON 返回[1]:
post.abstract = result.content.text
posts.append(post)
# return the complete product
return json.dumps({
"id": post.title,
"abstract": post.abstract
})__main__ 里用 mcp.run(transport="streamable-http") 启动服务,运行命令是 python server.py[1]。
在 VS Code 里测试
先启动服务器,再把它加到 *mcp.json* 里,类型为 http,地址是 http://localhost:8000/mcp[1]:
"servers": {
"blog-server": {
"type": "http",
"url": "http://localhost:8000/mcp"
}
}然后输入一条提示词,比如[1]:
create a blog post named "Where Python comes from", the content is "Python is actually named after Monty Python Flying Circus"第一次测试时,要先接受一个额外的对话框,然后才会出现平时运行工具的确认框[1]。VS Code 里,「Configure Model Access」可以选择 GitHub Copilot 做 sampling 时能用哪些模型,「Show Sampling requests」可以查看最近的 sampling 请求[1]。
限制和常见问题
- sampling 已弃用,上面的代码主要用于读懂和维护旧项目[1][2]。
- 课程示例可能用的是实现
2025-11-25的 SDK 接口,它和2026-07-28规范不一定一致[1]。 - 模型偏好只是建议,实际运行的模型可能和请求里写的不同[1]。
下一步
新项目应直接调用大模型厂商的 API,而不是使用 sampling[1]。sampling 的当前状态以规范为准[2]。
本文改编自 Microsoft 开源课程 mcp-for-beginners 的 sampling 一课[1],原文以 MIT 许可证发布。
来源
- 1Sampling - delegate features to the ClientMicrosoft mcp-for-beginners (MIT)
- 2Sampling (MCP specification 2026-07-28)Model Context Protocol
引用本页: MCP 的 sampling 怎么用:让服务器请客户端调用大模型(已弃用). TellWorld, https://www.tellworld.net/zh/practice/practice-mcp-sampling. 更新于 2026-11-14