29. MCP协议,让大模型自己调用工具 29. MCP协议让大模型自己调用工具一、什么是MCP协议MCPModel Context Protocol模型上下文协议是一种开放标准协议旨在让大语言模型LLM能够直接调用外部工具、API或数据库。想象一下传统的AI助手只能根据训练数据回答问题但有了MCP协议大模型可以像人类一样“伸手”去查资料、算数字、发消息——它不再是一个只会说话的“书生”而是一个能动手的“全能助手”。为什么需要MCP因为大模型本身有局限性它无法访问实时数据、无法执行精确计算、也无法与外部系统交互。MCP协议通过定义一套标准接口让模型可以请求“工具”来完成任务就像我们使用计算器或搜索引擎一样。## 二、MCP协议的核心概念MCP协议包含三个主要部分1.工具注册开发者定义一组工具如“获取天气”、“计算数学表达式”并描述它们的输入输出格式。2.模型调用大模型根据用户问题自动选择合适的工具并生成调用参数。3.结果整合工具返回结果后模型将结果融入回答中。MCP使用JSON格式来描述工具类似于OpenAI的Function Calling但更加标准化和通用化。下面我们通过代码示例来理解。## 三、基础示例让模型调用计算器我们先实现一个最简单的MCP场景让大模型调用一个加法计算器。python# 示例1基础MCP工具调用import json# 1. 定义工具描述MCP标准格式tools [ { name: calculator, description: 执行数学运算如加法、减法, parameters: { type: object, properties: { a: {type: number, description: 第一个数字}, b: {type: number, description: 第二个数字}, operation: { type: string, enum: [add, subtract], description: 运算类型 } }, required: [a, b, operation] } }]# 2. 实现工具函数def calculator_tool(a: float, b: float, operation: str) - float: 实际的工具逻辑 if operation add: return a b elif operation subtract: return a - b else: raise ValueError(f不支持的操作: {operation})# 3. 模拟大模型调用过程def simulate_model_call(user_input: str): 模拟大模型解析用户输入并选择工具 # 简单的规则匹配实际应由LLM完成 if 加 in user_input or 加法 in user_input: # 提取数字简化处理 parts user_input.split() numbers [float(p) for p in parts if p.replace(.,).isdigit()] if len(numbers) 2: # 生成工具调用请求 tool_call { name: calculator, arguments: { a: numbers[0], b: numbers[1], operation: add } } # 执行工具 result calculator_tool(**tool_call[arguments]) return f计算结果{numbers[0]} {numbers[1]} {result} return 我无法理解您的请求请尝试使用数字1 加 数字2的格式。# 测试print(用户3 加 5)print(模型, simulate_model_call(3 加 5))print()print(用户10 加 20)print(模型, simulate_model_call(10 加 20))运行结果用户3 加 5模型计算结果3.0 5.0 8.0用户10 加 20模型计算结果10.0 20.0 20.0这个例子展示了MCP的核心流程模型识别用户意图 - 选择工具 - 执行工具 - 返回结果。虽然这里是用规则模拟的但在真实场景中大模型会通过理解自然语言来完成这个选择过程。## 四、进阶示例多工具协作的MCP实现在实际应用中MCP往往需要处理多个工具并且工具之间可能协同工作。下面我们实现一个更复杂的场景天气查询 旅行建议。python# 示例2MCP多工具协同调用import jsonfrom datetime import datetime# 定义两个工具tools [ { name: get_weather, description: 查询指定城市的当前天气, parameters: { type: object, properties: { city: {type: string, description: 城市名称如北京、上海} }, required: [city] } }, { name: travel_suggestion, description: 根据天气提供旅行建议, parameters: { type: object, properties: { city: {type: string, description: 城市名称}, weather: {type: string, description: 天气状况如晴天、雨} }, required: [city, weather] } }]# 工具实现def get_weather(city: str) - dict: 模拟天气查询实际应调用API # 模拟数据 weather_data { 北京: {temp: 25, condition: 晴天, humidity: 30}, 上海: {temp: 22, condition: 多云, humidity: 60}, 广州: {temp: 30, condition: 雨, humidity: 80} } if city in weather_data: return weather_data[city] else: return {temp: 20, condition: 未知, humidity: 50}def travel_suggestion(city: str, weather: str) - str: 根据天气提供旅行建议 suggestions { 晴天: f今天{city}天气晴朗建议去户外景点游玩记得涂防晒霜, 多云: f今天{city}多云适合散步或骑车温度舒适。, 雨: f今天{city}有雨建议带伞可以去博物馆或商场。, 未知: f{city}天气数据不可用建议查看天气预报后决定。 } return suggestions.get(weather, 暂无建议)# 模拟MCP执行流程def mcp_executor(user_input: str): 模拟MCP协议的执行过程 # 第一步LLM解析意图这里用规则模拟 if 天气 in user_input and 建议 in user_input: # 提取城市名简化处理 for city in [北京, 上海, 广州]: if city in user_input: # 调用第一个工具查天气 weather_data get_weather(city) weather_condition weather_data[condition] # 调用第二个工具根据天气给建议 suggestion travel_suggestion(city, weather_condition) # 整合结果 return f【MCP执行报告】城市{city}天气{weather_condition}温度{weather_data[temp]}°C湿度{weather_data[humidity]}%建议{suggestion} return 请指定一个城市如北京、上海或广州。 else: return 请使用格式城市名 天气和旅行建议# 测试print(用户北京天气和旅行建议)print(mcp_executor(北京天气和旅行建议))print()print(用户广州天气和旅行建议)print(mcp_executor(广州天气和旅行建议))运行结果用户北京天气和旅行建议【MCP执行报告】城市北京天气晴天温度25°C湿度30%建议今天北京天气晴朗建议去户外景点游玩记得涂防晒霜用户广州天气和旅行建议【MCP执行报告】城市广州天气雨温度30°C湿度80%建议今天广州有雨建议带伞可以去博物馆或商场。这个进阶示例展示了MCP的链式调用能力一个工具的输出天气作为另一个工具旅行建议的输入。这正是MCP协议的强大之处——让模型能够像人类一样串联多个步骤完成复杂任务。## 五、MCP的高级用法与最佳实践### 5.1 上下文管理在实际应用中MCP需要维护对话上下文。例如用户先问“北京天气”再问“适合去哪里玩”模型需要记住前文提到的城市和天气信息。### 5.2 错误处理工具可能失败如API超时MCP协议应包含重试机制或降级策略。例如天气查询失败时模型可以提示用户稍后再试而不是直接报错。### 5.3 安全性MCP允许模型执行外部代码必须严格限制工具权限。例如不能允许模型调用删除文件或发送垃圾邮件的工具。### 5.4 工具注册与发现大型系统可能有上百个工具MCP需要支持动态注册和优先级排序。例如当用户说“找一家餐厅”模型需要从多个餐饮相关工具中选择最合适的一个。## 六、总结MCP协议为大语言模型打开了一扇通往外部世界的大门。通过标准化的工具接口模型不再局限于训练数据而是可以实时获取信息、执行计算、操作数据库甚至控制物理设备。从基础的计算器调用到多工具协同的旅行建议系统我们看到了MCP如何将AI从“对话者”转变为“执行者”。未来随着MCP生态的发展我们可能会看到- 模型自动调用搜索引擎核实事实- 模型通过API预订机票酒店- 模型调用代码解释器生成图表但MCP也带来了挑战如何确保工具调用的安全性如何避免模型滥用工具如何管理工具调用成本这些都是需要继续探索的问题。作为开发者掌握MCP协议意味着你能够构建更强大、更智能的AI应用。现在就开始尝试在你的项目中集成MCP吧让大模型真正“动起来”