Hevy Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Hevy Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A single-user remote MCP server that exposes the Hevy workout API to Claude (and any OAuth-capable MCP client). It speaks the full MCP protocol over Streamable HTTP at /mcp and is protected by a minimal, stateless OAuth 2.1 flow, so it can be added as a custom connector in the Claude app — including on mobile, on the go.
@hono/mcp.api-key from an environment variable / secret.As of 2026 the Claude app's custom-connector UI only accepts OAuth — it does not let you paste a static bearer token or custom header. So this server implements a tiny single-user OAuth provider: when you connect, Claude sends you to a login page where you enter MCP_PASSWORD; on success it receives an access token (a signed JWT) that it then presents to /mcp. Nothing is persisted — the password gates the flow and PKCE + JWT signatures secure it. Because the server supports Dynamic Client Registration, you do not need to fill in any Client ID / Client Secret in Claude — just the server URL.
Settings → Developer and requires a Hevy Pro subscription.
curl -fsSL https://bun.sh/install | bash).connector requires HTTPS — localhost works only for local testing with the MCP Inspector.
All ~22 Hevy endpoints, read + write:
list_workouts, get_workout, get_workout_count, get_workout_events, create_workout, update_workoutlist_routines, get_routine, create_routine, update_routinelist_routine_folders, get_routine_folder, create_routine_folderlist_exercise_templates, get_exercise_template, create_exercise_templateget_exercise_historylist_body_measurements, get_body_measurement, create_body_measurement, update_body_measurementget_user_info| Variable | Description |
|---|---|
HEVY_API_KEY | Your Hevy API key (Hevy app → Settings → Developer; requires Hevy Pro). |
MCP_PASSWORD | The password you type on the OAuth login page when connecting Claude. |
JWT_SECRET | Random ≥32-char secret for signing JWTs. Generate with openssl rand -hex 32. |
PUBLIC_URL | Public HTTPS base URL (no trailing slash). Must match the deployed domain. |
PORT | Port to listen on (default 3000). Ignored on Cloudflare Workers. |
bun install
cp .env.example .env # then edit values
bun run dev # or: bun run startThen point an MCP client at http://localhost:3000/mcp, e.g. the inspector:
npx @modelcontextprotocol/inspectorIt discovers the OAuth metadata, opens the login page (enter MCP_PASSWORD), and then lets you list and call tools.
The included Dockerfile runs on oven/bun and has a built-in /health healthcheck.
Generic Docker:
docker build -t hevy-mcp .
docker run -p 3000:3000 \
-e HEVY_API_KEY=... \
-e MCP_PASSWORD=... \
-e JWT_SECRET="$(openssl rand -hex 32)" \
-e PUBLIC_URL=https://hevy-mcp.example.com \
hevy-mcpPut it behind a reverse proxy (Caddy/nginx/Traefik) that terminates TLS, and set PUBLIC_URL to the public HTTPS address.
Coolify:
3000.PUBLIC_URL to the domain Coolify assignsafter it's assigned (Traefik provisions TLS automatically) — it must match exactly.
/health.The same entry point runs on Workers (env comes from the request binding, not process.env; nodejs_compat is enabled in wrangler.jsonc).
bun install # or: npm install
npx wrangler loginPUBLIC_URL in wrangler.jsonc to your Worker's URL. Deploy once to discover it(e.g. https://hevy-mcp.<your-subdomain>.workers.dev), or use a custom domain / route, then update PUBLIC_URL to match and redeploy.
npx wrangler secret put HEVY_API_KEY
npx wrangler secret put MCP_PASSWORD
npx wrangler secret put JWT_SECRET # e.g. paste `openssl rand -hex 32` bun run cf:deploy # = wrangler deployLocal dev against the real Workers runtime: copy .dev.vars.example to .dev.vars, set PUBLIC_URL=http://localhost:8787 there, then bun run cf:dev.
In the Claude app, add a custom connector pointing at https://<your-domain>/mcp. Leave Client ID / Client Secret blank. Complete the OAuth prompt by entering MCP_PASSWORD, and the Hevy tools become available.
This repo is safe to keep public: no secrets live in it. Access is guarded entirely by two values you set as env vars / secrets — use a strong `MCP_PASSWORD` and keep JWT_SECRET private (rotating JWT_SECRET invalidates existing tokens and forces re-authentication).
simplest and robust for a single user. It does not advertise a server→client SSE stream (GET /mcp); tool calls are request/response.
window — an acceptable trade-off for a private, single-user server with no datastore.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.