1PM Workout

API & MCP server

Your training in Claude and ChatGPT, and in your own code. Free for everyone.

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

  1. Open Settings → Connectors and choose Add custom connector.
  2. Paste the address above and connect.
  3. 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

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

For people who build MCP clients