getBodyMeasurements
Retrieve body measurements from Fitbit data for a specified date or period, including weight, BMI, and body fat percentage.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date in YYYY-MM-DD format. If not specified, will use today. | |
| period | No | Period for body data: 1d, 7d, 30d, 1w, 1m |
Input Schema (JSON Schema)
{
"properties": {
"date": {
"description": "Date in YYYY-MM-DD format. If not specified, will use today.",
"type": "string"
},
"period": {
"description": "Period for body data: 1d, 7d, 30d, 1w, 1m",
"type": "string"
}
},
"type": "object"
}
Implementation Reference
- src/server.ts:324-376 (handler)The main handler function for the 'getBodyMeasurements' tool. It fetches weight and body fat data from the Fitbit API using the provided date and optional period, formats the response as a JSON string, and handles errors.async ({ date, period }) => { try { const formattedDate = formatDate(date); let endpoint = ""; if (period) { endpoint = `/user/-/body/log/weight/date/${formattedDate}/${period}.json`; } else { endpoint = `/user/-/body/log/weight/date/${formattedDate}.json`; } const weightData = await makeApiRequest(endpoint); // Also get body fat data let fatEndpoint = ""; if (period) { fatEndpoint = `/user/-/body/log/fat/date/${formattedDate}/${period}.json`; } else { fatEndpoint = `/user/-/body/log/fat/date/${formattedDate}.json`; } const fatData = await makeApiRequest(fatEndpoint); return { content: [ { type: "text", text: JSON.stringify( { date: formattedDate, weight: weightData.weight || [], fat: fatData.fat || [], }, null, 2 ), }, ], }; } catch (error) { return { content: [ { type: "text", text: `Error: ${ error instanceof Error ? error.message : String(error) }`, }, ], isError: true, }; } }
- src/server.ts:314-323 (schema)Zod schema defining the input parameters for the 'getBodyMeasurements' tool: optional date and period strings.{ date: z .string() .optional() .describe("Date in YYYY-MM-DD format. If not specified, will use today."), period: z .string() .optional() .describe("Period for body data: 1d, 7d, 30d, 1w, 1m"), },
- src/server.ts:312-377 (registration)The MCP server.tool registration call that defines and registers the 'getBodyMeasurements' tool with its schema and handler function.server.tool( "getBodyMeasurements", { date: z .string() .optional() .describe("Date in YYYY-MM-DD format. If not specified, will use today."), period: z .string() .optional() .describe("Period for body data: 1d, 7d, 30d, 1w, 1m"), }, async ({ date, period }) => { try { const formattedDate = formatDate(date); let endpoint = ""; if (period) { endpoint = `/user/-/body/log/weight/date/${formattedDate}/${period}.json`; } else { endpoint = `/user/-/body/log/weight/date/${formattedDate}.json`; } const weightData = await makeApiRequest(endpoint); // Also get body fat data let fatEndpoint = ""; if (period) { fatEndpoint = `/user/-/body/log/fat/date/${formattedDate}/${period}.json`; } else { fatEndpoint = `/user/-/body/log/fat/date/${formattedDate}.json`; } const fatData = await makeApiRequest(fatEndpoint); return { content: [ { type: "text", text: JSON.stringify( { date: formattedDate, weight: weightData.weight || [], fat: fatData.fat || [], }, null, 2 ), }, ], }; } catch (error) { return { content: [ { type: "text", text: `Error: ${ error instanceof Error ? error.message : String(error) }`, }, ], isError: true, }; } } );
- src/server.ts:44-65 (helper)Helper function used by the handler to make authenticated API requests to the Fitbit endpoints.async function makeApiRequest(endpoint: string): Promise<any> { try { const url = `${baseUrl}${endpoint}`; const response = await fetch(url, { headers: { Authorization: `Bearer ${accessToken}`, Accept: "application/json", }, }); if (!response.ok) { throw new Error( `Fitbit API error: ${response.status} ${response.statusText}` ); } return await response.json(); } catch (error) { console.error(`Error making request to ${endpoint}:`, error); throw error; } }
- src/server.ts:68-72 (helper)Helper function used to format the date parameter for API calls, defaulting to today.function formatDate(date?: string): string { if (date) return date; const today = new Date(); return today.toISOString().split("T")[0]; // YYYY-MM-DD }