Agent-almanac analyze-codebase-for-mcp
git clone https://github.com/pjt222/agent-almanac
T=$(mktemp -d) && git clone --depth=1 https://github.com/pjt222/agent-almanac "$T" && mkdir -p ~/.claude/skills && cp -r "$T/i18n/zh-CN/skills/analyze-codebase-for-mcp" ~/.claude/skills/pjt222-agent-almanac-analyze-codebase-for-mcp-0d7f32 && rm -rf "$T"
i18n/zh-CN/skills/analyze-codebase-for-mcp/SKILL.md分析代码库以用于 MCP
扫描代码库以发现适合作为 MCP 工具暴露的函数、REST 端点、CLI 命令和数据访问模式,然后生成结构化的工具规格文档。
适用场景
- 为现有项目规划 MCP 服务器,需要了解应暴露哪些内容
- 在将代码库包装为 AI 可访问工具界面前进行审计
- 比较代码库的功能与已通过 MCP 暴露的内容
- 生成工具规格文档以交接给
scaffold-mcp-server - 评估第三方库是否值得包装为 MCP 工具
输入
- 必需:代码库根目录路径
- 必需:代码库的目标语言(例如 TypeScript、Python、R、Go)
- 可选:用于对比的现有 MCP 服务器代码(差距分析)
- 可选:领域焦点(例如"数据分析"、"文件操作"、"API 集成")
- 可选:推荐的最大工具数量(默认:20)
步骤
第 1 步:扫描代码库结构
1.1. 使用
Glob 映射目录树,重点关注源目录:
源文件src/**/*.{ts,js,py,R,go,rs}
、**/routes/**
、**/api/**
端点定义**/controllers/**
、**/cli/**
CLI 入口点**/commands/**
、**/package.json
、**/setup.py
依赖元数据**/DESCRIPTION
1.2. 按角色分类文件:
- 入口点:主文件、路由处理程序、CLI 命令
- 核心逻辑:业务逻辑函数、算法、数据转换器
- 数据访问:数据库查询、文件 I/O、API 客户端
- 工具函数:辅助函数、格式化器、验证器
1.3. 统计总文件数、代码行数和导出符号以评估项目规模。
预期结果: 带有角色注释的分类文件清单。
失败处理: 如果代码库太大(>10,000 个文件),使用领域焦点输入将扫描范围缩小到特定目录或模块。如果未找到源文件,验证根路径和语言参数。
第 2 步:识别暴露的函数和端点
2.1. 使用
Grep 查找导出函数和公共 API:
- TypeScript/JavaScript:
、export (async )?function
、export defaultmodule.exports - Python:不以
开头的函数、_
、@app.route@router - R:NAMESPACE 中列出的函数或
roxygen 标签#' @export - Go:大写字母开头的函数名(按约定导出)
2.2. 对每个候选函数,提取:
- 名称:函数或端点名称
- 签名:带类型和默认值的参数
- 返回类型:函数的输出
- 文档:docstring、JSDoc、roxygen、godoc
- 位置:文件路径和行号
2.3. 对于 REST API,额外提取:
- HTTP 方法和路由模式
- 请求体模式
- 响应结构
- 认证要求
2.4. 构建按潜在效用排序的候选列表(公开的、有文档的、类型完整的函数优先)。
预期结果: 包含 20-100 个候选函数/端点及其提取元数据的列表。
失败处理: 如果找到的候选项很少,扩大搜索范围以包含可以公开的内部函数。如果文档稀少,在输出中标记为风险。
第 3 步:评估 MCP 适用性
3.1. 对每个候选项,按 MCP 工具标准评估:
- 输入契约清晰度:参数是否有良好的类型和文档?能否用 JSON Schema 描述?
- 输出可预测性:函数是否返回结构化数据(JSON 可序列化)?返回结构是否一致?
- 副作用:函数是否修改状态(文件、数据库、外部服务)?副作用必须明确标注。
- 幂等性:操作是否可以安全重试?非幂等工具需要显式警告。
- 执行时间:是否能在合理超时内完成(< 30 秒)?长时间运行的操作需要异步模式。
- 错误处理:是否抛出结构化错误还是静默失败?
3.2. 对每个候选项按 1-5 分评分:
- 5:纯函数,有类型的 I/O,有文档,快速,无副作用
- 4:类型完整,有文档,轻微副作用(例如日志记录)
- 3:合理的 I/O 契约但需要包装(例如返回原始对象)
- 2:显著副作用或不清晰的契约,需要大幅适配
- 1:不适合,需要重大重构
3.3. 筛选评分 3 及以上的候选项。将评分 2 的项标记为"未来候选",需要重构。
预期结果: 评分和筛选后的候选列表,每个都附有适用性理由。
失败处理: 如果大多数候选项评分低于 3,代码库可能需要在 MCP 暴露前进行重构。记录差距并推荐具体改进(添加类型、提取纯函数、包装副作用)。
第 4 步:设计工具规格
4.1. 对每个选定的候选项(评分 >= 3),起草工具规格:
- name: tool_name description: > One-line description of what the tool does. source_function: module.function_name source_file: src/path/to/file.ts:42 parameters: param_name: type: string | number | boolean | object | array description: What this parameter controls required: true | false default: value_if_optional returns: type: string | object | array description: What the tool returns side_effects: - description of any side effect estimated_latency: fast | medium | slow suitability_score: 5
4.2. 将工具按逻辑类别分组(例如"数据查询"、"文件操作"、"分析"、"配置")。
4.3. 识别工具之间的依赖关系(例如"list_datasets"应在"query_dataset"之前调用)。
4.4. 确定是否需要包装器以:
- 将复杂参数对象简化为扁平输入
- 将原始返回值转换为结构化文本或 JSON
- 添加安全保护(例如数据库函数的只读包装器)
预期结果: 完整的 YAML 工具规格,包含类别、依赖关系和包装器说明。
失败处理: 如果工具规格模糊,回到第 2 步从源代码提取更多细节。如果无法推断参数类型,标记需要人工审核。
第 5 步:生成工具规格文档
5.1. 编写包含以下部分的最终规格文档:
- 摘要:代码库概述、语言、规模和分析日期
- 推荐工具:第 4 步的完整规格,按类别分组
- 未来候选:评分 2 的项及重构建议
- 排除项:评分 1 的项及排除理由
- 依赖关系:工具依赖图
- 实施说明:包装器需求、认证需求、传输建议
5.2. 保存为
mcp-tool-spec.yml(机器可读)和可选的 mcp-tool-spec.md(人类可读摘要)。
5.3. 如果提供了现有 MCP 服务器,包含差距分析部分:
- 规格中存在但尚未实现的工具
- 已实现但不在规格中的工具(可能过时)
- 规格漂移的工具(实现偏离规格)
预期结果: 完整的工具规格文档,可供
scaffold-mcp-server 使用。
失败处理: 如果文档超出合理规模(>200 个工具),分成带有交叉引用的模块。如果代码库没有合适的候选项,生成"就绪评估"文档并附带重构建议。
验证清单
- 目标代码库中所有源文件已被扫描
- 候选函数已提取名称、签名和返回类型
- 每个候选项有带书面理由的适用性评分
- 工具规格包含带类型的完整参数模式
- 每个工具的副作用已明确记录
- 输出文档是有效的 YAML(任何 YAML 库可解析)
- 工具名称遵循 MCP 约定(snake_case、描述性、唯一)
- 类别和依赖关系形成连贯的工具界面
- 提供现有 MCP 服务器时包含差距分析
- 未来候选部分列出评分 2 项所需的重构步骤
常见问题
- 暴露过多工具:AI 助手在 10-30 个聚焦工具时表现最佳。优先考虑能力广度而非深度。抵制暴露每个公共函数的冲动
- 忽视副作用:一个"只读"但也写入日志或缓存的函数仍然有副作用。使用
仔细审计文件写入、网络调用和数据库变更Grep - 假设类型安全:动态语言(Python、R、JavaScript)可能有没有类型注解的函数。从使用模式和测试中推断类型,但在规格中标记不确定性
- 遗漏认证上下文:在已认证 Web 请求中工作的函数在没有会话上下文的 MCP 调用中可能失败。检查隐式认证依赖,如会话 cookie、JWT 令牌或环境注入的凭证
- 过度工程化包装器:如果函数需要 50 行包装器才能兼容 MCP,它可能不是好的候选项。优先选择自然映射到工具接口的函数
- 忽视错误路径:MCP 工具必须返回结构化错误。抛出无类型异常的函数需要错误处理包装器
- 混淆内部和外部 API:被其他内部代码调用的内部辅助函数是较差的 MCP 候选项。聚焦于为外部使用设计的函数或清晰的边界 API
- 跳过差距分析:如果提供了现有 MCP 服务器,始终将规格与当前实现进行比较。没有差距分析,你可能重复工作或遗漏过时工具
相关技能
— 使用输出规格生成可用的 MCP 服务器scaffold-mcp-server
— 手动服务器实现参考build-custom-mcp-server
— 将生成的服务器连接到 Claude Code/Desktopconfigure-mcp-server
— 部署服务器后调试连接troubleshoot-mcp-connection
— 工具界面设计的架构审查review-software-architecture
— 在外部暴露函数前进行安全审计security-audit-codebase