MCP之Prompt提示词工程
把用户内容按照提示词要求,转为一份通知单。生成通知消息:社区夏日纳凉晚会通知案例:梧桐树下的仲夏夜之梦傍晚六点,李阿姨的帆布包还没放下,就被社区公告栏前的人群围住了。红底黄字的海报边角被风吹得卷起,上面的卡通月亮正朝她眨眼睛 ——“梧桐社区 2024 夏日纳凉晚会” 的标题下,彩色粉笔勾勒的吉他和冰淇淋甜筒歪歪扭扭。“闺女,快帮我念念。” 穿碎花衬衫的张奶奶把老花镜推到头顶,手指戳着海报角落。
演示功能介绍
把用户内容按照提示词要求,转为一份通知单。
生成通知消息:
社区夏日纳凉晚会通知案例:梧桐树下的仲夏夜之梦
傍晚六点,李阿姨的帆布包还没放下,就被社区公告栏前的人群围住了。红底黄字的海报边角被风吹得卷起,上面的卡通月亮正朝她眨眼睛 ——“梧桐社区 2024 夏日纳凉晚会” 的标题下,彩色粉笔勾勒的吉他和冰淇淋甜筒歪歪扭扭。
“闺女,快帮我念念。” 穿碎花衬衫的张奶奶把老花镜推到头顶,手指戳着海报角落。我凑近看见打印的通知正文:“7 月 20 日晚 7 点,在社区中心小广场举办纳凉晚会,有歌舞表演、亲子游戏和露天电影。各家可自带零食,现场提供酸梅汤和西瓜。报名找 3 栋王阿姨,截止到 15 号……” 突然有穿蓝色校服的男孩挤进来,手里举着手机录像:“我要发给我妈看,她说要带自制的绿豆糕!”
回家路上,路灯把梧桐树影拉得老长。路过 4 栋时,听见王阿姨在楼道里喊:“二楼的陈师傅,您家孙女的古筝节目报上名啦!” 防盗门 “吱呀” 开了条缝,白发爷爷探出头:“几点开始啊?我得提前搬折叠椅占位置。”“跟通知上一样,七点开始,电影放到十点呢!” 王阿姨的声音混着锅铲翻炒声飘出来,“对了,您记得带驱蚊水!”
晚会当天傍晚,小广场的彩灯刚亮起,就有家长扛着野餐垫来了。穿汉服的小姑娘蹲在舞台边,往脸上贴星星贴纸,她妈妈举着通知复印件核对:“节目单上第三个就是你的琵琶独奏,别紧张啊。” 卖棉花糖的大叔推车经过,糖丝在暮色里拉出银线,有小孩追着喊:“叔叔,我要草莓味的!”
当社区合唱团的《茉莉花》响起时,我看见张奶奶正跟着节奏晃扇子。月光穿过梧桐叶隙落在她肩上,旁边的小男孩突然举起荧光棒:“奶奶你看,像不像通知里说的‘星光晚会’?” 远处的电影幕布亮起,《龙猫》的旋律混着此起彼伏的笑声,飘向挂满灯笼的树梢 —— 原来通知里那句 “带上好心情来赴约”,真的有人悄悄记在了心上。
最终的结果:
活动主题:社区夏日纳凉晚会
参与对象:社区居民及家庭
时间安排:7月20日晚7点至十点
举办地点:社区中心小广场
报名方式:联系3栋王阿姨,截止到15号
服务端
编写提示词模版
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("Prompt MCP Server")
@mcp.prompt()
def notify_prompt(notify:str):
'''
这个方法是一个提示方法,总结概要信息
: notify: 文章内容
: return: 提示信息
'''
return {
"role":"user",
"content": f"""
这是活动通知内容:“{notify}”,请按标准格式整理通知要点,规则如下:
提取活动关键信息。
每个信息点按以下格式总结:
活动主题:需体现活动核心内容与目的
参与对象:明确可参加的人群或范围
时间安排:活动开始至结束的具体时段
举办地点:活动实际开展的地址
报名方式:参与活动的申请途径及截止时间
总结语言需简洁明了,避免使用复杂句式。
"""
}
if __name__ == "__main__":
print(" Prompt MCP Server is running...")
mcp.run(transport="sse")
客户端
"""4.2 【资源类】Resource 客户端开发"""
import asyncio
import json
from contextlib import AsyncExitStack
from mcp import StdioServerParameters, stdio_client, ClientSession, ListResourcesResult, ListPromptsResult
from mcp.client.sse import sse_client
from openai import OpenAI
class MCPClient:
def __init__(self):
self.async_exit_stack = AsyncExitStack()
self.session = None
self.deepseek = OpenAI(
api_key="sk-3ad75cfac6b***159ab00f8d3d473b2a",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
self.prompts = None
async def connect_to_server(self, url: str):
# 一 、创建stdio_client
client = sse_client(url=url)
transport = await self.async_exit_stack.enter_async_context(client)
read_stream, write_stream = transport
# 二、创建会话client
client_session = ClientSession(read_stream, write_stream)
self.session = await self.async_exit_stack.enter_async_context(client_session)
# 三、初始化会话
await self.session.initialize()
async def execute(self, question: str):
# 一、获取server服务端中的提示类list_prompt列表 (需要改动)
list_prompt: ListPromptsResult = await self.session.list_prompts()
prompts = list_prompt.prompts
print("打印出获取的工具列表:", prompts)
self.prompts = {}
# 二、创建function calling 格式(大模型使用)、
prompts_tools = []
for resource in prompts:
name = resource.name
description = resource.description
prompts_tools.append(
{
"type": "function",
"function": {
"name": name,
"description": description,
"parameters": {
"type": "object",
"properties": {
"notify": {
"type": "string",
"description": "通知内容"
}
},
"required": ["notify"] # 告诉大模型这个字段必填
}
}
}
)
# 初始化resources属性
self.prompts[name] = {
"name": name,
"description": description,
"mime_type": None
}
# 三、 创建messages,deepseek大模型的格式
messages = [
{
"role": "user",
"content": question
}
]
# 四、调用deepseek大模型
deepseek_response = self.deepseek.chat.completions.create(
model="qwen-turbo",
messages=messages,
tools=prompts_tools
)
# 打印出大模型的决策结果
print("==== deepseek 响应持结果:", deepseek_response)
choice_result = deepseek_response.choices[0]
# 第二次调用大模型的前置参数
messages.append(choice_result.message.model_dump())
tool_call = choice_result.message.tool_calls[0]
print(" tool_call:", tool_call)
print("大模型决策的最终结果,工具名称:", tool_call.function.name, ",参数:", tool_call.function.arguments)
function_name = tool_call.function.name
arguments = json.loads(tool_call.function.arguments)
# arguments = {
# "notify": question # 键=参数名,值=字符串
# }
# 五、调用工具链 (需要改动)
prompts_result = await self.session.get_prompt(
name=function_name,
arguments=arguments
)
print("==== 工具调用结果:", prompts_result)
# 最终的结果
result = prompts_result.messages[0].content.text
print("==== 最终的结果:", result)
# 六、使用大模型生成最终的结果,并且使用语言模型生成最终的结果
messages.append({
"role": "tool",
"content": result,
"tool_call_id": tool_call.id
})
# 再次调用大模型
deepseek_response = self.deepseek.chat.completions.create(
model="qwen-turbo",
messages=messages,
tools=prompts_tools,
)
# 获取最终的结果
result = deepseek_response.choices[0].message.content
print("==== 最终的结果:", result)
# 关闭资源
async def aclose(self):
await self.async_exit_stack.aclose()
async def main():
client = MCPClient()
try:
await client.connect_to_server("http://localhost:8000/sse")
with open("prompt.data", "r", encoding="utf-8") as f:
content = f.read()
await client.execute(content)
except Exception as e:
print(f"连接失败: {e}")
return
finally:
await client.aclose()
if __name__ == "__main__":
asyncio.run(main())
1 第一次向大模型对话
messages = [
{
"role": "user",
"content": question
}
]
deepseek_response = self.deepseek.chat.completions.create(
model="qwen-turbo",
messages=messages,
tools=prompts_tools
)
prompts_tools.append(
{
"type": "function",
"function": {
"name": name,
"description": description,
"parameters": {
"type": "object",
"properties": {
"notify": {
"type": "string",
"description": "通知内容"
}
},
"required": ["notify"] # 告诉大模型这个字段必填
}
}
}
参数 messages : 传递一条message:角色是user,内容是 ‘文章内容’。
参数 tools:传递一个工具列表,模型可以调用这些工具。可以提供自定义工具或者功能工具。
其中的parameters是 以 JSON Schema 对象的形式描述。
大模型返回结果:
大模型决定需要调用tool,需要调用的函数名称,以及参数也帮你生成好了。
后续只需把 tool_calls[0].id 和这段结果通过 role="tool" 回传,即可让模型继续生成最终回复。
ChatCompletion(
id='chatcmpl-8cc61083-434c-40f4-8eb0-bb1d65a02f32',
model='qwen-turbo',
created=1763025938,
object='chat.completion',
service_tier=None,
system_fingerprint=None,
choices=[
Choice(
index=0,
finish_reason='tool_calls',
logprobs=None,
message=ChatCompletionMessage(
role='assistant',
content='',
function_call=None,
tool_calls=[
ChatCompletionMessageFunctionToolCall(
id='call_19050e78bae243ef87303c',
type='function',
function=Function(
name='notify_prompt',
arguments='{"notify":"社区夏日纳凉晚会通知案例:梧桐树下的仲夏夜之梦……(略)"}'
)
)
]
)
)
],
usage=CompletionUsage(
prompt_tokens=767,
completion_tokens=302,
total_tokens=1069,
prompt_tokens_details=PromptTokensDetails(audio_tokens=None, cached_tokens=0),
completion_tokens_details=None
)
)
调用MCP提示词模版,生成完整提示词
上一步大模型决策返回了需要调用的函数名称和参数。
function_name = tool_call.function.name
arguments = json.loads(tool_call.function.arguments)
prompts_result = await self.session.get_prompt(
name=function_name,
arguments=arguments
)

第二次对话大模型
messages.append({
"role": "tool",
"content": result,
"tool_call_id": tool_call.id
})
# 再次调用大模型
deepseek_response = self.deepseek.chat.completions.create(
model="qwen-turbo",
messages=messages,
tools=prompts_tools,
)
追加messages:
| 字段 | 必须值 | 作用 |
role |
"tool" |
声明这是“工具返回值”,不是用户也不是助手。 |
content |
result(字符串) |
真正的执行结果,模型会读它再组织语言。 |
tool_call_id |
tool_call.id |
把结果跟之前那条工具调用一一对应;若写错会报 400。 |
大模型返回结果
ChatCompletion(
id='chatcmpl-96785c8f-f969-4e07-bbe5-d524eb3854ed',
model='qwen-turbo',
created=1763027679,
object='chat.completion',
service_tier=None,
system_fingerprint=None,
choices=[
Choice(
index=0,
finish_reason='stop',
logprobs=None,
message=ChatCompletionMessage(
role='assistant',
content='活动主题:社区夏日纳凉晚会 \n'
'参与对象:社区居民及家庭 \n'
'时间安排:7月20日晚7点至十点 \n'
'举办地点:社区中心小广场 \n'
'报名方式:联系3栋王阿姨,截止到15号',
function_call=None,
tool_calls=None
)
)
],
usage=CompletionUsage(
prompt_tokens=1096,
completion_tokens=53,
total_tokens=1149,
prompt_tokens_details=PromptTokensDetails(audio_tokens=None, cached_tokens=0),
completion_tokens_details=None
)
)
The tool 调用流程:
-
向模型发起请求,请求中包含模型可以调用的工具。
-
接收模型发起的工具调用。
-
在应用程序端根据工具调用的输入执行代码。
-
使用工具的输出向模型发起第二次请求。
-
接收模型的最终响应(或更多工具调用)。

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)