|
|
@@ -208,6 +208,41 @@ const RemoveAllIssueLabelsSchema = z.object({
|
|
|
number: z.number().describe('Issue number'),
|
|
|
});
|
|
|
|
|
|
+const ListMilestonesSchema = z.object({
|
|
|
+ owner: z.string().describe('Repository owner username'),
|
|
|
+ repo: z.string().describe('Repository name'),
|
|
|
+});
|
|
|
+
|
|
|
+const GetMilestoneSchema = z.object({
|
|
|
+ owner: z.string().describe('Repository owner username'),
|
|
|
+ repo: z.string().describe('Repository name'),
|
|
|
+ milestoneId: z.number().describe('Milestone ID'),
|
|
|
+});
|
|
|
+
|
|
|
+const CreateMilestoneSchema = z.object({
|
|
|
+ owner: z.string().describe('Repository owner username'),
|
|
|
+ repo: z.string().describe('Repository name'),
|
|
|
+ title: z.string().describe('Milestone title'),
|
|
|
+ description: z.string().optional().describe('Milestone description'),
|
|
|
+ due_on: z.string().optional().describe('Due date in ISO 8601 format (YYYY-MM-DDTHH:MM:SSZ)'),
|
|
|
+});
|
|
|
+
|
|
|
+const UpdateMilestoneSchema = z.object({
|
|
|
+ owner: z.string().describe('Repository owner username'),
|
|
|
+ repo: z.string().describe('Repository name'),
|
|
|
+ milestoneId: z.number().describe('Milestone ID'),
|
|
|
+ title: z.string().optional().describe('Milestone title'),
|
|
|
+ description: z.string().optional().describe('Milestone description'),
|
|
|
+ due_on: z.string().optional().describe('Due date in ISO 8601 format (YYYY-MM-DDTHH:MM:SSZ)'),
|
|
|
+ state: z.enum(['open', 'closed']).optional().describe('Milestone state'),
|
|
|
+});
|
|
|
+
|
|
|
+const DeleteMilestoneSchema = z.object({
|
|
|
+ owner: z.string().describe('Repository owner username'),
|
|
|
+ repo: z.string().describe('Repository name'),
|
|
|
+ milestoneId: z.number().describe('Milestone ID'),
|
|
|
+});
|
|
|
+
|
|
|
const CreateOrganizationSchema = z.object({
|
|
|
username: z.string().describe('Organization username (alphanumeric, dashes, underscores)'),
|
|
|
full_name: z.string().optional().describe('Organization full name'),
|
|
|
@@ -1052,6 +1087,137 @@ export function createMcpServer(gogsClient: GogsClient): Server {
|
|
|
required: ['owner', 'repo', 'number'],
|
|
|
},
|
|
|
},
|
|
|
+ {
|
|
|
+ name: 'list_milestones',
|
|
|
+ description: 'List all milestones in a repository',
|
|
|
+ inputSchema: {
|
|
|
+ type: 'object',
|
|
|
+ properties: {
|
|
|
+ owner: {
|
|
|
+ type: 'string',
|
|
|
+ description: 'Repository owner username',
|
|
|
+ },
|
|
|
+ repo: {
|
|
|
+ type: 'string',
|
|
|
+ description: 'Repository name',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ required: ['owner', 'repo'],
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: 'get_milestone',
|
|
|
+ description: 'Get a specific milestone by ID',
|
|
|
+ inputSchema: {
|
|
|
+ type: 'object',
|
|
|
+ properties: {
|
|
|
+ owner: {
|
|
|
+ type: 'string',
|
|
|
+ description: 'Repository owner username',
|
|
|
+ },
|
|
|
+ repo: {
|
|
|
+ type: 'string',
|
|
|
+ description: 'Repository name',
|
|
|
+ },
|
|
|
+ milestoneId: {
|
|
|
+ type: 'number',
|
|
|
+ description: 'Milestone ID',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ required: ['owner', 'repo', 'milestoneId'],
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: 'create_milestone',
|
|
|
+ description: 'Create a new milestone in a repository',
|
|
|
+ inputSchema: {
|
|
|
+ type: 'object',
|
|
|
+ properties: {
|
|
|
+ owner: {
|
|
|
+ type: 'string',
|
|
|
+ description: 'Repository owner username',
|
|
|
+ },
|
|
|
+ repo: {
|
|
|
+ type: 'string',
|
|
|
+ description: 'Repository name',
|
|
|
+ },
|
|
|
+ title: {
|
|
|
+ type: 'string',
|
|
|
+ description: 'Milestone title',
|
|
|
+ },
|
|
|
+ description: {
|
|
|
+ type: 'string',
|
|
|
+ description: 'Milestone description',
|
|
|
+ },
|
|
|
+ due_on: {
|
|
|
+ type: 'string',
|
|
|
+ description: 'Due date in ISO 8601 format (YYYY-MM-DDTHH:MM:SSZ)',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ required: ['owner', 'repo', 'title'],
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: 'update_milestone',
|
|
|
+ description: 'Update an existing milestone',
|
|
|
+ inputSchema: {
|
|
|
+ type: 'object',
|
|
|
+ properties: {
|
|
|
+ owner: {
|
|
|
+ type: 'string',
|
|
|
+ description: 'Repository owner username',
|
|
|
+ },
|
|
|
+ repo: {
|
|
|
+ type: 'string',
|
|
|
+ description: 'Repository name',
|
|
|
+ },
|
|
|
+ milestoneId: {
|
|
|
+ type: 'number',
|
|
|
+ description: 'Milestone ID',
|
|
|
+ },
|
|
|
+ title: {
|
|
|
+ type: 'string',
|
|
|
+ description: 'Milestone title',
|
|
|
+ },
|
|
|
+ description: {
|
|
|
+ type: 'string',
|
|
|
+ description: 'Milestone description',
|
|
|
+ },
|
|
|
+ due_on: {
|
|
|
+ type: 'string',
|
|
|
+ description: 'Due date in ISO 8601 format (YYYY-MM-DDTHH:MM:SSZ)',
|
|
|
+ },
|
|
|
+ state: {
|
|
|
+ type: 'string',
|
|
|
+ enum: ['open', 'closed'],
|
|
|
+ description: 'Milestone state',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ required: ['owner', 'repo', 'milestoneId'],
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: 'delete_milestone',
|
|
|
+ description: 'Delete a milestone from a repository',
|
|
|
+ inputSchema: {
|
|
|
+ type: 'object',
|
|
|
+ properties: {
|
|
|
+ owner: {
|
|
|
+ type: 'string',
|
|
|
+ description: 'Repository owner username',
|
|
|
+ },
|
|
|
+ repo: {
|
|
|
+ type: 'string',
|
|
|
+ description: 'Repository name',
|
|
|
+ },
|
|
|
+ milestoneId: {
|
|
|
+ type: 'number',
|
|
|
+ description: 'Milestone ID',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ required: ['owner', 'repo', 'milestoneId'],
|
|
|
+ },
|
|
|
+ },
|
|
|
{
|
|
|
name: 'list_user_organizations',
|
|
|
description: 'List organizations for the authenticated user',
|
|
|
@@ -1797,6 +1963,80 @@ export function createMcpServer(gogsClient: GogsClient): Server {
|
|
|
};
|
|
|
}
|
|
|
|
|
|
+ case 'list_milestones': {
|
|
|
+ const { owner, repo } = ListMilestonesSchema.parse(args);
|
|
|
+ const milestones = await gogsClient.listMilestones(owner, repo);
|
|
|
+ return {
|
|
|
+ content: [
|
|
|
+ {
|
|
|
+ type: 'text',
|
|
|
+ text: JSON.stringify(milestones, null, 2),
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ case 'get_milestone': {
|
|
|
+ const { owner, repo, milestoneId } = GetMilestoneSchema.parse(args);
|
|
|
+ const milestone = await gogsClient.getMilestone(owner, repo, milestoneId);
|
|
|
+ return {
|
|
|
+ content: [
|
|
|
+ {
|
|
|
+ type: 'text',
|
|
|
+ text: JSON.stringify(milestone, null, 2),
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ case 'create_milestone': {
|
|
|
+ const { owner, repo, title, description, due_on } = CreateMilestoneSchema.parse(args);
|
|
|
+ const milestone = await gogsClient.createMilestone(owner, repo, {
|
|
|
+ title,
|
|
|
+ description,
|
|
|
+ due_on,
|
|
|
+ });
|
|
|
+ return {
|
|
|
+ content: [
|
|
|
+ {
|
|
|
+ type: 'text',
|
|
|
+ text: JSON.stringify(milestone, null, 2),
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ case 'update_milestone': {
|
|
|
+ const { owner, repo, milestoneId, title, description, due_on, state } = UpdateMilestoneSchema.parse(args);
|
|
|
+ const milestone = await gogsClient.updateMilestone(owner, repo, milestoneId, {
|
|
|
+ title,
|
|
|
+ description,
|
|
|
+ due_on,
|
|
|
+ state,
|
|
|
+ });
|
|
|
+ return {
|
|
|
+ content: [
|
|
|
+ {
|
|
|
+ type: 'text',
|
|
|
+ text: JSON.stringify(milestone, null, 2),
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ case 'delete_milestone': {
|
|
|
+ const { owner, repo, milestoneId } = DeleteMilestoneSchema.parse(args);
|
|
|
+ await gogsClient.deleteMilestone(owner, repo, milestoneId);
|
|
|
+ return {
|
|
|
+ content: [
|
|
|
+ {
|
|
|
+ type: 'text',
|
|
|
+ text: `Milestone ${milestoneId} deleted successfully from ${owner}/${repo}`,
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
case 'list_user_organizations': {
|
|
|
const organizations = await gogsClient.listUserOrganizations();
|
|
|
return {
|