返回

吐槽 MCP

最近 AI 产品中提及比较多的一个概念是 MCP。按照 Claude 的官方定义,MCP 是一个开放协议,还把它比喻成了 AI 应用的 USB 端口,相比于 function calling 来说,我觉得更加抽象和模糊,所以对着官方文档具体看了下到底是如何实现和使用的,这里记录并分享一下学习成果。

不论是 function calling 还是 MCP,它们的目的都是为了提升 LLM 的能力,通过模型的生成能力让 AI 可以做更多的事情。

OpenAI 提供的 function calling 能力,在我看来面向的直接用户是开发者,因为终端用户是无感的。

开发者为了增强 App 的能力,会在 GPT 请求中预定义 functions,即将 API 转换为 GPT 可理解的格式。GPT 根据用户意图选择需调用的 API 及参数,并返回给开发者。开发者随后发起实际 API 请求,最终满足用户需求。

function calling 的使用是和开发者对于产品的设计及用户的使用场景强耦合的。

而 Claude 定义的 MCP,目前阶段既面向了开发者,又面向了实际的终端用户,区别在于 MCP 的每个环节对终端用户都是可见的。

在整个 MCP 的架构中,涉及的角色有好几个,我通过一个具体的例子来说明。

Host

以现在比较火的一个套壳产品 ChatWise 为例,它的基础功能就是聊天,在 MCP 中的角色是 Host。ChatWise 的开发者当然可以通过 function calling 的方式提供更多的能力给用户,但是很明显场景非常泛化,成本也很高。

MCP Client

这个时候 ChatWise 就可以选择通过接入 MCP 来实现更多能力。它的开发者要做的工作就是在 ChatWise 中实现一个 MCP Client(MCP 客户端),这个客户端我理解就像一个 Hub,要和各方保持连接,主要做几件事情:

  1. 和后面会提到的 MCP Server 保持连接,知道 Server 的能力以及运行具体的服务
  2. 和 LLM 进行通信,把 Server 的能力和具体执行结果告诉 LLM,并接受 LLM 的响应
  3. 和 Host,这里也就是 ChatWise 连接,接受用户的内容并返回 LLM 的响应

MCP Server

到这里 ChatWise 开发者要做的事情就完成了,下面刚才提到的 MCP Server(MCP 服务器) 登场。首先 MCP Server 的开发者可以是任何人,比如 Claude、某个产品的官方,或者是某位独立开发者。MCP Server 要做的事情包括:

  1. 定义 tools,和 functions 类似
  2. 实现 tools 对应的服务,比如定义了查询天气的 tools,就需要能够真的请求具体的天气 API 获取实际天气
  3. MCP 相比 function calling 还多了使用本地资源和预置提示词的能力,比如直接读取电脑中的某个文件数据

关于 MCP Server 我之前最困惑的一点是它是如何实现的,特别上文提到的第 2 点,是如何发起具体的服务请求,结果具体的实现方式有点震撼到我了。

既然是 Server 就必须运行在某个环境,传统印象中一般都是运行在远程服务器,而对于目前的 MCP 来说,更多的是运行在本地的服务。这两种服务提供方式分别对应了 MCP 的 2 种传输协议:SSE(远程)和Stdio(本地)。

目前基本都是本地的服务原因也很好理解,MCP 生态的商业模式还没有明确,运行服务所消耗的资源需要有人来承担,那目前最顺理成章的承担方就是终端用户。但是这对于用户的使用门槛是很高的。

首先用户需要准备一个运行 Server 的环境,目前大多是基于 Node.js 开发的,也有使用 Docker 的,我很难想象一个普通用户去直接接触这些概念和操作。当然 Host 的开发者也可以考虑集成这个环境,但无疑对于开发维护甚至应用大小来说都是成本。

然后用户需要通过配置一个 JSON 文件来去引入 MCP Server,同时大多数服务还需要一个 token 参数来提供鉴权,基本都是通过各个开发者平台创建一个应用再获取授权,如果开发者使用 Node.js 开发的 MCP Server 都可以通过 npx 的命令一步安装和运行(在写出这一句话的时候作为一个产品无法抑制住吐槽的冲动)。

Remote Service

回到最初 Host 的开发者想要提供给用户的能力本身,基本都是已经存在的产品或者服务,通过 MCP Server 进行 API 的调用,比如 Slack、Github、高德地图等。

最后回到的 ChatWise 应用中,通过上述众多角色的参与,用户终于可以实现通过聊天的方式来获取比如当天的天气情况了,哦当然别忘了先安装 Node.js 和配置 JSON 文件 😆。


虽然 function calling 和 MCP 在解决的根本问题是一样的,但是我觉得他们面向的产品和用户群很不一样。当然 Claude 也很清楚 MCP 现在的问题,在官方的路线图里可以看到排名前两位的是鉴权和服务分发方式。其实在我看来还有个安全性的问题需要更多的考虑。

在我看来,Claude 想打造一个 LLM 的插件生态,当前的 MCP 还很早期,甚至是去中心化的。或者换一个角度,LLM 如果是一个OS,那这些 Server 是否可以看成是 App?就像之前有一些讨论,如果操作系统彻底 AI 化,那 App 的存在形态会是什么样的?

再把脑洞开大一点,目前的平台生态中,有哪些是可以向这个模式转化的可能性的?比如微信小程序?