← Back to Index | ← Comments | Next: Design Elements →
Manage project milestones for tracking major deliverables and releases.
- list_milestones
- get_milestone
- create_milestone
- update_milestone
- delete_milestone
- close_milestone / reopen_milestone
List project milestones.
Parameters:
projectId(number, optional): Project IDoffset(number, optional): Pagination offsetlimit(number, optional): Max items (default: 50, max: 200)
Returns: { items, total, offset, limit, hasMore }
Example:
const milestones = await callTool('list_milestones', {
projectId: 230954
});
// Filter to active milestones
const active = milestones.items.filter(m => !m.closingDate);
// Sort by due date
const sorted = active.sort((a, b) =>
new Date(a.dueDate) - new Date(b.dueDate)
);Get milestone details.
Parameters:
projectId(number, optional): Project IDmilestoneId(number, required): Milestone ID
Returns: Milestone object
Response Fields:
milestoneId: Milestone identifiername: Milestone namedescription: DescriptiondueDate: Target completion date (ISO 8601)closingDate: When milestone was closed (null if active)workItemCount: Number of assigned work itemscompletedWorkItemCount: Completed items count
Example:
const milestone = await callTool('get_milestone', {
projectId: 230954,
milestoneId: 456
});
const completion = (milestone.completedWorkItemCount / milestone.workItemCount) * 100;
console.log(`${milestone.name}: ${completion.toFixed(1)}% complete`);Create a new milestone.
Parameters:
projectId(number, optional): Project IDname(string, required): Milestone namedescription(string, optional): DescriptiondueDate(string, optional): Due date (ISO 8601 format)
Returns: Created milestone object
Example:
const milestone = await callTool('create_milestone', {
projectId: 230954,
name: 'v1.0 Release',
description: 'Initial public release with core features',
dueDate: '2026-03-31T23:59:59Z'
});Naming Conventions:
- Version numbers:
v1.0,v2.5.1 - Features:
Multiplayer Launch,Content Update #1 - Phases:
Alpha,Beta,Release Candidate
Update milestone properties.
Parameters:
projectId(number, optional): Project IDmilestoneId(number, required): Milestone IDname(string, optional): New namedescription(string, optional): New descriptiondueDate(string, optional): New due date
Returns: Updated milestone object
Example:
// Extend milestone deadline
await callTool('update_milestone', {
projectId: 230954,
milestoneId: 456,
dueDate: '2026-04-15T23:59:59Z',
description: 'Extended for additional polish and testing'
});Delete a milestone.
Parameters:
projectId(number, optional): Project IDmilestoneId(number, required): Milestone ID
Returns: { success: boolean }
Warning:
- Permanently deletes the milestone
- Work items assigned to this milestone are not deleted
- Milestone assignment is removed from work items
- Cannot be undone
Recommended Alternative: Use close_milestone to archive.
Close or reopen a milestone.
Parameters:
projectId(number, optional): Project IDmilestoneId(number, required): Milestone ID
Returns: { success: boolean }
Example:
// Archive completed milestone
await callTool('close_milestone', {
projectId: 230954,
milestoneId: 456
});
// Reopen for post-release fixes
await callTool('reopen_milestone', {
projectId: 230954,
milestoneId: 456
});Behavior:
- Closed milestones: Hidden from active milestone lists
- Work items: Can still be assigned to closed milestones
- Metrics: Remain queryable
// Create milestones for quarterly releases
const quarters = [
{ name: 'Q1 2026 Release', date: '2026-03-31' },
{ name: 'Q2 2026 Release', date: '2026-06-30' },
{ name: 'Q3 2026 Release', date: '2026-09-30' },
{ name: 'Q4 2026 Release', date: '2026-12-31' }
];
for (const q of quarters) {
await callTool('create_milestone', {
projectId: 230954,
name: q.name,
dueDate: `${q.date}T23:59:59Z`
});
}// Assign all "high priority" items to upcoming milestone
const highPriority = await callTool('search_work_items', {
projectId: 230954,
importanceLevels: ['urgent', 'high'],
isCompleted: false
});
await callTool('update_work_items', {
projectId: 230954,
items: highPriority.items.map(item => ({
workItemId: item.workItemId,
milestoneId: 456 // "v1.0 Release"
}))
});const milestones = await callTool('list_milestones', {
projectId: 230954
});
console.log('Milestone Progress Report\n');
for (const m of milestones.items.filter(m => !m.closingDate)) {
const completion = (m.completedWorkItemCount / m.workItemCount) * 100;
const daysUntil = Math.ceil(
(new Date(m.dueDate) - new Date()) / (1000 * 60 * 60 * 24)
);
console.log(`${m.name}:`);
console.log(` Progress: ${completion.toFixed(1)}%`);
console.log(` Tasks: ${m.completedWorkItemCount}/${m.workItemCount}`);
console.log(` Due: ${daysUntil} days`);
console.log('');
}// Create milestone for specific feature
const featureMilestone = await callTool('create_milestone', {
projectId: 230954,
name: 'Multiplayer System',
description: `## Scope
- Lobby system
- Matchmaking
- In-game networking
- Leaderboards
## Success Criteria
- 10 players per match
- <50ms latency
- Cross-platform support`
});
// Create and assign feature tasks
const tasks = await callTool('create_work_items', {
projectId: 230954,
items: [
{ title: 'Design multiplayer architecture', categoryId: 'design', milestoneId: featureMilestone.milestoneId },
{ title: 'Implement lobby system', categoryId: 'programming', milestoneId: featureMilestone.milestoneId },
{ title: 'Build matchmaking service', categoryId: 'programming', milestoneId: featureMilestone.milestoneId }
]
});Do:
- Create milestones for major releases/features
- Set realistic due dates with buffer time
- Use descriptive names with version numbers
- Include scope in description
Don't:
- Create too many milestones (keep <10 active)
- Set arbitrary dates without planning
- Mix different types (features + releases)
Use Milestones for:
- Long-term goals (months)
- Releases and versions
- Cross-sprint features
- External deadlines
Use Boards for:
- Short iterations (weeks)
- Sprint planning
- Team velocity tracking
- Time-boxed work
Combine Both:
// Milestone: "v1.0 Release" (3 months)
// └─ Board: "Sprint 1" (2 weeks) → subset of v1.0 tasks
// └─ Board: "Sprint 2" (2 weeks) → more v1.0 tasks
// └─ Board: "Sprint 3" (2 weeks) → final v1.0 tasksSee Also:
- Work Items - Assigning tasks to milestones
- Boards - Sprint planning within milestones
- Project Management - Project-level metrics