健身课程预订命令行工具

一款命令行工具和MCP服务器,用于通过终端或AI助手浏览、预订和管理Huppa健身房课程。

  • by maxzw
  • Python
  • 本地部署
  • 3 星标
  • 更新于
在 GitHub 查看 maxzw/huppa-mcp

使用说明

🏋️‍♀️ Huppa CLI

A CLI tool and MCP server for Huppa — browse gym classes, book them, and manage bookings from the command line or through AI assistants like Claude.

Disclaimer: This is an unofficial, community-built project and is not affiliated with, endorsed by, or approved by Huppa. It interacts with Huppa's public API using your personal credentials. Use at your own risk — the author is not responsible for any account restrictions, data loss, or other consequences. Huppa may change their API at any time, which could break this tool without notice.

⚙️ Installation

Prerequisites: uv, just, and the GitHub CLI

User installation

Install the latest released wheel as a regular uv tool:

gh release download -R maxzw/huppa-cli -p '*.whl' -D /tmp/huppa-wheel
uv tool install --force /tmp/huppa-wheel/*.whl
huppa auth setup

Upgrade a user installation with:

huppa update

The updater downloads the wheel from the latest GitHub Release and installs it through uv.

Check the installed version and troubleshoot credential or API configuration:

huppa version
huppa status
huppa status --json

Development installation

To work from a source checkout instead, use an editable installation:

git clone https://github.com/maxzw/huppa-cli.git
cd huppa-cli
uv sync

# Install this checkout as the global `huppa` command
just deploy

# Run one-time interactive setup (stores credentials in OS keychain)
huppa auth setup

To remove a global installation:

uv tool uninstall huppa-cli

🔑 Authentication

The setup command prompts for email/password/subdomain and stores them securely in your system keychain.

To find your subdomain, open your Huppa gym page URL and use the first part before .huppa.app.

Example: https://mygym.huppa.app/me → subdomain is mygym

huppa auth setup   # interactive credential setup
huppa auth whoami  # show current authenticated user
huppa auth logout  # clear stored credentials

Status output shows credential sources and whether the API is reachable. Passwords are never printed.

Profile-specific authentication:

HUPPA_PROFILE=work-gym huppa auth setup
HUPPA_PROFILE=work-gym huppa auth whoami

Environment-variable authentication:

HUPPA_EMAIL="you@example.com" \
HUPPA_PASSWORD="your-password" \
HUPPA_SUBDOMAIN="mygym" \
huppa classes 2026-03-08
huppa classes 2026-03-08
huppa classes 2026-03-08 2026-03-09

🛠️ CLI Usage

Commands show Rich tables by default. Add --json for structured output.

# List classes for a date
huppa classes 2026-03-08

# List classes for multiple dates
huppa classes 2026-03-08 2026-03-09

# Show upcoming bookings
huppa bookings
huppa bookings --filter past --per-page 10
huppa bookings --json

# Show memberships
huppa memberships
huppa memberships --json

# Book a class (use organization_id and occurrence_id from `huppa classes`)
huppa book <organization_id> <occurrence_id>

# Cancel a booking
huppa cancel <organization_id> <occurrence_id>

# Waitlist management
huppa waitlist join <organization_id> <occurrence_id>
huppa waitlist leave <organization_id> <occurrence_id>

# Show all available commands
huppa --help

🤖 MCP Server

The CLI includes a built-in MCP server for AI assistants:

huppa mcp

Connecting to Claude Desktop

Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "huppa": {
      "command": "/full/path/to/uv",
      "args": ["--directory", "/absolute/path/to/huppa-cli", "run", "huppa", "mcp"]
    }
  }
}

Find uv path with which uv. Use full paths (not "uv") because Claude Desktop starts MCP servers with limited PATH.

MCP Tools

Tool Description
get_classes(date) List available gym classes for a given date (YYYY-MM-DD).
get_classes_multiple_dates(list_of_dates) Get classes for multiple dates at once.
book_class(organization_id, occurrence_id) Book a class.
cancel_booking(organization_id, occurrence_id) Cancel an existing booking.
join_waitlist(organization_id, occurrence_id) Join the waitlist for a full class.
leave_waitlist(organization_id, occurrence_id) Leave the waitlist.
get_my_bookings(filter, per_page, page) List bookings and waitlists.
get_memberships() Get memberships with credit balance and payment dates.

📋 License

MIT