解密prompt系列. MCP实战:从Low-Level到FastMCP的搭建演进
解密prompt系列. MCP实战从Low-Level到FastMPM的搭建演进大家好我是你们的技术老友。今天咱们来聊聊一个在AI应用开发里越来越重要的玩意儿——MCPModel Context Protocol。别被这个名字吓到它其实就是一套让大语言模型LLM能“伸手”去调用外部工具或数据的协议。想象一下你的AI聊天机器人不再是只会“纸上谈兵”而是能查天气、读文件、甚至操作数据库MCP就是那个“万能遥控器”。这篇文章会带你从最原始的“Low-Level”实现开始一步步演进到更优雅的“FastMCP”方式。咱们不扯虚的直接上代码让你看完就能自己搭一个MCP服务。## 什么是MCP为什么需要它在传统开发中LLM就像一个“闭门造车”的模仿者你问它“今天北京天气怎么样”它只能根据训练数据编一个答案而不是去实时查询天气API。MCP的出现就是为了解决这个痛点它定义了一套标准接口让LLM能通过“工具”与外部世界交互。简单来说MCP包含两个角色-MCP Server提供具体功能比如天气查询、文件读写-MCP ClientLLM调用这些功能的桥梁早期实现MCP需要手写很多底层代码就像自己造轮子后来出现了一些框架比如FastMCP让整个过程变得像搭积木一样简单。下面我们先看“造轮子”的Low-Level方式。## 从Low-Level开始手写一个MCP Server假设我们要写一个简单的MCP Server提供“获取用户年龄”的功能。Low-Level方式至少需要处理JSON-RPC协议、消息序列化、请求路由等。这听起来很复杂但别怕我们用一个最小化例子来演示。python# low_level_mcp_server.pyimport jsonimport socket# 模拟一个“年龄查询”工具def get_user_age(name): # 这里可以换成真实数据库查询 data {Alice: 30, Bob: 25} return data.get(name, 未知用户)# 处理MCP请求的核心函数def handle_request(request): # 解析JSON-RPC格式的请求 try: req json.loads(request) method req.get(method) # 提取方法名 params req.get(params, {}) if method get_user_age: result get_user_age(params.get(name)) return json.dumps({jsonrpc: 2.0, result: result, id: req.get(id)}) else: return json.dumps({jsonrpc: 2.0, error: {code: -32601, message: 方法不存在}}) except Exception as e: return json.dumps({jsonrpc: 2.0, error: {code: -32700, message: str(e)}})# 启动一个简单的TCP服务器def start_server(host127.0.0.1, port8080): server socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((host, port)) server.listen(5) print(fLow-Level MCP Server running on {host}:{port}) while True: conn, addr server.accept() data conn.recv(1024).decode() if data: response handle_request(data) conn.send(response.encode()) conn.close()if __name__ __main__: start_server()这段代码虽然能跑但问题很多- 所有协议细节JSON-RPC版本号、错误码都要手动处理- 增加新工具比如查天气就需要修改handle_request里的if-else- 没有并发能力一次只能处理一个请求这就是Low-Level的痛点开发效率低容易出错。在实际项目中你会发现自己写了大量与业务无关的“胶水代码”。## 进阶用FastMCP让一切变简单现在轮到主角登场了——FastMCP。它像一个“MCP框架”帮我们封装了所有底层细节让我们只需关注业务逻辑。最棒的是FastMCP支持装饰器语法用起来就像Flask一样清爽。python# fast_mcp_server.pyfrom fastmcp import FastMCP# 创建MCP Server实例mcp FastMCP(用户服务)# 定义一个工具用装饰器自动注册mcp.tool()def get_user_age(name: str) - str: 获取指定用户的年龄 data {Alice: 30, Bob: 25} age data.get(name, 未知用户) return f{name}的年龄是{age}岁# 定义第二个工具查询用户地址模拟mcp.tool()def get_user_address(name: str) - str: 获取用户地址信息 addresses {Alice: 北京市朝阳区, Bob: 上海市浦东新区} addr addresses.get(name, 未找到地址) return f{name}的地址是{addr}# 启动服务一行搞定if __name__ __main__: mcp.run(host127.0.0.1, port8080)看到区别了吗只需要两件事1. 创建FastMCP实例2. 用mcp.tool()装饰你的函数其他所有事情——协议解析、错误处理、并发支持——FastMCP都默默搞定了。而且每个工具函数都有清晰的类型注解和文档字符串这对LLM理解工具用途至关重要因为LLM会读取这些文档来知道什么时候调用哪个工具。## Low-Level vs FastMCP关键对比| 方面 | Low-Level | FastMCP ||------|-----------|---------|| 代码量 | 约50行仅基础功能 | 约15行 || 协议处理 | 手动实现JSON-RPC | 自动处理 || 新增工具 | 修改if-else逻辑 | 加个装饰器函数 || 错误处理 | 手动捕获异常 | 内置错误映射 || 可维护性 | 低所有工具耦合在一起 | 高每个工具独立 |更重要的是FastMCP还内置了-自动服务发现LLM可以通过标准接口查询MCP Server提供了哪些工具-并发请求底层使用异步IO能同时处理多个请求-标准错误码所有错误都符合MCP规范## 实战让FastMCP服务与LLM对话光有服务不行还得让LLM能用上。下面是一个简单的MCP Client示例模拟LLM调用工具python# mcp_client.pyimport requestsimport json# 向MCP Server发送请求def call_mcp_tool(tool_name, params): # FastMCP默认使用HTTP传输这里模拟简单的POST请求 url http://127.0.0.1:8080/mcp # 假设FastMCP暴露的端点 payload { jsonrpc: 2.0, method: tools/call, params: { name: tool_name, arguments: params }, id: 1 } response requests.post(url, jsonpayload) return response.json()# 模拟LLM的思维过程if __name__ __main__: # 假设LLM决定调用get_user_age工具 user_query Alice多大了 print(f收到用户问题{user_query}) # LLM会解析出需要调用get_user_age工具 result call_mcp_tool(get_user_age, {name: Alice}) print(fMCP工具返回{result}) # 实际LLM会进一步处理结果生成自然语言回答 age_data result.get(result, {}) print(f最终回答Alice今年{age_data.split()[1]})注意真实场景中LLM会自己决定何时调用哪个工具但这里我们展示了底层调用机制。FastMCP的Client SDK还提供了更高级的封装比如自动与OpenAI API对接。## 总结从Low-Level到FastMCP我们见证了一个技术演进的故事从手动处理每一个字节到用装饰器声明式地定义工具从复杂的if-else路由到自动化的服务发现。这种演进背后是“关注点分离”的哲学——让开发者只关心业务逻辑框架负责处理基础设施。如果你正在构建一个需要与LLM交互的应用我的建议是1. 起步就用FastMCP它已经足够成熟2. 把工具函数设计成“纯函数”——输入输出明确副作用最小3. 给每个工具写清晰的文档字符串这相当于给LLM的“使用说明书”最后记住MCP不是魔法它只是一个协议。它让AI从“知道”变成了“能行动”而这正是未来AI应用的核心竞争力。希望这篇文章能帮你跨出第一步去搭建属于你自己的MCP服务。下次见

相关新闻