前言
你有没有遇到过这种场景:你让 Claude 帮你分析一份本地的 CSV 销售数据,或者读取某个目录下的日志文件,结果它一脸无辜地说"我无法访问你的文件"?
问题不在于 Claude 不够聪明,而在于它缺少"手"。大型语言模型默认是纯文本接口,看不到你本地的文件、数据库、API。而 MCP(Model Context Protocol,模型上下文协议) 正是为了解决这个问题而生的标准协议------它让 AI 客户端(如 Claude Desktop、Cursor、VS Code)通过统一的协议调用你本地的工具和服务。
今天这篇博客,我带你从零搭建一个 MCP 服务器,把你的本地文件系统变成一个 AI 可以直接"摸"到的数据源。
一、MCP 到底是什么?大白话解释
你可以把 MCP 理解成 AI 和外部世界之间的"翻译官"。
传统模式下,AI 只有一个聊天窗口,你能发的只有文字。有了 MCP 之后,AI 可以:
-
读取你的本地文件(日志、配置、数据库)
-
调用你写的 Python 脚本
-
连接外部 API(天气、股票、Jira 等)
MCP 的核心架构只有三个角色:
| 角色 | 职责 | 举例 |
|---|---|---|
| Host(客户端) | 发起请求,转发给 LLM | Claude Desktop、Cursor、VS Code |
| MCP Server(服务端) | 提供工具和能力 | 你写的文件读取服务器 |
| LLM(大模型) | 理解用户意图,调用工具 | Claude 3.5 Sonnet |
当你在 Cursor 里问"帮我看看昨天的错误日志",MCP 的工作流程如下:
你 → Cursor(Cursor) → MCP Server(读取文件) → 返回日志内容 → Claude 分析 → 返回答案
全程对用户透明,就像 AI 天生就有这个能力。
二、环境准备
MCP 推荐使用 Python 生态的 mcp 库,安装非常简单:
bash
# 创建专用虚拟环境(推荐)
python3 -m venv ~/mcp-tutorial-venv
source ~/mcp-tutorial-venv/bin/activate
# 安装 MCP SDK
pip install "mcp[cli]"
验证安装成功:
bash
mcp --version
确保你的 MCP Host(比如 Claude Desktop)也支持 MCP。目前 Claude Desktop、Cursor、VS Code 原生支持 MCP Server 配置。
三、实操步骤:搭建你的第一个 MCP 文件读取服务器
我们写一个 MCP Server,让 AI 能读取指定目录下的所有 Markdown 文件。
步骤 1:创建服务器代码
新建文件 ~/mcp-tutorial/file_read_server.py:
python
from mcp.server.fastmcp import FastMCP
from pathlib import Path
# 初始化 MCP 服务器
mcp = FastMCP(
"LocalFileReader",
description="读取本地目录下的 Markdown 文件"
)
# 定义第一个工具:读取单个文件
@mcp.tool()
def read_markdown_file(filepath: str) -> str:
"""读取指定的 Markdown 文件内容"""
try:
path = Path(filepath)
if not path.exists():
return f"❌ 文件不存在: {filepath}"
if not path.suffix == ".md":
return f"❌ 只支持 .md 文件,当前后缀: {path.suffix}"
return path.read_text(encoding="utf-8")
except Exception as e:
return f"❌ 读取失败: {e}"
# 定义第二个工具:列出目录下所有 md 文件
@mcp.tool()
def list_markdown_files(directory: str) -> str:
"""列出指定目录下所有 Markdown 文件"""
try:
dir_path = Path(directory)
if not dir_path.exists():
return f"❌ 目录不存在: {directory}"
files = sorted(dir_path.glob("**/*.md"))
if not files:
return f"📭 目录 {directory} 下没有找到 .md 文件"
result = f"📂 共找到 {len(files)} 个文件:\n\n"
for f in files:
result += f" - {f.relative_to(dir_path)}\n"
return result
except Exception as e:
return f"❌ 列表失败: {e}"
# 启动服务器
mcp.run()
代码解读:
-
FastMCP是官方提供的高层封装,比底层mcp.Server简洁很多 -
@mcp.tool()装饰器把一个普通 Python 函数注册为 AI 可调用的"工具" -
工具参数用类型注解描述,LLM 会自动理解每个参数含义
-
返回值是字符串,会直接喂给 LLM 做后续分析
步骤 2:启动服务器
bash
# 先激活虚拟环境
source ~/mcp-tutorial-venv/bin/activate
# 启动 MCP 服务器(使用 stdio 传输模式)
python ~/mcp-tutorial/file_read_server.py
stdio 模式是最常见的方式,MCP Host 会像子进程一样启动它,通过标准输入输出通信。
步骤 3:在 Claude Desktop 中配置 MCP Server
打开 Claude Desktop 的配置文件(macOS 路径 ~/Library/Application Support/Claude/claude_desktop_config.json,Windows 路径 %APPDATA%\Claude\claude_desktop_config.json),添加:
json
{
"mcpServers": {
"localFileReader": {
"command": "python",
"args": ["/home/ubuntu/mcp-tutorial/file_read_server.py"],
"env": {
"PATH": "/home/ubuntu/mcp-tutorial-venv/bin:$PATH"
}
}
}
}
保存后重启 Claude Desktop,你应该在聊天界面看到一个扳手图标 🔧,点击可以看到已连接的 MCP Server 工具列表。
步骤 4:在 Cursor 中配置(可选)
如果你用 Cursor,配置方式类似。打开 cursor/settings.json:
json
{
"cursor.mcpServers": {
"localFileReader": {
"command": "python",
"args": ["/home/ubuntu/mcp-tutorial/file_read_server.py"]
}
}
}
步骤 5:测试效果
重启 Host 后,直接问 AI:
帮我列出 /tmp 目录下所有的 .md 文件,然后读取其中一个看看内容。
AI 会自动调用你的 MCP 工具,流程完全自动化:
用户提问
↓
Claude 识别需要"列文件"+"读文件"
↓
自动调用 list_markdown_files("/tmp")
↓
自动调用 read_markdown_file("/tmp/xxx.md")
↓
整合结果,返回答案
四、进阶技巧:让 MCP 工具更强大
技巧 1:添加资源(Resources)
除了工具(Tool),MCP 还支持资源(Resource)。资源更像"文件接口",适合直接暴露数据源:
python
@mcp.resource("docs://README")
def get_readme():
return Path("/home/ubuntu/project/README.md").read_text()
这样 AI 可以直接引用 docs://README 这个 URI 获取内容,不需要调用函数。
技巧 2:给工具加详细描述
LLM 选择工具时依赖工具的 prompt 描述,写得越详细调用越准确:
python
@mcp.tool(description="当用户提到'日志'、'log'、'错误'时使用此工具,会搜索最近 24 小时的错误日志")
def search_error_logs(days: int = 1) -> str:
# ... 实现
技巧 3:安全沙箱
MCP 服务器本质是一个运行在你本机的程序,调用时务必注意:
| 风险点 | 建议 |
|---|---|
| 文件路径遍历 | 限制允许的目录白名单 |
| 敏感信息泄露 | 在返回值中脱敏 |
| 外部网络调用 | 添加请求频率限制 |
示例:限制读取路径
python
ALLOWED_DIRS = ["/home/ubuntu/projects", "/tmp"]
def safe_read(filepath: str):
real_path = Path(filepath).resolve()
if not any(str(d).startswith(str(allowed)) for allowed in ALLOWED_DIRS):
return f"❌ 不允许访问的路径: {filepath}"
return real_path.read_text()
五、总结
今天我们从零搭建了一个 MCP 文件读取服务器,核心要点回顾:
-
MCP 是 AI 与外部工具的标准化桥梁,让 LLM 能读写文件、调用脚本、连接 API
-
使用
mcp[cli]和FastMCP可以在 30 行代码内创建一个 MCP Server -
配置 Claude Desktop / Cursor 即可将工具接入日常使用
-
进阶玩法包括资源暴露、工具描述优化、安全沙箱
下一步建议: 试试把你的 Jira、GitHub Issues、或公司内网 API 通过 MCP 接进来。一旦工具链搭好,你会发现 AI 从"聊天机器人"进化成了真正的"工作助手"。
动手试试,有问题在评论区见 👇