یک سرور MCP که ابزارهای کار با کد، Merge Request، Issue و Pipeline گیتلب را در اختیار Claude Code و سایر کلاینتهای MCP میگذارد. روی Streamable HTTP کار میکند و با Docker Compose اجرا میشود.
مدل احراز هویت: per-user. سرور توکن مشترک ندارد. هر کاربر Personal Access Token خودش را در هدر
X-Gitlab-Tokenمیفرستد و سرور همان توکن را برای آن درخواست استفاده میکند. بنابراین هر کامنت/approve با هویت خودِ همان کاربر ثبت میشود و همه با توکن یک نفر request نمیزنند.
- Docker و Docker Compose
- هر کاربر یک Personal Access Token از GitLab با اسکوپهای:
api(برای write مثل کامنت/approve)read_repository(برای خواندن فایلها و درخت پروژه)
ساخت توکن: در GitLab → User Settings → Access Tokens.
cp .env.example .env.env فقط مقادیر مشترک را دارد (توکن شخصی اینجا نیست):
GITLAB_URL=https://gitlab.company.com
GITLAB_SSL_VERIFY=true
MCP_PORT=8000| متغیر | توضیح |
|---|---|
GITLAB_URL |
آدرس کامل GitLab (با https) — مشترک برای همه |
GITLAB_SSL_VERIFY |
اگر گواهی self-signed داری، false |
MCP_PORT |
پورت روی هاست (پیشفرض ۸۰۰۰) |
GITLAB_TOKEN_HEADER |
اختیاری؛ نام هدر توکن (پیشفرض X-Gitlab-Token) |
توکن GitLab در env نگهداری نمیشود؛ هر کاربر آن را فقط در هدر
X-Gitlab-Tokenمیفرستد.
docker compose up --build -dاگر شبکهات به PyPI کند/فیلتر است:
docker compose build --build-arg PIP_INDEX_URL=https://mirror-pypi.runflare.com/simple/
docker compose up -ddocker compose logs -f gitlab-mcpباید چنین لاگی ببینی:
Starting MCP (per-user token via 'x-gitlab-token' header) on http://0.0.0.0:8000/mcp
در ~/.claude.json یا settings.json، توکن خودت را در هدر بگذار:
{
"mcpServers": {
"gitlab": {
"type": "http",
"url": "http://localhost:8000/mcp",
"headers": { "X-Gitlab-Token": "glpat-YOUR_OWN_TOKEN" }
}
}
}سپس Claude Code را ریاستارت کن و /mcp بزن.
اگر درخواستی بدون هدر
X-Gitlab-Tokenبیاید (وGITLAB_TOKENسروری هم خالی باشد)، پاسخ ۴۰۱ با پیام راهنما برمیگردد.
همان قالب بالا، با هدر X-Gitlab-Token در فایل تنظیمات MCP ادیتور.
| دسته | ابزار | کارش |
|---|---|---|
| Projects/Code | list_projects |
جستجو/لیست پروژهها |
get_project |
جزئیات یک پروژه | |
list_branches |
لیست برنچها | |
list_tree |
لیست فایل/دایرکتوری در یک مسیر | |
get_file |
خواندن محتوای فایل | |
search_code |
جستجوی متن در کد پروژه | |
| MRs | list_merge_requests |
لیست MRها با فیلتر state/author |
get_merge_request |
جزئیات MR | |
get_merge_request_changes |
diff کامل MR | |
list_merge_request_notes |
لیست کامنتهای MR | |
comment_merge_request |
اضافه کردن کامنت | |
approve_merge_request |
approve کردن | |
| Issues | list_issues |
لیست issueها |
get_issue |
جزئیات issue | |
comment_issue |
کامنت روی issue | |
| CI | list_pipelines |
لیست pipelineها |
get_pipeline |
جزئیات pipeline + jobها | |
get_job_log |
آخرین N خط لاگ job |
نکته دربارهی project: هر جا project میخواد، یا id عددی بده (مثل 1234) یا مسیر کامل (مثل mygroup/subgroup/myrepo).
۴۰۱ / missing GitLab token — هدر X-Gitlab-Token را در کانفیگ کلاینت نگذاشتی.
401 Unauthorized از خود GitLab — توکن نامعتبر یا منقضی شده، یا اسکوپ کافی ندارد.
SSL خطا روی گیتلب داخلی — در .env: GITLAB_SSL_VERIFY=false.
کانتینر بالا میاد ولی Claude نمیبینه — چک کن:
curl -i http://localhost:8000/mcp(بدون هدر باید ۴۰۱ بدهد = سرور بالاست).- در config آدرس درست هست؟ (پروتکل http، پسوند
/mcp). - هدر
X-Gitlab-Tokenرا گذاشتی؟
خطای PyPI/timeout موقع build — از mirror استفاده کن (بالا).
لاگهای live: docker compose logs -f gitlab-mcp
ریاستارت بعد از تغییر .env: docker compose up -d --force-recreate
اگر روی یک VM داخلی اجرا میکنی و تیم بهش وصل میشود:
- پشت یک reverse-proxy (nginx/traefik) با TLS قرارش بده (توکنها در هدر رد و بدل میشوند).
- هر عضو تیم در config خودش هدر
X-Gitlab-Tokenبا توکن خودش میگذارد.
- توکن GitLab هر کاربر هویت او را در گیتلب نشان میدهد. حالا چون per-user است، هر اکشن با هویت همان کاربر ثبت میشود (نه یک توکن مشترک).
- روی شبکهی غیرلوکال حتماً TLS بگذار تا توکنهای هدر در مسیر لو نروند.
.envرا هرگز commit نکن (در.gitignoreهست).