list-milestones
Retrieve milestones from Float using filters for project, phase, status, date range, priority, and pagination to get targeted results.
Instructions
List all milestones with optional filtering by project, phase, status, or date range
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | Filter by project ID | |
| phase_id | No | Filter by phase ID | |
| status | No | Filter by milestone status (numeric) | |
| completed | No | Filter by completion status (0=not completed, 1=completed) | |
| active | No | Filter by active status (0=archived, 1=active) | |
| start_date | No | Filter by start date (YYYY-MM-DD format) | |
| end_date | No | Filter by end date (YYYY-MM-DD format) | |
| date_from | No | Filter milestones from this date (YYYY-MM-DD format) | |
| date_to | No | Filter milestones to this date (YYYY-MM-DD format) | |
| priority | No | Filter by priority level (1-5) | |
| created_by | No | Filter by creator user ID | |
| page | No | Page number for pagination | |
| per-page | No | Number of items per page (max 200) |
Implementation Reference
- The 'list-milestones' tool handler function. Defined via createTool with name 'list-milestones', description about listing milestones, input schema (Zod) for filtering parameters, and an async handler that calls floatApi.getPaginated('/milestones', params, milestonesResponseSchema).
export const listMilestones = createTool( 'list-milestones', 'List all milestones with optional filtering by project, phase, status, or date range', z.object({ project_id: z.number().optional().describe('Filter by project ID'), phase_id: z.number().optional().describe('Filter by phase ID'), status: z.number().optional().describe('Filter by milestone status (numeric)'), completed: z .number() .optional() .describe('Filter by completion status (0=not completed, 1=completed)'), active: z.number().optional().describe('Filter by active status (0=archived, 1=active)'), start_date: z.string().optional().describe('Filter by start date (YYYY-MM-DD format)'), end_date: z.string().optional().describe('Filter by end date (YYYY-MM-DD format)'), date_from: z .string() .optional() .describe('Filter milestones from this date (YYYY-MM-DD format)'), date_to: z.string().optional().describe('Filter milestones to this date (YYYY-MM-DD format)'), priority: z.number().optional().describe('Filter by priority level (1-5)'), created_by: z.number().optional().describe('Filter by creator user ID'), page: z.number().optional().describe('Page number for pagination'), 'per-page': z.number().optional().describe('Number of items per page (max 200)'), }), async (params) => { const response = await floatApi.getPaginated('/milestones', params, milestonesResponseSchema); return response; } ); - Input schema for list-milestones. Zod object with optional fields: project_id, phase_id, status, completed, active, start_date, end_date, date_from, date_to, priority, created_by, page, 'per-page'.
z.object({ project_id: z.number().optional().describe('Filter by project ID'), phase_id: z.number().optional().describe('Filter by phase ID'), status: z.number().optional().describe('Filter by milestone status (numeric)'), completed: z .number() .optional() .describe('Filter by completion status (0=not completed, 1=completed)'), active: z.number().optional().describe('Filter by active status (0=archived, 1=active)'), start_date: z.string().optional().describe('Filter by start date (YYYY-MM-DD format)'), end_date: z.string().optional().describe('Filter by end date (YYYY-MM-DD format)'), date_from: z .string() .optional() .describe('Filter milestones from this date (YYYY-MM-DD format)'), date_to: z.string().optional().describe('Filter milestones to this date (YYYY-MM-DD format)'), priority: z.number().optional().describe('Filter by priority level (1-5)'), created_by: z.number().optional().describe('Filter by creator user ID'), page: z.number().optional().describe('Page number for pagination'), 'per-page': z.number().optional().describe('Number of items per page (max 200)'), }), - src/tools/index.ts:79-248 (registration)Import of listMilestones from milestones.ts and its registration in the legacyTools array at line 238, which are then exported as part of the tools array.
listMilestones, getMilestone, createMilestone, updateMilestone, deleteMilestone, getProjectMilestones, getUpcomingMilestones, getOverdueMilestones, completeMilestone, getMilestoneReminders, } from './project-management/milestones.js'; import { listPhases, getPhase, createPhase, updatePhase, deletePhase, listPhasesByProject, getPhasesByDateRange, getActivePhases, getPhaseSchedule, } from './project-management/phases.js'; import { listProjectTasks, getProjectTask, createProjectTask, updateProjectTask, deleteProjectTask, getProjectTasksByProject, getProjectTasksByPhase, bulkCreateProjectTasks, reorderProjectTasks, archiveProjectTask, getProjectTaskDependencies, } from './project-management/project-tasks.js'; // Time management tools import { listTimeOff, getTimeOff, createTimeOff, updateTimeOff, deleteTimeOff, bulkCreateTimeOff, approveTimeOff, rejectTimeOff, listTimeOffTypes, getTimeOffCalendar, getPersonTimeOffSummary, } from './time-management/timeoff.js'; import { listTimeOffTypes as listTimeOffTypesConfig, getTimeOffType, createTimeOffType, updateTimeOffType, deleteTimeOffType, } from './time-management/timeoff-types.js'; import { listPublicHolidays, getPublicHoliday, createPublicHoliday, updatePublicHoliday, deletePublicHoliday, } from './time-management/public-holidays.js'; import { listTeamHolidays, getTeamHoliday, createTeamHoliday, updateTeamHoliday, deleteTeamHoliday, listTeamHolidaysByDepartment, listTeamHolidaysByDateRange, listRecurringTeamHolidays, getUpcomingTeamHolidays, } from './time-management/team-holidays.js'; import { listLoggedTime, getLoggedTime, createLoggedTime, updateLoggedTime, deleteLoggedTime, bulkCreateLoggedTime, getPersonLoggedTimeSummary, getProjectLoggedTimeSummary, getLoggedTimeTimesheet, getBillableTimeReport, } from './time-management/logged-time.js'; // Reporting tools import { getTimeReport, getProjectReport, getPeopleUtilizationReport, } from './reporting/reports.js'; // Legacy tools export (preserved for backward compatibility) export const legacyTools = [ // Core entity tools listPeople, getPerson, createPerson, updatePerson, deletePerson, listDepartments, getDepartment, createDepartment, updateDepartment, deleteDepartment, listStatuses, getStatus, createStatus, updateStatus, deleteStatus, getDefaultStatus, setDefaultStatus, getStatusesByType, listRoles, getRole, createRole, updateRole, deleteRole, getRolesByPermission, getRolePermissions, updateRolePermissions, getRoleHierarchy, checkRoleAccess, listAccounts, getAccount, updateAccount, manageAccountPermissions, createAccount, deactivateAccount, reactivateAccount, getCurrentAccount, updateAccountTimezone, setAccountDepartmentFilter, bulkUpdateAccountPermissions, // Project management tools listProjects, getProject, createProject, updateProject, deleteProject, listTasks, getTask, createTask, updateTask, deleteTask, listClients, getClient, createClient, updateClient, deleteClient, listAllocations, getAllocation, createAllocation, updateAllocation, deleteAllocation, listMilestones, getMilestone, createMilestone, updateMilestone, deleteMilestone, getProjectMilestones, getUpcomingMilestones, getOverdueMilestones, completeMilestone, getMilestoneReminders, listPhases, - src/services/float-api.ts:684-696 (helper)The getPaginated helper method on FloatApi class that list-milestones uses to make the actual API call to /milestones endpoint.
async getPaginated<T>( url: string, params?: Record<string, unknown>, schema?: z.ZodType<T[]>, format: ResponseFormat = 'json' ): Promise<T[]> { const queryString = this.buildQueryParams({ ...params, 'per-page': params?.['per-page'] || 200, // Float API max page size }); return this.get<T[]>(`${url}${queryString}`, schema, format); } - src/types/float.ts:237-259 (schema)The milestoneSchema Zod definition defining the structure of milestone objects returned by the API.
export const milestoneSchema = z.object({ milestone_id: z.number().optional(), // Float API uses milestone_id, not id project_id: z.number().optional(), phase_id: z.number().nullable().optional(), name: z.string(), description: z.string().nullable().optional(), date: z.string().nullable().optional(), // ISO date format (YYYY-MM-DD) start_date: z.string().nullable().optional(), end_date: z.string().nullable().optional(), status: z.number().nullable().optional(), // Float API uses numeric status codes created: z.string().nullable().optional(), // Float API uses 'created', not 'created_at' modified: z.string().nullable().optional(), // Float API uses 'modified', not 'updated_at' created_by: z.number().nullable().optional(), modified_by: z.number().nullable().optional(), active: z.number().nullable().optional(), // 0 = archived, 1 = active priority: z.number().nullable().optional(), // Priority level (1-5) completed: z.number().nullable().optional(), // 0 = not completed, 1 = completed completed_date: z.string().nullable().optional(), notes: z.string().nullable().optional(), color: z.string().nullable().optional(), reminder_date: z.string().nullable().optional(), reminder_sent: z.number().nullable().optional(), // 0 = not sent, 1 = sent });