MCP Server

GymFlexa Gym Management

com.gymflexa/gymflexa
Business & Operations Public & reachable MCP 2025-11-25

What this MCP does

Provides tenant-scoped gym configuration, service catalogs, availability, schedule counts, and aggregated payment summaries.

get_gym
Get gym opening hours and settings
Use this when someone asks for one gym's opening hours, timezone, currency or default session length. Returns the gym's scheduling settings with up to 14 opening-hour rows, Monday first; an id outside the organization returns not-found. Not for free session slots.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['gymId'], 'properties': {'gymId': {'type': 'string', 'pattern': '^[0-9a-f]{24}$', 'description': "Id of one of the user's gyms, as the gym list returns it (24 lowercase hex characters)"}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['status', 'gym'], 'properties': {'gym': {'anyOf': [{'type': 'object', 'required': ['id', 'name', 'currency', 'defaultLocale', 'timezone', 'countryCode', 'firstDayOfTheWeek', 'appointmentDuration', 'openingHours', 'lastEditTime'], 'properties': {'id': {'type': 'string', 'pattern': '^[0-9a-f]{24}$'}, 'name': {'type': 'string', 'maxLength': 200}, 'currency': {'anyOf': [{'type': 'string', 'pattern': '^[A-Z]{3}$'}, {'type': 'null'}]}, 'timezone': {'anyOf': [{'type': 'string', 'maxLength': 64}, {'type': 'null'}]}, 'countryCode': {'anyOf': [{'type': 'string', 'pattern': '^[A-Z]{2}$'}, {'type': 'null'}]}, 'lastEditTime': {'anyOf': [{'type': 'string', 'maxLength': 32}, {'type': 'null'}]}, 'openingHours': {'type': 'array', 'items': {'type': 'object', 'required': ['day', 'open', 'close'], 'properties': {'day': {'enum': ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'], 'type': 'string'}, 'open': {'anyOf': [{'type': 'string', 'pattern': '^\\d{2}:\\d{2}$'}, {'type': 'null'}]}, 'close': {'anyOf': [{'type': 'string', 'pattern': '^\\d{2}:\\d{2}$'}, {'type': 'null'}]}}, 'additionalProperties': False}, 'maxItems': 14}, 'defaultLocale': {'anyOf': [{'type': 'string', 'maxLength': 16}, {'type': 'null'}]}, 'firstDayOfTheWeek': {'anyOf': [{'enum': ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'], 'type': 'string'}, {'type': 'null'}]}, 'appointmentDuration': {'type': ['number', 'null'], 'description': 'Default session length in minutes'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Scheduling settings of the gym; null when not found. Address, phone, website, organization, billing, integrations, reminders, members and arbitrary metadata are excluded.'}, 'status': {'enum': ['found', 'not-found'], 'type': 'string'}}, 'additionalProperties': False}
get_gym_availability
Find free session slots
Use this when someone asks when their gym has free slots or openings for a class or session, or which coming days are fully booked. Returns, per day, how many online-booking slots are open plus the first start and last end time, for the next 14 days that have openings, so a skipped day has none (no member or trainer names). Not for booking a session.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['gymId'], 'properties': {'gymId': {'type': 'string', 'pattern': '^[0-9a-f]{24}$', 'description': "Id of one of the user's gyms, as the gym list returns it (24 lowercase hex characters)"}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['timezone', 'availableDayCount', 'availableSlotCount', 'days'], 'properties': {'days': {'type': 'array', 'items': {'type': 'object', 'required': ['day', 'slotCount', 'firstStartTime', 'lastEndTime'], 'properties': {'day': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}, 'slotCount': {'type': 'integer', 'minimum': 0}, 'lastEndTime': {'anyOf': [{'type': 'string', 'maxLength': 32}, {'type': 'null'}]}, 'firstStartTime': {'anyOf': [{'type': 'string', 'maxLength': 32}, {'type': 'null'}]}}, 'additionalProperties': False}, 'maxItems': 14, 'description': "One row per day with open online-booking slots inside the gym's booking window, in date order. Slot counts and times only; members, appointments, trainers and the reason a time is unavailable are never exposed."}, 'timezone': {'anyOf': [{'type': 'string', 'maxLength': 64}, {'type': 'null'}]}, 'availableDayCount': {'type': 'integer', 'minimum': 0}, 'availableSlotCount': {'type': 'integer', 'minimum': 0}}, 'additionalProperties': False}
get_gym_payment_summary
Summarize gym takings
Use this when someone asks how much their gym took in, or how many payments succeeded, failed or were canceled. Returns payment counts by status and totals by currency; totals include every status. Covers up to 31 days and 100 payments and defaults to the next 7 days, which hold no payments yet. Not for moving money: it cannot charge, refund or transfer.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['gymId'], 'properties': {'gymId': {'type': 'string', 'pattern': '^[0-9a-f]{24}$', 'description': "Id of one of the user's gyms, as the gym list returns it (24 lowercase hex characters)"}, 'endTime': {'type': 'string', 'maxLength': 32, 'description': 'End of the range as an ISO 8601 date-time, after startTime and at most 31 days later; defaults to 7 days after the start'}, 'startTime': {'type': 'string', 'maxLength': 32, 'description': 'Start of the range as an ISO 8601 date-time, matched against when each payment was recorded; defaults to now, so pass a past date for past takings'}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['range', 'recordCount', 'recordCountIsLowerBound', 'totalsArePartial', 'totals', 'statuses'], 'properties': {'range': {'type': 'object', 'required': ['startTime', 'endTime'], 'properties': {'endTime': {'type': 'string', 'maxLength': 32}, 'startTime': {'type': 'string', 'maxLength': 32}}, 'additionalProperties': False}, 'totals': {'type': 'array', 'items': {'type': 'object', 'required': ['currency', 'amount'], 'properties': {'amount': {'type': 'number'}, 'currency': {'type': 'string', 'pattern': '^(?:[A-Z]{3}|UNSPECIFIED)$'}}, 'additionalProperties': False}, 'maxItems': 100, 'description': 'Amount totals per currency, summed over every status including FAILED and CANCELED payments. Payment and member ids, processor or card data, contacts, notes, discounts, decline reasons, services and individual transactions are never returned.'}, 'statuses': {'type': 'array', 'items': {'type': 'object', 'required': ['status', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0}, 'status': {'type': 'string', 'pattern': '^[A-Z0-9_-]{1,48}$'}}, 'additionalProperties': False}, 'maxItems': 100, 'description': 'Payment counts per status, such as SUCCEEDED, FAILED, CANCELED or OTHER'}, 'recordCount': {'type': 'integer', 'minimum': 0}, 'totalsArePartial': {'type': 'boolean', 'description': 'True when more than 100 payments fall in the range or any returned amount is missing or invalid'}, 'recordCountIsLowerBound': {'type': 'boolean'}}, 'additionalProperties': False}
get_gym_schedule_summary
Count bookings per day
Use this when someone asks how busy their gym is or how many appointments or sessions are booked each day, past or upcoming. Returns booking counts per UTC day for one gym, whatever their status, for any window of at most 31 days (the next 7 by default); counting stops at 100. Not for counting cancellations or seeing which members are booked.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['gymId'], 'properties': {'gymId': {'type': 'string', 'pattern': '^[0-9a-f]{24}$', 'description': "Id of one of the user's gyms, as the gym list returns it (24 lowercase hex characters)"}, 'endTime': {'type': 'string', 'maxLength': 32, 'description': 'End of the range as an ISO 8601 date-time, after startTime and at most 31 days later; defaults to 7 days after the start'}, 'startTime': {'type': 'string', 'maxLength': 32, 'description': 'Start of the range as an ISO 8601 date-time; defaults to now'}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['range', 'recordCount', 'recordCountIsLowerBound', 'days'], 'properties': {'days': {'type': 'array', 'items': {'type': 'object', 'required': ['day', 'count'], 'properties': {'day': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}, 'count': {'type': 'integer', 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 100, 'description': 'One row per UTC day that has bookings, canceled ones included. Aggregate counts only: appointment ids and times, member information, services, notes, trainer data and attendance history are never returned.'}, 'range': {'type': 'object', 'required': ['startTime', 'endTime'], 'properties': {'endTime': {'type': 'string', 'maxLength': 32}, 'startTime': {'type': 'string', 'maxLength': 32}}, 'additionalProperties': False}, 'recordCount': {'type': 'integer', 'minimum': 0}, 'recordCountIsLowerBound': {'type': 'boolean', 'description': 'True when more than 100 bookings fall in the range'}}, 'additionalProperties': False}
list_gyms
List your gyms
Use this when someone asks which gyms or studios they run in GymFlexa, or a gym's id is needed. Returns gyms with id, name, currency, default language and last edit time, alphabetical, 25 per page by default. Not for finding a member.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'description': 'Maximum number of gyms to return (default 25, maximum 100)', 'exclusiveMinimum': 0}, 'cursor': {'type': 'string', 'maxLength': 4096, 'description': 'The nextCursor of the previous page of this listing; absent for the first page'}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['gyms', 'hasMore', 'nextCursor'], 'properties': {'gyms': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'currency', 'defaultLocale', 'lastEditTime'], 'properties': {'id': {'type': 'string', 'pattern': '^[0-9a-f]{24}$'}, 'name': {'type': 'string', 'maxLength': 200}, 'currency': {'anyOf': [{'type': 'string', 'pattern': '^[A-Z]{3}$'}, {'type': 'null'}]}, 'lastEditTime': {'anyOf': [{'type': 'string', 'maxLength': 32}, {'type': 'null'}]}, 'defaultLocale': {'anyOf': [{'type': 'string', 'maxLength': 16}, {'type': 'null'}]}}, 'additionalProperties': False}, 'maxItems': 100, 'description': 'Gyms in the signed-in organization, alphabetical. Organization, address, contact, billing, integration and member data are never returned.'}, 'hasMore': {'type': 'boolean'}, 'nextCursor': {'anyOf': [{'type': 'string', 'maxLength': 4096}, {'type': 'null'}], 'description': 'Cursor for the next page; null on the last page'}}, 'additionalProperties': False}
list_services
Look up class and service prices
Use this when someone asks what their gym charges for a class, personal training session or other service. Returns catalog service names with price and last edit time for one gym, alphabetical, 25 per page by default. Not for what a particular member bought or attended.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['gymId'], 'properties': {'gymId': {'type': 'string', 'pattern': '^[0-9a-f]{24}$', 'description': "Id of one of the user's gyms, as the gym list returns it (24 lowercase hex characters)"}, 'limit': {'type': 'integer', 'maximum': 100, 'description': 'Maximum services to return (default 25, maximum 100)', 'exclusiveMinimum': 0}, 'cursor': {'type': 'string', 'maxLength': 4096, 'description': 'The nextCursor of the previous page of this listing; absent for the first page'}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['services', 'hasMore', 'nextCursor'], 'properties': {'hasMore': {'type': 'boolean'}, 'services': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'price', 'lastEditTime'], 'properties': {'name': {'type': 'string', 'maxLength': 200}, 'price': {'type': ['number', 'null'], 'description': "Price in the gym's currency"}, 'lastEditTime': {'anyOf': [{'type': 'string', 'maxLength': 32}, {'type': 'null'}]}}, 'additionalProperties': False}, 'maxItems': 100, 'description': 'Service catalog entries, alphabetical. Service ids, member history, notes, staff commissions, organization ids and arbitrary metadata are excluded.'}, 'nextCursor': {'anyOf': [{'type': 'string', 'maxLength': 4096}, {'type': 'null'}], 'description': 'Cursor for the next page; null on the last page'}}, 'additionalProperties': False}
show_gym_overview
Show gym overview
Use this when someone wants a quick overview or dashboard of one gym. Returns an overview card with the gym's details, booking counts for the next 7 days, open online-booking slots across up to 14 days with openings and up to 12 services with prices (no member, trainer or payment data). Not for a single member or booking.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['gymId'], 'properties': {'gymId': {'type': 'string', 'pattern': '^[0-9a-f]{24}$', 'description': "Id of one of the user's gyms, as the gym list returns it (24 lowercase hex characters)"}}}
Output schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['gym', 'scheduleRange', 'appointmentCount', 'appointmentCountIsLowerBound', 'scheduleDays', 'serviceCount', 'serviceCountIsLowerBound', 'services', 'availableDayCount', 'availableSlotCount', 'availabilityDays'], 'properties': {'gym': {'anyOf': [{'type': 'object', 'required': ['id', 'name', 'currency', 'defaultLocale', 'timezone'], 'properties': {'id': {'type': 'string', 'pattern': '^[0-9a-f]{24}$'}, 'name': {'type': 'string', 'maxLength': 200}, 'currency': {'anyOf': [{'type': 'string', 'pattern': '^[A-Z]{3}$'}, {'type': 'null'}]}, 'timezone': {'anyOf': [{'type': 'string', 'maxLength': 64}, {'type': 'null'}]}, 'defaultLocale': {'anyOf': [{'type': 'string', 'maxLength': 16}, {'type': 'null'}]}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Gym metadata; null when not found. The overview never reads or returns member records, individual appointments or payments, attendance or service history, trainers, notes or health and fitness details.'}, 'services': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'price', 'lastEditTime'], 'properties': {'name': {'type': 'string', 'maxLength': 200}, 'price': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'lastEditTime': {'anyOf': [{'type': 'string', 'maxLength': 32}, {'type': 'null'}]}}, 'additionalProperties': False}, 'maxItems': 12}, 'scheduleDays': {'type': 'array', 'items': {'type': 'object', 'required': ['day', 'count'], 'properties': {'day': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}, 'count': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 100}, 'serviceCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, 'scheduleRange': {'type': 'object', 'required': ['startTime', 'endTime'], 'properties': {'endTime': {'type': 'string', 'maxLength': 32}, 'startTime': {'type': 'string', 'maxLength': 32}}, 'additionalProperties': False}, 'appointmentCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, 'availabilityDays': {'type': 'array', 'items': {'type': 'object', 'required': ['day', 'count'], 'properties': {'day': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}, 'count': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 14}, 'availableDayCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, 'availableSlotCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, 'serviceCountIsLowerBound': {'type': 'boolean'}, 'appointmentCountIsLowerBound': {'type': 'boolean'}}, 'additionalProperties': False}
Changed
get_gym_payment_summary
Oct. 1, 2026, 2:42 a.m.
Changed
show_gym_overview
Sept. 29, 2026, 2:48 a.m.
Changed
list_services
Sept. 29, 2026, 2:48 a.m.
Changed
get_gym_payment_summary
Sept. 29, 2026, 2:48 a.m.
Changed
get_gym_schedule_summary
Sept. 29, 2026, 2:48 a.m.
Changed
get_gym_availability
Sept. 29, 2026, 2:48 a.m.
Changed
get_gym
Sept. 29, 2026, 2:48 a.m.
Changed
list_gyms
Sept. 29, 2026, 2:48 a.m.
Added
show_gym_overview
Sept. 27, 2026, 2:40 a.m.
Added
list_services
Sept. 27, 2026, 2:40 a.m.
Added
get_gym_payment_summary
Sept. 27, 2026, 2:40 a.m.
Added
get_gym_schedule_summary
Sept. 27, 2026, 2:40 a.m.
Added
get_gym_availability
Sept. 27, 2026, 2:40 a.m.
Added
get_gym
Sept. 27, 2026, 2:40 a.m.
Added
list_gyms
Sept. 27, 2026, 2:40 a.m.