Agent access over MCP
TrackMyAge runs an MCP server, so an AI assistant you already use can work with your health data directly. Connect it once and your agent can read your body age, sleep, training, meals, weight and blood markers, and log meals, weights and daily check-ins on your behalf. Nothing is shared with anyone else. The connection is scoped to your own account by the key you give it.
- Endpoint
- https://app.trackmyage.com/api/mcp
- Transport
- Streamable HTTP. There is no SSE endpoint.
- Authentication
- Authorization: Bearer <your key>
- Where to get a key
- In the app, open Settings, then Agent access. The key is shown once when you generate it.
The key works while your account is active. Requests from an account that is not are refused.
Set up your client
Every snippet here shows the placeholder tma_YOUR_KEY. Replace it with your own key. Your real key is shown once, at the moment you generate it in Settings, then Agent access, and cannot be read back afterwards.
Claude, custom connector
In Claude, open Settings, then Connectors, then Add custom connector. Give it the URL below and the same bearer header.
https://app.trackmyage.com/api/mcp
Authorization: Bearer tma_YOUR_KEY
Claude Code
claude mcp add --transport http trackmyage https://app.trackmyage.com/api/mcp --header "Authorization: Bearer tma_YOUR_KEY"
claude.ai and other JSON configured clients
{
"mcpServers": {
"trackmyage": {
"url": "https://app.trackmyage.com/api/mcp",
"headers": { "Authorization": "Bearer tma_YOUR_KEY" }
}
}
}
ChatGPT
ChatGPT connectors accept a remote MCP server URL. Open Settings, then Connectors, then Add, and give it the URL below with the same bearer header.
https://app.trackmyage.com/api/mcp
Authorization: Bearer tma_YOUR_KEY
Try it
Once the connection is live, paste this into your agent.
Log my lunch: chicken salad with olive oil, roughly 550 kcal, 40g protein. Then show my age snapshot.
Tools
10 tools. Every one of them is scoped to the account the key belongs to. No tool takes a user as an argument.
| Tool | What it does | Inputs |
|---|---|---|
| get_age_snapshot | The headline numbers: Body Age, Aging Speed, the chronological-age comparison and the inputs behind them. Use this first to see where the user stands today. | None |
| get_daily_metrics | Daily wearable metrics per calendar day: VO2 max, fitness age, body battery, resting heart rate and overnight HRV. |
|
| get_sleep | Per-night sleep: duration, score, resting heart rate, HRV and stage breakdown. One row per night, deduplicated across wearables. |
|
| get_activity | Per-day activity summary: number of sessions, calories burned, total duration and intensity minutes. |
|
| get_meals | Logged meals with calories and macros, one row per meal. |
|
| log_meal | Log a meal with optional calories and macros. The client estimates the numbers; the server stores what it is given and does not estimate. |
|
| log_weight | Record a body weight in kilograms for a day. Overwrites any earlier reading for the same day. |
|
| get_weights | Body weight history as a date and kilograms series. |
|
| get_bloodwork | The latest reading of every blood marker on file, with reference range and category. | None |
| log_checkin | Record how the user feels today: mood and energy, each on a 1 (worst) to 5 (best) scale. An omitted field keeps its existing value. |
|
Limits and privacy
Requests are limited to 120 per hour per account. Connection handshakes and notifications do not count against it. Over the limit, the endpoint answers 429 with a Retry-After header saying how long to wait.
Testing by hand with curl needs an Accept header naming both content types, or the endpoint answers 406: -H 'Accept: application/json, text/event-stream'. MCP clients send it for you.
Your key grants full read and write access to your health data. Treat it like a password. Do not paste it into a shared document or a public chat.
The key is stored as a hash, so it cannot be read back after it is shown. If you lose it, generate a new one, which replaces the old one. You can revoke a key at any time in Settings, and it stops working on the next request.