一文看懂MCP协议

一文 看懂MCP协议

什么是MCP协议?

MCP(Model Context Protocol,模型上下文协议)是一种开放标准协议,用于将AI模型连接到各种外部工具和数据源,还有大家常说的 AI界的USB接口(相信大家已经听吐了)。

通俗来说就是,这个世界已经打造为适合人类的样子,现阶段的AI对现实世界的理解充满着不确定性,对事物的理解能力也没有人那么强,那么我们需要定义一种协议来

  • 告诉AI怎么调用我们的工具(JSONSchema),参数名、参数类型、参数描述。
  • 响应AI的Tool call(前提是遵守我们定义的JsonSchema)
  • 返回给AI结果,AI携带上结果继续发起对话(相当于省略了我们按照AI的提示执行命令,然后复制一段报错信息给AI的过程)

现在作为一个还算懂点技术的人今天来从技术的角度来聊一聊MCP协议。

为什么MCP协议如此重要?

在MCP协议出现之前,要想将AI模型与外部工具交互是一件复杂且不稳定的,Tool call的出现还是比较早的,openai很早就支持了,并且由于没有标准也就意味着每一个人Tool call的实现方式就不一样,有人用tool call,有人用json_response的方式,对参数使用也不一致。

2024年11月推出的Mcp成为了现阶段最合适的解决方案,甚至openai也加入到这个生态中。

MCP协议架构

MCP使用客户端-服务器架构,其核心组件包括:

  1. MCP主机(Host):面向用户的AI界面(如Claude Desktop、Cursor、Cline插件等),可连接到多个MCP服务器。附带一张Mcp协议支持情况图。

  2. MCP客户端(Client):管理主机和服务器之间安全连接的中介,每个服务器一个客户端以实现隔离。客户端位于主机应用程序中。

  3. MCP服务器(Server):提供特定功能(工具、数据访问、领域提示)的外部程序,连接到Google Drive、Slack、GitHub、数据库和Web浏览器等各种数据源。

  4. 传输层(Transport Layer):客户端和服务器之间的通信机制。MCP支持两种主要传输方式:

  • STDIO(标准输入/输出):类似于Python的subprocess.Popen,然后write/read stdout来实现,但是我们不用操心transport layer,官方已经提供了python和javascript的sdk,几乎是一键接入,有能力的话发布至pypi或npm后用户使用也非常简单,python可以使用现在的明星包管理工具uv(uvx)或者js使用npx,都可以实现一键运行
  • HTTP+SSE(服务器发送事件):用于远程连接,HTTP用于客户端请求,SSE用于服务器响应和流式传输,这个现在用的比较少,比如CLaude Desktop现在不支持这种方式,cursor其他IDE没试过,但是主流应该还是STDIO的方案

MCP与API的对比

MCP与传统API(有openapi支持的restful api)其实比较像。虽然二者都实现了系统间的通信,但MCP有一些关键优势:

  1. 单一协议集成所有功能,不要误以为MCP只包含Tool call,实际上还有Prompts,Resources等,只不过现在各个Client对这些特性的支持比较有限Resources - Model Context Protocol
  2. 实时数据更新,而不是静态连接,例如在Claude Desktop中一次对话可以多次调用Tool call,并且根据Tool call result做出决策
  3. 动态工具发现和上下文处理,mcp协议有notifications/tools/list_changed事件可以支持热更新工具列表

MCP的核心优势

  1. 简化开发:只需编写一次代码,就可以多次集成,官方主推语言时python和js,动态语言跨平台天生优势相比Go Rust等工具分发起来要容易很多,结合pypi和npm分发起来也非常方便,现在Python也有自己的npx(uvx)哈哈,明星工具UV。
  2. 灵活性:可以在不进行复杂重新配置的情况下切换AI模型或工具。
  3. 实时响应:MCP连接保持活跃,也就是说我在配置文件新增了工具之后不需要重启客户端就能实现工具的热更新。
  4. 安全合规:内置访问控制和标准化安全实践,不用多解释了,AI最重要的课题之一就是安全。
  5. 可扩展性:随着AI生态系统的增长,可以添加来自官方、社区的各种新工具,以前AI主要是卷提示词,现在大家也都开始卷MCP了。

MCP的实际应用场景

MCP协议在各种场景中展现出强大的功能:

我作为一个Python开发者,提供一个场景你就知道了

我正在开发一个Django5 ninja + vue3 + elementui的项目,集成以下Mcp Server:

  • filesystem:官方出品的Mcp Server,支持修改、创建文件等常见操作,非常好用,虽然edit_file是exact替换,但是claude3.7 pro上表现还不错,匹配不上的情况不是特别多

  • fetch:自动拉取elementui文档,自动拉取ninja的openapi.json,自动接口测试

  • github:用过Python的我觉得都可以用起来,众所周知Python语言特性太丰富了,即便是大几K star的项目也不能保证没有bug,文档也不一定全,这时候让claude直接去读github是非常爽的,完全不需要人工干预定位代码,提供代码用法,找到错误。这是我遇到django-ninja的TestApiclient确实login方法时让他查询github仓库确认并给出解决方案。


  • playwright:微软出品必属精品,可以作为自动化(但是实测效率不是特别高),我用来作为fetch的补充,因为spa应用fetch不一定能拿到内容。

如何用上MCP

  1. Claude Desktop:这个算是样板间了,Claude官方提供的方案,Claude Pro可以直接使用。优点是不限制上下文和次数,缺点就不用说了国内用不了,即便是代充也非常容易被封号,我自己的话用的是别人搭的Claude镜像站,现在自己尝试做了一套工具现在Claude Web也能用上Mcp算是满足需求了


  2. Cursor集成:Cursor和Claude Pro价格一样,结合MCP加上Cursor自身的上下文感知能力非常强,能让很多原本不连贯的编程体验现在只需要accept再accept就可以了,缺点就是贵,而且现在Claude3.7 thinking需要两次高级请求,成本有点高。


  3. Cline插件使用:Cline是开源的,而且是作为插件嵌入到vscode,之前使用vscode的同学完全不会有迁移的痛苦,现在微软开始封cursor的扩展商店了很多人习惯的插件可能在cursor就用不到了,cline的优势就出来了,还有一个即是有点也是缺点的特性就是需要自己提供provider,也就是说要自己去买Token,这个成本不用我说也知道有多高了,尤其是现在Claude3.7 thinking,国内主力用可以考虑deepseek r1和claude3.7混用,毕竟挣得是人民币花美元还是有点吃不消哈哈。Cline在Mcp这块非常积极,在Mcp支持这块比Cursor要强很多,可以一键安装,有点应用商店的感觉,现在大家也都在做Mcp Server的应用商店,cline在这块很有优势。

29 个赞

感谢佬友分享:folded_hands:

2 个赞

感谢讲解

2 个赞

感谢大佬的讲解

1 个赞

感谢大佬的讲解

1 个赞

大佬牛逼

1 个赞

有个小疑问,我一直很好奇 mcp 通过配置文件就能实现安装,他是通过配置文件自动安装在本地吗,另外怎么区分我使用的mcp工具是远程的还是本地的~

另外这个错误是我的问题还是 mcp 工具的问题~

1 个赞

这个~

通过python或者node写的包发布,然后可以让你下载,跟你在linux中使用apt get install xxx差不多,然后LLM把自然语言翻译成调用它内置函数的命令,这里我不太明白怎样强制LLM是调用MCP的,是通过client声明吗?

1 个赞

感谢佬的分享

好像是我的参数写的有问题,改了下就又可以了, 感谢!

所以这个install 是的服务端? 因为我看有些mcp仓库会有 server端的部署, 我有点搞不太明白 hahah

感谢佬友分享,谢谢

讲得很好:+1:t2:

楼主平时用 mcp 做什么呢?感觉平时好像没有什么需要 mcp 去做的事情呢

1 个赞

感谢佬友的好文

不错 奥利给

学习了,感谢大佬分享,感觉未来发展会有mcp+cursor的产品出现,编写代码会越来越高效

感谢分享 :raised_hands:

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。