Skip to main content
Glama

get_commit_discussions

Retrieve commit discussions and comments from a specific merge request to review feedback and track conversation history.

Instructions

Get discussions and comments on commits within a specific merge request

Input Schema

NameRequiredDescriptionDefault
merge_request_iidYesInternal ID of the merge request

Input Schema (JSON Schema)

{ "properties": { "merge_request_iid": { "description": "Internal ID of the merge request", "minimum": 1, "type": "integer" } }, "required": [ "merge_request_iid" ], "type": "object" }

Implementation Reference

  • The main handler function implementing the get_commit_discussions tool. Fetches commits and MR discussions, matches line-level comments to commits, and formats a markdown report with summaries and details.
    async def get_commit_discussions(gitlab_url, project_id, access_token, args): """Get discussions/comments on commits within a merge request""" logging.info(f"get_commit_discussions called with args: {args}") mr_iid = args["merge_request_iid"] try: commits_result = await get_merge_request_commits(gitlab_url, project_id, access_token, mr_iid) commits_status, commits_data, commits_error = commits_result if commits_status != 200: logging.error(f"Error fetching merge request commits: " f"{commits_status} - {commits_error}") raise Exception(f"Error fetching merge request commits: {commits_error}") if not commits_data: return [TextContent(type="text", text="No commits found in this merge request.")] logging.info(f"Getting ALL MR discussions for MR #{mr_iid}...") discussions_result = await get_merge_request_discussions_paginated(gitlab_url, project_id, access_token, mr_iid) discussions_status, discussions_data, discussions_error = discussions_result if discussions_status != 200: logging.error(f"Error fetching MR discussions: " f"{discussions_status} - {discussions_error}") discussions_data = [] commit_map = {commit["id"]: commit for commit in commits_data} commits_with_discussions = {} total_discussions = 0 for discussion in discussions_data: notes = discussion.get("notes", []) for note in notes: position = note.get("position") if position and position.get("head_sha"): commit_sha = position["head_sha"] if commit_sha in commit_map: if commit_sha not in commits_with_discussions: commits_with_discussions[commit_sha] = {"commit": commit_map[commit_sha], "discussions": []} commits_with_discussions[commit_sha]["discussions"].append( {"discussion_id": discussion.get("id"), "note": note, "position": position} ) total_discussions += 1 if not commits_with_discussions: summary_text = ( f"## Commit Discussions for MR #{mr_iid}\n\n" f"**Summary:**\n" f"- Total commits: {len(commits_data)}\n" f"- Commits with discussions: 0\n" f"- Total discussions: 0\n\n" f"No line-level discussions found on any commits in this " f"merge request. Found {len(discussions_data)} total MR discussions." ) return [TextContent(type="text", text=summary_text)] response_text = ( f"## Commit Discussions for MR #{mr_iid}\n\n" f"**Summary:**\n" f"- Total commits: {len(commits_data)}\n" f"- Commits with discussions: {len(commits_with_discussions)}\n" f"- Total line-level discussions: {total_discussions}\n" f"- Total MR discussions: {len(discussions_data)}\n\n" ) for _commit_sha, item in commits_with_discussions.items(): commit = item["commit"] discussions = item["discussions"] response_text += f"### šŸ“ Commit: {commit['short_id']}\n" response_text += f"**Title:** {commit['title']}\n" response_text += f"**Author:** {commit['author_name']}\n" response_text += f"**Date:** {format_date(commit['committed_date'])}\n" response_text += f"**SHA:** `{commit['id']}`\n\n" for discussion_item in discussions: discussion_id = discussion_item["discussion_id"] note = discussion_item["note"] position = discussion_item["position"] author_name = note["author"]["name"] response_text += f"**šŸ’¬ Comment by {author_name}:**\n" response_text += f"{note['body']}\n" if position.get("new_path"): line_info = position.get("new_line", "N/A") response_text += f"*On file: {position['new_path']} " f"(line {line_info})*\n" created_at = format_date(note["created_at"]) response_text += f"*Posted: {created_at}*\n" response_text += f"*Discussion ID: {discussion_id}*\n\n" response_text += "---\n\n" return [TextContent(type="text", text=response_text)] except Exception as e: logging.error(f"Error in get_commit_discussions: {str(e)}") return [TextContent(type="text", text=f"Error retrieving commit discussions: {str(e)}")]
  • Input schema definition for the get_commit_discussions tool, specifying the required merge_request_iid parameter.
    Tool( name="get_commit_discussions", description=("Get discussions and comments on commits within a " "specific merge request"), inputSchema={ "type": "object", "properties": { "merge_request_iid": { "type": "integer", "minimum": 1, "description": ("Internal ID of the merge request"), } }, "required": ["merge_request_iid"], "additionalProperties": False, }, ),
  • main.py:343-346 (registration)
    Registration and dispatch logic in the MCP call_tool handler that routes calls to the get_commit_discussions function.
    elif name == "get_commit_discussions": return await get_commit_discussions( self.config["gitlab_url"], self.config["project_id"], self.config["access_token"], arguments )
  • tools/__init__.py:9-32 (registration)
    Package-level import and export registration of the get_commit_discussions tool function.
    from .get_commit_discussions import get_commit_discussions from .get_job_log import get_job_log from .get_merge_request_details import get_merge_request_details from .get_merge_request_pipeline import get_merge_request_pipeline from .get_merge_request_reviews import get_merge_request_reviews from .get_merge_request_test_report import get_merge_request_test_report from .get_pipeline_test_summary import get_pipeline_test_summary from .list_merge_requests import list_merge_requests from .reply_to_review_comment import create_review_comment, reply_to_review_comment, resolve_review_discussion __all__ = [ "list_merge_requests", "get_merge_request_reviews", "get_merge_request_details", "get_merge_request_pipeline", "get_merge_request_test_report", "get_pipeline_test_summary", "get_job_log", "get_branch_merge_requests", "reply_to_review_comment", "create_review_comment", "resolve_review_discussion", "get_commit_discussions", ]
  • Helper function used by the handler to fetch all paginated merge request discussions, which are then filtered for commit-specific comments.
    async def get_merge_request_discussions_paginated(gitlab_url, project_id, access_token, mr_iid): """Get all discussions from a merge request with pagination""" all_discussions = [] page = 1 per_page = 100 # Maximum allowed per page async with aiohttp.ClientSession() as session: headers = _headers(access_token) while True: url = f"{gitlab_url}/api/v4/projects/{project_id}/" f"merge_requests/{mr_iid}/discussions" params = {"page": page, "per_page": per_page} async with session.get(url, headers=headers, params=params) as response: if response.status != 200: return (response.status, await response.json(), await response.text()) discussions = await response.json() if not discussions: # No more results break all_discussions.extend(discussions) link_header = response.headers.get("Link", "") if 'rel="next"' not in link_header: break page += 1 return (200, all_discussions, "Success")

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/amirsina-mandegari/gitlab-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server