🔌 MCP服务器开发详解

掌握Model Context Protocol,让Agent与外部世界无缝连接

📅 发布时间:2026年6月1日 | 🏷️ 分类:Agent协议 | ⏱️ 阅读时间:12分钟
📖 定义

MCP(Model Context Protocol,模型上下文协议)是一种开放标准的通信协议,定义了AI Agent与外部工具、数据源、服务之间的标准化交互方式。MCP Server是实现了MCP协议的服务端,负责向Agent暴露工具、资源和能力。

你可以把MCP想象成Agent世界的"USB接口"——任何设备只要有USB接口就能互相通信,不需要关心对方内部的实现细节。同样,任何MCP Server只要有MCP协议,就能被任何MCP Client调用。

🧠 核心原理

🔬 MCP协议的工作机制

MCP协议建立在JSON-RPC 2.0之上,定义了三个核心抽象:

  • Tools(工具):可以被Agent调用的函数,有明确的输入输出规范
  • Resources(资源):Agent可以读取的数据源,如文件、API、数据库
  • Prompts(提示):预定义的提示模板,供Agent使用
# MCP协议基础消息格式
{
    "jsonrpc": "2.0",
    "method": "tools/call",  // 方法名
    "params": {
        "name": "search_web",  // 要调用的工具名
        "arguments": {          // 工具参数
            "query": "2026年AI趋势",
            "limit": 5
        }
    },
    "id": "call-001"         // 请求ID,用于匹配响应
}

🚀 从零搭建MCP Server

1. 基础服务器骨架

# 使用Python实现一个简单的MCP Server
import json
from http.server import HTTPServer, BaseHTTPRequestHandler

class MCPServer(BaseHTTPRequestHandler):
    # 注册可用工具
    tools = {
        "search_web": {
            "description": "搜索引擎查询,返回网页标题、摘要和链接",
            "parameters": {
                "query": {"type": "string", "description": "搜索关键词"},
                "limit": {"type": "integer", "description": "返回结果数,默认5"}
            }
        },
        "get_current_time": {
            "description": "获取指定时区的当前时间",
            "parameters": {
                "timezone": {"type": "string", "description": "时区,如'Asia/Shanghai'"}
            }
        }
    }
    
    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        body = json.loads(self.rfile.read(content_length))
        response = self.handle_mcp_request(body)
        
        self.send_response(200)
        self.send_header('Content-Type', 'application/json')
        self.end_headers()
        self.wfile.write(json.dumps(response).encode())
    
    def handle_mcp_request(self, request):
        method = request["method"]
        
        if method == "tools/list":
            return self.list_tools(request)
        elif method == "tools/call":
            return self.call_tool(request)
        elif method == "resources/list":
            return self.list_resources(request)
        else:
            return {
                "jsonrpc": "2.0",
                "error": {"code": -32601, "message": "方法不存在"},
                "id": request.get("id")
            }

# 启动服务器
if __name__ == "__main__":
    server = HTTPServer(("localhost", 8080), MCPServer)
    print(f"MCP Server 已启动,监听 0.0.0.0:8080")
    print(f"可用工具: {list({'search_web', 'get_current_time'})}")
    server.serve_forever()

2. 工具实现

def call_tool(self, request):
    tool_name = request["params"]["name"]
    args = request["params"].get("arguments", {})
    
    tool_map = {
        "search_web": self.search_web,
        "get_current_time": self.get_current_time
    }
    
    if tool_name not in tool_map:
        return {
            "jsonrpc": "2.0",
            "error": {"code": -32602, "message": f"工具 '{tool_name}' 不存在"},
            "id": request["id"]
        }
    
    result = tool_map[tool_name](args)
    return {
        "jsonrpc": "2.0",
        "result": result,
        "id": request["id"]
    }

def get_current_time(self, args):
    import pytz
    from datetime import datetime
    
    tz = pytz.timezone(args.get("timezone", "Asia/Shanghai"))
    now = datetime.now(tz)
    return {
        "content": [{"type": "text", "text": now.strftime("%Y-%m-%d %H:%M:%S %Z")}]
    }

3. 安全认证机制

# API Key认证中间件
class AuthMiddleware:
    def __init__(self):
        # 存储有效的API Keys
        self.api_keys = {
            "sk-miaoquai-...": {"permissions": ["read", "write"]},
            "sk-readonly-...": {"permissions": ["read"]}
        }
    
    def authenticate(self, headers):
        auth_header = headers.get("Authorization", "")
        api_key = auth_header.replace("Bearer ", "")
        
        if api_key not in self.api_keys:
            return None  # 认证失败
        
        return self.api_keys[api_key]  # 返回权限信息
    
    def check_permission(self, tool_name, permissions):
        # 检查是否有权限调用该工具
        if tool_name in ["delete_database", "modify_config"]:
            return "write" in permissions
        return True  # 只读工具允许所有认证用户访问

🔄 OpenClaw与MCP的深度集成

💡 OpenClaw中的MCP实践

在OpenClaw生态中,MCP被用来连接Skills与外部服务。以下是妙趣AI的实际集成案例:

# OpenClaw中注册MCP工具
{
    "mcp_servers": [
        {
            "name": "妙趣AI内容助手",
            "url": "http://localhost:8080/mcp",
            "api_key": "sk-miaoquai-xxx",
            "tools": ["search_web", "get_current_time", "generate_summary"],
            "rate_limit": {
                "max_requests_per_minute": 60,
                "max_concurrent_calls": 5
            }
        },
        {
            "name": "数据库查询服务",
            "url": "http://db-service:8081/mcp",
            "api_key": "sk-db-xxx",
            "tools": ["query_database", "get_schema"],
            "permissions": ["read"]  // 只读访问
        }
    ]
}

📊 性能优化与最佳实践

根据妙趣AI的实际运营经验,以下是MCP Server开发的关键优化策略:

🏷️ 相关标签

#MCP #ModelContextProtocol #Agent协议 #OpenClaw #工具调用 #API设计