代码复杂度分析服务

一款用于计算Java、x86/x64汇编和6502汇编代码的圈复杂度的MCP服务器,提供详细的函数/方法复杂度指标和警告提示。

  • by RainerBlessing
  • Java
  • 本地部署
  • 更新于
在 GitHub 查看 RainerBlessing/cyclomatic-complexity-mcp

使用说明

圈复杂度 MCP 服务器

一个用于计算Java、x86/x64汇编语言和6502汇编语言代码圈复杂度的模型上下文协议(MCP)服务器。

特点/功能

  • Java 分析使用JavaParser进行基于精确AST(抽象语法树)的复杂度计算
  • x86/x64 汇编语言分析支持MASM/NASM/GAS语法
  • 6502 汇编器分析支持ca65、DASM以及通用的6502语法
  • MCP 集成直接与Claude代码合作
  • 详细指标显示每个函数/方法/子程序的复杂性
  • 警告标记复杂度较高的功能(>10)

安装

先决条件

  • Java 17 或更高版本
  • Gradle 8.0 或更高版本(或使用 Gradle 包装器: ./gradlew)

构建

cd cyclomatic-complexity-mcp
./gradlew clean build

这会生成一个可执行的JAR文件: build/libs/cyclomatic-complexity-mcp.jar

或者使用系统安装的 Gradle:

gradle clean build

Claude 代码配置

在你的Claude代码配置中添加以下设置(~/.config/claude/config.json 或者 ~/Library/Application Support/Claude/config.json (在 macOS 上):

{
  "mcpServers": {
    "cyclomatic-complexity": {
      "command": "java",
      "args": [
        "-jar",
        "/absolute/path/to/cyclomatic-complexity-mcp/build/libs/cyclomatic-complexity-mcp.jar"
      ]
    }
  }
}

替换 /absolute/path/to/ 附上项目的实际路径。

使用方法

配置完成后,Claude Code可以自动访问两个工具:

1. analyze_complexity - 分析文件

通过文件路径分析文件:

Analyze the complexity of src/Main.java

2. analyze_complexity_code - 分析代码字符串

直接分析提供的代码:

Analyze the complexity of this Java code:
[Insert code here]

支持的语言

Java

  • 检测:if、else、for、while、do-while、switch/case、catch、三元运算符(?:)
  • 计数:条件中的 &&、|| 运算符
  • 基本复杂度:每种方法1个

汇编器(x86/x64)

  • 检测:所有条件跳转(JE、JNE、JZ、JG、JL 等)
  • 计数:循环指令、条件移动指令(CMOV*)
  • 支持:PROC/ENDP 块和基于标签的函数

6502 汇编器

  • 检测:所有条件分支(BEQ、BNE、BCC、BCS、BPL、BMI、BVC、BVS)
  • 计数器:位分支(BBR0-BBR7,对于65C02为BBS0-BBS7)
  • 支持:
    • ca65 语法(.proc/.endproc 块)
    • DASM 语法(SUBROUTINE 指令)
    • ACME 语法(!zone 指令)
    • 通用标签+RTS模式
  • 文件扩展名:.a65, .s65, .asm65, .a, .asm*(其中*代表任意字符),.s*(其中*代表任意字符)
  • 基本复杂度:每个子程序1个

注: .asm 并且 .s 文件会根据内容分析自动被识别为6502或x86/x64架构。分析器会统计特定于架构的指令和指令,以确定正确的类型。空文件或代码不明确的情况默认为x86架构。

复杂性度量指标

圈复杂度(McCabe)的计算方法如下:

  • 1-10简单,易于维护
  • 11-20中等复杂度,应予以审查 ⚠️
  • 21-50复杂,建议重构
  • 大于50非常复杂,急需重构

示例输出

File: Calculator.java (Java)
Total Functions: 5
Total Complexity: 23
Max Complexity: 8 in calculateTax(double, boolean, int)

Function Complexities:
  calculateTax(double, boolean, int): 8
  processPayment(Payment): 6
  validateInput(String): 4
  add(int, int): 1
  subtract(int, int): 1

发展

项目结构

src/main/java/io/github/complexity/
├── calculator/
│   ├── ComplexityCalculator.java          # Interface
│   ├── ComplexityResult.java              # Result DTO
│   ├── JavaComplexityCalculator.java      # Java implementation
│   ├── AssemblerComplexityCalculator.java # x86/x64 ASM implementation
│   └── Mos6502ComplexityCalculator.java   # 6502 ASM implementation
└── mcp/
    └── McpServer.java                      # MCP Server

运行测试

./gradlew test

记录日志

服务器使用SLF4J与Simple Logger。日志级别可以通过系统属性进行设置:

java -Dorg.slf4j.simpleLogger.defaultLogLevel=debug -jar build/libs/cyclomatic-complexity-mcp.jar

故障排除

服务器无法连接/超时错误

如果Claude Code在连接到MCP服务器时出现超时错误,请检查以下内容:

  1. 验证JAR路径是否为绝对路径配置中的路径必须是绝对路径,而非相对路径

    "args": ["-jar", "/home/user/path/to/cyclomatic-complexity-mcp.jar"]
    
  2. 检查Java版本需要Java 17或更高版本

    java -version
    
  3. 更新后重建在拉取更新后总是要重新构建

    ./gradlew clean build
    
  4. 检查MCP日志克劳德代码将MCP服务器输出日志记录到:

    • Linux: ~/.cache/claude-cli-nodejs/<project>/mcp-logs-cyclomatic-complexity/
    • macOS: ~/Library/Caches/claude-cli-nodejs/<project>/mcp-logs-cyclomatic-complexity/
  5. 手动测试服务器验证服务器是否响应初始化请求

    echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' | java -jar build/libs/cyclomatic-complexity-mcp.jar
    

    应该返回一个包含以下内容的JSON响应: "protocolVersion":"2025-06-18" 在单行上。

服务器已启动,但工具不可用

如果服务器已连接但工具未在Claude代码中显示:

  1. 验证服务器是否响应 tools/list:

    (echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' && echo '{"jsonrpc":"2.0","method":"notifications/initialized"}' && echo '{"jsonrpc":"2.0","id":2,"method":"tools/list"}') | java -jar build/libs/cyclomatic-complexity-mcp.jar
    
  2. 检查响应中是否包含 analyze_complexity 并且 analyze_complexity_code 工具

许可证

麻省理工学院许可证(MIT License)

贡献;做出贡献

欢迎贡献!请提交问题或拉取请求。