Skip to content

服务器概念

MCP 服务器是提供上下文、数据和功能给 AI 应用程序的核心组件。本页面详细介绍了服务器的核心概念和实现方式。

服务器功能

MCP 服务器可以提供三种主要类型的功能:

资源 (Resources)

资源是类似文件的数据,可以被客户端读取:

  • API 响应数据
  • 文件内容
  • 数据库查询结果
  • 实时数据流

特点:

  • 只读访问
  • 支持分页和流式传输
  • 可以是静态或动态内容

工具 (Tools)

工具是可以被 LLM 调用的函数:

  • 搜索引擎查询
  • 计算器功能
  • 文件操作
  • API 调用

特点:

  • 需要用户批准才能执行
  • 支持参数验证
  • 可以返回结构化结果

提示 (Prompts)

提示是帮助用户完成特定任务的预写模板:

  • 代码生成模板
  • 分析框架
  • 写作指南
  • 工作流程

特点:

  • 可以包含参数化内容
  • 支持多种格式
  • 可以组合使用

协议消息

服务器通过以下协议消息与客户端交互:

列表操作

  • list_resources - 列出可用资源
  • list_tools - 列出可用工具
  • list_prompts - 列出可用提示

获取操作

  • read_resource - 读取特定资源
  • get_prompt - 获取特定提示

调用操作

  • call_tool - 调用特定工具

订阅操作

  • subscribe - 订阅资源更新
  • unsubscribe - 取消订阅

服务器生命周期

初始化阶段

  1. 启动:服务器进程启动
  2. 能力协商:与客户端交换能力信息
  3. 配置:设置运行参数和环境

运行阶段

  1. 监听请求:等待客户端消息
  2. 处理请求:执行相应的业务逻辑
  3. 返回响应:发送结果给客户端

关闭阶段

  1. 清理资源:释放占用的资源
  2. 保存状态:持久化必要的数据
  3. 优雅退出:正常关闭服务器

实现模式

基于 STDIO 的服务器

python
from mcp.server.fastmcp import FastMCP

# 创建服务器实例
mcp = FastMCP("my-server")

@mcp.resource("file://{path}")
async def read_file(path: str) -> str:
    """读取文件内容"""
    with open(path, 'r') as f:
        return f.read()

@mcp.tool()
async def calculate(expression: str) -> float:
    """计算数学表达式"""
    return eval(expression)  # 注意:实际使用中需要安全处理

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

基于 HTTP 的服务器

python
from fastapi import FastAPI
from mcp.server.fastmcp import FastMCP

app = FastAPI()
mcp = FastMCP("http-server")

@mcp.resource("api://data/{id}")
async def get_data(id: str) -> dict:
    """获取 API 数据"""
    # 实现 API 数据获取逻辑
    return {"id": id, "data": "..."}

# 集成到 FastAPI
app.mount("/mcp", mcp.create_app())

错误处理

错误类型

  • 协议错误:消息格式或协议违规
  • 业务错误:功能执行失败
  • 系统错误:资源不足或系统故障

错误响应

python
from mcp.types import McpError

@mcp.tool()
async def risky_operation(param: str) -> str:
    try:
        # 执行可能失败的操作
        result = perform_operation(param)
        return result
    except ValueError as e:
        raise McpError(
            code="INVALID_PARAMS",
            message=f"参数无效: {e}"
        )
    except Exception as e:
        raise McpError(
            code="INTERNAL_ERROR",
            message="内部服务器错误"
        )

安全考虑

输入验证

  • 验证所有输入参数
  • 防止注入攻击
  • 限制资源访问范围

权限控制

  • 实现适当的访问控制
  • 验证用户权限
  • 记录敏感操作

资源限制

  • 限制内存使用
  • 控制执行时间
  • 防止资源耗尽

性能优化

缓存策略

  • 缓存频繁访问的数据
  • 实现智能缓存失效
  • 使用适当的缓存层次

异步处理

  • 使用异步 I/O 操作
  • 并发处理多个请求
  • 避免阻塞操作

资源管理

  • 及时释放资源
  • 使用连接池
  • 监控资源使用情况

日志记录

STDIO 服务器日志记录

python
import logging

# 配置日志输出到 stderr
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[logging.StreamHandler()]  # 默认输出到 stderr
)

logger = logging.getLogger(__name__)

@mcp.tool()
async def logged_operation(param: str) -> str:
    logger.info(f"执行操作,参数: {param}")
    # 执行操作
    result = "操作结果"
    logger.info(f"操作完成,结果: {result}")
    return result

HTTP 服务器日志记录

python
import logging

# HTTP 服务器可以使用标准输出
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)

测试策略

单元测试

  • 测试各个功能模块
  • 模拟外部依赖
  • 验证错误处理

集成测试

  • 测试客户端-服务器交互
  • 验证协议兼容性
  • 测试端到端流程

性能测试

  • 负载测试
  • 压力测试
  • 内存泄漏检测

部署考虑

环境配置

  • 设置环境变量
  • 配置依赖项
  • 准备运行环境

监控和维护

  • 实现健康检查
  • 监控性能指标
  • 设置告警机制

扩展性

  • 支持水平扩展
  • 实现负载均衡
  • 考虑高可用性

下一步

了解了服务器概念后,您可以:

🚀 探索模型上下文协议的无限可能 | 连接 AI 与世界的桥梁 | 让智能更智能