calculate_pace
Compute running pace, finish time, or distance from any two inputs: distance, time, or pace.
Instructions
Calculate running pace, finish time, or distance. Provide any two of: distance, time, pace.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| distance | No | Distance: "5k", "10k", "half", "marathon", or km value like "15" | |
| time | No | Finish time in H:MM:SS or MM:SS format, e.g. "3:30:00" or "25:00" | |
| pace | No | Pace per km in M:SS format, e.g. "5:00" |
Implementation Reference
- index.js:212-266 (registration)Registration of the 'calculate_pace' tool via server.tool() with name, description, schema, and handler.
// Tool: calculate_pace server.tool( 'calculate_pace', 'Calculate running pace, finish time, or distance. Provide any two of: distance, time, pace.', { distance: z.string().optional().describe('Distance: "5k", "10k", "half", "marathon", or km value like "15"'), time: z.string().optional().describe('Finish time in H:MM:SS or MM:SS format, e.g. "3:30:00" or "25:00"'), pace: z.string().optional().describe('Pace per km in M:SS format, e.g. "5:00"'), }, async ({ distance, time, pace }) => { const given = [distance, time, pace].filter(Boolean).length; if (given < 2) throw new Error('Provide at least 2 of: distance, time, pace'); let result = {}; if (distance && time) { const distKm = resolveDistance(distance); const timeSecs = timeToSeconds(time); const paceSecs = timeSecs / distKm; result = { distance: `${distKm} km`, time: secondsToTime(timeSecs), pace: `${secondsToPace(paceSecs)}/km`, speed: `${(distKm / (timeSecs / 3600)).toFixed(2)} km/h`, }; } else if (distance && pace) { const distKm = resolveDistance(distance); const paceSecs = paceToSeconds(pace); const timeSecs = distKm * paceSecs; result = { distance: `${distKm} km`, time: secondsToTime(timeSecs), pace: `${secondsToPace(paceSecs)}/km`, speed: `${(distKm / (timeSecs / 3600)).toFixed(2)} km/h`, }; } else if (time && pace) { const timeSecs = timeToSeconds(time); const paceSecs = paceToSeconds(pace); const distKm = timeSecs / paceSecs; result = { distance: `${distKm.toFixed(2)} km`, time: secondsToTime(timeSecs), pace: `${secondsToPace(paceSecs)}/km`, speed: `${(distKm / (timeSecs / 3600)).toFixed(2)} km/h`, }; } return { content: [{ type: 'text', text: Object.entries(result).map(([k, v]) => `${k}: ${v}`).join('\n'), }], }; } ); - index.js:217-220 (schema)Input schema defining three optional string parameters: distance, time, and pace.
distance: z.string().optional().describe('Distance: "5k", "10k", "half", "marathon", or km value like "15"'), time: z.string().optional().describe('Finish time in H:MM:SS or MM:SS format, e.g. "3:30:00" or "25:00"'), pace: z.string().optional().describe('Pace per km in M:SS format, e.g. "5:00"'), }, - index.js:221-265 (handler)Handler function that calculates running pace, finish time, or distance from any two inputs (distance+time, distance+pace, or time+pace). Returns formatted results.
async ({ distance, time, pace }) => { const given = [distance, time, pace].filter(Boolean).length; if (given < 2) throw new Error('Provide at least 2 of: distance, time, pace'); let result = {}; if (distance && time) { const distKm = resolveDistance(distance); const timeSecs = timeToSeconds(time); const paceSecs = timeSecs / distKm; result = { distance: `${distKm} km`, time: secondsToTime(timeSecs), pace: `${secondsToPace(paceSecs)}/km`, speed: `${(distKm / (timeSecs / 3600)).toFixed(2)} km/h`, }; } else if (distance && pace) { const distKm = resolveDistance(distance); const paceSecs = paceToSeconds(pace); const timeSecs = distKm * paceSecs; result = { distance: `${distKm} km`, time: secondsToTime(timeSecs), pace: `${secondsToPace(paceSecs)}/km`, speed: `${(distKm / (timeSecs / 3600)).toFixed(2)} km/h`, }; } else if (time && pace) { const timeSecs = timeToSeconds(time); const paceSecs = paceToSeconds(pace); const distKm = timeSecs / paceSecs; result = { distance: `${distKm.toFixed(2)} km`, time: secondsToTime(timeSecs), pace: `${secondsToPace(paceSecs)}/km`, speed: `${(distKm / (timeSecs / 3600)).toFixed(2)} km/h`, }; } return { content: [{ type: 'text', text: Object.entries(result).map(([k, v]) => `${k}: ${v}`).join('\n'), }], }; } - index.js:26-29 (helper)Helper function paceToSeconds: converts 'M:SS' pace string to total seconds.
function paceToSeconds(pace) { const [m, s] = pace.split(':').map(Number); return m * 60 + (s || 0); } - index.js:31-35 (helper)Helper function secondsToPace: converts seconds to 'M:SS' pace format.
function secondsToPace(secs) { const m = Math.floor(secs / 60); const s = Math.round(secs % 60); return `${m}:${s.toString().padStart(2, '0')}`; }