getBodyMeasurements
Retrieve body measurements like weight and body fat from Fitbit data for a specific date or time period to track health progress.
Input Schema
TableJSON 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 |
Implementation Reference
- src/server.ts:324-376 (handler)Handler function that fetches weight and body fat measurements from the Fitbit API for the specified date and optional period, returning JSON-formatted data or an error.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 input schema defining optional 'date' and 'period' parameters for the getBodyMeasurements tool.{ 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)Registration of the getBodyMeasurements tool on the MCP server, including name, input 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:68-72 (helper)Helper function to format or default the date to today in YYYY-MM-DD format, used by getBodyMeasurements.function formatDate(date?: string): string { if (date) return date; const today = new Date(); return today.toISOString().split("T")[0]; // YYYY-MM-DD }
- src/server.ts:44-64 (helper)Helper function to make authenticated API requests to Fitbit endpoints, used by the getBodyMeasurements handler.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; }