MCP:“AI界的USB-C“
MCP:“AI界的USB-C”
这篇文章整理自我参加MCP培训后的学习笔记,也结合了课件里的示例。复盘:MCP 是什么、解决什么问题,以及怎么用起来。
一、先说说MCP到底是个啥
用人话解释一下
MCP=Model Context Protocol= 模型上下文协议
名字听着挺学术的,其实就是 Anthropic 在2024年11月搞出来的一个开放标准。目的很单纯:给大模型和外部工具之间搭一座标准化的桥。
为什么叫"USB-C接口"?
这个比喻真的绝了,我直接上张表对比一下:
| USB-C接口 | MCP协议 | |
|---|---|---|
| 解决什么问题 | 以前各种数据线乱七八糟 | 以前各种AI工具适配器乱七八糟 |
| 核心特点 | 一根线通吃 | 一个协议通吃 |
| 能干嘛 | 充电、传数据、连显示器 | 调工具、查数据、传上下文 |
| 谁都能用 | 任何品牌设备 | 任何大模型 |
说人话就是:以前每接一个设备都要找专门的线,现在一根Type-C搞定;以前每接一个大模型都要写专门的适配器,现在一个MCP搞定。
二、MCP到底解决了什么痛点?
2.1 "M×N"的集成噩梦
培训的时候讲师画了个图,我直接给大家还原一下:
没有MCP的时候:
- 有M个大模型(Claude、GPT、Qwen…)
- 有N个外部工具(数据库、API、文件系统…)
- 集成工作量 = M × N
有了MCP之后:
- 工具开发者:按MCP标准开发一次
- 任何支持MCP的模型:直接就能用
- 集成工作量 = M + N
举个栗子:你有3个大模型、5个工具
- 以前:3 × 5 = 15次适配
- 现在:3 + 5 = 8次对接
2.2 四个核心价值
| 价值点 | 之前怎么办 | 现在怎么办 |
|---|---|---|
| 通用连接器 | 每个模型单独适配 | 写一次,到处用 |
| 上下文管理 | 自己写一堆状态管理代码 | MCP帮你管好 |
| 安全控制 | 自己设计权限系统 | 自带细粒度权限控制 |
| 功能扩展 | 改代码、加接口 | 像插U盘一样加工具 |
三、MCP是怎么工作的?
3.1 架构其实很简单
就是个经典的C/S架构,我画个图给大家看看:
用户 ──▶ AI应用 ──▶ MCP客户端 ──▶ MCP服务 ──▶ 你的工具 ▲ │ │ ▼ └──────────────── 收到结果 ◀───────┘2.2 里面的几个角色
| 角色 | 是什么 | 举个栗子 |
|---|---|---|
| Host | 运行大模型的应用 | Claude Desktop、Dify |
| Client | Host里面的MCP客户端 | 内置的,不用管 |
| Server | 你写的MCP服务 | 你自己开发的 |
| 工具 | 大模型能调用的函数 | 查数据库、调用API |
2.3 工作流程是什么样的?
大概就是这么个过程:
- Host启动,连上你的MCP Server
- 俩人先"商量"一下:你能干啥?我有啥能力?
- 大模型需要用工具的时候,通过MCP调用
- MCP Server执行工具,把结果返回给大模型
- 大模型基于结果继续回答用户
四、怎么写一个MCP服务?
4.1 准备工作
先装个SDK:
pipinstallmcp-U就这么简单,一行命令搞定。
4.2 来个最简单的例子
先来个"Hello World"级别的——获取当前时间:
frommcp.server.fastmcpimportFastMCPimportdatetime# 创建一个MCP服务mcp=FastMCP(host="0.0.0.0",port=8000)@mcp.tool()# 用这个装饰器定义工具defget_current_datetime()->dict:""" 获取当前的日期和时间 入参:无 返参:当前日期和时间 """current_datetime=datetime.datetime.now()formatted_datetime=current_datetime.strftime("%Y-%m-%d %H:%M:%S")print(f"大模型叫我干活了!当前时间:{formatted_datetime}")return{"current_datetime":formatted_datetime}if__name__=="__main__":# 启动服务mcp.run(transport="streamable-http")运行这个脚本,你的MCP服务就启动了!任何支持MCP的应用都能调用这个get_current_datetime工具。
4.3 来个实战点的例子
培训的时候我们做了一个自然语言查数据库的例子:
fromutilsimportget_tools,execute_sqlfrommcp.server.fastmcpimportFastMCP tools=get_tools()mcp=FastMCP(host="0.0.0.0",port=8001)db_path="school.db"@mcp.tool()defquery(query:str)->dict:""" 用自然语言查询数据库 入参: query: 你的问题(比如"查一下所有18岁的学生") 返参: 查询结果 """print(f"收到问题:{query}")# 第一步:把自然语言转成SQLsql=tools[0].invoke(input=query)print(f"生成的SQL:{sql}")# 第二步:执行SQLresult=execute_sql(db_path,sql)returnresultif__name__=="__main__":mcp.run(transport="streamable-http")这个例子挺有意思的,大模型负责理解你的问题,生成SQL,然后MCP负责执行,最后把结果返回给大模型让它用自然语言告诉你结果。
4.4 写MCP工具要注意啥?
培训的时候讲师强调了几个原则,我记下来了:
| 原则 | 啥意思 | 举个反例 |
|---|---|---|
| 职责分离 | 工具负责"执行",资源负责"读取" | 别把读取文件做成工具 |
| 单一专注 | 一个服务干一类事 | 别把天气查询和邮件发送放一个服务里 |
| 安全可控 | 用户要明确授权 | 别偷偷执行危险操作 |
| 标准定义 | 参数用JSON Schema定义好 | 别返回奇奇怪怪的数据格式 |
五、在Dify里用MCP
5.1 Dify有五种应用,选哪个?
培训的时候老师花了不少时间讲这个,我整理了一下:
| 类型 | 适合干嘛 | 能不能用MCP工具 |
|---|---|---|
| 文本生成 | 一句话生成文本 | 不能 |
| 聊天助手 | 聊天问答 | 勉强能 |
| Agent | 复杂任务+工具调用 | 强烈推荐 |
| 工作流 | 后台自动化处理 | 可以,要手动配置 |
| Chatflow | 复杂的对话流程 | 可以 |
重点:如果你想用MCP工具,选Agent就对了!
5.2 怎么把MCP接到Dify?
其实挺简单的,就几步:
- 先把你的MCP服务跑起来(比如 http://localhost:8001)
- 打开Dify,创建一个Agent应用
- 在工具配置里选"自定义工具"或者"MCP工具"
- 填上你的MCP服务URL
- 保存,搞定!
然后你就可以在Dify的对话里直接用了:
你:帮我查一下所有18岁的学生 Agent:[调用你的query工具] → 找到了3个学生...5.3 还能接别人的MCP服务
这个真的挺有意思的,比如高德地图搞了个MCP服务:
https://mcp.amap.com/mcp?key=你的密钥把这个URL填到Dify里,你的Agent就能:
- 根据地址名查经纬度
- 规划路线
- 查周边有什么
不用写任何代码,直接就能用!
六、MCP的三种传输方式
培训的时候提了一嘴这个,简单说下:
| 方式 | 啥特点 | 现状 |
|---|---|---|
| stdio | 本地用,标准输入输出 | 没人用 |
| SSE | 远程调用,单向传输 | 已经淘汰了 |
| streamable-http | 远程调用,双向传输 | 现在就是这个 |
建议:直接用streamable-http,支持远程调用,双向通信,对中文支持也好(UTF-8编码)。
七、我的学习心得
7.1 培训最大的收获
尽管目前Skills已经逐渐囊括了MCP的功能,但是我认为掌握MCP这种架构思路,仍然是企业落地应用推动者要学会的。
我觉得MCP最大的价值就三个词:
- 解耦:大模型和工具各干各的,谁也不绑架谁
- 复用:写一次,到处用
- 安全:用户说了算,不是大模型说了算
7.2 开发思维的转变
| 传统开发 | 大模型开发 |
|---|---|
| 改Bug | 提升概率 |
| 数据层/业务层/前端 | 知识层/业务层/前端 |
| CRUD | Prompt + RAG + Agent |
培训的时候讲师说了句话我印象挺深:传统开发是改Bug,大模型开发是提升概率。因为你没法保证大模型每次都给你一样的输出,只能想办法让它"更可能"输出你想要的结果。
7.3 学习路线推荐
如果你也想学MCP,我建议这么来:
- 第一步:先搞懂MCP是什么、怎么工作的(看完这篇文章应该差不多)
- 第二步:自己写个简单的MCP工具玩玩
- 第三步:把你的工具接到Dify或者LangChain里
- 第四步:试试整合多个工具,搞个复杂点的Agent
八、一些有用的链接
- MCP官方文档
- MCP的GitHub仓库
- Dify官网
- FastAPI文档(MCP底层用的就是这个)
