MCP 和 Skill 实战

🎯目标

完成本次培训后,参训人员将能够:

  • ✅ 理解 MCP 和 Skill 的概念与价值

  • ✅ 掌握 Claude Code 和 MCP 服务器的安装配置流程

  • ✅ 使用 SDD(Skill-Driven Development)流程完成前后端模块开发

  • ✅ 开发自定义 Skill 封装团队特定工作流

  • ✅ 开发自定义 MCP 服务扩展 AI 能力边界

  • ✅ 掌握通过上下文工程生成高保真原型的技巧(产品经理重点)

  • ✅ 产出可复用的培训文档和示例代码


  1. AI 编程工具已经普及 – GitHub Copilot、Cursor、Claude Code 等工具正在改变开发方式

  2. 效率提升显著 – 正确使用 AI 工具可以将开发效率提升 30%-50%

  3. 方法论很重要 – 有方法的 AI 辅助开发(SDD)比随意使用效果更好

  4. 团队协作需要 – 统一工具和方法可以降低协作成本

AI 编程工具分类

类别 代表工具 特点 适用场景
代码补全 GitHub Copilot、Codeium IDE 内嵌、自动补全 日常编码辅助
对话式编程 Claude Code、Cursor Chat 自然语言交互、理解上下文 复杂任务、项目探索
自主代理 Trae、Devin 目标导向、自主执行多步任务 长时间、复杂工作流

为什么选择 Claude Code?

我们选择 Claude Code 作为培训重点,原因如下:

  1. 上下文理解能力强 – Claude 模型在理解项目结构和意图方面有优势

  2. 项目探索能力出色 – 内置文件搜索、内容搜索、代码解释工具

  3. 技能系统完善 – superpowers 技能库开箱即用,覆盖完整开发流程

  4. MCP 支持完整 – 可扩展访问各种外部工具和服务

环境准备

请大家确认已安装以下软件:

# 检查 Node.js(18+  required)
node --version

# 检查 Java(17+ required)
java --version

# 检查 Git
git --version

安装 Claude Code:

# 全局安装
npm install -g @anthropic-ai/claude-code

# 验证安装
claude --version

# 登录
claude login

模块 1:基础概念

1.1 什么是 MCP

MCP(Model Context Protocol) 是标准化的 AI 工具接口协议。https://modelcontextprotocol.net.cn/docs/getting-started/intro

核心概念

MCP 定义了 AI 模型与外部工具之间的通信标准,类似 JDBC 之于数据库驱动。

┌─────────────────────────────────────────────────────────┐
│                     Claude Code  (MCP host)             │
├─────────────────────────────────────────────────────────┤
│                        MCP Client                       │
├─────────────────────────────────────────────────────────┤
│   MCP Server 1  │   MCP Server 2  │   MCP Server 3      │
│   (文件系统)     │   (Git)         │   (数据库)            │
└─────────────────────────────────────────────────────────┘

MCP 的三种接口类型

  1. Tools(工具 – 可执行的操作

    • 示例:查询数据库发送 HTTP 请求执行 Shell 命令

  2. Resources(资源 – 可读取的数据

    • 示例:文件内容API 响应数据库记录

  3. Prompts(提示 – 预定义的对话模板

    • 示例:代码审查模板需求分析模板

推荐的 MCP 服务器

服务器 用途
filesystem 文件操作
postgres PostgreSQL
puppeteer 浏览器自动化

1.2 什么是 Skill

Skill(技能)Claude Code 的可复用工作流封装。

superpowers 技能系统

superpowers 是最流行的 Claude Code 技能库,包含:

类别 技能 作用
规划类 brainstorming 需求分析、方案设计
writing-plans 生成详细实现计划
执行类 executing-plans 按步骤自动执行
implement 智能代码实现
frontend-design 前端 UI 设计与实现
质量类 requesting-code-review 代码审查
security-scan 安全分析
test 测试生成和运行

SDD(Skill-Driven Development)流程

需求 → brainstorming → writing-plans → executing-plans → 完成
                            ↓
                       code-review
                            ↓
                          test

每个环节都有对应的技能,形成标准化的开发流程。


1.3 安装与配置演示

步骤 1:配置 Claude Code

编辑全局配置文件 ~/.claude/CLAUDE.md

**交互风格**:专业、简洁
**交互语言**:简体中文

步骤 2:配置 MCP 服务器

编辑项目配置文件 .claude/settings.json

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/watch"]
    },
    "git": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-git"]
    }
  }
}

步骤 3:验证配置

cd /path/to/project
claude

在 Claude Code 中测试:

> 列出当前目录的文件
> 查看 git 状态

1.4 技能使用演示

启动技能

claude
/superpowers:brainstorming 为项目添加数据导出功能

查看可用技能

/superpowers:list

技能调用示例

场景 技能命令
新功能需求分析 /superpowers:brainstorming <需求描述>
生成实现计划 /superpowers:writing-plans
执行计划 /superpowers:executing-plans
代码审查 /superpowers:requesting-code-review
生成测试 /superpowers:test

模块 1 小结

  • MCP 是标准化的 AI 工具接口

  • Skill 是可复用的工作流封装

  • SDD 流程:brainstorming → writing-plans → executing-plans → code-review → test

  • 配置 MCP 服务器可以扩展 Claude 的能力



模块 2:数据导出模块实战

2.1 案例介绍

业务需求:为现有的 Spring Boot 项目添加数据导出功能。

功能需求

需求 描述
导出用户列表数据 将系统中的用户数据导出为文件
支持多种格式 CSV、Excel、PDF 三种格式
筛选条件导出 支持按日期范围、用户状态等条件筛选
前端交互 导出按钮 + 格式选择 + 下载进度提示

技术栈

后端

  • Spring Boot 3.x

  • Apache POI(Excel 导出)

  • OpenCSV(CSV 导出)

  • iText 7(PDF 导出)

前端

  • React 18

  • Tailwind CSS

  • Axios(HTTP 请求)

  • 下载进度组件


2.2 SDD 流程演示

步骤 1:brainstorming(需求分析与设计)

命令

/superpowers:brainstorming 为 Spring Boot 项目添加数据导出模块

需求:
1. 导出用户列表数据
2. 支持 CSV、Excel、PDF 三种格式
3. 支持按日期范围、状态筛选
4. 前端需要导出按钮、格式选择器、下载进度提示

现有项目结构:
- 已有 User 实体和 UserRepository
- 已有基础的 CRUD API
- 前端使用 React + Tailwind CSS

brainstorming 技能会执行

  1. 探索项目上下文,了解现有架构

  2. 提出澄清问题(一次一个)

  3. 提出 2-3 个技术方案并对比

  4. 呈现推荐的设计方案

可能的澄清问题

  • 导出数据量级大概是多少?(影响是否需要分页导出)

  • 是否需要异步导出?(大数据量时建议后台任务)

  • 有没有特定的权限控制需求?

推荐方案

方案 A:同步导出(简单,适合小数据量)
方案 B:异步导出 + 通知(复杂,适合大数据量)
推荐:方案 A(培训场景,简单直观)

步骤 2:writing-plans(生成实现计划)

设计方案批准后,技能自动过渡到 writing-plans:

/superpowers:writing-plans

生成的任务清单示例

TODO: 数据导出模块实现

[ ] 1. 后端 - 添加 Maven 依赖(POI、OpenCSV、iText)
[ ] 2. 后端 - 创建 ExportController(REST API)
[ ] 3. 后端 - 创建 ExportService(导出业务逻辑)
[ ] 4. 后端 - 实现 CSV 导出方法
[ ] 5. 后端 - 实现 Excel 导出方法
[ ] 6. 后端 - 实现 PDF 导出方法
[ ] 7. 后端 - 添加筛选条件支持
[ ] 8. 前端 - 创建 ExportButton 组件
[ ] 9. 前端 - 创建 FormatSelector 组件
[ ] 10. 前端 - 创建 DownloadProgress 组件
[ ] 11. 前端 - 集成到用户列表页面
[ ] 12. 测试 - 生成单元测试
[ ] 13. 测试 - 运行验证

步骤 3:executing-plans(执行计划)

/superpowers:executing-plans

技能执行过程

  1. 按顺序处理任务

  2. 更新任务状态(pending → in_progress → completed)

  3. 处理依赖关系(如:先有 Service 再有 Controller)

  4. 关键节点请求确认

后端代码示例 – ExportController.java

@RestController
@RequestMapping("/api/users")
public class ExportController {

    private final ExportService exportService;

    @GetMapping("/export")
    public ResponseEntity<byte[]> exportUsers(
            @RequestParam String format,
            @RequestParam(required = false) LocalDate startDate,
            @RequestParam(required = false) LocalDate endDate,
            @RequestParam(required = false) String status) {

        byte[] exportedData = exportService.exportUsers(format, startDate, endDate, status);

        String contentType = switch (format.toLowerCase()) {
            case "csv" -> "text/csv";
            case "excel" -> "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            case "pdf" -> "application/pdf";
            default -> "application/octet-stream";
        };

        String fileName = switch (format.toLowerCase()) {
            case "csv" -> "users.csv";
            case "excel" -> "users.xlsx";
            case "pdf" -> "users.pdf";
            default -> "users.dat";
        };

        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName)
                .contentType(MediaType.parseMediaType(contentType))
                .body(exportedData);
    }
}

前端代码示例 – ExportButton.tsx

import React, { useState } from 'react';
import axios from 'axios';

interface ExportButtonProps {
  filters: {
    startDate?: string;
    endDate?: string;
    status?: string;
  };
}

export const ExportButton: React.FC<ExportButtonProps> = ({ filters }) => {
  const [format, setFormat] = useState<'csv' | 'excel' | 'pdf'>('csv');
  const [progress, setProgress] = useState<number>(0);
  const [downloading, setDownloading] = useState<boolean>(false);

  const handleExport = async () => {
    setDownloading(true);
    setProgress(0);

    try {
      const response = await axios.get('/api/users/export', {
        params: { format, ...filters },
        responseType: 'blob',
        onDownloadProgress: (progressEvent) => {
          const percentCompleted = Math.round(
            (progressEvent.loaded * 100) / (progressEvent.total || 1)
          );
          setProgress(percentCompleted);
        },
      });

      // 触发下载
      const blob = new Blob([response.data], { type: response.headers['content-type'] });
      const url = window.URL.createObjectURL(blob);
      const link = document.createElement('a');
      link.href = url;
      link.download = `users.${format === 'excel' ? 'xlsx' : format}`;
      link.click();
      window.URL.revokeObjectURL(url);
    } catch (error) {
      console.error('导出失败', error);
      alert('导出失败,请重试');
    } finally {
      setDownloading(false);
    }
  };

  return (
    <div className="flex items-center gap-2">
      <select
        value={format}
        onChange={(e) => setFormat(e.target.value as 'csv' | 'excel' | 'pdf')}
        className="px-3 py-2 border rounded-md"
        disabled={downloading}
      >
        <option value="csv">CSV</option>
        <option value="excel">Excel</option>
        <option value="pdf">PDF</option>
      </select>

      <button
        onClick={handleExport}
        disabled={downloading}
        className="px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 disabled:bg-gray-400"
      >
        {downloading ? '导出中...' : '导出'}
      </button>

      {downloading && (
        <div className="w-32 bg-gray-200 rounded-full h-2">
          <div
            className="bg-blue-600 h-2 rounded-full transition-all"
            style={{ width: `${progress}%` }}
          />
        </div>
      )}
    </div>
  );
};

步骤 4:frontend-design(前端设计规范)

/superpowers:frontend-design

frontend-design 技能会

  1. 分析现有前端代码风格

  2. 遵循设计系统(如 Ant Design、Tailwind UI)

  3. 生成符合规范的组件代码

  4. 确保响应式和可访问性

设计规范检查清单

  • 颜色使用 Tailwind 色板
  • 组件尺寸一致(按钮高度 36px/40px)
  • 字体大小符合层级
  • 间距使用统一的 spacing scale
  • 支持键盘导航
  • 有加载状态和错误状态

步骤 5:code-review(代码审查)

/superpowers:requesting-code-review 审查刚才实现的数据导出模块

审查维度

维度 检查项
代码质量 命名规范、代码结构、重复代码
安全性 输入验证、XSS 防护、权限控制
性能 大数据量处理、内存管理
测试 单元测试覆盖率、边界条件

典型审查反馈

⚠️ 发现 3 个改进建议:

1. [安全性] ExportController 缺少输入验证
   建议:添加 @Valid 注解和自定义验证器

2. [性能] PDF 导出生成大文件时可能 OOM
   建议:使用流式处理或限制最大导出量

3. [测试] 缺少单元测试
   建议:为 ExportService 生成测试用例

步骤 6:test(测试生成与验证)

/superpowers:test

生成的测试用例示例

@SpringBootTest
class ExportServiceTest {

    @Autowired
    private ExportService exportService;

    @Test
    void testExportToCsv() {
        // Given
        LocalDate startDate = LocalDate.now().minusDays(7);
        LocalDate endDate = LocalDate.now();

        // When
        byte[] result = exportService.exportUsers("csv", startDate, endDate, "ACTIVE");

        // Then
        assertThat(result).isNotEmpty();
        assertThat(new String(result)).contains("id,name,email");
    }

    @Test
    void testExportToExcel() {
        byte[] result = exportService.exportUsers("excel", null, null, null);
        assertThat(result).isNotEmpty();
    }

    @Test
    void testExportToPdf() {
        byte[] result = exportService.exportUsers("pdf", null, null, null);
        assertThat(result).isNotEmpty();
    }
}

2.3 模块 2 小结

SDD 流程回顾

brainstorming(需求分析)
    ↓
writing-plans(任务分解)
    ↓
executing-plans(自动执行)
    ↓
frontend-design(UI 设计)
    ↓
code-review(质量审查)
    ↓
test(测试验证)

关键收获

  • AI 生成的代码需要审查和测试

  • SDD 流程保证代码质量

  • 技能可以编排使用,形成工作流


模块 3:自定义 Skill 开发实战

3.1 为什么需要自定义 Skill?

官方 superpowers 技能虽然强大,但每个团队有特定的工作流:

场景 官方 Skill 自定义 Skill
公司特定流程 ❌ 不支持 ✅ 封装内部审批流程
代码规范检查 ⚠️ 通用检查 ✅ 按团队规范定制
专有工具集成 ❌ 不支持 ✅ 集成内部工具链
领域知识注入 ⚠️ 通用知识 ✅ 注入业务领域知识

本模块实战案例:开发一个”API 文档生成 Skill”,自动为公司项目生成符合内部规范的 API 文档。


3.2 Skill 结构解析

Skill 文件组成

一个完整的 Skill 通常包含:

my-custom-skill/
├── SKILL.md              # 技能主文件(必需)
├── prompts/              # 子提示词目录(可选)
│   └── reviewer-prompt.md
└── references/           # 参考资料目录(可选)
    └── api-style-guide.md

SKILL.md 标准结构

---
name: skill-name           # 技能名称(调用时使用)
description: 技能描述       # 简短描述技能用途
---

# 技能标题

## 技能说明
详细描述技能的作用和使用场景。

## Checklist
技能执行时必须完成的步骤:
1. **步骤 1** - 说明
2. **步骤 2** - 说明
3. **步骤 3** - 说明

## 输出要求
技能应该产出什么:代码、文档、测试结果

3.3 实战:开发 API 文档生成 Skill

步骤 1:创建 Skill 目录

# 在技能目录中创建
mkdir -p ~/.claude/plugins/my-skills/api-doc-generator
cd ~/.claude/plugins/my-skills/api-doc-generator

# 创建目录结构
mkdir -p prompts
mkdir -p references

步骤 2:编写 SKILL.md

---
name: api-doc-generator
description: 为公司项目生成符合内部规范的 API 文档
---

# API 文档生成器

本 Skill 用于分析 Spring Boot 项目的 Controller 代码,自动生成符合公司内部规范的 API 文档。

## Checklist

1. **探索项目结构** — 找到所有 Controller 文件
2. **分析 API 端点** — 提取每个端点的详细信息
3. **检查命名规范** — 验证是否符合 RESTful 规范
4. **生成文档草稿** — 按公司模板生成 Markdown 文档
5. **质量审查** — 检查文档完整性和准确性
6. **输出最终文档** — 保存到 docs/api/ 目录

## API 规范检查清单

### RESTful 规范
- [ ] 使用正确的 HTTP 方法(GET/POST/PUT/DELETE)
- [ ] URL 使用复数名词(/users 而非 /user)
- [ ] URL 使用小写和连字符(/user-profiles 而非 /userProfiles)
- [ ] 避免在 URL 中使用动词

### 响应规范
- [ ] 成功响应返回 200/201/204
- [ ] 错误响应包含 error_code 和 message
- [ ] 分页响应包含 page/size/total 字段

### 文档规范
- [ ] 每个端点有中文描述
- [ ] 请求参数有说明和示例
- [ ] 响应字段有说明和示例

步骤 3:配置和使用自定义 Skill

编辑 ~/.claude/settings.json

{
  "skills": {
    "sources": [
      {
        "type": "local",
        "path": "/Users/your-name/.claude/plugins/my-skills"
      }
    ]
  }
}

步骤 4:使用 Skill

/superpowers:api-doc-generator 为当前项目生成 API 文档

3.4 Skill 执行过程演示

阶段 内容
1. 探索项目结构 找到所有 Controller 文件
2. 分析 API 端点 提取端点信息(方法、URL、参数、响应)
3. 检查命名规范 对照 RESTful 规范检查
4. 生成文档草稿 按公司模板生成 Markdown
5. 质量审查 检查完整性
6. 输出最终文档 保存到 docs/api/

3.5 模块 3 小结

关键收获

  • 自定义 Skill 可以封装团队特定工作流

  • SKILL.md 是技能的核心配置文件

  • Checklist 确保技能执行的完整性


模块 4:自定义 MCP 服务开发

4.1 为什么需要自定义 MCP 服务?

官方 MCP 服务器提供通用功能,但公司内部往往有特定需求:

场景 官方 MCP 自定义 MCP
数据库查询 ❌ 不支持 ✅ 封装内部数据库访问
内部 API 调用 ❌ 不支持 ✅ 封装公司微服务
业务系统对接 ❌ 不支持 ✅ 对接 ERP/CRM 系统
权限验证 ❌ 不支持 ✅ 集成公司 SSO

本模块实战案例:开发一个”数据库查询 MCP 服务”,让 Claude 可以直接查询公司业务数据库。


4.2 MCP 协议解析

MCP 架构

┌────────────────────────────────────────────┐
│            Claude Code (Host)              │
├────────────────────────────────────────────┤
│              MCP Client                    │
├──────────────┬──────────────┬──────────────┤
│   Tool       │  Resource    │   Prompt     │
│   (工具)      │  (资源)      │   (提示)      │
└──────────────┴──────────────┴──────────────┘
                        ↑
                MCP Protocol
                        ↓
┌────────────────────────────────────────────┐
│           自定义 MCP Server                │
│  ┌──────────┬──────────┬──────────────────┐│
│  │ register │ call     │ list             ││
│  └──────────┴──────────┴──────────────────┘│
└────────────────────────────────────────────┘

三种接口类型

1. Tools(工具) – 可执行的操作

// 定义工具
{
  name: "query_database",
  description: "执行 SQL 查询并返回结果",
  inputSchema: {
    type: "object",
    properties: {
      sql: { type: "string", description: "SQL 查询语句" },
      params: { type: "array", description: "参数列表" }
    }
  }
}

// 调用工具
{
  "name": "query_database",
  "arguments": {
    "sql": "SELECT * FROM users WHERE status = ?",
    "params": ["active"]
  }
}

2. Resources(资源) – 可读取的数据

// 定义资源
{
  uri: "db://users/active",
  name: "活跃用户列表",
  mimeType: "application/json"
}

// 读取资源
GET db://users/active
→ [{ id: 1, name: "张三" }, ...]

3. Prompts(提示) – 预定义的对话模板

// 定义提示模板
{
  name: "analyze_query_result",
  description: "分析查询结果并生成报告",
  arguments: {
    query: { description: "原始 SQL 查询", required: true },
    result: { description: "查询结果", required: true }
  }
}

4.3 脚手架搭建

步骤 1:创建项目

# 创建项目目录
mkdir mcp-db-server
cd mcp-db-server

# 初始化 npm 项目
npm init -y

# 安装依赖
npm install @modelcontextprotocol/sdk zod
npm install -D @types/node typescript

# 初始化 TypeScript
npx tsc --init

步骤 2:配置 tsconfig.json

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"]
}

步骤 3:配置 package.json

{
  "name": "mcp-db-server",
  "version": "1.0.0",
  "type": "module",
  "main": "dist/index.js",
  "bin": {
    "mcp-db-server": "./dist/index.js"
  },
  "scripts": {
    "build": "tsc",
    "start": "node dist/index.js",
    "dev": "ts-node src/index.ts"
  }
}

4.4 业务逻辑实现

完整代码示例 – src/index.ts

#!/usr/bin/env node
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import {
  CallToolRequestSchema,
  ListToolsRequestSchema,
  Tool,
} from '@modelcontextprotocol/sdk/types.js';
import mysql from 'mysql2/promise';

// 数据库连接池
let pool: mysql.Pool | null = null;

async function getPool() {
  if (!pool) {
    pool = mysql.createPool({
      host: process.env.DB_HOST || 'localhost',
      user: process.env.DB_USER || 'root',
      password: process.env.DB_PASSWORD || '',
      database: process.env.DB_NAME || 'test',
      waitForConnections: true,
      connectionLimit: 10,
    });
  }
  return pool;
}

// 定义工具
const QUERY_TOOL: Tool = {
  name: 'query_database',
  description: '执行 SQL 查询并返回结果(只读操作)',
  inputSchema: {
    type: 'object',
    properties: {
      sql: {
        type: 'string',
        description: 'SQL 查询语句(仅支持 SELECT)'
      },
      params: {
        type: 'array',
        description: '参数列表',
        items: { type: 'string' }
      }
    },
    required: ['sql']
  }
};

const LIST_TABLES_TOOL: Tool = {
  name: 'list_tables',
  description: '列出数据库中的所有表',
  inputSchema: {
    type: 'object',
    properties: {}
  }
};

const DESCRIBE_TABLE_TOOL: Tool = {
  name: 'describe_table',
  description: '查看表结构',
  inputSchema: {
    type: 'object',
    properties: {
      table: {
        type: 'string',
        description: '表名'
      }
    },
    required: ['table']
  }
};

// 创建服务器
const server = new Server(
  {
    name: 'db-server',
    version: '1.0.0',
  },
  {
    capabilities: {
      tools: {},
    },
  }
);

// 处理列出工具请求
server.setRequestHandler(ListToolsRequestSchema, async () => {
  return {
    tools: [QUERY_TOOL, LIST_TABLES_TOOL, DESCRIBE_TABLE_TOOL],
  };
});

// 处理调用工具请求
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  const { name, arguments: args } = request.params;

  try {
    switch (name) {
      case 'query_database': {
        const sql = args?.sql as string;
        const params = args?.params as string[] | undefined;

        // 安全校验:只允许 SELECT
        if (!sql.trim().toUpperCase().startsWith('SELECT')) {
          throw new Error('只支持 SELECT 查询');
        }

        const pool = await getPool();
        const [rows] = await pool.execute(sql, params);

        return {
          content: [
            {
              type: 'text',
              text: JSON.stringify(rows, null, 2),
            },
          ],
        };
      }

      case 'list_tables': {
        const pool = await getPool();
        const [rows] = await pool.execute('SHOW TABLES');

        return {
          content: [
            {
              type: 'text',
              text: JSON.stringify(rows, null, 2),
            },
          ],
        };
      }

      case 'describe_table': {
        const table = args?.table as string;
        const pool = await getPool();
        const [rows] = await pool.execute(`DESCRIBE ${table}`);

        return {
          content: [
            {
              type: 'text',
              text: JSON.stringify(rows, null, 2),
            },
          ],
        };
      }

      default:
        throw new Error(`Unknown tool: ${name}`);
    }
  } catch (error) {
    return {
      content: [
        {
          type: 'text',
          text: `Error: ${error instanceof Error ? error.message : String(error)}`,
        },
      ],
    };
  }
});

// 启动服务器
async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error('MCP Database Server running on stdio');
}

main().catch((error) => {
  console.error('Fatal error:', error);
  process.exit(1);
});

4.5 配置与集成

步骤 1:构建项目

npm run build

步骤 2:配置 Claude Code

编辑项目级配置 .claude/settings.json

{
  "mcpServers": {
    "db-server": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-db-server/dist/index.js"],
      "env": {
        "DB_HOST": "localhost",
        "DB_USER": "root",
        "DB_PASSWORD": "your_password",
        "DB_NAME": "your_database"
      }
    }
  }
}

步骤 3:验证配置

claude
> 你有哪些可用的工具?

列出数据库中的所有表
查询 users 表的数据

步骤 4:环境变量管理(推荐)

创建 .env 文件:

# .env
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=secret
DB_NAME=production

修改配置引用:

{
  "mcpServers": {
    "db-server": {
      "command": "node",
      "args": ["/path/to/mcp-db-server/dist/index.js"],
      "env": {
        "DB_HOST": "${DB_HOST}",
        "DB_USER": "${DB_USER}",
        "DB_PASSWORD": "${DB_PASSWORD}",
        "DB_NAME": "${DB_NAME}"
      }
    }
  }
}

4.6 安全最佳实践

1. SQL 注入防护

// ✅ 使用参数化查询
await pool.execute('SELECT * FROM users WHERE id = ?', [userId]);

// ❌ 避免字符串拼接
await pool.execute(`SELECT * FROM users WHERE id = ${userId}`);

2. 权限控制

// 只读校验
if (!sql.trim().toUpperCase().startsWith('SELECT')) {
  throw new Error('只支持 SELECT 查询');
}

// 黑名单过滤
const forbiddenKeywords = ['DROP', 'DELETE', 'UPDATE', 'INSERT', 'TRUNCATE'];
for (const keyword of forbiddenKeywords) {
  if (sql.toUpperCase().includes(keyword)) {
    throw new Error(`不允许的操作:${keyword}`);
  }
}

3. 审计日志

// 记录所有查询
console.error(`[AUDIT] Query executed: ${sql} by user: ${process.env.CURRENT_USER}`);

4. 查询限制

// 限制返回行数
const [rows] = await pool.execute(`${sql} LIMIT 1000`);

// 超时设置
const pool = mysql.createPool({
  ...config,
  acquireTimeout: 10000, // 10 秒超时
});

4.7 扩展:添加更多功能

添加 Schema 浏览工具

const LIST_SCHEMAS_TOOL: Tool = {
  name: 'list_schemas',
  description: '列出所有数据库 schema',
  inputSchema: {
    type: 'object',
    properties: {}
  }
};

// 在 handler 中添加
case 'list_schemas': {
  const pool = await getPool();
  const [rows] = await pool.execute('SHOW DATABASES');
  return {
    content: [{ type: 'text', text: JSON.stringify(rows, null, 2) }],
  };
}

添加数据导出工具

const EXPORT_TOOL: Tool = {
  name: 'export_to_csv',
  description: '将查询结果导出为 CSV',
  inputSchema: {
    type: 'object',
    properties: {
      sql: { type: 'string', description: 'SQL 查询' },
      filename: { type: 'string', description: '输出文件名' }
    },
    required: ['sql', 'filename']
  }
};

4.8 模块 4 小结

关键收获

  • MCP 协议定义了 Tool/Resource/Prompt 三种接口

  • 使用 @modelcontextprotocol/sdk 可以快速开发自定义服务

  • 安全是自定义 MCP 的首要考虑(SQL 注入、权限控制、审计日志)

  • 通过 MCP 可以将内部系统暴露给 AI,极大扩展能力边界

下一步

  • 为公司内部 API 创建 MCP 封装

  • 为数据库查询添加权限验证

  • 集成公司 SSO 认证


模块 5:高保真原型生成(30 分钟,产品经理重点)

5.1 什么是上下文工程?

上下文工程(Context Engineering) 是通过精心设计的 Prompt 和上下文信息,引导 AI 生成稳定、可预测、符合规范的输出。

传统 Prompt vs 上下文工程

维度 传统 Prompt 上下文工程
角色设定 “你是一个助手” “你是资深产品设计师,10 年企业级 SaaS 经验”
设计约束 “做好看点” “遵循 Ant Design 4.x 规范,主色#1890ff”
组件引用 “用些组件” “使用 shadcn/ui 的 Card、Button、Table 组件”
输出格式 随意 结构化:React + Tailwind + TypeScript
迭代 重新生成 基于反馈的增量修改

5.2 上下文工程四要素

要素 1:角色设定(Role)

普通设定

你是一个助手

专业设定

你是资深产品设计师,专精于企业级 SaaS 产品设计。
你有 10 年设计经验,熟悉 Ant Design、Material Design 等设计系统。
你的设计风格简洁、专业,注重可用性和可访问性。

要素 2:设计约束(Constraints)

模糊约束

做好看点,专业一点

精确约束

设计要求:
1. 使用 Ant Design 4.x 组件库
2. 主色调:#1890ff(Ant Design 默认蓝)
3. 字体:系统字体栈,正文 14px,标题 16-24px
4. 间距:使用 4/8/12/16/24/32px 等级
5. 圆角:4px(小)、8px(中)
6. 阴影:使用 Ant Design 默认阴影层级

要素 3:组件引用(Components)

模糊引用

用一些现成的组件

精确引用

使用以下组件:
- Card:内容卡片容器
- Button:操作按钮(size: middle, type: primary)
- Table:数据表格(pagination: true, bordered: true)
- DatePicker.RangePicker:日期范围选择器
- Select:下拉选择器(mode: multiple)
- Space:水平间距容器

要素 4:输出格式(Format)

模糊格式

给我一个页面

精确格式

输出格式:
- React 18 + TypeScript
- Tailwind CSS 样式
- 函数式组件,使用 hooks
- 包含完整的类型定义
- 导出默认组件

5.3 实战案例:数据导出功能原型

完整 Prompt 示例

你是资深产品设计师,专精于企业级 SaaS 产品设计。

## 任务
为"用户数据导出功能"设计一个高保真原型页面。

## 设计要求
1. 使用 Ant Design 4.x 组件库
2. 主色调:#1890ff
3. 风格:简洁专业,符合企业级 SaaS 产品
4. 响应式:支持桌面端和平板

## 页面元素
1. 筛选条件区域
   - 日期范围选择器(DatePicker.RangePicker)
   - 用户状态下拉框(Select,多选)
   - 搜索框(Input.Search)
2. 数据表格
   - 列:ID、姓名、邮箱、注册时间、状态
   - 支持分页
   - 支持排序
3. 导出操作区
   - 导出按钮
   - 格式选择(CSV/Excel/PDF 单选)
   - 下载进度指示器

## 技术栈
- React 18 + TypeScript
- Tailwind CSS
- Ant Design 4.x

## 输出
完整的 React 组件代码,包含类型定义和示例数据

预期输出示例

import React, { useState } from 'react';
import { Card, Table, Button, DatePicker, Select, Input, Radio, Progress, Space, Tag } from 'antd';
import type { ColumnsType } from 'antd/es/table';
import { SearchOutlined, DownloadOutlined } from '@ant-design/icons';
import dayjs from 'dayjs';

const { RangePicker } = DatePicker;
const { Option } = Select;
const { Search } = Input;

interface UserData {
  id: number;
  name: string;
  email: string;
  registerDate: string;
  status: 'active' | 'inactive' | 'suspended';
}

// 示例数据
const mockData: UserData[] = [
  { id: 1, name: '张三', email: 'zhangsan@example.com', registerDate: '2024-01-15', status: 'active' },
  { id: 2, name: '李四', email: 'lisi@example.com', registerDate: '2024-02-20', status: 'active' },
  { id: 3, name: '王五', email: 'wangwu@example.com', registerDate: '2024-03-10', status: 'inactive' },
];

const statusMap: Record<string, { color: string; label: string }> = {
  active: { color: 'green', label: '活跃' },
  inactive: { color: 'gray', label: '未激活' },
  suspended: { color: 'red', label: '已冻结' },
};

const ExportPage: React.FC = () => {
  const [dateRange, setDateRange] = useState<[dayjs.Dayjs, dayjs.Dayjs] | null>(null);
  const [selectedStatuses, setSelectedStatuses] = useState<string[]>([]);
  const [searchText, setSearchText] = useState('');
  const [exportFormat, setExportFormat] = useState('excel');
  const [downloading, setDownloading] = useState(false);
  const [progress, setProgress] = useState(0);

  const columns: ColumnsType<UserData> = [
    { title: 'ID', dataIndex: 'id', key: 'id', sorter: (a, b) => a.id - b.id },
    { title: '姓名', dataIndex: 'name', key: 'name' },
    { title: '邮箱', dataIndex: 'email', key: 'email' },
    {
      title: '注册时间',
      dataIndex: 'registerDate',
      key: 'registerDate',
      sorter: (a, b) => a.registerDate.localeCompare(b.registerDate),
    },
    {
      title: '状态',
      dataIndex: 'status',
      key: 'status',
      render: (status: string) => {
        const { color, label } = statusMap[status] || { color: 'default', label: status };
        return <Tag color={color}>{label}</Tag>;
      },
    },
  ];

  const handleExport = () => {
    setDownloading(true);
    setProgress(0);

    // 模拟下载进度
    const timer = setInterval(() => {
      setProgress((prev) => {
        if (prev >= 100) {
          clearInterval(timer);
          setDownloading(false);
          return 100;
        }
        return prev + 10;
      });
    }, 200);
  };

  return (
    <div className="min-h-screen bg-gray-50 p-6">
      <Card title="用户数据导出" className="max-w-7xl mx-auto">
        {/* 筛选条件区域 */}
        <Space wrap className="mb-4" size="middle">
          <RangePicker
            value={dateRange}
            onChange={(dates) => setDateRange(dates as [dayjs.Dayjs, dayjs.Dayjs] | null)}
          />
          <Select
            mode="multiple"
            placeholder="选择状态"
            style={{ width: 200 }}
            value={selectedStatuses}
            onChange={setSelectedStatuses}
          >
            <Option value="active">活跃</Option>
            <Option value="inactive">未激活</Option>
            <Option value="suspended">已冻结</Option>
          </Select>
          <Search
            placeholder="搜索姓名或邮箱"
            allowClear
            enterButton={<SearchOutlined />}
            style={{ width: 300 }}
            value={searchText}
            onChange={(e) => setSearchText(e.target.value)}
          />
        </Space>

        {/* 数据表格 */}
        <Table
          columns={columns}
          dataSource={mockData}
          rowKey="id"
          pagination={{ pageSize: 10, showTotal: (total) => `共 ${total} 条` }}
          bordered
        />

        {/* 导出操作区 */}
        <div className="mt-4 flex items-center justify-between border-t pt-4">
          <Space>
            <Radio.Group value={exportFormat} onChange={(e) => setExportFormat(e.target.value)}>
              <Radio value="csv">CSV</Radio>
              <Radio value="excel">Excel</Radio>
              <Radio value="pdf">PDF</Radio>
            </Radio.Group>
          </Space>

          <Space>
            {downloading && <Progress percent={progress} size="small" style={{ width: 150 }} />}
            <Button
              type="primary"
              icon={<DownloadOutlined />}
              onClick={handleExport}
              loading={downloading}
            >
              导出
            </Button>
          </Space>
        </div>
      </Card>
    </div>
  );
};

export default ExportPage;

5.4 迭代反馈流程

第一轮:生成基础原型

请生成一个数据导出页面原型

第二轮:添加反馈

这个原型整体不错,但需要调整:

1. 筛选区域太紧凑,增加一些间距
2. 导出按钮不够醒目,使用 Primary 按钮并加大尺寸
3. 添加一个"全选"复选框功能
4. 进度条改为弹窗显示,而不是内嵌

第三轮:细化交互

现在添加以下交互:

1. 日期范围选择后自动刷新表格
2. 导出完成后显示成功提示(notification)
3. 导出失败时显示错误提示
4. 添加"取消导出"按钮

5.5 上下文工程技巧总结

技巧 1:分步引导

不要一次性要求完整功能,而是分步骤:

第一步:生成页面布局
第二步:添加筛选组件
第三步:添加数据表格
第四步:添加导出功能
第五步:添加交互逻辑

技巧 2:提供参考

参考 Ant Design 的 ProTable 组件设计:
https://procomponents.ant.design/components/table

技巧 3:约束输出

代码要求:
- 不使用 class 组件,只用函数式组件 + hooks
- 样式使用 Tailwind CSS,不使用 styled-components
- 类型定义完整,不使用 any

技巧 4:迭代而非重写

保持现有设计,只修改:
1. 将蓝色主题改为绿色
2. 按钮从右边移到中间

5.6 产品经理专属 Prompt 模板

你是【角色:资深产品设计师】,擅长【领域:企业级 SaaS 产品设计】。

## 任务背景
【简要描述产品需求和目标用户】

## 设计要求
1. 设计风格:【简洁/活泼/专业/...】
2. 参考产品:【类似产品的截图或链接】
3. 设计系统:【Ant Design / Material Design / ...】

## 页面元素
- 【元素 1】:【描述】
- 【元素 2】:【描述】
- ...

## 交互流程
1. 用户首先...
2. 然后点击...
3. 最后...

## 输出要求
- 技术栈:React + Tailwind CSS
- 包含示例数据
- 包含完整类型定义

5.7 模块 5 小结

关键收获

  • 上下文工程 = 角色 + 约束 + 组件 + 格式

  • 分步引导比一次性生成效果更好

  • 迭代反馈可以精确控制输出

  • 产品经理可以用这套方法生成高保真原型

产品经理工作流程

需求文档 → 上下文工程 Prompt → 高保真原型 → 需求评审 → 开发交接

模块 6:最佳实践与 Q&A(20 分钟)

6.1 推荐 Skill 清单

日常开发高频 Skill

Skill 使用频率 典型场景 命令示例
brainstorming ⭐⭐⭐⭐⭐ 新功能需求分析、架构设计 /superpowers:brainstorming 添加用户反馈功能
writing-plans ⭐⭐⭐⭐⭐ 复杂任务分解 /superpowers:writing-plans
executing-plans ⭐⭐⭐⭐⭐ 自动执行任务清单 /superpowers:executing-plans
requesting-code-review ⭐⭐⭐⭐⭐ 代码提交前审查 /superpowers:requesting-code-review
test ⭐⭐⭐⭐⭐ 生成测试用例 /superpowers:test

按需使用的 Skill

Skill 使用频率 典型场景
frontend-design ⭐⭐⭐⭐ 前端 UI 开发
security-scan ⭐⭐⭐ 安全敏感代码审查
simplify ⭐⭐⭐ 代码重构和优化
refactor ⭐⭐⭐ 大规模代码重构
docs ⭐⭐ 生成文档

Skill 组合使用模式

模式 1:新功能开发

brainstorming → writing-plans → executing-plans → frontend-design → test → code-review

模式 2:Bug 修复

brainstorming(分析原因)→ writing-plans → executing-plans → test

模式 3:代码重构

simplify → refactor → test → code-review

6.2 推荐 MCP 服务器

官方推荐

服务器 用途 安装命令
filesystem 文件操作 npx -y @modelcontextprotocol/server-filesystem /path
git Git 操作 npx -y @modelcontextprotocol/server-git
github GitHub 集成 npx -y @modelcontextprotocol/server-github
postgres PostgreSQL npx -y @modelcontextprotocol/server-postgres
puppeteer 浏览器自动化 npx -y @modelcontextprotocol/server-puppeteer

社区推荐

服务器 用途
brave-search 网页搜索
memory 长期记忆存储
time 时间相关操作
fetch 网页内容抓取

自定义 MCP

参考模块 3,为公司内部系统开发专属 MCP 服务:

  • 数据库查询服务

  • 内部 API 调用服务

  • 业务系统对接服务


6.3 常见问题解答(FAQ)

Q1: AI 生成的代码可靠吗?

A: AI 生成的代码需要审查和测试。建议使用流程:

AI 生成代码 → requesting-code-review → 修复问题 → test → 人工复核 → 提交

最佳实践

  • 永远不要直接提交 AI 生成的代码

  • 使用 requesting-code-review 技能进行审查

  • 确保测试覆盖率

  • 关键代码人工复核


Q2: SDD 流程会不会太慢?

A: 初期可能稍慢(熟悉流程),但熟练后效率更高:

阶段 传统开发 SDD 开发
需求分析 30 分钟(人工) 10 分钟(brainstorming)
任务分解 20 分钟(人工) 5 分钟(writing-plans)
编码 60 分钟(人工) 20 分钟(executing-plans)
代码审查 20 分钟(人工) 5 分钟(requesting-code-review)
测试 30 分钟(人工) 10 分钟(test)
总计 160 分钟 50 分钟

Q3: 如何说服团队采用 AI 编程工具?

A: 用小步快跑的方式证明价值:

  1. 选择试点项目 – 选择一个非核心项目作为试点

  2. 量化收益 – 记录开发时间、代码质量、测试覆盖率等指标

  3. 分享案例 – 在团队内部分享成功案例

  4. 培训赋能 – 组织培训帮助同事上手

  5. 持续优化 – 收集团队反馈,优化使用流程


Q4: Trae 和 Claude Code 应该选哪个?

A: 两者互补,根据场景选择:

场景 推荐工具 理由
深度理解项目 Claude Code 上下文理解能力强
使用技能系统 Claude Code superpowers 生态完善
长时间自主任务 Trae 自主执行能力强
简单代码补全 任意 差异不大

推荐配置:Claude Code(主力)+ Trae(辅助)


Q5: 如何保证 AI 不泄露公司代码?

A: 采取以下安全措施:

  1. 本地部署 – 使用本地模型(如有条件)

  2. 代码脱敏 – 移除敏感信息后再发送

  3. 权限控制 – 限制 AI 访问的文件范围

  4. 审计日志 – 记录所有 AI 交互

  5. 人工复核 – 所有输出必须人工复核


Q6: 技能执行失败怎么办?

A: 按以下顺序排查:

  1. 检查技能是否安装

    /superpowers:list
  2. 检查技能版本

    # 更新技能
    # 根据技能安装方式更新
  3. 查看错误信息

    • 仔细阅读错误提示

    • 常见错误:依赖缺失、配置错误、权限不足

  4. 寻求帮助

    • 查看技能文档

    • 在 GitHub 提 issue

    • 在社区询问


6.4 学习路径与行动计划

第一周:基础入门

  • 安装 Claude Code 并登录
  • 配置 MCP 服务器(filesystem、git)
  • 尝试使用 brainstorming 技能
  • 完成一个小功能(如添加一个 API 端点)

第二周:技能熟悉

  • 熟悉所有高频 Skill
  • 完成 SDD 全流程练习
  • 配置 2-3 个 MCP 服务器
  • 在实际项目中使用一次完整流程

第三周:进阶应用

  • 学习自定义 MCP 服务开发
  • 为团队创建一个实用 MCP 服务
  • 分享使用经验给同事
  • 优化团队开发流程

第四周:融会贯通

  • 总结最佳实践
  • 建立团队使用规范
  • 持续优化工作流
  • 关注社区动态和更新

6.5 资源推荐

官方文档

社区资源

学习视频

  • (待补充)


培训总结

核心内容回顾

  1. 基础概念

    • MCP:标准化的 AI 工具接口

    • Skill:可复用的工作流封装

    • SDD:技能驱动的开发流程

  2. 实战技能

    • 数据导出模块开发(brainstorming → writing-plans → executing-plans → frontend-design → code-review → test)

    • 自定义 MCP 服务开发(协议解析 → 脚手架 → 业务逻辑 → 配置集成)

    • 高保真原型生成(上下文工程四要素)

  3. 最佳实践

    • 高频 Skill 清单

    • 推荐 MCP 服务器

    • 常见问题解答

下一步行动

  1. 个人练习 – 完成学习路径中的四周计划

  2. 团队分享 – 将本次培训内容分享给更多同事

  3. 实战应用 – 在实际项目中应用 SDD 流程

  4. 持续优化 – 总结经验,建立团队规范

附录 A:命令速查表

Claude Code 基础命令

# 安装
npm install -g @anthropic-ai/claude-code

# 登录
claude login

# 启动
claude

# 清除对话
/clear

# 获取帮助
/help

常用 Skill 命令

# 需求分析
/superpowers:brainstorming <需求描述>

# 生成计划
/superpowers:writing-plans

# 执行计划
/superpowers:executing-plans

# 代码审查
/superpowers:requesting-code-review

# 生成测试
/superpowers:test

# 前端设计
/superpowers:frontend-design

MCP 服务器配置

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path"]
    },
    "git": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-git"]
    }
  }
}

附录 B:项目结构示例

Spring Boot 项目结构

spring-boot-demo/
├── src/main/java/com/example/demo/
│   ├── controller/
│   │   ├── BookController.java
│   │   └── ExportController.java (新增)
│   ├── service/
│   │   ├── BookService.java
│   │   └── ExportService.java (新增)
│   ├── repository/
│   │   ├── BookRepository.java
│   │   └── UserRepository.java
│   ├── model/
│   │   ├── Book.java
│   │   └── User.java
│   └── config/
│       └── WebConfig.java
├── src/main/resources/
│   ├── application.properties
│   └── data.sql
├── .claude/
│   └── settings.json
└── pom.xml

MCP 服务项目结构

mcp-db-server/
├── src/
│   └── index.ts
├── dist/
│   └── index.js
├── package.json
├── tsconfig.json
├── .env
└── .claude/
    └── settings.json

附录 C:Troubleshooting

问题 1:技能无法加载

现象:执行 /superpowers:xxx 无响应

解决方案

  1. 检查技能是否已安装

  2. 检查网络连接

  3. 重启 Claude Code

问题 2:MCP 服务器连接失败

现象:Claude 无法调用 MCP 工具

解决方案

  1. 检查 MCP 服务器路径是否正确

  2. 检查环境变量配置

  3. 手动运行 MCP 服务器测试:

    npx -y @modelcontextprotocol/server-filesystem /path

问题 3:AI 生成代码不符合项目规范

现象:生成的代码风格与项目不一致

解决方案

  1. 在 Prompt 中明确说明项目规范

  2. 提供参考文件让 AI 学习

  3. 使用 simplify 技能进行代码审查和优化

THE END
喜欢就支持一下吧
点赞5 分享