二、开发一个简单的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/

相关推荐
zopple3 小时前
常见的 Spring 项目目录结构
java·后端·spring
cjy0001115 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
小江的记录本5 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji34166 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
程序员cxuan6 小时前
人麻了,谁把我 ssh 干没了
人工智能·后端·程序员
wuyikeer7 小时前
Spring Framework 中文官方文档
java·后端·spring
Victor3567 小时前
MongoDB(61)如何避免大文档带来的性能问题?
后端
Victor3567 小时前
MongoDB(62)如何避免锁定问题?
后端
wuyikeer8 小时前
Spring BOOT 启动参数
java·spring boot·后端
子木HAPPY阳VIP9 小时前
Ubuntu 22.04 VMware 设置固定IP配置
人工智能·后端·目标检测·机器学习·目标跟踪