随着大语言模型 (LLM) 技术的飞速发展,模型上下文协议 (MCP) 正迅速成为连接 LLM 与其他系统的事实标准。本文将深入探讨 MCP 服务器的构建,引导开发者了解其核心架构、关键组件以及实际应用,助力你打造更智能、更安全的 AI 集成方案。我们将以一个实用的代码示例为基础,剖析 工具 (Tools)资源 (Resources)提示 (Prompts) 这三大支柱,并探讨 MCP 服务器 在 AI 时代的关键作用。

MCP 服务器架构:连接 AI 与世界的桥梁

MCP 服务器 充当 AI 应用与各种数据源之间的桥梁,通过标准化的接口,避免了传统方法中大量定制化连接的复杂性。其核心架构可分为以下几个关键层级:

  • 通信层 (Communication Layer): 负责处理客户端与服务器之间的通信,目前主流的实现方式是 JSON-RPC。在开发阶段,Stdio 是一种便捷的选择,但在生产环境中,HTTP 协议通常更可靠和高效。选择合适的传输协议对服务器的可扩展性和部署至关重要。

  • 请求处理层 (Request Handlers): 处理基本的 MCP 操作,例如工具列表的获取、工具的调用、资源的读取以及提示的获取。

  • 上下文存储层 (Context Stores): 用于存储会话数据,确保 AI 应用能够记住之前的交互信息,提供更连贯的用户体验。

  • 缓存层 (Caching Layer): 用于缓存常用的数据和计算结果,提高系统的响应速度和吞吐量。

这种模块化的设计使得 MCP 服务器 能够快速扩展,轻松应对各种应用场景。例如,在一个电商平台的 AI 客服系统中,MCP 服务器 可以通过 HTTP 协议与客户端应用通信,利用上下文存储层记住用户的购物历史和偏好,并利用缓存层快速检索商品信息。

MCP 的三大支柱:工具、资源与提示

MCP 服务器 的核心在于其三大支柱:工具 (Tools)资源 (Resources)提示 (Prompts)。理解并熟练运用这三大支柱是构建强大 MCP 服务器 的关键。

工具 (Tools):AI 的执行之手

工具 (Tools) 代表 AI 系统的“手”,使模型能够控制现实世界的任务执行。与传统的 API 接口不同,MCP 工具 由 AI 根据上下文和需求智能地调用,从而创造更自然的交互模式。

在示例代码中,src/tools/handlers.py 定义了两个简单的工具:calculate_user_statisticsupdate_user_status。这两个工具可以用于计算用户统计信息和更新用户状态。

@server.list_tools()
def list_available_tools():
    """Lists all available tools."""
    return ["calculate_user_statistics", "update_user_status"]

@server.call_tool()
def calculate_user_statistics(user_id: str):
    """Calculates statistics for a given user."""
    # 实现计算用户统计信息的逻辑
    pass

@server.call_tool()
def update_user_status(user_id: str, status: str):
    """Updates the status of a given user."""
    # 实现更新用户状态的逻辑
    pass

@server.list_tools() 装饰器将 list_available_tools 函数注册为 工具 发现请求的处理程序。当客户端或 AI 模型想要知道有哪些 工具 可用时,它会向服务器发送一个 “list tools” 请求。@server.call_tool() 装饰器将 calculate_user_statisticsupdate_user_status 函数注册为实际 工具 调用请求的处理程序。当客户端或 AI 模型想要执行一个 工具 时,它会发送一个 “call tool” 请求,其中包含 工具 名称和参数。

设想一个智能家居场景,AI 助手可以根据用户的指令控制家电设备。例如,用户可以说:“把客厅的灯打开”。AI 助手可以通过 MCP 服务器 调用 turn_on_light 工具,实现对灯的控制。

资源 (Resources):AI 的知识宝库

资源 (Resources) 充当 MCP 服务器 的“记忆库”,提供对数据的应用程序控制访问,从而丰富 AI 交互。这些只读数据源为通用 AI 响应转化为知情、相关的见解提供了上下文基础。

在示例代码中,src/ressources/handlers.py 定义了两个 资源User DatabaseSystem InformationUser Database 包含内存用户数据库,提供用户记录,而 System Information 包含当前系统状态和服务器元数据。

AVAILABLE_RESOURCES = [
    types.Resource(
        uri=AnyUrl("memory://users"),
        name="User Database",
        description="In-memory user database with sample user records",
        mimeType="application/json"
    ),
    types.Resource(
        uri=AnyUrl("memory://system-info"),
        name="System Information",
        description="Current system status and server metadata",
        mimeType="application/json"
    )
]

@server.list_resources()
def list_available_resources():
    """Lists all available resources."""
    return AVAILABLE_RESOURCES

@server.read_resource()
def read_resource(uri: AnyUrl):
    """Reads a resource from the given URI."""
    if uri == "memory://users":
        # 从内存中读取用户数据
        return {"users": [{"id": "1", "name": "Alice"}, {"id": "2", "name": "Bob"}]}
    elif uri == "memory://system-info":
        # 从内存中读取系统信息
        return {"version": "1.0", "status": "healthy"}
    else:
        raise ValueError(f"Unknown resource URI: {uri}")

@server.list_resources() 装饰器将 list_available_resources 函数注册为 资源 列表请求的处理程序。@server.read_resource() 装饰器将 read_resource 函数注册为 资源 读取请求的处理程序。

假设一个医疗 AI 助手,可以通过 MCP 服务器 访问患者的病历 资源。当医生询问患者的过敏史时,AI 助手可以读取 Patient Medical History 资源,提供准确的患者信息。通过利用 资源,AI 助手能够提供更个性化和有价值的服务。

提示 (Prompts):AI 的引导之灯

提示 (Prompts) 用作可重用的模板,引导 AI 交互朝向特定结果。它们代表用户控制的元素,通过客户端界面呈现,为常见任务和工作流程提供结构化方法。

在示例代码中,src/prompts/handlers.py 定义了两个 提示analyze-user-datagenerate-report

@server.list_prompts()
def list_available_prompts():
    """Lists all available prompts."""
    return ["analyze-user-data", "generate-report"]

@server.get_prompt()
def get_prompt(prompt_name: str, **kwargs):
    """Gets a prompt with the given name and arguments."""
    if prompt_name == "analyze-user-data":
        return f"Analyze the following user data: {kwargs['user_data']}"
    elif prompt_name == "generate-report":
        return f"Generate a report based on the following data: {kwargs['data']}"
    else:
        raise ValueError(f"Unknown prompt name: {prompt_name}")

@server.list_prompts() 装饰器将 list_available_prompts 函数注册为 提示 列表请求的处理程序。@server.get_prompt() 装饰器将 get_prompt 函数注册为 提示 获取请求的处理程序。

想象一个内容创作平台,用户可以使用 AI 助手生成文章。用户可以通过 MCP 服务器 选择 generate-article 提示,并提供文章主题、关键词等参数。AI 助手将根据这些参数生成一篇符合要求的文章。提示 的使用可以有效控制 AI 的输出,使其更符合用户的需求。

实战演练:运行 Demo 服务器

为了更好地理解 MCP 服务器 的构建,我们可以运行示例代码中的 Demo 服务器。以下是运行 Demo 服务器的步骤:

  1. 设置环境:

    • 克隆服务器代码库:git clone git@github.com:abducodez/mcp-server-demo.git
    • 安装依赖项:cd mcp-server-demo && uv venv && source .venv/bin/activate && uv sync
  2. 添加服务器到 Claude Desktop (或任何支持 MCP 的客户端):

    • 找到 Claude Desktop 的配置文件 (例如 ~/Library/Application\ Support/Claude/claude_desktop_config.json)。
    • mcpServers 设置中添加以下配置 (替换 /ABSOLUTE/PATH/TO/PARENT/FOLDER/demo 为你的实际路径):
    {
      "mcpServers": {
        "demo": {
          "command": "uv",
          "args": [
            "--directory",
            "/ABSOLUTE/PATH/TO/PARENT/FOLDER/demo",
            "run",
            "demo.py"
          ]
        }
      }
    }
    
  3. 与服务器交互:

    现在你就可以在 Claude Desktop 中与 Demo 服务器交互,体验 工具资源提示 的使用。

MCP 服务器的未来:智能化与安全性的融合

随着技术不断进步,MCP 服务器 的发展方向不仅仅是连接系统,更重要的是构建智能、安全且可扩展的服务器。

  • 智能化: 未来的 MCP 服务器 将更加智能,能够自动识别用户需求,并根据上下文选择合适的 工具资源提示
  • 安全性: 随着 AI 应用的普及,安全性变得越来越重要。未来的 MCP 服务器 将采用更严格的安全措施,保护用户数据和系统安全。
  • 可扩展性: 为了应对不断增长的 AI 应用需求,未来的 MCP 服务器 将需要具备更高的可扩展性,能够轻松处理大量的并发请求。

例如,在金融领域,未来的 MCP 服务器 可以通过集成身份验证 工具 和欺诈检测 资源,确保交易的安全性。同时,通过分析用户的交易历史和偏好,MCP 服务器 可以利用个性化 提示 为用户推荐更合适的投资方案。

结语:拥抱 MCP,迎接 AI 驱动的未来

从早期孤立的 AI 模型到真正有用的、上下文感知的助手,这条道路的核心是精心设计的 MCP 服务器。这不仅仅是跟上最新趋势,更是确保创新保持可访问、开放,并基于人们可以信任的坚实工程基础之上。

构建 MCP 服务器 不仅仅是技术挑战,更是一项具有深远意义的战略决策。通过投资于 MCP 服务器 的架构和分析实践,企业能够更好地适应 AI 时代的变革,并在竞争中脱颖而出。 模型上下文协议 不仅仅是一种技术,更是一种理念,它将引领我们走向一个更加智能、高效的未来。抓住 MCP 服务器 带来的机遇,让我们共同拥抱 AI 驱动的未来!