圈复杂度 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 buildClaude 代码配置
在你的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.java2. 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服务器时出现超时错误,请检查以下内容:
- 验证JAR路径是否为绝对路径配置中的路径必须是绝对路径,而非相对路径
"args": ["-jar", "/home/user/path/to/cyclomatic-complexity-mcp.jar"]- 检查Java版本需要Java 17或更高版本
java -version- 更新后重建在拉取更新后总是要重新构建
./gradlew clean build- 检查MCP日志克劳德代码将MCP服务器输出日志记录到:
- Linux: ~/.cache/claude-cli-nodejs/ /mcp-logs-cyclomatic-complexity/ - macOS: ~/Library/Caches/claude-cli-nodejs/ /mcp-logs-cyclomatic-complexity/
- 手动测试服务器验证服务器是否响应初始化请求
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代码中显示:
- 验证服务器是否响应
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- 检查响应中是否包含
analyze_complexity并且analyze_complexity_code工具
许可证
麻省理工学院许可证(MIT License)
贡献;做出贡献
欢迎贡献!请提交问题或拉取请求。
