Search gyms and personal trainers in Taiwan, check open time slots, and book or cancel sessions.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Cancel a confirmed, pending or awaiting_payment booking made with request_booking, when the customer asks to. Frees the place for others and cannot be undone; a booking paid online is refunded minus the card processing fee Stripe charged and BOP's fee (5.5% + NT$10). Online cancellation closes at the business's cutoff (online_cancellation in get_business; 120 minutes before the start time unless the business sets a longer one).
booking_id returned by request_booking
business_id from search_businesses
status_token returned once by request_booking
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http bop https://mcp.srct.tw/mcp
Cancel a confirmed, pending or awaiting_payment booking made with request_booking, when the customer asks to. Frees the place for others and cannot be undone; a booking paid online is refunded minus the card processing fee Stripe charged and BOP's fee (5.5% + NT$10). Online cancellation closes at the business's cutoff (online_cancellation in get_business; 120 minutes before the start time unless the business sets a longer one).
| Argument | Type | Description |
|---|---|---|
| booking_id* | string | booking_id returned by request_booking |
| business_id* | string | business_id from search_businesses |
| status_token* | string | status_token returned once by request_booking |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"business_id",
"booking_id",
"status_token"
],
"properties": {
"booking_id": {
"type": "string",
"maxLength": 16,
"description": "booking_id returned by request_booking"
},
"business_id": {
"type": "string",
"maxLength": 40,
"description": "business_id from search_businesses"
},
"status_token": {
"type": "string",
"maxLength": 64,
"description": "status_token returned once by request_booking"
}
}
}Pay for a booking whose status is awaiting_payment, with a payment credential the customer approved for the booking's amount and currency. payment.handler_id must come from the booking's payment_handlers ("stripe_payments"), and credential is {type: "stripe_payment_token", token: "spt_…"}: a Stripe shared payment token issued to the handler's business_profile. Charges the customer once (repeating the call does not charge twice). Returns the booking (confirmed, or pending if the business confirms it) and the payment result; if payment.status is requires_action, open payment.redirect_url for the customer and call again with the same credential.
| Argument | Type | Description |
|---|---|---|
| payment* | object | Payment credential for this booking |
| booking_id* | string | booking_id returned by request_booking |
| business_id* | string | business_id from search_businesses |
| status_token* | string | status_token returned once by request_booking |
| idempotency_key | string | Optional key (8–64 letters, digits, _ . : -) that makes retries safe: the same key with the same parameters returns the original result |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"business_id",
"booking_id",
"status_token",
"payment"
],
"properties": {
"payment": {
"type": "object",
"required": [
"handler_id",
"instrument_type",
"credential"
],
"properties": {
"credential": {
"type": "object",
"required": [
"type",
"token"
],
"properties": {
"type": {
"type": "string",
"const": "stripe_payment_token"
},
"token": {
"type": "string",
"maxLength": 255,
"description": "Stripe shared payment token, e.g. spt_…"
}
}
},
"handler_id": {
"type": "string",
"maxLength": 40,
"description": "id from payment_handlers, e.g. stripe_payments"
},
"instrument_type": {
"enum": [
"card",
"link"
],
"type": "string",
"description": "Instrument type the customer chose"
}
},
"description": "Payment credential for this booking"
},
"booking_id": {
"type": "string",
"maxLength": 16,
"description": "booking_id returned by request_booking"
},
"business_id": {
"type": "string",
"maxLength": 40,
"description": "business_id from search_businesses"
},
"status_token": {
"type": "string",
"maxLength": 64,
"description": "status_token returned once by request_booking"
},
"idempotency_key": {
"type": "string",
"maxLength": 64,
"description": "Optional key (8–64 letters, digits, _ . : -) that makes retries safe: the same key with the same parameters returns the original result"
}
}
}List open time slots (Asia/Taipei) for one service in the next 1–14 days, with remaining capacity. Use the returned slot value as-is in request_booking. Read-only.
| Argument | Type | Description |
|---|---|---|
| days | integer | How many days ahead, default 14 |
| teacher | string | Only slots taught by this teacher or trainer |
| service_id* | string | service_id from get_business |
| business_id* | string | business_id from search_businesses |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"business_id",
"service_id"
],
"properties": {
"days": {
"type": "integer",
"maximum": 14,
"minimum": 1,
"description": "How many days ahead, default 14"
},
"teacher": {
"type": "string",
"maxLength": 20,
"description": "Only slots taught by this teacher or trainer"
},
"service_id": {
"type": "string",
"maxLength": 40,
"description": "service_id from get_business"
},
"business_id": {
"type": "string",
"maxLength": 40,
"description": "business_id from search_businesses"
}
}
}For businesses whose booking_mode is external_link: get a link to the business's own booking page for one service. The click is counted for the business. Booking and payment happen on that page.
| Argument | Type | Description |
|---|---|---|
| service_id* | string | service_id from get_business |
| business_id* | string | business_id from search_businesses |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"business_id",
"service_id"
],
"properties": {
"service_id": {
"type": "string",
"maxLength": 40,
"description": "service_id from get_business"
},
"business_id": {
"type": "string",
"maxLength": 40,
"description": "business_id from search_businesses"
}
}
}Get the current status of a booking made with request_booking (confirmed, waiting for the business, awaiting online payment, declined, or cancelled), including payment and refund details. Read-only.
| Argument | Type | Description |
|---|---|---|
| booking_id* | string | booking_id returned by request_booking |
| business_id* | string | business_id from search_businesses |
| status_token* | string | status_token returned once by request_booking |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"business_id",
"booking_id",
"status_token"
],
"properties": {
"booking_id": {
"type": "string",
"maxLength": 16,
"description": "booking_id returned by request_booking"
},
"business_id": {
"type": "string",
"maxLength": 40,
"description": "business_id from search_businesses"
},
"status_token": {
"type": "string",
"maxLength": 64,
"description": "status_token returned once by request_booking"
}
}
}Get one business's public profile (city, address, hours, booking and cancellation policy, contact, FAQ) and its active services with prices, durations and weekly schedules. Read-only.
| Argument | Type | Description |
|---|---|---|
| business_id* | string | business_id from search_businesses |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"business_id"
],
"properties": {
"business_id": {
"type": "string",
"maxLength": 40,
"description": "business_id from search_businesses"
}
}
}Change the slot or quantity of a pending, awaiting_payment or confirmed booking, when the customer asks to. Replaces the booking's time or quantity and frees the old place. Use a slot value from get_availability. A booking paid online can change its slot but not its quantity (cancel and rebook instead). Changes close at the same cutoff as online cancellation.
| Argument | Type | Description |
|---|---|---|
| slot | string | New slot value from get_availability |
| quantity | integer | New number of people or places |
| booking_id* | string | booking_id returned by request_booking |
| business_id* | string | business_id from search_businesses |
| status_token* | string | status_token returned once by request_booking |
| idempotency_key | string | Optional key (8–64 letters, digits, _ . : -) that makes retries safe: the same key with the same parameters returns the original result |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"business_id",
"booking_id",
"status_token"
],
"properties": {
"slot": {
"type": "string",
"maxLength": 16,
"description": "New slot value from get_availability"
},
"quantity": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "New number of people or places"
},
"booking_id": {
"type": "string",
"maxLength": 16,
"description": "booking_id returned by request_booking"
},
"business_id": {
"type": "string",
"maxLength": 40,
"description": "business_id from search_businesses"
},
"status_token": {
"type": "string",
"maxLength": 64,
"description": "status_token returned once by request_booking"
},
"idempotency_key": {
"type": "string",
"maxLength": 64,
"description": "Optional key (8–64 letters, digits, _ . : -) that makes retries safe: the same key with the same parameters returns the original result"
}
}
}Create a booking for one open slot on behalf of the customer, after the customer has agreed to the service, time, quantity and contact details. Sends the customer's name, phone and email to the business. The result is either 'confirmed' or 'pending' (waiting for the business to confirm). Payment is at the venue, unless the business takes online payment (payment in get_business): then the status is 'awaiting_payment' with amount, currency, expires_at and payment_handlers, and the place is held until expires_at for complete_booking. Returns booking_id and a one-time status_token for get_booking_status, complete_booking, modify_booking and cancel_booking. Repeating the call for the same contact details, service and slot is rejected as a duplicate.
| Argument | Type | Description |
|---|---|---|
| note | string | Optional request for the business, e.g. 'first time, please arrive early'. Do not include health or medical information. |
| slot* | string | slot value from get_availability, e.g. 2026-10-20T19:30 |
| email* | string | Customer's email, for the business to reach them |
| phone* | string | Customer's mobile phone, for the business to reach them |
| quantity* | integer | Number of people or places |
| service_id* | string | service_id from get_business |
Search BOP's listed businesses by keyword (business name, city or district, or type of class) and/or category. Returns up to 10 businesses with a few matching services. Read-only.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum results, default 5 |
| keyword | string | Words to match, e.g. 'personal training' or 'Taipei' |
| category | string | gym, coaching (personal trainers), sauna, or recovery |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 10,
"minimum": 1,
"description": "Maximum results, default 5"
},
"keyword": {
"type": "string",
"maxLength": 40,
"description": "Words to match, e.g. 'personal training' or 'Taipei'"
},
"category": {
"enum": [
"gym",
"coaching",
"sauna",
"recovery"
],
"type": "string",
"description": "gym, coaching (personal trainers), sauna, or recovery"
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 2, 2026.
Takes a password, API key or token as an argument, so the secret passes through the model's context and chat logs.
Fix: Read credentials from the server's own configuration (environment, OAuth) instead of a tool argument.
| business_id* | string | business_id from search_businesses |
| customer_name* | string | Name the business should use |
| idempotency_key | string | Optional key (8–64 letters, digits, _ . : -) that makes retries safe: the same key with the same parameters returns the original result |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"business_id",
"service_id",
"slot",
"quantity",
"customer_name",
"phone",
"email"
],
"properties": {
"note": {
"type": "string",
"maxLength": 200,
"description": "Optional request for the business, e.g. 'first time, please arrive early'. Do not include health or medical information."
},
"slot": {
"type": "string",
"maxLength": 16,
"description": "slot value from get_availability, e.g. 2026-10-20T19:30"
},
"email": {
"type": "string",
"maxLength": 254,
"description": "Customer's email, for the business to reach them"
},
"phone": {
"type": "string",
"maxLength": 20,
"description": "Customer's mobile phone, for the business to reach them"
},
"quantity": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Number of people or places"
},
"service_id": {
"type": "string",
"maxLength": 40,
"description": "service_id from get_business"
},
"business_id": {
"type": "string",
"maxLength": 40,
"description": "business_id from search_businesses"
},
"customer_name": {
"type": "string",
"maxLength": 30,
"description": "Name the business should use"
},
"idempotency_key": {
"type": "string",
"maxLength": 64,
"description": "Optional key (8–64 letters, digits, _ . : -) that makes retries safe: the same key with the same parameters returns the original result"
}
}
}