发布时间:2026/7/24 12:03:54
MCP 协议从零搭建实战:手写一个文件搜索工具 Server 前言说实话MCP 协议从去年底爆火到现在已经成了 AI 开发圈绕不开的话题。但你真要动手写一个 Server很多教程要么讲得太浅要么跳过了关键细节。今天就手把手带大家写一个文件搜索工具 MCP Server功能很简单让 AI 能通过 MCP 协议搜索本地文件。但麻雀虽小五脏俱全整个过程你能完整理解 MCP 的工作原理。MCP 是什么一句话说清楚MCP (Model Context Protocol) 是 Anthropic 去年推出的一种开源协议专门解决 AI 模型和外部工具之间的通信问题。通俗点说MCP 就是 AI 世界的 USB 接口。以前你给 AI 加功能每个 AI 有自己的一套插件系统像不同品牌的充电器不通用。MCP 统一了接口标准写一次工具任何支持 MCP 的 AI 客户端都能用。环境准备首先确保你的环境满足以下条件# Python 3.10python--version# 安装 MCP 开发包pipinstallmcp我们用 Python 实现因为生态最成熟。如果你不会 Python用 TypeScript 也行官方支持两种语言。第一步定义工具MCP Server 的核心是暴露工具Tool给 AI 调用。每个工具需要定义名称— AI 调用时用的标识符参数描述— 告诉 AI 需要什么参数实现逻辑— 实际干活的代码frommcp.serverimportServerfrommcp.typesimportTool,TextContentfromtypingimportAnyimportosimportfnmatch# 创建 Server 实例serverServer(file-search-server)# 注册工具server.list_tools()asyncdeflist_tools()-list[Tool]:return[Tool(namesearch_files,description搜索本地文件支持通配符模式,inputSchema{type:object,properties:{pattern:{type:string,description:文件搜索模式例如 *.py 或 data/*.csv},root_dir:{type:string,description:搜索根目录默认为当前目录},max_results:{type:integer,description:最大返回结果数默认 20,default:20}},required:[pattern]})]第二步实现工具逻辑工具定义好了接下来实现 AI 发起调用时实际执行的代码server.call_tool()asyncdefcall_tool(name:str,arguments:dict)-list[TextContent]:ifnamesearch_files:patternarguments[pattern]root_dirarguments.get(root_dir,.)max_resultsarguments.get(max_results,20)results[]forroot,dirs,filesinos.walk(root_dir):# 跳过隐藏目录dirs[:][dfordindirsifnotd.startswith(.)]# 跳过 node_modules 等大目录dirs[:][dfordindirsifdnotin(node_modules,__pycache__,.git,venv)]forfilenameinfiles:iffnmatch.fnmatch(filename,pattern):filepathos.path.join(root,filename)try:sizeos.path.getsize(filepath)results.append({path:filepath,size:size,size_str:format_size(size)})exceptOSError:continue# 按大小排序最大的在前results.sort(keylambdax:x[size],reverseTrue)resultsresults[:max_results]return[TextContent(typetext,textformat_results(results,pattern))]else:raiseValueError(fUnknown tool:{name})第三步传输层配置MCP 支持两种传输方式标准输入输出stdio和 SSEServer-Sent Events。本地开发用 stdio 最简单defformat_size(size:int)-str:格式化文件大小forunitin[B,KB,MB,GB]:ifsize1024:returnf{size:.1f}{unit}size/1024returnf{size:.1f}TBdefformat_results(results:list[dict],pattern:str)-str:格式化搜索结果ifnotresults:returnf没有找到匹配 {pattern} 的文件lines[f找到{len(results)}个匹配 {pattern} 的文件\n]forrinresults:lines.append(f-{r[path]}({r[size_str]}))return\n.join(lines)if__name____main__:frommcp.server.stdioimportstdio_serverimportasyncioprint(启动 MCP File Search Server...)asyncio.run(stdio_server(server))第四步配置客户端Server 写好了怎么让 AI 用起来以 Claude Desktop 为例{mcpServers:{file-search:{command:python,args:[path/to/search_server.py]}}}配置完成后重启 Claude DesktopAI 就能自动发现并使用你的文件搜索工具了。踩坑指南写 MCP Server 最常遇到的几个坑1. 参数描述不够详细AI 模型依赖参数描述来理解怎么用。如果描述太模糊AI 可能传错参数。建议每个参数都写清楚「这个参数干什么用的」「什么格式」。2. 超时处理MCP 默认有超时时间如果你的工具执行时间太长比如扫描几百万个文件AI 会超时。建议加入超时限制和进度反馈。3. 工具返回值太长AI 模型的上下文窗口有限一次性返回太多结果会被截断。建议加 max_results 限制或者分页返回。# 加入超时控制的改进版本importasyncioimportsignalasyncdefsearch_with_timeout(pattern,root_dir,max_results,timeout30):try:resultawaitasyncio.wait_for(search_files_async(pattern,root_dir,max_results),timeouttimeout)returnresultexceptasyncio.TimeoutError:return[{error:搜索超时请缩小搜索范围}]进阶玩法写完了基础版你还可以扩展更多功能文件内容搜索结合 grep 模式搜索文件内容实时文件监控用 watchfiles 监听文件变化多 Agent 协作让多个 MCP Server 协同工作总结MCP 协议的价值不在于技术有多复杂而在于它定义了一个通用的接口标准。以前的 AI 工具链像一个个孤岛MCP 就是连接这些孤岛的桥梁。写完这个 demo 你会发现MCP 本身并不难真正的难点在于设计好的工具接口。好的工具接口 清晰的参数描述 合理的错误处理 可预期的行为。下一步推荐你试试把搜索工具改成异步实现asyncio加上文件内容预览功能试试用 SSE 模式部署成远程服务有什么问题欢迎在评论区讨论

相关新闻

2026/7/24 11:58:54

深度学习在雷达超分辨技术中的应用与优化

1. 雷达超分辨技术背景解析实波束扫描雷达作为传统探测设备的核心部件,其物理分辨率受限于天线孔径尺寸与工作波长。当我们需要检测相距较近的多个目标时,常规信号处理方法会使它们在距离-方位平面上呈现为模糊的"斑点"。这个问题在机场跑道异…

2026/7/24 11:58:54

告别论文难题:2026年亲测好用的AI论文写作平台大推荐

在撰写期刊论文、毕业论文或职称论文的过程中,学术人员常常会遇到许多挑战。撰写一篇优质的论文,面对海量的文献资料,寻找相关的信息就像在沙滩上捡贝壳一样难;繁琐的格式要求经常让人感到无从下手,精力涣散&#xff1…

2026/7/24 11:58:54

不容错过!2026年7款AI论文平台实测,高效产出优质初稿

到了2026年,越来越多的人开始尝试用AI写论文,特别是硕士和博士这种长篇学术作品。很多AI论文写作工具在处理这些复杂任务时,常常表现不好。比如,有的工具写出来的内容缺少深度,理论不够扎实;有的则逻辑很乱…

2026/7/24 16:34:15

ADS111x-Q1数字比较器原理与应用:从硬件监控到I2C编程实战

1. 项目概述:为什么需要数字比较器?在嵌入式系统,尤其是工业控制、电池管理(BMS)和环境监测设备中,我们经常需要监控一个或多个模拟信号(比如电压、电流、温度)是否处于安全或正常的…

2026/7/24 16:34:15

荣耀Robot Phone:4DoF机械云台与第五代骁龙8如何重塑手机影像

上周,一位做手机评测的朋友给我发来一条消息:“这次荣耀的新品,可能真的不太一样。”他发来的是一张后台数据截图——荣耀 Robot Phone 首日预约量已经超过了该品牌过去所有旗舰机的同期记录。这个数字背后,不仅仅是常规的硬件升级…

2026/7/24 16:34:15

单色波导技术:2024年智能眼镜续航突破12小时的关键选择

如果你最近关注智能眼镜市场,可能会发现一个有趣的现象:为什么大多数消费级 AR 眼镜还在用笨重的 Birdbath 光学方案,而像 Meta、Apple 这样的巨头却在死磕光波导技术?更让人困惑的是,明明波导技术听起来更先进&#x…

2026/7/24 16:34:15

Halliday Gen 2 AR眼镜:双眼波导显示与12小时续航开发指南

这次我们来看一款备受关注的智能眼镜新品——Halliday Gen 2。这款产品最大的亮点是从上一代的单眼显示升级为双眼单色波导显示方案,同时宣称续航达到约12小时。对于关注AR眼镜技术发展的开发者来说,这种显示方案的改变和续航表现值得重点关注。Halliday…

2026/7/24 16:34:15

并发、多线程和HTTP连接之间有什么关系?

在计算机领域,“并发”、“多线程”和“ HTTP连接”是三个重要的概念,它们之间有着密切的联系。本文将探讨这三者之间的联系及其在现代计算机系统中的作用。一、并发的概念并发性是指系统同时处理多个任务或事件的能力。在计算机领域,这意味着…

2026/7/24 16:29:14

LLM在光网络自动化中的实战评测与能力边界分析

光网络运维工程师的一天通常是这样开始的:凌晨三点被告警电话叫醒,面对满屏的复杂告警代码,需要在几分钟内判断是光纤断裂、设备故障还是配置错误。这种高压场景下,传统自动化脚本的局限性暴露无遗——它们能执行预设操作&#xf…

2026/7/23 12:54:51

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述:为什么我们需要一个本地通信服务器?在游戏开发、数字孪生、仿真训练等众多领域,Unity作为强大的实时3D内容创作平台,其核心逻辑通常由C#驱动。然而,当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/24 0:03:10

不同品牌斜齿行星减速机如何替换?以PX与PAG系列为例

不同品牌斜齿行星减速机如何替换?以 PX 与 PAG 系列为例 一、系列对应不等于型号直接互换 PX 与 PAG 都属于斜齿、方法兰、输出轴式精密行星减速机,结构形式和应用方向具有对应关系。 原设备使用PX系列时,可以优先从PAG系列中寻找替换型号。但…

2026/7/24 0:03:10

jdk8 把list 扁平化成String 多个以逗号分隔

在 JDK 8 中&#xff0c;将 List 扁平化为以逗号分隔的 String&#xff0c;有几种非常简洁且高效的方法。&#x1f680; 推荐方案&#xff1a;使用 Collectors.joining()这是最标准的 Java 8 写法&#xff0c;适用于 List<String>。javaimport java.util.stream.Collecto…

2026/7/24 0:03:10

java 两个 long id 怎么合并成一个long id 并且不重复

“把两个 Long ID 合并成一个唯一的 Long ID&#xff0c;且保证不重复”这个需求&#xff0c;在 Java 里直接做数学上的“完美合并”是不可能的。因为两个 Long&#xff08;各 64 位&#xff09;要合并成一个 Long&#xff08;64 位&#xff09;&#xff0c;在信息论上是有损压…

2026/7/23 23:42:43

3个高效策略:快速掌握Axure中文界面配置

3个高效策略&#xff1a;快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…