PureGym Python client and MCP server for class discovery and booking management
Project description
PureGym MCP
puregym-mcp is a Python package and Model Context Protocol server for browsing PureGym centers in Denmark,
discovering classes, checking your bookings, and managing bookings from MCP-compatible clients.
This is an independent third-party project and is not affiliated with, endorsed by, or sponsored by PureGym. PureGym is a registered trademark of Pure Gym Limited.
- Docs: puregym-mcp.jorgesintes.dev
- Public read-only endpoint:
https://puregym-mcp.jorgesintes.dev/mcp - PyPI: puregym-mcp
Capabilities
The server exposes a small set of tools for public class discovery and optional authenticated booking actions.
Class discovery
Available without PureGym credentials:
get_capabilitieslist_class_typeslist_centerssearch_classes
Booking management
Available when PUREGYM_USERNAME and PUREGYM_PASSWORD are configured:
list_my_bookingsbook_classcancel_bookingget_center_live_status- Real-time occupancy and capacity dataget_center_open_hours- Opening and staffed hours for a center
Modes
Anonymous modeexposes read-only tools and uses a 14-day search window.Authenticated modeunlocks booking tools and expands the default search window to 28 days.
Authentication for HTTP Transports
When running over streamable-http or sse transports, the server requires Bearer token authentication in
addition to PureGym credentials. This prevents unauthorized access to your booking capabilities when exposing
the MCP server remotely.
Required environment variables for HTTP transports:
PUREGYM_USERNAME- Your PureGym account emailPUREGYM_PASSWORD- Your PureGym account passwordMCP_AUTH_TOKEN- A secret Bearer token you choose (e.g., a random string)
Note: stdio transport requires no authentication and runs unauthenticated by default.
Connect from MCP clients (e.g., Mistral) using Simple Auth / HTTP Bearer Token with your MCP_AUTH_TOKEN.
Quickstart
For most users, the easiest setup is local stdio usage from an MCP-compatible client:
{
"mcp": {
"puregym": {
"enabled": true,
"type": "local",
"command": ["uvx", "puregym-mcp"],
"environment": {
"PUREGYM_USERNAME": "your-username",
"PUREGYM_PASSWORD": "your-password"
}
}
}
}
The environment block is optional and only needed for authenticated features.
Remote Deployment
The server supports both streamable-http and sse for remote MCP clients.
Bearer Token Authentication
HTTP transports (streamable-http, sse) require Bearer token authentication to protect your booking
capabilities:
export PUREGYM_USERNAME="your-email@example.com"
export PUREGYM_PASSWORD="your-password"
export MCP_AUTH_TOKEN="your-secret-bearer-token"
puregym-mcp --transport streamable-http --host 0.0.0.0 --port 8000 --streamable-http-path /mcp
Connect from MCP clients using Simple Auth or HTTP Bearer Token authentication with your
MCP_AUTH_TOKEN.
Docker Compose Example
services:
puregym-mcp:
image: puregym-mcp
environment:
- PUREGYM_USERNAME=${PUREGYM_USERNAME}
- PUREGYM_PASSWORD=${PUREGYM_PASSWORD}
- MCP_AUTH_TOKEN=${MCP_AUTH_TOKEN}
ports:
- "8000:8000"
command:
- --transport
- streamable-http
- --host
- 0.0.0.0
- --port
- "8000"
- --streamable-http-path
- /mcp
Store sensitive values in a .env file (never commit this file):
PUREGYM_USERNAME=your-email@example.com
PUREGYM_PASSWORD=your-password
MCP_AUTH_TOKEN=your-secret-bearer-token-min-16-chars-recommended
Public Read-Only Hosting
- Hosted endpoint:
https://puregym-mcp.jorgesintes.dev/mcp - Runs in anonymous mode (no booking capabilities)
- Use this for public class discovery only
Python Library
The package also exposes a reusable client and service layer:
from puregym_mcp import PureGymClient, PureGymService
# Anonymous client
client = PureGymClient()
# Authenticated client with custom timeout
client = PureGymClient(
username="your-username",
password="your-password",
timeout=30.0 # seconds
)
service = PureGymService(client)
# Book and cancel return typed results
result = await service.book_class(booking_id, activity_id, payment_type)
print(result.participation_id) # snake_case field
cancel_result = await service.cancel_booking(participation_id)
print(cancel_result.status)
Docker
Build the image:
docker build -t puregym-mcp .
Run a public read-only server:
docker run --rm -p 8000:8000 puregym-mcp
Run a private authenticated server (HTTP transport with Bearer token auth):
docker run --rm -p 8000:8000 \
-e PUREGYM_USERNAME=your-email \
-e PUREGYM_PASSWORD=your-password \
-e MCP_AUTH_TOKEN=your-secret-token \
puregym-mcp
Override the default container transport or path when needed:
docker run --rm -p 8000:8000 puregym-mcp \
--transport sse \
--host 0.0.0.0 \
--port 8000 \
--sse-path /sse
Development
Clone the repo and install dev dependencies:
uv sync --dev
Run from source:
uv run puregym-mcp --transport stdio
Run checks:
uv run pytest
uv run python -m compileall puregym_mcp tests
uv build
Test the built package locally before publishing:
uvx --from dist/puregym_mcp-0.3.0-py3-none-any.whl puregym-mcp --transport stdio
Run real API integration tests (requires credentials):
PUREGYM_USERNAME=your-username PUREGYM_PASSWORD=your-password uv run pytest tests/real_api -m real_api
MCP Inspector
Launch the Inspector against this repo:
npx @modelcontextprotocol/inspector \
uv \
--directory /path/to/puregym-mcp \
run \
puregym-mcp --transport stdio
Launch it in authenticated mode:
npx @modelcontextprotocol/inspector \
-e PUREGYM_USERNAME=your-email \
-e PUREGYM_PASSWORD=your-password \
-- \
uv \
--directory /path/to/puregym-mcp \
run \
puregym-mcp --transport stdio
The Inspector UI opens at http://localhost:6274.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file puregym_mcp-0.4.0.tar.gz.
File metadata
- Download URL: puregym_mcp-0.4.0.tar.gz
- Upload date:
- Size: 13.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
95a658c55da345d5894d7f3fc375737846a74528d89d9e3a1f684d8dbe40b2c0
|
|
| MD5 |
9dbeefa3f2d1d800f12902c513947498
|
|
| BLAKE2b-256 |
672aeccbfc70cc56688a7a9c243b0ed32fe47176e097496fb0aef1fc094ba9ca
|
Provenance
The following attestation bundles were made for puregym_mcp-0.4.0.tar.gz:
Publisher:
publish.yml on JorgeSintes/puregym-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
puregym_mcp-0.4.0.tar.gz -
Subject digest:
95a658c55da345d5894d7f3fc375737846a74528d89d9e3a1f684d8dbe40b2c0 - Sigstore transparency entry: 1195425399
- Sigstore integration time:
-
Permalink:
JorgeSintes/puregym-mcp@7c26c4bbb46591ad21a48d7dbc77112724da2d07 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/JorgeSintes
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7c26c4bbb46591ad21a48d7dbc77112724da2d07 -
Trigger Event:
release
-
Statement type:
File details
Details for the file puregym_mcp-0.4.0-py3-none-any.whl.
File metadata
- Download URL: puregym_mcp-0.4.0-py3-none-any.whl
- Upload date:
- Size: 18.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd8aa8d193db3a64e3937b3f343844cf3226a2c2cc5b77dd26777e17c4a36d64
|
|
| MD5 |
f393e40aed3b390420d5c0196aa128ce
|
|
| BLAKE2b-256 |
5a52626fe356c50ffaff4accf0041476fd6d8fa0a747d78eb6f3270941da74fe
|
Provenance
The following attestation bundles were made for puregym_mcp-0.4.0-py3-none-any.whl:
Publisher:
publish.yml on JorgeSintes/puregym-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
puregym_mcp-0.4.0-py3-none-any.whl -
Subject digest:
dd8aa8d193db3a64e3937b3f343844cf3226a2c2cc5b77dd26777e17c4a36d64 - Sigstore transparency entry: 1195425522
- Sigstore integration time:
-
Permalink:
JorgeSintes/puregym-mcp@7c26c4bbb46591ad21a48d7dbc77112724da2d07 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/JorgeSintes
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7c26c4bbb46591ad21a48d7dbc77112724da2d07 -
Trigger Event:
release
-
Statement type: