feat: support resolving merge request notes

This commit is contained in:
Nicholas Crum
2025-05-13 14:54:05 -06:00
parent 08ab1357a0
commit bde83c0a91
3 changed files with 16 additions and 9 deletions

View File

@ -1027,7 +1027,7 @@ async function updateMergeRequestNote(
mergeRequestIid: number, mergeRequestIid: number,
discussionId: string, discussionId: string,
noteId: number, noteId: number,
body: string, body?: string,
resolved?: boolean resolved?: boolean
): Promise<GitLabDiscussionNote> { ): Promise<GitLabDiscussionNote> {
projectId = decodeURIComponent(projectId); // Decode project ID projectId = decodeURIComponent(projectId); // Decode project ID
@ -1037,8 +1037,11 @@ async function updateMergeRequestNote(
)}/merge_requests/${mergeRequestIid}/discussions/${discussionId}/notes/${noteId}` )}/merge_requests/${mergeRequestIid}/discussions/${discussionId}/notes/${noteId}`
); );
const payload: { body: string; resolved?: boolean } = { body }; // Only one of body or resolved can be sent according to GitLab API
if (resolved !== undefined) { const payload: { body?: string; resolved?: boolean } = {};
if (body !== undefined) {
payload.body = body;
} else if (resolved !== undefined) {
payload.resolved = resolved; payload.resolved = resolved;
} }
@ -2270,8 +2273,8 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
args.merge_request_iid, args.merge_request_iid,
args.discussion_id, args.discussion_id,
args.note_id, args.note_id,
args.body, args.body, // Now optional
args.resolved // Pass resolved if provided args.resolved // Now one of body or resolved must be provided, not both
); );
return { return {
content: [{ type: "text", text: JSON.stringify(note, null, 2) }], content: [{ type: "text", text: JSON.stringify(note, null, 2) }],

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "@zereight/mcp-gitlab", "name": "@zereight/mcp-gitlab",
"version": "1.0.33", "version": "1.0.36",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@zereight/mcp-gitlab", "name": "@zereight/mcp-gitlab",
"version": "1.0.33", "version": "1.0.36",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@modelcontextprotocol/sdk": "1.8.0", "@modelcontextprotocol/sdk": "1.8.0",

View File

@ -475,8 +475,12 @@ export const UpdateMergeRequestNoteSchema = ProjectParamsSchema.extend({
merge_request_iid: z.number().describe("The IID of a merge request"), merge_request_iid: z.number().describe("The IID of a merge request"),
discussion_id: z.string().describe("The ID of a thread"), discussion_id: z.string().describe("The ID of a thread"),
note_id: z.number().describe("The ID of a thread note"), note_id: z.number().describe("The ID of a thread note"),
body: z.string().describe("The content of the note or reply"), body: z.string().optional().describe("The content of the note or reply"),
resolved: z.boolean().optional().describe("Resolve or unresolve the note"), // Optional based on API docs resolved: z.boolean().optional().describe("Resolve or unresolve the note"),
}).refine(data => data.body !== undefined || data.resolved !== undefined, {
message: "At least one of 'body' or 'resolved' must be provided"
}).refine(data => !(data.body !== undefined && data.resolved !== undefined), {
message: "Only one of 'body' or 'resolved' can be provided, not both"
}); });
// API Operation Parameter Schemas // API Operation Parameter Schemas