当前位置: 首页 > news >正文

[具身智能-357]:示例代码:MCP Client与用户通过CLI交互 + Deekseek大模型决策 + MCP Server计算加法、减法等运算

这是一个完整的、可运行的示例项目,基于MCP (Model Context Protocol) 官方 Python SDK+DeepSeek API实现。项目分为服务端(MCP Server)和客户端(CLI + LLM Tool Calling 循环)两部分。


📦 环境准备

pip install mcp openai # 确保已安装 Python 3.10+

在终端设置 DeepSeek API Key(替换为你的真实 Key):

export DEEPSEEK_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxxxx"

🖥️ 1. MCP Server 端 (math_server.py)

提供计算能力,通过 MCP 协议暴露calculate工具。

# math_server.py from mcp.server.fastmcp import FastMCP mcp = FastMCP("MathCalculator") @mcp.tool() def calculate(operation: str, a: float, b: float) -> str: """执行基础数学运算。operation 可选值: add, subtract, multiply, divide""" try: if operation == "add": return f"{a} + {b} = {a + b}" elif operation == "subtract": return f"{a} - {b} = {a - b}" elif operation == "multiply": return f"{a} * {b} = {a * b}" elif operation == "divide": if b == 0: return "❌ 错误:除数不能为 0" return f"{a} / {b} = {a / b}" else: return f"❌ 不支持的运算类型: {operation}" except Exception as e: return f"❌ 计算异常: {str(e)}" if __name__ == "__main__": print("🚀 MCP Math Server 启动中...") mcp.run() "启动一个Web Service"

💻 2. MCP Client + CLI + DeepSeek (client.py)

通过 CLI 接收用户输入,调用DeepSeek 进行意图识别与工具调度(DeepSeek进行调度指示,并不直接驱动MCP Server执行,拿到结果;驱动MCP Server执行是MCP Client的职责)并与 MCP Server 交互。

# client.py import asyncio import json import os from mcp.client.stdio import StdioServerParameters, stdio_client from mcp.client.session import ClientSession from openai import AsyncOpenAI # 配置 DeepSeek API DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY") if not DEEPSEEK_API_KEY: raise ValueError("请设置环境变量 DEEPSEEK_API_KEY") llm_client = AsyncOpenAI( api_key=DEEPSEEK_API_KEY, base_url="https://api.deepseek.com" ) SYSTEM_PROMPT = """你是一个数学计算助手。当用户提出计算需求时,请使用提供的 calculate 工具。 工具参数说明: - operation: 运算类型 (add / subtract / multiply / divide) - a, b: 参与计算的数字 请直接返回工具调用结果,不要自行心算。""" async def run_mcp_math_cli(): # 1. 配置 MCP Server 启动参数 server_params = StdioServerParameters(command="python", args=["math_server.py"]) print("="*50) print("🤖 MCP Math Client (Powered by DeepSeek)") print("💡 输入数学问题,如: '帮我算一下 23.5 加 47',输入 'quit' 退出。") print("="*50) # 2. 建立 stdio 连接并初始化 MCP Session async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() # 3. 获取并转换 MCP 工具格式为 OpenAI/DeepSeek 兼容格式 tools_res = await session.list_tools() openai_tools = [ { "type": "function", "function": { "name": tool.name, "description": tool.description or "", "parameters": tool.inputSchema # MCP 原生即为 JSON Schema } } for tool in tools_res.tools ] messages = [{"role": "system", "content": SYSTEM_PROMPT}] # 4. CLI 交互主循环 while True: try: user_input = input("\n👤 你: ").strip() except EOFError: break if user_input.lower() in ("quit", "exit", "q"): print("👋 感谢使用,再见!") break if not user_input: continue messages.append({"role": "user", "content": user_input}) # 5. LLM Tool Calling 循环 while True: response = await llm_client.chat.completions.create( model="deepseek-chat", messages=messages, tools=openai_tools, tool_choice="auto" ) choice = response.choices[0] msg = choice.message # 情况A:LLM 返回最终文本答案 if msg.content: messages.append({"role": "assistant", "content": msg.content}) print(f"🤖 DeepSeek: {msg.content}") break # 情况B:LLM 请求调用工具 if msg.tool_calls: for tool_call in msg.tool_calls: func_name = tool_call.function.name func_args = json.loads(tool_call.function.arguments) print(f"🔧 [调度] 调用 {func_name}({func_args})") try: # 调用 MCP Server 工具 result = await session.call_tool(func_name, func_args) # MCP 返回结果通常是 TextContent 列表 tool_output = result.content[0].text if result.content else "无输出" except Exception as e: tool_output = f"❌ 工具执行失败: {str(e)}" # 将工具结果追加到对话上下文 messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": tool_output }) # 继续循环,让 LLM 基于工具结果生成最终回复 if __name__ == "__main__": asyncio.run(run_mcp_math_cli())

🚀 运行方式

打开两个终端窗口(或在一个终端后台运行 Server):

终端 1:启动 MCP Server

python math_server.py

终端 2:启动 Client 并与用户交互

python client.py

交互示例:

👤 你: 帮我把 150 减去 45.5,然后再乘以 2 🔧 [调度] 调用 calculate({'operation': 'subtract', 'a': 150.0, 'b': 45.5}) 🔧 [调度] 调用 calculate({'operation': 'multiply', 'a': 104.5, 'b': 2.0}) 🤖 DeepSeek: 150 减去 45.5 等于 104.5,再乘以 2 的结果是 209.0。

🔍 架构与关键设计说明

模块职责技术实现要点
MCP Server暴露计算能力,无状态、跨语言可调用使用FastMCP快速声明工具,自动将函数签名转为 JSON Schema
Stdio 通信客户端与子进程 Server 通信stdio_client通过标准输入/输出传递 JSON-RPC 消息,无需网络端口
LLM 决策层意图识别、参数提取、多轮工具调用DeepSeekdeepseek-chat原生支持 Function Calling,通过tool_choice="auto"自动触发
上下文管理维护system -> user -> assistant -> tool消息链严格遵循 OpenAI Chat Completion 规范,确保 LLM 能接收工具返回结果并生成自然语言
容错与安全防止除零错误、异常捕获、无限循环防护Server 端校验b=0,Client 端捕获Exception并注入错误提示给 LLM

🛠 扩展建议

  1. 支持复杂表达式:当前为二元运算,可改造为calculate(expression: str)并调用sympynumexpr解析。
  2. 并发请求:MCP Server 默认单线程,生产环境可改用mcp.server.sse.SseServerTransport暴露 HTTP/SSE 端点,支持多 Client 并发。
  3. 本地模型替换:将AsyncOpenAIbase_url指向OllamavLLM,即可无缝切换至本地部署的 Qwen/GLM/DeepSeek 开源模型。
  4. 工具权限控制:在session.call_tool前加入参数白名单校验或频率限制,防止恶意注入。
http://www.jsqmd.com/news/628638/

相关文章:

  • 上海地区电动葫芦生产厂家选购,怎么选到性价比高的 - mypinpai
  • 高效弹幕格式转换工具:一键实现XML到ASS的专业级转换方案
  • 2026年江苏直埋保温管、预制聚氨酯管道与热力工程系统集成方案深度横评 - 精选优质企业推荐榜
  • 分享上海西点好习惯AI夏令营军事活动,在各地区怎么选择 - 工业品牌热点
  • 如何快速部署XXMI启动器:终极多游戏模组管理完整指南
  • 魔兽地图开发的终极格式转换利器:W3x2Lni完整指南
  • FanControl:让电脑风扇控制变得简单又智能的Windows神器
  • 上海西点好习惯AI夏令营如何保障孩子健康,2026年靠谱的夏令营推荐 - 工业推荐榜
  • 架构积累-依赖注入和SOLID原则
  • 离开海南,奔赴一场与春天的约会
  • 暗黑破坏神2存档编辑器:简化单机游戏体验的现代化解决方案
  • 基于深度强化学习的混合动力汽车能量管理策略 ,混动汽车能量管理模型,混合动力汽车能量管理
  • 上海好用的品牌全策划有哪些,价格贵不贵 - 工业品网
  • 2026年直埋保温管与预制管道系统:五大厂商热力工程解决方案深度对标 - 精选优质企业推荐榜
  • 从‘Hello World’到高并发:用C# Concurrent集合(ConcurrentBag, ConcurrentDictionary)搞定多线程数据共享
  • 2026年全国超声波清洗机认证厂家排名,这些品牌值得推荐 - 工业设备
  • Cursor Free VIP:突破AI编程助手限制的终极解决方案
  • 继承管理化技术中的继承计划继承实施继承验证
  • 如何永久保存微信聊天记录:WeChatMsg终极指南与年度报告生成教程
  • AI元人文之存在论
  • 2026年上海品牌定位公司哪家好,上海硕呈实力大揭秘 - 工业推荐榜
  • 2026年深聊服务不错的加密软件公司,如何选择 - myqiye
  • 你能被装进一个文件里吗?——7 万人把同事蒸馏成了 AI
  • 伏羲天气预报开源镜像免配置:复旦大学FuXi气象大模型快速上手指南
  • 2026年全国靠谱的能做本地GEO运营的公司推荐排名 - 工业品牌热点
  • 2026年江苏直埋保温管与预制管道系统深度横评:五大厂商实力对比与选购指南 - 精选优质企业推荐榜
  • 【神经网络学习笔记】基于神经网络学习的水课分辨方法
  • Phi-3-mini-128k-instruct新手教程:从镜像拉取、服务启动到首次提问全流程
  • 轻量化人工智能模型对比:Phi-4-mini-reasoning 3.8B在边缘计算场景的效果展示
  • 嵌入式气象计算库:Arduino轻量级气象参数推演