上周五晚上我在整理移动硬盘,翻出一个 2023 年的老项目文件夹。
里面有个目录叫 adapter,两千多个文件里我一眼就认出了它。因为那半年,我为它掉了不少头发。
那是一个给大模型接外部接口的活儿。需求听起来特别朴素,就是让模型能查酒店、查价格。按今天的眼光看,这玩意儿不就一句话的事么。
但当时我真的做下来,写了五百多行代码。
说句题外话,2023 年那会儿其实挺兴奋的。function calling 刚出来,所有人都意识到大模型要从聊天框里走出来了,能调工具、能办事、能接真实世界。 demo 视频一个个看得人热血沸腾,好像明天就能搭出一个全能管家。
真正动手才知道,模型这头会调工具了,可外面那圈世界没变。接口还是那个接口,文档还是那份文档,鉴权还是那套鉴权。中间的鸿沟,得你自己一块砖一块砖地砌。
不是因为我菜。好吧,也可能有菜的成分在里面,但更多是因为,在 REST API 的年代,接入一个外部服务,标准动作就是这么多。
我给你捋一遍当年的流程。
第一步是鉴权。OAuth2 那套流程你得手写,拿授权码、换 token、处理 token 过期刷新,顺利的话三十行,不顺利五十行起步。我印象最深的是一个周五晚上,测试环境突然全线报 401,排查了俩小时,最后发现是 token 过期刷新那里有个竞态,凌晨才修完,走在路上整个人都是飘的。
第二步是工具发现。文档一页页翻,端点一个个人工整理。更要命的是文档经常比接口本身旧,参数名改了文档没改,你照着拼,模型那边就报错给你看。我当年维护过一个三十七行的端点清单表格,每周手动核对一遍,核对到怀疑人生。
第三步是请求封装。每个端点独立写一套,这家服务用驼峰命名,那家用下划线,字段对不上就自己写转换层。转换层这个东西,写的时候觉得是一次性的,维护的时候才发现是永久的。
第四步才是真正的大头,给大模型做 function calling 的映射层。模型理解的是工具描述,接口给的是 REST 语义,中间这一百到三百行的胶水代码,全是你的。写完 Claude 这套,业务说要上 Cursor,再写一套。每家的参数格式还有微妙的差别,你就复制、粘贴、改细节,改到眼睛发直。
第五步,错误处理。错误码一个个手动映射,重试逻辑自己写,写漏一个 case,线上就等着半夜报警。
然后你以为结束了?没有。过两周业务要加个新端点,新适配器、新映射,半天起步。要换个平台部署,整条流水线从头再走一遍。
那年我还被拉去给老板解释过一次,为什么模型会查酒店这个需求,排期要写两周。我说了一堆鉴权、映射、多平台适配的词,他听完就问了一句,这些跟查酒店有关系么。
没关系。但又绕不开。
这就是当年所有想把大模型接进真实业务的人,共同的处境。需求侧觉得这是一句话的事,工程侧知道这是一堆砖的活儿,中间的落差全靠加班填。
所以五百行,还真不算夸张。那阵子圈子里还流行一个说法,接一个接口的时间,比想清楚用它干什么的时间长得多。
上周我又接了一次接口。
这次是一个酒店数据的 MCP 服务,叫 RollingGo 酒店 MCP。完事儿之后我看着屏幕愣了一会儿,因为整个接入过程,配置文件加起来,十五行以内。
我把两次经历放在一起做了张对比图,你先看。
是不是有点过分了。
鉴权,从手写 OAuth2 的三十到五十行,变成配置里一行 Header,声明 Bearer 加上你的 Key,完事。
工具发现,从人肉翻文档,变成协议自带的 tools/list,服务端直接把工具列表和参数 schema 推给你,模型自己就能看懂。你不用告诉它有哪些接口,它自己知道。
请求封装,从每个端点一套,变成统一的 JSON-RPC 格式,零封装。大模型对接,从一百到三百行映射层,变成零行胶水代码,因为主流 Agent 客户端对 MCP 是原生支持,拿到工具列表就能直接调。
错误处理是标准错误码,框架自动重试。新增端点,服务端注册就行,客户端零改动。多平台适配,一份配置所有 MCP 客户端通用。
五百行变十五行,代码量砍掉九成七。
协议干掉的从来不是代码,是每个开发者都要重造一遍的那一遍。
这里得稍微聊一下 MCP 到底是个啥,很多朋友可能天天听这个词,但没太拆过它。
MCP 全称 Model Context Protocol,Anthropic 在 2024 年 11 月发布的开放协议,干的就一件事,给模型和外部工具之间,定一套标准的通信格式。你在模型这头说清楚我是谁,服务那头说清楚我有哪些工具、每个工具吃什么参数,中间的握手、格式、错误码,全都按协议来。
翻译成人话就是,以前你给模型递工具,得先写一份它看得懂的说明书,再写一份接口听得懂的电报,来回翻译。现在说明书和电报是同一种语言,谁都不用翻译。
技术上拆开看其实也不复杂。通信走 JSON-RPC,传输要么本地起进程走标准输入输出,要么远程走一条 HTTP 通道。服务一上线,客户端发个请求过去,返回的列表里每个工具都自带参数 schema,类型、必填、取值范围写得清清楚楚。模型拿到这份自描述的清单,怎么组合调用它自己就推理出来了。
之前每个人都要自己搭的那座桥,现在协议统一修好了,大家直接走。
有意思的是它普及的速度。协议刚出来那阵,不少人觉得这是 Anthropic 自己生态的事,观望。结果 OpenAI 转年就跟进了,各大 Agent 客户端陆续把 MCP 支持做成标配,目录站上一个一个 MCP 服务冒出来,数据库的、地图的、支付的、查航班的。到今年,一个 Agent 应用接不接 MCP,已经从技术选型变成了默认前提。
我身边还有个更具体的变化信号。
去年我劝一个做独立开发的朋友把服务包成 MCP,他觉得麻烦,说反正用户就那么几个,直接给 API 文档让他们自己接。上个月他主动来找我,说他的用户里开始有人问,你这个有没有 MCP 版。就一句话,他周末就把服务包上去了。
用户的行为比任何技术布道都诚实。当一个词从极客的黑话变成普通用户随口的问题,它就不是趋势了,它是既成事实。
这种时刻其实在技术史上反复发生过。
集装箱没有发明船,也没有发明箱子,它只是把箱子的角件和尺寸统一了,全球的港口、卡车、吊臂围绕同一个标准改造,然后国际贸易的成本断崖式下跌。USB 没有发明任何一种设备,它只是统一了接口,从此你不用再为每个外设找一根专属的线。
MCP 在干一模一样的事。
标准化最爽的地方在于,它省下的不是一个人的时间,是所有人重复浪费的时间。
说回开头那个十五行以内的配置。
聊之前先说一个我自己的判断,不是所有服务都适合第一时间上 MCP。改动频率低、查询维度简单的东西,REST 加文档完全够用。但有一类服务是 MCP 的天选场景,数据规模大、更新频率高、查询条件多维。
酒店数据就是这类里的教科书。
你想啊,一次酒店查询背后是城市、日期、星级、预算、位置、标签一堆条件的组合,价格和库存还是分钟级在变的,今天一个价明天一个价,满房退房随时发生。这种数据你让人工封装接口去追,永远追不平,只有让模型拿着实时工具自己去查,答案才是活的。
那次我接的 RollingGo 酒店 MCP,背后是两百多万家酒店的数据,十一万家直签,价格库存实时更新,全球五百多家供应商的资源都聚合在这一个服务里。这种体量放在几年前,光是想一想适配层的工作量,就够我喝一壶。
但实际过程是这样的。我先去 https://rollinggo.store 申请了一个 API Key,表单填完几分钟的事,免费的调用额度直接给到,不用走商务流程,也不用先充值验证身份。拿到 Key 之后,我在 Claude 的配置文件里加了这么一段。
json
{
"mcpServers": {
"rollinggo-hotel": {
"type": "http",
"url": "https://mcp.rollinggo.cn/hotel",
"headers": {
"Authorization": "Bearer 你的API Key"
}
}
}
}
数了一下,十二行。含花括号。
重启 Claude,对话框里问一句,帮我查下周六杭州西湖边上评分四点八以上的酒店。工具列表里的 search-hotels、hotel-detail、hotel-tags 一个个躺在那儿,模型自己挑工具、自己传参数、自己把两段式查询组合起来,全程我没写一行映射代码。
所谓两段式,就是先拿 search-hotels 按条件圈出候选列表,再挑出前几家用 hotel-detail 深挖房型和实时价格。这个编排模型自己就会做,因为工具的参数 schema 里写得明明白白,它读完就知道该先粗筛再细查,跟人查酒店的动作一模一样。
我又追加了一句,其中带泳池和免费取消的单独标出来。模型调了 hotel-tags 的标签接口,几秒钟把条件叠上去了。要是搁 REST 年代,这一个新条件我就得回去翻文档找参数名,再改一遍映射层。
整个体验里最魔幻的瞬间是,我在旁边看着模型干活,突然意识到自己没有在看代码。
我在看它干活。
配置这份文件,我原封不动复制到 Cursor 的 mcp.json,能用。复制到 Cline 的配置面板,也能用。**在 MCP 的世界里,客户端只认协议,不认平台。**服务端只维护一份接入,所有客户端通吃,这放在 REST 年代是要写三套代码的事。
这家还有个开源仓库,在 https://github.com/RollingGo-AI/RollingGo-hotel-MCP-CN ,想看协议实现细节的可以自己去翻,仓库里把不同客户端的配置差异写成了对照表,连字段名大小写这种坑都标出来了。
顺嘴一提,这套服务的调用次数已经过了七十六万次,开源仓库两千五百多次下载。这些数字对我有参考价值的原因不是它们大,而是它们说明现在每天有一堆真实的开发者和 Agent 在上面跑,坑被人提前踩过,文档被人反复校过,我踩到新坑的概率小很多。接接口这件事,除了写代码的量,隐性成本其实在信任。
后来我还琢磨出一层更深的账。
当接入成本趋近于零,事情反而变得纯粹了。以前选数据源,接口好不好接占一半权重,文档写得好我可能就选它了。现在接入这一侧大家都是十五行,比不动了,竞争回到数据本身,覆盖多少家酒店,价格是不是实时的,直签比例有多高,出了问题谁响应。
接入的门槛塌掉之后,真正值钱的东西才露出水面,是数据质量,是服务本身。
那天晚上配完之后我又想起 2023 年那个 adapter 文件夹,想起我为 token 刷新逻辑 debug 到凌晨三点的自己,有点想回去拍拍他的肩膀。
跟他说,别熬了,你在这座桥上砌的每一块砖,过两年整个行业会统一重修一遍。
而你要做的,只是从桥上走过去。