MCP (Model Context Protocol)

目录


1. MCP简介

1.1 什么是MCP

MCP (Model Context Protocol) 是一个开放标准协议,用于大语言模型(LLM)与外部工具和数据源之间的安全、结构化通信。它提供了一种标准化的方式来扩展AI模型的能力,使其能够访问实时数据、执行操作并与各种外部系统集成。

1.2 MCP的核心价值

  • 标准化接口: 提供统一的协议标准,简化AI工具集成
  • 安全性: 内置安全机制,确保数据访问的安全性
  • 可扩展性: 支持多种工具和数据源的灵活集成
  • 互操作性: 不同厂商的工具可以无缝协作
  • 实时性: 支持实时数据访问和操作执行

1.3 MCP vs 传统API

特性 传统API MCP
协议类型 REST/GraphQL/SOAP 专用协议
数据格式 JSON/XML 结构化消息
安全性 依赖实现 内置安全机制
扩展性 需要重新设计 标准化扩展
AI集成 需要适配层 原生支持

2. MCP架构设计

2.1 整体架构

AI模型/客户端
MCP客户端
MCP协议层
MCP服务器
工具适配器
外部系统/工具
认证授权
安全策略
监控日志

2.2 核心组件

2.2.1 MCP客户端
  • 负责与AI模型集成
  • 处理MCP协议消息
  • 管理连接和会话
2.2.2 MCP服务器
  • 实现MCP协议规范
  • 管理工具注册和发现
  • 处理请求路由和响应
2.2.3 工具适配器
  • 将外部工具转换为MCP兼容接口
  • 处理数据格式转换
  • 实现错误处理和重试机制

2.3 消息格式

{
  "jsonrpc": "2.0",
  "id": "1",
  "method": "tools/call",
  "params": {
    "name": "weather_tool",
    "arguments": {
      "location": "北京",
      "unit": "celsius"
    }
  }
}

3. 如何开发设计MCP

3.1 开发环境准备

3.1.1 技术栈选择
# Python实现示例
pip install mcp-sdk
pip install asyncio
pip install pydantic
3.1.2 项目结构
mcp-project/
├── src/
│   ├── server/
│   │   ├── __init__.py
│   │   ├── mcp_server.py
│   │   └── tools/
│   │       ├── weather_tool.py
│   │       └── database_tool.py
│   ├── client/
│   │   ├── __init__.py
│   │   └── mcp_client.py
│   └── common/
│       ├── __init__.py
│       ├── models.py
│       └── utils.py
├── tests/
├── docs/
├── requirements.txt
└── README.md

3.2 MCP服务器开发

3.2.1 基础服务器实现
import asyncio
from mcp import MCPServer, Tool, Resource
from typing import Dict, Any, List

class MyMCPServer(MCPServer):
    def __init__(self):
        super().__init__("my-mcp-server")
        self.tools = {}
        self.resources = {}
        self._register_tools()
  
    def _register_tools(self):
        """注册可用工具"""
        # 天气查询工具
        weather_tool = Tool(
            name="weather_query",
            description="查询指定城市的天气信息",
            input_schema={
                "type": "object",
                "properties": {
                    "city": {"type": "string", "description": "城市名称"},
                    "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
                },
                "required": ["city"]
            }
        )
        self.tools["weather_query"] = weather_tool
  
    async def handle_tool_call(self, tool_name: str, arguments: Dict[str, Any]) -> Dict[str, Any]:
        """处理工具调用"""
        if tool_name == "weather_query":
            return await self._get_weather(arguments)
        else:
            raise ValueError(f"Unknown tool: {tool_name}")
  
    async def _get_weather(self, args: Dict[str, Any]) -> Dict[str, Any]:
        """获取天气信息的具体实现"""
        city = args.get("city")
        unit = args.get("unit", "celsius")
      
        # 这里调用实际的天气API
        # weather_data = await call_weather_api(city, unit)
      
        return {
            "city": city,
            "temperature": "25°C",
            "condition": "晴天",
            "unit": unit,
            "timestamp": "2024-01-01T12:00:00Z"
        }
3.2.2 资源管理
class ResourceManager:
    def __init__(self):
        self.resources = {}
  
    async def get_resource(self, resource_id: str) -> Dict[str, Any]:
        """获取资源"""
        if resource_id not in self.resources:
            raise ValueError(f"Resource not found: {resource_id}")
      
        return self.resources[resource_id]
  
    async def list_resources(self) -> List[Dict[str, Any]]:
        """列出所有资源"""
        return list(self.resources.values())
  
    async def create_resource(self, resource_data: Dict[str, Any]) -> str:
        """创建新资源"""
        resource_id = f"resource_{len(self.resources) + 1}"
        self.resources[resource_id] = {
            "id": resource_id,
            "type": resource_data.get("type"),
            "data": resource_data.get("data"),
            "created_at": "2024-01-01T12:00:00Z"
        }
        return resource_id

3.3 MCP客户端开发

3.3.1 客户端实现
import asyncio
from mcp import MCPClient
from typing import Dict, Any, List

class MyMCPClient(MCPClient):
    def __init__(self, server_url: str):
        super().__init__(server_url)
        self.connected = False
  
    async def connect(self):
        """连接到MCP服务器"""
        try:
            await self._establish_connection()
            self.connected = True
            print("Successfully connected to MCP server")
        except Exception as e:
            print(f"Failed to connect: {e}")
            raise
  
    async def call_tool(self, tool_name: str, arguments: Dict[str, Any]) -> Dict[str, Any]:
        """调用工具"""
        if not self.connected:
            raise ConnectionError("Not connected to server")
      
        return await self._send_tool_request(tool_name, arguments)
  
    async def list_tools(self) -> List[Dict[str, Any]]:
        """列出可用工具"""
        return await self._send_request("tools/list", {})
  
    async def get_resources(self) -> List[Dict[str, Any]]:
        """获取资源列表"""
        return await self._send_request("resources/list", {})

3.4 工具开发示例

3.4.1 数据库工具
import asyncpg
from typing import Dict, Any, List

class DatabaseTool:
    def __init__(self, connection_string: str):
        self.connection_string = connection_string
        self.pool = None
  
    async def initialize(self):
        """初始化数据库连接池"""
        self.pool = await asyncpg.create_pool(self.connection_string)
  
    async def execute_query(self, query: str, params: List[Any] = None) -> List[Dict[str, Any]]:
        """执行SQL查询"""
        async with self.pool.acquire() as conn:
            rows = await conn.fetch(query, *(params or []))
            return [dict(row) for row in rows]
  
    async def execute_command(self, command: str, params: List[Any] = None) -> str:
        """执行SQL命令"""
        async with self.pool.acquire() as conn:
            result = await conn.execute(command, *(params or []))
            return result
3.4.2 API集成工具
import aiohttp
from typing import Dict, Any

class APITool:
    def __init__(self, base_url: str, api_key: str = None):
        self.base_url = base_url
        self.api_key = api_key
        self.session = None
  
    async def initialize(self):
        """初始化HTTP会话"""
        self.session = aiohttp.ClientSession()
  
    async def get(self, endpoint: str, params: Dict[str, Any] = None) -> Dict[str, Any]:
        """发送GET请求"""
        headers = {}
        if self.api_key:
            headers["Authorization"] = f"Bearer {self.api_key}"
      
        async with self.session.get(
            f"{self.base_url}/{endpoint}",
            params=params,
            headers=headers
        ) as response:
            return await response.json()
  
    async def post(self, endpoint: str, data: Dict[str, Any] = None) -> Dict[str, Any]:
        """发送POST请求"""
        headers = {"Content-Type": "application/json"}
        if self.api_key:
            headers["Authorization"] = f"Bearer {self.api_key}"
      
        async with self.session.post(
            f"{self.base_url}/{endpoint}",
            json=data,
            headers=headers
        ) as response:
            return await response.json()

4. MCP重难点分析

4.1 技术难点

4.1.1 协议标准化

难点: 确保不同厂商实现的一致性
解决方案:

  • 严格遵循MCP规范
  • 使用标准化的测试套件
  • 建立兼容性认证机制
# 协议验证示例
class MCPValidator:
    @staticmethod
    def validate_message(message: Dict[str, Any]) -> bool:
        """验证MCP消息格式"""
        required_fields = ["jsonrpc", "id", "method"]
        return all(field in message for field in required_fields)
  
    @staticmethod
    def validate_tool_schema(schema: Dict[str, Any]) -> bool:
        """验证工具模式"""
        return "type" in schema and "properties" in schema
4.1.2 异步处理

难点: 处理大量并发请求
解决方案:

  • 使用异步编程模式
  • 实现连接池管理
  • 优化资源调度
import asyncio
from asyncio import Semaphore

class AsyncRequestHandler:
    def __init__(self, max_concurrent: int = 100):
        self.semaphore = Semaphore(max_concurrent)
  
    async def handle_request(self, request_func, *args, **kwargs):
        """限制并发请求数量"""
        async with self.semaphore:
            return await request_func(*args, **kwargs)
4.1.3 错误处理与重试

难点: 网络不稳定和工具故障
解决方案:

  • 实现指数退避重试
  • 建立熔断机制
  • 提供详细的错误信息
import time
from typing import Callable, Any

class RetryManager:
    def __init__(self, max_retries: int = 3, base_delay: float = 1.0):
        self.max_retries = max_retries
        self.base_delay = base_delay
  
    async def execute_with_retry(self, func: Callable, *args, **kwargs) -> Any:
        """带重试的执行"""
        last_exception = None
      
        for attempt in range(self.max_retries + 1):
            try:
                return await func(*args, **kwargs)
            except Exception as e:
                last_exception = e
                if attempt < self.max_retries:
                    delay = self.base_delay * (2 ** attempt)
                    await asyncio.sleep(delay)
                else:
                    raise last_exception

4.2 安全挑战

4.2.1 认证与授权

挑战: 确保只有授权用户能访问工具
解决方案:

import jwt
from datetime import datetime, timedelta

class SecurityManager:
    def __init__(self, secret_key: str):
        self.secret_key = secret_key
  
    def generate_token(self, user_id: str, permissions: List[str]) -> str:
        """生成访问令牌"""
        payload = {
            "user_id": user_id,
            "permissions": permissions,
            "exp": datetime.utcnow() + timedelta(hours=24)
        }
        return jwt.encode(payload, self.secret_key, algorithm="HS256")
  
    def verify_token(self, token: str) -> Dict[str, Any]:
        """验证访问令牌"""
        try:
            payload = jwt.decode(token, self.secret_key, algorithms=["HS256"])
            return payload
        except jwt.ExpiredSignatureError:
            raise ValueError("Token expired")
        except jwt.InvalidTokenError:
            raise ValueError("Invalid token")
4.2.2 数据加密

挑战: 保护传输和存储的数据
解决方案:

from cryptography.fernet import Fernet
import base64

class EncryptionManager:
    def __init__(self, key: bytes = None):
        if key is None:
            key = Fernet.generate_key()
        self.cipher = Fernet(key)
  
    def encrypt_data(self, data: str) -> str:
        """加密数据"""
        encrypted_data = self.cipher.encrypt(data.encode())
        return base64.b64encode(encrypted_data).decode()
  
    def decrypt_data(self, encrypted_data: str) -> str:
        """解密数据"""
        decoded_data = base64.b64decode(encrypted_data.encode())
        decrypted_data = self.cipher.decrypt(decoded_data)
        return decrypted_data.decode()

4.3 性能优化

4.3.1 缓存策略
import redis
from typing import Optional, Any
import json

class CacheManager:
    def __init__(self, redis_url: str):
        self.redis_client = redis.from_url(redis_url)
        self.default_ttl = 3600  # 1小时
  
    async def get(self, key: str) -> Optional[Any]:
        """获取缓存数据"""
        data = self.redis_client.get(key)
        if data:
            return json.loads(data)
        return None
  
    async def set(self, key: str, value: Any, ttl: int = None) -> bool:
        """设置缓存数据"""
        ttl = ttl or self.default_ttl
        data = json.dumps(value)
        return self.redis_client.setex(key, ttl, data)
  
    async def delete(self, key: str) -> bool:
        """删除缓存数据"""
        return bool(self.redis_client.delete(key))
4.3.2 负载均衡
import random
from typing import List

class LoadBalancer:
    def __init__(self, servers: List[str]):
        self.servers = servers
        self.current_index = 0
  
    def get_server(self) -> str:
        """获取服务器(轮询策略)"""
        server = self.servers[self.current_index]
        self.current_index = (self.current_index + 1) % len(self.servers)
        return server
  
    def get_random_server(self) -> str:
        """获取随机服务器"""
        return random.choice(self.servers)

5. 在开发工具中调用MCP

5.1 VS Code扩展开发

5.1.1 扩展结构
{
  "name": "mcp-client-extension",
  "displayName": "MCP Client",
  "description": "MCP客户端扩展",
  "version": "1.0.0",
  "engines": {
    "vscode": "^1.74.0"
  },
  "categories": ["Other"],
  "activationEvents": [
    "onCommand:mcp.connect",
    "onCommand:mcp.callTool"
  ],
  "main": "./out/extension.js",
  "contributes": {
    "commands": [
      {
        "command": "mcp.connect",
        "title": "Connect to MCP Server"
      },
      {
        "command": "mcp.callTool",
        "title": "Call MCP Tool"
      }
    ],
    "configuration": {
      "title": "MCP Client",
      "properties": {
        "mcp.serverUrl": {
          "type": "string",
          "default": "ws://localhost:8080",
          "description": "MCP服务器地址"
        }
      }
    }
  }
}
5.1.2 扩展实现
import * as vscode from 'vscode';
import { MCPClient } from './mcp-client';

export function activate(context: vscode.ExtensionContext) {
    const mcpClient = new MCPClient();
  
    // 连接命令
    const connectCommand = vscode.commands.registerCommand('mcp.connect', async () => {
        const config = vscode.workspace.getConfiguration('mcp');
        const serverUrl = config.get<string>('serverUrl');
      
        try {
            await mcpClient.connect(serverUrl!);
            vscode.window.showInformationMessage('Connected to MCP server');
        } catch (error) {
            vscode.window.showErrorMessage(`Failed to connect: ${error}`);
        }
    });
  
    // 工具调用命令
    const callToolCommand = vscode.commands.registerCommand('mcp.callTool', async () => {
        const toolName = await vscode.window.showInputBox({
            prompt: 'Enter tool name',
            placeHolder: 'weather_query'
        });
      
        if (toolName) {
            try {
                const result = await mcpClient.callTool(toolName, {});
                vscode.window.showInformationMessage(`Tool result: ${JSON.stringify(result)}`);
            } catch (error) {
                vscode.window.showErrorMessage(`Tool call failed: ${error}`);
            }
        }
    });
  
    context.subscriptions.push(connectCommand, callToolCommand);
}

5.2 IntelliJ IDEA插件开发

5.2.1 插件配置
<idea-plugin>
    <id>com.example.mcpclient</id>
    <name>MCP Client</name>
    <version>1.0.0</version>
    <vendor>Your Company</vendor>
  
    <depends>com.intellij.modules.platform</depends>
  
    <extensions defaultExtensionNs="com.intellij">
        <toolWindow id="MCP Tools" anchor="right" 
                   factoryClass="com.example.mcp.MCPToolWindowFactory"/>
    </extensions>
  
    <actions>
        <action id="MCP.Connect" 
                class="com.example.mcp.ConnectAction" 
                text="Connect to MCP Server"/>
        <action id="MCP.CallTool" 
                class="com.example.mcp.CallToolAction" 
                text="Call MCP Tool"/>
    </actions>
</idea-plugin>
5.2.2 插件实现
package com.example.mcp;

import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowManager;

public class ConnectAction extends AnAction {
    @Override
    public void actionPerformed(AnActionEvent e) {
        try {
            MCPClient client = MCPClient.getInstance();
            client.connect("ws://localhost:8080");
            Messages.showInfoMessage("Connected to MCP server", "MCP Client");
        } catch (Exception ex) {
            Messages.showErrorDialog("Failed to connect: " + ex.getMessage(), "MCP Client");
        }
    }
}

5.3 命令行工具开发

5.3.1 CLI工具实现
import click
import asyncio
from mcp_client import MCPClient

@click.group()
def cli():
    """MCP命令行工具"""
    pass

@cli.command()
@click.option('--server', default='ws://localhost:8080', help='MCP服务器地址')
def connect(server):
    """连接到MCP服务器"""
    async def _connect():
        client = MCPClient(server)
        await client.connect()
        print(f"Connected to {server}")
  
    asyncio.run(_connect())

@cli.command()
@click.argument('tool_name')
@click.option('--args', help='工具参数(JSON格式)')
def call_tool(tool_name, args):
    """调用MCP工具"""
    async def _call_tool():
        client = MCPClient()
        await client.connect()
      
        arguments = {}
        if args:
            import json
            arguments = json.loads(args)
      
        result = await client.call_tool(tool_name, arguments)
        print(json.dumps(result, indent=2))
  
    asyncio.run(_call_tool())

@cli.command()
def list_tools():
    """列出可用工具"""
    async def _list_tools():
        client = MCPClient()
        await client.connect()
        tools = await client.list_tools()
      
        for tool in tools:
            print(f"- {tool['name']}: {tool['description']}")
  
    asyncio.run(_list_tools())

if __name__ == '__main__':
    cli()

5.4 Web界面集成

5.4.1 React组件
import React, { useState, useEffect } from 'react';
import { MCPClient } from './mcp-client';

interface Tool {
  name: string;
  description: string;
  input_schema: any;
}

const MCPToolPanel: React.FC = () => {
  const [client, setClient] = useState<MCPClient | null>(null);
  const [tools, setTools] = useState<Tool[]>([]);
  const [connected, setConnected] = useState(false);
  const [results, setResults] = useState<any[]>([]);

  useEffect(() => {
    const mcpClient = new MCPClient('ws://localhost:8080');
    setClient(mcpClient);
  }, []);

  const connect = async () => {
    if (client) {
      try {
        await client.connect();
        setConnected(true);
        const toolList = await client.list_tools();
        setTools(toolList);
      } catch (error) {
        console.error('Connection failed:', error);
      }
    }
  };

  const callTool = async (toolName: string, args: any) => {
    if (client && connected) {
      try {
        const result = await client.call_tool(toolName, args);
        setResults(prev => [...prev, { tool: toolName, result, timestamp: new Date() }]);
      } catch (error) {
        console.error('Tool call failed:', error);
      }
    }
  };

  return (
    <div className="mcp-panel">
      <h2>MCP Tools</h2>
      {!connected ? (
        <button onClick={connect}>Connect to Server</button>
      ) : (
        <div>
          <h3>Available Tools</h3>
          {tools.map(tool => (
            <div key={tool.name} className="tool-item">
              <h4>{tool.name}</h4>
              <p>{tool.description}</p>
              <button onClick={() => callTool(tool.name, {})}>
                Call Tool
              </button>
            </div>
          ))}
        
          <h3>Results</h3>
          {results.map((result, index) => (
            <div key={index} className="result-item">
              <strong>{result.tool}</strong> - {result.timestamp.toLocaleTimeString()}
              <pre>{JSON.stringify(result.result, null, 2)}</pre>
            </div>
          ))}
        </div>
      )}
    </div>
  );
};

export default MCPToolPanel;

6. 最佳实践与案例

6.1 最佳实践

6.1.1 错误处理
class MCPError(Exception):
    """MCP基础异常类"""
    pass

class MCPConnectionError(MCPError):
    """连接错误"""
    pass

class MCPToolError(MCPError):
    """工具调用错误"""
    pass

class MCPValidationError(MCPError):
    """数据验证错误"""
    pass

# 使用示例
async def safe_tool_call(client, tool_name, args):
    try:
        return await client.call_tool(tool_name, args)
    except MCPConnectionError:
        # 处理连接错误
        await client.reconnect()
        return await client.call_tool(tool_name, args)
    except MCPToolError as e:
        # 处理工具错误
        logger.error(f"Tool {tool_name} failed: {e}")
        return {"error": str(e)}
    except MCPValidationError as e:
        # 处理验证错误
        logger.error(f"Validation failed: {e}")
        return {"error": "Invalid arguments"}
6.1.2 性能监控
import time
from functools import wraps

def monitor_performance(func):
    """性能监控装饰器"""
    @wraps(func)
    async def wrapper(*args, **kwargs):
        start_time = time.time()
        try:
            result = await func(*args, **kwargs)
            execution_time = time.time() - start_time
            logger.info(f"{func.__name__} executed in {execution_time:.2f}s")
            return result
        except Exception as e:
            execution_time = time.time() - start_time
            logger.error(f"{func.__name__} failed after {execution_time:.2f}s: {e}")
            raise
    return wrapper

# 使用示例
@monitor_performance
async def call_weather_tool(city: str):
    # 工具调用逻辑
    pass
6.1.3 配置管理
from dataclasses import dataclass
from typing import Optional, List
import os

@dataclass
class MCPConfig:
    server_url: str
    api_key: Optional[str] = None
    timeout: int = 30
    max_retries: int = 3
    tools: List[str] = None
  
    @classmethod
    def from_env(cls):
        """从环境变量加载配置"""
        return cls(
            server_url=os.getenv('MCP_SERVER_URL', 'ws://localhost:8080'),
            api_key=os.getenv('MCP_API_KEY'),
            timeout=int(os.getenv('MCP_TIMEOUT', '30')),
            max_retries=int(os.getenv('MCP_MAX_RETRIES', '3')),
            tools=os.getenv('MCP_TOOLS', '').split(',') if os.getenv('MCP_TOOLS') else None
        )

6.2 实际案例

6.2.1 智能代码分析工具
class CodeAnalysisTool:
    def __init__(self):
        self.analysis_engines = {
            'syntax': self._analyze_syntax,
            'complexity': self._analyze_complexity,
            'security': self._analyze_security,
            'performance': self._analyze_performance
        }
  
    async def analyze_code(self, code: str, analysis_type: str) -> Dict[str, Any]:
        """分析代码"""
        if analysis_type not in self.analysis_engines:
            raise ValueError(f"Unknown analysis type: {analysis_type}")
      
        analyzer = self.analysis_engines[analysis_type]
        return await analyzer(code)
  
    async def _analyze_syntax(self, code: str) -> Dict[str, Any]:
        """语法分析"""
        # 实现语法分析逻辑
        return {
            "syntax_valid": True,
            "errors": [],
            "warnings": []
        }
  
    async def _analyze_complexity(self, code: str) -> Dict[str, Any]:
        """复杂度分析"""
        # 实现复杂度分析逻辑
        return {
            "cyclomatic_complexity": 5,
            "cognitive_complexity": 3,
            "maintainability_index": 85
        }
6.2.2 数据库查询工具
class DatabaseQueryTool:
    def __init__(self, connection_string: str):
        self.connection_string = connection_string
        self.pool = None
  
    async def execute_safe_query(self, query: str, params: List[Any] = None) -> Dict[str, Any]:
        """安全执行查询"""
        # 验证查询安全性
        if not self._is_safe_query(query):
            raise ValueError("Unsafe query detected")
      
        # 执行查询
        results = await self._execute_query(query, params)
      
        return {
            "success": True,
            "data": results,
            "row_count": len(results),
            "execution_time": 0.1
        }
  
    def _is_safe_query(self, query: str) -> bool:
        """检查查询安全性"""
        dangerous_keywords = ['DROP', 'DELETE', 'UPDATE', 'INSERT', 'ALTER']
        query_upper = query.upper()
        return not any(keyword in query_upper for keyword in dangerous_keywords)

7. 总结

7.1 MCP技术优势

  1. 标准化: 提供统一的协议标准,降低集成复杂度
  2. 安全性: 内置安全机制,保护数据和系统安全
  3. 可扩展性: 支持灵活的工具扩展和集成
  4. 互操作性: 不同厂商工具可以无缝协作
  5. 实时性: 支持实时数据访问和操作

7.2 开发建议

  1. 遵循规范: 严格按照MCP协议规范开发
  2. 错误处理: 实现完善的错误处理和重试机制
  3. 性能优化: 使用缓存、连接池等技术优化性能
  4. 安全第一: 重视认证、授权和数据加密
  5. 监控日志: 建立完善的监控和日志系统

7.3 未来展望

MCP作为AI工具集成的标准协议,将在以下方面持续发展:

  • 协议演进: 不断完善协议规范,增加新特性
  • 生态建设: 建立更丰富的工具生态
  • 性能优化: 持续优化协议性能和效率
  • 安全增强: 加强安全机制和隐私保护
  • 标准化: 推动行业标准化进程

通过MCP,开发者可以更轻松地构建智能化的应用系统,实现AI模型与外部工具的无缝集成,为用户提供更强大的功能体验。


本文档基于MCP协议规范编写,如有更新请参考官方文档。主站地址: https://modelcontextprotocol.io/

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐