Ask an AI app how your training is going, or tell it about a workout or a meal and it logs it. Or call the same operations from a script. Both work on your own account: your level, streak and plan, your workouts and your calorie log.
Connect an AI app
1PM Workout is a remote MCP server. Any app that takes one can use it. This is the address:
https://www.1pmw.fit/mcp
Claude
- Open Settings → Connectors and choose Add custom connector.
- Paste the address above and connect.
- Sign in to 1PM Workout with your Google account and tap Allow.
ChatGPT and other apps
Wherever the app lets you add a connector or a remote MCP server, paste the address. The app opens the sign-in page of 1PM Workout, and you allow it there. No key to copy.
Claude Code
claude mcp add --transport http 1pm-workout https://www.1pmw.fit/mcp
Then run /mcp in Claude Code and sign in.
Editors and tools with a config file
{
"mcpServers": {
"1pm-workout": { "url": "https://www.1pmw.fit/mcp" }
}
}
The exact shape differs a little from tool to tool. One that can't open a sign-in page can send an
API key instead: "headers": { "Authorization": "Bearer 1pm_key_..." }
Things to ask
- "What's my workout today?"
- "I just finished my workout, it felt ok. Log it."
- "How is my streak, and what does it take to reach the next level?"
- "I had two eggs and toast for breakfast. Add it to my calorie log."
- "Move my training days to Tuesday, Thursday and Saturday."
- "Review my last week."
Disconnect an app at any time in the 1PM Workout app, under Settings → Connect AI. An app can see and change your training and your calorie log. It never sees your chats, your email or anything about payments.
What an app can do
| Tool | What it does |
|---|---|
get_status |
Level and rank, streak, plan, today's situation, the next workout with its sets, totals |
get_program |
What the workouts of each level consist of, for any theme |
list_themes |
The ten anime themes with their exercises and ranks |
list_workouts |
The workout history, newest first |
log_workout |
Logs a finished workout: it counts for the streak and towards the next level |
update_plan |
Training days, reminder time, run or walk, level |
get_food_log |
What was eaten on a day, with the totals |
get_food_history |
Daily calorie and macro totals |
log_food |
Adds food to the calorie log |
delete_food_entry |
Removes an entry from the calorie log |
There are two prompts as well, for apps that show them: coach (talk to Saitama, who looks up your
training and food first) and weekly_review.
REST API
The same operations, as JSON over HTTPS.
https://www.1pmw.fit/api/v1
Keys
Make a key in the app: Settings → Connect AI → API keys. It is shown once. Send it with every request:
curl https://www.1pmw.fit/api/v1/me \
-H "Authorization: Bearer 1pm_key_..."
A key opens your training and your calorie log, so treat it like a password. Delete it in the same menu and it stops working at once.
Endpoints
| Request | What it does |
|---|---|
GET /me |
Where you stand: level, streak, plan, today, the next workout, totals |
PATCH /me |
Change the plan: trainingDays, reminderTime, cardio, level |
GET /workouts |
The workout history. limit, from, to |
POST /workouts |
Log a finished workout. feel, date, level, durationMinutes, cardio, theme |
GET /food |
The calorie log of a day. date |
GET /food/history |
Daily totals. days |
POST /food |
Add food. items, date |
DELETE /food/{date}/{id} |
Remove an entry |
GET /program |
The workouts of a theme. theme, level, cardio. No key needed |
GET /themes |
The themes. No key needed |
Every field is described in the OpenAPI description, which API clients and code generators can read.
Where you stand
GET /api/v1/me
{
"today": "2026-11-12",
"level": 3,
"rank": "B-Class Rookie",
"levelProgress": { "okSessions": 2, "okSessionsNeeded": 3, "hardSessionsInARow": 0 },
"streak": {
"current": 5, "best": 7, "lastWorkoutDate": "2026-11-11", "keepBy": "2026-11-15"
},
"plan": { "trainingDays": [1, 3, 5], "reminderTime": "18:00", "cardio": "run" },
"schedule": {
"isTrainingDay": false, "workoutDoneToday": false, "nextTrainingDay": "2026-11-13"
},
"nextWorkout": {
"level": 3,
"restSeconds": 45,
"exercises": [
{ "name": "push-ups", "total": 30, "unit": "reps", "sets": [10, 10, 10] },
{ "name": "sit-ups", "total": 30, "unit": "reps", "sets": [10, 10, 10] },
{ "name": "squats", "total": 30, "unit": "reps", "sets": [10, 10, 10] },
{ "name": "km run", "total": 3, "unit": "km", "sets": [3] }
]
},
"totals": { "workouts": 14, "reps": 1260, "km": 42 }
}
Shortened: the answer also has the theme, the time zone, this week's count, the last workout, and each
exercise as a line of text ("30 push-ups").
Log a workout
curl -X POST https://www.1pmw.fit/api/v1/workouts \
-H "Authorization: Bearer 1pm_key_..." \
-H "Content-Type: application/json" \
-d '{ "feel": "ok", "durationMinutes": 24 }'
This logs the whole workout of your current level, the same as finishing it in the app. feel is
ok or hard: three workouts that felt ok unlock the next level, and without it the
workout is logged but doesn't count towards one until it is rated: send feel on its own
afterwards and it rates that workout instead of logging another. The answer has the logged workout, whether a
level was unlocked, and where you stand now.
Log food
curl -X POST https://www.1pmw.fit/api/v1/food \
-H "Authorization: Bearer 1pm_key_..." \
-H "Content-Type: application/json" \
-d '{ "items": [{ "name": "2 scrambled eggs", "calories": 180, "protein": 12, "fat": 14 }] }'
name and calories are required. protein, carbs,
fat (grams of each), grams (the weight of the portion) and brand are
optional.
When something is wrong
The status says what kind of problem it is, the body has a short code and a sentence:
400 { "error": "invalid_input", "message": "feel must be one of: ok, hard." }
401 { "error": "invalid_token", "message": "That key or token was revoked or has expired." }
404 { "error": "not_found", "message": "There is no food entry 17 on 2026-11-12." }
429 { "error": "rate_limited",
"message": "That's today's limit of 1000 requests. It starts over at midnight UTC." }
Good to know
-
Dates are
YYYY-MM-DDin your own calendar. Leavedateout for today: the app saves the time zone of your device, so today is your today. - Sign in inside the app too. Apps and keys work on what is saved to your account. Workouts done in the app while signed out are only on that device.
- The app catches up the next time it is opened or brought back to the front: what was logged through the API shows up in your history, your streak and your calorie log.
- A workout is a whole session. Sets and reps can't be logged one by one, and a logged workout can't be removed through the API. The streak counts workouts, and planned rest days never break it.
-
Limits: 1,000 requests a day for an account (all its keys and apps together, MCP tool calls
included), 100 food entries a day, 10 keys and 20 connected apps. Every answer says what is left in
X-RateLimit-Remaining. - Browsers can call the API from any site: CORS is open, and nothing about you is served without a key.
For people who build MCP clients
- Streamable HTTP, stateless, JSON answers. Protocol versions 2026-07-28 down to 2024-11-05.
-
OAuth 2.1 with PKCE (S256). Clients are identified by a Client ID Metadata Document or register themselves
(Dynamic Client Registration). Refresh tokens are replaced on every use. Redirects go to https, to
http://localhost, or to an installed app's scheme written as a reversed domain name. -
Metadata:
/.well-known/oauth-protected-resourceand/.well-known/oauth-authorization-server.
1PM Workout