1.几种场景介绍
在以前,设计师要在figma上辛苦的画出设计稿,然后再让程序员变成代码,才能看到产品,但现在有了MCP,ai就能读懂figma文件中的每一个设计细节,然后用极高的效率生成对应的前端代码,设计师的灵感能以前所未有的速度变成用户看得到的产品。
blender,3D建模的能力很强。但是不管是学习过程,还是建模的过程都是会花掉大量的时间,现在可以直接使用自然语言描述,然后就可以直接快速的得到一个建模结果。
游戏开发领域也是一样,使用MCP连接上unity游戏引擎,开发游戏的人可以直接使用自然语言来开发游戏。
总而言之,自然语言能够处理一切的时代,到来了!
2.什么是mcp?
MCP 本质上不是某个具体产品,而是一种协议标准,全称是 Model Context Protocol(模型上下文协议) ,是Anthropic在24年11月发布的一个协议。可以把它理解成:让大模型“标准化接入外部能力”的接口规范。
可以类比:
- HTTP:统一 Web 请求方式
- SQL:统一数据库查询方式
- MCP:统一“模型调用外部能力”的方式
核心架构并不复杂,可以拆成四个部分来看,
- mcp cient: 例如claude code、cursor、trae、codebuddy等等
- MCP协议,统一格式的通信协议
- mcp server:对应的第三方服务的“翻译”服务,将来自mcp client的需求“翻译”成对应的第三方服务能够理解的操作
- 目标的第三方服务:如figma、数据库、blender、unity等等等等
3.MCP的学习思路
你需要学习怎么从零构建一个MCP server,还要想“侦探”一样通过截获MCP server的输入输出,了解一个MCP server具体做到了什么程度。
其实叫MCP server是有一定误导性的,我理解应该叫成 MCP program 更加合适。
因为就是一个程序,符合MCP协议的一个程序。
每一个mcp server都是一个github仓库,都有一个readme文档。所以每一个人,都可以去开源和发布自己创造的MCP程序。
而MCP client端的MCP配置也很简单,一般都是一个json配置,其中的command、args、和transportType是精髓。
我们可以先看看别人写的MCP程序,目前有很多的MCP市场,例如,mcp.so、mcpmarket.com、smitherv.ai等等
目前基本都是使用python或者node来编写,启动的命令分别是uvx和npx。
其中,uv其实就是python界的一个包管理工具,其中的uvx,可以用来直接启动python程序。所以自然需要我们先安装一下uv。可以直接去uv的github仓库,找到对应系统的安装命令,安装好之后,测试uvx是否可以使用。例如执行:
uvx pycowsay 'hello world'
说白了这个命令就是帮我们,一键安装需要的依赖并执行py程序
npx和uvx类似,只不过针对的是node.js程序
由于npx是node的一部分,所以我们直接安装node就可以。
4.那么一个MCPserver到底写了什么呢?用什么语言写的?怎么就满足了所谓的MCP协议呢?
以python举例
例如我们在一个/MCPServers目录下,创建一个XXX的 mcp 程序
uv init XXX
cd ./XXX
uv venv
source .venv/bin/activate
以上命令的作用不再说明,关键是接下来的这个步骤:安装mcp开发的必要依赖
uv add "mcp[cil]" httpx
然后就是编写py脚本
关键代码:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("XXX", log_level="ERROR") # 创建mcp服务对象
然后就是在函数头上加上mcp的装饰器,@mcp.tool(),这个装饰器的用途是把函数注册为tool,它会从函数的注释中,提取这个函数的用途、以及每个参数的含义,以便模型决定调用这个函数的时机
最后加上:
if __name__ = "__main__":
mcp.run(transport='stdio')
这里的transport意思是,这个server和模型沟通的方式
这里指定为stdio,表示,沟通的方式是mcp server的输入和输出
到这里,mcp的一个server就做好了,但是其中的关键是mcp的库。
那么输入和输出,真的只能mcp client方才能看到吗,我们可不可以也看到呢?
也就是我们能否测试这个mcp的输入和输出呢?
既然这个MCP server是模型来调用的,那么我们可不可写一个测试脚本,来模拟mcp client调用的这个步骤,这样不就可以控制输入和查看输出了吗?
甚至将这个测试脚本,想办法放在调用链路的中间,每次调用都捕获MCP client的输入,捕获mcp server的输出,并写到一些文件中。
更甚至,只要确保了解了MCP server的调用所需要的数据格式之后,直接进入终端中先直接启动这个MCP server,或者说,运行这个程序,然后用你了解到的调用数据格式,自己构造“访问数据”。
5.那么这个时候,就有人要问了,以上不就是client和server两个程序之间使用mcp协议的进行通信而已吗?MCP client和模型是什么关系,目前来看,和模型并没有关系的样子呀?
确实,如果这样理解是十分正确的,如果类比HTTP,RPC等等通信协议,MCP的作用并没有什么不同。
如果仔细观察,MCP 协议主要是规定了两个部分的内容:
- 1.每一个MCPserver有哪些函数(tool)可以用
- 2.如何调用这些函数
总结起来,就是函数的注册和使用,所以确定没有规定任何和模型相关的交互方式。
市面上这么多,MCP client,Claude code、cline、cursor、trae、codex、codebuddy等等等等,他们的模型是怎么用上mcp server的呢?
实际上,不同的client和模型交互也确实有差异
例如:cline是用xml和模型通信
总之,回头看MCP的定义,模型上下文协议,各位感觉这个命名是否合适?
乍一眼看,以为是规定的和模型交互的协议,但是实际上,这个协议最多只能说是给模型服务的
和模型本身没有关系,只是和MCP client有关。
6.捋一捋时间线
2024.05.13 GPT-4o首次发布
2024.06.20 Claude 3.5 Sonnet首次发布
2024.11.25 MCP首次发布
2025.01.20 DeepSeek-R1首次发布
注意一个关键事实:MCP出现的时候,模型仍处于弱推理能力的时期。
所以,当进入到现下这个模型具有强推荐能力的时期,也开始出现反对MCP的声音。
例如:
1.Denis Yarats(Perplexity CTO)
这是最标志性的事件
-
公司内部决策:
- 放弃 MCP
- 转向 API + CLI
影响:
这是第一个大厂级别“弃 MCP”案例
2.Garry Tan(Y Combinator CEO)
他的态度非常直接(甚至有点狠):
- 评价 MCP: “就是垃圾”
3.然后是现象级的agent新产品,OpenClaw
-
从一开始就不用 MCP
-
采用:
- Skills system + CLI
说明:
新一代 agent 框架,已经绕开 MCP
原因大概就是:
-
MCP 复杂度 > 实际收益,为了调用一个工具,引入了一整套分布式协议栈
-
调试体验非常差(这是核心痛点)
-
LLM“天然会用 CLI”,不需要新协议
这里引用一篇IBM的博客,有兴趣的朋友可以看看:community.ibm.com/community/u…
举个对比例子,例如使用高德,流程如下:
- 用户输入自然语言:如“查询周边 1km 咖啡店”
- SKILL发现:Agent识别用户意图匹配到对应的SKILL
- CLI命令构造:LLM 参考SKILL中的流程,将自然语言参数转换为完整的CLI命令,如下 amap-gui searchPOI --keyword 星巴克 --city 北京 --pageSize 1
- 执行CLI命令:Agent 直接在终端执行构造好的命令
- 请求后端接口:CLI 工具解析命令参数,构造并发起 HTTP 请求调用高德API
- 结果反馈:搜到的 POI 列表返回给 Agent,供其进一步处理
对比高德MCP(StreamableHTTP)流程:
- 用户输入自然语言:如 “查询周边 1km 咖啡店”
- 工具发现:Agent识别用户意图匹配 MCP Server暴露的工具描述
- MCP 请求构造:LLM 参考 工具的input_schema,将自然语言参数转换为标准JSON-RPC消息
- 工具调用请求:MCP Client 通过 HTTP 向远程 MCP Server发tools/callRPC消息,包含请求参数
- 请求后端接口:MCP Server 解析RPC请求参数,构造并发起 HTTP 请求调用高德API
- 结果反馈:MCP 返回的 POI 列表返回给 Agent,供其进一步处理