MCP - AI智能体调用 MCP Serverr - Streamable HTTP(七)
前文展示的是 AI 智能体调用 stdio 的 MCP Server,这里展示调用 Streamable HTTP的 MCP Server。
一、在 test 目录中添加 agent_http.py 文件
并添加如下代码:
import asyncio
import os
from openai import OpenAI
from dotenv import load_dotenv
from contextlib import AsyncExitStack
import json
from fastmcp import Client
# 加载 .env 文件
load_dotenv()
# 使用 config 配置方式
config = {
"mcpServers": {
"server": {
"url": "http://127.0.0.1:3002/mcp_atlas", # 服务器地址,需要根据 MCP Server 配置修改
"transport": "streamable-http"
}
}
}
class MCPClient:
def __init__(self):
"""初始化 MCP 客户端"""
self.exit_stack = AsyncExitStack()
self.api_key = os.getenv("API_KEY") # 读取 OpenAI API Key
self.base_url = os.getenv("BASE_URL") # 读取 BASE URL
self.model = os.getenv("MODEL") # 读取 model
if not self.api_key:
raise ValueError("未找到 API KEY. 请在 .env 文件中配置 API_KEY")
self.client = OpenAI(api_key=self.api_key, base_url=self.base_url)
async def process_query(self, query: str) -> str:
"""
调用大模型处理用户查询并根据返回的 tools 列表调用对应工具
"""
messages = [{"role": "user", "content": query}]
# 获取工具列表
available_tools = [{
"type": "function",
"function": {
"name": tool.name,
"description": tool.description,
"input_schema": tool.inputSchema
}
} for tool in self.tools]
print(f"debug info === MCP server 返回的工具列表 available_tools:{available_tools}")
print(f"debug info === 拼接用户输入后的 messages:{messages}")
# 请求 OpenAI 模型处理
response = self.client.chat.completions.create(
model=self.model,
messages=messages,
tools=available_tools
)
# 处理返回的内容
content = response.choices[0]
print(f"debug info === AI 返回的 content: {content}")
if content.finish_reason == "tool_calls":
# 执行工具调用
tool_call = content.message.tool_calls[0]
tool_name = tool_call.function.name
tool_args = json.loads(tool_call.function.arguments)
# 执行工具
result = await self.session.call_tool(tool_name, tool_args)
print(f"\n\n[Calling tool {tool_name} with args {tool_args}]\n\n")
# 将模型返回的原始消息和工具执行的结果都添加到 messages 中
messages.append(content.message.model_dump())
messages.append({
"role": "tool",
"content": result.content[0].text,
"tool_call_id": tool_call.id,
})
# 将上面的结果再返回给大模型生产最终的结果
response = self.client.chat.completions.create(
model=self.model,
messages=messages,
)
return response.choices[0].message.content
return content.message.content
async def chat_loop(self):
"""运行交互式聊天循环"""
print("MCP 客户端已启动!输入 'exit' 退出")
while True:
try:
query = input("问: ").strip()
if query.lower() == 'exit':
break
response = await self.process_query(query)
print(f"AI回复: {response}")
except Exception as e:
print(f"发生错误: {str(e)}")
async def clean(self):
"""清理资源"""
await self.exit_stack.aclose()
async def connect_to_server(self, server_script_path: str):
"""连接到 MCP 服务器"""
self.session = await self.exit_stack.enter_async_context(Client(config))
async def list_tools(self):
"""列出所有工具"""
# 列出 MCP 服务器上的工具
response = await self.session.list_tools()
self.tools = response
async def main():
# 启动并初始化 MCP 客户端
client = MCPClient()
try:
# 连接到 MCP 服务器
await client.connect_to_server('server.py')
# 列出 MCP 服务器上的工具
await client.list_tools()
# 运行交互式聊天循环,处理用户对话
await client.chat_loop()
finally:
# 清理资源
await client.clean()
if __name__ == "__main__":
asyncio.run(main())
注意:同样要修改:
- tool/math_tools.py
- 添加 .env 文件
修改具体内容参见: MCP - AI智能体调用 MCP Serverr - Stdio(六)
二、效果展示
2.1 启动 server
运行如下命令启动 MCP Sever
python server.py
2.2 启动 agent
运行如下命令启动 agent
python agent_http.py
运行后如下图:

源代码: https://pan.baidu.com/s/1DlzeeQuZ4dHhF3CfQKYQng?pwd=gbcr 提取码: gbcr

浙公网安备 33010602011771号