A hosted fork of the Hevy fitness MCP, wrapped in supergateway to speak streamable HTTP instead of stdio. Connects to the Hevy API to expose workout creation and updates, routine management, exercise template search, folder organization, and webhook subscriptions for workout events. The original stdio package is fine for Claude Desktop or Cursor, but this version is specifically packaged as a Docker image for multi-tenant MCP gateway deployments where you need stateful sessions and per-user API keys. Ships with health checks at /healthz and the MCP endpoint at /mcp. Reads HEVY_API_KEY from the container environment and includes built-in Sentry monitoring for production observability.
Fork notice. This is an independently-maintained fork of
chrisdoc/hevy-mcp, repackaged for multi-tenant MCP gateways. It ships the same Hevy tools wrapped in supergateway as an OCI image that speaks MCP streamable-HTTP over HTTP, instead of stdio. Use the upstreamhevy-mcpnpm package for local/stdio use in Claude Desktop, Cursor, etc.
A Model Context Protocol (MCP) server for the Hevy fitness tracking app, packaged as a supergateway-wrapped OCI image for hosting behind an MCP gateway. Exposes MCP streamable-HTTP on /mcp and health on /healthz; reads HEVY_API_KEY from the container environment.
Pick the workflow that fits your setup:
| Scenario | Command | Requirements |
|---|---|---|
| One-off stdio run | HEVY_API_KEY=sk_live... npx -y hevy-mcp | Node.js ≥ 24, Hevy API key |
| Local development | npm install && npm run build && npm start | .env with HEVY_API_KEY |
.nvmrc).You can launch the server directly without cloning:
HEVY_API_KEY=your_hevy_api_key_here npx -y hevy-mcp
# Clone the repository
git clone https://github.com/chrisdoc/hevy-mcp.git
cd hevy-mcp
# Install dependencies
npm install
# Create .env and add your keys
cp .env.sample .env
# Edit .env and add your HEVY_API_KEY
To use this server with Claude Desktop, add the following to your claude_desktop_config.json:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"hevy-mcp": {
"command": "npx",
"args": ["-y", "hevy-mcp"],
"env": {
"HEVY_API_KEY": "sk_live_your_key_here"
}
}
}
}
Add this server under "mcpServers" in ~/.cursor/mcp.json:
{
"mcpServers": {
"hevy-mcp": {
"command": "npx",
"args": ["-y", "hevy-mcp"],
"env": {
"HEVY_API_KEY": "your-api-key-here"
}
}
}
}
oxlint/oxfmt) for near-instant linting and formatting.Supply your Hevy API key via:
HEVY_API_KEY (in .env or system environment).--hevy-api-key=your_key (after -- in npm scripts).# Example .env
HEVY_API_KEY=your_hevy_api_key_here
hevy-mcp includes Sentry monitoring to observe errors and usage in production. It initializes @sentry/node with tracing enabled and PII collection disabled by default.
The MCP server itself speaks stdio only. For multi-tenant gateway
deployments (e.g. mcp-gateway-poc),
this repo ships a Dockerfile that wraps the stdio binary with
supergateway so a single
container exposes MCP streamable-HTTP.
The image follows the same contract every gateway-hosted MCP uses:
0.0.0.0:$PORT at /mcp/healthzMcp-Session-Id honored)HEVY_API_KEY is read from the container environment and passed to the
spawned stdio childImages are published to ghcr.io/rwestergren/hevy-mcp from main and from
any manually cut GitHub release. Build locally with:
docker build -t hevy-mcp:local .
docker run --rm -e HEVY_API_KEY=sk_live_... -p 8080:8080 hevy-mcp:local
curl http://localhost:8080/healthz
End users running hevy-mcp directly should use the stdio/npx flow above;
the Docker image is aimed at gateway operators, not individual clients.
| Category | Tools |
|---|---|
| Workouts | get-workouts, get-workout, create-workout, update-workout, get-workout-count, get-workout-events |
| Routines | get-routines, get-routine-by-id, create-routine, update-routine |
| Templates | get-exercise-templates, get-exercise-template, search-exercise-templates |
| Folders | get-routine-folders, get-routine-folder, create-routine-folder |
| Webhooks | get-webhook-subscription, create-webhook-subscription, delete-webhook-subscription |
npm run buildnpm run check (uses oxlint/oxfmt)npx vitest run --exclude tests/integration/**npm test (requires HEVY_API_KEY)For a detailed senior engineer guide, please refer to AGENTS.md.
The API client is automatically generated from the OpenAPI spec using Kubb:
npm run build:client
Contributions are welcome! Please open an issue or PR for any major changes.
HEVY_API_KEY*secretHevy API key (requires Hevy PRO). Get one in the Hevy app under Settings -> Developer.