Интеграция MCP
Обзор
Bronjoy поддерживает MCP (Model Context Protocol), поэтому AI-ассистент — Claude, ChatGPT или любой другой, говорящий на MCP, — может найти заведение, ответить на вопросы о нём и записать клиента.
Есть два сервера для двух разных аудиторий:
| Сервер маркетплейса | Сервер организации | |
|---|---|---|
| Для кого | Для всех. Пользователи, разработчики, AI-ассистенты | Для ассистента одной организации |
| Охват | Весь публичный каталог | Одна организация |
| Авторизация | Не нужна | Bearer-токен |
| Адрес | https://api.bronjoy.com/api/mcp | https://api.bronjoy.com/api/mcp/organization/{id} |
| Стоимость | Бесплатно | Функция платного тарифа |
Если вы хотите записаться на стрижку через своего ассистента — вам нужен сервер маркетплейса. Если вы бизнес и хотите, чтобы ваш собственный ассистент вёл ваш календарь — вам нужен сервер организации.
Сервер маркетплейса
Публичный каталог в виде MCP-сервера. Без аккаунта, без токена, без регистрации — он отдаёт ровно то, что сайт Bronjoy и так показывает любому браузеру, плюс тот же путь записи с подтверждением.
Подключение
claude mcp add --transport http bronjoy https://api.bronjoy.com/api/mcp
{
"mcpServers": {
"bronjoy": {
"url": "https://api.bronjoy.com/api/mcp"
}
}
}
Транспорт: Streamable HTTP
Адрес: https://api.bronjoy.com/api/mcp
Авторизация: не требуется
Это вся настройка. Попросите ассистента: «найди барбершоп в Ташкенте» — и он воспользуется инструментами ниже.
Инструменты
Шесть инструментов, в том порядке, в котором их использует разговор о записи.
search-venues
Поиск по каталогу: ключевое слово, город, категория. Все остальные инструменты принимают slug, который возвращает этот.
| Параметр | Тип | Обяз. | Описание |
|---|---|---|---|
query | string | Нет | Свободный текст — название, услуга (стрижка, haircut) или ориентир. Работает и с латиницей, и с кириллицей |
city | string | Нет | Слаг или название города — tashkent, samarkand, Бухара |
category | string | Нет | Слаг категории — barber, dental, car-wash |
bookable_only | boolean | Нет | Возвращать только заведения с онлайн-записью. Указывайте, когда пользователь хочет записаться, а не узнать о местах |
limit | integer | Нет | 1–20, по умолчанию 5 |
{
"venues": [
{
"name": "Britva Barbershop",
"slug": "demo-barber",
"url": "https://bronjoy.com/tashkent/barber/demo-barber",
"city": "Tashkent",
"district": "Юнусабадский район",
"address": "проспект Амира Темура, 15",
"specialty": "Men's haircuts and beard care",
"rating": 4.9,
"reviews": 7,
"is_bookable": true,
"next_available": "Tomorrow 09:00",
"price_from": 50000,
"has_phone": true
}
],
"returned": 1,
"total_matches": 1
}
get-venue
Полный публичный профиль заведения: адрес, часы работы, услуги, удобства, способы оплаты, сайт, рейтинг. Телефон здесь возвращается замаскированным.
| Параметр | Тип | Обяз. | Описание |
|---|---|---|---|
slug | string | Да | Из search-venues |
{
"name": "Britva Barbershop",
"city": "Ташкент",
"address": "проспект Амира Темура, 15",
"is_bookable": true,
"website": "https://britva.uz",
"masked_phone": "+998 71 ***-**-70",
"opening_hours": {
"monday": { "open": "09:00", "close": "19:00" },
"saturday": { "open": "08:00", "close": "18:00" },
"sunday": { "open": null, "close": null }
},
"service_tags": ["Haircuts", "Beard shaping", "Royal shave", "Styling"],
"price_from": 50000,
"price_to": 110000,
"rating": "4.90",
"reviews": 7,
"booking": "Online booking is available — continue with check-availability."
}
reveal-phone
Настоящий номер телефона заведения. Намеренно вынесен из get-venue в отдельный вызов и ограничен 10 запросами в минуту — запрашивайте его для заведения, которое пользователь действительно выбрал, а не пачкой по всем результатам поиска.
| Параметр | Тип | Обяз. | Описание |
|---|---|---|---|
slug | string | Да | Из search-venues |
{
"name": "Britva Barbershop",
"phone": "+998 71 200-70-70",
"url": "https://bronjoy.com/tashkent/barber/demo-barber"
}
check-availability
Услуги, доступные для записи, и свободные слоты. Вызовите без service_id, чтобы получить список услуг с ценами, затем ещё раз с нужным service_id, чтобы получить его слоты.
| Параметр | Тип | Обяз. | Описание |
|---|---|---|---|
slug | string | Да | Из search-venues |
date | string | Да | YYYY-MM-DD, сегодня или до 30 дней вперёд |
service_id | integer | Нет | Пропустите при первом вызове, чтобы получить список услуг |
{
"date": "2026-09-10",
"service": {
"service_id": 1,
"name": "Мужская стрижка",
"duration_minutes": 30,
"price": "80000.00",
"currency": "UZS"
},
"slots": [
{
"start_time": "2026-09-10T09:00:00+05:00",
"end_time": "2026-09-10T09:30:00+05:00",
"staff_id": 1,
"staff_name": "Азиз Рахимов"
}
]
}
start_time — ровно то значение, которое ожидает book-appointment. Не округляйте и не преобразуйте его.
request-booking-code
Отправляет 6-значный код на собственную почту или телефон пользователя.
| Параметр | Тип | Обяз. | Описание |
|---|---|---|---|
slug | string | Да | Заведение, куда идёт запись |
email | string | Одно из двух | Почта пользователя |
phone | string | Одно из двух | Телефон пользователя, +998901234567 |
Код действует 5 минут и годится на одну запись. Отправки ограничены и по отправителю, и по получателю — не зацикливайтесь.
book-appointment
Создаёт запись.
| Параметр | Тип | Обяз. | Описание |
|---|---|---|---|
slug | string | Да | Заведение |
service_id | integer | Да | Из check-availability |
start_time | string | Да | Точное start_time из слота |
name | string | Да | Имя пользователя в том виде, в каком его увидит бизнес |
verification_code | string | Да | 6 цифр, которые продиктовал пользователь |
email / phone | string | Одно из двух | Тот же контакт, на который отправлялся код |
notes | string | Нет | До 500 символов |
Запись создаётся со статусом pending — бизнес ещё должен её подтвердить. Скажите пользователю, что запись отправлена, а не гарантирована. Если заведение берёт предоплату, в ответе придёт payment_url, который пользователю нужно открыть.
Процесс записи
1. search-venues → bookable_only: true
2. check-availability → выбрать услугу, затем слот
3. request-booking-code → код уходит пользователю, а не вам
4. попросить пользователя продиктовать код
5. book-appointment → с этим кодом
Два типа заведений
У каждого результата есть поле is_bookable, и оно определяет, что вы можете предложить дальше:
is_bookable: true— заведение настроено на онлайн-запись. Процесс выше работает.is_bookable: false— карточка справочника. Реальный адрес, реальные часы работы, часто список услуг и телефон, но онлайн-записи нет. Отвечайте по этим данным и предлагайте телефон.
bookable_only: true, когда пользователь хочет записаться, и прямо говорите, когда в заведение нужно звонить.Как читать данные
- Названия, услуги и адреса — на русском или узбекском. Не переводите адрес, который пользователю придётся показать таксисту.
- Цены в узбекских сумах (UZS). У многих карточек цены нет вовсе.
от 300000 сумозначает «от 300 000 сум». - Время — в часовом поясе заведения, со смещением в значении.
- Рейтинги в результатах поиска взяты из исходного справочника, а не из отзывов Bronjoy.
Ограничения
| Область | Лимит |
|---|---|
| Все запросы | 30/минуту на клиента |
reveal-phone | 10/минуту на клиента |
request-booking-code | 10/час на клиента плюс лимит на получателя |
При превышении лимита возвращается ошибка с указанием, сколько секунд подождать.
Сервер организации
Приватный сервер отдельной организации, к которому владелец подключает собственного ассистента. Он управляет календарём этой организации: услуги, слоты, записи и отмены. Это функция платного тарифа, требуется токен.
1. Создайте токен
Из панели управления или через API:
POST /api/org/ai/tokens
Authorization: Bearer your-staff-token
Content-Type: application/json
{
"name": "Claude Desktop",
"expires_in_days": 90
}
Ответ:
{
"token": "3|AbCdEf...",
"mcp_endpoint": "https://api.bronjoy.com/api/mcp/organization/1",
"expires_at": "2026-06-23T12:00:00Z",
"instructions": "Use this token in the Authorization header: Bearer <token>"
}
Сохраните токен сразу — он показывается только один раз.
2. Подключите AI-клиент
claude mcp add --transport http bronjoy-org \
https://api.bronjoy.com/api/mcp/organization/1 \
--header "Authorization: Bearer 3|AbCdEf..."
{
"mcpServers": {
"bronjoy": {
"url": "https://api.bronjoy.com/api/mcp/organization/1",
"headers": {
"Authorization": "Bearer 3|AbCdEf..."
}
}
}
}
Транспорт: Streamable HTTP
Адрес: https://api.bronjoy.com/api/mcp/organization/{id}
Авторизация: Authorization: Bearer {token}
Инструменты
list-services
Список всех услуг, доступных для записи, с ценами и длительностью. Начинайте с него, чтобы узнать ID услуг.
Параметры: нет
{
"services": [
{
"id": 1,
"name": "Haircut",
"description": "Classic haircut with styling",
"duration_minutes": 30,
"price": "25.00",
"currency": "USD",
"category": "Hair Services"
}
],
"total": 1
}
search-availability
Поиск свободных слотов для конкретной услуги и даты.
| Параметр | Тип | Обяз. | Описание |
|---|---|---|---|
service_id | integer | Да | ID услуги (из list-services) |
date | string | Да | YYYY-MM-DD, сегодня или до 30 дней вперёд |
staff_id | integer | Нет | Конкретный сотрудник |
{
"date": "2026-03-26",
"service": "Haircut",
"timezone": "Asia/Tashkent",
"available_times": ["09:00", "10:00", "14:30", "15:00"],
"total_found": 10,
"showing": 4,
"note": "Times are in H:i format (24-hour) in the organization timezone."
}
create-appointment
Создать запись для клиента.
| Параметр | Тип | Обяз. | Описание |
|---|---|---|---|
client_name | string | Да | Полное имя клиента (2–100 символов) |
client_phone | string | Да | Телефон в международном формате (+998901234567) |
service_id | integer | Да | ID услуги |
date | string | Да | YYYY-MM-DD |
time | string | Да | HH:MM, 24-часовой формат |
staff_id | integer | Нет | Конкретный сотрудник (назначается автоматически, если не указан) |
branch_id | integer | Нет | Филиал |
notes | string | Нет | До 500 символов |
{
"success": true,
"appointment_id": 123,
"message": "Appointment booked for John Doe on 2026-03-26 at 14:30."
}
check-appointment
Поиск существующих записей по номеру телефона.
| Параметр | Тип | Обяз. | Описание |
|---|---|---|---|
client_phone | string | Да | Телефон в международном формате |
appointment_id | integer | Нет | Конкретная запись (если не указана — все предстоящие) |
Возвращает одну запись или до 5 предстоящих записей для этого номера.
cancel-appointment
Отменить существующую запись. Телефон клиента должен совпадать с записью.
| Параметр | Тип | Обяз. | Описание |
|---|---|---|---|
appointment_id | integer | Да | ID записи |
client_phone | string | Да | Должен совпадать с записью |
reason | string | Нет | До 500 символов |
Ресурсы
organization://profile
Профиль организации — услуги, сотрудники, филиалы, часовой пояс и валюта. Позволяет AI-клиенту получить контекст, не вызывая инструменты по отдельности.
Промпты
booking-assistant
Системный промпт, который настраивает разговор о записи и содержит инструкции по рекомендуемому процессу.
Рекомендуемый процесс
1. list-services → Показать, что есть
2. search-availability → Найти свободные слоты для выбранной услуги
3. Подтвердить с пользователем → Пусть человек выберет время
4. create-appointment → Записать
Для отмены:
1. check-appointment → Найти запись по телефону
2. Подтвердить с пользователем → Какую именно отменить?
3. cancel-appointment → Отменить
Ограничения
| Область | Лимит |
|---|---|
| На токен | 60 запросов/минуту |
| На организацию | 120 запросов/минуту |
При превышении возвращается 429 Too Many Requests.
Безопасность
- Каждый токен привязан к одной организации — он не даёт доступа к данным другой
- Токены истекают через заданное количество дней (по умолчанию 90, максимум 365)
- Сервер работает только с записями — без внутренних управляющих эндпоинтов, финансовых данных и настроек сотрудников
- Номер телефона подтверждает клиента при проверке и отмене
- Все операции логируются для аудита
Решение проблем
| Проблема | Решение |
|---|---|
401 Unauthorized | Токен истёк или недействителен — создайте новый |
403 Forbidden | У токена нет доступа к этой организации |
429 Too Many Requests | Превышен лимит — подождите и повторите |
Feature not available | Доступ к MCP не включён для этой организации |
| Слоты не возвращаются | Не заданы графики сотрудников или к услуге не привязан сотрудник |