MCP(Model Context Protocol) 初探
本文介绍了MCP(模型上下文协议)的基本概念及工作原理,展示了如何通过该协议扩展LLM能力。文章详细讲解了MCP的交互流程、服务器配置方法,并提供了实用的Docker部署示例,帮助读者理解如何让AI模型访问本地文件系统等外部资源,实现更强大的功能扩展。
1. 什么是 MCP?
MCP 就是一种 LLM 能够识别的协议。为了增强 LLM 的能力而生。如何增强它的能力?本质就是让其他服务、工具按照这个通用协议实现一些功能,然后让 LLM 调用。只要服务提供接口就行。
因为在有 MCP 之前,LLM 只能做一些在它的训练数据集范围之内的事情,后面即使有了联网搜索能力,但它能做的事情还是有限。比如我想让他帮我打开邮箱服务,发送邮件,它肯定做不到,最起码一点它无法与邮箱客户端进行交流。当有了 MCP 协议,根据这个协议实现一个服务,其内部可以调用邮箱服务的接口进行发送、接收邮件。然后把这个服务暴露给 LLM, 之后再跟它进行聊天时,可以直接触发发送邮件服务。

以 Claude desktop 为例:
sequenceDiagram
actor User as 用户
participant Client as 客户端
participant Claude as Claude
participant MCP as MCP服务器
participant Tool as 工具执行
User ->> Client: 提出问题
Client ->> Claude: 1. 发送问题
Note over Claude: 2. 分析可用工具
决定使用哪些工具
Claude ->> Client: 3. 请求执行工具
Client ->> MCP: 调用选定的工具
MCP ->> Tool: 执行工具操作
Tool -->> MCP: 返回工具执行结果
MCP -->> Client: 返回工具结果
Client -->> Claude: 4. 发送工具结果
Note over Claude: 5. 根据工具结果
生成自然语言回答
Claude -->> Client: 返回生成的响应
Client -->> User: 6. 显示回答上述的客户端即为 Claude Desktop, 也可以是 Cursor。它们的后端对应着 LLM。这里容易混淆。比如用户使用 cursor ,输入问题,cursor 客户端调用远程的 LLM 服务。然后它发现有可用的工具,并且与用户输入的需求匹配,那么它就会返回客户端,客户端此时就能决定使用哪个工具。于是向 MCP 服务器发送请求。服务器里面定义了一系列工具,此时会选定某个工具,并执行。之后将执行结果返回,一直返回到客户端,客户端让LLM 把结果进行一定的语言重新组织,然后输出给客户端,此时就是用户在客户端(Claude Desktop)上看到的信息。
客户端需要知道 mcp 服务器定义在哪,以及如何调用并运行。常见的是使用 command 进行调用。这样有两种方式:
json 配置文件:
1 | { |
Claude Desktop 的配置文件是
claude_desktop_config.json
该配置文件就是一个 json 对象,key 就是 “mcpServers”, 上面的例子就是在告诉外界,在哪里以及如何运行 weather.py 这个 mcp 服务。
另外一种方式就是直接写出命令行,比如在 cursor 中 MCP Servers 的配置可以是这样:
cmd /k npx -y @smithery/cli@latest run @wopal/mcp-server-hotnews --config {1,2,3}它等效于在配置文件.cursor/mcp.json这样写:
1 | { |
配置完成后,可以看到有可用的 MCP 工具:
2. 如何搭建 mcp server
可以在这里找:
可以直接配置使用。
在官方给出的实现示例中,大部分都提供了两种方式运行命令:一种是通过npx 命令调用,另一种是通过docker 容器调用,在我的环境中我个人偏向这种。
使用 docker 时,先拉取镜像到本地,比如我想要部署文件操作相关的 MCP server, 先拉取镜像:
1 | docker build -t mcp/filesystem -f src/filesystem/Dockerfile . |
前提是先 clone 了这个仓库: https://github.com/modelcontextprotocol/servers, 并进入仓库根目录
然后在 claude_desktop_config.json 文件中添加配置:
1 | "filesystem": { |
按照规定,目录都需要绑定到
/projects目录下。
现在LLM 能够直接操作这个指定的本地目录中的内容了(配置中给定了 ro 权限)
为了安全起见,也可以指定有限的读权限,通过在配置中设置ro, 如上面挂载的第二个文件目录结尾。
配置成功后,就能在 Claude 对话框的 🔨 按钮处看到可用的 MCP 工具了:
如在在对话过程中要求 AI 将某些数据写入指定文件,就会激活 MCP 工具,允许它执行后,就能将结果写入指定文件。
3. 搭建 mcp Client
sequenceDiagram
actor User as 用户
participant Client as MCP客户端
participant Claude as Claude AI
participant Server as MCP服务器
participant Tools as 工具执行
Note over User, Tools: 初始化阶段
User ->> Client: 启动客户端
(uv run client.py server.py)
Client ->> Server: 连接服务器
Server -->> Client: 确认连接
Client ->> Server: 请求可用工具列表
Server -->> Client: 返回工具列表
Client -->> User: 显示可用工具和启动提示
Note over User, Tools: 对话循环
loop 交互会话
User ->> Client: 输入查询
Client ->> Claude: 发送查询和工具描述
Note over Claude: 分析查询并决定
是否使用工具
alt 需要使用工具
Claude ->> Client: 请求执行工具调用
Client ->> Server: 转发工具调用请求
Server ->> Tools: 执行指定工具
Tools -->> Server: 返回执行结果
Server -->> Client: 返回工具结果
Client -->> Claude: 发送工具执行结果
end
Claude -->> Client: 生成最终响应
Client -->> User: 显示响应
end
User ->> Client: 输入"quit"
Client ->> Server: 关闭连接
Client -->> User: 结束会话参考: https://modelcontextprotocol.io/introduction