Skip to content

介绍 MCP

· 8 min
TL;DR

MCP(Model Context Protocol) 初探

本文介绍了 MCP(模型上下文协议)的基本概念及工作原理,展示了如何通过该协议扩展 LLM 能力。文章详细讲解了 MCP 的交互流程、服务器配置方法,并提供了实用的 Docker 部署示例,帮助读者理解如何让 AI 模型访问本地文件系统等外部资源,实现更强大的功能扩展。

1. 什么是 MCP?#

MCP 就是一种 LLM 能够识别的协议。为了增强 LLM 的能力而生。如何增强它的能力?本质就是让其他服务、工具按照这个通用协议实现一些功能,然后让 LLM 调用。只要服务提供接口就行。

因为在有 MCP 之前,LLM 只能做一些在它的训练数据集范围之内的事情,后面即使有了联网搜索能力,但它能做的事情还是有限。比如我想让他帮我打开邮箱服务,发送邮件,它肯定做不到,最起码一点它无法与邮箱客户端进行交流。当有了 MCP 协议,根据这个协议实现一个服务,其内部可以调用邮箱服务的接口进行发送、接收邮件。然后把这个服务暴露给 LLM, 之后再跟它进行聊天时,可以直接触发发送邮件服务。

image.png

以 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. 分析可用工具<br>决定使用哪些工具
Claude ->> Client: 3. 请求执行工具
Client ->> MCP: 调用选定的工具
MCP ->> Tool: 执行工具操作
Tool -->> MCP: 返回工具执行结果
MCP -->> Client: 返回工具结果
Client -->> Claude: 4. 发送工具结果
Note over Claude: 5. 根据工具结果<br>生成自然语言回答
Claude -->> Client: 返回生成的响应
Client -->> User: 6. 显示回答

上述的客户端即为 Claude Desktop, 也可以是 Cursor。它们的后端对应着 LLM。这里容易混淆。比如用户使用 cursor,输入问题,cursor 客户端调用远程的 LLM 服务。然后它发现有可用的工具,并且与用户输入的需求匹配,那么它就会返回客户端,客户端此时就能决定使用哪个工具。 于是向 MCP 服务器发送请求。服务器里面定义了一系列工具,此时会选定某个工具,并执行。之后将执行结果返回,一直返回到客户端,客户端让 LLM 把结果进行一定的语言重新组织,然后输出给客户端,此时就是用户在客户端(Claude Desktop)上看到的信息。

客户端需要知道 mcp 服务器定义在哪,以及如何调用并运行。常见的是使用 command 进行调用。这样有两种方式:

  1. json 配置文件:
{
"mcpServers": {
"weather": {
"command": "uv",
"args": [
"--directory",
"D:\\WORK\\AI_workstation\\weather",
"run",
"weather.py"
]
}
"other server": {
"command": "uv",
"args": [
"--directory",
"path to the server file dir",
"run",
"server script"
]
}
}
}

Claude Desktop 的配置文件是 claude_desktop_config.json

该配置文件就是一个 json 对象,key 就是 “mcpServers”, 上面的例子就是在告诉外界,在哪里以及如何运行 weather.py 这个 mcp 服务。

  1. 另外一种方式就是直接写出命令行,比如在 cursor 中 MCP Servers 的配置可以是这样:cmd /k npx -y @smithery/cli@latest run @wopal/mcp-server-hotnews --config {1,2,3} 它等效于在配置文件 .cursor/mcp.json 这样写:
{
"mcpServers": {
"@wopal-mcp-server-hotnews": {
"command": "cmd /k npx",
"args": [
"-y",
"@smithery/cli@latest",
"run",
"@wopal/mcp-server-hotnews",
"--config",
"{1,2,3}"
]
}
}
}

配置完成后,可以看到有可用的 MCP 工具: image.png

2. 如何搭建 mcp server#

可以在这里找:

可以直接配置使用。

在官方给出的实现示例中,大部分都提供了两种方式运行命令:一种是通过 npx 命令调用,另一种是通过 docker 容器调用,在我的环境中我个人偏向这种。

使用 docker 时,先拉取镜像到本地,比如我想要部署文件操作相关的 MCP server, 先拉取镜像:

Terminal window
docker build -t mcp/filesystem -f src/filesystem/Dockerfile .

前提是先 clone 了这个仓库:https://github.com/modelcontextprotocol/servers,并进入仓库根目录

然后在 claude_desktop_config.json 文件中添加配置:

"filesystem": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--mount", "type=bind,src=D:\\WORK\\AI_workstation,dst=/projects/allowed/dir",
"--mount", "type=bind,src=D:\\path\\to\\readonly\\dir,dst=/projects/other/allowed/dir,ro",
"mcp/filesystem",
"/projects"
]
}

按照规定,目录都需要绑定到 /projects 目录下。

现在 LLM 能够直接操作这个指定的本地目录中的内容了 (配置中给定了 ro 权限)

为了安全起见,也可以指定有限的读权限,通过在配置中设置 ro, 如上面挂载的第二个文件目录结尾。

配置成功后,就能在 Claude 对话框的 🔨 按钮处看到可用的 MCP 工具了: image.png

如在在对话过程中要求 AI 将某些数据写入指定文件,就会激活 MCP 工具,允许它执行后,就能将结果写入指定文件。 image.png

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: 启动客户端<br>(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: 分析查询并决定<br>是否使用工具
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

4. 资源:#