二、开发一个简单的MCP Server

对绝大部分 AI 开发者来说,除了了解MCP的原理,我们更关心 Server 的实现。因此,我这里准备通过一个最简单的示例来介绍如何实现一个 MCP Server。MCP servers 可以提供三种主要类型的功能:

  1. Tools(工具):可以被 LLM 调用的函数或外部服务接口,需要用户授权后执行。
  2. Resources(资源):提供类似文件的结构化数据,供LLM读取和分析。如本地文件内容、远程api返回的json数据、数据库查询结果等。
  3. Prompts(提示):预先编写的模板,帮助用户完成特定任务 本教程将主要关注工具(Tools)。

1 使用LLM构建MCP的最佳实践

在开始之前,Anthropic 为我们提供了一个基于LLM 的 MCP Server 的最佳开发实践(modelcontextprotocol.io/tutorials/b...),Guide里面特意提到了,该实践是基于Claude,也可以基于其它LLM。总结如下:

  1. 引入 domain knowledge (说人话就是,告诉他一些 MCP Server 开发的范例和资料)

    • 访问 modelcontextprotocol.io/llms-full.t... 并复制完整的文档文本。(实测这个太长了,可以忽略)
    • 导航到 MCP TypeScript SDK 或 Python SDK Github 项目中并复制相关内容。
    • 把这些作为 prompt 输入到你的 chat 对话中(作为 context)。
  2. 描述你的需求

    • 你的服务器会开放哪些资源
    • 它会提供哪些工具
    • 它应该给出哪些引导或建议
    • 它需要跟哪些外部系统互动

给出一个 example prompt:

python 复制代码
... (这里是已经引入的 domain knowledge)
打造一个 MCP 服务器,它能够:
- 连接到我公司的 PostgreSQL 数据库

- 将表格结构作为资源开放出来

- 提供运行只读 SQL 查询的工具

- 包含常见数据分析任务的引导

剩下的部分也很重要,但是偏重于方法论,实践性较弱,这里就不展开了,推荐直接看链接:modelcontextprotocol.io/tutorials/b...

2 手动实践

本节内容主要参考了官方文档:Quick Start: For Server Developers(modelcontextprotocol.io/quickstart/...)。

这里准备了一个简单的示例,使用 Python 实现一个 MCP Server,用来统计当前桌面上的 txt 文件数量和获取对应文件的名字(你可以理解为一点用都没有,但是它足够简单,主要是为了难以配置环境的读者提供一个足够短的实践记录)。以下实践均运行在我的 MacOS 系统上。

Step 1. 前置工作

  • 安装 Claude Desktop。
  • Python 3.10+ 环境
  • Python MCP SDK 1.2.0+

Step 2. 环境配置

python 复制代码
# 安装 uv
curl -LsSf https://astral.sh/uv/install.sh | sh

# 创建项目目录
uv init txt_counter
cd txt_counter

# 设置 Python 3.10+ 环境
echo "3.11" > .python-version

# 创建虚拟环境并激活
uv venv
source .venv/bin/activate

# Install dependencies
uv add "mcp[cli]" httpx

# Create our server file
touch txt_counter.py

Step 3. 构建一个prompt

python 复制代码
"""
... (这里是已经引入的 domain knowledge)
"""

打造一个 MCP 服务器,它能够:
- 功能:
    - 统计当前桌面上的 txt 文件数量
    - 获取对应文件的名字

要求:
- 不需要给出 prompt 和 resource 相关代码。
- 你可以假设我的桌面路径为 /Users/{username}/Desktop

Domain Knowledge 复制于 MCP Python SDK的README文件(raw.githubusercontent.com/modelcontex...

Step 4. 实现MCP Server

以下代码由 Claude 3.7 直接生成。当然这里主要是因为需求足够简单,当需要实现一个复杂的 MCP Server 时,可能需要多步的引导和 Debug 才能得到最终的代码。

python 复制代码
import os
from pathlib import Path
from mcp.server.fastmcp import FastMCP

# 创建 MCP Server
mcp = FastMCP("桌面 TXT 文件统计器")

@mcp.tool()
def count_desktop_txt_files() -> int:
    """Count the number of .txt files on the desktop."""
    # Get the desktop path
    username = os.getenv("USER") or os.getenv("USERNAME")
    desktop_path = Path(f"/Users/{username}/Desktop")

    # Count .txt files
    txt_files = list(desktop_path.glob("*.txt"))
    return len(txt_files)

@mcp.tool()
def list_desktop_txt_files() -> str:
    """Get a list of all .txt filenames on the desktop."""
    # Get the desktop path
    username = os.getenv("USER") or os.getenv("USERNAME")
    desktop_path = Path(f"/Users/{username}/Desktop")

    # Get all .txt files
    txt_files = list(desktop_path.glob("*.txt"))

    # Return the filenames
    if not txt_files:
        return "No .txt files found on desktop."

    # Format the list of filenames
    file_list = "\n".join([f"- {file.name}" for file in txt_files])
    return f"Found {len(txt_files)} .txt files on desktop:\n{file_list}"

if __name__ == "__main__":
    # Initialize and run the server
    mcp.run()

任务非常简单,只需要调用非常基本的OS就可以完成。

Step 5. 测试MCP Server

python 复制代码
 $ mcp dev txt_counter.py 
 Starting MCP inspector... 
 Proxy server listening on port 3000 
 MCP Inspector is up and running at http://localhost:5173

之后进入到给出的链接中,你大概能按下图进行操作:

Step 6. 接入Claude

最后一步就是把我们写好的 MCP 接入到 Claude Desktop 中。流程如下:

python 复制代码
# 打开 claude_desktop_config.json (MacOS / Linux)
# 如果你用的是 cursor 或者 vim 请更换对应的命令
code ~/Library/Application\ Support/Claude/claude_desktop_config.json

在配置文件中添加以下内容,记得替换相关路径为实际路径。

python 复制代码
{
    "mcpServers": {
      "txt_counter": {
        "command": "/opt/homebrew/bin/uv",
        "args": [
          "--directory",
          "/Users/yangfan/mcp/txt_counter",
          "run",
          "txt_counter.py"
        ]
      }
    }
  }

uv最好是绝对路径,推荐使用 which uv 获取。

配置好后重启 Claude Desktop,如果没问题就能看到对应的 MCP Server 了。

Step 7. 实际使用

接下来,我们通过一个简单的prompt进行实际测试:

bash 复制代码
能推测我当前桌面上 txt 文件名的含义吗?

它可能会请求你的使用权限,如图一所示,你可以点击 Allow for This Chat

看起来我们MCP Server已经正常工作了!

MCP Server Debug

Debug是一个非常复杂的话题,这里直接推荐官方的教程:

总结

MCP (Model Context Protocol) 代表了 AI 与外部工具和数据交互的标准建立。通过本文,我们可以了解到:

使用与开发:对于普通用户,MCP 提供了丰富的现成工具,用户可以在不了解任何技术细节的情况下使用;对于开发者,MCP 提供了清晰的架构和 SDK,使工具开发变得相对简单。

MCP 还处于发展初期,但其潜力巨大。更重要的是生态,基于统一标准下构筑的生态也会正向的促进整个领域的发展。我们可以看看MCP工具平台:mcp.so/

相关推荐
hui函数4 分钟前
Flask电影投票系统全解析
后端·python·flask
小厂永远得不到的男人2 小时前
基于 Spring Validation 实现全局参数校验异常处理
java·后端·架构
毅航6 小时前
从原理到实践,讲透 MyBatis 内部池化思想的核心逻辑
后端·面试·mybatis
展信佳_daydayup6 小时前
02 基础篇-OpenHarmony 的编译工具
后端·面试·编译器
用户721522078776 小时前
基于LD_PRELOAD的命令行参数安全混淆技术
后端
笃行3506 小时前
开源大模型实战:GPT-OSS本地部署与全面测评
后端
知其然亦知其所以然6 小时前
SpringAI:Mistral AI 聊天?一文带你跑通!
后端·spring·openai
庚云6 小时前
🔒 前后端 AES 加密解密实战(Vue3 + Node.js)
前端·后端
超级小忍7 小时前
使用 GraalVM Native Image 将 Spring Boot 应用编译为跨平台原生镜像:完整指南
java·spring boot·后端