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 工作流程是什么样的?

大概就是这么个过程:

  1. Host启动,连上你的MCP Server
  2. 俩人先"商量"一下:你能干啥?我有啥能力?
  3. 大模型需要用工具的时候,通过MCP调用
  4. MCP Server执行工具,把结果返回给大模型
  5. 大模型基于结果继续回答用户

四、怎么写一个MCP服务?

4.1 准备工作

先装个SDK:

pip install mcp -U

就这么简单,一行命令搞定。

4.2 来个最简单的例子

先来个"Hello World"级别的——获取当前时间:

from mcp.server.fastmcp import FastMCP
import datetime

# 创建一个MCP服务
mcp = FastMCP(host="0.0.0.0", port=8000)

@mcp.tool()  # 用这个装饰器定义工具
def get_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 来个实战点的例子

培训的时候我们做了一个自然语言查数据库的例子:

from utils import get_tools, execute_sql
from mcp.server.fastmcp import FastMCP

tools = get_tools()
mcp = FastMCP(host="0.0.0.0", port=8001)
db_path = "school.db"

@mcp.tool()
def query(query: str) -> dict:
    """
    用自然语言查询数据库

    入参:
        query: 你的问题(比如"查一下所有18岁的学生")

    返参:
        查询结果
    """
    print(f"收到问题:{query}")

    # 第一步:把自然语言转成SQL
    sql = tools[0].invoke(input=query)
    print(f"生成的SQL:{sql}")

    # 第二步:执行SQL
    result = execute_sql(db_path, sql)

    return result

if __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?

其实挺简单的,就几步:

  1. 先把你的MCP服务跑起来(比如 http://localhost:8001)
  2. 打开Dify,创建一个Agent应用
  3. 在工具配置里选"自定义工具"或者"MCP工具"
  4. 填上你的MCP服务URL
  5. 保存,搞定!

然后你就可以在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最大的价值就三个词:

  1. 解耦:大模型和工具各干各的,谁也不绑架谁
  2. 复用:写一次,到处用
  3. 安全:用户说了算,不是大模型说了算

7.2 开发思维的转变

传统开发 大模型开发
改Bug 提升概率
数据层/业务层/前端 知识层/业务层/前端
CRUD Prompt + RAG + Agent

培训的时候讲师说了句话我印象挺深:传统开发是改Bug,大模型开发是提升概率。因为你没法保证大模型每次都给你一样的输出,只能想办法让它"更可能"输出你想要的结果。

7.3 学习路线推荐

如果你也想学MCP,我建议这么来:

  1. 第一步:先搞懂MCP是什么、怎么工作的(看完这篇文章应该差不多)
  2. 第二步:自己写个简单的MCP工具玩玩
  3. 第三步:把你的工具接到Dify或者LangChain里
  4. 第四步:试试整合多个工具,搞个复杂点的Agent

八、一些有用的链接


Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐