Zereight Gitlab
By zereightยท1,845
GitLab MCP server for projects, merge requests, issues, pipelines, wiki, releases, and more.
GitLab MCP Server
English | ํ๊ตญ์ด | ็ฎไฝไธญๆ
๐ ๋ฌธ์ โ ์ค์ ๊ฐ์ด๋, ํ๊ฒฝ ๋ณ์, ์ ์ฒด ๋๊ตฌ ๋ ํผ๋ฐ์ค๋ ํธ์คํ ๋ ๋ฌธ์ ์ฌ์ดํธ์์ ํ์ธํ ์ ์์ต๋๋ค.
@zereight/mcp-gitlab
AI ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ํฌ๊ด์ ์ธ GitLab MCP ์๋ฒ์ ๋๋ค. stdio, SSE, Streamable HTTP๋ฅผ ํตํด ํ๋ก์ ํธ, ๋จธ์ง ๋ฆฌํ์คํธ, ์ด์, ํ์ดํ๋ผ์ธ, ์ํค, ๋ฆด๋ฆฌ์ค, ๋ง์ผ์คํค ๋ฑ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
PAT, OAuth, ์ฝ๊ธฐ ์ ์ฉ ๋ชจ๋, ๋์ API URL, ์๊ฒฉ ์ธ์ฆ์ ์ง์ํ๋ฉฐ VS Code, Claude, Cursor, Copilot ๋ฐ ๊ธฐํ MCP ํด๋ผ์ด์ธํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ์ด GitLab MCP๋ฅผ ์ฌ์ฉํ๋์?
- ๋์ GitLab ์ง์ ๋ฒ์: ํ๋ก์ ํธ, ์ ์ฅ์ ํ์, ๋จธ์ง ๋ฆฌํ์คํธ, ์ด์, ํ์ดํ๋ผ์ธ, ์ํค, ๋ฆด๋ฆฌ์ค, ๋ผ๋ฒจ, ๋ง์ผ์คํค ๋ฑ
- ์ ์ฐํ ์ธ์ฆ: Personal Access Token, ๋ก์ปฌ OAuth2 ๋ธ๋ผ์ฐ์ ํ๋ก์ฐ, MCP OAuth ํ๋ก์, ์์ฒญ๋ณ ์๊ฒฉ ์ธ์ฆ
- ์ฌ๋ฌ ์ ์ก ๋ฐฉ์: ๋ก์ปฌ ํด๋ผ์ด์ธํธ์ฉ stdio, ๋ ๊ฑฐ์ ํด๋ผ์ด์ธํธ์ฉ SSE, ์ต์ ์๊ฒฉ ๋ฐฐํฌ์ฉ Streamable HTTP
- ํด๋ผ์ด์ธํธ ์นํ์ ์ค์ : Claude Code, Codex, Antigravity, OpenCode, Copilot, Cline, Roo Code, Cursor, Kilo Code, Amp Code ์์ ์ ๊ณต
- ์ ํ ํธ์คํ ๋์: ์ปค์คํ GitLab ์ธ์คํด์ค, ํ๋ก์ ์ค์ , ๋์ API URL ๋ผ์ฐํ ์ง์
๋น ๋ฅธ ์์: ์๋์์ Personal Access Token ๋๋ OAuth2 ์ค์ ์ค ํ๋๋ฅผ ์ ํํ๊ณ @zereight/mcp-gitlab์ ์ค์นํ ๋ค MCP ํด๋ผ์ด์ธํธ ์ค์ ์์ zereight-mcp-gitlab์ ์ฌ์ฉํ์ธ์.
ํด๋ผ์ด์ธํธ ์ค์ ๊ฐ์ด๋
- Claude Code ์ค์ ๊ฐ์ด๋
- VS Code ์ค์ ๊ฐ์ด๋
- GitHub Copilot ์ค์ ๊ฐ์ด๋
- Codex ์ค์ ๊ฐ์ด๋
- Cursor ์ค์ ๊ฐ์ด๋
- JSON ๊ธฐ๋ฐ MCP ํด๋ผ์ด์ธํธ ์ค์ ๊ฐ์ด๋ - Factory AI Droid, OpenClaw, OpenCode ์คํ์ผ ํด๋ผ์ด์ธํธ์ฉ
- OAuth2 ์ธ์ฆ ์ค์ ๊ฐ์ด๋
- ํ๊ฒฝ ๋ณ์ ๋ ํผ๋ฐ์ค
- Stateless Mode โ ๋ฉํฐ Pod HPA
- ์ปค์คํ ์์ด์ ํธ ๋ฐ ๋ค์ค PAT ์ค์
์ฌ์ฉ๋ฒ
์ค์ ๊ฐ์
์ธ์ฆ ๋ฐฉ์
์ด ์๋ฒ๋ ๋ค ๊ฐ์ง ์ธ์ฆ ๋ฐฉ์์ ์ง์ํฉ๋๋ค.
๋ก์ปฌ/๋ฐ์คํฌํฑ ์ฌ์ฉ(๊ฐ์ฅ ์ผ๋ฐ์ ):
- Personal Access Token (
GITLAB_PERSONAL_ACCESS_TOKEN) โ ๊ฐ์ฅ ๋จ์ํ ์ค์ - OAuth2 โ ๋ก์ปฌ ๋ธ๋ผ์ฐ์ (
GITLAB_USE_OAUTH) โ ๋ ๋์ ๋ณด์์ ์ํด ๊ถ์ฅ
์๋ฒ/์๊ฒฉ ๋ฐฐํฌ:
- OAuth2 โ MCP ํ๋ก์ (
GITLAB_MCP_OAUTH) โ Claude.ai ๊ฐ์ ์๊ฒฉ MCP ํด๋ผ์ด์ธํธ์ฉ - ์๊ฒฉ ์ธ์ฆ (
REMOTE_AUTHORIZATION) โ ๊ฐ ํธ์ถ์๊ฐ ์์ ์ ํ ํฐ์ ์ ๊ณตํ๋ ๋ฉํฐ ์ ์ ๋ฐฐํฌ์ฉ
๋น ๋ฅธ ์ค์ ๊ฒฝ๋ก
- Claude Code: Claude Code ์ค์ ๊ฐ์ด๋
- VS Code: VS Code ์ค์ ๊ฐ์ด๋
- GitHub Copilot: GitHub Copilot ์ค์ ๊ฐ์ด๋
- Codex: Codex ์ค์ ๊ฐ์ด๋
- Cursor: Cursor ์ค์ ๊ฐ์ด๋
- Factory AI Droid / OpenClaw / OpenCode ์คํ์ผ ํด๋ผ์ด์ธํธ: JSON ๊ธฐ๋ฐ MCP ํด๋ผ์ด์ธํธ ์ค์ ๊ฐ์ด๋
- OAuth ๋ธ๋ผ์ฐ์ ํ๋ก์ฐ ์์ธ: OAuth2 ์ธ์ฆ ์ค์ ๊ฐ์ด๋
๊ฐ์ฅ ๋จ์ํ ๋ก์ปฌ ์ค์ ์ Personal Access Token์ผ๋ก ์์ํ์ธ์. ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ๋ก์ปฌ ์ธ์ฆ์ OAuth2๋ฅผ ์ฌ์ฉํ์ธ์. ์๊ฒฉ ๋๋ ๋ฉํฐ ์ ์ ๋ฐฐํฌ๋ ์๋ MCP OAuth ๋ฐ ์๊ฒฉ ์ธ์ฆ ์น์ ์ ์ฐธ๊ณ ํ์ธ์.
์๋ฒ๋ฅผ ํ ๋ฒ ์ค์นํ์ธ์.
brew tap zereight/gitlab-mcp https://github.com/zereight/gitlab-mcp
brew install zereight/gitlab-mcp/zereight-mcp-gitlabnpm์ผ๋ก ์ค์นํ ์๋ ์์ต๋๋ค:
npm install -g @zereight/mcp-gitlab์์๋ ๊ธฐ์กด mcp-gitlab๋ณด๋ค ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ zereight-mcp-gitlab ๋ณ์นญ์ ์ฌ์ฉํฉ๋๋ค. MCP ํด๋ผ์ด์ธํธ๊ฐ ์ฐพ์ง ๋ชปํ๋ฉด which zereight-mcp-gitlab์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ์ธ์.
์ ์ญ ์ค์น๋ฅผ ์ฐ์ง ์์ผ๋ ค๋ฉด npx -y @zereight/mcp-gitlab@2.1.42์ฒ๋ผ ์ง์ ์์ ๋ฒ์ (๋ฌธ์๊ฐ ๊ถ์ฅํ๋ ๋ฒ์ )์ผ๋ก ๊ณ ์ ํ์ธ์. ํญ์ ์ต์ ๋ฒ์ ์ ์ํ๋ฉด npx -y @zereight/mcp-gitlab@latest๋ฅผ ์ฌ์ฉํ์ธ์. ์ ๋ฒ์ ์ด ๋์ค๋ฉด ์๋ฒ๊ฐ ์์ ์ stderr๋ก ์๋ ค์ค๋๋ค(GITLAB_DISABLE_VERSION_CHECK=true๋ก ๋นํ์ฑํ ๊ฐ๋ฅ).
CLI ์ธ์ ์ฌ์ฉํ๊ธฐ(ํ๊ฒฝ ๋ณ์ ๋ฌธ์ ๊ฐ ์๋ ํด๋ผ์ด์ธํธ์ฉ)
์ผ๋ถ MCP ํด๋ผ์ด์ธํธ(์: GitHub Copilot CLI)๋ ํ๊ฒฝ ๋ณ์ ์ฒ๋ฆฌ์ ๋ฌธ์ ๊ฐ ์์ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ CLI ์ธ์๋ฅผ ์ฌ์ฉํ์ธ์.
{
"mcpServers": {
"gitlab": {
"command": "zereight-mcp-gitlab",
"args": ["--token=YOUR_GITLAB_TOKEN", "--api-url=https://gitlab.com/api/v4"],
"tools": ["*"]
}
}
}์ฌ์ฉ ๊ฐ๋ฅํ CLI ์ธ์:
--token- GitLab Personal Access Token (GITLAB_PERSONAL_ACCESS_TOKEN๋์ฒด)--api-url- GitLab API URL (GITLAB_API_URL๋์ฒด)--read-only=true- ์ฝ๊ธฐ ์ ์ฉ ๋ชจ๋ ํ์ฑํ (GITLAB_READ_ONLY_MODE๋์ฒด, deprecated โ--permission-mode=readonly๊ถ์ฅ)--permission-mode- ๊ถํ ์์ค:readonly,modify(์ญ์ ๋๊ตฌ ๋นํ์ฑ),full(GITLAB_PERMISSION_MODE๋์ฒด, ๊ธฐ๋ณธ๊ฐfull)--use-wiki=true- ์ํค API ํ์ฑํ (USE_GITLAB_WIKI๋์ฒด, ๋ ๊ฑฐ์ โGITLAB_TOOLSETS=wiki๊ถ์ฅ)--use-milestone=true- ๋ง์ผ์คํค API ํ์ฑํ (USE_MILESTONE๋์ฒด, ๋ ๊ฑฐ์ โGITLAB_TOOLSETS=milestones๊ถ์ฅ)--use-pipeline=true- ํ์ดํ๋ผ์ธ API ํ์ฑํ (USE_PIPELINE๋์ฒด, ๋ ๊ฑฐ์ โGITLAB_TOOLSETS=pipelines๊ถ์ฅ)--disable-version-check=true- ์์ ์ ์ ๊ท ๋ฒ์ ์๋ฆผ ๋นํ์ฑํ (GITLAB_DISABLE_VERSION_CHECK๋์ฒด)
CLI ์ธ์๋ ํ๊ฒฝ ๋ณ์๋ณด๋ค ์ฐ์ ํฉ๋๋ค.
์ธ๋ฐํ ๋๊ตฌ ํํฐ๋ง:
GITLAB_PERMISSION_MODE=modify๋ก ์์ฑ/์์ ์ ํ์ฉํ๊ณ ๋ชจ๋ ์ญ์ ๋๊ตฌ๋ฅผ
์ฐจ๋จํ๊ฑฐ๋,GITLAB_PERMISSION_MODE=readonly๋ก ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ด์ํ ์ ์์ต๋๋ค. ๋ํ
GITLAB_TOOLSETS=<group,โฆ>๋ก ๋๊ตฌ ๊ทธ๋ฃน์ ํ์ฑํํ๊ณ ,GITLAB_TOOLS=<tool,โฆ>๋ก ๊ฐ๋ณ ๋๊ตฌ๋ง
ํ์ฉํ๋ฉฐ(์: ์ฝ๊ธฐ ๋๊ตฌ + ํน์ ์ฐ๊ธฐ ๋๊ตฌ ๋ช ๊ฐ),GITLAB_DENIED_TOOLS_REGEX๋ก ํจํด ์ฐจ๋จํ ์
์์ต๋๋ค. ๋ ๊ฑฐ์USE_GITLAB_WIKI/USE_MILESTONE/USE_PIPELINEํ๋๊ทธ๋ ํ์ ํธํ์ฉ์ผ๋ก๋ง
์ ์ง๋ฉ๋๋ค. Tools Reference์
Environment Variables๋ฅผ ์ฐธ๊ณ ํ์ธ์.
SSE
docker run -i --rm \
-e HOST=0.0.0.0 \
-e GITLAB_PERSONAL_ACCESS_TOKEN=your_gitlab_token \
-e GITLAB_API_URL="https://gitlab.com/api/v4" \
-e GITLAB_PERMISSION_MODE=readonly \
-e GITLAB_TOOLSETS=wiki,milestones,pipelines \
-e SSE=true \
-e SSE_AUTH_TOKEN=your_mcp_sse_token \
-p 3333:3002 \
zereight050/gitlab-mcp{
"mcpServers": {
"gitlab": {
"type": "sse",
"url": "http://localhost:3333/sse",
"headers": {
"Authorization": "Bearer your_mcp_sse_token"
}
}
}
}Streamable HTTP
docker run -i --rm \
-e HOST=0.0.0.0 \
-e REMOTE_AUTHORIZATION=true \
-e GITLAB_API_URL="https://gitlab.com/api/v4" \
-e GITLAB_PERMISSION_MODE=readonly \
-e GITLAB_TOOLSETS=wiki,milestones,pipelines \
-e STREAMABLE_HTTP=true \
-p 3333:3002 \
zereight050/gitlab-mcp{
"mcpServers": {
"gitlab": {
"type": "streamable-http",
"url": "http://localhost:3333/mcp",
"headers": {
"Authorization": "Bearer glpat-..."
}
}
}
}MCP OAuth ํ๋ก์ ์ฌ์ฉํ๊ธฐ(GITLAB_MCP_OAUTH)
์๋ฒ/์๊ฒฉ ๋ฐฐํฌ ์ ์ฉ์ ๋๋ค. ์ด ๋ชจ๋๋ ๊ณต๊ฐ ์ ๊ทผ ๊ฐ๋ฅํ HTTPS URL๋ก MCP ์๋ฒ๋ฅผ ๋ฐฐํฌํด์ผ ํฉ๋๋ค. ๋ก์ปฌ/๋ฐ์คํฌํฑ ์ฌ์ฉ์
GITLAB_USE_OAUTH๋ฅผ ์ฌ์ฉํ์ธ์.
MCP OAuth ์ฌ์์ ์ง์ํ๋ ์๊ฒฉ MCP ํด๋ผ์ด์ธํธ(์: Claude.ai)์ฉ์
๋๋ค. ์๋ฒ๋ ์์ ํ OAuth 2.0 ์ธ์ฆ ์๋ฒ๋ก ๋์ํฉ๋๋ค. ์ธ์ฆ๋์ง ์์ ์์ฒญ์ 401 + WWW-Authenticate ์๋ต์ ๋ฐ๊ณ , ํด๋ผ์ด์ธํธ ์ธก OAuth ๋ธ๋ผ์ฐ์ ํ๋ก์ฐ๊ฐ ์๋์ผ๋ก ์์๋ฉ๋๋ค.
OpenCode, MCPJam, Claude.ai ๊ฐ์ ์๊ฒฉ MCP ํด๋ผ์ด์ธํธ๋ ์ธ์ฆ ์ค์ ์์ฒด callback URL์ ๋ณด๋ผ ์ ์์ต๋๋ค. ๋ชจ๋ ํด๋ผ์ด์ธํธ callback URL์ GitLab์ ๋ฑ๋กํ ์ ์๋ค๋ฉด GITLAB_OAUTH_CALLBACK_PROXY=true๋ฅผ ์ผ์ธ์. ์ฝ๋ฐฑ ํ๋ก์ ๋ชจ๋์์๋ GitLab์ {MCP_SERVER_URL}/callback ํ๋๋ง Redirect URI๋ก ๋ฑ๋กํ๋ฉด ๋ฉ๋๋ค.
GITLAB_OAUTH_REDIRECT_URI๋ ๋ก์ปฌ OAuth(GITLAB_USE_OAUTH) ์ ์ฉ์
๋๋ค. ์๊ฒฉ MCP OAuth ํด๋ผ์ด์ธํธ callback URL์ ๋ฎ์ด์ฐ์ง ์์ผ๋ฉฐ, ์๊ฒฉ Unregistered redirect_uri ์ค๋ฅ ํด๊ฒฐ์ฉ์ผ๋ก ์ฌ์ฉํ๋ฉด ์ ๋ฉ๋๋ค.
์ด ๋ณ์๊ฐ ์กด์ฌํ๋ ์ด์ ๋ ๋ก์ปฌ OAuth ํ๋ก์ฐ๊ฐ MCP ์๋ฒ์ ๊ฐ์ ๋จธ์ ์์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด๊ณ , http://127.0.0.1:8888/callback ๊ฐ์ ๋ก์ปฌ HTTP ์๋ฒ๋ก callback์ ๋ฐ๊ธฐ ๋๋ฌธ์
๋๋ค.
์๊ฒฉ MCP OAuth๋ ๋ค๋ฆ
๋๋ค. GITLAB_MCP_OAUTH=true ๋ชจ๋์์๋ MCP ํด๋ผ์ด์ธํธ๊ฐ /authorize ์์ฒญ ์ค์ ์์ฒด callback URL์ ์ ๊ณตํฉ๋๋ค. GITLAB_OAUTH_REDIRECT_URI๋ ๊ทธ ํด๋ผ์ด์ธํธ ์ ๊ณต URL์ ๋์ฒดํ์ง ์์ต๋๋ค.
| ๋ชจ๋ | ํ์ฑํ ๋ณ์ | Callback ๋ณ์ | GitLab Redirect URI |
|---|---|---|---|
| ๋ก์ปฌ OAuth | GITLAB_USE_OAUTH=true |
GITLAB_OAUTH_REDIRECT_URI |
http://127.0.0.1:8888/callback ๋๋ ๋ก์ปฌ callback |
| ์๊ฒฉ MCP OAuth | GITLAB_MCP_OAUTH=true |
GITLAB_OAUTH_CALLBACK_PROXY=true |
{MCP_SERVER_URL}/callback |
MCP ์๋ฒ๊ฐ ์ง์ ๋ก์ปฌ ๋ธ๋ผ์ฐ์ callback์ ๋ฐ์ ๋๋ง GITLAB_OAUTH_REDIRECT_URI๋ฅผ ์ฌ์ฉํ์ธ์. ์๊ฒฉ MCP ํด๋ผ์ด์ธํธ๊ฐ callback URL์ ์์ ํ๋ ๊ฒฝ์ฐ์๋ GITLAB_OAUTH_CALLBACK_PROXY=true๋ฅผ ์ฌ์ฉํ์ธ์.
๋์ ๋ฐฉ์: ๊ณต๊ฐ HTTPS URL์ ๊ฐ์ง ์์น์ ์ด MCP ์๋ฒ๋ฅผ ๋ฐฐํฌํฉ๋๋ค. MCP ํด๋ผ์ด์ธํธ๋ {MCP_SERVER_URL}/mcp๋ก ์ฐ๊ฒฐํฉ๋๋ค. ์๋ฒ๋ OAuth 2.0 ํ๋ก์ฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ GitLab๊ณผ ์๊ฒฉ ์ฆ๋ช
์ ๊ตํํฉ๋๋ค.
์ฌ์ ์ค๋น:
- ๊ณต๊ฐ ์ ๊ทผ ๊ฐ๋ฅํ HTTPS ์๋ฒ URL (
MCP_SERVER_URL) โ ๋ก์ปฌ ํ ์คํธ์๋ ngrok์ ์ฌ์ฉํ ์ ์์ต๋๋ค. api๋๋read_apiscope๊ฐ ์๋ ์ฌ์ ๋ฑ๋ก GitLab OAuth ์ ํ๋ฆฌ์ผ์ด์
โAdmin areaโApplications์์ Redirect URI๋ฅผ{MCP_SERVER_URL}/callback์ผ๋ก ์ค์ ํ์ธ์.
| ํ๊ฒฝ ๋ณ์ | ํ์ | ์ค๋ช |
|---|---|---|
GITLAB_MCP_OAUTH |
์ | ํ์ฑํํ๋ ค๋ฉด true |
GITLAB_API_URL |
์ | GitLab API base URL |
GITLAB_OAUTH_APP_ID |
์ | GitLab OAuth Application ID |
MCP_SERVER_URL |
์ | ์ด MCP ์๋ฒ์ ๊ณต๊ฐ HTTPS URL |
STREAMABLE_HTTP |
์ | ๋ฐ๋์ true |
GITLAB_OAUTH_CALLBACK_PROXY |
์ ํ | MCP ์๋ฒ์ ๊ณ ์ /callback URL์ ์ฌ์ฉํ๋ ค๋ฉด true |
GITLAB_OAUTH_SCOPES |
์ ํ | ์ผํ๋ก ๊ตฌ๋ถ๋ scope ๋ชฉ๋ก(๊ธฐ๋ณธ๊ฐ: api,read_api,read_user) |
GITLAB_OAUTH_ALLOWED_GROUPS |
์ ํ | ์ผํ๋ก ๊ตฌ๋ถ๋ GitLab ๊ทธ๋ฃน ์ ์ฒด ๊ฒฝ๋ก โ ํด๋น ๊ทธ๋ฃน ๋ฐ ํ์ ๊ทธ๋ฃน ๋ฉค๋ฒ๋ง ํ ํฐ์ ๋ฐ๊ธ๋ฐ์ ์ ์์ (๊ธฐ์กด GITLAB_ALLOWED_GROUPS ๋์ฒด) |
STREAMABLE_HTTP=true์ผ ๋ ์๋ฒ ์ธก GitLab ์๊ฒฉ ์ฆ๋ช
(GITLAB_PERSONAL_ACCESS_TOKEN, GITLAB_JOB_TOKEN, GITLAB_AUTH_COOKIE_PATH, ๋๋ GITLAB_USE_OAUTH)์ REMOTE_AUTHORIZATION=true, GITLAB_MCP_OAUTH=true, ๋๋ STREAMABLE_HTTP_AUTH_TOKEN์ด ํ์ํฉ๋๋ค.
Unregistered redirect_uri๋ฌธ์ ํด๊ฒฐ๋ธ๋ผ์ฐ์ URL์
redirect_uri๋ฅผ ํ์ธํ์ธ์. ๊ฐ์ดhttp://127.0.0.1:xxxxx/.../callback๊ฐ์ ํด๋ผ์ด์ธํธ callback์ ๊ฐ๋ฆฌํค๋ฉด ๋ค์ ์ค์ ์ ์ผ์ธ์.GITLAB_OAUTH_CALLBACK_PROXY=true์๊ฒฉ MCP OAuth ๋ฌธ์ ๋ฅผ
GITLAB_OAUTH_REDIRECT_URI๋ณ๊ฒฝ์ผ๋ก ํด๊ฒฐํ๋ ค๊ณ ํ์ง ๋ง์ธ์. ์ด ๋ณ์๋ ๋ก์ปฌ OAuth(GITLAB_USE_OAUTH) ์ ์ฉ์ ๋๋ค.
docker run -i --rm \
-e HOST=0.0.0.0 \
-e GITLAB_MCP_OAUTH=true \
-e GITLAB_OAUTH_CALLBACK_PROXY=true \
-e STREAMABLE_HTTP=true \
-e MCP_SERVER_URL=https://your-server.example.com \
-e GITLAB_API_URL="https://gitlab.com/api/v4" \
-e GITLAB_OAUTH_APP_ID=your_app_id \
-p 3000:3002 \
zereight050/gitlab-mcpMCP ํด๋ผ์ด์ธํธ ์ค์ :
{
"mcpServers": {
"gitlab": {
"type": "http",
"url": "https://your-server.example.com/mcp"
}
}
}์๊ฒฉ ์ธ์ฆ ์ฌ์ฉํ๊ธฐ(REMOTE_AUTHORIZATION)
์๋ฒ/์๊ฒฉ ๋ฐฐํฌ ์ ์ฉ์ ๋๋ค. ๊ฐ HTTP ํธ์ถ์๊ฐ ์์ฒญ ํค๋์ ์์ ์ GitLab ํ ํฐ์ ์ง์ ์ ๊ณตํฉ๋๋ค. OAuth ํ๋ก์ฐ๋ ์ฌ์ฉํ์ง ์์ต๋๋ค.
๊ฐ ํธ์ถ์๊ฐ HTTP ์์ฒญ ํค๋์ ์์ ์ GitLab ํ ํฐ์ ์ ๊ณตํ๋ ๋ฉํฐ ์ ์ ๋๋ ๋ฉํฐ ํ ๋ํธ ๋ฐฐํฌ์ฉ์ ๋๋ค. MCP ์๋ฒ๋ ํธ์ถ์๋ฅผ ๋์ ํด ํ ํฐ์ GitLab์ผ๋ก ์ ๋ฌํฉ๋๋ค.
ํค๋ ์ฐ์ ์์: Private-Token > JOB-TOKEN > Authorization: Bearer
| ํ๊ฒฝ ๋ณ์ | ํ์ | ์ค๋ช |
|---|---|---|
REMOTE_AUTHORIZATION |
์ | ํ์ฑํํ๋ ค๋ฉด true |
STREAMABLE_HTTP |
์ | ๋ฐ๋์ true |
ENABLE_DYNAMIC_API_URL |
์ ํ | ์์ฒญ๋ณ X-GitLab-API-URL ํค๋ ํ์ฉ |
GITLAB_ALLOWED_HOSTS |
์ ํ | ํ์ฉํ X-GitLab-API-URL ํธ์คํธ์ ์ผํ ๊ตฌ๋ถ ๋ชฉ๋ก; GITLAB_API_URL ํธ์คํธ๋ ํญ์ ํ์ฉ |
GITLAB_ALLOW_UNAUTHENTICATED_TOOL_DISCOVERY |
์ ํ | ์ธ์ฆ ์์ด initialize, notifications/initialized, tools/list๋ง ํ์ฉ(๋๊ตฌ ํธ์ถ์ ์ฌ์ ํ ์ธ์ฆ ํ์) |
MCP_SERVER_URL / MCP_ALLOWED_HOSTS / MCP_ALLOWED_ORIGINS |
์ ํ | DNS rebinding ๋ฐฉ์ง๋ฅผ ์ํ ํ์ฉ /mcp ํธ์คํธ/์ค๋ฆฌ์ง ๊ฐ |
MCP_TRUST_PROXY |
์ ํ | ๋ฆฌ๋ฒ์ค ํ๋ก์ ๋ค์์ Forwarded / X-Forwarded-* ํค๋ ์ ๋ขฐ(๋ค์ด๋ก๋ URL, Express req.ip, /mcp IP rate limit, OAuth rate limit) |
GITLAB_ALLOW_UNAUTHENTICATED_TOOL_DISCOVERY=true๋ ์ฌ์ฉ์๊ฐ GitLab ํ ํฐ์ ์ ๊ณตํ๊ธฐ ์ ์ ๋๊ตฌ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์กฐํํด์ผ ํ๋ MCP ๊ฒ์ดํธ์จ์ด๋ ๊ด๋ฆฌ UI์ฉ์
๋๋ค. ๋ฐฐํฌ ํ๊ฒฝ์์ ๋๊ตฌ ๋ชฉ๋ก ๊ณต๊ฐ๊ฐ ์์ ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ๋นํ์ฑํํ์ธ์.
MCP_SERVER_URL์ด ์ค์ ๋์ง ์์ผ๋ฉด ์๊ฒฉ ๋ค์ด๋ก๋ URL์ ๋ก์ปฌ ์๋ฒ ์ฃผ์๋ก ๋์ฒด๋ฉ๋๋ค. MCP_TRUST_PROXY=true๋ ์๋ฒ๊ฐ ์ ๋ขฐํ ์ ์๋ ๋ฆฌ๋ฒ์ค ํ๋ก์๋ฅผ ํตํด์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๊ณ MCP ์๋ฒ์ ๋ํ ์ง์ ํด๋ผ์ด์ธํธ ์ ๊ทผ์ด ์ฐจ๋จ๋ ๊ฒฝ์ฐ์๋ง ์ค์ ํ์ธ์. ์ด ์ค์ ์ Streamable HTTP ๋ฐ SSE์ฉ Express trust proxy๋ฅผ ํ์ฑํํ๊ณ , Forwarded / X-Forwarded-Proto / X-Forwarded-Host / X-Forwarded-Prefix์์ ๊ณต๊ฐ ๋ค์ด๋ก๋ URL์ ํ์ํ๋ฉฐ, ํ๋ก์๊ฐ X-Forwarded-For์ ํด๋ผ์ด์ธํธ ํฌํธ๋ฅผ ํฌํจํด ๋ณด๋ผ ๋(์: 1.2.3.4:5678) OAuth ์๋ํฌ์ธํธ rate limiting์ด ๋์ํ๋๋ก ์ ์งํฉ๋๋ค. ์ด ํ๋๊ทธ ๋์
์ดํ ๊ธฐ์กด OAuth+ํ๋ก์ ๋ฐฐํฌ๋ ๋ช
์์ ์ผ๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
์์ ์์ฒญ ํค๋:
Private-Token: glpat-xxxxxxxxxxxxxxxxxxxx๋๋ Bearer ํ ํฐ ์ฌ์ฉ:
Authorization: Bearer glpat-xxxxxxxxxxxxxxxxxxxx
โ ๏ธ REMOTE_AUTHORIZATION์ SSE ์ ์ก๊ณผ ํธํ๋์ง ์์ต๋๋ค.STREAMABLE_HTTP=true๊ฐ ํ์ํฉ๋๋ค.
ํ๊ฒฝ ๋ณ์
์ ์ฒด ํ๊ฒฝ ๋ณ์ ๋ชฉ๋ก์ ์ ์ฉ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๋๋ถ๋ถ์ ์ฌ์ฉ์๋ ์๋ ์์ ์กฐํฉ ์ค ํ๋๋ง ํ์ํฉ๋๋ค.
- ๋ก์ปฌ PAT:
GITLAB_PERSONAL_ACCESS_TOKEN,GITLAB_API_URL - ๋ก์ปฌ OAuth:
GITLAB_USE_OAUTH=true,GITLAB_OAUTH_CLIENT_ID,GITLAB_OAUTH_REDIRECT_URI,GITLAB_API_URL - ์๊ฒฉ ๋ฉํฐ ์ ์ HTTP:
STREAMABLE_HTTP=true,REMOTE_AUTHORIZATION=true(๋๋GITLAB_MCP_OAUTH=true),MCP_TRUST_PROXY=true(๋ฆฌ๋ฒ์ค ํ๋ก์ ๋ค),MAX_REQUESTS_PER_MINUTE=300,MCP_SERVER_URL๋๋MCP_ALLOWED_HOSTS,HOST,PORT - ์ฌ๋ฌ ๋ฐฐํฌ๋ฅผ ๋์์ ์ด์: ๋ฐฐํฌ๋ง๋ค
MCP_SERVER_NAME์ ๋ค๋ฅด๊ฒ ์ค์ (์:gitlab-selfhosted-readonly)ํ๋ฉด ํด๋ผ์ด์ธํธ, ๋ก๊ทธ, ํ ๋ ๋ฉํธ๋ฆฌ์์ ์๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค - ๋ฉํฐ Pod HPA (stateless): ์ ์ค์ +
OAUTH_STATELESS_MODE=true,OAUTH_STATELESS_SECRET(๋ชจ๋ Pod์์ ๋์ผ). Stateless Mode ์ฐธ๊ณ .
์์ฃผ ์ฐธ์กฐํ๋ ๋ณ์:
GITLAB_API_URLGITLAB_PERSONAL_ACCESS_TOKENGITLAB_USE_OAUTHREMOTE_AUTHORIZATIONMCP_TRUST_PROXYMAX_REQUESTS_PER_MINUTEMAX_SESSIONSMCP_ALLOWED_HOSTSMCP_ALLOWED_ORIGINSGITLAB_MCP_OAUTHGITLAB_OAUTH_CALLBACK_PROXYOAUTH_STATELESS_MODEOAUTH_STATELESS_SECRET
๋ ํผ๋ฐ์ค ๋ฌธ์๋ ๋ค์ ๋ด์ฉ๋ ๋ค๋ฃน๋๋ค.
- ์ธ์ฆ ๋ฐ OAuth ๋ณ์
- MCP OAuth ํ๋ก์ ๋ณ์
- ํ๋ก์ ํธ ๋ฐ ๋๊ตฌ ํํฐ๋ง ๋ณ์
discover_tools๋ฅผ ํตํ ๋์ ๋๊ตฌ ํ์(์จ๋๋งจ๋ ๋๊ตฌ์ ํ์ฑํ)- ์ ์ก ๋ฐ ์ธ์ ๋ณ์
- ํ๋ก์ ๋ฐ TLS ๋ณ์
์ฝ๋ฐฑ ํ๋ก์ ๋ชจ๋ ์์ธ๋ GitLab MCP OAuth Callback Proxy๋ฅผ ์ฐธ๊ณ ํ์ธ์.
์๊ฒฉ ์ธ์ฆ ์ค์ (๋ฉํฐ ์ ์ ์ง์)
REMOTE_AUTHORIZATION=true๋ฅผ ์ฌ์ฉํ๋ฉด MCP ์๋ฒ๋ ์ฌ๋ฌ ์ฌ์ฉ์๋ฅผ ์ง์ํ ์ ์์ต๋๋ค. ๊ฐ ์ฌ์ฉ์๋ HTTP ํค๋๋ก ์์ ์ GitLab ํ ํฐ์ ์ ๋ฌํฉ๋๋ค. ๋ค์ ๊ฒฝ์ฐ ์ ์ฉํฉ๋๋ค.
- ๊ฐ ์ฌ์ฉ์์๊ฒ ์์ ์ GitLab ์ ๊ทผ ๊ถํ์ด ํ์ํ ๊ณต์ MCP ์๋ฒ ์ธ์คํด์ค
- ์ฌ์ฉ์๋ณ ํ ํฐ์ MCP ์์ฒญ์ ์ฃผ์ ํ ์ ์๋ IDE ํตํฉ
์ค์ ์์:
docker run -d \
-e HOST=0.0.0.0 \
-e STREAMABLE_HTTP=true \
-e REMOTE_AUTHORIZATION=true \
-e GITLAB_API_URL="https://gitlab.com/api/v4" \
-e GITLAB_PERMISSION_MODE=readonly \
-e SESSION_TIMEOUT_SECONDS=3600 \
-p 3333:3002 \
zereight050/gitlab-mcpํด๋ผ์ด์ธํธ ์ค์ :
IDE ๋๋ MCP ํด๋ผ์ด์ธํธ๋ ๊ฐ ์์ฒญ์ ์๋ ํค๋ ์ค ํ๋๋ฅผ ๋ณด๋ด์ผ ํฉ๋๋ค.
Authorization: Bearer glpat-xxxxxxxxxxxxxxxxxxxx๋๋
Private-Token: glpat-xxxxxxxxxxxxxxxxxxxxํ ํฐ์ ์ธ์
๋ณ๋ก ์ ์ฅ๋ฉ๋๋ค(mcp-session-id ํค๋๋ก ์๋ณ). ๊ฐ์ ์ธ์
์ ํ์ ์์ฒญ์์ ์ฌ์ฌ์ฉ๋ฉ๋๋ค.
Cursor ์๊ฒฉ ์ธ์ฆ ํด๋ผ์ด์ธํธ ์ค์ ์์
{
"mcpServers": {
"GitLab": {
"url": "http(s)://<your_mcp_gitlab_server>/mcp",
"headers": {
"Authorization": "Bearer glpat-..."
}
}
}
}์ค์ ์ฌํญ:
- ์๊ฒฉ ์ธ์ฆ์ Streamable HTTP ์ ์ก์์๋ง ๋์ํฉ๋๋ค.
- ๊ฐ ์ธ์ ์ ๊ฒฉ๋ฆฌ๋ฉ๋๋ค. ํ ์ธ์ ์ ํ ํฐ์ ๋ค๋ฅธ ์ธ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ธ์ ์ด ์ข ๋ฃ๋๋ฉด ํ ํฐ์ ์๋์ผ๋ก ์ ๋ฆฌ๋ฉ๋๋ค.
- ์ธ์
ํ์์์: ์ธ์ฆ ํ ํฐ์
SESSION_TIMEOUT_SECONDS(๊ธฐ๋ณธ 1์๊ฐ) ๋์ ๋นํ์ฑ ์ํ๊ฐ ์ง์๋๋ฉด ๋ง๋ฃ๋ฉ๋๋ค. ๋ง๋ฃ ํ ํด๋ผ์ด์ธํธ๋ ์ธ์ฆ ํค๋๋ฅผ ๋ค์ ๋ณด๋ด์ผ ํฉ๋๋ค. ์ ์ก ์ธ์ ์ ์ ์ง๋ฉ๋๋ค. - ๊ฐ ์์ฒญ์ ํด๋น ์ธ์ ์ ํ์์์ ํ์ด๋จธ๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
- Rate limiting:
/mcp์์ฒญ์ ํด๋ผ์ด์ธํธ IP๋นMAX_REQUESTS_PER_MINUTE๋ก ์ ํ๋๋ฉฐ, OAuth ๋๋ ์๊ฒฉ ์ธ์ฆ ์ฌ์ฉ ์ MCP ์ธ์ ๋น์ผ๋ก๋ ์ ํ๋ฉ๋๋ค(๊ธฐ๋ณธ 60). ์์ธํ ๋ด์ฉ์ environment-variables.md๋ฅผ ์ฐธ๊ณ ํ์ธ์. - Capacity limit: ์๋ฒ๋ ์ต๋
MAX_SESSIONS๋์ ์ธ์ ์ ํ์ฉํฉ๋๋ค(๊ธฐ๋ณธ 1000).
MCP OAuth ์ค์ (Claude.ai Native OAuth)
GITLAB_MCP_OAUTH=true๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ๊ฐ GitLab ์ธ์คํด์ค์ OAuth ํ๋ก์๋ก ๋์ํฉ๋๋ค. Claude.ai ๋ฐ MCP ์ฌ์์ ์ค์ํ๋ ํด๋ผ์ด์ธํธ๋ ๋ธ๋ผ์ฐ์ ์ธ์ฆ ํ๋ก์ฐ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์๋ Personal Access Token ๊ด๋ฆฌ๊ฐ ํ์ ์์ต๋๋ค.
์ฌ์ ์ค๋น:
์ฌ์ ๋ฑ๋ก๋ GitLab OAuth ์ ํ๋ฆฌ์ผ์ด์
์ด ํ์ํฉ๋๋ค. GitLab์ ๋์ ์ผ๋ก ๋ฑ๋ก๋ ๋ฏธ๊ฒ์ฆ ์ ํ๋ฆฌ์ผ์ด์
์ mcp scope๋ก ์ ํํ๋ฉฐ, ์ด scope๋ง์ผ๋ก๋ API ํธ์ถ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค(api ๋๋ read_api ํ์).
- GitLab ์ธ์คํด์ค โ Admin Area > Applications(์ธ์คํด์ค ์ ์ฒด) ๋๋ User Settings > Applications(๊ฐ์ธ)๋ก ์ด๋ํฉ๋๋ค.
- ์ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฑํฉ๋๋ค.
- Confidential: ์ฒดํฌ ํด์
- Scopes:
api,read_api,read_user๋๋GITLAB_OAUTH_SCOPES๋ก ์์ฒญํ scope
- ์ ์ฅ ํ Application ID๋ฅผ ๋ณต์ฌํฉ๋๋ค. ์ด ๊ฐ์ด
GITLAB_OAUTH_APP_ID์ ๋๋ค.
๋์ ๋ฐฉ์:
- ์ฌ์ฉ์๊ฐ Claude.ai์ MCP ์๋ฒ URL์ ์ถ๊ฐํฉ๋๋ค.
- Claude.ai๊ฐ
/.well-known/oauth-authorization-server๋ก OAuth ์๋ํฌ์ธํธ๋ฅผ ๋ฐ๊ฒฌํฉ๋๋ค. - Claude.ai๊ฐ Dynamic Client Registration(
POST /register)์ ์ํํฉ๋๋ค. MCP ์๋ฒ๊ฐ ๋ก์ปฌ์์ ์ฒ๋ฆฌํ๋ฉฐ ๊ฐ ํด๋ผ์ด์ธํธ์ ๊ฐ์ client ID๋ฅผ ๋ถ์ฌํฉ๋๋ค. - Claude.ai๊ฐ ์ฌ์ ๋ฑ๋ก OAuth ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํด ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ๋ฅผ GitLab ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธํฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ ์ธ์ฆํ๋ฉด GitLab์ด
https://claude.ai/api/mcp/auth_callback์ผ๋ก ๋ฆฌ๋ค์ด๋ ํธํฉ๋๋ค. - Claude.ai๊ฐ ๋ชจ๋ MCP ์์ฒญ์
Authorization: Bearer <token>์ ๋ณด๋ ๋๋ค. - ์๋ฒ๊ฐ GitLab์ผ๋ก ํ ํฐ์ ๊ฒ์ฆํ๊ณ ์ธ์ ๋ณ๋ก ์ ์ฅํฉ๋๋ค.
์๋ฒ ์ค์ :
docker run -d \
-e STREAMABLE_HTTP=true \
-e GITLAB_MCP_OAUTH=true \
-e GITLAB_OAUTH_APP_ID="your-gitlab-oauth-app-client-id" \
-e GITLAB_API_URL="https://gitlab.example.com/api/v4" \
-e MCP_SERVER_URL="https://your-mcp-server.example.com" \
-p 3002:3002 \
zereight050/gitlab-mcp๋ก์ปฌ ๊ฐ๋ฐ(HTTP ํ์ฉ):
MCP_DANGEROUSLY_ALLOW_INSECURE_ISSUER_URL=true \
STREAMABLE_HTTP=true \
GITLAB_MCP_OAUTH=true \
GITLAB_OAUTH_APP_ID=your-gitlab-oauth-app-client-id \
MCP_SERVER_URL=http://localhost:3002 \
GITLAB_API_URL=https://gitlab.com/api/v4 \
node build/index.jsClaude.ai ์ค์ :
{
"mcpServers": {
"GitLab": {
"url": "https://your-mcp-server.example.com/mcp"
}
}
}headers ํ๋๋ ํ์ ์์ต๋๋ค. Claude.ai๊ฐ OAuth๋ก ํ ํฐ์ ๊ฐ์ ธ์ต๋๋ค.
ํ๊ฒฝ ๋ณ์:
| ๋ณ์ | ํ์ | ์ค๋ช |
|---|---|---|
GITLAB_MCP_OAUTH |
์ | ํ์ฑํํ๋ ค๋ฉด true |
GITLAB_OAUTH_APP_ID |
์ | ์ฌ์ ๋ฑ๋ก GitLab OAuth ์ ํ๋ฆฌ์ผ์ด์ ์ client ID |
MCP_SERVER_URL |
์ | MCP ์๋ฒ์ ๊ณต๊ฐ HTTPS URL |
GITLAB_API_URL |
์ | GitLab ์ธ์คํด์ค API URL(์: https://gitlab.com/api/v4) |
STREAMABLE_HTTP |
์ | ๋ฐ๋์ true(SSE ๋ฏธ์ง์) |
GITLAB_OAUTH_SCOPES |
์๋์ค | ์์ฒญํ GitLab scope ๋ชฉ๋ก(์ผํ ๊ตฌ๋ถ). ๊ธฐ๋ณธ๊ฐ์ api ๋๋ GITLAB_READ_ONLY_MODE=true์ผ ๋ read_api์
๋๋ค. ์ฌ์ ๋ฑ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ํด๋น scope๊ฐ ์ค์ ๋์ด ์์ด์ผ ํฉ๋๋ค. |
MCP_DANGEROUSLY_ALLOW_INSECURE_ISSUER_URL |
์๋์ค | ๋ก์ปฌ HTTP ๊ฐ๋ฐ์์๋ง true |
์ค์ ์ฌํญ:
- MCP OAuth๋ Streamable HTTP ์ ์ก์์๋ง ๋์ํฉ๋๋ค(
SSE=true์ ํธํ๋์ง ์์). - ๊ฐ ์ฌ์ฉ์ ์ธ์ ์ ์์ฒด OAuth ํ ํฐ์ ์ ์ฅํ๋ฉฐ ์์ ํ ๊ฒฉ๋ฆฌ๋ฉ๋๋ค.
- ์ธ์
ํ์์์, rate limiting, capacity limit์
REMOTE_AUTHORIZATION๋ชจ๋์ ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค(SESSION_TIMEOUT_SECONDS,MAX_REQUESTS_PER_MINUTE,MAX_SESSIONS). - ํค๋ ์ธ์ฆ fallback:
Private-Token๋๋JOB-TOKEN์์ฒญ ํค๋๊ฐ ์์ผ๋ฉด OAuth ๊ฒ์ฆ์ ๊ฑด๋๋ฐ๊ณ raw token์ ํด๋น ์ธ์ ์ ์ง์ ์ฌ์ฉํฉ๋๋ค. ๊ฐ์ ์๋ฒ ์ธ์คํด์ค์์ OAuth ํ๋ก์ฐ์ ํจ๊ป PAT ๋ฐ CI job token์ ์ฌ์ฉํ ์ ์์ต๋๋ค.Authorization: Bearer๋ ํญ์ OAuth token์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. PAT ๊ธฐ๋ฐ ํค๋ ์ธ์ฆ์๋Private-Token์ ์ฌ์ฉํ์ธ์.
Agent Skill Files
AI ์์ด์ ํธ๊ฐ skill/instruction ๋ก๋ฉ์ ์ง์ํ๋ ๊ฒฝ์ฐ(Claude Code, GitHub Copilot, Cursor ๋ฑ), skills/gitlab-mcp/์ ๋ฏธ๋ฆฌ ์์ฑ๋ skill ํ์ผ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- SKILL.md โ ๋๊ตฌ์ ๊ฐ์, ํต์ฌ ์ํฌํ๋ก์ฐ, ํ๋ผ๋ฏธํฐ ํํธ๋ฅผ ๋ด์ ํต์ฌ ๊ฐ์ด๋
- reference/ โ ์ฝ๋ ๋ฆฌ๋ทฐ, ๋จธ์ง ๋ฆฌํ์คํธ, ์ด์, ํ์ดํ๋ผ์ธ, ์ทจ์ฝ์ ํธ๋ฆฌ์์ง์ฉ ์์ธ ์ํฌํ๋ก์ฐ ๋ฌธ์
skills CLI๋ก ์ค์น:
npx skills add zereight/gitlab-mcp --skill gitlab-mcp-skillAI ํด๋ผ์ด์ธํธ์ skill ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ฑ๋กํ๋ฉด ์ ์ฒด ListTools ์๋ต์๋ง ์์กดํ์ง ์๊ณ ๋ ์ข์ ๋๊ตฌ ์ฌ์ฉ ์ง์นจ์ ์ป์ ์ ์์ต๋๋ค.
๋๊ตฌ ๐ ๏ธ
์ ์ฒด ๋๊ตฌ ๋ชฉ๋ก์ ์์ด README์ Tools ์น์ ์ ์ฐธ๊ณ ํ์ธ์. ํ์ฌ ์๋ฒ๋ ๋จธ์ง ๋ฆฌํ์คํธ, ์ด์, ํ์ดํ๋ผ์ธ, ๋ฐฐํฌ, ํ๊ฒฝ, ์ํฐํฉํธ, ๋ง์ผ์คํค, ์ํค, ์ ์ฅ์, ๋ฆด๋ฆฌ์ค, ์ฌ์ฉ์, ์ด๋ฒคํธ, work item, ์นํ , ์ฝ๋ ๊ฒ์, CI/CD ๋ณ์, dependency proxy, ์ทจ์ฝ์ ํธ๋ฆฌ์์ง, GraphQL ์คํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
Wiki ํ์ด์ง ์ ๋ชฉ๊ณผ slug
GitLab์ wiki ํ์ด์ง ์ ๋ชฉ์์ slug(URL, /-/wikis/<slug>)๋ฅผ ๋์ถํฉ๋๋ค. ๋ฐ๋ผ์ update_wiki_page / update_group_wiki_page์ title์ ์ ๋ฌํ๋ฉด ํ์ด์ง ์ด๋ฆ์ด ๋ฐ๋๊ณ URL์ด ๋ณ๊ฒฝ๋์ด(์ค์ฒฉ ํ์ด์ง์ ๊ฒฝ์ฐ ํ์ด์ง๊ฐ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ์ด๋ํ ์๋ ์์) ๊ธฐ์กด ๋งํฌ๊ฐ ๊นจ์ง๋๋ค.
URL์ ์ ์งํ ์ฑ ํ์ ์ ๋ชฉ๋ง ๋ณ๊ฒฝํ๋ ค๋ฉด title์ ์ ๋ฌํ์ง ๋ง๊ณ , ํ์ ์ ๋ชฉ์ ํ์ด์ง ๋ด์ฉ์ YAML front matter์ ์ ์ฅํ ๋ค ๋ด์ฉ์ ์
๋ฐ์ดํธํ์ธ์:
---
title: ์ฌ์ฉ์ ์ง์ ํ์ ์ ๋ชฉ
---
ํ์ด์ง ๋ณธ๋ฌธโฆGitLab์ slug/URL์ ๊ทธ๋๋ก ์ ์งํ๊ณ UI์ front matter์ ์ ๋ชฉ์ ํ์ํฉ๋๋ค. ๋ค์ ์ฝ์ ๋๋ get_wiki_page์ render_html: true๋ฅผ ์ ๋ฌํ๋ฉด front_matter ํ๋๊ฐ ์ฑ์์ง๋๋ค โ ์ผ๋ฐ title ํ๋๋ ํญ์ slug์์ ๋์ถ๋ ๊ฐ์ ๋ฐ์ํฉ๋๋ค.
ํ ์คํธ ๐งช
ํ๋ก์ ํธ์๋ ์๊ฒฉ ์ธ์ฆ์ ํฌํจํ ํฌ๊ด์ ์ธ ํ ์คํธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
# ์ ์ฒด ํ
์คํธ ์คํ(API ๊ฒ์ฆ + ์๊ฒฉ ์ธ์ฆ)
npm test
# ์๊ฒฉ ์ธ์ฆ ํ
์คํธ๋ง ์คํ
npm run test:remote-auth
# readonly MCP ํ
์คํธ๋ฅผ ํฌํจํ ์ ์ฒด ํ
์คํธ ์คํ
npm run test:all
# API ๊ฒ์ฆ๋ง ์คํ
npm run test:integration๋ชจ๋ ์๊ฒฉ ์ธ์ฆ ํ ์คํธ๋ mock GitLab ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์ค์ GitLab ์๊ฒฉ ์ฆ๋ช ์ด ํ์ํ์ง ์์ต๋๋ค.
