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",