Skip to content

5.7b MCP 进阶

💡 一句话总结:掌握 MCP 高级配置,创建自定义 MCP 服务器。


学完你能做什么

  • 能创建自定义 MCP 服务器
  • 能配置高级安全策略
  • 能进行性能优化
  • 能调试 MCP 连接

🎒 开始前的准备

确保你已经完成以下事项:


核心思路

MCP 服务器架构

MCP Server
├── 工具定义 (Tools)
├── 资源定义 (Resources)
├── 提示模板 (Prompts)
└── 处理器 (Handlers)

自定义服务器

基本结构

typescript
// mcp-server.ts
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
  CallToolRequestSchema,
  ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";

const server = new Server(
  { name: "my-custom-server", version: "1.0.0" },
  { capabilities: { tools: {} } }
);

// 定义工具
server.setRequestHandler(ListToolsRequestSchema, async () => {
  return {
    tools: [
      {
        name: "my_tool",
        description: "我的自定义工具",
        inputSchema: {
          type: "object",
          properties: {
            input: {
              type: "string",
              description: "输入参数",
            },
          },
          required: ["input"],
        },
      },
    ],
  };
});

// 处理工具调用
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  const { name, arguments: args } = request.params;
  
  if (name === "my_tool") {
    // 处理逻辑
    return {
      content: [
        {
          type: "text",
          text: JSON.stringify(result),
        },
      ],
    };
  }
});

// 启动服务器
const transport = new StdioServerTransport();
server.connect(transport);

高级工具

typescript
// 带进度通知
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  const { name, arguments: args } = request.params;
  
  if (name === "long_running_task") {
    // 发送进度
    await server.notification({
      method: "notifications/progress",
      params: {
        progress: 0.3,
        total: 1,
      },
    });
    
    // 继续处理
    const result = await process(args);
    
    return {
      content: [{ type: "text", text: result }],
    };
  }
});

安全配置

权限控制

yaml
mcp:
  servers:
    custom:
      command: "./mcp-server"
      
      security:
        allowed_tools:
          - "read_file"
          - "write_file"
        
        blocked_tools:
          - "execute_command"
          - "delete_file"
        
        resource_limits:
          max_file_size: "10MB"
          max_requests_per_minute: 60

认证配置

yaml
mcp:
  servers:
    secure:
      command: "./mcp-server"
      
      auth:
        type: "bearer"
        token: "${MCP_TOKEN}"
        
      encryption:
        enabled: true
        algorithm: "aes-256-gcm"

性能优化

yaml
mcp:
  servers:
    optimized:
      command: "./mcp-server"
      
      performance:
        connection_pool: 10
        request_timeout: 30000
        
        caching:
          enabled: true
          ttl: 300
        
        batch:
          enabled: true
          max_batch_size: 10

跟我做

实战:创建天气查询 MCP 服务器

typescript
// weather-server.ts
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

const server = new Server(
  { name: "weather-server", version: "1.0.0" },
  { capabilities: { tools: {} } }
);

server.setRequestHandler(ListToolsRequestSchema, async () => {
  return {
    tools: [
      {
        name: "get_weather",
        description: "获取指定城市的天气信息",
        inputSchema: {
          type: "object",
          properties: {
            city: {
              type: "string",
              description: "城市名称",
            },
          },
          required: ["city"],
        },
      },
      {
        name: "get_forecast",
        description: "获取天气预报",
        inputSchema: {
          type: "object",
          properties: {
            city: { type: "string" },
            days: {
              type: "number",
              default: 7,
              maximum: 14,
            },
          },
          required: ["city"],
        },
      },
    ],
  };
});

server.setRequestHandler(CallToolRequestSchema, async (request) => {
  const { name, arguments: args } = request.params;
  
  if (name === "get_weather") {
    const weather = await fetchWeather(args.city);
    return {
      content: [{ type: "text", text: JSON.stringify(weather) }],
    };
  }
  
  if (name === "get_forecast") {
    const forecast = await fetchForecast(args.city, args.days);
    return {
      content: [{ type: "text", text: JSON.stringify(forecast) }],
    };
  }
});

const transport = new StdioServerTransport();
server.connect(transport);

检查点 ✅

全部通过才能继续

  • [ ] 能创建自定义服务器
  • [ ] 能配置安全策略
  • [ ] 能进行性能优化
  • [ ] 能调试连接

本课小结

你学会了:

  1. MCP 服务器架构
  2. 创建自定义服务器
  3. 安全配置
  4. 性能优化
  5. 实战案例

下一课预告

下一课我们将学习 IDE 集成,连接 VS Code。


📚 更多完整模板Prompt 模板库