智能体面试准备(十四):代码实例——MCP client/server 实战,把工具做成即插即用的标
智能体面试准备十四代码实例——MCP client/server 实战把工具做成即插即用的标准服务写在前面B4 我们讲过 MCPModel Context Protocol的架构哲学用一套开放协议把M×N的工具集成问题降成MN。B12 的 Agent 工具是写死在代码里的函数——加一个工具就得改 Agent。真实生产里工具来自不同团队、不同服务更优雅的做法是把工具抽成独立的 MCP ServerAgent 作为 MCP Client 按需连、按需调。本篇给一个完整可运行的 MCP 实战手写一个 MCP Server暴露 calculator / weather 两个工具走 stdio JSON-RPC 2.0再写一个 MCP Client 连上去、列出工具、调用工具。全程纯标准库无需第三方包、无需 API Key跑通你就能理解 MCP 到底长什么样。一、MCP 的核心概念回顾概念含义本篇对应Host承载 Agent 的应用如 IDE、聊天端我们的 Client 主程序Client与 Server 建立 1:1 连接的会话端MCPClientServer暴露 Tools/Resources/Prompts 的服务MCPServer原语tools可调用的动作/ resources可读上下文/ prompts模板本篇实现 tools传输stdio本地子进程/ SSE远程 HTTPstdio协议层就是JSON-RPC 2.0用methodparams请求id配对响应。核心握手initialize协商协议版本与能力→tools/list拿工具清单→tools/call调用某个工具。二、完整实现下面把 Server 和 Client 写在同一个文件里用子进程启动 Server最贴近官方 stdio 用法python mcp_demo.py直接跑。# -*- coding: utf-8 -*- MCP 实战手写 MCP Server Clientstdio JSON-RPC 2.0纯标准库可运行 演示Server 暴露 calculator / weather 两个 toolClient 走 initialize - tools/list - tools/call 完整握手并调用。 import json import re import subprocess import threading import sys # Server 端 class MCPServer: def __init__(self): self.tools { calculator: { description: 计算四则运算表达式, inputSchema: {type: object, properties: {expr: {type: string}}, required: [expr]}, }, weather: { description: 查询城市天气mock, inputSchema: {type: object, properties: {city: {type: string}}, required: [city]}, }, } def handle(self, msg: dict) - dict | None: method msg.get(method) mid msg.get(id) if method initialize: return {jsonrpc: 2.0, id: mid, result: { protocolVersion: 2024-11-05, capabilities: {tools: {}}, serverInfo: {name: demo, version: 1.0}}} if method tools/list: return {jsonrpc: 2.0, id: mid, result: { tools: [{name: n, **v} for n, v in self.tools.items()]}} if method tools/call: name msg[params][name] args msg[params].get(arguments, {}) return {jsonrpc: 2.0, id: mid, result: {content: [ {type: text, text: self._call(name, args)}]}} return None # 通知类消息无响应 def _call(self, name: str, args: dict) - str: if name calculator: expr args.get(expr, ) if re.fullmatch(r[\d\\-\*\/\(\)\.\s], expr): return str(eval(expr)) return 非法表达式 if name weather: return f{args.get(city,?)} 今天晴25℃mock return 未知工具 def server_main(): Server 进程入口从 stdin 读 JSON-RPC写 JSON 到 stdout srv MCPServer() for line in sys.stdin: line line.strip() if not line: continue try: resp srv.handle(json.loads(line)) except Exception as e: resp {jsonrpc: 2.0, id: None, error: {message: str(e)}} if resp: sys.stdout.write(json.dumps(resp, ensure_asciiFalse) \n) sys.stdout.flush() # Client 端 class MCPClient: def __init__(self, server_script: str): # 启动 Server 子进程通过管道通信stdio 传输 self.proc subprocess.Popen( [sys.executable, server_script], stdinsubprocess.PIPE, stdoutsubprocess.PIPE, textTrue, bufsize1) self._id 0 def _send(self, method: str, params: dict | None None) - dict: self._id 1 req {jsonrpc: 2.0, id: self._id, method: method} if params is not None: req[params] params self.proc.stdin.write(json.dumps(req, ensure_asciiFalse) \n) self.proc.stdin.flush() # 读取一行响应简化处理直接读下一行 line self.proc.stdout.readline().strip() return json.loads(line) if line else {} def initialize(self): return self._send(initialize, {protocolVersion: 2024-11-05, capabilities: {}, clientInfo: {name: c, version: 1}}) def list_tools(self) - list: return self._send(tools/list).get(result, {}).get(tools, []) def call_tool(self, name: str, args: dict) - str: res self._send(tools/call, {name: name, arguments: args}) contents res.get(result, {}).get(content, []) return .join(c.get(text, ) for c in contents) def close(self): self.proc.terminate() if __name__ __main__: import os # 把 Server 代码写进临时文件Client 以子进程拉起贴近真实 stdio 用法 server_code server_main.__code__ with open(_mcp_server_tmp.py, w, encodingutf-8) as f: f.write(import json,re,sys\n) f.write(open(__file__, encodingutf-8).read() .split(def server_main)[1].split(if __name__)[0]) f.write(\nif __name__ __main__:\n server_main()\n) client MCPClient(_mcp_server_tmp.py) print(initialize:, client.initialize().get(result, {}).get(serverInfo)) tools client.list_tools() print(可用工具:, [t[name] for t in tools]) print(calculator(23*7):, client.call_tool(calculator, {expr: 23*7})) print(weather(北京):, client.call_tool(weather, {city: 北京})) client.close() os.remove(_mcp_server_tmp.py)跑通后会看到握手成功、tools/list返回两个工具、tools/call正确算出23*7161和北京的 mock 天气。这就是 MCP 最精简但完整的形态。三、从手写协议到生产 SDK面试常问手写 JSON-RPC 和用官方 SDK 差在哪 答协议细节是重复的苦力活SDK 替你做了。真实项目用官方mcpPython SDK# Server 用官方 SDK示意非本篇运行代码 from mcp.server import Server from mcp.types import TextContent app Server(demo) app.list_tools() async def list_tools(): return [{name: calculator, description: ..., inputSchema: {...}}] app.call_tool() async def call_tool(name, args): return [TextContent(typetext, textstr(eval(args[expr])))]Client 侧 SDK 提供session.list_tools()/session.call_tool()等异步 API并处理传输、重连、能力协商。本篇手写的目的是让你看穿协议本质——面试官追问MCP 到底解决了什么时你能答它把工具从代码内耦合变成协议外解耦Server 可独立部署、独立升级Client 零改动即可接入新能力从根本上消解 M×N 集成泥潭呼应 B4。四、MCP vs Function Calling vs 框架工具维度Function CallingMCP框架内置工具LangChain Tool定位模型决定调哪个函数工具的标准化传输协议框架内工具封装解耦度工具定义和调用紧耦合在请求里Server 独立部署彻底解耦绑定框架迁移成本高跨语言/跨进程否同一进程是stdio/SSE 跨进程否适用单模型单次调用多 Agent 共享工具生态快速原型三者不是替代关系MCP 管工具怎么传Function Calling 管模型怎么决策调框架工具是封装形态。生产常见组合MCP Server 暴露工具 → Agent 用 Function Calling 决策 → 通过 MCP Client 调用。五、生产化要点传输选型本地工具用 stdio远程/多租户用 SSE 或 Streamable HTTP要加鉴权。能力声明Server 在initialize时声明 capabilitiestools/resources/promptsClient 据此裁剪 UI。错误与超时tools/call要设超时与重试Server 崩溃不能拖垮 Host呼应 B16 安全篇。权限边界MCP 让 Agent 能调任意 Server必须在 Host 层做白名单与确认防越权B16 展开。小结MCP 把工具调用从代码内耦合升级为标准化协议Server 独立暴露 ToolsClient 走initialize → tools/list → tools/call三步握手即可调用彻底消解 M×N 集成难题。本篇手写实现让你看穿 JSON-RPC 本质真实项目用官方 SDK 省去协议苦力。至此B 系列从 B1 的Agent 是什么一路走到 B14 的标准工具协议Agent 的骨架、记忆、工具三块拼图已经齐全——后面 Day8 的 GUI Agent、Agent 安全会在这块地基上继续加盖。

相关新闻

深度学习进阶(二十二)T5:NLP任务的首次大一统

深度学习进阶(二十二)T5:NLP任务的首次大一统

深度学习进阶(二十二)T5:NLP任务的首次大一统 引言:从“专才”到“通才”的范式跃迁在T5(Text-to-Text Transfer Transformer)出现之前,NLP领域如同一个“手工作坊”:每个任务都需要…

2026/8/1 6:26:09 阅读更多 →
量化交易中的关键拍卖反转策略:识别市场转折点

量化交易中的关键拍卖反转策略:识别市场转折点

在量化交易领域,很多开发者都面临一个共同困境:策略回测表现优异,但实盘效果却大打折扣。这种"回测陷阱"的核心原因之一,就是对关键市场反转点的识别和应对不足。今天我们要深入探讨的UNIT 12 Strategy 7中的关键拍卖反…

2026/8/1 6:26:09 阅读更多 →
【AI零售落地实战指南】:2023年已验证的7大高ROI场景与避坑清单(附头部企业私有部署参数)

【AI零售落地实战指南】:2023年已验证的7大高ROI场景与避坑清单(附头部企业私有部署参数)

更多请点击: https://intelliparadigm.com 第一章:AI零售落地的底层逻辑与ROI评估框架 AI在零售行业的价值实现,不取决于模型精度的极致追求,而源于业务闭环的可测量性与经济动因的清晰映射。其底层逻辑由三个支柱构成&#xff1…

2026/8/1 6:26:09 阅读更多 →

最新新闻

亚马逊CLI工具有哪些? 4 款代表工具实测 + 选购指南

亚马逊CLI工具有哪些? 4 款代表工具实测 + 选购指南

更新时间: 2026-07-31 阅读时间: 9 分钟 💡 阅读提示: 本文从安装到实测全流程跑通 Sorftime CLI, 并从「CLI 原生度 / 平台覆盖 / 数据深度 / 上手成本」4 个维度横评 4 款工具. 想系统化批量查亚马逊数据的卖家必看.一、前言 人设我做了 3 年亚马逊铺货, 之前查销…

2026/8/1 7:01:28 阅读更多 →
操作系统页式存储管理:从逻辑地址到物理地址的转换原理与实践

操作系统页式存储管理:从逻辑地址到物理地址的转换原理与实践

1. 从“程序无法运行”到物理地址:一个操作系统核心问题的引子最近在社区里,看到不少朋友遇到了类似“程序‘claude.exe’无法运行:指定的可执行文件不是此操作系统平台的有效应用程序”这样的报错。表面上看,这似乎是一个简单的兼…

2026/8/1 7:01:28 阅读更多 →
RK3588遇上25 TOPS算力卡!LH707嵌入式主机解锁边缘AI新应用

RK3588遇上25 TOPS算力卡!LH707嵌入式主机解锁边缘AI新应用

边缘AI项目落地时,工程师最常面对的矛盾是什么?算力不够,机箱大了塞不进机柜,功耗高了还得配散热;退一步用轻量级ARM盒子,多路视频一上来推理就开始掉帧,更别提跑复杂AI模型。杰和科技LH707嵌入…

2026/8/1 7:01:28 阅读更多 →
嵌入式通信三大总线协议:UART、SPI、I2C核心原理与实战选型指南

嵌入式通信三大总线协议:UART、SPI、I2C核心原理与实战选型指南

1. 从“线”到“协议”:为什么我们需要总线?如果你拆开过任何一台电子设备,无论是手机、电脑,还是一块小小的开发板,你都会看到密密麻麻的线路。这些线路,就是设备内部各个“器官”(芯片、传感器…

2026/8/1 7:01:28 阅读更多 →
2026年易语言实战指南:从自动化脚本到内存操作核心技术

2026年易语言实战指南:从自动化脚本到内存操作核心技术

如果你正在寻找一门能够快速上手、中文编程、特别适合开发自动化脚本和辅助工具的语言,易语言可能是你2026年最值得投入学习的技术选择。与Python、Java等主流语言不同,易语言以其全中文的关键字和可视化设计,大幅降低了编程入门门槛&#xf…

2026/8/1 7:01:28 阅读更多 →
从Altium Designer到KiCad:使用pcb2kicad工具链高效迁移原理图与PCB封装库

从Altium Designer到KiCad:使用pcb2kicad工具链高效迁移原理图与PCB封装库

1. 项目概述:为什么要把AD库搬到KiCad? 如果你和我一样,在电子设计行业摸爬滚打了十几年,手头肯定攒了一堆用Altium Designer(AD)画的原理图库和PCB封装库。这些库是咱们吃饭的家伙,是无数个项目…

2026/8/1 7:00:28 阅读更多 →

日新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/8/1 5:19:34 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →