create_manual_activity
Log a workout manually in Garmin Connect when no device data is available, by specifying activity name, type, start time, duration, and optional distance.
Instructions
Create a manual activity entry. Use get_activity_types to find valid activityTypeKey values
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| activityName | Yes | Name for the activity (e.g. "Morning Run") | |
| activityTypeKey | Yes | Activity type key (e.g. running, cycling, swimming). Use get_activity_types to see all options | |
| startTimeInGMT | Yes | Start time in ISO 8601 format in GMT (e.g. "2024-01-15T08:30:00.000") | |
| elapsedDurationInSecs | Yes | Duration in seconds | |
| distanceInMeters | No | Distance in meters. Optional |
Implementation Reference
- src/tools/write.tools.ts:28-47 (handler)The handler function that registers the 'create_manual_activity' tool. It calls client.createManualActivity with the validated inputs (activityName, activityTypeKey, startTimeInGMT, elapsedDurationInSecs, distanceInMeters) and returns the result as JSON.
server.registerTool( 'create_manual_activity', { description: 'Create a manual activity entry. Use get_activity_types to find valid activityTypeKey values', inputSchema: createManualActivitySchema.shape, }, async ({ activityName, activityTypeKey, startTimeInGMT, elapsedDurationInSecs, distanceInMeters }) => { const data = await client.createManualActivity({ activityName, activityTypeKey, startTimeInGMT, elapsedDurationInSecs, distanceInMeters, }); return { content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }], }; }, ); - src/dtos/write.dto.ts:22-30 (schema)Zod schema 'createManualActivitySchema' defining input validation for create_manual_activity. Fields: activityName (string), activityTypeKey (string), startTimeInGMT (ISO 8601 string), elapsedDurationInSecs (positive number), distanceInMeters (optional non-negative number).
export const createManualActivitySchema = z.object({ activityName: z.string().describe('Name for the activity (e.g. "Morning Run")'), activityTypeKey: z.string().describe('Activity type key (e.g. running, cycling, swimming). Use get_activity_types to see all options'), startTimeInGMT: z .string() .describe('Start time in ISO 8601 format in GMT (e.g. "2024-01-15T08:30:00.000")'), elapsedDurationInSecs: z.number().positive().describe('Duration in seconds'), distanceInMeters: z.number().min(0).optional().describe('Distance in meters. Optional'), }); - src/tools/write.tools.ts:28-47 (registration)Registration of 'create_manual_activity' tool via server.registerTool() in the registerWriteTools function.
server.registerTool( 'create_manual_activity', { description: 'Create a manual activity entry. Use get_activity_types to find valid activityTypeKey values', inputSchema: createManualActivitySchema.shape, }, async ({ activityName, activityTypeKey, startTimeInGMT, elapsedDurationInSecs, distanceInMeters }) => { const data = await client.createManualActivity({ activityName, activityTypeKey, startTimeInGMT, elapsedDurationInSecs, distanceInMeters, }); return { content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }], }; }, ); - src/client/garmin.client.ts:675-686 (helper)The GarminClient.createManualActivity method that sends a POST request to ACTIVITY_ENDPOINT + '/manual' with the payload (activityName, activityTypeKey, startTimeInGMT, elapsedDurationInSecs, distanceInMeters).
async createManualActivity(payload: { activityName: string; activityTypeKey: string; startTimeInGMT: string; elapsedDurationInSecs: number; distanceInMeters?: number; }): Promise<unknown> { return this.request(`${ACTIVITY_ENDPOINT}/manual`, { method: 'POST', body: payload, }); } - Constant ACTIVITY_ENDPOINT = '/activity-service/activity' used to construct the URL for creating manual activities.
export const ACTIVITY_ENDPOINT = '/activity-service/activity';