BOP
tw.srct/bopsrct.twstreamable-httpv1.0.0Scanned
Search gyms and personal trainers in Taiwan, check open time slots, and book or cancel sessions.
9 tools: 2 can delete or cancel things, 1 do something that can't be undone, 2 change things and 4 only read.
- Reads private data · 1
- Reads text others write · 2
- Can send data out · 1
- 4 findings
Anlyon alternative
5 of these tools change something. Run those as governed actions.
Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.
Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.
Import an OpenAPI spec →Tools
Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.
9 tools
Deletes or cancels 2Claude Code: deny
cancel_bookingCancel a confirmed, pending or awaiting_payment booking made with request_booking, when the customer asks to.No findings
Why it is in this group
- The name "cancel_booking" says "cancel": a word for removing or ending something.
- The description says "cannot be undone".
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote 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).
Annotations the server declares
- title: Cancel a booking
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: false
modify_bookingChange the slot or quantity of a pending, awaiting_payment or confirmed booking, when the customer asks to.No findings
Why it is in this group
- The name "modify_booking" says "modify": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it 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.
Annotations the server declares
- title: Change a booking
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: false
Can't be undone 1Claude Code: ask
complete_bookingPay for a booking whose status is awaiting_payment, with a payment credential the customer approved for the booking's amount and currency.Reads text others write3 findings
Why it is in this group
- The description's first verb is "pay": a word that usually means money moves, which cannot be taken back.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Findings
- Info
The description mentions "credential".
What this check looks forMatched text
description: "...tus is awaiting_payment, with a payment credential the customer approved for the booking's..."
- Info
The input schema at properties.payment.required[2] mentions "credential".
What this check looks forMatched text
inputSchema.properties.payment.required[2]: "credential"
- Info
The input schema at properties.payment.description mentions "credential".
What this check looks forMatched text
inputSchema.properties.payment.description: "Payment credential for this booking"
Description, as the server wrote it 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.
Annotations the server declares
- title: Pay for a booking
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
Changes things 2Claude Code: ask
get_booking_linkFor businesses whose booking_mode is external_link: get a link to the business's own booking page for one service.Reads text others write1 finding
Why it is in this group
- The name "get_booking_link" says "get": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Findings
- Warn
The server marks "get_booking_link" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The name "get_booking_link" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get external booking link
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
request_bookingCreate a booking for one open slot on behalf of the customer, after the customer has agreed to the service, time, quantity and contact details.Can send data outNo findings
Why it is in this group
- The name "request_booking" says "request": a word for a change.
What it can reach
- outboundThe input takes a destination (input.phone): what the tool writes goes there.
Description, as the server wrote it 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.
Annotations the server declares
- title: Request a booking
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
Only reads 4Show 4 read-only tools
get_availabilityList open time slots (Asia/Taipei) for one service in the next 1–14 days, with remaining capacity.No findings
Why it is in this group
- The name "get_availability" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Check open time slots
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_booking_statusGet 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 d…No findings
Why it is in this group
- The name "get_booking_status" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Check booking status
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_businessGet one business's public profile (city, address, hours, booking and cancellation policy, contact, FAQ) and its active services with prices, durations and weekly schedules.Reads private dataNo findings
Why it is in this group
- The name "get_business" says "get": a word for reading.
What it can reach
- private-dataThe description's first sentence says "get" and "contact": it reads contacts.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get business details
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
search_businessesSearch BOP's listed businesses by keyword (business name, city or district, or type of class) and/or category.No findings
Why it is in this group
- The name "search_businesses" says "search": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Search businesses
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Exfil surface
Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.
2 paths in this server alone from private data, through text someone else wrote, to a way out. Denying 1 outbound tool breaks every one.
- Reads private data1
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- Reads text others write2
- Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
- Can send data out1
- Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
{
"permissions": {
"deny": [
"mcp__bop__request_booking"
]
}
}Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.
Findings
Matches of fixed checks, with the text they matched.
- Warnget_booking_link
The server marks "get_booking_link" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The name "get_booking_link" says "get": a word for reading.
- Infocomplete_booking
The description mentions "credential".
What this check looks forMatched text
description: "...tus is awaiting_payment, with a payment credential the customer approved for the booking's..."
- Infocomplete_booking
The input schema at properties.payment.required[2] mentions "credential".
What this check looks forMatched text
inputSchema.properties.payment.required[2]: "credential"
- Infocomplete_booking
The input schema at properties.payment.description mentions "credential".
What this check looks forMatched text
inputSchema.properties.payment.description: "Payment credential for this booking"
History
Changes to its tool definitions and to its remote endpoint, newest first.
No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.
Install
Pinned to version 1.0.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http bop https://mcp.srct.tw/mcpclaude mcp add --transport http bop https://mcp.srct.tw/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__bop__search_businesses",
"mcp__bop__get_business",
"mcp__bop__get_availability",
"mcp__bop__get_booking_status"
],
"ask": [
"mcp__bop__request_booking",
"mcp__bop__complete_booking",
"mcp__bop__get_booking_link"
],
"deny": [
"mcp__bop__modify_booking",
"mcp__bop__cancel_booking"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as bop. Review it before you use it.
Capability tags behind 4 rules
- mcp__bop__get_business private-data
- mcp__bop__request_booking outbound
- mcp__bop__complete_booking untrusted-input
- mcp__bop__get_booking_link untrusted-input
Pin
Keep the decision: fail CI when the tools change, follow every change, or show a badge.
Pin in CI
Fail a build when the tools you reviewed are not the tools the server serves today.
curl -s "https://anlyon.dev/api/v1/servers/tw.srct/bop/verify?hash=aa36ea2d718c846bcf6871ebf2f4eb6ca5e7ef23760d385060bb4b84b0323210" | jq -e '.changed == false'Pinned hash aa36ea2d718c, from Nov 2, 2026, 03:18 UTC.
Watch
Get told when its tools change: a new tool, a new description, a new class.
https://anlyon.dev/servers/tw.srct/bop/changes.xmlAn Atom feed. Works in any feed reader or Slack's RSS app.
Badge
[](https://anlyon.dev/servers/tw.srct/bop)Source: MCP Registry. Synced Nov 2, 2026, 03:18 UTC.