list_merge_request_diffs
Retrieve merge request diffs with pagination support. Provide project ID and either merge request ID or source branch to view code changes.
Instructions
List merge request diffs with pagination support. Either merge_request_iid or source_branch must be provided.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID or path | |
| merge_request_iid | No | Merge request internal ID | |
| source_branch | No | Source branch name (alternative to merge_request_iid) | |
| page | No | Page number for pagination (default: 1) | |
| per_page | No | Number of items per page (max: 100, default: 20) | |
| unidiff | No | Present diffs in unified diff format (GitLab 16.5+) |
Implementation Reference
- src/handlers/merge-requests.ts:164-194 (handler)Main handler function that executes the list_merge_request_diffs tool. Resolves merge request IID if source_branch provided, constructs GitLab API endpoint /merge_requests/{iid}/diffs with pagination and unidiff parameters, fetches data using GitLabClient, and returns JSON response.async listMergeRequestDiffs(args: ListMergeRequestDiffsParams) { const mergeRequestIid = await this.resolveMergeRequestIid( args.project_id, args.merge_request_iid, args.source_branch ); const params = new URLSearchParams(); if (args.page) params.append("page", String(args.page)); if (args.per_page) params.append("per_page", String(args.per_page)); if (args.unidiff !== undefined) params.append("unidiff", String(args.unidiff)); const queryString = params.toString(); const url = `/projects/${encodeURIComponent( args.project_id )}/merge_requests/${mergeRequestIid}/diffs${ queryString ? `?${queryString}` : "" }`; const data = await this.client.get(url); return { content: [ { type: "text", text: JSON.stringify(data, null, 2), }, ], }; }
- src/tools/merge-requests.ts:112-146 (schema)MCP tool schema definition for list_merge_request_diffs, including input schema with properties for project_id, merge_request_iid/source_branch, pagination, and unidiff.{ name: 'list_merge_request_diffs', description: 'List merge request diffs with pagination support. Either merge_request_iid or source_branch must be provided.', inputSchema: { type: 'object', properties: { project_id: { type: 'string', description: 'Project ID or path', }, merge_request_iid: { type: 'number', description: 'Merge request internal ID', }, source_branch: { type: 'string', description: 'Source branch name (alternative to merge_request_iid)', }, page: { type: 'number', description: 'Page number for pagination (default: 1)', }, per_page: { type: 'number', description: 'Number of items per page (max: 100, default: 20)', maximum: 100, }, unidiff: { type: 'boolean', description: 'Present diffs in unified diff format (GitLab 16.5+)', }, }, required: ['project_id'], }, },
- src/server.ts:197-200 (registration)Tool dispatch registration in the MCP server request handler switch statement, calling the mergeRequestHandlers.listMergeRequestDiffs method.case "list_merge_request_diffs": return await this.mergeRequestHandlers.listMergeRequestDiffs( args as unknown as ListMergeRequestDiffsParams );
- src/types.ts:267-274 (schema)TypeScript interface defining the input parameters for the listMergeRequestDiffs handler.export interface ListMergeRequestDiffsParams { project_id: string; merge_request_iid?: number; source_branch?: string; page?: number; per_page?: number; unidiff?: boolean; }
- src/handlers/merge-requests.ts:32-76 (helper)Helper method to resolve merge request IID from project and source_branch if merge_request_iid not provided directly. Used by the handler.private async resolveMergeRequestIid( projectId: string, mergeRequestIid?: number, sourceBranch?: string ): Promise<number> { if (mergeRequestIid) { return mergeRequestIid; } if (!sourceBranch) { throw new Error( "Either merge_request_iid or source_branch must be provided" ); } // Find MR by source branch const mrs = (await this.client.get( `/projects/${encodeURIComponent( projectId )}/merge_requests?source_branch=${encodeURIComponent( sourceBranch )}&state=opened&per_page=1` )) as GitLabMergeRequest[]; if (!mrs || mrs.length === 0) { // Try all states if no open MR found const allMrs = (await this.client.get( `/projects/${encodeURIComponent( projectId )}/merge_requests?source_branch=${encodeURIComponent( sourceBranch )}&per_page=1` )) as GitLabMergeRequest[]; if (!allMrs || allMrs.length === 0) { throw new Error( `No merge request found for source branch: ${sourceBranch}` ); } return allMrs[0].iid; } return mrs[0].iid; }