MCP(Model Context Protocol,模型上下文协议)是 Anthropic 推出的一种开放协议,它让 AI 模型能够安全地连接和使用外部的工具、数据源和服务。

前置教程

如想快速开始本教程,你可能需要先完成以下前置教程:

1. 什么是 MCP?

说起MCP,要先理解大语言模型(Large Language Model,LLM)的能力和限制,LLM 本身只能处理和生成文本,但不能直接与外部工具交互,相当于一个人只有五官而没有手脚,这极大地制约了其能力。为了解决这一问题,人们通过让 LLM 生成访问外部工具指令的方式,实现与外部工具的交互。但由于市面上的 LLM 、外部服务、指令格式、认证方式等均有不同程度的差异,于是 MCP 应运而生,它是统一的、标准的、符合人类和 AI 直觉的 LLM 调用外部服务和工具的规范协议,这让不同的外部服务、LLM模型和任务指令实现跨设备、跨区域甚至跨网络的任务交互。

2. MCP 的工作原理

2.1 核心概念

概念 说明
MCP 客户端 各类Agent工具应用(如Claude Code)、VS Code、LLM服务提供平台(如Dify)等,负责发现和调用工具
MCP 服务器 独立的进程或服务,暴露一组工具集合给客户端,如高德提供的地图服务、百度提供的翻译服务等
工具 (Tools) 前文提到的具体集合,如 read_file(读取文件)、search_web(联网搜索)

2.2 传输机制

  1. stdio:服务器作为子进程运行,通过标准输入/输出通信(适合本地工具)
  2. Streamable HTTP:服务器作为独立 HTTP 服务运行,利用 SSE 实现服务器主动推送(适合远程服务)

SSE(Server-Sent Events) 是一种基于 HTTP 的轻量级服务器推送技术,允许服务器通过持久连接向客户端单向实时推送数据,常用于通知、流式响应和进度更新等场景。

2.3 完整调用流程

  1. MCP客户端启动时,读取相应的的 MCP 服务器配置
  2. 每个MCP服务器启动后,通过 tools/list 接口告知MCP客户端自己提供哪些工具
  3. 用户在对话中提出需求,MCP客户端 判断需要调用哪个工具
  4. 用户审批(除非该工具已设置为 autoApprove
  5. MCP服务器执行工具并返回结果
  6. MCP客户端将工具结果整合到对话中回复用户
sequenceDiagram participant User as 用户 participant Client as MCP客户端 participant LLM as LLM(大语言模型) participant Server as MCP服务器 Note over Client,Server: 节点1:启动与配置 Client->>Client: 读取MCP服务器配置文件 Client->>Server: 启动/连接服务器 Note over Client,Server: 节点2:能力发现 Client->>Server: tools/list Server-->>Client: 返回工具列表 Note over User,LLM: 节点3:需求理解与工具选择 User->>Client: 提出需求(自然语言) Client->>LLM: 用户需求 + 工具列表 LLM->>LLM: 分析需求,匹配工具并提取参数 LLM-->>Client: 返回工具名称 + 参数 Note over User,Client: 节点4:用户审批 Client->>User: 请求审批(显示工具及参数) alt autoApprove = true User-->>Client: 自动通过 else autoApprove = false User->>Client: 确认执行 end Note over Client,Server: 节点5:工具执行 Client->>Server: 调用工具并传递参数 Server->>Server: 执行工具逻辑 Server-->>Client: 返回执行结果(结构化数据) Note over Client,User: 节点6:结果整合与回复 Client->>LLM: 工具执行结果 LLM->>LLM: 转化为自然语言回复 LLM-->>Client: 返回自然语言回复 Client-->>User: 展示最终回复

3. 快速上手体验MCP服务:open-WebSearch (联网搜索MCP)

open-WebSearch 是一个开源的联网搜索MCP服务,支持多种搜索引擎,如Google、Bing、DuckDuckGo等,你可以访问Github仓库了解更多信息。

3.1 安装 open-WebSearch

Git Bash中执行以下命令:

# npx 安装 open-WebSearch
$ npx open-WebSearch@latest
终端显示以下内容表示安装成功且服务在3000端口上运行:

open-WebSearch 安装成功示意图

3.2 在 Cherry Studio 中配置使用

  1. 打开 Cherry Studio,点击左下角设置按钮,进入 MCP 设置项,点击右上角+,选择从JSON导入Cherry Studio MCP 配置导入示意图
  2. 将以下内容粘贴至对话框中:

    {
      "mcpServers": {
        "web-search": {
          "name": "Web Search MCP",
          "type": "sse",
          "description": "Multi-engine web search with article fetching",
          "isActive": true,
          "baseUrl": "http://localhost:3000/mcp"
        }
      }
    }
    
    配置说明:

    • name:服务器名称
    • type:传输模式(SSE)
    • description:工具描述,用于LLM理解
    • isActive:是否启用
    • baseUrl:服务器地址
  3. 点击确定保存配置,并在退出对话框后点击开启按钮,链接服务。 Cherry Studio MCP 服务开启示意图

  4. 在聊天界面开启MCP功能: Cherry Studio MCP 功能开关示意图

Cherry Studio 初始设置MCP功能后可能不能正确识别和调用,只需要关闭软件再次打开即可。

4. 自定义 MCP 服务器

我们在前面的章节中已经介绍了如何使用别人提供的MCP服务,实际上,你也可以编写自己的 MCP 服务器,以下是用 Python 实现的最小示例:

FastMCP 是构建在 MCP Python SDK 之上的开源项目,底层基于 FastAPI + Starlette,大幅简化了 MCP 服务器的开发。我们将借助于 FastMCP 实现一个简单的 MCP 服务器,支持 addsub 两个工具。

4.1 创建环境并安装依赖

# conda 创建环境
conda create -n fastmcp python=3.10

# 激活环境
conda activate fastmcp

# 安装依赖
pip install fastmcp httpx

4.2 创建后端服务(使用 FastMCP + SSE 模式)

当需要远程访问 MCP 服务,或将 MCP 嵌入已有的 FastAPI Web 应用时,可以使用 SSE(Server-Sent Events)模式:

创建一个 server.py 文件,内容如下:

from fastmcp import FastMCP

# 创建 MCP 服务器
mcp = FastMCP("my-fastmcp-server")

@mcp.tool()
def add(a: int, b: int) -> int:
    """计算两个数的和"""
    return a + b

@mcp.tool()
def sub(a: int, b: int) -> int:
    """计算两个数的差"""
    return a - b

if __name__ == "__main__":
    # 以 SSE 模式运行(HTTP 服务器,支持 MCP 协议的 SSE 传输)
    # 可通过 MCP 客户端(如 Claude Desktop)通过 sse:// 地址连接
    mcp.run(transport="sse", host="0.0.0.0", port=8001)

启动服务:

python server.py

终端中显示以下内容表示服务启动成功:

FastMCP 服务启动成功示意图

在Cherry Studio中配置使用(SSE 模式):

复制以下内容到Cherry Studio的MCP服务器配置中:

{
  "mcpServers": {
    "my-fastmcp-server": {
      "type": "sse",
      "url": "http://localhost:8001/sse"
    }
  }
}

Cherry Studio FastMCP 配置示意图

5. 总结

5.1 核心内容回顾

经过本节内容的学习,你已经掌握了以下知识:

知识点 核心要点 掌握程度
MCP 基本概念 MCP 是 AI 模型与外部工具/数据源之间的开放协议,统一了工具调用的接口标准 理解
MCP 工作原理 客户端-服务器架构,通过 stdio 或 SSE 两种传输方式进行通信 理解
MCP 完整调用流程 客户端启动 - 工具发现(tools/list) - 用户意图匹配 - 用户审批 - 工具执行 - 结果整合 掌握
快速上手体验 通过 Cherry Studio + open-WebSearch 体验了真实的 MCP 服务调用 实践
自定义 MCP 服务器 使用 Python + FastMCP 编写了具有 add/sub 工具的 MCP 服务器 实践

5.2 常见问题与解答(FAQ)

问:MCP 和 OpenAI Function Calling 有什么区别?

MCP 是开放协议,不绑定任何特定模型或厂商;Function Calling 是 OpenAI 的私有 API 特性。MCP 允许你在不同客户端、不同模型之间复用同一套工具。如果用 Function Calling,工具定义和调用逻辑都紧密耦合在 OpenAI API 上,迁移成本高。

问:stdio 和 SSE 我应该选哪个?

场景 推荐模式 原因
本地开发、个人使用 stdio 零配置、启动快、安全性高
团队共享、远程调用 SSE 可通过网络访问,适合服务化部署
嵌入已有 Web 应用 SSE 可复用现有的域名、认证、网关
Docker 容器部署 SSE 容器对外暴露 HTTP 端口更自然

问:MCP 服务器可以部署在公网吗?

可以,但必须做好安全防护:

  • 建议部署在内网或 VPN 内,或通过反向代理(Nginx、Caddy)添加认证层
  • 工具操作应遵循最小权限原则
  • 对于敏感操作(文件读写、数据库修改),客户端侧应设置手动审批

问:一个 MCP 服务器可以注册多少个工具?

没有硬性限制。但建议一个服务器聚焦于同一领域的功能(如"文件操作工具集"、"代码分析工具集"),便于维护和复用。如果工具过多,应考虑拆分到多个 MCP 服务器中。

问:如何获取更多的 MCP 服务?

有很多 MCP 服务市场可供选择,比如:

这些服务市场提供了丰富的 MCP 服务,你可以根据需求选择合适的服务。