UNPKG

lint-mcp

Version:

Intelligent Go code linting MCP server with smart change detection and multi-project support

615 lines (495 loc) 21 kB
# MCP 代码检查服务 (lint-mcp) 一个智能的 Go 代码质量保障服务,通过 MCP (Model Context Protocol) 协议提供双重检查能力:传统的代码质量检查(基于 golangci-lint)和智能的运行时风险检测。专注于开发过程中的全面代码质量保障,自动检测分支开发范围,避免历史代码问题干扰,并提供结构化的风险数据用于 AI 辅助代码审查。 ## 📦 安装 ### 系统要求 - **Go 1.20+** (运行时环境) - **golangci-lint v2.4.0+** (必须安装且在 PATH 中可用,推荐 v2.4.0) - **Node.js 14.0+** (用于 npm 包管理) - **Git** (用于智能变更检测) ### 通过 npm 安装(推荐) ```bash # 直接使用 npx(无需安装,自动使用最新版本) npx lint-mcp # 或全局安装 npm install -g lint-mcp # 或本地安装 npm install lint-mcp ``` ### 从源码编译 ```bash git clone <repository-url> cd lint-mcp # 安装依赖并构建 npm run build # 或直接使用 Go 编译 go build -o bin/lint-mcp main.go ``` ### 验证安装 ```bash # 检查 lint-mcp 是否正常工作 npx lint-mcp --help 2>/dev/null || echo "lint-mcp 运行正常" # 检查依赖是否满足 golangci-lint --version go version # 检查已安装版本 npm view lint-mcp version ``` ### 更新到最新版本 ```bash # npx 自动使用最新版本(推荐) npx lint-mcp@latest # 更新全局安装 npm update -g lint-mcp # 检查最新版本和更新日志 npm view lint-mcp ``` ## 🔧 MCP 客户端配置 ### Cursor IDE 配置 在 Cursor 的设置中添加 MCP 服务器配置: ```json { "mcpServers": { "lint-mcp": { "command": "npx", "args": [ "-y", "lint-mcp@latest" ] } } } ``` 如果已全局安装,也可以直接使用: ```json { "mcpServers": { "lint-mcp": { "command": "lint-mcp", "args": [] } } } ``` ### 其他 MCP 客户端 对于支持 MCP 的其他客户端,配置 stdio 传输: ```json { "name": "lint-mcp", "command": "npx", "args": ["lint-mcp"], "transport": "stdio" } ``` ## 🌟 特性 ### 1. 智能变更检测 - **多策略自动检测**: 未推送提交 → 分支分叉点 → 工作区变更 → 扩展范围 → 最近提交 - **分支开发感知**: 自动识别特性分支的完整开发范围,涵盖多次提交 - **避免历史负担**: 专注当前开发内容,无需处理历史遗留问题 - **工作目录智能**: 自动从当前工作目录检测项目和变更范围 ### 2. 智能依赖模式支持 - **自动模式检测**: 通过分析 `.gitignore` 智能判断项目使用的依赖模式 - **Vendor 模式**: 当 `.gitignore` 未完整忽略 `vendor/` 目录时自动启用 - **Modules 模式**: 当检测到完整 `vendor/` 目录忽略时自动切换 - **手动覆盖**: 支持通过 `vendorMode` 参数手动指定模式 - **性能优化**: Vendor 模式避免网络依赖,检查速度更快 ### 3. 双工具架构 - **代码质量检查** (`code_lint`): - 基于 golangci-lint 的传统代码检查 - 自动变更检测:智能识别分支开发范围 - 精确包级检查:避免跨文件引用误报 - 多项目支持:自动处理涉及多个项目的变更 - 多策略检测:未推送提交 → 分支分叉点 → 工作区变更 - **智能风险检测** (`code_review`): - 专注于运行时风险和安全问题检测 - 17种 Go 资源模式识别(事务、锁、文件、panic等) - 结构化风险数据输出,配合 Cursor Rule 使用 - 智能上下文扩展,提供完整资源生命周期 - 零 token 浪费,专注数据而非提示词生成 ### 4. 自动项目处理 - 智能识别变更文件所属的项目根目录 - 自动按项目分组处理多项目变更 - 统一合并多项目的检查结果 - 无需手动指定项目路径或配置 ## 🛠 技术实现 ### 核心架构 1. **MCP 服务层** - 基于 **go-mcp v0.2.14** 实现标准的 MCP 协议 - 使用 stdio 传输协议进行客户端通信 - 支持结构化的工具注册和调用机制 - panic 安全机制,所有错误以 JSON 格式返回 2. **智能检测引擎** - **Git 变更检测**: 多策略自动检测(未推送提交→分支分叉点→工作区变更→备用策略) - **项目根目录查找**: 自动查找 `go.mod` 文件定位项目边界 - **依赖模式识别**: 通过 `.gitignore` 分析自动判断 vendor/modules 模式 - **多项目支持**: 自动分组处理跨项目变更 3. **代码检查引擎** - 集成 **golangci-lint** (兼容 v1.52.2+ 和 v2.4.0+,推荐 v2.4.0) - JSON 输出解析,支持复杂输出格式提取 - 多重策略检查:绝对路径→相对路径→包路径 - 智能错误恢复和降级处理 4. **跨平台分发** - **Node.js 包装器**: 通过 npm 分发和管理 - **Go 二进制**: 实际服务实现,编译为平台特定二进制 - **自动进程管理**: 信号处理和子进程生命周期管理 ### 高级特性 - **零配置启动**: 自动检测所有必要参数和环境 - **渐进式检查**: 从具体文件到包级别的多层检查策略 - **异常恢复**: 完善的备用策略和错误降级处理 - **详细日志**: 全程跟踪检测过程和决策逻辑 ## 📝 使用说明 ### 安装要求 1. 安装 golangci-lint v2.4.0(推荐): ```bash # 方法1 - 使用 Homebrew(macOS,推荐) brew install golangci-lint # 确认版本 golangci-lint version # 方法2 - 使用 Go install go install github.com/golangci/golangci-lint/cmd/golangci-lint@v2.4.0 # 方法3 - 使用安装脚本 curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.4.0 ``` 2. 确保 golangci-lint 在 PATH 中且版本兼容: ```bash golangci-lint version # 应显示 golangci-lint has version 2.4.0 或更高版本 ``` **重要提示**:本工具需要 golangci-lint v2.4.0+ 或 v1.52.2+。如果您的系统中有多个版本,请确保 PATH 中的版本是兼容的。可以通过 `which golangci-lint` 检查当前使用的版本路径。 ### API 说明 #### 1. 智能代码检查 (code_lint) 基于 golangci-lint 的传统代码质量检查: ```json { "files": ["/absolute/path/to/file1.go"], // 可选,用于确定检查起点 "projectPath": "/absolute/path/to/project" // 可选,项目根目录(优先级高于files) } ``` **参数说明**: - `projectPath`: 项目根目录绝对路径(推荐),优先级最高 - `files`: 项目内任一文件的绝对路径,用于推断项目根目录 **重要变更**: - ✅ **默认智能检测**:工具现在默认只检查变更的代码,无需 `checkOnlyChanges` 参数 - ✅ **自动依赖模式**:通过分析 `.gitignore` 自动检测依赖模式,无需 `vendorMode` 参数 - ✅ **版本兼容**:自动检测 golangci-lint 版本并使用兼容的参数 #### 2. 智能风险检测 (code_review) 专注于运行时风险和安全问题的智能检测: ```json { "projectPath": "/absolute/path/to/project", // 可选,项目根目录 "reviewFocus": ["concurrency", "transaction", "resource", "panic_safety"] // 可选,关注领域 } ``` **参数说明**- `projectPath`: 项目根目录绝对路径(可选,优先作为检测起点) - `reviewFocus`: 关注点列表,可选值: - `concurrency`: 并发安全(锁、goroutine、竞态条件) - `transaction`: 事务管理(数据库事务、连接泄漏) - `resource`: 资源管理(文件、网络连接、内存) - `panic_safety`: Panic安全(数组越界、空指针、类型断言) - `performance`: 性能问题(内存分配、循环效率) **核心特性**- 🎯 **零配置检测**:自动识别变更代码和资源作用域 - 🧠 **智能上下文扩展**:变更在资源作用域内时,提供完整上下文 - 📊 **结构化输出**:返回风险点数据而非提示词,配合 Cursor Rule 使用 -**高效 Token 使用**:相比传统方案减少 60-80% token 消耗 **智能检测策略**(按优先级): - **策略1**:检测未推送的提交(本地领先远程分支的提交) - **策略2**:检测分支分叉点(当前分支与 main/master 分支的分叉点) - **策略3**:检测工作区变更(暂存区 + 未暂存 + 未跟踪的 .go 文件) - **策略4**:扩大到最近几次提交(HEAD~2 到 HEAD~5 的范围) - **备用策略**:最近一次提交(HEAD~1)或目录扫描 ### 返回结果 #### code_lint 返回格式 ```json { "Issues": [ { "FromLinter": "linter名称", "Text": "问题描述", "Severity": "严重程度", "Pos": { "Filename": "文件名", "Line": 行号, "Column": 列号 } } ] } ``` #### code_review 返回格式 ```json { "summary": { "totalChangedFiles": 1, "totalRiskPoints": 3, "riskLevel": "high", "riskByCategory": {"transaction": 2, "panic_safety": 1}, "riskBySeverity": {"high": 1, "medium": 2}, "processingTime": "150ms" }, "changedFiles": [ { "file": "/path/to/file.go", "changedLines": [ {"lineNumber": 325, "type": "added", "content": "tx, err := db.Begin()"} ], "riskPoints": [ { "id": "transaction_start_325_1", "type": "transaction_start", "category": "transaction", "line": 325, "severity": "high", "description": "事务开启,需确保正确关闭", "context": "tx, err := db.Begin()", "suggestion": "添加defer tx.Rollback()或在成功时调用tx.Commit()" } ], "riskLevel": "high" } ], "processingTime": "150ms" } ``` ## 🔍 最佳实践 ### 工具选择指南 #### 使用 code_lint 当您需要: - 传统的代码质量检查(语法、格式、最佳实践) - 基于 golangci-lint 的全面静态分析 - CI/CD 流水线中的代码质量门禁 - 团队代码规范统一检查 #### 使用 code_review 当您需要: - 运行时风险和安全问题检测 - 资源泄漏和并发安全分析 - 配合 AI 进行智能代码审查 - 专注于业务逻辑中的潜在风险 ### 最佳实践建议 1. **增量检查模式** - 默认使用增量检查模式(`checkOnlyChanges: true` - 只关注当前变更的代码质量 - 适合持续集成和日常开发 2. **双工具协作** - 使用 `code_lint` 进行基础代码质量检查 - 使用 `code_review` 进行深度风险分析 - 结合 Cursor Rule 实现智能代码审查 3. **依赖模式自动检测** - **自动判断**:通过分析项目 `.gitignore` 文件自动选择最佳模式 - **Vendor 模式**:当 `.gitignore` 不包含完整 `vendor/` 目录忽略时使用 - 使用 `--modules-download-mode=vendor` 参数 - 适合企业项目和离线环境 - **Modules 模式**:当检测到 `.gitignore` 包含 `vendor/` 完整目录忽略时使用 - 适合纯 Go modules 项目 - 需要网络连接下载依赖 4. **全量检查时机** - 新项目初始化时 - 重要版本发布前 - 代码质量专项治理时 5. **智能检测使用场景** - **开发分支**:自动检测整个特性开发的所有变更 - **多次提交**:无需手动指定范围,自动涵盖所有相关提交 - **多项目变更**:自动处理涉及多个项目的变更 - **工作区开发**:检测当前未提交的代码变更 ## 🤝 集成方式 ### Cursor IDE - 自动识别并使用 MCP 服务 - 无需额外配置 - 实时代码质量反馈 #### 配合 Cursor Rule 使用 code_review 为了充分发挥 `code_review` 工具的智能风险检测能力,建议配合 Cursor Rule 使用: 1. **创建 Cursor Rule**:参考 `CURSOR_RULE_EXAMPLE.md` 文件 2. **配置规则**:根据项目需求调整风险响应策略 3. **智能交互**:Rule 接收风险数据,生成针对性的提示词 4. **高效审查**:AI 基于结构化数据进行精准分析 **优势**- 🎯 **精准分析**:基于具体风险点而非通用提示词 -**高效交互**:减少 60-80% token 消耗 - 🔧 **可定制性**:不同项目可配置不同的审查策略 - 📊 **数据驱动**:基于风险统计进行决策 ### CI/CD - 支持命令行调用 - 可配置检查策略 - 支持自定义输出格式 ## 📈 后续规划 1. **配置增强** - 支持自定义 golangci-lint 配置 - 允许项目级别的规则定制 - 引入配置模板机制 2. **报告优化** - 支持更多输出格式 - 添加统计和趋势分析 - 提供可视化报告 3. **性能提升** - 引入缓存机制 - 优化多项目并行检查 - 支持增量缓存 ## 🤔 常见问题 1. **为什么默认只检查变更?** - 避免老项目历史问题困扰 - 关注当前代码质量改进 - 提供渐进式改进路径 2. **依赖模式是如何自动检测的?** - 分析项目 `.gitignore` 文件中的 vendor 目录配置 -`.gitignore` 包含完整 `vendor/` 目录忽略时 → Modules 模式 -`.gitignore` 不包含完整目录忽略时 → Vendor 模式(默认) - 检测失败时默认使用 Vendor 模式以保证稳定性 3. **如何手动切换依赖模式?** - 依赖模式现在自动检测,无需手动设置 - 如需强制使用特定模式,可修改项目 `.gitignore` 文件: - 添加 `vendor/` 行启用 Modules 模式 - 移除 `vendor/` 行启用 Vendor 模式 4. **遇到依赖问题怎么办?** - **自动 Vendor 模式**:执行 `go mod vendor` 确保 vendor 目录完整 - **自动 Modules 模式**:执行 `go mod tidy``go mod download` - 检查 Go 代理设置:`go env GOPROXY` - 确保项目在正确的 Go 模块内(存在 `go.mod` 文件) 5. **如何处理误报?** - 使用包级检查减少跨文件误报 - 在代码中使用 `//nolint` 注释 - 适当调整检查范围 6. **性能问题?** - 优先使用增量检查(`checkOnlyChanges: true` - 使用 `projectPath` 参数避免项目推断开销 - Vendor 模式比 Modules 模式检查更快 - 避免不必要的全量检查 7. **"缺少项目起点"错误?** - 提供 `projectPath`(推荐)或 `files` 参数 - 确保路径是绝对路径 - 检查项目目录是否存在且包含 Go 代码 - 示例:`{"projectPath": "/Users/you/path/to/project"}` 8. **多重检查策略是什么?** - 文件级检查:逐个文件进行精确检查 - 包级检查:按 Go 包进行检查(`checkOnlyChanges: false` 时) - 备用扫描:当 Git 检测失败时扫描整个项目 - 每种策略都有3重备用方案确保检查成功 ## 📋 技术规格 ### 运行时要求 - **Go 1.20+** (基于 go.mod 中的版本要求) - **golangci-lint v2.4.0+** (推荐 v2.4.0,需要在 PATH 中可用) - **Git** (用于智能变更检测) ### 开发依赖 - **go-mcp v0.2.14** (MCP 协议实现) - **Node.js 14.0+** (npm 包分发) ### 工具调用格式 #### 推荐用法:指定项目路径 ```json { "name": "code_lint", "arguments": { "projectPath": "/Users/username/project" } } ``` #### 备用用法:通过文件推断项目 ```json { "name": "code_lint", "arguments": { "files": ["/Users/username/project/main.go"] } } ``` #### 最简调用(需要在项目目录下) ```json { "name": "code_lint", "arguments": {} } ``` ### 参数说明 - `projectPath` (可选,推荐): 项目根目录的绝对路径,优先级最高。推荐使用此参数以获得最佳性能 - `files` (可选): 项目内任一文件的绝对路径列表,用于推断项目根目录。当 `projectPath` 未指定时使用 **重要变更**-**默认智能检测**:工具现在默认只检查变更的代码,移除了 `checkOnlyChanges` 参数 -**自动依赖模式**:移除了 `vendorMode` 参数,现在通过分析项目 `.gitignore` 文件自动检测依赖模式 -**版本兼容**:自动检测 golangci-lint 版本并使用兼容的输出参数 ### 重要提示 为了确保MCP服务能正确找到和检查文件,请在使用时提供文件的绝对路径,例如: - ✅ 推荐:`/Users/username/project/main.go` - ❌ 不推荐:`main.go``./main.go` 这是因为MCP服务运行在独立的进程中,其工作目录可能与用户当前项目目录不同。 ### 最佳实践 1. **优先使用 projectPath**:明确指定项目根目录路径获得最佳性能和准确性 2. **启用智能检测**:使用默认的 `checkOnlyChanges=true` 专注于变更代码 3. **零配置体验**:大多数情况下仅需指定 `projectPath`,其他参数自动检测 4. **多项目协作**:变更涉及多个项目时,工具自动按项目分组并合并结果 5. **渐进式检查**:利用多重策略确保即使在复杂 Git 状态下也能正常工作 ## 📈 版本信息 ### 当前版本:v1.2.0 **核心特性**- ✅ 智能 Git 变更检测(5种策略) - ✅ 自动依赖模式识别(.gitignore 分析) - ✅ 多项目自动分组处理 - ✅ 渐进式检查策略(3重备用) - ✅ 零配置智能启动 - ✅ 完善的错误恢复机制 - 🚀 **优化的分支检测**:智能单分支比对,性能提升60-80% - 🎯 **版本兼容性**:自动检测并支持 golangci-lint v1.52.2+ 和 v2.4.0+ - 📝 **简化API**:移除冗余参数,默认智能检测 - 🆕 **双工具架构**`code_lint` + `code_review` 提供全面的代码质量保障 - 🧠 **智能风险检测**:17种 Go 资源模式识别,专注运行时风险 -**Token 优化**:结构化数据输出,减少 60-80% AI token 消耗 ### 更新日志 #### v1.2.0 (当前版本) - 🆕 **双工具架构**:新增 `code_review` 工具,专注运行时风险检测 - 17种 Go 资源模式识别(事务、锁、文件、panic等) - 智能上下文扩展,提供完整资源生命周期 - 结构化风险数据输出,配合 Cursor Rule 使用 -**Token 优化**:重构输出格式,减少 60-80% AI token 消耗 - 移除冗余的提示词生成,专注数据输出 - 智能风险点分类和严重程度评估 - 支持按分类和严重程度的风险统计 - 🎯 **架构优化**:分离关注点,提高可维护性 - `code_lint`:专注传统代码质量检查 - `code_review`:专注运行时风险和安全问题 - 支持独立使用或协同工作 #### v1.1.0 - 🎯 **版本兼容性**:自动检测 golangci-lint 版本并使用兼容参数 - 支持 v2.4.0+ 使用 `--output.json.path stdout` - 支持 v1.52.2+ 使用 `--out-format json` - 自动路径检测,优先使用 PATH 中的版本 - 📝 **API 简化**:移除冗余参数,提升用户体验 - 移除 `checkOnlyChanges` 参数,默认启用智能检测 - 移除 `vendorMode` 参数,自动检测依赖模式 - 🔧 **错误处理**:增强版本不兼容时的错误提示和解决方案 - 🚀 **性能优化**:动态参数选择,避免版本冲突导致的性能问题 #### v1.0.2 - 🚀 **性能优化**:重构分支检测逻辑,减少60-80%的Git命令调用 - 🎯 **精准检测**:只与项目实际主分支比对,避免无效尝试 - 📝 **日志优化**:更清晰的检测过程日志,减少噪音信息 - 🔧 **代码质量**:新增分支验证函数,提高代码可维护性 #### v1.0.1 - 🐛 **Bug修复**:修复某些项目分支检测失败的问题 - 📚 **文档更新**:完善安装和使用说明 #### v1.0.0 - 🎉 **首次发布**:完整的 MCP 代码检查服务 -**智能检测**:多策略 Git 变更自动检测 - 🔧 **自动配置**:依赖模式自动识别,零配置启动 - 🚀 **高性能**:包级精确检查,避免全量扫描 - 📦 **跨平台**:支持 macOS、Linux、Windows - 🛡️ **稳定性**:完善的错误处理和备用策略 ### 技术债务和限制 1. **平台二进制**:当前每个平台需要单独编译二进制文件 2. **golangci-lint 依赖**:用户需要预先安装兼容版本的 golangci-lint (v1.52.2+ 或 v2.4.0+) 3. **Git 依赖**:智能检测功能依赖 Git 仓库环境 4. **版本检测开销**:首次启动时需要检测 golangci-lint 版本兼容性 ### 故障排除 #### golangci-lint 版本问题 如果遇到 `unknown flag``unsupported version` 错误: 1. **检查版本**```bash golangci-lint version which golangci-lint ``` 2. **清理旧版本**```bash # 检查是否有多个版本 ls -la $GOPATH/bin/golangci-lint ls -la /opt/homebrew/bin/golangci-lint # 删除 GOPATH 中的旧版本(如果存在) rm $GOPATH/bin/golangci-lint ``` 3. **安装兼容版本**```bash # 推荐使用 Homebrew(会自动安装最新兼容版本) brew install golangci-lint ```