Muscle anatomy, 873 exercises and session heatmaps — free, keyless, and yours to self-host. By NextSolutions.
That image is a live call to api.anatome.dev with no credentials attached — which is the whole pitch. Site: anatome.dev.
Anatome turns muscle groups and exercise names into clean, colourable anatomical SVG diagrams over a plain HTTP API, and speaks the Model Context Protocol so an assistant can use it as a tool with no integration work at all.
- 🔓 No API key. No signup, no token, no header. Every example below runs as written.
- 🎨 Multi-colour layered muscle rendering,
<img src>-friendly via?output=raw - 💪 873 exercises, searchable and resolvable to muscle layers, with hosted demo GIFs
- 🤖 MCP server (10 tools, 31 when signed in) + OpenAPI 3.1 spec
- 📓 Log meals, workouts, supplements and body weight by talking — then search it: by
exercise, by date range, by text.
get_exercise_historyanswers "is my bench going anywhere?" - 🔗 Shareable dashboards with charts, for showing a coach — expiring, revocable, no login
- ☁️ Runs on Cloudflare and nothing else — see SELF_HOSTING.md
Claude — Settings → Connectors → Add custom connector → paste:
https://api.anatome.dev/mcp
ChatGPT — Settings → Apps → Create app → same URL. Pick OAuth if you want logging, None for catalog-only.
Config file —
{
"mcpServers": {
"anatome": { "type": "http", "url": "https://api.anatome.dev/mcp" }
}
}Then just ask: "which muscles does a Bulgarian split squat actually work?"
Signing in adds meals, water, workouts and body weight. It is OAuth 2.1 with PKCE — your client registers itself, a browser opens, you enter an email and password, and that is the whole setup. There is still no key.
"Set my timezone to Europe/Warsaw." "I had oatmeal with berries for breakfast, about 420 calories." "Log 3×5 bench press at 100kg." · "Took my creatine." "How am I doing today?" · "Is my bench going anywhere?" "Show me every session with deadlifts since March." "Share my last month with my coach." → a link with charts, expiring in 24h
Anatome does no food lookup and calls no model — your assistant estimates the macros and sends them, and Anatome stores and adds them up. That is what keeps this tier free.
Your data is yours: export_my_data and delete_my_account are tools, and the same buttons are
on /account. See PRIVACY.md — including the one real gap, that there is no
password reset because Anatome sends no email.
# Generate a muscle diagram (raw SVG)
curl "https://api.anatome.dev/generateImage?layers=DC2626:chest,abs&view=front&output=raw"
# Search exercises
curl "https://api.anatome.dev/searchExercises?q=bench&limit=5"
# Exercise demo GIF
curl "https://api.anatome.dev/exerciseGif?id=Bench_Press" -o bench.gifEmbed directly in HTML — no auth header to attach, so a bare <img> tag works:
<img src="https://api.anatome.dev/generateImage?gender=male&view=dual&layers=DC2626:chest|F59E0B:triceps&output=raw" alt="chest and triceps" />Free, with a budget of 50 requests per caller per day, resetting at 00:00 UTC. Loopback and
private addresses are never counted, so local development is unlimited. Static catalog reads
(/listMuscles, /listEquipment, /bodyPaths, /openapi, the guide endpoints) are edge-cached
and not counted either.
"Per caller" is your account once you sign in, and otherwise your MCP session or your IP. Only the account is durable: a remote connector reaches this API from the assistant vendor's egress addresses, shared by every user of that assistant, so an anonymous budget is an approximation. Signing in gives you one of your own.
Running out returns 429 with a body a program can act on:
{
"error": "daily_fair_use_limit_reached",
"limit": 50, "used": 50, "remaining": 0,
"reset_at": "2026-08-08T00:00:00.000Z",
"retry_after_seconds": 62678,
"retryable": false
}The MCP endpoint is deliberately different. initialize and tools/list are never rate
limited — otherwise a user who is simply out of requests for the day cannot complete the
handshake, and every assistant renders that as "connector failed". Only tools/call spends
budget, and when it runs out the call returns a normal result with isError: true and a
plain-English explanation, so the model tells the user the truth rather than reporting an outage.
Need more? Either self-host it and set your own limit, or use the hosted platform at platform.anatome.dev, which adds per-user workouts and meals, AI parsing, interactive widgets, curated programming, coach and trainee accounts and production quotas.
| Path | What | Deploys via |
|---|---|---|
api/ |
Cloudflare Worker at api.anatome.dev (Hono + TypeScript) | wrangler deploy |
repo root (src/, index.html, vite.config.js, …) |
React/Vite site + playground at anatome.dev | npm run build && wrangler deploy |
docs/ |
Working notes and audits | — |
Two independent deployables, no shared runtime. The site needs no backend at all; the API needs a D1 database only for accounts, and serves the whole catalog without one.
generateImage · workoutImage · searchExercises · getExercise · resolveExercise ·
exerciseGif · exerciseImage · listMuscles · muscleInfo · listEquipment · bodyPaths ·
listGuides · getGuide · getGuideTree · mcp · openapi · ciStatus · selfTest
Signed-in only: /v1/meals · /v1/water · /v1/workouts · /v1/exercise-history ·
/v1/supplements · /v1/body-metrics · /v1/weight-trend · /v1/goals · /v1/summary ·
/v1/day · /v1/profile · /v1/export, plus /oauth/*, /account and /v/{token}.
Full schema: GET https://api.anatome.dev/openapi. Machine discovery:
GET https://api.anatome.dev/.well-known/mcp.json and
GET https://api.anatome.dev/.well-known/oauth-authorization-server.
⚠️ The skill guides (listGuides/getGuide/getGuideTreeand their MCP tools) are a work in progress: media coverage is incomplete and the coaching cues are unreviewed. Every response carriesstatus: "work_in_progress"and the tool descriptions say so. Treat the content as provisional, not as training advice.
# API
cd api && pnpm install && pnpm run worker:dev # → http://localhost:8787
cd api && pnpm run db:migrate:local # only if you want accounts locally
cd api && pnpm test # 257 tests, plain node
cd api && pnpm run test:workers # 106 tests inside workerd, real local D1
cd api && pnpm run typecheck
# Site
npm install && npm run dev
npm run lint && npm run buildPoint the site at a local Worker with VITE_PUBLIC_API=http://localhost:8787 npm run dev.
Anatome is licensed under Apache-2.0. It builds on third-party data — see
NOTICE:
- Anatomical SVG paths — MIT, © Hicham El Boussarghini, from react-native-body-highlighter.
- Exercise metadata — Unlicense, from
wrkout/exercises.json. That dedication covers the metadata only: the dataset's photography is of unverified origin and is not cleared for redistribution (#48)./exerciseImageproxies those files rather than vendoring them; do not treat them as licensed. - Skill guides — CC-BY-4.0 content.
Being findable is a design problem too — see DISCOVERABILITY.md for how
the tool descriptions, llms.txt and discovery documents are written for retrieval, and what is
left as operator work.
NextSolutions also makes airon.coach — an AI personal trainer that uses Anatome under the hood.