开普勒MCP GitLab服务器
一个生产就绪的MCP(模型上下文协议)服务器,为Claude Desktop和ChatGPT等AI助手提供GitLab集成工具。
运作原理
此MCP服务器充当AI助手(ChatGPT、Claude等)和GitLab实例之间的桥梁。用户通过GitLab OAuth进行身份验证,就像连接任何第三方应用程序一样。
┌─────────────────┐ ┌─────────────────────┐ ┌─────────────────┐
│ AI Assistant │ │ MCP Server │ │ GitLab │
│ (ChatGPT, │◄────►│ (Your Company │◄────►│ (Your │
│ Claude) │ │ Hosted) │ │ Instance) │
└─────────────────┘ └─────────────────────┘ └─────────────────┘
│ │ │
│ 1. User connects │ │
│ ─────────────────► │ │
│ │ 2. Redirect to GitLab │
│ │ ─────────────────────► │
│ │ │
│ │ 3. User authorizes │
│ │ ◄───────────────────── │
│ │ │
│ 4. Connected! │ 5. API calls with │
│ ◄───────────────── │ user's permissions │
│ │ ◄────────────────────► │面向终端用户:只需将MCP服务器URL添加到他们的AI助手中,并使用GitLab进行授权。无需令牌或配置。
对于管理员:一次性设置部署服务器并向GitLab注册OAuth应用程序。
特性
- GitLab集成:通过MCP工具访问项目、问题、合并请求等
- OAuth 2.0身份验证:用户通过GitLab授权-无需管理令牌
- 每个用户权限:尊重每个用户的GitLab权限
- 多种运输方式:stdio用于本地(Claude Desktop),SSE用于HTTP(ChatGPT)
- 安全令牌存储:使用Fernet加密的加密会话存储
- Docker支持:生产就绪的容器图像
可用工具
连接后,用户可以要求他们的AI助手:
| 工具 | 说明 |
|---|---|
| 项目 | |
list_projects | 列出可访问的GitLab项目 |
get_project | 获取项目详细信息 |
search_projects | 搜索项目 |
get_project_languages | 获取语言细分 |
| 问题 | |
list_issues | 列出项目中的问题 |
get_issue | 获取问题详细信息 |
create_issue | 创建新问题 |
update_issue | 更新问题 |
close_issue / reopen_issue | 更改问题状态 |
list_issue_comments | 列出对某个问题的评论 |
add_issue_comment | 添加评论 |
| 合并请求 | |
list_merge_requests | 列出项目中的MR |
get_merge_request | 获取MR详细信息 |
create_merge_request | 创建新MR |
update_merge_request | 更新MR |
merge_merge_request | 合并MR |
approve_merge_request | 批准MR |
get_merge_request_changes | 获取MR差异 |
list_merge_request_discussions | 列出评论主题 |
| 仓库 | |
list_branches | 列出存储库分支 |
get_branch | 获取分行详细信息 |
create_branch | 创建新分支 |
delete_branch | 删除分支 |
list_tags | 列出存储库标签 |
get_tag | 获取标签详细信息 |
create_tag | 创建新标签 |
delete_tag | 删除标签 |
compare_branches | 比较两个分支/提交 |
list_repository_tree | 列出文件和目录 |
get_file | 获取文件元数据 |
get_file_content | 获取文件内容(已解码) |
create_file | 创建新文件 |
update_file | 更新现有文件 |
delete_file | 删除文件 |
get_file_blame | 获取文件责任/历史记录 |
list_commits | 列表存储库提交 |
get_commit | 获取提交详细信息 |
get_commit_diff | 获取提交差异 |
cherry_pick_commit | 樱桃挑一个承诺 |
get_commit_refs | 获取包含提交的引用 |
| 公用事业 | |
get_current_user | 获取经过身份验证的用户信息 |
get_gitlab_config | 获取服务器配置 |
______________________________________________________________________
部署指南(适用于管理员)
本节适用于为其组织部署MCP服务器的IT管理员。
先决条件
- Python 3.12+或Docker
- 访问您的GitLab实例(管理员或创建OAuth应用程序的能力)
- 运行MCP服务器的服务器/主机(可以与GitLab相同或单独)
了解OAuth应用程序凭据
部署此服务器时,需要在GitLab中将其注册为OAuth应用程序。这类似于Slack、GitHub或任何第三方集成的工作原理。
为什么? GitLab需要知道:
- 谁在问 (客户端ID)-标识您的MCP服务器
- 真的是你 (客户端机密)-证明请求是合法的
- 将用户送回何处 (重定向URI)-授权后
这些是 应用程序凭据,而不是用户凭据。您只需设置一次,组织中的所有用户就可以连接,而无需任何其他配置。
┌─────────────────────────────────────────────────────────────────────┐
│ OAuth Flow Explained │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1. User clicks "Connect to GitLab" in ChatGPT │
│ │ │
│ ▼ │
│ 2. MCP Server redirects to GitLab: │
│ gitlab.com/oauth/authorize?client_id=ABC123&... │
│ │ │
│ │ ◄── GitLab checks: "Is ABC123 a valid │
│ │ registered application?" │
│ ▼ │
│ 3. User sees GitLab login page, then: │
│ "Kepler MCP Server wants to access your account" │
│ [Authorize] [Deny] │
│ │ │
│ ▼ │
│ 4. User clicks Authorize, GitLab redirects back with temp code │
│ │ │
│ ▼ │
│ 5. MCP Server exchanges code for tokens: │
│ POST gitlab.com/oauth/token │
│ { client_id: ABC123, client_secret: XYZ789, code: ... } │
│ │ │
│ │ ◄── GitLab verifies the secret matches │
│ │ the registered application │
│ ▼ │
│ 6. GitLab returns access token, user is connected! │
│ │
└─────────────────────────────────────────────────────────────────────┘步骤1:在GitLab中注册OAuth应用程序
- 以管理员身份(或用户级应用程序的任何用户)登录您的GitLab实例
- 导航到:
- 实例范围内 (推荐):行政区→ 应用程序 - 用户级别:用户设置→ 应用程序
- 点击 新应用程序 并填写:
| 字段 | 值 |
|---|---|
| 名字 | Kepler MCP GitLab Server |
| 重定向URI | https://your-mcp-server.com/oauth/callback |
| 机密 | ✅ 是(已勾选) |
| 范围 | ✅ api ✅ read_user ✅ read_repository |
- 点击 保存应用程序
- 复制并安全存储:
- 应用标识符 (客户端ID) - 秘密 (客户端密码)-仅显示一次!
步骤2:配置服务器
创建配置文件或设置环境变量:
选项A:环境变量
# Required: GitLab Instance
export KEPLER_MCP_GITLAB_URL=https://gitlab.your-company.com
# Required: OAuth Application Credentials (from Step 1)
export KEPLER_MCP_OAUTH_USER_AUTH_ENABLED=true
export KEPLER_MCP_OAUTH_CLIENT_ID=your_application_id_here
export KEPLER_MCP_OAUTH_CLIENT_SECRET=your_secret_here
export KEPLER_MCP_OAUTH_REDIRECT_URI=https://your-mcp-server.com/oauth/callback
export KEPLER_MCP_OAUTH_SCOPE="api read_user read_repository"
# Required: OAuth Endpoints (adjust domain for your GitLab)
export KEPLER_MCP_OAUTH_AUTHORIZATION_URL=https://gitlab.your-company.com/oauth/authorize
export KEPLER_MCP_OAUTH_TOKEN_URL=https://gitlab.your-company.com/oauth/token
export KEPLER_MCP_OAUTH_USERINFO_URL=https://gitlab.your-company.com/api/v4/user
# Server Settings
export KEPLER_MCP_TRANSPORT_MODE=sse
export KEPLER_MCP_HOST=0.0.0.0
export KEPLER_MCP_PORT=8000
# Optional: Token Encryption (recommended for production)
# Generate key: python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
export KEPLER_MCP_TOKEN_ENCRYPTION_KEY=your_generated_fernet_key
export KEPLER_MCP_TOKEN_STORE_PATH=/var/lib/kepler-mcp/tokens.json选项B: .env 文件
创建一个 .env 项目根目录中具有相同变量的文件(没有 export).
GitLab.com与自托管
| 设置 | GitLab.com | 自托管 |
|---|---|---|
GITLAB_URL | https://gitlab.com | https://gitlab.your-company.com |
OAUTH_AUTHORIZATION_URL | https://gitlab.com/oauth/authorize | https://gitlab.your-company.com/oauth/authorize |
OAUTH_TOKEN_URL | https://gitlab.com/oauth/token | https://gitlab.your-company.com/oauth/token |
OAUTH_USERINFO_URL | https://gitlab.com/api/v4/user | https://gitlab.your-company.com/api/v4/user |
步骤3:部署服务器
选项A:直接使用Python
# Create virtual environment
python3.12 -m venv .venv
source .venv/bin/activate
# Install
pip install -e .
# Run
python -m kepler_mcp_gitlab.cli serve --transport sse选项B:Docker
# Build
docker build -t kepler-mcp-gitlab -f docker/Dockerfile .
# Run
docker run -d \
--name kepler-mcp-gitlab \
-p 8000:8000 \
-e KEPLER_MCP_GITLAB_URL=https://gitlab.your-company.com \
-e KEPLER_MCP_OAUTH_USER_AUTH_ENABLED=true \
-e KEPLER_MCP_OAUTH_CLIENT_ID=your_client_id \
-e KEPLER_MCP_OAUTH_CLIENT_SECRET=your_secret \
-e KEPLER_MCP_OAUTH_REDIRECT_URI=https://your-mcp-server.com/oauth/callback \
-e KEPLER_MCP_OAUTH_AUTHORIZATION_URL=https://gitlab.your-company.com/oauth/authorize \
-e KEPLER_MCP_OAUTH_TOKEN_URL=https://gitlab.your-company.com/oauth/token \
-e KEPLER_MCP_OAUTH_SCOPE="api read_user read_repository" \
kepler-mcp-gitlab选项C:Docker编写
version: '3.8'
services:
mcp-gitlab:
build:
context: .
dockerfile: docker/Dockerfile
ports:
- "8000:8000"
environment:
KEPLER_MCP_GITLAB_URL: https://gitlab.your-company.com
KEPLER_MCP_OAUTH_USER_AUTH_ENABLED: "true"
KEPLER_MCP_OAUTH_CLIENT_ID: ${OAUTH_CLIENT_ID}
KEPLER_MCP_OAUTH_CLIENT_SECRET: ${OAUTH_CLIENT_SECRET}
KEPLER_MCP_OAUTH_REDIRECT_URI: https://your-mcp-server.com/oauth/callback
KEPLER_MCP_OAUTH_AUTHORIZATION_URL: https://gitlab.your-company.com/oauth/authorize
KEPLER_MCP_OAUTH_TOKEN_URL: https://gitlab.your-company.com/oauth/token
KEPLER_MCP_OAUTH_SCOPE: "api read_user read_repository"
restart: unless-stopped步骤4:验证部署
# Health check
curl https://your-mcp-server.com/health
# Expected response:
# {"status": "ok", "app_name": "Kepler MCP GitLab Server", "environment": "prod"}
# Test OAuth redirect (should redirect to GitLab)
curl -I https://your-mcp-server.com/oauth/authorize
# Expected: HTTP 302 with Location header pointing to GitLab第五步:通知用户
部署后,与用户分享以下说明:
从ChatGPT连接到GitLab 1. 在ChatGPT中,转到设置→ 连接→ 添加MCP服务器 1. 输入服务器URL: https://your-mcp-server.com/sse 1. 点击连接-您将被重定向到GitLab 1. 登录GitLab并点击“授权” 1. 完成!您现在可以向ChatGPT询问您的GitLab项目。 尝试:“列出我的GitLab项目”或“显示项目X中的未解决问题”______________________________________________________________________
配置参考
所有环境变量
| 变量 | 描述 | 默认值 | 必填 |
|---|---|---|---|
| 核心 | |||
KEPLER_MCP_APP_NAME | 应用程序名称 | Kepler MCP GitLab Server | 没有 |
KEPLER_MCP_LOG_LEVEL | 日志级别 | INFO | 没有 |
KEPLER_MCP_ENVIRONMENT | 环境(本地/dev/stage/prod) | local | 没有 |
KEPLER_MCP_TRANSPORT_MODE | 交通(stdio/sse) | stdio | 没有 |
KEPLER_MCP_HOST | 服务器绑定主机 | 0.0.0.0 | 没有 |
KEPLER_MCP_PORT | 服务器绑定端口 | 8000 | 没有 |
| GitLab | |||
KEPLER_MCP_GITLAB_URL | GitLab实例URL | https://gitlab.com | 是的 |
| OAuth (SSE模式需要) | |||
KEPLER_MCP_OAUTH_USER_AUTH_ENABLED | 启用OAuth | false | 是\* |
KEPLER_MCP_OAUTH_CLIENT_ID | OAuth客户端ID | - | 是\* |
KEPLER_MCP_OAUTH_CLIENT_SECRET | OAuth客户端密码 | - | 是\* |
KEPLER_MCP_OAUTH_AUTHORIZATION_URL | OAuth授权端点 | - | 是\* |
KEPLER_MCP_OAUTH_TOKEN_URL | OAuth令牌端点 | - | 是\* |
KEPLER_MCP_OAUTH_REDIRECT_URI | OAuth回调URL | - | 是\* |
KEPLER_MCP_OAUTH_SCOPE | OAuth作用域 | - | 是\* |
KEPLER_MCP_OAUTH_USERINFO_URL | 用户信息端点 | - | 否 |
| 令牌存储 | |||
KEPLER_MCP_TOKEN_ENCRYPTION_KEY | 加密的Fernet密钥 | - | 否\*\* |
KEPLER_MCP_TOKEN_STORE_PATH | 令牌持久化路径 | - | 否\*\* |
| 速率限制 | |||
KEPLER_MCP_RATE_LIMIT_REQUESTS_PER_MINUTE | 最大请求数/分钟 | 60 | 没有 |
KEPLER_MCP_RATE_LIMIT_BURST | 爆裂尺寸 | 10 | 没有 |
\*需要时 OAUTH_USER_AUTH_ENABLED=true \*\*如果需要持续会话,则需要一起使用
______________________________________________________________________
发展
设置
# Clone and setup
git clone
cd kepler-mcp-gitlab-server
# Create virtual environment
python3.12 -m venv .venv
source .venv/bin/activate
# Install with dev dependencies
pip install -e ".[dev]"质量检查
make lint # Ruff linting
make typecheck # Mypy type checking
make test # Run tests
make coverage # Tests with coverage report
make check-all # All checks项目结构
src/kepler_mcp_gitlab/
├── cli.py # Command-line interface
├── server.py # FastMCP server setup
├── config.py # Configuration management
├── context.py # Request context and session management
├── application.py # Tool registration
├── transport.py # stdio/SSE transport handlers
├── security.py # Auth strategies, token handling
├── gitlab/
│ ├── client.py # GitLab API client
│ └── exceptions.py # GitLab-specific errors
├── oauth/
│ ├── flows.py # OAuth flow implementations
│ ├── pkce.py # PKCE support
│ ├── session.py # Session management
│ └── token_store.py # Token persistence
└── tools/
├── projects.py # Project tools
├── issues.py # Issue tools
├── merge_requests.py # MR tools
└── repository.py # Repository tools (branches, tags, files, commits)______________________________________________________________________
安全
- OAuth 2.0与PKCE:行业标准安全身份验证
- 没有存储密码:用户直接通过GitLab进行身份验证
- 每个用户权限:尊重每个用户的GitLab访问权限
- 加密令牌:使用Fernet静态加密的会话令牌
- 秘密编辑:敏感值从不出现在日志中
- 非根容器:Docker镜像以无特权用户身份运行
______________________________________________________________________
故障排除
OAuth错误
“重定向URI无效”
- 确保GitLab中的重定向URI与服务器的回调URL完全匹配
- 检查尾随斜线,http与https
“无效客户端”
- 验证客户端ID是否正确
- 检查OAuth应用程序是否仍在GitLab中处于活动状态
“无效状态”
- 状态已过期(默认10分钟)-重试该流程
- 服务器可能在OAuth流期间重新启动
连接问题
健康检查失败
# Check if server is running
curl http://localhost:8000/health
# Check logs
docker logs kepler-mcp-gitlabGitLab API错误
# Test GitLab connectivity directly
curl -H "Authorization: Bearer " https://gitlab.your-company.com/api/v4/user______________________________________________________________________
许可证
MIT许可证-请参阅 许可证 了解详情。
