resolve_review_discussion
Mark GitLab merge request review discussions as resolved or unresolved to track feedback completion and manage code review progress.
Instructions
Resolve or unresolve a discussion thread in a merge request review
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| merge_request_iid | Yes | Internal ID of the merge request | |
| discussion_id | Yes | ID of the discussion thread to resolve/unresolve | |
| resolved | No | Whether to resolve (true) or unresolve (false) the discussion |
Input Schema (JSON Schema)
{
"properties": {
"discussion_id": {
"description": "ID of the discussion thread to resolve/unresolve",
"type": "string"
},
"merge_request_iid": {
"description": "Internal ID of the merge request",
"minimum": 1,
"type": "integer"
},
"resolved": {
"default": true,
"description": "Whether to resolve (true) or unresolve (false) the discussion",
"type": "boolean"
}
},
"required": [
"merge_request_iid",
"discussion_id"
],
"type": "object"
}
Implementation Reference
- tools/reply_to_review_comment.py:97-135 (handler)The main asynchronous handler function implementing the 'resolve_review_discussion' tool. It extracts arguments, calls the GitLab API via resolve_merge_request_discussion, and formats success/error responses as TextContent.async def resolve_review_discussion(gitlab_url, project_id, access_token, args): """Resolve or unresolve a discussion thread in a merge request review""" logging.info(f"resolve_review_discussion called with args: {args}") mr_iid = args["merge_request_iid"] discussion_id = args["discussion_id"] resolved = args.get("resolved", True) try: status, response_data, error_text = await resolve_merge_request_discussion( gitlab_url, project_id, access_token, mr_iid, discussion_id, resolved ) if status == 200: action = "resolved" if resolved else "reopened" result = f"ā **Discussion {action}!**\n\n" result += f"**Merge Request**: !{mr_iid}\n" result += f"**Discussion ID**: `{discussion_id}`\n" result += f"**Status**: {'ā Resolved' if resolved else 'š Reopened'}\n" return [TextContent(type="text", text=result)] else: error_msg = f"ā **Error {action} discussion**\n\n" error_msg += f"**Status**: {status}\n" error_msg += f"**Error**: {error_text}\n" error_msg += f"**MR**: !{mr_iid}\n" error_msg += f"**Discussion**: {discussion_id}\n" return [TextContent(type="text", text=error_msg)] except Exception as e: logging.error(f"Unexpected error in resolve_review_discussion: {e}") error_result = "ā **Unexpected error**\n\n" error_result += f"**Error**: {str(e)}\n" error_result += f"**MR**: !{mr_iid}\n" error_result += f"**Discussion**: {discussion_id}\n" return [TextContent(type="text", text=error_result)]
- main.py:231-255 (schema)The Tool schema registration in list_tools(), defining input validation schema with required merge_request_iid and discussion_id, optional resolved boolean.Tool( name="resolve_review_discussion", description=("Resolve or unresolve a discussion thread in a " "merge request review"), inputSchema={ "type": "object", "properties": { "merge_request_iid": { "type": "integer", "minimum": 1, "description": ("Internal ID of the merge request"), }, "discussion_id": { "type": "string", "description": ("ID of the discussion thread to " "resolve/unresolve"), }, "resolved": { "type": "boolean", "default": True, "description": ("Whether to resolve (true) or unresolve " "(false) the discussion"), }, }, "required": ["merge_request_iid", "discussion_id"], "additionalProperties": False, }, ),
- main.py:339-342 (registration)Tool handler dispatch/registration within the MCP server's call_tool() method, mapping the tool name to the resolve_review_discussion function call.elif name == "resolve_review_discussion": return await resolve_review_discussion( self.config["gitlab_url"], self.config["project_id"], self.config["access_token"], arguments )
- tools/__init__.py:17-30 (registration)Re-export and inclusion in __all__ for the resolve_review_discussion function in the tools package, making it available for import in main.py.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",