# CourtReserve MCP by usefulapi (remote · courtreserve.usefulapi.io)

Read club members, court availability, reservations, events, attendance and revenue reports.

- Trust score: 18/100 (low)
- Change this week: −44
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- remote · `courtreserve.usefulapi.io`: 18/100 (this document), [markdown](https://verifymcp.io/servers/io-usefulapi-courtreserve/courtreserve.md), [page](https://verifymcp.io/servers/io-usefulapi-courtreserve/courtreserve)

## Channel facts

- Endpoint: `https://courtreserve.usefulapi.io/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.8.3`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Endpoint Security**: 46/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not yet verified: we couldn't confirm whether this endpoint requires it.
  - HTTPS enforcement could not be verified: the plaintext port redirected somewhere other than https, so enforcement is unproven.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 0/100
  - Transport check failed: declared streamable-http, but the endpoint redirected instead of responding directly.
- **Schema Quality & AI Usability**: 0/100
  - Schema not yet verified: we couldn't read the endpoint's schema, or could read only part of its tool list.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 0/100
  - Tool coverage not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.
- **Tool Safety**: 0/100
  - Tool safety not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.
- **Capabilities**: 0/100
  - Capabilities not yet verified: we couldn't read the endpoint's capabilities.

**Unverified: 5 categories.** Categories scored 0 because we could not verify them: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm.

## Install

### How do I install the CourtReserve MCP by usefulapi server?

CourtReserve MCP by usefulapi is a hosted endpoint at https://courtreserve.usefulapi.io/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http io-usefulapi-courtreserve 'https://courtreserve.usefulapi.io/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "io-usefulapi-courtreserve": {
      "url": "https://courtreserve.usefulapi.io/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "io-usefulapi-courtreserve": {
      "type": "http",
      "url": "https://courtreserve.usefulapi.io/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.io-usefulapi-courtreserve]
url = "https://courtreserve.usefulapi.io/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "io-usefulapi-courtreserve": {
      "type": "remote",
      "url": "https://courtreserve.usefulapi.io/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add io-usefulapi-courtreserve --url 'https://courtreserve.usefulapi.io/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  io-usefulapi-courtreserve:
    url: "https://courtreserve.usefulapi.io/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "io-usefulapi-courtreserve": {
      "Transport": "http",
      "Url": "https://courtreserve.usefulapi.io/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add io-usefulapi-courtreserve -t streamable-http -u 'https://courtreserve.usefulapi.io/mcp'
```

### Other

```json
{
  "mcpServers": {
    "io-usefulapi-courtreserve": {
      "type": "http",
      "url": "https://courtreserve.usefulapi.io/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-01 (score 18, −48)

- [security regression] Endpoint reachability: reachable → not serving MCP
- [security regression] Stability: 0.10 → unverified
- [security regression] Tool safety: pass → unverified
- [security regression] Authorization: pass → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified

### 2026-10-31 (score 66, +3)

- [security improvement] Authorization: partial → pass
- [functional improvement] MCP protocol: fail → pass
- [functional] New prompt “review_court_schedules_and_availability”
- [functional] New prompt “review_event_registrations_and_waitlists”
- [functional] New prompt “summarize_club_revenue_and_membership”
- [functional] MCP protocol version: 2025-06-18 → 2025-11-25
- [functional] Server version: 1.4.0 → 1.6.0
- [functional] Server version: 1.3.0 → 1.4.0
- [functional] Server version: 1.2.2 → 1.3.0

### 2026-10-30 (score 63, +1)

- [functional] Server version: 1.2.1 → 1.2.2
- [functional] Server version: 1.2.0 → 1.2.1

### 2026-10-29 (score 62, 0)

- [functional improvement] Stability: unverified → 0.03
- [functional] Server version: 1.1.0 → 1.2.0
- [functional] Server version: 1.0.0 → 1.1.0

### 2026-10-28 (score 62)

First indexed and scored.

## MCP tools (23)

### `courtreserve_list_members` (~373 tokens)

List members

List the club's members (name, email, phone, membership type and status, start/end/next payment dates, family id). Filter by member id, family, exact email, phone or the created (at most 30 days) / created-or-updated (at most 31 days) time. Paged: pass next_page back as page. PIN codes and SSO links are not returned. Needs the Member role (Read). GET /api/v1/member/get.

Input parameters:

- `created_from` (string): Only members created at or after this club-local date-time (with created_to: at most 30 days apart).
- `created_or_updated_from` (string): Only members created or changed at or after this club-local date-time (with the end: at most 31 days apart).
- `created_or_updated_to` (string): Only members created or changed at or before this club-local date-time.
- `created_to` (string): Only members created at or before this club-local date-time.
- `email` (string): Exact email address (no partial matches).
- `family_id` (integer): Only the members of this family (organizationMemberFamilyId).
- `include_custom_fields` (boolean): Add the club's user-defined fields.
- `include_marketing_consent` (boolean): Add current email/text opt-in and the consent history.
- `include_ratings` (boolean): Add skill ratings (DUPR, UTR and so on).
- `organization_member_id` (integer): Only this member id.
- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `page_size` (integer): Members per page, 1-200 (default 50).
- `phone_number` (string): Phone number.

### `courtreserve_get_member_reservations` (~201 tokens)

Get a member's reservations

A member's upcoming (or dated) court bookings and event registrations: type, start/end, courts, event name and players. For a family member the reply covers the whole family. Give the member id or your own external id. Needs the Member role (Read). GET /api/v1/member/reservations.

Input parameters:

- `end_date` (string): Only reservations ending on or before this club-local date/time (default: open-ended).
- `external_id` (string): The member's id in your own system (the member's External Id).
- `limit` (integer): Most rows to return (default 100, max 500). The reply says when rows were left out.
- `organization_member_id` (integer): CourtReserve member id (courtreserve_list_members). One of this or external_id is required.
- `start_date` (string): Only reservations ending on or after this club-local date/time (default: now).

### `courtreserve_list_families` (~87 tokens)

List families

List family accounts (family id, name, number, members and membership). Needs the Family role (Read). GET /api/v1/family/get.

Input parameters:

- `family_id` (integer): Only this family (organizationMemberFamilyId).
- `limit` (integer): Most rows to return (default 100, max 500). The reply says when rows were left out.

### `courtreserve_list_membership_types` (~97 tokens)

List membership types

The club's membership types (id, name, price, billing and status). Use the ids to filter the membership report. Needs the MembershipType role (Read). GET /api/v1/membershiptype/get.

Input parameters:

- `limit` (integer): Most rows to return (default 100, max 500). The reply says when rows were left out.
- `membership_type_id` (integer): Only this membership type id.

### `courtreserve_membership_report` (~269 tokens)

Membership report

The Membership report: one row per member or family membership with status, billing cadence, start/end, next payment and cancellation history. Filter by type, assignment (family or individual) and the start, end, next-payment or cancellation dates. Paged. Needs the Membership Report role (Read). GET /api/v1/membershipreport/list.

Input parameters:

- `assignment_type` (string): Only family or only individual memberships (default both).
- `canceled_from` (string): Canceled on or after.
- `canceled_to` (string): Canceled on or before.
- `end_from` (string): Membership ends on or after.
- `end_to` (string): Membership ends on or before.
- `membership_type_ids` (array): Only these membership type ids (courtreserve_list_membership_types).
- `next_payment_from` (string): Next payment on or after.
- `next_payment_to` (string): Next payment on or before.
- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `page_size` (integer): Rows per page, 1-500 (default 100).
- `start_from` (string): Membership started on or after.
- `start_to` (string): Membership started on or before.

### `courtreserve_list_courts` (~82 tokens)

List courts

The club's courts: id, label, court type and order. Use the ids in court utilization and court blocks. Needs the Reservation role (Read). GET /api/v1/reservation/courts.

Input parameters:

- `limit` (integer): Most rows to return (default 100, max 500). The reply says when rows were left out.

### `courtreserve_list_reservation_types` (~78 tokens)

List reservation types

The club's reservation types (court booking, lesson, court block and so on) with ids. Needs the Reservation role (Read). GET /api/v1/reservation/reservationtypes.

Input parameters:

- `limit` (integer): Most rows to return (default 100, max 500). The reply says when rows were left out.

### `courtreserve_get_court_availability` (~159 tokens)

Get court availability

Court availability: each court's operating hours and the time slots already booked, for one date or a date range of at most 31 days (time zone of the club in the reply). Needs the Reservation role (Read). GET /api/v1/reservation/availability.

Input parameters:

- `court_type_id` (integer): Only courts of this type (see the court type in courtreserve_list_courts).
- `date` (string): One date, yyyy-MM-dd. Use this OR from_date + to_date.
- `from_date` (string): First date of a range, yyyy-MM-dd.
- `to_date` (string): Last date of the range, yyyy-MM-dd (at most 31 days after from_date).

### `courtreserve_list_reservations` (~200 tokens)

List active reservations

Active court reservations for a reservation period (the dates played) or a created/updated period, at most 31 days each: type, courts, start/end, players with contact details and what they owe/paid. Give at least one period. PIN codes are not returned. Needs the ReservationReport role (Read). GET /api/v1/reservationreport/listactive.

Input parameters:

- `created_or_updated_from` (string): Reservations created or changed on or after.
- `created_or_updated_to` (string): Reservations created or changed on or before.
- `include_custom_fields` (boolean): Add user-defined fields.
- `include_ratings` (boolean): Add player ratings.
- `limit` (integer): Most rows to return (default 100, max 500). The reply says when rows were left out.
- `reservations_from` (string): Reservations starting on or after.
- `reservations_to` (string): Reservations starting on or before.

### `courtreserve_list_cancelled_reservations` (~143 tokens)

List cancelled reservations

Cancelled court reservations by the date they were cancelled or by the reservation period, at most 31 days each. Give at least one period. Needs the ReservationReport role (Read). GET /api/v1/reservationreport/listcancelled.

Input parameters:

- `cancelled_from` (string): Cancelled on or after.
- `cancelled_to` (string): Cancelled on or before.
- `limit` (integer): Most rows to return (default 100, max 500). The reply says when rows were left out.
- `reservations_from` (string): Reservations starting on or after.
- `reservations_to` (string): Reservations starting on or before.

### `courtreserve_whos_here` (~175 tokens)

Who is here

Who is booked in a time window (for example today): member reservations and event registrations with the member, court and time, optionally including or only cancelled ones. The window can be at most 31 days. Needs the ReservationReport role (Read). GET /api/v1/reservationreport/whoisheretoday.

Input parameters:

- `cancelled_only` (boolean): Only cancelled reservations (wins over include_cancelled).
- `end` (string, required): End of the window, club-local yyyy-MM-ddTHH:mm:ss.
- `include_cancelled` (boolean): Also return cancelled reservations.
- `limit` (integer): Most rows to return (default 100, max 500). The reply says when rows were left out.
- `start` (string, required): Start of the window, club-local yyyy-MM-ddTHH:mm:ss.

### `courtreserve_court_utilization` (~196 tokens)

Court utilization

Court utilization report (booked vs available time per time slot) for a period of at most 7 days, optionally for chosen courts, court types, event types, event tags or reservation types. Needs the ReservationReport role (Read). GET /api/v1/reservationreport/courtutilization.

Input parameters:

- `court_ids` (array): Only these court ids (courtreserve_list_courts).
- `court_type_ids` (array): Only these court type ids.
- `end_date` (string, required): Last day of the period (at most 7 days after the first).
- `event_tag_ids` (array): Only these event tag ids.
- `event_type_ids` (array): Only these event category ids (courtreserve_list_event_categories).
- `reservation_type_ids` (array): Only these reservation type ids (courtreserve_list_reservation_types).
- `start_date` (string, required): First day of the period.

### `courtreserve_list_event_categories` (~111 tokens)

List event categories

Event categories (clinics, round robins, tournaments, open play...) with ids. Needs the EventCalendar role (Read). GET /api/v1/eventcalendar/categories.

Input parameters:

- `category_id` (integer): Only this category id.
- `is_public` (boolean): Only public (true) or only non-public (false) categories; omit for all.
- `limit` (integer): Most rows to return (default 100, max 500). The reply says when rows were left out.

### `courtreserve_list_events` (~196 tokens)

List events

Events on the club calendar between two dates: name, category, start/end, courts, instructors, capacity, registered and waitlist counts, price and rating limits. SSO links are not returned. Needs the EventCalendar role (Read). GET /api/v1/eventcalendar/eventlist.

Input parameters:

- `category_id` (integer): Only this event category (courtreserve_list_event_categories).
- `end_date` (string): Events up to this club-local date/time.
- `include_price_info` (boolean): Add prices (default true).
- `include_rating_restrictions` (boolean): Add rating restrictions.
- `include_tags` (boolean): Add event tags.
- `limit` (integer): Most rows to return (default 100, max 500). The reply says when rows were left out.
- `start_date` (string): Events from this club-local date/time.
- `status` (string): Event status (default Active).

### `courtreserve_list_event_registrations` (~172 tokens)

List event registrations

Active registrations for events, clinics and lessons with the member, event and what was paid. Give an event period or a registration period, at most 31 days each. Needs the EventRegistrationReport role (Read). GET /api/v1/eventregistrationreport/listactive.

Input parameters:

- `event_from` (string): Events on or after.
- `event_to` (string): Events on or before.
- `include_courts` (boolean): Add court information.
- `include_partner_info` (boolean): Add partner(s) for team events.
- `limit` (integer): Most rows to return (default 100, max 500). The reply says when rows were left out.
- `registered_from` (string): Registered on or after.
- `registered_to` (string): Registered on or before.

### `courtreserve_list_event_waitlist` (~160 tokens)

List event waitlist

People on event waitlists. Give an event period or a registration period, at most 31 days each. Needs the EventRegistrationReport role (Read). GET /api/v1/eventregistrationreport/listwaitlist.

Input parameters:

- `event_from` (string): Events on or after.
- `event_to` (string): Events on or before.
- `include_courts` (boolean): Add court information.
- `include_partner_info` (boolean): Add partner(s) for team events.
- `limit` (integer): Most rows to return (default 100, max 500). The reply says when rows were left out.
- `registered_from` (string): Registered on or after.
- `registered_to` (string): Registered on or before.

### `courtreserve_list_cancelled_event_registrations` (~139 tokens)

List cancelled event registrations

Cancelled event registrations by cancellation date or by event date, at most 31 days each. Give at least one period. Needs the EventRegistrationReport role (Read). GET /api/v1/eventregistrationreport/listcancelled.

Input parameters:

- `cancelled_from` (string): Cancelled on or after.
- `cancelled_to` (string): Cancelled on or before.
- `event_from` (string): Events on or after.
- `event_to` (string): Events on or before.
- `limit` (integer): Most rows to return (default 100, max 500). The reply says when rows were left out.

### `courtreserve_list_checkins` (~180 tokens)

List check-ins

Check-in report: who checked in to court bookings and events, by check-in period or reservation period (at most 31 days each). Give at least one period. Role: the key's access to attendance data. GET /api/v1/attendancereport/checkin.

Input parameters:

- `checkin_from` (string): Checked in on or after.
- `checkin_to` (string): Checked in on or before.
- `include_court_booking` (boolean): Include court bookings (default true).
- `include_events` (boolean): Include events (default true).
- `limit` (integer): Most rows to return (default 100, max 500). The reply says when rows were left out.
- `reservations_from` (string): Reservations starting on or after.
- `reservations_to` (string): Reservations starting on or before.

### `courtreserve_list_transactions` (~261 tokens)

List transactions

Transactions (fees, membership fees, payments, refunds...) by transaction date or reservation date: id, type, date, subtotal, tax, total, unpaid amount, payment type, category and the member's name, email and phone. Filter by type, paid/unpaid and payment type. Give at least one period. Needs the Transactions role (Read). GET /api/v1/transactions/list.

Input parameters:

- `include_promo_info` (boolean): Add the promo codes each fee used.
- `limit` (integer): Most rows to return (default 100, max 500). The reply says when rows were left out.
- `only_paid` (boolean): Only paid transactions.
- `only_unpaid` (boolean): Only unpaid transactions.
- `payment_types` (string): Comma-separated payment types, for example 'Cash,Credit Card,Balance'.
- `reservation_from` (string): Reservations starting on or after.
- `reservation_to` (string): Reservations starting on or before.
- `transaction_from` (string): Transactions on or after.
- `transaction_to` (string): Transactions on or before.
- `transaction_types` (string): Comma-separated transaction types, for example 'Fee,Membership Fee,Payment' (the vendor's own names).

### `courtreserve_sales_summary` (~109 tokens)

Sales summary

Detailed sales summary for a payment period of at most 31 days: paid fees plus refunds by category and payment type. Needs the Transactions role (Read). GET /api/v1/transactions/salessummarydetailed.

Input parameters:

- `include_promo_info` (boolean): Add the promo codes each fee used.
- `payment_from` (string, required): First day of the payment period.
- `payment_to` (string, required): Last day of the payment period (at most 31 days after the first).

### `courtreserve_list_promo_codes` (~94 tokens)

List promo codes

The club's promo codes: code, name, type, value, dates, limits and what they apply to. Needs the PromoCodes role (Read). GET /api/v1/promocode/get.

Input parameters:

- `limit` (integer): Most rows to return (default 100, max 500). The reply says when rows were left out.
- `promo_code_id` (integer): Only this promo code id.

### `courtreserve_list_leagues` (~125 tokens)

List leagues

The club's leagues, with their sessions (id and name) when include_sessions is true (default). Paged. Needs the League role (Read). GET /api/v1/league/get.

Input parameters:

- `include_sessions` (boolean): Add each league's sessions (default true).
- `league_id` (integer): Only this league id.
- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `page_size` (integer): Leagues per page, 1-200 (default 100).

### `courtreserve_list_league_sessions` (~154 tokens)

List league sessions

League sessions, for one league or one session, optionally with their game days and registered players. Paged. Needs the League role (Read). GET /api/v1/league/sessions.

Input parameters:

- `include_game_days` (boolean): Add each session's game days.
- `include_players` (boolean): Add each session's registered players (use with one session).
- `league_id` (integer): Only this league's sessions.
- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `page_size` (integer): Sessions per page, 1-200 (default 100).
- `session_id` (integer): Only this session.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/io-usefulapi-courtreserve/courtreserve#diagnostics

## Score history

- 2026-11-05: 18
- 2026-11-04: 18
- 2026-11-03: 18
- 2026-11-02: 18
- 2026-11-01: 18
- 2026-10-31: 66
- 2026-10-30: 63
- 2026-10-29: 62
- 2026-10-28: 62

## Common questions

### What is the CourtReserve MCP by usefulapi server?

CourtReserve MCP by usefulapi is listed in the public MCP registry as io.usefulapi/courtreserve. Read club members, court availability, reservations, events, attendance and revenue reports. This page covers its hosted endpoint (https://courtreserve.usefulapi.io/mcp).

### Is the CourtReserve MCP by usefulapi server safe to use?

CourtReserve MCP by usefulapi scores 18 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the CourtReserve MCP by usefulapi server expose?

CourtReserve MCP by usefulapi exposes 23 tools: courtreserve_list_members, courtreserve_get_member_reservations, courtreserve_list_families, courtreserve_list_membership_types, courtreserve_membership_report, and 18 more. Their descriptions and schemas cost roughly 3,761 tokens of context every time the server is loaded.

### Does the CourtReserve MCP by usefulapi server require authentication?

Its publisher declares no required credentials for CourtReserve MCP by usefulapi. We have not been able to confirm that against the live endpoint, and a server can require authorisation without declaring it here.

### Is the CourtReserve MCP by usefulapi server still maintained?

CourtReserve MCP by usefulapi is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What did VerifyMCP test on the CourtReserve MCP by usefulapi server?

VerifyMCP ran 4 checks on CourtReserve MCP by usefulapi, covering TLS certificate, HSTS header, DNSSEC and Transport. 7 items could not be completed, a gap on our side rather than a finding about CourtReserve MCP by usefulapi: Authorization, HTTPS, Schema quality, Stability and 3 more. 5 categories score 0 for that reason, because we only credit what we can confirm. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.

## Links

- Remote endpoint: https://courtreserve.usefulapi.io/mcp
- Repository: https://github.com/m190/usefulapi-mcp
- Website: https://usefulapi.io/courtreserve/
- Changelog RSS feed: https://verifymcp.io/servers/io-usefulapi-courtreserve/courtreserve.xml
- Changelog JSON feed: https://verifymcp.io/servers/io-usefulapi-courtreserve/courtreserve/changelog.json
- Trust report (JSON): https://verifymcp.io/servers/io-usefulapi-courtreserve/courtreserve.json
- HTML version of this page: https://verifymcp.io/servers/io-usefulapi-courtreserve/courtreserve
