@therealchristhomas/gitlab-mcp-server
Version:
MCP Server for GitLab API operations
60 lines (59 loc) • 2.32 kB
JavaScript
import { z } from "zod";
import { gitlabGet, gitlabPost, gitlabPut, gitlabDelete, encodeProjectId, buildSearchParams } from "../utils/gitlab-client.js";
import { GitLabMilestoneSchema } from "../types/index.js";
export async function listMilestones(projectId, state, page = 1, perPage = 20) {
if (!projectId?.trim()) {
throw new Error("Project ID is required");
}
if (page < 1) {
throw new Error("Page number must be 1 or greater");
}
if (perPage < 1 || perPage > 100) {
throw new Error("Per page must be between 1 and 100");
}
const endpoint = `/projects/${encodeProjectId(projectId)}/milestones`;
const params = buildSearchParams({
...(state && { state }),
page: page.toString(),
per_page: perPage.toString()
});
const milestones = await gitlabGet(endpoint, params);
return z.array(GitLabMilestoneSchema).parse(milestones);
}
export async function createMilestone(projectId, title, description, dueDate, startDate) {
if (!projectId?.trim()) {
throw new Error("Project ID is required");
}
if (!title?.trim()) {
throw new Error("Milestone title is required");
}
const endpoint = `/projects/${encodeProjectId(projectId)}/milestones`;
const milestone = await gitlabPost(endpoint, {
title,
description,
due_date: dueDate,
start_date: startDate
});
return GitLabMilestoneSchema.parse(milestone);
}
export async function updateMilestone(projectId, milestoneId, options) {
if (!projectId?.trim()) {
throw new Error("Project ID is required");
}
if (!milestoneId || milestoneId < 1) {
throw new Error("Valid milestone ID is required");
}
const endpoint = `/projects/${encodeProjectId(projectId)}/milestones/${milestoneId}`;
const milestone = await gitlabPut(endpoint, options);
return GitLabMilestoneSchema.parse(milestone);
}
export async function deleteMilestone(projectId, milestoneId) {
if (!projectId?.trim()) {
throw new Error("Project ID is required");
}
if (!milestoneId || milestoneId < 1) {
throw new Error("Valid milestone ID is required");
}
const endpoint = `/projects/${encodeProjectId(projectId)}/milestones/${milestoneId}`;
await gitlabDelete(endpoint);
}