Bronjoy Marketplace

Search and book appointments at service businesses across Uzbekistan.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
98%
Naming quality
60%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (6)

  • LOWTool 'search-venues' doesn't follow camelCase/snake_casein search-venues
  • LOWTool 'get-venue' doesn't follow camelCase/snake_casein get-venue
  • LOWTool 'reveal-phone' doesn't follow camelCase/snake_casein reveal-phone
  • LOWTool 'check-availability' doesn't follow camelCase/snake_casein check-availability
  • LOWTool 'request-booking-code' doesn't follow camelCase/snake_casein request-booking-code
  • LOWTool 'book-appointment' doesn't follow camelCase/snake_casein book-appointment

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,665Tokens (tool definitions)
~1.4 KBTypical response size
Moderate attention impact (1.30% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "marketplace": {
      "url": "https://api.bronjoy.com/api/mcp"
    }
  }
}

Remote endpoints

https://api.bronjoy.com/api/mcpstreamable-http

What it can do

Tool inventory

Tools (6)

🟒 Read-only🟑 WriteπŸ”΄ Deleteβšͺ Unknown
🟒search-venues(query, city, category, bookable_only, limit)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "description": "Free text: a business name, a service (\"стриТка\", \"haircut\"), or a landmark. Matches across Latin and Cyrillic.",
      "type": "string"
    },
    "city": {
      "description": "City slug or name, e.g. \"tashkent\", \"samarkand\", \"Π‘ΡƒΡ…Π°Ρ€Π°\".",
      "type": "string"
    },
    "category": {
      "description": "Category slug, e.g. \"barber\", \"dental\", \"car-wash\". Use the slug from a previous result when narrowing.",
      "type": "string"
    },
    "bookable_only": {
      "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.",
      "type": "boolean"
    },
    "limit": {
      "description": "How many venues to return, 1-20. Default 5 β€” prefer a small number and refine.",
      "type": "integer"
    }
  }
}
🟒get-venue(slug)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "description": "The venue slug from search-venues, e.g. \"demo-barber\".",
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
🟒reveal-phone(slug)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "description": "The venue slug from search-venues.",
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
🟒check-availability(slug, date, service_id)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "description": "The venue slug from search-venues.",
      "type": "string"
    },
    "date": {
      "description": "Day to check, Y-m-d. Today or later, at most 30 days ahead.",
      "type": "string"
    },
    "service_id": {
      "description": "Which service to check. Omit on the first call to list the services with their ids, durations and prices.",
      "type": "integer"
    }
  },
  "required": [
    "slug",
    "date"
  ]
}
🟑request-booking-code(slug, email, phone)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "description": "The venue slug the user is booking.",
      "type": "string"
    },
    "email": {
      "description": "The user's email address. Give this or phone.",
      "type": "string"
    },
    "phone": {
      "description": "The user's phone in international format, e.g. +998901234567. Preferred when the venue will need to call them.",
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
🟒book-appointment(slug, service_id, start_time, name, verification_code, ...)

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`.

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "description": "The venue slug.",
      "type": "string"
    },
    "service_id": {
      "description": "Service id from check-availability.",
      "type": "integer"
    },
    "start_time": {
      "description": "Exact `start_time` value from a check-availability slot. Do not invent or round times.",
      "type": "string"
    },
    "name": {
      "description": "The user's name, as the business should see it.",
      "type": "string"
    },
    "verification_code": {
      "description": "The 6-digit code the user received. Ask them for it β€” you never see it yourself.",
      "type": "string"
    },
    "email": {
      "description": "The email the code was sent to, if that is the channel used.",
      "type": "string"
    },
    "phone": {
      "description": "The phone the code was sent to, if that is the channel used.",
      "type": "string"
    },
    "notes": {
      "description": "Anything the business should know, max 500 characters.",
      "type": "string"
    }
  },
  "required": [
    "slug",
    "service_id",
    "start_time",
    "name",
    "verification_code"
  ]
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded6 tools
verifiedversion not recorded6 tools