SzuruSzuru – rezerwacja czyszczenia tapicerki
by szuruszuru.pl · remote · no sign-in to list tools · v1.1.0 · published by pl.szuruszuru
Quote, check slots and book on-site upholstery, carpet and mattress cleaning in Pomorskie, Poland.
13 tools: 2 can delete or cancel things, 2 do something that can't be undone, 6 change things and 3 only read.
Scanned Oct 21, 2026
- Deletes or cancels2Claude Code: deny: see these tools
- Can't be undone2Claude Code: ask: see these tools
- Changes things6Claude Code: ask: see these tools
- Only reads3Claude Code: allow: see these tools
1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http booking https://agent.szuruszuru.pl/mcpFindings
Matches of fixed checks, with the text they matched.
The server marks "check_availability" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The input addresses people (input.wanted.to): what it sends cannot be taken back.
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
13 tools
Deletes or cancels 2Claude Code: deny
cancel_bookingPURPOSE: Cancels the verified customer's existing booking.No findings
Why it is in this group
- The name "cancel_booking" says "cancel": a word for removing or ending something.
- The description says "Irreversible".
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it PURPOSE: Cancels the verified customer's existing booking. Irreversible. WHEN TO USE: Only after the customer explicitly confirmed they want to cancel this specific booking (reference and date read back to them). WHEN NOT TO USE: Not to change the date (use reschedule_booking), never on an unclear request. REQUIRED: booking_reference, customer_grant (or a signed-in customer). reason and idempotency_key optional. SIDE EFFECTS: cancels the booking and notifies the customer by SMS/e-mail. Repeating the same call returns the same result.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: false
- title: Anuluj rezerwację
reschedule_bookingPURPOSE: Moves the verified customer's existing booking to a new slot.No findings
Why it is in this group
- The name "reschedule_booking" says "reschedule": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it PURPOSE: Moves the verified customer's existing booking to a new slot. Price and services stay the same. WHEN TO USE: Only after check_availability(booking_reference) and after the customer explicitly confirmed the new date and time. WHEN NOT TO USE: Not for new bookings, not to change services or price. REQUIRED: booking_reference, slot_id (from check_availability with that booking_reference), customer_grant (or a signed-in customer). idempotency_key optional. SIDE EFFECTS: changes the booking and notifies the customer by SMS/e-mail. Repeating the same call returns the same result.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: false
- title: Zmień termin
Can't be undone 2Claude Code: ask
check_availabilityPURPOSE: Returns real, currently free appointment slots for a quote_id (new booking) or for an existing booking_reference (rescheduling, needs customer_grant).1 finding
Why it is in this group
- The input addresses people (input.wanted.to): what it sends cannot be taken back.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "check_availability" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The input addresses people (input.wanted.to): what it sends cannot be taken back.
Description, as the server wrote it PURPOSE: Returns real, currently free appointment slots for a quote_id (new booking) or for an existing booking_reference (rescheduling, needs customer_grant). WHEN TO USE: When the customer asks when we can come, after calculate_quote. wanted.type: asap (earliest), date (one day), range (from-to), preferred (a day + nearby days, sorted by preferred_time); optional part_of_day. If type is omitted it follows the fields given (date -> date, from/to -> range, nothing -> asap). WHEN NOT TO USE: Never to book - it reserves nothing and holds no slot. REQUIRED: quote_id (or booking_reference + customer_grant). Dates as YYYY-MM-DD, Polish time. SIDE EFFECTS: none (read-only; slot_id values are valid ~15 minutes). RESULT: slots found -> success=true, slots[]. None in the requested period -> success=false, error="no_availability", next_available (date or null) and alternative_slots[] - offer those. Past date -> error date_in_past; beyond the online booking horizon -> error date_out_of_range. Never invent a slot.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
- title: Sprawdź terminy
resend_confirmation_codePURPOSE: Re-sends the SMS code of a prepared booking.No findings
Why it is in this group
- The name "resend_confirmation_code" says "resend": a word for sending, and what is sent cannot be taken back.
Description, as the server wrote it PURPOSE: Re-sends the SMS code of a prepared booking. WHEN TO USE: Only when the customer says the SMS from prepare_booking did not arrive. WHEN NOT TO USE: Not after a wrong code (ask the customer to re-type it) and not to start a new booking. REQUIRED: confirmation_id. SIDE EFFECTS: sends one SMS (max 1 per minute, 3 per 30 minutes per phone; otherwise error rate_limited with retry_after).
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
- title: Wyślij kod ponownie
Changes things 6Claude Code: ask
calculate_quotePURPOSE: Calculates the price of an order (unit prices, quantity discounts, add-ons, travel fee, minimum order) for a postal code.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it PURPOSE: Calculates the price of an order (unit prices, quantity discounts, add-ons, travel fee, minimum order) for a postal code. Returns quote_id (valid 30 minutes). WHEN TO USE: Whenever the customer asks how much a cleaning costs and you know the service(s), quantity and postal code. Also the first step before check_availability. WHEN NOT TO USE: Not for checking dates and never as a booking - it reserves nothing. REQUIRED: postal_code; items[] with service (id from list_upholstery_services) and quantity. Add-ons optional (names from the catalog; close spellings are matched, unknown ones return error unsupported_addon with allowed_addons). If postal code, service or quantity is unknown, ask the customer - do not guess. SIDE EFFECTS: none for the customer (stores a 30-minute quote only). CONSTRAINTS: Report total_from exactly; never estimate or adjust prices. Area not served -> error unsupported_postcode. below_min_order=true -> ask the customer to add a service before booking.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
- title: Wycena
check_service_areaPURPOSE: Checks whether SzuruSzuru serves a Polish postal code.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it PURPOSE: Checks whether SzuruSzuru serves a Polish postal code. WHEN TO USE: When the customer asks whether we come to their town/postal code. WHEN NOT TO USE: Not needed before calculate_quote (calculate_quote checks the area itself). Never use it to reserve anything. REQUIRED: postal_code (NN-NNN). SIDE EFFECTS: none (read-only). RESULT: served -> success=true, available=true, city. Not served -> success=false, error="unsupported_postcode", available=false - tell the customer we do not serve this code; do not continue to quote or booking.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Sprawdź obszar
create_bookingPURPOSE: Step 2 of 2 of booking.No findings
Why it is in this group
- The name "create_booking" says "create": a word for a change.
Description, as the server wrote it PURPOSE: Step 2 of 2 of booking. Creates the real, confirmed SzuruSzuru booking for a confirmation_id from prepare_booking, using the 6-digit SMS code the customer received. WHEN TO USE: Only after prepare_booking succeeded and the customer has typed the SMS code in the conversation. WHEN NOT TO USE: Never to check price or availability, never without a code from the customer, never with a guessed or example code. REQUIRED: confirmation_id, sms_code. idempotency_key optional. Missing data -> error missing_required_fields; nothing is created. SIDE EFFECTS: creates a booking (a technician is scheduled) and sends SMS/e-mail confirmation to the customer. Idempotent: repeating the call with the same confirmation_id and code returns the SAME booking - it never creates a second one. RESULT: success=true, booking_id, status, date, time (Polish time), price, currency. Give these to the customer. Wrong code -> error verification_failed with attempts_left.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Potwierdź rezerwację
prepare_bookingPURPOSE: Step 1 of 2 of booking.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it PURPOSE: Step 1 of 2 of booking. Holds the chosen slot for 10 minutes and sends a 6-digit SMS code to the customer's Polish mobile. Returns confirmation_id and a summary to show verbatim. Does NOT create a booking. WHEN TO USE: Only after the customer explicitly said they want to book THIS slot, gave first and last name, street address with number and mobile phone, and accepted the terms. WHEN NOT TO USE: Not for price or date questions, not when the customer says "maybe" or only asks how much / when. Never guess or invent missing data - ask. REQUIRED: quote_id, slot_id (from check_availability), customer.name, customer.address, customer.phone, terms_accepted=true. Missing data -> error missing_required_fields with missing_fields[]. SIDE EFFECTS: one SMS to the phone + 10-minute slot hold. The identical call repeated returns the same confirmation_id, no new SMS. NEXT: ask the customer for the SMS code, then call create_booking.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Przygotuj rezerwację
start_phone_verificationPURPOSE: Sends an SMS code to a Polish mobile number to prove the customer owns it, before showing, rescheduling or cancelling their EXISTING bookings.No findings
Why it is in this group
- The name "start_phone_verification" says "start": a word for a change.
Description, as the server wrote it PURPOSE: Sends an SMS code to a Polish mobile number to prove the customer owns it, before showing, rescheduling or cancelling their EXISTING bookings. WHEN TO USE: When the customer asks about their existing booking(s) and no customer_grant is available yet. WHEN NOT TO USE: Not for a new booking (prepare_booking sends its own code). REQUIRED: phone. SIDE EFFECTS: sends one SMS (a repeated call within 60 s returns the same verification_id without a new SMS). The response is the same whether or not the number is known.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
- title: Weryfikacja numeru
verify_phone_codePURPOSE: Exchanges the SMS code from start_phone_verification for a customer_grant (valid 60 minutes) that gives access to this customer's own bookings.No findings
Why it is in this group
- The input takes a statement or command to run (input.code), which can change anything it can reach.
Description, as the server wrote it PURPOSE: Exchanges the SMS code from start_phone_verification for a customer_grant (valid 60 minutes) that gives access to this customer's own bookings. WHEN TO USE: Right after the customer types the code from start_phone_verification. WHEN NOT TO USE: Not for the booking code from prepare_booking (that one goes to create_booking). REQUIRED: verification_id, code. SIDE EFFECTS: none besides issuing the grant. Pass customer_grant to get_my_bookings, check_availability(booking_reference), reschedule_booking and cancel_booking.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
- title: Potwierdź kod
Only reads 3Claude Code: allow
get_my_bookingsPURPOSE: Lists the verified customer's bookings from the last 90 days (or one booking by booking_reference): reference, services, date, time, price, status, can_reschedule, can_can…No findings
Why it is in this group
- The name "get_my_bookings" says "get": a word for reading.
Description, as the server wrote it PURPOSE: Lists the verified customer's bookings from the last 90 days (or one booking by booking_reference): reference, services, date, time, price, status, can_reschedule, can_cancel. WHEN TO USE: When the customer asks about their existing booking(s). WHEN NOT TO USE: Not for new bookings. Without customer_grant it returns error verification_required - then run start_phone_verification -> verify_phone_code. REQUIRED: customer_grant (or a signed-in customer). SIDE EFFECTS: none (read-only). Never shows other customers' data.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Moje rezerwacje
get_service_requirementsPURPOSE: Returns the details of ONE service: unit (piece / m2 / mattress side), allowed quantity, add-on names and prices, short description and FAQ.No findings
Why it is in this group
- The name "get_service_requirements" says "get": a word for reading.
Description, as the server wrote it PURPOSE: Returns the details of ONE service: unit (piece / m2 / mattress side), allowed quantity, add-on names and prices, short description and FAQ. WHEN TO USE: When the request is ambiguous (e.g. which corner sofa size, carpet area in m2, which add-ons exist for this service). WHEN NOT TO USE: Not for prices of an order (use calculate_quote) or availability. REQUIRED: service (id from list_upholstery_services). SIDE EFFECTS: none (read-only).
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Wymagania usługi
list_upholstery_servicesPURPOSE: Lists SzuruSzuru services (mobile upholstery, corner sofa, armchair, carpet, rug and mattress cleaning at the customer's home, Pomeranian region, Poland) with service ids,…No findings
Why it is in this group
- The name "list_upholstery_services" says "list": a word for reading.
Description, as the server wrote it PURPOSE: Lists SzuruSzuru services (mobile upholstery, corner sofa, armchair, carpet, rug and mattress cleaning at the customer's home, Pomeranian region, Poland) with service ids, unit prices in PLN, units and add-on names. WHEN TO USE: To find the service id and exact add-on names before calculate_quote, or when the customer asks what is offered. WHEN NOT TO USE: Not for a price of a concrete order (use calculate_quote), not for coverage (check_service_area) or dates (check_availability). REQUIRED: nothing. SIDE EFFECTS: none (read-only). CONSTRAINTS: Prices come only from this catalog and calculate_quote - never estimate a price.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Lista usług SzuruSzuru
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.
Install
Pinned to version 1.1.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http booking https://agent.szuruszuru.pl/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__booking__list_upholstery_services",
"mcp__booking__get_service_requirements",
"mcp__booking__get_my_bookings"
],
"ask": [
"mcp__booking__check_service_area",
"mcp__booking__calculate_quote",
"mcp__booking__check_availability",
"mcp__booking__prepare_booking",
"mcp__booking__resend_confirmation_code",
"mcp__booking__create_booking",
"mcp__booking__start_phone_verification",
"mcp__booking__verify_phone_code"
],
"deny": [
"mcp__booking__reschedule_booking",
"mcp__booking__cancel_booking"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as booking. Review it before you use it.