Skip to content

6.2 设计题——小周的团队需求

小周的团队决定全面采用 MCP,接下来有三个具体需求等着他设计。用你学到的知识,帮小周设计解决方案。


设计题 1:代码审查 Server

场景:小周的团队需要一个 MCP Server,让 AI 工具能自动审查 Pull Request。

团队每天收到 10+ 个 PR,人工审查跟不上节奏。小周想让 AI 自动完成第一轮审查——检查代码风格、安全风险和测试覆盖。
  • 暴露哪些 Tools?每个工具的参数是什么?
  • 暴露哪些 Resources?URI 怎么设计?
  • 暴露哪些 Prompts?
  • 如何处理安全——哪些操作需要用户确认?
  • Tool Annotations 怎么设置?
参考答案

Tools

工具功能参数Annotations
list-prs列出待审查的 PRstate: string (open), limit: integerreadOnly: true, idempotent: true
get-pr获取 PR 详情number: integerreadOnly: true
get-diff获取 PR 的代码差异number: integerreadOnly: true
add-review-comment添加审查评论number: integer, body: string, path: string, line: integerreadOnly: false, destructive: false
approve-pr批准 PRnumber: integer, body: stringreadOnly: false, destructive: false

Resources

  • pr://list → 待审查 PR 列表概览
  • pr://{number}/summary → PR 摘要信息
  • pr://{number}/diff → 代码差异

Prompts

  • review-checklist → 基于团队规范的审查清单(参数:language, focus_areas)
  • security-review → 安全审查模板(参数:severity_threshold)

安全

  • add-review-commentapprove-pr 应通过 Elicitation 请求用户确认
  • 使用 OAuth 2.1 授权访问 GitHub
  • 不暴露关闭 PR、合并 PR 等高风险操作

设计题 2:数据库查询 Server

场景:老板要求小周做一个 MCP Server,让 AI 能查询生产数据库。生产数据库!

老板说"让 AI 直接查数据库",但 DBA 听了差点从椅子上摔下来。小周需要在便利性和安全性之间找到平衡——只读、白名单、审计日志一样都不能少。
  • 如何确保安全?只读?SQL 注入防护?
  • Schema 怎么设计才能既灵活又安全?
  • 哪些操作绝对不能暴露?
  • 如何处理查询结果过大的情况?
参考答案

安全原则

  • 只读连接:使用只读数据库用户,永远不暴露写操作
  • SQL 白名单:只允许 SELECT,禁止 INSERT/UPDATE/DELETE/DROP
  • 查询超时:设置最大执行时间(如 30 秒)
  • 结果行数限制:默认限制返回 100 行

Tools

工具功能参数
list-tables列出所有表schema: string (可选)
describe-table描述表结构table: string
query执行只读查询sql: string, limit: integer (默认100, 最大1000)

query 工具的安全措施

  • 只允许 SELECT 语句(正则检查)
  • 限制查询时间(30 秒超时)
  • 限制返回行数(默认 100,最大 1000)
  • 审计所有查询日志
  • 通过 Elicitation 请求用户确认每次查询

绝对不能暴露

  • INSERT/UPDATE/DELETE
  • DROP/ALTER/TRUNCATE
  • 存储过程调用
  • 系统表访问(pg_catalog 等)

设计题 3:多 Server 协作

场景:小周的项目需要三个 MCP Server:文件系统、GitHub、数据库。设计它们的协作方式。

团队有三类工具需求:读写文件、操作 GitHub、查询数据库。如果都塞进一个 Server 会变成 God Server(反模式 1),所以小周决定拆成三个独立 Server。
  • 三个 Server 各自的职责边界?
  • 如果一个工具需要同时访问文件和数据库(如导出报表),怎么处理?
  • 配置文件怎么写?
参考答案

职责边界

  • filesystem-server:只负责项目目录内的文件读写
  • github-server:只负责 GitHub API 交互
  • database-server:只负责数据库查询

跨 Server 操作

  • 不直接让 Server 之间通信(MCP 架构不支持)
  • 由 Client(或 Host 中的 AI)编排跨 Server 的工作流
  • 例如导出报表:AI 先调用 database-server 的 query 工具获取数据,再调用 filesystem-server 的 write-file 工具保存文件

配置

json
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/home/project"]
    },
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxx" }
    },
    "database": {
      "command": "python",
      "args": ["db_server.py"],
      "env": { "DB_URL": "postgresql://readonly:xxx@localhost/mydb" }
    }
  }
}

← 上一节:概念题 | 目录 | 下一节:综合实战 →