MCP 协议从零搭建实战:手写一个文件搜索工具 Server

发布时间:2026/11/5 12:05:24

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/11/4 18:42:39

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

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

2026/11/3 15:05:16

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

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

2026/11/3 18:08:16

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

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

2026/11/5 12:04:19

下班回消息也算加班:北京法院给隐形加班划线

宝企通云关怀:下班后的关怀别变成打扰图1:北京法院:下班后线上沟通满足条件应认定加班一、热搜里发生了什么据人民网报道,北京多家法院发布劳动争议典型案例,首次以司法判决形式明确:下班后线上沟通、节假日…

2026/11/5 11:39:15

PostgreSQL数据类型选择指南与性能优化实践

1. PostgreSQL数据类型概述PostgreSQL作为一款功能强大的开源关系型数据库,其数据类型系统之丰富远超大多数同类产品。我在实际项目中最常遇到的问题是:面对十几种数字类型、多种字符串类型以及各种特殊类型时,开发团队往往凭直觉选择&#x…

2026/11/5 11:34:12

Simulink S-function执行时序与状态管理原理详解

简介:本资源是面向MATLAB/Simulink初学者与控制系统建模学习者的S-Function入门实践包,聚焦自定义系统函数开发这一核心能力,解决标准库无法覆盖的特定数学运算与动态逻辑建模需求。压缩包共4个文件(2个M文件实现核心算法逻辑&…

2026/11/5 11:34:12

低空经济三维智能感知与实时调度技术解析

1. 低空经济三维空间智能感知与管控体系概述低空经济作为新兴经济形态,正在全球范围内快速发展。根据国际航空运输协会(IATA)预测,到2030年,全球城市空中交通市场规模将达到1.5万亿美元。在这一背景下,《低…

2026/11/5 11:34:12

链表数据结构与PTA解题技巧详解

1. 链表基础与数据结构课程实践 链表作为线性表的链式存储结构,是数据结构课程中承前启后的关键内容。在山东理工大学(SDUT)的数据结构与算法课程体系中,链表章节通常安排在顺序表之后、树结构之前,这种教学顺序设计体…

2026/11/5 11:34:12

Simulink S-Function核心机制与两个经典C示例解析

简介:本资源是面向MATLAB/Simulink初学者与控制系统建模学习者的S-Function入门实践包,聚焦自定义系统函数开发这一核心能力,解决标准库无法覆盖的特定数学运算与动态逻辑建模需求。压缩包共4个文件(2个M文件实现核心算法逻辑&…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑