get_milestone_metrics
Retrieve progress metrics for GitHub project milestones to track completion status and analyze issue data.
Instructions
Get progress metrics for a specific milestone
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| milestoneId | Yes | ||
| includeIssues | Yes |
Input Schema (JSON Schema)
{
"properties": {
"includeIssues": {
"type": "boolean"
},
"milestoneId": {
"type": "string"
}
},
"required": [
"milestoneId",
"includeIssues"
],
"type": "object"
}
Implementation Reference
- Core handler implementation: Fetches milestone data, retrieves all issues assigned to it, calculates open/closed counts, completion percentage, overdue status, and days remaining. Optionally includes issue details.async getMilestoneMetrics(id: string, includeIssues: boolean = false): Promise<MilestoneMetrics> { try { const milestone = await this.milestoneRepo.findById(id); if (!milestone) { throw new ResourceNotFoundError(ResourceType.MILESTONE, id); } const allIssues = await this.issueRepo.findAll(); const issues = allIssues.filter(issue => issue.milestoneId === milestone.id); const totalIssues = issues.length; const closedIssues = issues.filter( issue => issue.status === ResourceStatus.CLOSED || issue.status === ResourceStatus.COMPLETED ).length; const openIssues = totalIssues - closedIssues; const completionPercentage = totalIssues > 0 ? Math.round((closedIssues / totalIssues) * 100) : 0; const now = new Date(); let isOverdue = false; let daysRemaining: number | undefined = undefined; if (milestone.dueDate) { const dueDate = new Date(milestone.dueDate); isOverdue = now > dueDate; daysRemaining = Math.ceil((dueDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24)); } return { id: milestone.id, title: milestone.title, dueDate: milestone.dueDate, openIssues, closedIssues, totalIssues, completionPercentage, status: milestone.status, issues: includeIssues ? issues : undefined, isOverdue, daysRemaining: daysRemaining && daysRemaining > 0 ? daysRemaining : undefined }; } catch (error) { throw this.mapErrorToMCPError(error); } }
- Zod schema definition for tool input validation: requires milestoneId (string) and includeIssues (boolean).// Schema for get_milestone_metrics tool export const getMilestoneMetricsSchema = z.object({ milestoneId: z.string().min(1, "Milestone ID is required"), includeIssues: z.boolean(), }); export type GetMilestoneMetricsArgs = z.infer<typeof getMilestoneMetricsSchema>;
- ToolDefinition object defining the tool name, description, schema reference, and usage examples.export const getMilestoneMetricsTool: ToolDefinition<GetMilestoneMetricsArgs> = { name: "get_milestone_metrics", description: "Get progress metrics for a specific milestone", schema: getMilestoneMetricsSchema as unknown as ToolSchema<GetMilestoneMetricsArgs>, examples: [ { name: "Get milestone progress", description: "Get progress metrics for milestone #2", args: { milestoneId: "2", includeIssues: true, }, }, ], };
- src/infrastructure/tools/ToolRegistry.ts:136-136 (registration)Registers the getMilestoneMetricsTool in the central ToolRegistry singleton during initialization.this.registerTool(getMilestoneMetricsTool);
- src/index.ts:227-228 (handler)MCP tool dispatcher: Handles call_tool requests for get_milestone_metrics by delegating to ProjectManagementService.getMilestoneMetrics.case "get_milestone_metrics": return await this.service.getMilestoneMetrics(args.milestoneId, args.includeIssues);