技术债务分析服务器

一个用于分析多种编程语言中技术债务的模型上下文协议(MCP)服务器,支持代码质量、安全漏洞和可维护性问题检测,并与GitHub Copilot等工具集成。

  • by PierreJanineh
  • TypeScript
  • 本地部署
  • 7 星标
  • 更新于
在 GitHub 查看 PierreJanineh/TechDebtMCP

使用说明

Tech Debt MCP Server

16工具 · 2资源 · 14种语言 · 10依赖生态系统

一种模型上下文协议(MCP)服务器,用于分析多种编程语言的技术债务。旨在与GitHub Copilot、Claude、Cursor和其他MCP兼容工具集成。

特性

  • 多语言支持:JavaScript、TypeScript、Python、Java、Swift、Kotlin、Objective-C、C++、C、C#、Go、Rust、Ruby、PHP
  • 综合分析:检测各种类型的技术债务,包括代码质量问题、安全漏洞和可维护性问题
  • SQALE指标:使用SQALE评级系统(A-E等级)计算技术债务
  • SwiftUI分析:对SwiftUI模式、状态管理、内存泄漏、视图嵌套和并发问题进行专门检查
  • 自定义规则:使用正则表达式支持定义自己的基于模式的检查
  • 相关性分析:跨10个生态系统(npm、pip、Maven/Gradle、Cargo、Go模块、Composer、Bundler、NuGet、C/C++、Swift)的解析包清单
  • 内联抑制:通过以下方式抑制误报 // techdebt-ignore-next-line 或屏蔽评论
  • 配置验证:验证 .techdebtrc.json 用于模式正确性的配置文件
  • 可采取行动的建议:为解决技术债务问题提供优先建议
  • 灵活的过滤:按严重性、类别或语言筛选结果
  • 增强安全性(v2.0.2):所有工具和资源路径输入的路径遍历预防、ReDoS安全自定义规则正则表达式验证、SwiftUI检查中的正则表达式注入转义、所有错误消息中的绝对路径净化,以及每次推送/PR时的CodeQL SAST扫描

支持的语言

语言 扩展名 密钥检查
JavaScript .js、.mjs、.cjs、.jsx console.log、调试器、eslint禁用、动态代码执行的使用、var的使用
TypeScript .ts,.tsx,.mts,.cts 任何类型,@ts忽略,非空断言,类型断言
Python .py、.pyw、.pyi bare-except、打印语句、全局使用、动态代码执行
Java .Java System.out、printStackTrace、空catch、@SuppressWarnings
Swift .Swift 强制打开包装(!),强制铸造(as!),强迫尝试,保留循环, SwiftUI模式
Kotlin .kt,.kts !!,lateinit滥用,@抑制,未经检查的强制转换
Objective-C .m、.mm、.h NSLog、保留周期、弃用方法、海量视图控制器
C++ .cpp、.cc、.hpp、.h 原始指针、C风格转换、goto,使用命名空间std
C .C,.h malloc没有自由、goto、不安全函数、空检查
C# .cs 控制台。WriteLine、异步void、空catch、处置模式
Go .Go 忽略错误、空白导入、fmt。打印、恐慌、全局变量
Rust .rs 解包、期望、不安全、允许属性、panic、println
Ruby .rb puts、binding.pry、rubocop禁用、动态代码执行、全局变量
PHP .PHP var_dump、print_r、die/exit、动态代码执行、错误抑制

安装

一键安装

VS Code (通过终端):

code --add-mcp '{"name":"tech-debt-mcp","command":"npx","args":["-y","tech-debt-mcp@latest"]}'

一键安装

光标 (通过终端):

cursor --add-mcp '{"name":"tech-debt-mcp","command":"npx -y tech-debt-mcp@latest"}'

克劳德代码 (通过终端):

claude mcp add tech-debt-mcp -- npx -y tech-debt-mcp@latest

克劳德桌面版 --添加到您的 claude_desktop_config.json:

{
  "mcpServers": {
    "tech-debt-mcp": {
      "command": "npx",
      "args": ["-y", "tech-debt-mcp@latest"]
    }
  }
}

Claude代码插件 --添加此repo的市场,然后安装插件:

/plugin marketplace add PierreJanineh/TechDebtMCP
/plugin install tech-debt-mcp@techdebtmcp

插件运行 npx -y tech-debt-mcp@latest 幕后——没有源代码捆绑,始终跟踪已发布的npm版本。看 plugin/README.md 用于面向插件用户的文档(安装流程、示例转录、安全态势)。

Claude桌面MCPB捆绑包 --捆绑式单击安装 node_modules (没有 npx,运行时不需要互联网)。

下载 tech-debt-mcp-<version>.mcpb 从 GitHub最新版本 并使用适用于macOS或Windows的Claude打开它。

要在本地构建捆绑包,请执行以下操作:

npm install --include=dev --ignore-scripts
npm run mcpb:pack
# -> mcpb/tech-debt-mcp-<version>.mcpb

添加到您的Windsurf MCP配置(~/.codeium/windsurf/mcp_config.json):

{
  "mcpServers": {
    "tech-debt-mcp": {
      "command": "npx",
      "args": ["-y", "tech-debt-mcp@latest"]
    }
  }
}

经由 AI助手 --打开 设置>工具>AI助手>模型上下文协议(MCP),单击 +,选择 JSON格式,然后粘贴:

{
  "mcpServers": {
    "tech-debt-mcp": {
      "command": "npx",
      "args": ["-y", "tech-debt-mcp@latest"]
    }
  }
}

经由 Xcode的GitHub副本 --打开“设置”>“MCP”选项卡>“编辑配置”(mcp.json):

{
  "servers": {
    "tech-debt-mcp": {
      "command": "npx",
      "args": ["-y", "tech-debt-mcp@latest"]
    }
  }
}

手动设置

添加到MCP客户端配置中:

{
  "mcpServers": {
    "tech-debt-mcp": {
      "command": "npx",
      "args": ["-y", "tech-debt-mcp@latest"]
    }
  }
}

发展: npm run dev

工具

每个工具都声明 工具注释 — Read 工具没有副作用(readOnlyHint: true); Write 工具更改服务器会话状态(destructiveHint: true).

类别 工具 类型 描述
分析 analyze_project 阅读 分析整个项目——按语言、类别、严重性、最大文件数过滤
analyze_file 读取 分析单个文件
get_debt_summary 阅读 健康评分和问题计数的快速摘要
get_sqale_metrics 阅读 SQALE评级、补救时间、债务比率、细分
过滤 get_recommendations 阅读 优先修复建议(可配置限制)
get_issues_by_severity 阅读 按严重程度筛选的问题
get_issues_by_category 阅读 按债务类别筛选的问题
list_supported_languages 阅读 所有语言及其检查
自定义规则 add_custom_rule 编写 添加基于正则表达式的技术债务规则
remove_custom_rule 写入 按ID删除自定义规则
list_session_custom_rules 阅读 列出通过添加的规则 add_custom_rule 本次会议(不包括 .techdebtrc.json customPatterns)
execute_custom_rules 读取 对代码或文件运行自定义规则
validate_custom_pattern 阅读 添加模式前测试它
依赖项 check_dependencies 阅读 扫描10个生态系统中的包清单
get_vulnerability_report 阅读 CVE审查的离线依赖清单
validate_config 读取 验证 .techdebtrc.json 模式

贯穿始终的债务类别: dependency · code-quality · architecture · documentation · testing · security · performance · maintainability

Analysis — parameter reference
工具 参数 类型 必填 约束/默认 说明
analyze_project path string ✓ 绝对文件系统路径 项目根目录
languages string[] 筛选到特定语言
categories string[] 见上面的类别 按债务类别筛选
severity 枚举 low / medium / high / critical 最低严重级别
maxFiles integer min:1 分析文件的上限
analyze_file path string ✓ 绝对文件系统路径 要分析的文件
get_debt_summary path string ✓ 绝对文件系统路径 项目根目录
get_sqale_metrics path string ✓ 绝对文件系统路径 项目根目录
developmentTime number 小时数 债务比率计算的估计开发时间

get_sqale_metrics 返回SQALE评级(a-E),包括星级可视化、总补救时间、债务比率以及按严重程度和类别划分的细分。

Filtering — parameter reference
工具 参数 类型 必填 约束/默认 说明
get_recommendations path string ✓ 绝对文件系统路径 项目根目录
limit integer 默认值:5,最小值:1 要返回的最大建议值
get_issues_by_severity path string ✓ 绝对文件系统路径 项目根目录
severity 枚举 ✓ low / medium / high / critical 按严重性进行筛选
get_issues_by_category path string ✓ 绝对文件系统路径 项目根目录
category 枚举 ✓ 请参阅上面的类别 要筛选的债务类别
list_supported_languages -- -- -- 无参数
Custom Rules — parameter reference
工具 参数 类型 必填 约束/默认 说明
add_custom_rule id string ✓ 唯一规则标识符
pattern string ✓ 最多1000个字符 要匹配的正则表达式模式
message string ✓ 问题标题/消息
severity 枚举 ✓ low / medium / high / critical 严重性级别
category 枚举 ✓ 见上面的类别 债务类别
suggestion string 如何解决此问题
languages string[] 仅限于特定语言
flags string 允许: d g i m s u v y; u / v 互斥 正则表达式标志
remove_custom_rule id string ✓ 要删除的规则ID
list_session_custom_rules -- -- -- 无参数。重命名自 list_custom_rules (TEC-51)明确范围:仅限会话注册规则。
execute_custom_rules path string ◐ 绝对路径,最大500000字节 要分析的文件
code string ◐ 1-500,000个字符 直接分析的源代码
language string 必须是受支持的语言ID(与 list_supported_languages) 按语言筛选规则
validate_custom_pattern id string ✓ 唯一规则标识符
pattern string ✓ 最多1000个字符 要验证的正则表达式
message string ✓ 问题标题/消息
severity 枚举 ✓ low / medium / high / critical 严重性级别
category 枚举 ✓ 见上面的类别 债务类别

◐ execute_custom_rules 需要 要么 path 或 code,两者都不需要。空字符串 "" 为了 path 被视为省略该字段。

Dependencies — parameter reference
工具 参数 类型 必填 约束/默认 说明
check_dependencies path string ✓ 绝对文件系统路径 项目根目录
includeDev boolean 默认值: true 包括开发/测试依赖关系
get_vulnerability_report path string ✓ 绝对文件系统路径 项目根目录
includeDev boolean 默认值: false 包括开发依赖关系
validate_config path string ✓ 绝对文件系统路径 项目根目录 或 直接路径 .techdebtrc.json

check_dependencies 检测npm、pip、Maven/Gradle、Cargo、Go模块、Composer、Bundler、NuGet、C/C++(CMakeLists.txt、connfile.txt/py、vcpkg.json)和Swift包管理器的清单。 get_vulnerability_report 生成离线依赖关系清单——请参见 ROADMAP.md 用于计划的在线CVE查找。

资源

两个MCP资源以JSON格式公开只读技术债务数据。两者都使用 RFC 6570 URI寺庙:the {+projectPath} 语法是 预留扩展,这允许变量包含 / 没有百分比编码的绝对文件系统路径的字符。

URI模板 描述
debt://summary/{+projectPath} 健康评分、债务评分、问题计数和SQALE指标
debt://issues/{+projectPath} 所有科技债务问题的可过滤列表;支持 severity, category,以及 limit 查询参数

具体实例 --替代品 {+projectPath} 一条绝对的路径。注意双斜线:模板的尾部 / 再加上道路的引导 / 生产 //,这是有效的URI语法。

debt://summary//Users/you/projects/myapp
debt://issues//Users/you/projects/myapp
debt://issues//Users/you/projects/myapp?severity=high&limit=50
debt://issues//Users/you/projects/myapp?category=security

交互式测试 --使用工具和资源的最简单方法是 MCP检查员:

npm run build
npx @modelcontextprotocol/inspector node dist/index.js

打开它打印的URL,切换到 资源 选项卡,并使用您的绝对项目路径读取模板URI。

配置

创建 .techdebtrc.json 项目根目录中的文件:

{
  "include": ["src/**", "lib/**"],
  "ignore": ["vendor/**", "generated/**"],
  "rules": {
    "maxFileLines": 500,
    "maxFunctionLines": 50,
    "maxComplexity": 10,
    "maxNestingDepth": 4
  },
  "severity": {
    "todo-comment": "low",
    "console-log": "medium"
  },
  "ruleExclusions": {
    "debugger": ["**/src/analyzers/**"],
    "ts-ignore": ["**/src/analyzers/**"]
  },
  "customPatterns": [
    {
      "id": "no-console-log",
      "pattern": "console\\.log",
      "severity": "low",
      "category": "code-quality",
      "message": "Remove console.log() statements",
      "suggestion": "Use proper logging library instead",
      "languages": ["javascript", "typescript"]
    }
  ]
}

语言覆盖

使用以下命令按语言覆盖规则、严重性或文件扩展名 languageOverrides.密钥必须有效 支持的语言 标识符。

{
  "languageOverrides": {
    "typescript": {
      "rules": {
        "maxFileLines": 800,
        "maxFunctionLines": 80
      },
      "severity": {
        "todo-comment": "high"
      }
    },
    "python": {
      "extensions": [".pyx"],
      "rules": {
        "maxComplexity": 15
      }
    }
  }
}
  • rules --每种语言的阈值(覆盖顶层 rules 用于匹配文件)。
  • severity --每种语言规则的严重性覆盖。
  • extensions --附加文件扩展名(超出默认值)以归属于此语言。

规则排除

使用 ruleExclusions 以抑制与glob模式匹配的文件的特定规则。图案使用正斜杠(/)在所有平台上。使用 **/ 前缀模式(例如。, **/src/analyzers/**)无论路径格式如何,都能可靠匹配。

内联抑制

直接在源代码中抑制特定问题。两者 // 和 # 所有语言都支持注释前缀。

单行 --抑制下一行:

// techdebt-ignore-next-line debugger
debugger; // only the 'debugger' rule is suppressed
# techdebt-ignore-next-line print-statement
print("debug output")  # will not be reported

块 --抑制开始和结束之间的所有行:

// techdebt-ignore-start ts-ignore
issues.push(...this.checkPattern(filePath, content, /@ts-ignore/g, { ... }));
// techdebt-ignore-end ts-ignore

如果没有规则名称,所有规则都将被抑制。块可以嵌套。压制性评论必须出现在自己的行中。

自定义规则示例

范围说明: customPatterns 定义于 .techdebtrc.json 仅适用于 analyze_project,在扫描之前加载项目配置。 analyze_file 直接调用语言分析器,无需加载 .techdebtrc.json,因此配置定义的模式不会应用于该路径。使用 add_custom_rule 运行时(或调用 execute_custom_rules 直接)对单个文件运行自定义模式。

在中定义模式 .techdebtrc.json 在...之下 customPatterns,或在运行时通过 add_custom_rule MCP工具:

{
  "customPatterns": [
    {
      "id": "no-magic-numbers",
      "pattern": "=\\s*\\d{3,}",
      "severity": "medium",
      "category": "maintainability",
      "message": "Magic number detected",
      "suggestion": "Extract to named constant"
    },
    {
      "id": "forbidden-library",
      "pattern": "import.*moment.*from",
      "severity": "medium",
      "category": "dependency",
      "message": "moment.js is deprecated",
      "suggestion": "Use native Date or date-fns instead",
      "languages": ["javascript", "typescript"]
    }
  ]
}

SQALE指标

MCP使用的技术债务 SQALE 量化技术债务的方法:

评级 债务比率 质量
A. ≤5% 优秀
B 6-10% 良好
C 11-20% 一般
D 21-50% 差
E >50% 严重

时间映射的努力: 琐碎(≤5m)·小(5-30m)·中(30m-2h)·大(2-4h)·大的(4h+)

SwiftUI分析

SwiftUI应用程序的14项专门检查,涵盖 状态管理 (过度@状态、@观察对象误用、环境值安全), 内存与生命周期 (结合保留周期、计时器清理、任务取消、关闭保留周期), 演出 (缺少.id()修饰符、昂贵的体计算、深度嵌套、GeometricReader误用),以及 最佳实践 (AnyView类型擦除,已弃用NavigationLink,主线程安全)。

View all SwiftUI checks with examples

状态管理问题

  • @状态变量过多 -检测应使用ViewModel的>5@State变量的视图
  • @观察到的对象滥用 -初始化时标记@ObservedObject(应使用@StateObject)
  • 环境价值安全 -检测@Environment值的强制展开

内存和生命周期

  • 合并循环引用 -在Combine水槽中发现缺失的[弱自我]
  • 缺少计时器清理 -在onDisappear中检测计时器而不进行清理
  • 缺少任务取消 -标记异步任务,不进行取消处理
  • 在封闭状态下保持循环 -在onChange/onReceive中检测没有[weak self]的自我捕获

性能和视图层次结构

  • 缺少.id()修饰符 -检测没有稳定标识符的ForEach
  • 昂贵的视图体计算 -视图体中的标记减少/排序/过滤
  • 深度视图嵌套 -嵌套深度超过6级时发出警告
  • GeometricReader误用 -在视图根检测GeometricReader

SwiftUI最佳实践

  • AnyView类型擦除 -建议改用泛型或@ViewBuilder
  • 已弃用的导航链接 -标记旧式NavigationLink模式
  • 主线安全 -确保UI更新发生在主线程上

检测到的问题示例

// Excessive @State - should use ViewModel
struct UserView: View {
  @State private var firstName = ""
  @State private var lastName = ""
  @State private var email = ""
  @State private var phone = ""
  @State private var address = ""
  @State private var city = ""  // 6+ @State variables!
}

// @ObservedObject with initialization
struct ContentView: View {
  @ObservedObject var viewModel = UserViewModel()  // Should be @StateObject!
}

// Missing Timer cleanup
struct TimerView: View {
  var body: some View {
    Text("Hello")
      .onAppear {
        Timer.scheduledTimer(...)  // Missing .onDisappear cleanup!
      }
  }
}

// Retain cycle in Combine
publisher
  .sink { value in
    self.updateUI(value)  // Missing [weak self]!
  }

输出示例

# Tech Debt Analysis Report

## Health Score: 72/100

### Issues by Severity
| Severity | Count |
|----------|-------|
| Critical | 2 |
| High | 15 |
| Medium | 45 |
| Low | 120 |

## Top Recommendations

1. **Address Critical Issues Immediately**
   Fix 2 critical security issues.

2. **Clean Up TODO/FIXME Comments**
   Found 45 TODO comments - consider creating tracked issues.

代码质量

Tech Debt MCP实践了它所宣扬的——用人工智能辅助的氛围编码构建,通过定期扫描自己来保持A级。内部重构(例如,嵌套减少 customRulesEngine.validatePattern 通过提取的助手--#146)由自扫描结果驱动。

自我扫描结果(v2.0.22026年4月)

  • SQALE评级: A(优秀)
  • 债务评分: 5/100(目标:≤5/100)
  • 问题总数: 13(0临界,0高,6中等,7低)
  • 补救时间: 14小时
  • 健康评分: 95/100

在v2.0.2安全强化后,v2.0.1基线中的118个问题/42.4个健康状况有所下降, ruleExclusions 配置、嵌套重构(#113、#118、#131、#146)和自定义规则处理程序提取(#145)。剩余债务:5个嵌套热点(4个服务器/核心模块+1个 eslint.config.mjs),在系统边界使用7种类型断言,1种非空断言。看 TECH_DEBT_SCAN.md 关于每期的详细信息。

发展

npm install --include=dev --ignore-scripts  # Install dependencies (incl. devDependencies)
npm run typecheck  # Type-check without emitting output
npm run lint       # Lint source files
npm run build      # Compile TypeScript
npm run dev        # Run with ts-node
npm run watch      # Watch mode
npm test           # Run tests

文档

隐私

Tech Debt MCP完全在您的机器上运行。安装后,它会读取您传递给它的文件,通过本地stdio传输将问题返回给MCP客户端,而不做其他任何事情——服务器本身不进行出站网络调用,没有遥测,没有分析,也不使用第三方服务。通过以下方式安装 npm/npx 按照标准的包管理器行为联系npm注册表;MCPB捆绑包预先安装,不需要进一步的网络接入。看 PRIVACY.md 或托管策略 https://pierrejanineh.github.io/TechDebtMCP/privacy 了解详情。

贡献

欢迎投稿!请参阅 贡献.md 指南和 代码_OF_CONDUCT.md 我们的社区标准。

发布

  • 最新的:
  • 发布: GitHub 发布
  • 路线图: 看 ROADMAP.md 对于计划中的功能
  • 安全: escapeRegExp() (src/utils/regexUtils.ts)在将捕获的字符串插值到 new RegExp() --见第128期;处理程序输出使用 basename() / getRelativePath() 为了防止故意消息和原始消息中的绝对文件系统路径泄漏 err.message 文件系统操作中的字符串在返回给客户端之前会被净化——请参阅问题#129

许可证

麻省理工学院