MCP怎么开发?从零搭建一个MCP服务

说明MCP服务从选型、定义工具、编写代码到测试接入AI助手的通用开发方法,并对比本地与远程两种传输方式,帮开发者从零写出可用的MCP服务和工具。

如果你想让 AI 助手直接查资料、读文件或调用公司内部系统,MCP(Model Context Protocol)是常见的接入方式。很多开发者搜“mcp 怎么开发”,真正想知道的是:一个 MCP 服务到底由哪些部分组成,工具该怎么设计,从空目录到能被 AI 助手调用,要走哪几步。

这篇文章写给已经会写一点代码、想做自己第一个 MCP 服务的开发者。文中不讲具体品牌的 MCP 服务怎么使用,只讲通用方法:选语言和传输方式、定义工具、编写和测试、接入客户端、远程部署时要注意什么。按这些步骤做,即使换成别的语言或框架,思路也一样。

MCP 服务怎么开发?一句话结论

先选传输方式,再定义工具,最后写实现。MCP 服务是一个按协议收发消息的程序,AI 助手(MCP 客户端)通过它列出可用工具、调用工具并拿到结果。下面这张表可以帮你判断该怎么做:

你的情况推荐做法原因
只给自己电脑上的 AI 助手用本地进程方式(stdio),由客户端启动服务不需要网络和域名,配置简单,调试快
团队或多台设备共享同一服务HTTP 远程服务,加上身份校验服务部署在一处,多人连接同一地址
对 Python 或 TypeScript 更熟悉直接使用官方提供的对应语言 SDKSDK 已处理协议握手和消息格式,减少底层工作
工具要读取大量数据返回前做分页或长度限制结果过长会占满 AI 助手的上下文,影响后续回答
工具会修改文件或数据写操作单独设计,入参中加确认字段避免 AI 助手误调用时直接造成改动

开始之前:先确认这几点

1. 工具只做一件具体的事。 一个工具对应一个明确动作,比如“按关键词搜索内部文档”,而不是“处理所有文档相关事务”。动作越具体,AI 助手越容易判断什么时候该调用它。

2. 确定语言和运行环境。 MCP 官方提供多种语言的 SDK,常见选择是 Python 和 TypeScript。哪种语言都能完成开发,选团队熟悉、部署方便的即可。

3. 确定传输方式。 本地进程方式下,客户端在本机启动服务并通过标准输入输出通信;远程方式则通过 HTTP 提供服务,需要按当前版本的 MCP 规范实现对应的传输协议。两者的代码结构不同,先定下来可以少返工。

4. 准备一个可验证的测试场景。 例如一个只读的查询工具,输入关键词,返回几条固定结果。先用简单的数据跑通全流程,再接入真实数据源。

5. 明确权限边界。 服务能访问哪些目录、哪些接口、能否写入,都要事先定好,并且只开放完成任务所需的权限。

从零搭建一个 MCP 工具服务的步骤

  1. 创建项目并安装 SDK。 新建一个空目录,用所选语言的包管理器安装 MCP 官方 SDK,并确认版本与规范一致。
  2. 初始化服务对象。 给服务起一个名称和版本号,客户端连接时会显示这些信息,便于区分多个服务。
  3. 注册一个工具。 为工具写明名称、描述和入参结构。名称用英文、简短、动词开头,例如search_docs。
  4. 用 JSON Schema 定义入参。 每个参数写明类型、是否必填和含义说明。AI 助手依据这些说明生成调用参数,说明越具体,调用越准确。
  5. 编写处理函数。 读取入参,执行实际操作,把结果整理成文本或结构化内容返回。出错时返回带错误标记的结果,不要直接抛出未捕获的异常。
  6. 用调试方式单独测试。 在接入 AI 助手前,先通过通用的 MCP 调试工具或脚本发送列表请求和调用请求,确认工具能被发现,入参和返回值符合预期。
  7. 接入 AI 助手。 在支持 MCP 的 AI 助手(例如 Claude 或 Cursor 等可接入 MCP 的客户端)的配置中,填入本地服务的启动命令或远程服务的地址,重启客户端后检查工具是否出现在列表中。
  8. 远程部署时补充安全措施。 为 HTTP 服务加上身份校验,限制可访问的来源,设置超时时间,并记录每次调用的时间和工具名,方便排查问题。

编写时还有两个容易出错的地方。其一,本地进程方式下,日志必须输出到错误流,标准输出只能用于协议消息,否则客户端会解析失败。其二,工具描述要写给 AI 助手看,例如“搜索公司内部技术文档,参数 query 为关键词,返回标题和摘要列表”,比只写“搜索工具”有用得多。

做完后逐项核对

检查项怎么看有问题怎么办
工具能否被列出客户端的工具列表中是否出现你的工具名检查服务启动是否成功、配置路径是否正确、SDK 版本是否匹配
入参校验是否生效故意传入缺失或类型错误的参数,看返回是否为错误结果在 Schema 中补全必填项和类型,并在处理函数开头再校验一次
返回内容是否可用调用后检查结果长度、格式和是否含有多余调试信息限制返回条数,去掉无关日志,结构化内容保持字段名稳定
异常是否被妥善处理模拟数据源不可用,看服务是否仍能响应其他请求用 try-catch 包住外部调用,返回说明原因的错误结果
写操作是否受控不带确认参数时,写操作是否被拒绝增加确认字段,并在描述中说明只有确认后才执行

❓ 常见问题(FAQ)

1. mcp 官方推荐哪种语言做 HTTP 对外服务?

MCP 官方提供多种语言的 SDK,并没有只推荐一种。做 HTTP 对外服务时,Python 和 TypeScript 都是常见选择,关键看你的团队能否稳定维护这门语言,以及是否有成熟的 Web 框架和部署经验。具体的传输实现应以当前版本的 MCP 规范为准。

2. mcp 接口是什么?和普通 REST 接口有什么区别?

MCP 接口是基于 JSON-RPC 2.0 消息格式的协议接口,客户端通过固定的方法名请求工具列表或调用工具。普通 REST 接口按资源和 URL 设计,而 MCP 的核心是“列出工具、调用工具”这类动作,由客户端自动把工具提供给 AI 助手使用。

3. MCP 工具开发经验里,常被忽视的是什么?

工具描述和参数说明经常被草草写完。AI 助手是否选中一个工具、会传什么参数,主要依据这些文字,描述不清会导致误调用或参数错误。写完后可以让 AI 助手试着调用几次,看它的选择是否符合预期。

4. 没有 AI 开发经验,能做 mcp 软件开发吗?

可以。MCP 服务本质上是一个普通的网络或本地程序,需要的是基本的编程能力,比如读写文件、发送 HTTP 请求和处理 JSON。AI 相关知识主要影响如何设计工具描述,不是开发服务的前提。

5. 本地服务为什么连不上客户端?

常见原因有三个:启动命令路径写错,标准输出被日志污染,或者 SDK 版本与客户端使用的规范版本不一致。先在终端单独运行服务并检查输出,再对照客户端的错误信息逐项排查。

📝 总结

开发 MCP 服务,核心是先定好传输方式和工具范围,再按协议注册工具、定义入参、编写处理逻辑并单独测试。只要工具描述清楚、错误处理到位、写操作有确认机制,一个 MCP 服务就能稳定地接入 AI 助手,后续再按需扩展工具数量和部署方式。

打开 OmniDoc,把文档工具接入你的 AI 助手

更新于 2026-11-04