Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

134 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Anatome

Muscle anatomy, 873 exercises and session heatmaps — free, keyless, and yours to self-host. By NextSolutions.

Anatome muscle diagram example

That image is a live call to api.anatome.dev with no credentials attached — which is the whole pitch. Site: anatome.dev.


What is this?

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_history answers "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

Connect it to an assistant

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?"

Optionally, log to it

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.

Use the HTTP API

# 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.gif

Embed 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" />

Fair use

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.

Repository layout

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.

Endpoints

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 / getGuideTree and their MCP tools) are a work in progress: media coverage is incomplete and the coaching cues are unreviewed. Every response carries status: "work_in_progress" and the tool descriptions say so. Treat the content as provisional, not as training advice.

Development

# 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 build

Point the site at a local Worker with VITE_PUBLIC_API=http://localhost:8787 npm run dev.

License & attribution

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). /exerciseImage proxies 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.

About

Muscle group image generator API + ExerciseDB. Apache-2.0, MCP-compatible, 873 exercises pre-mapped. Open source by NextSolutions.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages