gitlab-mcp について
gitlab-mcpは、gitlab.comのプロジェクトで作業する人向けのstdioサーバーで、Issue、マージリクエスト、コードレビュー、リポジトリ、CIを扱います。非信頼コンテンツの境界、書き込み操作の制限、OSキーチェーンを使ったOAuthログインを備えています。
主な機能
- 01Issueとマージリクエスト用ツール
- 02コードレビューとディスカッション管理
- 03リポジトリ、ブランチ、コミット操作
- 04CIパイプラインとジョブの確認
- 05OSキーチェーンに保存するOAuthログイン
- 06非信頼コンテンツの境界とツール登録制御
活用シーン
- 01プロジェクトのIssueを検索・更新
- 02マージリクエストの差分を確認しコメントを送信
- 03パイプラインのジョブ、ログ、テスト結果を確認
- 04プロジェクトのブランチやコミットを管理
MCP 対応
stdioで動作し、GitLabのプロジェクト操作をMCPツールとして公開します。Issue、マージリクエスト、ジョブログ向けのリソースも提供し、サーバー設定またはClaude Desktopバンドルから接続できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
gitlab-mcp
gitlab.com 向けの MCP サーバーです。stdio 経由で動作する単一のバイナリで、あなたとしてサインインします。 プロジェクト内のイシュー、マージリクエスト、レビュー、リポジトリ、CI に対応しています。インスタンスとグループの管理、ランナー、CI 変数、トークンは対象外です。
非公式であり、GitLab Inc. とは提携していません。NOTICE をご覧ください。
他との違い
- 登録によって制御される、必要最小限の機能群。 API の単なるミラーではなく、ツールは約 60 個です。無効にしたツールは登録されないため、呼び出すことはできません。
- 書き込み操作でクイックアクションが実行されることはありません。 コメント内の
/mergeは拒否またはエスケープされ、実行されることはありません。 - コンテンツは信頼できないものとしてマークされます。 イシュー、レビュー、ファイル、ジョブログは、コンテンツで閉じられない境界内で返されます。
- デスクトップアプリのようにサインインします。 独自の OAuth アプリケーションを使い、ブラウザーのタブを開いて、トークンを OS のキーリングに保存します。
- 検証可能なリリース。 署名付きチェックサム、ビルドの来歴情報、SBOM を提供します。
ステータス
安定版です。上のリリースバッジに最新のタグが表示され、CHANGELOG.md に各リリースの内容が記載されています。ツール群は契約です。ツール名と出力フィールドは維持されます。
docs/architecture.md §16 が計画を示しています。
ツール
| ツール | 説明 |
|---|---|
get_me | サインインしているユーザー、付与されているスコープ、GitLab が自身について報告している内容 |
resolve_url | GitLab の Web URL を別のツールが受け取る引数に変換し、そのツール名を示します |
search_projects | 名前またはグループ内でプロジェクトを検索します |
get_project | 1 つのプロジェクトのデフォルトブランチ、公開範囲、有効になっている機能 |
list_members | プロジェクトへのアクセス権を持つユーザーと、そのロール |
find_users | 完全一致するユーザー名または名前でアカウントを検索します |
search_issues | gitlab.com、グループ、またはプロジェクト全体からイシューを検索します |
get_issue | 1 つのイシュー、その信頼できないコンテンツとしてマークされた説明、およびリンクされたマージリクエスト |
create_issue | イシューを作成します。ラベル、担当者、マイルストーンは事前に確認されます |
update_issue | イシューのフィールドを変更します。読み取り後に変更されている場合は拒否されます |
list_discussions | イシューまたはマージリクエストのコメントスレッド |
list_item_events | イシューまたはマージリクエストのラベル、状態、マイルストーン、ウェイトの変更を新しい順に表示します |
add_comment | イシューまたはマージリクエストにコメントする、スレッドに返信する、またはスレッドを開始します。差分行へのコメントにも対応します |
update_comment | 自分のコメントを、スレッド内の位置と差分行を保ったまま編集します |
resolve_discussion | マージリクエストまたはイシューのスレッドを解決または再開します |
link_issues | 1 つまたは 2 つのプロジェクトにある 2 つのイシューをリンクします |
unlink_issues | 2 つのイシュー間のリンクを解除します |
link_merge_requests | 1 つまたは 2 つのプロジェクトにあるマージリクエストを、別のマージリクエストがマージされるまで待機させます |
unlink_merge_requests | 2 つのマージリクエスト間の依存関係を解除します |
search_merge_requests | gitlab.com またはプロジェクト全体からマージリクエストを検索します |
get_merge_request | 1 つのマージリクエストと、その承認、レビュアーの状態、リンクされたイシュー、依存関係 |
list_mr_files | マージリクエストで変更されたファイル、行数、GitLab のマーカー |
get_mr_diff | マージリクエストの差分をファイルごとに、上限付きで表示します |
list_mr_commits | マージリクエストのコミット |
list_mr_versions | マージリクエストの差分バージョンをプッシュごとに表示します |
compare_mr_versions | マージリクエストの 2 つのバージョン間、または指定したバージョン以降の変更内容 |
create_merge_request | ブランチからマージリクエストを作成します |
update_merge_request | マージリクエストのフィールドを変更します。読み取り後に変更されている場合は拒否されます |
track_time | イシューまたはマージリクエストの見積もり時間を設定またはリセットし、実績時間を追加またはリセットします |
add_review_comment | マージリクエストまたは差分行にレビューコメントの下書きを追加します |
list_review_comments | マージリクエストに投稿していない自分のレビューコメント |
delete_review_comment | 自分の下書きを 1 つ削除します |
update_review_comment | 下書きの位置を保ったまま、テキストを変更します |
publish_review_comment | 自分の下書きを 1 つだけ投稿します |
submit_review | すべての下書きを、概要とレビュアーの状態を添えて一度に投稿します |
rerequest_review | レビュアーが求めた変更に対応した後、新たなレビューを依頼します |
get_file | 指定した ref のファイルを上限付きで取得します |
list_tree | 指定した ref のディレクトリ一覧 |
list_branches | プロジェクトのブランチ |
list_commits | 指定した ref またはパスのコミット |
get_commit | 1 つのコミットとその差分を上限付きで取得し、そのコミットを含むマージリクエストも表示します |
compare_refs | 2 つの ref 間のコミットと差分を上限付きで表示します |
list_tags | プロジェクトのタグ |
create_branch | ref からブランチを作成します |
create_commit | ブランチにファイル変更をコミットします。デフォルトブランチまたは保護ブランチにはコミットしません |
get_blame | ファイルの各行を最後に変更したユーザーを上限付きで表示します |
cherry_pick_commit | コミットをブランチに適用します。デフォルトブランチまたは保護ブランチには適用しません |
revert_commit | 新しいコミットを作成してブランチ上のコミットを取り消します。デフォルトブランチまたは保護ブランチでは実行しません |
list_pipelines | プロジェクトの CI パイプライン |
get_pipeline | 1 つのパイプラインと、トリガージョブを含む失敗したジョブ |
list_jobs | パイプラインのジョブ |
get_job_log | ジョブのログの指定範囲を表示します。シークレットはマスクされ、失敗箇所はリクエストに応じて表示されます |
get_test_report | パイプラインのテスト件数と失敗ケースを、シークレットをマスクして上限付きで表示します |
lint_ci | 指定した ref のプロジェクトの CI 設定、または渡された設定をチェックします |
list_job_artifacts | ジョブがアーティファクトとして保存したファイル |
get_job_artifact | ジョブのアーティファクトからテキストファイルを 1 つ取得します。シークレットはマスクされ、上限が適用されます |
list_labels | プロジェクトのイシューやマージリクエストに付けられるラベル |
list_milestones | プロジェクトまたはグループのマイルストーン |
list_boards | プロジェクトのイシューボードと各リスト、および各リストを読み取るための search_issues 引数 |
search | プロジェクト、グループ、または全体を対象にコード、コミット、コメントなどを検索します |
list_todos | 自分の ToDo 項目 |
mark_todos_done | 自分の ToDo 項目を完了済みにします |
add_todo | イシューまたはマージリクエストに、自分用の ToDo を追加します |
subscribe | イシューまたはマージリクエストの通知を購読、または購読解除します |
react | イシュー、マージリクエスト、またはコメントに付けた自分の絵文字リアクションを追加または削除します |
upload_file | 許可したディレクトリから画像をアップロードし、コメントまたは説明に表示する Markdown を取得します |
merge_merge_request | レビューした HEAD でマージするか、パイプラインの成功時にマージします(Ship) |
cancel_auto_merge | パイプライン成功時にマージする設定を停止します(Ship) |
approve_merge_request | レビューした HEAD を承認します(Ship) |
unapprove_merge_request | 自分の承認を撤回します(Ship) |
apply_suggestions | マージリクエストの差分コメントにある提案をソースブランチにコミットします。保護ブランチには適用しません(Ship) |
rebase_merge_request | レビューした HEAD を基に、マージリクエストのソースブランチをリベースします(Ship) |
move_issue | イシューを別のプロジェクトに移動します。より多くの人が閲覧できるプロジェクトへの移動はできません(Ship) |
run_pipeline | ref のパイプラインを実行します。変数の値は表示されません(Ship) |
run_merge_request_pipeline | GitLab の選択に応じて、マージリクエストのパイプラインをマージ結果または分離状態で実行します。フォークのマージリクエストには使用できません(Ship) |
retry_pipeline | パイプラインの失敗またはキャンセルされたジョブを再試行します(Ship) |
retry_job | 入力を指定して、完了したジョブを再実行します(Ship) |
play_job | 変数と入力を指定して、手動ジョブを開始します(Ship) |
cancel_pipeline | 実行中のパイプラインをキャンセルします(Ship) |
delete_branch | ブランチを削除します。依頼がない限り、デフォルトブランチ、保護ブランチ、または未マージのブランチは削除しません(Destructive) |
delete_comment | 自分のコメントを 1 つ削除します(Destructive) |
make_issue_public | 機密イシューを公開します(Destructive) |
list_wiki_pages | プロジェクト Wiki のページ(wiki toolset) |
get_wiki_page | 1 つの Wiki ページを上限付きで取得します(wiki toolset) |
save_wiki_page | Wiki ページを作成するか、読み取り後に変更されていないページを編集します(wiki toolset) |
delete_wiki_page | Wiki ページを削除します(wiki toolset、Destructive) |
list_snippets | プロジェクトのスニペット、または自分のスニペット(snippets toolset) |
get_snippet | 1 つのスニペットとそのファイルを上限付きで取得します(snippets toolset) |
create_snippet | 常に非公開のスニペットを作成します(snippets toolset) |
update_snippet | 自分の非公開スニペットのタイトル、説明、ファイルを変更します。読み取り後に変更されている場合は拒否されます(snippets toolset) |
delete_snippet | 自分のスニペットを削除します(snippets toolset、Destructive) |
list_releases | プロジェクトのリリース(releases toolset) |
get_release | 1 つのリリースとそのリリースノート(releases toolset) |
create_release | リリースと ref のタグを作成し、プロジェクト自身のページへのアセットリンクを設定します(releases toolset、Ship) |
create_tag | ref にタグを作成します。保護タグは作成しません(releases toolset) |
delete_tag | タグを削除します。保護タグは削除しません(releases toolset、Destructive) |
create_label | プロジェクトラベルを作成します(planning toolset) |
update_label | 読み取り後に変更されていないプロジェクトラベルを変更します(planning toolset) |
delete_label | プロジェクトラベルを削除します(planning toolset、Destructive) |
create_milestone | プロジェクトのマイルストーンを作成します(planning toolset) |
update_milestone | 読み取り後に変更されていないマイルストーンを変更、クローズ、または再開します(planning toolset) |
delete_milestone | プロジェクトのマイルストーンを削除します(planning toolset、Destructive) |
list_environments | プロジェクトの環境と、それぞれの最新デプロイ(deployments toolset) |
list_deployments | デプロイ先と、デプロイを実行したジョブ(deployments toolset) |
list_events | 自分またはプロジェクトの最近のアクティビティ(activity toolset) |
| Ship ツールと Destructive ツールは以下の設定でのみ登録され、 | |
6 つのツールセットは GITLAB_MCP_TOOLSETS で指定された場合にのみ登録されます。 |
呼び出すのではなく添付するクライアント向けに、同じテキストを含む 3 つのリソースがあります:イシュー、マージリクエスト、ジョブログです。
インストール
リリースページからお使いのプラットフォーム用のアーカイブをダウンロードするか、次のコマンドを実行してください:
go install github.com/mmedum/gitlab-mcp/v4/cmd/gitlab-mcp@latest
Claude Desktop ユーザーは、同じリリースにある .mcpb バンドルを開くことができます。
この操作ではログインされません。先に以下の手順を行ってください。
サインイン
OAuth アプリケーションはご自身で用意してください。バイナリには何も同梱されておらず、 パーソナルアクセストークンも使用しません。
-
アプリケーションを登録します。登録は一度だけです。gitlab.com の場合:アバター → プロフィールを編集 → アプリケーション(またはグループのアプリケーション)。リダイレクト URI は
http://127.0.0.1/callback、Confidential はオフ、スコープはapi(読み取り専用の場合はread_api)です。正確な値はdocs/setup.mdを参照してください。 -
ログインします。ターミナルで次を実行してください:
gitlab-mcp login --client-id <application id>要求するスコープを表示し、ブラウザーを開いて、トークンを OS のキーリングに保存します。ブラウザーのないマシンでは、
--no-browserを指定すると URL とコールバックを転送するためのssh -Lの行が表示されます。 -
確認します:
gitlab-mcp doctordoctorは接続、TLS、サインイン、アプリケーション、許可されたスコープ、およびユーザーとしての呼び出しを順に確認し、不足しているものを示します。statusとlogoutは名前のとおりの動作をします。--profileを使うと、2 つの gitlab.com ログインを並行して保持できます。
クライアントの接続
Claude Code:
claude mcp add gitlab -- gitlab-mcp
JSON サーバーリストを受け取るクライアントの場合:
{
"mcpServers": {
"gitlab": { "command": "gitlab-mcp" }
}
}
Claude Desktop では、リリースから .mcpb バンドルを開くこともできます。
同じ設定を求められます。マージ、承認、提案の適用、イシューの移動、CI、リリース(enable_ship)、削除(enable_destructive)は、有効にしない限りオフのままです。また、write_namespaces により、書き込み先を指定したグループとプロジェクトに限定できます。
このサーバーは呼び出しの前に確認を求めません。Claude Desktop は各ツールを承認し、常に許可したツールは確認なしで実行されるため、必要なツールでない限りスイッチはオフのままにしてください。
設定
すべての設定は GITLAB_MCP_ 接頭辞の環境変数と、それに対応するフラグです。すべての設定は docs/configuration.md に記載されています。
安全性
GitLab のコンテンツはあなた以外の誰かが作成したものであり、その一部はエージェントを誘導するために書かれています。サーバーはこれを信頼できないデータとして扱い、参照先を取得することはなく、そこに含まれる内容によってモデルに何かを実行させることもありません。
登録できる内容は設定によって異なります。GitLab の api スコープでは、その内容を個別に制限できないためです。
| 設定 | 登録される内容 |
|---|---|
GITLAB_MCP_READ_ONLY=true | 読み取りツールのみ。read_api トークンを使用 |
| デフォルト | 読み取りと書き込み:イシュー、コメント、レビュー、ブランチ、マージリクエスト |
GITLAB_MCP_ENABLE_SHIP=true | マージ、承認、CI の実行、リリースを追加 |
GITLAB_MCP_ENABLE_DESTRUCTIVE=true | 削除とイシューの公開を追加。各呼び出しには confirm: true が必要 |
各呼び出しを承認するのは MCP クライアントであり、サーバー自身が確認を求めることはありません。claude.ai と Codex は破壊的操作としてマークされた Ship ツールと Destructive ツールの実行時に確認を求め、VS Code は書き込みを行うすべてのツールで確認を求めます。Claude Code では、どのようなルールを設定していても、delete_label、delete_milestone、make_issue_public は呼び出しのたびに確認を求めます。これらは取り消せず、それぞれ対象の 1 件を超える範囲に影響するためです。ラベルまたはマイルストーンはすべてのイシューとマージリクエストから削除され、公開されたイシューは誰でも読めるようになります。それ以外の操作については、設定の permissions.ask に承認する呼び出しを個別に列挙し、gitlab の代わりにサーバーに付けた名前を指定してください。たとえば、リリース、公開、アップロード、削除を行う書き込み操作は次のとおりです。
{
"permissions": {
"ask": [
"mcp__gitlab__merge_merge_request", "mcp__gitlab__approve_merge_request",
"mcp__gitlab__apply_suggestions", "mcp__gitlab__run_pipeline",
"mcp__gitlab__run_merge_request_pipeline", "mcp__gitlab__play_job",
"mcp__gitlab__create_release", "mcp__gitlab__create_tag", "mcp__gitlab__move_issue",
"mcp__gitlab__upload_file",
"mcp__gitlab__delete_branch", "mcp__gitlab__delete_comment",
"mcp__gitlab__delete_wiki_page", "mcp__gitlab__delete_label",
"mcp__gitlab__delete_milestone", "mcp__gitlab__delete_tag",
"mcp__gitlab__delete_snippet"
]
}
}
- クイックアクションは使いません。 GitLab は説明文やコメントから
/merge、/closeなどを実行します。このサーバーが送信する本文はすべて検査され、クイックアクションの行は拒否されるか、要求に応じてエスケープされます。 - 保護ブランチ。 コードがデフォルトブランチまたは保護ブランチに到達するのはマージリクエスト経由のみです。そこへの直接コミットは拒否されます。
- 無条件の再試行はしません。 作成が成功したかどうか不明な場合は、再作成せず、読み取りによって状況を確認します。
- 許可された場所にあるローカルファイルのみを使用します。
upload_fileは、GITLAB_MCP_UPLOAD_DIRSで指定されたディレクトリにある画像のみを読み込みます。また、バイト列から PNG、JPEG、GIF、WebP と判定されたものに限ります。そのため、コメントで「添付」するよう求められた鍵ファイルがアップロードされることはありません。
デフォルトのトークンでは引き続きマージと承認が可能です。Ship を無効にすると、このサーバーがそれらを実行しなくなるだけで、そのトークンを持つ他のものには影響しません。
詳しくは docs/security.md をご覧ください。
リリースの検証
各リリースでは、鍵なしの Sigstore 証明書で checksums.txt に署名し、すべてのアーカイブとバンドルに対するアテステーションを作成します。
sha256sum -c checksums.txt --ignore-missing
cosign verify-blob checksums.txt --bundle checksums.txt.bundle \
--certificate-identity "https://github.com/mmedum/gitlab-mcp/.github/workflows/release.yml@refs/tags/<tag>" \
--certificate-oidc-issuer https://token.actions.githubusercontent.com
gh attestation verify <archive> --repo mmedum/gitlab-mcp
コントリビューション
CONTRIBUTING.md をご覧ください。セキュリティに関する報告は、イシューではなく SECURITY.md の手順に従ってください。
ライセンス
Apache-2.0 です。LICENSE と NOTICE をご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。