gitlab-mcp
zereight/gitlab-mcp加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
周四是下午六点,团队 Release 分支卡在一个 Merge Request 上。CI 跑挂了,运维在聊天群里贴了一段三百行的 Job 日志,评审的同学只回了一句"这个改法有风险"。没有人打开 GitLab 去看,因为打开 GitLab 意味着在三个 Tab 之间来回切:MR 页面看 diff,流水线页面翻日志,Wiki 页面找部署手册。
问题不在于这些信息不存在,而在于它们不能被智能体直接读取。MCP(Model Context Protocol)要解决的就是这个断层——把外部系统的操作封装成模型能调用的工具。而 zereight/gitlab-mcp 是这个赛道里目前生态最完整的 GitLab 实现:288 个工具,默认只暴露 40 个,2089 Star,368 Fork,MIT 协议,TypeScript 编写,2025 年 2 月立项,最近一次提交是 2026 年 11 月 6 日。

一句话:把 GitLab REST API 和 GraphQL API 翻译成 AI 智能体会主动调用的工具集。
覆盖面很宽:项目与群组管理、合并请求(创建、审批、合并、冲突检测、分支保护)、议题与里程碑、流水线与 Job 日志、Wiki 页面、Release 与 Tag、文件读写(create_or_update_file、push_files)、仓库搜索与 Fork,以及一个通用的 execute_graphql。
但真正能看出设计功力的,是三个细节。
MCP 客户端在会话启动时会把整个 tools/list 一次性塞给模型。如果一个服务器暴露 286 个工具,schema 大约 29 万字节、约 7.3 万 token——相当于还没开始干活,先烧掉一大截上下文。
这个项目的解法是按需发现:
| 配置 | 工具数 | JSON 字节 | 预估 token |
|---|---|---|---|
| 默认(core + discover_tools + help) | 40 | 46,943 | 11,736 |
GITLAB_TOOL_PROFILE=slim | 39 | 45,935 | 11,484 |
GITLAB_TOOLSETS=all | 286 | 293,906 | 73,477 |
默认只开 core 这一个 toolset(38 个工具),另外两个 discover_tools(按分类激活)和 help 永远常驻。智能体需要跑流水线时,调用 discover_tools 传入 pipelines 分类,本会话内激活对应工具集。文档还明确警告不要设 GITLAB_TOOLSETS=all,并且这个开关依然不会启用 api 工具集——后者绕开所有白名单和逐工具安全检查,作者把它列为"仅在你接受越权风险时手动开启"。
更狠的一招是提供了一条完全绕开 MCP schema 的路径:项目内置了 Agent Skill(skills/gitlab-mcp/SKILL.md,约 800 token)和一个完整 CLI(zereight-mcp-gitlab mr list)。不注册 MCP,直接在终端跑命令拿全量 payload,用 Skill 里的工作流知识替代 schema 注入。这在本项目作者看来不是降级方案,而是"平级方案"。
get_merge_request_diffs 一次性返回全量 diff,对大型 MR 来说动辄几万 token。这个项目把它拆成两步:先 list_merge_request_changed_files 只拿改动文件路径列表,再对感兴趣的少数文件批量调用 get_merge_request_file_diff。同时支持在任意工具调用上挂 jmespath 表达式做结果裁剪——而且是在服务端裁剪,不改变对 GitLab 的实际请求。
还有一个 GITLAB_MCP_COMPACT_RESULTS 开关:开启后超长的 MCP 回复会变成"预览 + 一条 CLI 命令",模型拿到预览后自己去终端拉完整内容。
支持四种路径:本地 PAT(GITLAB_PERSONAL_ACCESS_TOKEN)、本地 OAuth2 浏览器流程、面向公网 HTTPS 服务的 MCP OAuth 代理(给 Claude.ai 这类 Web 客户端用),以及多用户远程部署下的 per-request REMOTE_AUTHORIZATION(把调用者的 PAT 或 CI Job Token 透传给后端)。另外有只读模式 GITLAB_READ_ONLY_MODE、项目白名单 GITLAB_ALLOWED_PROJECT_IDS、以及响应脱敏模块(masking/,带策略文件与掩码配置)。
三种传输方式:stdio(本地 IDE)、SSE(旧客户端)、Streamable HTTP(现代远程部署)。

结论:快速部署支持(quick_deploy = supported),部署难度 2/5,预估 10-20 分钟。
| 维度 | 情况 |
|---|---|
| Dockerfile | 有,且是多阶段构建:node:22.23.4-bookworm-slim 编译 → node:22.23.4-alpine 运行 |
| docker-compose | 有,docker/docker-compose.yaml,镜像 zereight050/gitlab-mcp:latest |
| Kubernetes | 无 manifest(但支持 stateless 模式,文档专门写了"Stateless Mode — Multi-Pod HPA") |
| Web UI | 有(Express 驱动的 HTTP 服务,3002 端口) |
| GPU | 不需要 |
| 硬件 | 512MB 内存起,300MB 磁盘 |
Dockerfile 里有个细节能看出踩过坑:文件顶部注释明确写了为什么 builder 阶段用 glibc 的 bookworm-slim 而不是 alpine——因为 node:*-alpine(musl)在 QEMU arm64 模拟下 npm ci 会崩(uncaught target signal 4),把多平台 CI 构建挂到超时。这种注释比任何文档都更能说明项目的成熟度。
启动方式有三条,任选其一:
# 1. npm 全局安装
npm install -g @zereight/mcp-gitlab
# 2. 一行启动
npx -y @zereight/mcp-gitlab@latest
# 3. Docker Compose
cd docker && docker compose up -d
Homebrew 也有 tap(brew tap zereight/gitlab-mcp),并且已经进入 官方 MCP Registry(io.github.zereight/gitlab-mcp)。
Dockerfile 里 EXPOSE 3002,但 compose 文件里端口绑定写的是 127.0.0.1:3002:3002——默认只监听回环地址,不对外暴露。这是正确的安全默认值(GitLab 凭据经过这个服务),但如果打算做成团队共享的远程 MCP 实例,必须改绑定地址并配置 STREAMABLE_HTTP_AUTH_TOKEN 或 REMOTE_AUTHORIZATION,否则等于把一个带 PAT 的服务直接开到公网。
代码结构规模:516 个文件,其中 308 个是 .ts,132 个 .md,18 个 .yml。测试目录 test/ 有 206 个文件——测试文件数占全仓的 40%,这个比例在开源 MCP 项目里相当罕见。
顶层目录分布:
test/ 206 测试用例
.github/ 75 13 个 workflow
docs/ 60 含 MkDocs 站点与 llms.txt
utils/ 30
scripts/ 17
mcp-server/ 12 MCP 协议层
cli/ 11 CLI 入口
server/ 11 HTTP 传输层
skills/ 10 Agent Skill
stateless/ 10 无状态多实例
tools/ 10 工具注册表
docker/ 5
masking/ 3 响应脱敏
核心依赖:官方 @modelcontextprotocol/sdk ^1.29.0、zod ^4.6.5(参数校验)、express ^5.1.0(HTTP 传输)、pino(日志)、jmespath(结果过滤)、undici/tough-cookie/fetch-cookie(HTTP 客户端与 Cookie 处理)、socks-proxy-agent(代理支持)、pkce-challenge(OAuth PKCE)、re2js(正则)、tldts(域名解析,用于 allowlist 校验)。依赖数量克制,没有引入重型框架。
测试脚本分层清晰:test:mock(本地 mock,无需真实 GitLab)、test:live(打真实 API 验证)、test:stateless(无状态模式,7 个测试文件)、test:mcp-oauth、test:oauth、test:remote-auth、test:schema(JSON Schema 一致性,用 --test-concurrency=1 串行避免竞态)。连 tools/list 的 token 预算都有专门的回归测试 test/tools-list-budget.test.ts——把"工具数量"当成需要守护的性能指标,这个思路是成熟的。
质量评分:8/10。 扣分项:仓库体积偏大(516 文件里 206 个是测试、132 个是文档),对只想要一个 MCP Server 的用户来说阅读成本不低;CI workflow 数量多(13 个)也意味着维护面较宽。
文档质量:优秀。 README 有 1113 行 / 76KB,四国语言版本(英/韩/中/巴葡);配套 MkDocs 文档站(zereight.github.io/gitlab-mcp)、llms.txt / llms-full.txt 机器可读索引(给 AI 客户端抓取)、以及 7 个客户端的独立配置指南(Claude Code、Codex、VS Code、Copilot、Cursor、JSON 类客户端如 Factory AI Droid / OpenClaw / OpenCode)。文档数量超过代码辅助文档的常规比例,这是把 MCP Server 当"产品"而非"脚本"在做。
AI 框架:项目本身不使用机器学习模型,ai_framework_used = Not specified。它是一个纯协议适配层——AI 能力来自调用它的 LLM 客户端(Claude Code、Codex、Cursor 等),项目负责的是"把 GitLab 能力以工具的形式正确、安全、节省 token 地递过去"。
训练数据来源:无。这是关键点——所有 GitLab 数据都留在你自己的实例或官方 GitLab.com 上,工具调用是实时的 API 请求,不经过任何第三方模型训练管道。私有代码、MR diff、内部 Wiki 不会被用于训练。
数据隐私:项目提供了三层防护——项目级 allowlist(GITLAB_ALLOWED_PROJECT_IDS)、只读模式、以及响应脱敏模块(masking/ 支持策略文件,可配置掩码规则)。审计日志用 pino 记录。部署时最需要注意的仍是不要把 HTTP 端口暴露到公网,以及谨慎开启 api 工具集。
已知安全风险:作者自己在文档中点名了 gitlab_api_request 工具集的危险性——它会绕过群组/项目白名单、其他工具过滤器和逐工具安全检查,提示词注入可以驱动它。作者的处理方式是默认不启用、需显式列名才开启。这种"把风险写在文档最显眼处"的处理方式比很多商业产品更诚实。
GITLAB_TOOLSETS=all,然后发现上下文被吃掉三成。这是 MCP 生态的通病,GitLab 官方服务器选择用 HTTP header 控制 toolset,是另一种解法。这个项目放在 MCP 生态里看是从"工具数量竞赛"转向"上下文预算经济学"的代表案例。
2024-2025 年 MCP 刚兴起时,各家服务器都在比谁工具多,因为工具多意味着能力强。但很快大家都撞到同一个墙:客户端启动时全量注入 schema,工具一多,模型的第一轮上下文就被工具描述吃光,推理质量断崖下跌。zereight/gitlab-mcp 的做法是承认工具多、但默认只给模型看到 40 个,剩下的通过 discover_tools 按需拉取——把"能力广度"和"上下文成本"解耦。
另一个值得注意的设计是 Skill + CLI 作为平级路径。MCP 生态里绝大多数项目都把"不用 MCP"当成兼容层,这个项目直接提供 npx skills add 一行安装 + 完整 CLI,并在文档里做对照表说明什么场景用哪个。这是把 MCP 本身当作可选传输协议而非信仰——对同样关心 token 成本的团队,这种思路更容易落地。
从数据看:这个项目 2025 年 2 月立项,一年多做到 2089 Star / 368 Fork / 136 位贡献者,安装量走 npm 官方包 @zereight/mcp-gitlab(2.3.22 版),进入 MCP Registry、有 Docker Hub 镜像、Homebrew tap、MkDocs 文档站、llms.txt 机器索引、DeepWiki 可问答、mcptoplist/mcpindex 收录。一个"边角工具"能做成这样,说明 GitLab 侧的 AI 协作需求是真实且未被官方完全满足的。
| 场景 | 建议 |
|---|---|
| 团队已有 Claude Code / Cursor,要做 MR 评审 | 值得试。用默认 core 工具集起步,只在需要时 discover_tools |
| 想要完整 diff / 完整 Job 日志 | 直接用 zereight-mcp-gitlab CLI,不要绕 MCP |
| 安全合规要求高 | 部署时用 compose 的 127.0.0.1 绑定 + GITLAB_READ_ONLY_MODE=true + GITLAB_ALLOWED_PROJECT_IDS,不要开 api 工具集 |
| 多团队共享远程实例 | 用 stateless 模式 + HPA,自行补 K8s manifest,配置 REMOTE_AUTHORIZATION 或 STREAMABLE_HTTP_AUTH_TOKEN |
| 已深度使用 GitLab 官方 MCP Server | 不必急着迁移;本项目的差异化优势集中在 MR 两步评审、Skill+CLI 和 token 预算控制 |
一句话总结:把 GitLab 的 288 种操作塞进 AI 智能体,同时只让它先看见 40 个——这是目前开源 GitLab MCP 里工程完成度和 token 经济学做得最好的一份实现,部署成本低到可以今天下午就试。
