# mcp-gitlab **Repository Path**: qhgiteecode/mcp-gitlab ## Basic Information - **Project Name**: mcp-gitlab - **Description**: gitlab 相关 api 接口封装 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-14 - **Last Updated**: 2026-03-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MCP GitLab GitLab MCP Server — 让 AI 工具直接管理你的 GitLab 仓库。 基于 [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) 协议,将 GitLab 的项目管理、Merge Request、分支管理、代码评审、CI/CD Pipeline、仓库浏览、邮件发送等操作暴露为 MCP 工具,支持 Kiro、Claude Desktop、Cursor、Warp 等 AI 客户端。 --- ## 目录 - [特性](#特性) - [快速开始](#快速开始) - [安装](#安装) - [环境变量配置](#环境变量配置) - [MCP 客户端配置](#mcp-客户端配置) - [项目结构](#项目结构) - [工具总览](#工具总览) - [工具详细说明](#工具详细说明) - [项目管理工具](#1-项目管理工具) - [Merge Request 工具](#2-merge-request-工具) - [分支管理工具](#3-分支管理工具) - [代码评审工具](#4-代码评审工具) - [Pipeline / CI 工具](#5-pipeline--ci-工具) - [仓库浏览工具](#6-仓库浏览工具) - [邮件工具](#7-邮件工具) - [代码评审完整流程](#代码评审完整流程) - [架构设计](#架构设计) - [请求处理流程](#请求处理流程) - [缓存机制](#缓存机制) - [重试机制](#重试机制) - [使用示例](#使用示例) - [开发指南](#开发指南) - [开发命令](#开发命令) - [添加新工具](#添加新工具) - [代码规范](#代码规范) - [License](#license) --- ## 特性 - 🔀 **全面的 MR 管理** — 列出、查看、创建、合并 MR,添加评论,查看评论列表 - 🌿 **分支管理** — 列出、创建、删除分支,支持搜索过滤 - 🔍 **智能代码评审** — 自动推断基础分支,生成结构化 diff,内置多语言评审规范(Java/Vue/JSP/JS/CSS/HTML) - 🚀 **CI/CD 管控** — 查看 Pipeline 状态、Job 详情与日志,重试/取消 Pipeline - 📁 **仓库浏览** — 浏览目录结构,获取任意分支上的文件内容 - 📧 **邮件集成** — 评审报告 Markdown → HTML 自动转换,一键发送 - 🛡️ **健壮性** — 30 秒请求超时、最多 3 次自动重试(指数退避)、Zod 参数校验 - 🚀 **性能优化** — 内置 TTL 缓存 + 并发请求去重,减少重复 API 调用 --- ## 快速开始 ### 安装 ```bash # 克隆项目 git clone cd mcp-gitlab # 安装依赖 npm install # 编译 npm run build ``` 要求 Node.js >= 18.0.0。 ### 环境变量配置 复制 `.env.example` 为 `.env` 并填写: ```bash # 必填 GITLAB_URL=https://gitlab.example.com # GitLab 地址(末尾不加 /) GITLAB_TOKEN=your-private-token # GitLab Private Token # 可选(邮件功能) SMTP_HOST=smtp.qq.com # SMTP 服务器(默认 smtp.qq.com) SMTP_PORT=465 # SMTP 端口(465=SSL, 587=STARTTLS) SMTP_SECURE=true # 是否 SSL(默认根据端口自动判断) SMTP_USER=your-email@qq.com # 发件邮箱 SMTP_PASSWORD=your-smtp-auth-code # 邮箱授权码(非登录密码) SMTP_SENDER_NAME=Code Review # 发件人显示名 EMAIL_RECIPIENT=team@example.com # 默认收件人 ``` Token 获取方式:登录 GitLab → **User Settings** → **Access Tokens** → 创建 Personal Access Token,权限建议选择 `api`(完整 API 访问),或最小权限 `read_api` + `read_repository`。 ### MCP 客户端配置 #### Kiro 配置 在项目根目录 `.kiro/settings/mcp.json` 或全局 `~/.kiro/settings/mcp.json` 中添加: ```json { "mcpServers": { "gitlab": { "command": "node", "args": ["C:/path/to/mcp-gitlab/dist/index.js"], "env": { "GITLAB_URL": "https://gitlab.example.com", "GITLAB_TOKEN": "your-token" }, "disabled": false, "autoApprove": [] } } } ``` #### Claude Desktop 配置 编辑 `~/Library/Application Support/Claude/claude_desktop_config.json`(macOS)或 `%APPDATA%\Claude\claude_desktop_config.json`(Windows): ```json { "mcpServers": { "gitlab": { "command": "node", "args": ["/path/to/mcp-gitlab/dist/index.js"], "env": { "GITLAB_URL": "https://gitlab.example.com", "GITLAB_TOKEN": "your-token" } } } } ``` #### Cursor 配置 编辑 `~/.cursor/mcp.json`: ```json { "mcpServers": { "gitlab": { "command": "node", "args": ["/path/to/mcp-gitlab/dist/index.js"], "env": { "GITLAB_URL": "https://gitlab.example.com", "GITLAB_TOKEN": "your-token" } } } } ``` #### Warp 配置 编辑 `~/.warp/mcp.json`: ```json { "mcpServers": { "gitlab": { "command": "node", "args": ["/path/to/mcp-gitlab/dist/index.js"], "env": { "GITLAB_URL": "https://gitlab.example.com", "GITLAB_TOKEN": "your-token" } } } } ``` > 将 `/path/to/mcp-gitlab` 替换为你的实际项目路径。 --- ## 项目结构 ``` mcp-gitlab/ ├── src/ │ ├── index.ts # MCP 服务入口 — 创建 Server、注册工具、启动 stdio 传输 │ ├── config.ts # 配置加载 — 从环境变量读取 GitLab + 邮件配置 │ ├── types.ts # 类型定义 — GitLab API 实体接口(Project, MR, Branch, Pipeline 等) │ ├── gitlab-client.ts # API 客户端 — HTTP 请求封装,含超时/重试/缓存 │ ├── cache.ts # 缓存模块 — TTL 缓存 + 带 Key 的缓存 + 并发去重 │ ├── tools/ │ │ ├── index.ts # 工具注册中心 — 聚合所有工具,统一分发 │ │ ├── projects.ts # 项目工具 — 1 个工具(项目列表) │ │ ├── merge-requests.ts # MR 工具 — 6 个工具(列出/查看/创建/合并/评论) │ │ ├── branches.ts # 分支工具 — 3 个工具(列出/创建/删除) │ │ ├── review.ts # 评审工具 — 2 个工具(基础分支查找/代码评审) │ │ ├── pipelines.ts # CI 工具 — 5 个工具(Pipeline 列表/详情/重试/取消/Job 日志) │ │ ├── repository.ts # 仓库工具 — 2 个工具(目录浏览/文件内容) │ │ └── email.ts # 邮件工具 — 2 个工具(发送邮件/测试连接) │ └── utils/ │ ├── formatter.ts # 输出格式化 — 项目列表/评审报告/diff 格式化 │ ├── validator.ts # 输入校验 — 所有工具的 Zod Schema 定义 │ └── email.ts # 邮件发送 — nodemailer + Markdown → HTML 转换 ├── dist/ # 编译输出目录 ├── package.json ├── tsconfig.json ├── .env.example # 环境变量模板 └── AGENT.md # AI 编码助手指引 ``` --- ## 工具总览 共 **21 个工具**,分为 7 大类: | 分类 | 工具数 | 代码位置 | |------|--------|----------| | 项目管理 | 1 | `src/tools/projects.ts` | | Merge Request | 6 | `src/tools/merge-requests.ts` | | 分支管理 | 3 | `src/tools/branches.ts` | | 代码评审 | 2 | `src/tools/review.ts` | | Pipeline / CI | 5 | `src/tools/pipelines.ts` | | 仓库浏览 | 2 | `src/tools/repository.ts` | | 邮件 | 2 | `src/tools/email.ts` | > 工具校验 Schema 统一定义在 `src/utils/validator.ts`,输出格式化在 `src/utils/formatter.ts`。 --- ## 工具详细说明 ### 1. 项目管理工具 代码位置:`src/tools/projects.ts` #### `list_projects` — 列出可访问的 GitLab 仓库 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `search` | string | 否 | 搜索关键词(按项目名称匹配) | | `membership` | boolean | 否 | 只显示当前用户是成员的项目(默认 true) | | `owned` | boolean | 否 | 只显示当前用户拥有的项目 | | `archived` | boolean | 否 | 是否包含已归档项目(默认 false) | | `visibility` | string | 否 | 按可见性过滤:`private`、`internal`、`public` | | `order_by` | string | 否 | 排序字段:`id`、`name`、`path`、`created_at`、`updated_at`、`last_activity_at` | | `sort` | string | 否 | 排序方向:`asc`、`desc` | | `limit` | number | 否 | 返回数量限制(默认 50,最大 100) | - 校验 Schema:`ListProjectsSchema` - 输出内容:项目名称、仓库地址(SSH)、Web 访问地址、Git Clone 命令(自动移除 :24 端口) --- ### 2. Merge Request 工具 代码位置:`src/tools/merge-requests.ts` #### `list_merge_requests` — 列出项目的 MR | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `project` | string\|number | **是** | 项目 ID 或完整路径(如 `group/project`) | | `state` | string | 否 | 状态过滤:`opened`(默认)、`closed`、`merged`、`all` | | `scope` | string | 否 | 范围过滤:`created_by_me`、`assigned_to_me`、`all` | | `author_username` | string | 否 | 按作者用户名过滤 | | `source_branch` | string | 否 | 按源分支过滤 | | `target_branch` | string | 否 | 按目标分支过滤 | | `search` | string | 否 | 搜索 MR 标题或描述 | | `order_by` | string | 否 | 排序字段:`created_at`、`updated_at` | | `sort` | string | 否 | 排序方向:`asc`、`desc` | | `per_page` | number | 否 | 每页数量(默认 20,最大 100) | | `page` | number | 否 | 页码(默认 1) | - 校验 Schema:`ListMergeRequestsSchema` #### `get_merge_request` — 获取 MR 详情 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `project` | string\|number | **是** | 项目 ID 或完整路径 | | `mr_iid` | number | **是** | MR 的 IID(项目内编号,如 !42 中的 42) | - 校验 Schema:`GetMergeRequestSchema` - 返回内容:状态、分支信息、作者、指派人、审阅者、标签、合并状态、冲突检测、变更文件数、评论数、描述 #### `create_merge_request` — 创建 MR | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `project` | string\|number | **是** | 项目 ID 或完整路径 | | `source_branch` | string | **是** | 源分支(你的开发分支) | | `target_branch` | string | **是** | 目标分支(要合并到的分支) | | `title` | string | **是** | MR 标题 | | `description` | string | 否 | MR 描述(支持 Markdown) | | `squash` | boolean | 否 | 合并时是否 squash commits(默认 false) | | `remove_source_branch` | boolean | 否 | 合并后是否删除源分支(默认 false) | | `labels` | string | 否 | 标签,逗号分隔 | - 校验 Schema:`CreateMergeRequestSchema` #### `merge_merge_request` — 合并 MR | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `project` | string\|number | **是** | 项目 ID 或完整路径 | | `mr_iid` | number | **是** | MR 的 IID | | `squash` | boolean | 否 | 是否 squash commits(默认 false) | | `should_remove_source_branch` | boolean | 否 | 合并后是否删除源分支(默认 false) | | `merge_commit_message` | string | 否 | 自定义合并 commit message | | `squash_commit_message` | string | 否 | 自定义 squash commit message | - 校验 Schema:`MergeMergeRequestSchema` #### `add_mr_comment` — 在 MR 上添加评论 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `project` | string\|number | **是** | 项目 ID 或完整路径 | | `mr_iid` | number | **是** | MR 的 IID | | `body` | string | **是** | 评论内容(支持 Markdown) | - 校验 Schema:`AddMrCommentSchema` #### `list_mr_notes` — 获取 MR 评论列表 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `project` | string\|number | **是** | 项目 ID 或完整路径 | | `mr_iid` | number | **是** | MR 的 IID | | `per_page` | number | 否 | 每页数量(默认 20,最大 100) | | `page` | number | 否 | 页码(默认 1) | | `sort` | string | 否 | 排序方向:`asc`、`desc`(默认 desc) | - 校验 Schema:`ListMrNotesSchema` - 自动过滤系统消息,只显示用户评论 --- ### 3. 分支管理工具 代码位置:`src/tools/branches.ts` #### `list_branches` — 列出项目分支 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `project` | string\|number | **是** | 项目 ID 或完整路径(如 `group/project`) | | `search` | string | 否 | 搜索关键词(按分支名匹配) | | `per_page` | number | 否 | 每页数量(默认 20,最大 100) | | `page` | number | 否 | 页码(默认 1) | - 校验 Schema:`ListBranchesSchema` - 输出内容:分支名、保护状态、合并状态、最新提交信息 #### `create_branch` — 创建新分支 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `project` | string\|number | **是** | 项目 ID 或完整路径 | | `branch` | string | **是** | 新分支名称 | | `ref` | string | **是** | 基于哪个分支/tag/commit SHA 创建 | - 校验 Schema:`CreateBranchSchema` #### `delete_branch` — 删除分支 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `project` | string\|number | **是** | 项目 ID 或完整路径 | | `branch` | string | **是** | 要删除的分支名称 | - 校验 Schema:`DeleteBranchSchema` - ⚠️ 受保护分支无法删除 --- ### 4. 代码评审工具 代码位置:`src/tools/review.ts` #### `get_target_branch` — 获取基础分支参考信息 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `project` | string\|number | **是** | 项目 ID 或完整路径 | | `source_branch` | string | **是** | 当前开发分支(要评审的分支) | - 校验 Schema:`GetTargetBranchSchema` - 自动查找已开启的 MR 目标分支,或使用项目默认分支作为参考 - 输出四步 git 验证流程,帮助 AI 在本地准确确认基础分支 #### `code_review` — 代码评审 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `project` | string\|number | **是** | 项目 ID 或完整路径 | | `source_branch` | string | **是** | 当前开发分支(要评审的分支) | | `target_branch` | string | 否 | 基础分支(对比基准),不传则自动推断 | | `straight` | boolean | 否 | 是否使用 straight compare(默认 false,使用 merge-base 对比) | - 校验 Schema:`CodeReviewSchema` - 自动推断目标分支:优先使用该分支已开启 MR 的目标分支,否则使用项目默认分支 - 生成 GitLab Compare 链接(可分享给团队成员) - 输出结构化 diff 内容 + 内置评审规范(Java/Vue/JSP/JS/CSS/HTML 检查点) --- ### 5. Pipeline / CI 工具 代码位置:`src/tools/pipelines.ts` #### `list_pipelines` — 列出项目 Pipeline | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `project` | string\|number | **是** | 项目 ID 或完整路径 | | `ref` | string | 否 | 按分支/tag 过滤 | | `status` | string | 否 | 按状态过滤:`running`、`pending`、`success`、`failed`、`canceled`、`skipped`、`manual` | | `per_page` | number | 否 | 每页数量(默认 20,最大 100) | | `page` | number | 否 | 页码(默认 1) | - 校验 Schema:`ListPipelinesSchema` #### `get_pipeline` — 获取 Pipeline 详情 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `project` | string\|number | **是** | 项目 ID 或完整路径 | | `pipeline_id` | number | **是** | Pipeline ID | - 校验 Schema:`GetPipelineSchema` - 返回内容:Pipeline 状态、分支、触发者、耗时、排队耗时,以及所有 Job 列表(按 stage 分组) #### `retry_pipeline` — 重试失败的 Pipeline | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `project` | string\|number | **是** | 项目 ID 或完整路径 | | `pipeline_id` | number | **是** | Pipeline ID | - 校验 Schema:`RetryPipelineSchema` #### `cancel_pipeline` — 取消运行中的 Pipeline | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `project` | string\|number | **是** | 项目 ID 或完整路径 | | `pipeline_id` | number | **是** | Pipeline ID | - 校验 Schema:`CancelPipelineSchema` #### `get_job_log` — 获取 Job 运行日志 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `project` | string\|number | **是** | 项目 ID 或完整路径 | | `job_id` | number | **是** | Job ID(可通过 `get_pipeline` 获取) | | `tail` | number | 否 | 返回最后 N 行日志(默认 200,范围 10-2000) | - 校验 Schema:`GetJobLogSchema` - 用于排查构建/测试失败原因 --- ### 6. 仓库浏览工具 代码位置:`src/tools/repository.ts` #### `list_repository_tree` — 浏览仓库目录结构 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `project` | string\|number | **是** | 项目 ID 或完整路径 | | `path` | string | 否 | 目录路径,空或不传为根目录 | | `ref` | string | 否 | 分支/tag/commit SHA(默认为项目默认分支) | | `recursive` | boolean | 否 | 是否递归列出子目录(默认 false) | - 校验 Schema:`ListRepositoryTreeSchema` - 输出按文件夹在前、文件在后排序 #### `get_file_content` — 获取文件内容 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `project` | string\|number | **是** | 项目 ID 或完整路径 | | `file_path` | string | **是** | 文件路径(相对于仓库根目录,如 `src/index.ts`) | | `ref` | string | 否 | 分支/tag/commit SHA(默认为项目默认分支) | - 校验 Schema:`GetFileContentSchema` - 自动 Base64 解码,根据文件扩展名添加语法高亮 --- ### 7. 邮件工具 代码位置:`src/tools/email.ts` #### `send_email` — 发送邮件 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `subject` | string | **是** | 邮件主题 | | `content` | string | **是** | 邮件正文(Markdown 格式,自动转换为 HTML) | | `recipient` | string | 否 | 收件人邮箱地址(不传则使用默认收件人 `EMAIL_RECIPIENT`) | - 校验 Schema:`SendEmailSchema` - 邮件同时包含 HTML 和纯文本版本(兜底) - 需要配置 `SMTP_PASSWORD` 环境变量 #### `test_email` — 测试邮件连接 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | `recipient` | string | 否 | 收件人邮箱地址(不传则使用默认收件人) | - 发送一封测试邮件,验证 SMTP 配置是否正确 --- ## 代码评审完整流程 AI 在执行代码评审时,会按以下步骤自动完成: 1. **确认基础分支** — 调用 `get_target_branch`,结合本地 git 命令验证 2. **获取 diff** — 调用 `code_review`,拿到两个分支之间的结构化 diff 3. **AI 分析** — 基于 diff 内容进行代码评审(正确性、安全性、可维护性等) 4. **发送邮件** — 调用 `send_email`,将评审结论发送到指定邮箱 > 💡 **省 token 技巧:** 告诉 AI「评审完直接发邮件,不用在控制台输出」,AI 会把分析结果直接写进邮件,避免重复输出。 --- ## 架构设计 ### 请求处理流程 ``` AI 客户端 (Kiro/Claude/Cursor/Warp) │ ▼ ┌─────────────────────────┐ │ MCP Server (index.ts) │ ← stdio 传输 │ - ListToolsRequest │ → 返回所有工具定义 │ - CallToolRequest │ → 分发到对应处理器 └─────────┬───────────────┘ │ ▼ ┌─────────────────────────┐ │ 工具注册中心 │ tools/index.ts │ Set 匹配 │ ← 按模块分组查找 │ name → handler │ └─────────┬───────────────┘ │ ▼ ┌─────────────────────────┐ │ 工具处理器 │ tools/*.ts │ 1. Zod 参数校验 │ ← utils/validator.ts │ 2. 调用 GitLab API │ │ 3. 格式化输出 │ ← utils/formatter.ts └─────────┬───────────────┘ │ ▼ ┌─────────────────────────┐ │ GitLabClient │ gitlab-client.ts │ - 30s 超时 │ │ - 3 次重试(指数退避) │ │ - TTL 缓存 │ ← cache.ts │ - IPv4 优先 DNS │ └─────────┬───────────────┘ │ ▼ GitLab REST API v4 ``` ### 缓存机制 | 缓存对象 | TTL | 实现类 | |---------|-----|--------| | 项目列表(无搜索条件) | 5 分钟 | `Cache` | 缓存特性: - 并发请求去重(inflight dedup):多个并发请求只触发一次实际 API 调用 - `KeyedCache` 可用于搜索等场景(1 分钟 TTL,最多 100 条,超限自动清理) ### 重试机制 - 触发条件:HTTP 5xx 错误、网络超时(AbortError)、连接拒绝(ECONNREFUSED) - 最大重试次数:3 次 - 退避策略:线性退避(`base * attempt`,基础延迟 1 秒) --- ## 使用示例 连接 MCP 后,你可以这样和 AI 对话: **项目管理** - "列出我可以访问的所有仓库" - "搜索包含 api 关键词的项目" - "显示我拥有的所有私有仓库" **Merge Request** - "列出 group/my-project 所有打开的 MR" - "查看 group/my-project 的 MR !42 详情" - "帮我创建一个 MR,从 feature/login 合并到 develop,标题是'登录功能'" - "合并 group/my-project 的 MR !42" - "在 MR !42 上评论:LGTM,可以合并" - "查看 MR !42 的所有评论" **分支管理** - "列出 group/my-project 的所有分支" - "搜索包含 feature 的分支" - "从 develop 创建一个新分支 feature/new-feature" - "删除 group/my-project 的 feature/old-branch 分支" **代码评审** - "帮我 review 一下 group/my-project 的 feature/login 分支" - "对 group/my-project 的 feature/login 做代码评审,基础分支是 develop" - "评审完直接发邮件,不用在控制台输出" - "对比 feature/login 和 develop 分支的差异,做代码评审并发邮件到 zhangsan@example.com" **CI/CD Pipeline** - "查看 group/my-project 最近的 Pipeline" - "查看 group/my-project 的 feature/login 分支的 CI 状态" - "Pipeline #12345 失败了,帮我看看 Job 日志" - "重试 Pipeline #12345" - "取消正在运行的 Pipeline #12345" **仓库浏览** - "看看 group/my-project 的目录结构" - "获取 group/my-project 的 src/index.ts 文件内容" - "查看 develop 分支上的 package.json" **邮件** - "发一封测试邮件,验证邮件配置" - "把评审结果发邮件到 zhangsan@example.com" --- ## 开发指南 ### 开发命令 ```bash npm install # 安装依赖 npm run build # 编译 TypeScript 到 dist/ npm run dev # 编译并运行(开发用) npm start # 运行已编译的服务 npm run lint # ESLint 代码检查 npm run lint:fix # 自动修复 lint 问题 npm run format # Prettier 格式化代码 ``` ### 添加新工具 1. **定义校验 Schema** — 在 `src/utils/validator.ts` 中添加 Zod Schema 并导出 2. **添加工具定义** — 在 `src/tools/` 下新建或修改文件,导出 `xxxTools: Tool[]` 和 `handleXxxTool` 函数 3. **添加处理逻辑** — 在 `handleXxxTool` 函数的 `switch` 中添加 `case` 4. **注册工具** — 在 `src/tools/index.ts` 中 import 并加入 `getAllTools()` 和 `handleToolCall()` 5. **(可选)添加 API 方法** — 如需新的 GitLab API 调用,在 `src/gitlab-client.ts` 中添加 6. **(可选)添加类型** — 在 `src/types.ts` 中添加接口定义 7. **(可选)添加格式化** — 在 `src/utils/formatter.ts` 中添加输出格式化函数 ### 代码规范 - 所有面向用户的消息使用中文 - 错误响应:`isError: true`,消息以 `❌` 开头 - 成功响应:消息以 `✅` 开头 - 未使用的参数用 `_` 前缀(如 `_config`) - 优先使用 `async/await`,避免 Promise 链式调用 - 日志输出到 stderr(MCP 协议要求 stdout 用于通信) - ESM 模块,import 路径必须带 `.js` 后缀 --- ## License MIT