From 54e3e020c7b4fbb5ec9068f8c65be96e4604d08a Mon Sep 17 00:00:00 2001 From: simple Date: Thu, 20 Feb 2025 05:58:06 +0900 Subject: [PATCH] =?UTF-8?q?=EC=83=88=EB=A1=9C=EC=9A=B4=20createNote=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80:=20=EC=9D=B4=EC=8A=88?= =?UTF-8?q?=20=EB=98=90=EB=8A=94=20=EB=B3=91=ED=95=A9=20=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=EC=97=90=20=EB=85=B8=ED=8A=B8(=EB=8C=93=EA=B8=80)=EB=A5=BC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=EA=B4=80=EB=A0=A8=20=EC=8A=A4?= =?UTF-8?q?=ED=82=A4=EB=A7=88=20=EC=A0=95=EC=9D=98=20=EB=B2=84=EC=A0=84=20?= =?UTF-8?q?1.0.4=EB=A1=9C=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/index.js | 38 +++++++++++++++++++++++++++++++++++++- build/schemas.js | 8 ++++++++ package.json | 2 +- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/build/index.js b/build/index.js index e7e57dd..de1664d 100755 --- a/build/index.js +++ b/build/index.js @@ -5,7 +5,7 @@ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextpro import fetch from "node-fetch"; import { z } from "zod"; import { zodToJsonSchema } from "zod-to-json-schema"; -import { GitLabForkSchema, GitLabReferenceSchema, GitLabRepositorySchema, GitLabIssueSchema, GitLabMergeRequestSchema, GitLabContentSchema, GitLabCreateUpdateFileResponseSchema, GitLabSearchResponseSchema, GitLabTreeSchema, GitLabCommitSchema, CreateOrUpdateFileSchema, SearchRepositoriesSchema, CreateRepositorySchema, GetFileContentsSchema, PushFilesSchema, CreateIssueSchema, CreateMergeRequestSchema, ForkRepositorySchema, CreateBranchSchema, GitLabMergeRequestDiffSchema, GetMergeRequestSchema, GetMergeRequestDiffsSchema, UpdateMergeRequestSchema, } from "./schemas.js"; +import { GitLabForkSchema, GitLabReferenceSchema, GitLabRepositorySchema, GitLabIssueSchema, GitLabMergeRequestSchema, GitLabContentSchema, GitLabCreateUpdateFileResponseSchema, GitLabSearchResponseSchema, GitLabTreeSchema, GitLabCommitSchema, CreateOrUpdateFileSchema, SearchRepositoriesSchema, CreateRepositorySchema, GetFileContentsSchema, PushFilesSchema, CreateIssueSchema, CreateMergeRequestSchema, ForkRepositorySchema, CreateBranchSchema, GitLabMergeRequestDiffSchema, GetMergeRequestSchema, GetMergeRequestDiffsSchema, UpdateMergeRequestSchema, CreateNoteSchema, } from "./schemas.js"; const server = new Server({ name: "gitlab-mcp-server", version: "0.0.1", @@ -341,6 +341,19 @@ async function updateMergeRequest(projectId, mergeRequestIid, options) { await handleGitLabError(response); return GitLabMergeRequestSchema.parse(await response.json()); } +// πŸ“¦ μƒˆλ‘œμš΄ ν•¨μˆ˜: createNote - 이슈 λ˜λŠ” 병합 μš”μ²­μ— λ…ΈνŠΈ(λŒ“κΈ€)λ₯Ό μΆ”κ°€ν•˜λŠ” ν•¨μˆ˜ +async function createNote(projectId, noteableType, // 'issue' λ˜λŠ” 'merge_request' νƒ€μž… λͺ…μ‹œ +noteableIid, body) { + // βš™οΈ 응닡 νƒ€μž…μ€ GitLab API λ¬Έμ„œμ— 따라 μ‘°μ • κ°€λŠ₯ + const url = new URL(`${GITLAB_API_URL}/projects/${encodeURIComponent(projectId)}/${noteableType}/${noteableIid}/notes`); + const response = await fetch(url.toString(), { + method: "POST", + headers: DEFAULT_HEADERS, + body: JSON.stringify({ body }), + }); + await handleGitLabError(response); + return await response.json(); // βš™οΈ 응닡 νƒ€μž…μ€ GitLab API λ¬Έμ„œμ— 따라 μ‘°μ • κ°€λŠ₯, ν•„μš”ν•˜λ©΄ μŠ€ν‚€λ§ˆ μ •μ˜ +} server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: [ @@ -404,6 +417,11 @@ server.setRequestHandler(ListToolsRequestSchema, async () => { description: "Update a merge request", inputSchema: zodToJsonSchema(UpdateMergeRequestSchema), }, + { + name: "create_note", + description: "Create a new note (comment) to an issue or merge request", + inputSchema: zodToJsonSchema(CreateNoteSchema), + }, ], }; }); @@ -515,6 +533,24 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { ], }; } + case "create_note": { + try { + const args = CreateNoteSchema.parse(request.params.arguments); + const { project_id, noteable_type, noteable_iid, body } = args; + const note = await createNote(project_id, noteable_type, noteable_iid, body); + return { + content: [{ type: "text", text: JSON.stringify(note, null, 2) }], + }; + } + catch (error) { + if (error instanceof z.ZodError) { + throw new Error(`Invalid arguments: ${error.errors + .map((e) => `${e.path.join(".")}: ${e.message}`) + .join(", ")}`); + } + throw error; + } + } default: throw new Error(`Unknown tool: ${request.params.name}`); } diff --git a/build/schemas.js b/build/schemas.js index d1eb081..e3c5923 100644 --- a/build/schemas.js +++ b/build/schemas.js @@ -346,3 +346,11 @@ export const UpdateMergeRequestSchema = GetMergeRequestSchema.extend({ export const GetMergeRequestDiffsSchema = GetMergeRequestSchema.extend({ view: z.enum(["inline", "parallel"]).optional().describe("Diff view type"), }); +export const CreateNoteSchema = z.object({ + project_id: z.string().describe("Project ID or namespace/project_path"), + noteable_type: z + .enum(["issue", "merge_request"]) + .describe("Type of noteable (issue or merge_request)"), + noteable_iid: z.number().describe("IID of the issue or merge request"), + body: z.string().describe("Note content"), +}); diff --git a/package.json b/package.json index b056f9b..f91af3b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@zereight/mcp-gitlab", - "version": "1.0.3", + "version": "1.0.4", "description": "MCP server for using the GitLab API", "license": "MIT", "author": "zereight",