Endpoints: 30,862MCP servers: 18,583Payout addresses: 2,106Paid calls: 1,607Letters: 14Defects: 1,351counted 3 min ago
teppi

Server definition

Hash
sha256:8cb34c629dd7be68842f82c0f74dc8b6393607c886bc2a4c00828931119fd7c1
What it is
What a remote MCP server returned when asked what it offers: 7 tools

The blob, as servednamed by its sha256

{ "instructions": "# Safe gym operations with GymFlexa\n\nThis skill drives the GymFlexa MCP connector. The user must connect GymFlexa\nand authorize an account with live access to the intended organization. If\nauthorization fails, ask the user to connect GymFlexa. Never request, embed, or\nrepeat an API key, password, OAuth token, payment credential, or webhook\nsecret.\n\n## Read-only administrative boundary\n\nEvery available tool is read-only, idempotent, tenant-scoped, bounded, and\nclosed-world. The connector cannot create, edit, book, reschedule, cancel,\ndelete, message, charge, refund, retry, settle, transfer, or move funds. It\ncannot provide workout, nutrition, medical, insurance, employment, credit,\neligibility, or another individualized or high-impact recommendation. Do not\nimply that a read changed GymFlexa. For a requested change, offer a relevant\nsafe inspection and direct the authorized operator to first-party controls.\n\n## Resource identifiers and tenant checks\n\n`gymId` is the only exposed record identifier. It must be an exact lowercase\n24-character hex id returned by `list_gyms`. It selects one gym owned by the\nsigned-in user's organization and scopes every follow-up read. Never guess an\nid, treat an opaque id as authority, or reuse one from another organization.\nMalformed and cross-tenant ids fail closed.\n\nThe availability API is also used by GymFlexa's public booking page. The\nconnector must finish its tenant-owned gym lookup before calling that route.\nIf ownership cannot be proved, stop; never use public availability as a\ncross-tenant fallback.\n\n## Available tools\n\n| Tool | Use it when someone asks… |\n| -------------------------- | ---------------------------------------------------------------------------------------- |\n| `list_gyms` | which gyms they run; also resolves the gym id every other tool needs |\n| `get_gym` | for a gym's opening hours, timezone, currency or session length |\n| `get_gym_availability` | when there are free session slots, or which coming days are fully booked (up to 14 days) |\n| `get_gym_schedule_summary` | how busy each UTC day is, past or upcoming (booking counts, at most 31 days) |\n| `get_gym_payment_summary` | how much was taken in, by status and currency (at most 31 days) |\n| `list_services` | what a class, personal training session or other service costs |\n| `show_gym_overview` | for a one-card overview of one gym |\n\n`list_gyms` and `list_services` use opaque cursors and accept a maximum page of 100. Report `hasMore` and reuse `nextCursor`; never claim completeness when\nmore pages exist. A cursor is query-bound and must not be reused for another\ngym.\n\nBoth summary tools inspect at most 101 source records, return at most 100, and\nmark `recordCountIsLowerBound` when more exist. Their default range starts now\nand runs seven days forward, and their maximum is 31 days; pass explicit past\ndates for past payments or past workload. The overview counts at most 100 scheduled\nrecords, previews 12 services, and examines at most 14 availability days. A\ndisplayed `+` count is a lower bound, not an estimate of the total.\n\n## Privacy boundary\n\nSafe results may include owned gym ids and display metadata; safe locale,\ncurrency, timezone and opening hours; public bookable-capacity summaries;\nservice-catalog names/prices; UTC-day aggregate schedule counts; aggregate\nrecorded payment statuses/totals; and no member-derived metric.\n\nThe connector intentionally cannot expose:\n\n- member names, ids, email, phone, address, language, profile, arbitrary\n fields, attendance, workout, service or payment history;\n- links among members, appointments, services or payments;\n- individual appointment ids, exact booked times, statuses, services or\n notes;\n- trainer/staff identity, contact, schedule, commission or performance data;\n- individual payment ids or amounts, services, discounts, notes, decline\n reasons, processor/customer ids, cardholder data, credentials or errors;\n- gym contact/address, organization internals, billing/trial state,\n integrations, reminders, webhooks or arbitrary upstream documents; or\n- raw upstream errors, secrets, logs, files or conversation history.\n\nDo not infer, reconstruct, request, or ask the user to paste excluded fields.\nOffer safe configuration, capacity, catalog, aggregate schedule/payment, or\nfirst-party-dashboard alternatives. The overview never queries member\nrecords. Schedule and payment tools request only minimum fields for immediate\naggregation and expose no person-linked record, identifier, exact booked time,\nor individual payment.\n\n## Configuration and capacity audit\n\n1. Use `list_gyms` unless the exact owned gym id is already available.\n2. Call `get_gym` for timezone, opening hours and configured duration.\n3. Call `get_gym_availability`. It follows the gym's own online-booking window\n (by default from two hours ahead to six months ahead) and returns the first\n 14 days that have openings.\n4. Compare configured hours with daily slot counts and first/last bookable\n times. Do not extrapolate beyond the days it returns or infer why time is\n unavailable.\n\nBookable availability times are administrative capacity, not an individual's\nbooked appointment. The schedule summary deliberately does not return exact\nbooked times.\n\n## Schedule audit\n\nUse `get_gym_schedule_summary` with an explicit bounded range when the user's\ndates matter. It groups source `startTime` values by UTC calendar day, then\ndiscards each value. State that the day basis is UTC, that canceled bookings\nare counted, and that the count may be a lower bound. Never infer member identity, attendance, trainer assignment,\nservice, status, or workload cause from a count.\n\n`show_gym_overview` uses a fixed seven-day schedule range and renders safe\naggregate metrics without querying members. Avoid restating every number if a\nconcise operational observation or next safe check answers the user.\n\n## Catalog and recorded-payment audit\n\nUse `list_services` for catalog names and prices. A catalog price is\nconfiguration, not proof of a final charge or member purchase.\n\nUse `get_gym_payment_summary` only for aggregate administrative status. It\nreturns status counts and amount totals by currency, never an individual row.\nThe currency totals add every status, FAILED and CANCELED included, so they\nare not the amount actually collected; say so, and use the status counts to\nshow how many payments succeeded.\nWhen `totalsArePartial` is true, say that totals cover only the bounded source\nrecords and must not be treated as the gym's full total. Recorded status is not\nindependent proof of bank settlement. The connector cannot charge, refund,\nretry, settle, transfer, or otherwise move funds.\n", "tools": [ { "description": "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "gymId": { "description": "Id of one of the user's gyms, as the gym list returns it (24 lowercase hex characters)", "pattern": "^[0-9a-f]{24}$", "type": "string" } }, "required": [ "gymId" ], "type": "object" }, "name": "get_gym", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "gym": { "anyOf": [ { "additionalProperties": false, "properties": { "appointmentDuration": { "description": "Default session length in minutes", "type": [ "number", "null" ] }, "countryCode": { "anyOf": [ { "pattern": "^[A-Z]{2}$", "type": "string" }, { "type": "null" } ] }, "currency": { "anyOf": [ { "pattern": "^[A-Z]{3}$", "type": "string" }, { "type": "null" } ] }, "defaultLocale": { "anyOf": [ { "maxLength": 16, "type": "string" }, { "type": "null" } ] }, "firstDayOfTheWeek": { "anyOf": [ { "enum": [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ], "type": "string" }, { "type": "null" } ] }, "id": { "pattern": "^[0-9a-f]{24}$", "type": "string" }, "lastEditTime": { "anyOf": [ { "maxLength": 32, "type": "string" }, { "type": "null" } ] }, "name": { "maxLength": 200, "type": "string" }, "openingHours": { "items": { "additionalProperties": false, "properties": { "close": { "anyOf": [ { "pattern": "^\\d{2}:\\d{2}$", "type": "string" }, { "type": "null" } ] }, "day": { "enum": [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ], "type": "string" }, "open": { "anyOf": [ { "pattern": "^\\d{2}:\\d{2}$", "type": "string" }, { "type": "null" } ] } }, "required": [ "day", "open", "close" ], "type": "object" }, "maxItems": 14, "type": "array" }, "timezone": { "anyOf": [ { "maxLength": 64, "type": "string" }, { "type": "null" } ] } }, "required": [ "id", "name", "currency", "defaultLocale", "timezone", "countryCode", "firstDayOfTheWeek", "appointmentDuration", "openingHours", "lastEditTime" ], "type": "object" }, { "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" } }, "required": [ "status", "gym" ], "type": "object" } }, { "description": "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "gymId": { "description": "Id of one of the user's gyms, as the gym list returns it (24 lowercase hex characters)", "pattern": "^[0-9a-f]{24}$", "type": "string" } }, "required": [ "gymId" ], "type": "object" }, "name": "get_gym_availability", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "availableDayCount": { "minimum": 0, "type": "integer" }, "availableSlotCount": { "minimum": 0, "type": "integer" }, "days": { "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.", "items": { "additionalProperties": false, "properties": { "day": { "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "type": "string" }, "firstStartTime": { "anyOf": [ { "maxLength": 32, "type": "string" }, { "type": "null" } ] }, "lastEndTime": { "anyOf": [ { "maxLength": 32, "type": "string" }, { "type": "null" } ] }, "slotCount": { "minimum": 0, "type": "integer" } }, "required": [ "day", "slotCount", "firstStartTime", "lastEndTime" ], "type": "object" }, "maxItems": 14, "type": "array" }, "timezone": { "anyOf": [ { "maxLength": 64, "type": "string" }, { "type": "null" } ] } }, "required": [ "timezone", "availableDayCount", "availableSlotCount", "days" ], "type": "object" } }, { "description": "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "endTime": { "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", "maxLength": 32, "type": "string" }, "gymId": { "description": "Id of one of the user's gyms, as the gym list returns it (24 lowercase hex characters)", "pattern": "^[0-9a-f]{24}$", "type": "string" }, "startTime": { "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", "maxLength": 32, "type": "string" } }, "required": [ "gymId" ], "type": "object" }, "name": "get_gym_payment_summary", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "range": { "additionalProperties": false, "properties": { "endTime": { "maxLength": 32, "type": "string" }, "startTime": { "maxLength": 32, "type": "string" } }, "required": [ "startTime", "endTime" ], "type": "object" }, "recordCount": { "minimum": 0, "type": "integer" }, "recordCountIsLowerBound": { "type": "boolean" }, "statuses": { "description": "Payment counts per status, such as SUCCEEDED, FAILED, CANCELED or OTHER", "items": { "additionalProperties": false, "properties": { "count": { "minimum": 0, "type": "integer" }, "status": { "pattern": "^[A-Z0-9_-]{1,48}$", "type": "string" } }, "required": [ "status", "count" ], "type": "object" }, "maxItems": 100, "type": "array" }, "totals": { "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.", "items": { "additionalProperties": false, "properties": { "amount": { "type": "number" }, "currency": { "pattern": "^(?:[A-Z]{3}|UNSPECIFIED)$", "type": "string" } }, "required": [ "currency", "amount" ], "type": "object" }, "maxItems": 100, "type": "array" }, "totalsArePartial": { "description": "True when more than 100 payments fall in the range or any returned amount is missing or invalid", "type": "boolean" } }, "required": [ "range", "recordCount", "recordCountIsLowerBound", "totalsArePartial", "totals", "statuses" ], "type": "object" } }, { "description": "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "endTime": { "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", "maxLength": 32, "type": "string" }, "gymId": { "description": "Id of one of the user's gyms, as the gym list returns it (24 lowercase hex characters)", "pattern": "^[0-9a-f]{24}$", "type": "string" }, "startTime": { "description": "Start of the range as an ISO 8601 date-time; defaults to now", "maxLength": 32, "type": "string" } }, "required": [ "gymId" ], "type": "object" }, "name": "get_gym_schedule_summary", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "days": { "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.", "items": { "additionalProperties": false, "properties": { "count": { "minimum": 0, "type": "integer" }, "day": { "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "type": "string" } }, "required": [ "day", "count" ], "type": "object" }, "maxItems": 100, "type": "array" }, "range": { "additionalProperties": false, "properties": { "endTime": { "maxLength": 32, "type": "string" }, "startTime": { "maxLength": 32, "type": "string" } }, "required": [ "startTime", "endTime" ], "type": "object" }, "recordCount": { "minimum": 0, "type": "integer" }, "recordCountIsLowerBound": { "description": "True when more than 100 bookings fall in the range", "type": "boolean" } }, "required": [ "range", "recordCount", "recordCountIsLowerBound", "days" ], "type": "object" } }, { "description": "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "cursor": { "description": "The nextCursor of the previous page of this listing; absent for the first page", "maxLength": 4096, "type": "string" }, "limit": { "description": "Maximum number of gyms to return (default 25, maximum 100)", "exclusiveMinimum": 0, "maximum": 100, "type": "integer" } }, "type": "object" }, "name": "list_gyms", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "gyms": { "description": "Gyms in the signed-in organization, alphabetical. Organization, address, contact, billing, integration and member data are never returned.", "items": { "additionalProperties": false, "properties": { "currency": { "anyOf": [ { "pattern": "^[A-Z]{3}$", "type": "string" }, { "type": "null" } ] }, "defaultLocale": { "anyOf": [ { "maxLength": 16, "type": "string" }, { "type": "null" } ] }, "id": { "pattern": "^[0-9a-f]{24}$", "type": "string" }, "lastEditTime": { "anyOf": [ { "maxLength": 32, "type": "string" }, { "type": "null" } ] }, "name": { "maxLength": 200, "type": "string" } }, "required": [ "id", "name", "currency", "defaultLocale", "lastEditTime" ], "type": "object" }, "maxItems": 100, "type": "array" }, "hasMore": { "type": "boolean" }, "nextCursor": { "anyOf": [ { "maxLength": 4096, "type": "string" }, { "type": "null" } ], "description": "Cursor for the next page; null on the last page" } }, "required": [ "gyms", "hasMore", "nextCursor" ], "type": "object" } }, { "description": "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "cursor": { "description": "The nextCursor of the previous page of this listing; absent for the first page", "maxLength": 4096, "type": "string" }, "gymId": { "description": "Id of one of the user's gyms, as the gym list returns it (24 lowercase hex characters)", "pattern": "^[0-9a-f]{24}$", "type": "string" }, "limit": { "description": "Maximum services to return (default 25, maximum 100)", "exclusiveMinimum": 0, "maximum": 100, "type": "integer" } }, "required": [ "gymId" ], "type": "object" }, "name": "list_services", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "hasMore": { "type": "boolean" }, "nextCursor": { "anyOf": [ { "maxLength": 4096, "type": "string" }, { "type": "null" } ], "description": "Cursor for the next page; null on the last page" }, "services": { "description": "Service catalog entries, alphabetical. Service ids, member history, notes, staff commissions, organization ids and arbitrary metadata are excluded.", "items": { "additionalProperties": false, "properties": { "lastEditTime": { "anyOf": [ { "maxLength": 32, "type": "string" }, { "type": "null" } ] }, "name": { "maxLength": 200, "type": "string" }, "price": { "description": "Price in the gym's currency", "type": [ "number", "null" ] } }, "required": [ "name", "price", "lastEditTime" ], "type": "object" }, "maxItems": 100, "type": "array" } }, "required": [ "services", "hasMore", "nextCursor" ], "type": "object" } }, { "description": "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.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "gymId": { "description": "Id of one of the user's gyms, as the gym list returns it (24 lowercase hex characters)", "pattern": "^[0-9a-f]{24}$", "type": "string" } }, "required": [ "gymId" ], "type": "object" }, "name": "show_gym_overview", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "appointmentCount": { "maximum": 9007199254740991, "minimum": 0, "type": "integer" }, "appointmentCountIsLowerBound": { "type": "boolean" }, "availabilityDays": { "items": { "additionalProperties": false, "properties": { "count": { "maximum": 9007199254740991, "minimum": 0, "type": "integer" }, "day": { "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "type": "string" } }, "required": [ "day", "count" ], "type": "object" }, "maxItems": 14, "type": "array" }, "availableDayCount": { "maximum": 9007199254740991, "minimum": 0, "type": "integer" }, "availableSlotCount": { "maximum": 9007199254740991, "minimum": 0, "type": "integer" }, "gym": { "anyOf": [ { "additionalProperties": false, "properties": { "currency": { "anyOf": [ { "pattern": "^[A-Z]{3}$", "type": "string" }, { "type": "null" } ] }, "defaultLocale": { "anyOf": [ { "maxLength": 16, "type": "string" }, { "type": "null" } ] }, "id": { "pattern": "^[0-9a-f]{24}$", "type": "string" }, "name": { "maxLength": 200, "type": "string" }, "timezone": { "anyOf": [ { "maxLength": 64, "type": "string" }, { "type": "null" } ] } }, "required": [ "id", "name", "currency", "defaultLocale", "timezone" ], "type": "object" }, { "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." }, "scheduleDays": { "items": { "additionalProperties": false, "properties": { "count": { "maximum": 9007199254740991, "minimum": 0, "type": "integer" }, "day": { "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "type": "string" } }, "required": [ "day", "count" ], "type": "object" }, "maxItems": 100, "type": "array" }, "scheduleRange": { "additionalProperties": false, "properties": { "endTime": { "maxLength": 32, "type": "string" }, "startTime": { "maxLength": 32, "type": "string" } }, "required": [ "startTime", "endTime" ], "type": "object" }, "serviceCount": { "maximum": 9007199254740991, "minimum": 0, "type": "integer" }, "serviceCountIsLowerBound": { "type": "boolean" }, "services": { "items": { "additionalProperties": false, "properties": { "lastEditTime": { "anyOf": [ { "maxLength": 32, "type": "string" }, { "type": "null" } ] }, "name": { "maxLength": 200, "type": "string" }, "price": { "anyOf": [ { "type": "number" }, { "type": "null" } ] } }, "required": [ "name", "price", "lastEditTime" ], "type": "object" }, "maxItems": 12, "type": "array" } }, "required": [ "gym", "scheduleRange", "appointmentCount", "appointmentCountIsLowerBound", "scheduleDays", "serviceCount", "serviceCountIsLowerBound", "services", "availableDayCount", "availableSlotCount", "availabilityDays" ], "type": "object" } } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:8cb34c629dd7be68842f82c0f74dc8b6393607c886bc2a4c00828931119fd7c1 | sha256sum