@therealchristhomas/gitlab-mcp-server
Version:
MCP Server for GitLab API operations
56 lines (55 loc) • 2.29 kB
JavaScript
import { z } from "zod";
import { gitlabGet, gitlabPost, gitlabPut, gitlabDelete, buildSearchParams } from "../utils/gitlab-client.js";
import { GitLabGroupMilestoneSchema } from "../types/index.js";
export async function listGroupMilestones(groupId, options = {}) {
if (!groupId?.trim()) {
throw new Error("Group ID is required");
}
if (options.page !== undefined && options.page < 1) {
throw new Error("Page number must be 1 or greater");
}
if (options.per_page !== undefined && (options.per_page < 1 || options.per_page > 100)) {
throw new Error("Per page must be between 1 and 100");
}
const endpoint = `/groups/${encodeURIComponent(groupId)}/milestones`;
const params = buildSearchParams(options);
const milestones = await gitlabGet(endpoint, params);
return z.array(GitLabGroupMilestoneSchema).parse(milestones);
}
export async function createGroupMilestone(groupId, title, description, dueDate, startDate) {
if (!groupId?.trim()) {
throw new Error("Group ID is required");
}
if (!title?.trim()) {
throw new Error("Milestone title is required");
}
const endpoint = `/groups/${encodeURIComponent(groupId)}/milestones`;
const milestone = await gitlabPost(endpoint, {
title,
description,
due_date: dueDate,
start_date: startDate
});
return GitLabGroupMilestoneSchema.parse(milestone);
}
export async function updateGroupMilestone(groupId, milestoneId, options) {
if (!groupId?.trim()) {
throw new Error("Group ID is required");
}
if (!milestoneId || milestoneId < 1) {
throw new Error("Valid milestone ID is required");
}
const endpoint = `/groups/${encodeURIComponent(groupId)}/milestones/${milestoneId}`;
const milestone = await gitlabPut(endpoint, options);
return GitLabGroupMilestoneSchema.parse(milestone);
}
export async function deleteGroupMilestone(groupId, milestoneId) {
if (!groupId?.trim()) {
throw new Error("Group ID is required");
}
if (!milestoneId || milestoneId < 1) {
throw new Error("Valid milestone ID is required");
}
const endpoint = `/groups/${encodeURIComponent(groupId)}/milestones/${milestoneId}`;
await gitlabDelete(endpoint);
}