# ServeCounter booking

> Find businesses that use ServeCounter, see their services, prices and free times, and book.

- name: com.servecounter/booking
- version: 1.0.0
- connection class: R0 (autonomous)
- trust: 81/100 flags: no-repository
- quality: 83/100 (new)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/com.servecounter%2Fbooking
- tools: https://api.protogrid.dev/v1/servers/com.servecounter%2Fbooking/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "booking": {
      "type": "http",
      "url": "https://api.servecounter.com/mcp"
    }
  }
}
```


## Trust

- hygiene: 80
- liveness: 96
- freshness: 100
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-91% +updated-3d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 83/100 (new)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 79 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 1 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 5 of 5 tools declare readOnlyHint or destructiveHint
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: find_business (idempotentHint); get_business (idempotentHint); get_free_times (idempotentHint); …
- pass `tools.token_cost`: about 1,808 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: n/a (weight 15)

- n/a `stability.changes`, `stability.rug_pull`: tool history recorded for 2 of the 7 days needed

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 5, about 1,808 tokens to load them all
- tool set hash: d4992d9b201645fb8b5af11cb3be4076
- tools last changed: 2026-10-19T04:21:46.753Z
- badge: [![protogrid quality](https://protogrid.dev/badge/com.servecounter/booking.svg)](https://protogrid.dev/servers/com.servecounter/booking)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-10-19 `get_booking_status` changed (annotations)
- 2026-10-19 `prepare_booking` changed (annotations)
- 2026-10-19 `get_free_times` changed (annotations)
- 2026-10-19 `get_business` changed (annotations)
- 2026-10-19 `find_business` changed (annotations)
- 2026-10-18 `find_business` changed (description, inputSchema) **meaning changed**
  - before: Find businesses on ServeCounter by name, such as "studio noord", that take bookings from assistants. Needs no sign-in. Answers up to 10 businesses with their address, which the other tools take as `business`.
  - after: Find businesses on ServeCounter that take bookings from assistants: by name (`query`, at least 3 letters, such as "studio noord"), by trade (`trade`, such as "barber" or "nail-salon"; the trade's key or its English or Dutch name), by place (`city`, or `latitude` and `longitude` with `radiusKm`, 10 by default and at most 50) and, with `freeOn` (YYYY-MM-DD), only those with a free time that day. Give at least one of name, trade, city or coordinates. Needs no sign-in. Answers up to 20 businesses a page with their address, which the other tools take as `business`; ask again with the answer's `nextCursor` for the next page. How results are ordered, always the same way: nearest first when coordinates are given, then the earliest free time on `freeOn` when it is given, then name A to Z. A `city` alone only limits the results to that city: ServeCounter does not measure from a city's centre, so give coordinates for distance. A city alone is ordered by first free time, then name (the free time needs `freeOn`; without it, by name). There is no paid placement: no business can pay to be listed higher, and the answer says how it was ordered in `orderedBy`. Only businesses whose booking page is live and that allow assistants are listed.
- 2026-10-18 `prepare_booking` changed (description, inputSchema)
  - before: Prepares a booking for the person who allowed you, for a free time. Nothing is booked yet: it returns a link (`orderUrl`) to give to the person. They read who the seller is and the terms, tick two boxes and press the button, and only then is it booked. Needs the person's own ServeCounter sign-in (OAuth). The booking is always for that person, whatever name or email you send; their phone number and full name are needed only when their account has none.
  - after: Prepares a booking for the person who allowed you, for a free time. Nothing is booked yet: it returns a link (`orderUrl`) to give to the person. They read who the seller is and the terms, tick two boxes and press the button, and only then is it booked. Needs the person's own ServeCounter sign-in (OAuth). The booking is always for that person, whatever name or email you send; their phone number and full name are needed only when their account has none. Send an `idempotencyKey` (a new random value for each booking you mean to make) so that asking again after a lost answer is safe: the same key with the same arguments, within 24 hours, gives the first answer again and makes no second order; the same key with other arguments is refused with `idempotency-key-reused`.

Full history: https://api.protogrid.dev/v1/servers/com.servecounter%2Fbooking/changes

## Remotes

- https://api.servecounter.com/mcp (streamable-http, auth none, reachable true, uptime30d 0.90909094)

## Packages

_none_

## Tools (5)

- `find_business`: Find businesses on ServeCounter that take bookings from assistants: by name (`query`, at least 3 letters, such as "studio noord"), by trade (`trade`, such as "barber" or "nail-salon"; the trade's key or its English or Dutch name), by place (`city`, or `latitude` and `longitude` with `radiusKm`, 10 by default and at most 50) and, with `freeOn` (YYYY-MM-DD), only those with a free time that day. Give at least one of name, trade, city or coordinates. Needs no sign-in. Answers up to 20 businesses a page with their address, which the other tools take as `business`; ask again with the answer's `nextCursor` for the next page. How results are ordered, always the same way: nearest first when coordinates are given, then the earliest free time on `freeOn` when it is given, then name A to Z. A `city` alone only limits the results to that city: ServeCounter does not measure from a city's centre, so give coordinates for distance. A city alone is ordered by first free time, then name (the free time needs `freeOn`; without it, by name). There is no paid placement: no business can pay to be listed higher, and the answer says how it was ordered in `orderedBy`. Only businesses whose booking page is live and that allow assistants are listed.
- `get_booking_status`: Where an order you prepared stands: `open` (the person has not ordered yet), `booked` (with a link to manage it) or `ended` (expired). Only for orders of the person who allowed you. Needs their sign-in.
- `get_business`: A business's locations, services, prices, add-ons and what it asks to be paid up front, the same as its booking page shows and nothing else. Needs no sign-in. With more than one open location, answer again with its `locationId` to see its services.
- `get_free_times`: The free times for one service at one location, day by day, as the booking page offers them: at most 14 days a request. Needs no sign-in. Times are in the location's own time zone.
- `prepare_booking`: Prepares a booking for the person who allowed you, for a free time. Nothing is booked yet: it returns a link (`orderUrl`) to give to the person. They read who the seller is and the terms, tick two boxes and press the button, and only then is it booked. Needs the person's own ServeCounter sign-in (OAuth). The booking is always for that person, whatever name or email you send; their phone number and full name are needed only when their account has none. Send an `idempotencyKey` (a new random value for each booking you mean to make) so that asking again after a lost answer is safe: the same key with the same arguments, within 24 hours, gives the first answer again and makes no second order; the same key with other arguments is refused with `idempotency-key-reused`.
