mcp openapi演示
模型上下文协议
通过“LLM函数调用”机制自动触发MCP的小演示。
📂 项目目录
mcp-openapi-demo/
│
├── server.js # Node.js tarafı → MCP Server (Petstore API)
├── package.json # Node bağımlılıkları
├── .env # Ortam değişkenleri (API anahtarı vs.)
└── python-client/
├── client.py # Python tarafı → MCP Client (OpenAI entegrasyonu ile)项目如何运作
👉 只需“查找可用宠物”。 👉 模型会自行调用函数。 👉 Python代码将捕获此函数调用,将其重定向到MCP服务器,然后得到响应。 👉 将结果返回到模型并打印最终答案。
______________________________________________________________________
🚀 步骤1:启动MCP服务器
首先打开Node.js页面并在终端:
cd mcp-openapi-demo
node server.js如果是真的:
🚀 MCP Server running on http://localhost:4000你必须看到你的留言✅
______________________________________________________________________
🚀 步骤2:设置Python环境
转到 Python 客户端文件夹:
cd python-client
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install requests openai______________________________________________________________________
🚀 步骤3:设置OpenAI API密钥
API 密钥 .env 你可以写文件:
OPENAI_API_KEY=senin_api_key在Python代码中获取密钥 python-dotenv 包装时:
pip install python-dotenvhave的常用口语形式 client.py 添加如下:
from dotenv import load_dotenv
load_dotenv()现在的钥匙是自动的。 .env 将从档案中提取。
______________________________________________________________________
🚀 步骤4:启动Python客户端
python client.py预期结果:
- 首先 来自Petstore API的JSON “可用宠物”列表。
- 然后 OpenAI模型的自然语言摘要 → “有20种宠物可供选择,大多数是狗和猫……”吉比。
📌 总结:
- 由 Node.js 开发 → Petstore MCP Server
- Python 方面 → 从 MCP 获取数据,并向 OpenAI 模型提供评论
LLM函数调用机制是如何工作的?
👉 模型 "find_available_pets" 调用函数 你写的 prompt + 你给的 tools 由于定义 正在发生。所以这个电话 作为对API调用的响应,在模型的输出中 正在发生。
📍 在哪里?
OpenAI 的 chat.completions.create 会在答案。 例如在Python中:
from openai import OpenAI
client = OpenAI()
tools = [
{
"type": "function",
"function": {
"name": "find_available_pets",
"description": "Find pets in the Petstore API by status",
"parameters": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": ["available", "pending", "sold"]
}
},
"required": ["status"],
},
}
}
]
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "user", "content": "Can you show me all available pets?"}
],
tools=tools
)
print(response.choices[0].message)📍 模特的反应如何?
模型不会返回纯文本, 函数调用döner:
{
"role": "assistant",
"tool_calls": [
{
"id": "call_1",
"type": "function",
"function": {
"name": "find_available_pets",
"arguments": "{ \"status\": \"available\" }"
}
}
]
}📍 你在做什么?
- 这里
function.namehave的常用口语形式arguments你会得到它的价值。
- 将此信息发送到MCP服务器 JSON-RPC请求 发送(
pet/findByStatus).
- 返回的答案再次给模型
client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "user", "content": "Can you show me all available pets?"},
response.choices[0].message, # function call çıktısı
{
"role": "tool",
"tool_call_id": response.choices[0].message.tool_calls[0].id,
"content": json.dumps(mcp_result)
}
]
)✅ 调用“find_available_pets” 这不是你的代码,而是模型的输出。 你只需要抓住这个函数调用。 你真的在运行 (发送到MCP)
完整字符串 :
用户 → LLM → 函数调用 → MCP → 结果 → 再次 LLM
工具定义中的描述是否会影响过程?
没错✅ — 工具定义 描述 这是过程中最关键的部分之一。
LLM接收用户的消息,然后你给他 工具模式是的。 工具'un 名称, 参数 尤其是 描述 部分允许模型决定在什么情况下调用该工具。
🔎 具体影响因素:
- 工具名称(
name)
- 模型的“关键词”。 - 但是,单靠它是不够的,因为用户可能不总是说“找到宠物”。 - 例如:用户 *“让我看看所有可供收养的狗”* 课程 → 查看模型描述并匹配“此工具为采用带来了可用的宠物”。
- Description(描述)
- 这是模型决策过程中最强的信号。
- 你在这里写的描述越清晰,任务定义越好,模型就会做出更准确的决定。
- Örn:
"description": "Find pets that are currently available in the Petstore API. Use this function if the user asks about pets, animals, or available pets."如果你这样写,模型会更准确地触发。
- 如果描述较弱,模型可能选择了错误的工具,或者根本没有调用工具。
- 参数(图)
- 允许模型生成正确的参数。 - Mesela枚举 ["available", "pending", "sold"] 如果是这样,模型将选择这三个值之一。 - 这将使您免受不必要的验证。
📌 摘要 :
- 是的,描述直接影响。
- 描述对于模型理解“哪个工具起作用”至关重要。
- 写得好 description → 选择正确的工具和正确的参数。
