https://github.com/owayo/gitlab-mcp-server

by owayo
Verified
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys from mcp.server.fastmcp import FastMCP from src.utils.git_utils import get_current_branch from src.utils.gitlab_utils import ( get_failed_jobs_output, get_merge_request, get_mr_changes, get_mr_comments, ) # Initialize MCP server mcp = FastMCP("gitlab-mcp") def get_current_branch_name() -> str: """ 現在のブランチ名を取得します。 Returns: str: 現在のブランチ名 """ return get_current_branch() # カレントのブランチのMRIDを取得 def get_current_mr_id() -> int: """ 現在のブランチのMRIDを取得します。 Returns: int: 現在のブランチのMRID """ branch_name = get_current_branch() mr = get_merge_request(branch_name) if mr: return mr.iid else: return "現在のブランチに関連するMerge Requestが見つかりません。" @mcp.tool() def get_pipeline_failed_jobs() -> str: """GitLabパイプラインで失敗したジョブのコンソール出力を取得""" mr_id = get_current_mr_id() failed_jobs_output = get_failed_jobs_output(mr_id=mr_id) if failed_jobs_output: return f""" パイプラインで以下のエラーが出ています。 プロダクトコードの修正で対応が可能な場合は修正を行ってください。 {failed_jobs_output} """ else: return "パイプラインで失敗したジョブが見つかりません。" @mcp.tool() def get_review_changes() -> str: """GitLab MRで修正したファイルの差分を取得""" mr_id = get_current_mr_id() changes = get_mr_changes(mr_id=mr_id) if changes: return f""" 以下の変更について @Codebase を考慮してレビューし、コードの問題点や改善点を出してください。 {changes} """ else: return "変更内容を取得できません。" @mcp.tool() def get_review_comments() -> str: """GitLab MRの未解決の指摘事項(コメント)を取得""" mr_id = get_current_mr_id() mr_comments = get_mr_comments(mr_id=mr_id) if mr_comments: return f""" 以下の指摘事項に対応してください。対応後は今後へのアドバイスを出力してください。 {mr_comments} """ else: return f"MR #{mr_id} への未解決の指摘事項はありません。" if __name__ == "__main__": args = sys.argv[1:] if not args: mcp.run(transport="stdio") elif args[0] == "test" and len(args) >= 2: if args[1] == "branch": print(get_current_branch_name()) elif args[1] == "mr-id": print(get_current_mr_id()) elif args[1] == "failed-jobs": if len(args) == 2: print(get_pipeline_failed_jobs()) else: print("無効な引数です。使用方法: test failed-jobs [<mr_id>]") elif args[1] == "review-comments": if len(args) == 2: print(get_review_comments()) else: print("無効な引数です。使用方法: test review-comments [<mr_id>]") elif args[1] == "review-changes": if len(args) == 2: print(get_review_changes()) else: print("無効な引数です。使用方法: test review-changes [<mr_id>]") else: print("無効なテスト引数です。") else: print("""使用方法: python main.py # MCPサーバーを起動 python main.py test branch # 現在のブランチ名を取得 python main.py test failed-jobs [<mr_id>] # MR IDの失敗したジョブの出力を取得 python main.py test review-comments [<mr_id>] # MR IDの未解決の指摘事項を取得 python main.py test review-changes [<mr_id>] # MR IDの変更内容を取得 """)