MCP(Model Context Protocol)就像是给大模型装上的“万能接口”,让它能安全地连接到你本地的文件、数据库或者各种API。写一个 Server 其实不难,核心就是把你的业务逻辑封装成标准的“工具”、“资源”或“提示词”。

下面我用最流行的 Python SDK,通过两个例子带你快速上手:一个是最基础的“打招呼”工具,另一个是能读取本地文件内容的实用工具

🛠️ 准备工作

首先,你需要安装官方的 Python SDK:

bash

pip install mcp

💻 示例一:最基础的“Hello World”工具

这个例子展示了如何定义一个最简单的工具,接收参数并返回结果。

文件名:server.py

python

from mcp.server.fastmcp import FastMCP

# 1. 初始化 MCP 服务器
mcp = FastMCP("Demo Server")

# 2. 定义一个工具 (Tool)
# 这个工具的作用是:接收一个名字,返回一句问候语
@mcp.tool()
def say_hello(name: str) -> str:
    """
    向指定用户打招呼。
    
    Args:
        name: 用户的名字
    """
    return f"你好,{name}!欢迎来到 MCP 的世界。"

# 3. 启动服务器
if __name__ == "__main__":
    # 使用 stdio 模式启动,这是最常用的模式,用于与 Claude Desktop 等客户端通信
    mcp.run()
🧪 如何测试

你可以使用 uvicorn 或者直接运行脚本来启动它,但通常我们需要在 MCP 客户端(如 Claude Desktop)中配置它。为了快速验证代码逻辑,你可以写一个简单的测试脚本,或者直接在终端运行 python server.py(如果配置了标准输入输出)。

📂 示例二:实用的“文件读取器” (带资源与工具)

这个例子更贴近真实场景:我们不仅提供一个工具来读取文件,还暴露一个资源列表,让 AI 知道有哪些文件可用。

文件名:file_server.py

python

from mcp.server.fastmcp import FastMCP
import os

# 初始化服务器
mcp = FastMCP("File Manager")

# 模拟一个受保护的文件目录
TARGET_DIR = "./test_files"

# --- 1. 定义资源 (Resources) ---
# 资源通常是只读的数据,AI 可以参考它们

@mcp.resource("dir://files")
def list_files() -> list[str]:
    """列出目标目录下的所有文件"""
    if not os.path.exists(TARGET_DIR):
        os.makedirs(TARGET_DIR)
        return ["目录已创建,目前是空的。"]
    
    return os.listdir(TARGET_DIR)

# --- 2. 定义工具 (Tools) ---
# 工具是可以执行操作的函数

@mcp.tool()
def read_file_content(filename: str) -> str:
    """
    读取指定文件的内容。
    
    Args:
        filename: 文件名(不包含路径)
    """
    # 安全检查:防止路径遍历攻击
    if "/" in filename or "\\" in filename:
        return "错误:为了安全,只允许提供文件名,不允许包含路径。"
    
    file_path = os.path.join(TARGET_DIR, filename)
    
    if not os.path.exists(file_path):
        return f"错误:文件 '{filename}' 不存在。"
    
    try:
        with open(file_path, "r", encoding="utf-8") as f:
            return f.read()
    except Exception as e:
        return f"读取文件时出错: {str(e)}"

@mcp.tool()
def create_file(filename: str, content: str) -> str:
    """
    在目标目录创建一个新文件。
    
    Args:
        filename: 文件名
        content: 文件内容
    """
    if "/" in filename or "\\" in filename:
        return "错误:不允许包含路径。"
        
    file_path = os.path.join(TARGET_DIR, filename)
    with open(file_path, "w", encoding="utf-8") as f:
        f.write(content)
    return f"成功创建文件: {filename}"

if __name__ == "__main__":
    mcp.run()

🚀 如何运行与调试

MCP Server 通常不直接像 Web 服务那样运行,而是作为子进程被客户端(如 Claude Desktop)调用。

使用官方 Inspector 调试(推荐)

MCP 官方提供了一个 CLI 工具叫 inspector,可以可视化地查看你的 Server 暴露了哪些工具和资源,并进行测试。

  1. 安装 inspector:

    bash
    npx @modelcontextprotocol/inspector python file_server.py

    (注意:你需要先安装 Node.js 和 npx)

  2. 运行后,终端会给出一个本地网址(通常是 http://localhost:5173)。

  3. 在浏览器打开该网址,你就能在界面上看到 read_file_content 和 create_file 工具,并可以直接输入参数进行测试。

在 Claude Desktop 中使用

如果你想让 Claude 桌面版使用这个 Server,需要修改配置文件。

  1. 找到 Claude 的配置文件 claude_desktop_config.json

    • Mac: ~/Library/Application Support/Claude/claude_desktop_config.json
    • Windows: %APPDATA%\Claude\claude_desktop_config.json
  2. 添加你的 Server 配置:

    json
    {
      "mcpServers": {
        "my-file-manager": {
          "command": "python",
          "args": [
            "/absolute/path/to/your/file_server.py"
          ]
        }
      }
    }
  3. 重启 Claude Desktop,点击左上角的 ⚙️ 图标,你应该能看到 "my-file-manager" 连接成功。此时你就可以直接问 Claude:“帮我列出文件”,“帮我读取 test.txt”等。

📌 核心概念总结

  • @mcp.tool(): 将函数暴露给 AI。AI 可以决定调用它,并传入参数。
  • @mcp.resource(): 暴露数据源。AI 可以读取这些数据作为上下文(Context),但通常不会修改它。
  • @mcp.prompt(): (示例中未展示) 用于预定义提示词模板,帮助 AI 更好地完成特定任务。

这两个示例涵盖了 MCP 开发中 90% 的需求。你可以从修改 file_server.py 开始,尝试接入你自己的业务逻辑。

Logo

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

更多推荐