GitLab MCP服务器

GitLab MCP Server是一个为AI代理提供与GitLab直接交互的协议服务器,支持86种工具,适用于企业级部署和开发环境。

  • by yoda-digital
  • TypeScript
  • 混合部署
  • 65 星标
  • 更新于
在 GitHub 查看 yoda-digital/mcp-gitlab-server

使用说明

GitLab MCP服务器

The most comprehensive Model Context Protocol (MCP) server for GitLab — 86 tools, enterprise-ready, actively maintained.


这是什么

GitLab MCP服务器允许AI代理(Claude Desktop、Claude Code、Cursor、Zed、VS Code或任何 模型上下文协议 客户端)直接与GitLab对话。它是一个类型化的、分页的、经过架构验证的到GitLab REST API的桥,公开为86个MCP工具。它不是一个包装 glab 并且它不会刮屏。

它与 gitlab.com 或任何自托管的GitLab实例,并使用个人访问令牌、上游网关转发的OAuth承载令牌或用于安全演示的只读令牌进行身份验证。


为什么它存在

Anthropic于2024年11月25日发布了MCP。参考服务器包括Google Drive、Slack、GitHub、Git、Postgres和Puppeteer。没有GitLab服务器。Yoda Digital工程团队在自托管的GitLab上运行,因此官方示例对我们没有帮助,早期的社区端口还没有试图正确覆盖GitLab的表面区域。

我们为自己写了一个。团队项目、活动跟踪、DevOps实际需要的操作。我们在2025年3月18日开源了它,预计可能会有五个人觉得它有用。

一年来,该项目有86个工具,可以使用stdio/SSE/Streamable HTTP传输,PAT和OAuth模式,ghcr.io上的Docker镜像,以及几乎完全由我们从未见过的外部贡献者编写的Helm图表。0.4.0和0.5.0版本现在大多是别人的代码,这是开源维护者可能遇到的最好的问题。


快速启动

本地客户端(stdio)

对于Claude Desktop、Cursor、Zed以及任何将MCP服务器作为本地子进程运行的客户端。将此添加到客户端的MCP配置中(对于Claude Desktop,这是 claude_desktop_config.json):

{
  "mcpServers": {
    "gitlab": {
      "command": "npx",
      "args": ["-y", "@yoda.digital/gitlab-mcp-server"],
      "env": {
        "GITLAB_PERSONAL_ACCESS_TOKEN": "glpat-…",
        "GITLAB_API_URL": "https://gitlab.com/api/v4"
      }
    }
  }
}

自托管?替换 GITLAB_API_URL 与你的实例,例如。 https://gitlab.example.com/api/v4。想要一个没有写权限的安全演示吗?添加 "GITLAB_READ_ONLY_MODE": "true"。根据IDE,注释在 docs/CURSOR_INTEGRATION.md.

远程(流式HTTP,OAuth门控)

对于共享部署和现代远程MCP客户端,请将服务器作为HTTP服务运行。网络暴露部署需要 AUTH_MODE=oauth --服务器拒绝启动 AUTH_MODE=pat 在非环回绑定上。请参阅 SECURITY.md 对于威胁模型。

docker run --rm -p 3000:3000 \
  -e HOST=0.0.0.0 \
  -e AUTH_MODE=oauth \
  -e USE_STREAMABLE_HTTP=true \
  ghcr.io/yoda-digital/mcp-gitlab-server:latest

然后在容器前面安装一个注入的网关 Authorization: Bearer <token> per connection——服务器将该Bearer作为per connection PAT转发给GitLab。将客户指向 http://your-gateway/mcp.

操作细节、探头配置和故障排除见 docs/OPERATIONS.md.


盒子里有什么

86个工具,按表面分组:

  • 存储库:搜索、创建、分叉、获取和更新项目元数据。
  • 文件和分支:读取、创建、更新和删除文件;多文件提交;分支(列出、创建、删除);存储库树。
  • 标签和发布:列出并创建标签;列出并创建发布。
  • 问题:创建、列表、更新、注释、线程讨论。
  • 合并请求:创建、更新、合并、重基;批准;自动合并;笔记、讨论、更改、提交。
  • CI/CD:管道(列表、获取、触发、重试、取消)、作业(列表、获得、日志、重试、删除)、环境。
  • Wiki:项目和组Wiki,包括附件。
  • 组和成员:组CRUD、子组、项目和组成员。
  • 标签和里程碑:列表、创建、更新;受保护的分支:列表、保护、取消保护。
  • 用户和元:当前用户、列表/获取用户、项目事件、提交历史。

中的完整工具列表 CLAUDE.md。中所选工具的每个工具文档 docs/api/.

只读模式(GITLAB_READ_ONLY_MODE=true)在注册时过滤掉每个变异工具。行为不端的特工看不见他们,更不用说给他们打电话了。


运输

运输 何时使用 标志
stdio 本地客户端(Claude Desktop、Cursor、Zed)。默认值。 (默认)
SSE 远程客户端仍使用传统的SSE规范 USE_SSE=true
Streamable HTTP 当前MCP Streamable HTTP规范上的远程客户端 USE_STREAMABLE_HTTP=true

流式HTTP运行 POST /mcp, GET /mcp,以及 DELETE /mcp,通过会话管理 MCP-Session-Id 头球这 /healthz 当活动会话超过时,端点返回503 HEALTHZ_MAX_SESSIONS,用于Kubernetes活性和就绪性探测。


认证

两种模式。正确的方法取决于HTTP传输是否可以从网络访问。

每个连接的OAuth(AUTH_MODE=oauth,网络公开部署的默认设置)。服务器没有静态令牌。每个MCP连接都有自己的 Authorization: Bearer <token>,服务器将其作为该连接的有效PAT转发给GitLab。在处理IdP的网关后面运行它。这就是如何为整个团队操作一个共享部署。只要绑定是非环回的,就需要。

PAT模式(AUTH_MODE=pat,仅限环回)。服务器在中持有一个个人访问令牌 GITLAB_PERSONAL_ACCESS_TOKENHTTP传输正在运行 无身份验证 在这种模式下,服务器强制执行仅环回绑定(HOST=127.0.0.1)并拒绝以其他方式开始。stdio客户端和单租户本地开发的正确选择。Helm不支持——请参阅图表的身份验证保护。


配置

变量 默认值 用途
GITLAB_PERSONAL_ACCESS_TOKEN -- PAT模式下需要。
GITLAB_API_URL https://gitlab.com/api/v4 GitLab API基础URL。如果需要,指向您的自托管实例。
GITLAB_READ_ONLY_MODE false 隐藏所有写入工具。
AUTH_MODE pat pat (仅限环回)或 oauth (任何约束)。
HOST 127.0.0.1 为HTTP传输绑定地址。吃起来 0.0.0.0 暴露于网络——但仅限于 AUTH_MODE=oauth,否则启动拒绝。
USE_SSE false 启用传统SSE传输。
USE_STREAMABLE_HTTP false 启用MCP流式HTTP传输。
PORT 3000 SSE和流式HTTP的HTTP侦听端口。
CORS_ALLOW_ORIGINS (空) 逗号分隔的异体字。空意味着 * 在PAT环回模式下(仅限本地开发);OAuth模式中的空表示拒绝。通配符从不在非环回绑定上发出
HEALTHZ_MAX_SESSIONS 10000 /healthz 翻转到高于该阈值的503。

.env.example 在回购中为当地发展提供资金。


部署

码头工人

ghcr.io/yoda-digital/mcp-gitlab-server:latest

多阶段构建 node:24-alpine.以非root(uid 1000)身份运行,所有功能均已删除。与只读根文件系统和 seccompProfile: RuntimeDefault Kubernetes pod安全设置。发布时,图片标签跟在semver后面; latest 跟踪最新标记的版本。

Kubernetes(Helm)

helm install gitlab-mcp oci://ghcr.io/yoda-digital/charts/gitlab-mcp

图表默认为 AUTH_MODE=oauth 因此,vanilla安装是身份验证门控的。使用注入的Ingress或网关来提供服务 Authorization: Bearer <token> 每个连接。

该图表将活体和准备状态探测器运送到 /healthz,可选 PodDisruptionBudget、带有滚动重启注释的ConfigMap和Secret,以及五个拒绝呈现错误配置的故障大声防护:

  • AUTH_MODE=pat 无环回 HOST (CWE-306——见 chart/templates/auth-validation.yaml)
  • PAT模式下的空PAT existingSecret
  • 两者 existingSecret 和内联 secret.GITLAB_PERSONAL_ACCESS_TOKEN set(否则为无声优先级陷阱)
  • PDB minAvailable >= replicaCount (排水死锁)
  • 两者 minAvailable 和 maxUnavailable 在PDB上设置(Kubernetes在准入时拒绝此组合)

values.yaml 注释为 helm-docs,以及 chart/README.md 在CI中重新生成并检查漂移。


安全

漏洞通过GitHub 私有漏洞报告不是公共问题。威胁模型和范围 SECURITY.md.

关于供应链,有几件事是正确的。每个npm发布都用 Sigstore来源 通过OIDC可信出版。CodeQL在每次推送和PR上运行 security-extended 和 security-and-quality 查询包。Dependabot是打开的、分组的和每周的。 npm audit 报告当前版本中没有漏洞。 main 需要PR、状态检查、挤压或重基合并以及线性历史记录。

只读模式在工具注册时强制执行,而不是在请求边界。如果回归允许写工具在以下条件下执行 GITLAB_READ_ONLY_MODE=true,这是一个安全漏洞。请报告。


这在生态系统中的位置

有几种方法可以将GitLab和MCP结合起来。选择一个符合你情况的:

  • GitLab内置的MCP服务器 在 https://<your-instance>/api/v4/mcp.15工具,需要GitLab Premium或Ultimate,OAuth与您的GitLab IdP集成。如果您有订阅和15个工具,那么正确的选择对您的代理商来说是足够的表面积。
  • zereight/gitlab-mcp,最大的社区实施。更广泛的身份验证界面(PAT、OAuth2浏览器流、OAuth代理、远程授权),更多的工具。如果你想获得最大的覆盖范围,并且不介意考虑更大的项目,这是一个很好的选择。
  • mcpland/gitlab-mcp,以政策引擎为重点。OAuth2-PKCE,多实例路由,基于cookie的身份验证。适用于严格控制的企业部署。
  • 此服务器(@yoda.digital/gitlab-mcp-server).86工具,三种传输方式,PAT和OAuth,Sigstore支持的npm版本,非root多级Docker镜像,以及带有故障警报的Helm图表。如果你想要一个规模较小、安全性成熟的项目,可以干净利落地部署到Kubernetes中,那就太好了。

这些都不是普遍最好的,我们也不会假装不是。


贡献

PR欢迎。我们要求的形状:

  1. 叉子、树枝(feature/*, fix/*, docs/*, refactor/*).
  2. 常规承诺(feat:, fix:, docs:, chore:, …).他们驱动更新日志。
  3. 添加或更新vitest测试以进行行为更改。 npm test 是门。
  4. 打开PR.CI运行 build-and-test、CodeQL、Dockerfile lint、Helm lint和模板冒烟测试,以及Helm chart README漂移检查。

本地设置:

git clone https://github.com/yoda-digital/mcp-gitlab-server.git
cd mcp-gitlab-server
npm install
npm test
npm run dev

完整指南见 CONTRIBUTING.md人工智能辅助贡献规则 ai_code_of_conduct.md.行为准则: CODE_OF_CONDUCT.md.一些 good first issue 门票在问题跟踪器中实时显示。


贡献者

这个项目的作者比它的起源所暗示的要多。

扬(纳莱克)平静 是原作者和维护者。Yoda Digital首席技术官。

奥利维耶·金特兰德(@ecthelion77) 编写了每个连接的OAuth身份验证路径、MCP流式HTTP传输、多级Dockerfile和Helm图表,包括故障大声防护。版本0.4.0和0.5.0主要是他的作品,通过PR#42和PR#44合并。

托马斯·莱维尔(@thomasleveil) 和 本肖韦康波特 提前发送PR。

Dependabot负责更改日志中的大部分杂务提交,并且从不睡觉。

如果你已经发送了PR或安全报告,但你不在这个列表中,那就是一个bug。请打开一个问题。


许可证

麻省理工学院.


链接


建于❤️ 通过 尤达。数字