6.2 设计题——小周的团队需求
小周的团队决定全面采用 MCP,接下来有三个具体需求等着他设计。用你学到的知识,帮小周设计解决方案。
设计题 1:代码审查 Server
场景:小周的团队需要一个 MCP Server,让 AI 工具能自动审查 Pull Request。
团队每天收到 10+ 个 PR,人工审查跟不上节奏。小周想让 AI 自动完成第一轮审查——检查代码风格、安全风险和测试覆盖。
- 暴露哪些 Tools?每个工具的参数是什么?
- 暴露哪些 Resources?URI 怎么设计?
- 暴露哪些 Prompts?
- 如何处理安全——哪些操作需要用户确认?
- Tool Annotations 怎么设置?
参考答案
Tools:
| 工具 | 功能 | 参数 | Annotations |
|---|---|---|---|
list-prs | 列出待审查的 PR | state: string (open), limit: integer | readOnly: true, idempotent: true |
get-pr | 获取 PR 详情 | number: integer | readOnly: true |
get-diff | 获取 PR 的代码差异 | number: integer | readOnly: true |
add-review-comment | 添加审查评论 | number: integer, body: string, path: string, line: integer | readOnly: false, destructive: false |
approve-pr | 批准 PR | number: integer, body: string | readOnly: 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-comment和approve-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" }
}
}
}← 上一节:概念题 | 目录 | 下一节:综合实战 →