Search and book appointments at service businesses across Uzbekistan.
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.
Book a slot, using the code the user received from request-booking-code. WHEN TO USE: last step, once the user has confirmed the venue, service and exact time AND has read you their 6-digit code. Requires the same contact the code was sent to. The booking is created as "pending": the business still confirms it, so tell the user it is requested and they will hear back — not that it is guaranteed. If the venue takes prepayment, the response carries a link the user must open to pay; the slot is not held indefinitely. Only works for venues with `is_bookable: true`.
The user's name, as the business should see it.
The venue slug.
Service id from check-availability.
Exact `start_time` value from a check-availability slot. Do not invent or round times.
The 6-digit code the user received. Ask them for it — you never see it yourself.
The email the code was sent to, if that is the channel used.
Anything the business should know, max 500 characters.
The phone the code was sent to, if that is the channel used.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Book a slot, using the code the user received from request-booking-code. WHEN TO USE: last step, once the user has confirmed the venue, service and exact time AND has read you their 6-digit code. Requires the same contact the code was sent to. The booking is created as "pending": the business still confirms it, so tell the user it is requested and they will hear back — not that it is guaranteed. If the venue takes prepayment, the response carries a link the user must open to pay; the slot is not held indefinitely. Only works for venues with `is_bookable: true`.
| Argument | Type | Description |
|---|---|---|
| name* | string | The user's name, as the business should see it. |
| slug* | string | The venue slug. |
| string | The email the code was sent to, if that is the channel used. | |
| notes | string | Anything the business should know, max 500 characters. |
| phone | string | The phone the code was sent to, if that is the channel used. |
| service_id* | integer | Service id from check-availability. |
| start_time* | string | Exact `start_time` value from a check-availability slot. Do not invent or round times. |
| verification_code* | string | The 6-digit code the user received. Ask them for it — you never see it yourself. |
{
"type": "object",
"required": [
"slug",
"service_id",
"start_time",
"name",
"verification_code"
],
"properties": {
"name": {
"type": "string",
"description": "The user's name, as the business should see it."
},
"slug": {
"type": "string",
"description": "The venue slug."
},
"email": {
"type": "string",
"description": "The email the code was sent to, if that is the channel used."
},
"notes": {
"type": "string",
"description": "Anything the business should know, max 500 characters."
},
"phone": {
"type": "string",
"description": "The phone the code was sent to, if that is the channel used."
},
"service_id": {
"type": "integer",
"description": "Service id from check-availability."
},
"start_time": {
"type": "string",
"description": "Exact `start_time` value from a check-availability slot. Do not invent or round times."
},
"verification_code": {
"type": "string",
"description": "The 6-digit code the user received. Ask them for it — you never see it yourself."
}
}
}Bookable services and open time slots for a venue on a given date. WHEN TO USE: the user has picked a venue with `is_bookable: true` and wants a time. Call without `service_id` first to see the services and their prices, then again with one to get its slots. Returns an explicit refusal for venues that are not set up for online booking — do not try to work around it, offer the phone number instead. Slot times are in the venue's timezone and are exactly the values book-appointment expects.
| Argument | Type | Description |
|---|---|---|
| date* | string | Day to check, Y-m-d. Today or later, at most 30 days ahead. |
| slug* | string | The venue slug from search-venues. |
| service_id | integer | Which service to check. Omit on the first call to list the services with their ids, durations and prices. |
{
"type": "object",
"required": [
"slug",
"date"
],
"properties": {
"date": {
"type": "string",
"description": "Day to check, Y-m-d. Today or later, at most 30 days ahead."
},
"slug": {
"type": "string",
"description": "The venue slug from search-venues."
},
"service_id": {
"type": "integer",
"description": "Which service to check. Omit on the first call to list the services with their ids, durations and prices."
}
}
}Full public profile for one venue: address, opening hours, what it offers, amenities, payment methods, website and whether it can be booked online. WHEN TO USE: after search-venues, when the user asks anything about a specific place — "are they open on Sunday", "do they do colouring", "where exactly is it", "how much". This is the right tool for the ~99% of the catalogue that is not bookable: it carries everything needed to answer a question or send the user there in person. The phone number is masked here — call reveal-phone only when the user actually wants to ring them.
| Argument | Type | Description |
|---|---|---|
| slug* | string | The venue slug from search-venues, e.g. "demo-barber". |
{
"type": "object",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"description": "The venue slug from search-venues, e.g. \"demo-barber\"."
}
}
}Send the user a 6-digit confirmation code, which book-appointment then requires. WHEN TO USE: the user has chosen a venue, a service and a slot, and has given you their email address or phone number. Call this before book-appointment — a booking without a code is rejected. YOU DO NOT RECEIVE THE CODE. It goes to the user's own inbox or phone; ask them to read it back to you. That is the point: it proves the contact belongs to the person booking, so a business does not get appointments from numbers nobody answers. The code lasts 5 minutes and covers one booking. Only a few codes may be sent to one contact — do not loop.
| Argument | Type | Description |
|---|---|---|
| slug* | string | The venue slug the user is booking. |
| string | The user's email address. Give this or phone. | |
| phone | string | The user's phone in international format, e.g. +998901234567. Preferred when the venue will need to call them. |
{
"type": "object",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"description": "The venue slug the user is booking."
},
"email": {
"type": "string",
"description": "The user's email address. Give this or phone."
},
"phone": {
"type": "string",
"description": "The user's phone in international format, e.g. +998901234567. Preferred when the venue will need to call them."
}
}
}The venue's real phone number. WHEN TO USE: the user wants to call — typically because the venue is not bookable online, or they want to ask something no profile field answers. Deliberately a separate call from get-venue, which returns a masked number. Reveals are rate limited per caller: request them one at a time, for a venue the user has actually chosen, never in bulk across search results.
| Argument | Type | Description |
|---|---|---|
| slug* | string | The venue slug from search-venues. |
{
"type": "object",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"description": "The venue slug from search-venues."
}
}
}Search Bronjoy's catalogue of service businesses in Uzbekistan by keyword, city and category. WHEN TO USE: the user is looking for a place ("barbershop in Tashkent", "dentist near Chilanzar", "car wash open now"). Start here — every other tool takes the `slug` this returns. Results are ranked, compact, and include `is_bookable`, which decides what you can offer next: bookable venues can go through check-availability → request-booking-code → book-appointment, the rest can only be described and phoned. Names and addresses come back in Russian or Uzbek; quote them as-is.
| Argument | Type | Description |
|---|---|---|
| city | string | City slug or name, e.g. "tashkent", "samarkand", "Бухара". |
| limit | integer | How many venues to return, 1-20. Default 5 — prefer a small number and refine. |
| query | string | Free text: a business name, a service ("стрижка", "haircut"), or a landmark. Matches across Latin and Cyrillic. |
| category | string | Category slug, e.g. "barber", "dental", "car-wash". Use the slug from a previous result when narrowing. |
| bookable_only | boolean | Return only venues that can take an online booking. Set this when the user wants to book rather than to be told about places — most of the catalogue cannot be booked, and without this the bookable ones are buried. |
{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "City slug or name, e.g. \"tashkent\", \"samarkand\", \"Бухара\"."
},
"limit": {
"type": "integer",
"description": "How many venues to return, 1-20. Default 5 — prefer a small number and refine."
},
"query": {
"type": "string",
"description": "Free text: a business name, a service (\"стрижка\", \"haircut\"), or a landmark. Matches across Latin and Cyrillic."
},
"category": {
"type": "string",
"description": "Category slug, e.g. \"barber\", \"dental\", \"car-wash\". Use the slug from a previous result when narrowing."
},
"bookable_only": {
"type": "boolean",
"description": "Return only venues that can take an online booking. Set this when the user wants to book rather than to be told about places — most of the catalogue cannot be booked, and without this the bookable ones are buried."
}
}
}