YouCanBook.me MCP by usefulapi

Manage YouCanBook.me bookings, booking pages, appointment types, team members and locations.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
95%
Naming quality
73%
Poisoning risk
80%
Permission match
100%
Protocol compliance
100%

Findings (8)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool description contains suspicious base64-like encoded stringin youcanbookme_update_booking
  • LOWTool 'youcanbookme_list_appointment_types' name length outside 3-30 rangein youcanbookme_list_appointment_types
  • LOWTool 'youcanbookme_list_available_accounts' name length outside 3-30 rangein youcanbookme_list_available_accounts
  • LOWTool 'youcanbookme_create_appointment_type' name length outside 3-30 rangein youcanbookme_create_appointment_type
  • LOWTool 'youcanbookme_update_appointment_type' name length outside 3-30 rangein youcanbookme_update_appointment_type
  • LOWTool 'youcanbookme_create_team_member' name length outside 3-30 rangein youcanbookme_create_team_member
  • LOWTool 'youcanbookme_update_team_member' name length outside 3-30 rangein youcanbookme_update_team_member

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,127Tokens (tool definitions)
~1.6 KBTypical response size
Significant attention impact (3.22% 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": {
    "youcanbookme": {
      "url": "https://youcanbookme.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://youcanbookme.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (18)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢youcanbookme_list_bookings(profileId, after, before, cancelled, searchText, ...)

List bookings on your account. Unfiltered reads use GET /v1/{accountId}/bookings (10 per page). Filtered reads use GET /v1/accounts/{accountId}/bookings/query: supply after as the required start of the time range; optionally before, profileId, cancelled, searchText and maxResults (10-500). Pagination uses cursors, not page numbers: params accepts direction plus boundaryStartsAt/boundaryId for unfiltered reads, or fromBookingId for filtered reads. Returns a JSON array of bookings.

Input Schema

{
  "type": "object",
  "properties": {
    "profileId": {
      "description": "Restrict to bookings on this profile (booking page) id.",
      "type": "string"
    },
    "after": {
      "description": "Only bookings starting AFTER this time (ISO 8601, e.g. 2026-07-01T00:00:00Z).",
      "type": "string"
    },
    "before": {
      "description": "Only bookings starting BEFORE this time (ISO 8601).",
      "type": "string"
    },
    "cancelled": {
      "description": "Filter by cancelled status: true = only cancelled, false = all non-cancelled statuses. Omit for all.",
      "type": "boolean"
    },
    "searchText": {
      "description": "Search text, at least 3 characters. Requires after; params.searchTextCriteria can select title, form or ref.",
      "type": "string",
      "minLength": 3
    },
    "fields": {
      "description": "Comma-separated field paths to return (e.g. \"id,title,startsAt\"). Supports dotted paths for nested objects. Omit to get the default field set.",
      "type": "string"
    },
    "page": {
      "description": "Compatibility: only page 0 is accepted. Use cursor parameters for subsequent pages.",
      "type": "integer",
      "minimum": 0,
      "maximum": 0
    },
    "maxResults": {
      "description": "Filtered-query page size, 10-500 (default 50). Requires after.",
      "type": "integer",
      "minimum": 10,
      "maximum": 500
    },
    "params": {
      "description": "Additional documented query-string filters to send verbatim (merged with the typed params above).",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": [
          "string",
          "number",
          "boolean"
        ]
      }
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢youcanbookme_get_booking(bookingId, fields)

Fetch a single booking (appointment) by id. YCBM API: GET /v1/bookings/{bookingId}. Use `fields` to select which fields to return. Returns the booking object.

Input Schema

{
  "type": "object",
  "properties": {
    "bookingId": {
      "type": "string",
      "description": "The booking id."
    },
    "fields": {
      "description": "Comma-separated field paths to return (e.g. \"id,title,startsAt\"). Supports dotted paths for nested objects. Omit to get the default field set.",
      "type": "string"
    }
  },
  "required": [
    "bookingId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢youcanbookme_list_profiles(fields, page, maxResults, params)

List all profiles (booking pages) on the account. YCBM API: GET /v1/profiles. A profile is a bookable page with its own subdomain, appointment types, team members, and locations. Use `fields` to select fields (e.g. "id,title,subdomain"). Paginated via page (0-based) + maxResults. Returns a JSON array of profiles.

Input Schema

{
  "type": "object",
  "properties": {
    "fields": {
      "description": "Comma-separated field paths to return (e.g. \"id,title,startsAt\"). Supports dotted paths for nested objects. Omit to get the default field set.",
      "type": "string"
    },
    "page": {
      "description": "Pagination page number, 0-based (offset-based paging). Use with maxResults.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "maxResults": {
      "description": "Maximum records per page (page size). Defaults to the API's own default when omitted.",
      "type": "integer",
      "minimum": 1,
      "maximum": 1000
    },
    "params": {
      "description": "Additional documented query-string filters to send verbatim (merged with the typed params above).",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": [
          "string",
          "number",
          "boolean"
        ]
      }
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢youcanbookme_get_profile(profileId, fields)

Fetch a single profile (booking page) by id. YCBM API: GET /v1/profiles/{profileId}. Use `fields` to select fields, including nested sub-resources (appointmentTypes, teamMembers, locations). Returns the profile object.

Input Schema

{
  "type": "object",
  "properties": {
    "profileId": {
      "type": "string",
      "description": "The profile (booking page) id."
    },
    "fields": {
      "description": "Comma-separated field paths to return (e.g. \"id,title,startsAt\"). Supports dotted paths for nested objects. Omit to get the default field set.",
      "type": "string"
    }
  },
  "required": [
    "profileId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢youcanbookme_list_team_members(profileId)

List the team members configured on a profile (booking page). YCBM API: GET /v1/profiles/{profileId} with a teamMembers field selection. Returns the profile's teamMembers block (each member has id, name, email, description, pic, calendarId).

Input Schema

{
  "type": "object",
  "properties": {
    "profileId": {
      "type": "string",
      "description": "The profile (booking page) id."
    }
  },
  "required": [
    "profileId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢youcanbookme_list_appointment_types(profileId)

List the appointment types configured on a profile (booking page). YCBM API: GET /v1/profiles/{profileId} with an appointmentTypes field selection. Returns the profile's appointmentTypes block (each with id, name, description, slotLength, price).

Input Schema

{
  "type": "object",
  "properties": {
    "profileId": {
      "type": "string",
      "description": "The profile (booking page) id."
    }
  },
  "required": [
    "profileId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢youcanbookme_list_locations(profileId)

List the locations configured on a profile (booking page). YCBM API: GET /v1/profiles/{profileId} with a locations field selection. Returns the profile's locations block (each with id, kind, value, notes, strategy).

Input Schema

{
  "type": "object",
  "properties": {
    "profileId": {
      "type": "string",
      "description": "The profile (booking page) id."
    }
  },
  "required": [
    "profileId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢youcanbookme_list_available_accounts

List the accounts/calendars available to your account — used to find the calendarId for a team member. YCBM API: GET /v1/{accountId}/availableAccounts (accountId is taken from your configured credentials). Returns a JSON array.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢youcanbookme_request(path)

Power-user escape hatch: GET any YCBM API path not wrapped by a dedicated tool. READ-ONLY — only GET is allowed. Pass the FULL API path after the origin, starting with a slash, INCLUDING any query string, e.g. "/v1/bookings?maxResults=5" or "/v1/profiles". Returns the parsed JSON.

Input Schema

{
  "type": "object",
  "properties": {
    "path": {
      "type": "string",
      "description": "Full API path after the origin, starting with \"/\", e.g. \"/v1/bookings?maxResults=5\"."
    }
  },
  "required": [
    "path"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴youcanbookme_create_booking(profileId, startsAt, endsAt, title, timeZone, ...)

MUTATES YouCanBookMe data: creates a booking (appointment) on a profile. YCBM API: POST /v1/bookings (JSON). Required: profileId, startsAt, endsAt (ISO 8601 times). Optional: title, timeZone, locale, units. Complex fields like `answers` (form-field answers) and `linkFields` should be passed via the `fields` passthrough. Returns the created booking.

Input Schema

{
  "type": "object",
  "properties": {
    "profileId": {
      "type": "string",
      "description": "The profile (booking page) id to book on (required)."
    },
    "startsAt": {
      "type": "string",
      "description": "Booking start time, ISO 8601 (required)."
    },
    "endsAt": {
      "type": "string",
      "description": "Booking end time, ISO 8601 (required)."
    },
    "title": {
      "description": "Booking title.",
      "type": "string"
    },
    "timeZone": {
      "description": "IANA time zone for the booking (e.g. Europe/London).",
      "type": "string"
    },
    "locale": {
      "description": "Locale for the booking (e.g. en-GB).",
      "type": "string"
    },
    "units": {
      "description": "Number of slot units to book.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "fields": {
      "description": "Additional documented YCBM fields to send in the JSON write body — merged OVER the typed fields above.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "profileId",
    "startsAt",
    "endsAt"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴youcanbookme_update_booking(bookingId, title, startsAt, endsAt, cancelled, ...)

MUTATES YouCanBookMe data: updates an existing booking (reschedule, rename, mark cancelled/no-show). YCBM API: PATCH /v1/bookings/{bookingId} (JSON, partial update). Set any of title/startsAt/endsAt/cancelled/noShow/timeZone/locale/units; use the `fields` passthrough for answers/linkFields or other documented fields. The path id is never sent in the body.

Input Schema

{
  "type": "object",
  "properties": {
    "bookingId": {
      "type": "string",
      "description": "The booking id to update (path only; required)."
    },
    "title": {
      "description": "New booking title.",
      "type": "string"
    },
    "startsAt": {
      "description": "New start time, ISO 8601 (reschedule).",
      "type": "string"
    },
    "endsAt": {
      "description": "New end time, ISO 8601 (reschedule).",
      "type": "string"
    },
    "cancelled": {
      "description": "Set true to cancel the booking, false to un-cancel.",
      "type": "boolean"
    },
    "noShow": {
      "description": "Mark the attendee as a no-show (true) or not (false).",
      "type": "boolean"
    },
    "timeZone": {
      "description": "New IANA time zone.",
      "type": "string"
    },
    "locale": {
      "description": "New locale.",
      "type": "string"
    },
    "units": {
      "description": "New number of slot units.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "fields": {
      "description": "Additional documented YCBM fields to send in the JSON write body — merged OVER the typed fields above.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "bookingId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴youcanbookme_cancel_booking(bookingId)

MUTATES YouCanBookMe data: cancels a booking. Convenience wrapper for PATCH /v1/bookings/{bookingId} with { cancelled: true } — safer and reversible (re-activate via youcanbookme_update_booking cancelled=false) versus deleting. Returns the updated booking.

Input Schema

{
  "type": "object",
  "properties": {
    "bookingId": {
      "type": "string",
      "description": "The booking id to cancel (path only; required)."
    }
  },
  "required": [
    "bookingId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴youcanbookme_update_profile(profileId, fields)

MUTATES YouCanBookMe data: updates a profile's (booking page) configuration. YCBM API: PATCH /v1/profiles/{profileId} (JSON, partial update). Pass the fields to change via the `fields` passthrough (e.g. { title, subdomain, ... }) — profile fields are numerous and use YCBM's own names. The path id is never sent in the body.

Input Schema

{
  "type": "object",
  "properties": {
    "profileId": {
      "type": "string",
      "description": "The profile (booking page) id to update (path only; required)."
    },
    "fields": {
      "description": "Additional documented YCBM fields to send in the JSON write body — merged OVER the typed fields above.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "profileId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴youcanbookme_create_appointment_type(profileId, name, fields)

MUTATES YouCanBookMe data: adds an appointment type to a profile. YCBM API: POST /v1/profiles/{profileId}/appointmenttypes/items (JSON). Required: name; use the `fields` passthrough for description, slotLength, price, etc. The path profileId is never sent in the body.

Input Schema

{
  "type": "object",
  "properties": {
    "profileId": {
      "type": "string",
      "description": "The profile (booking page) id (path only; required)."
    },
    "name": {
      "type": "string",
      "description": "The appointment type name (required)."
    },
    "fields": {
      "description": "Additional documented YCBM fields to send in the JSON write body — merged OVER the typed fields above.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "profileId",
    "name"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴youcanbookme_update_appointment_type(profileId, appointmentTypeId, fields)

MUTATES YouCanBookMe data: updates an appointment type on a profile. YCBM API: PATCH /v1/profiles/{profileId}/appointmenttypes/items/{appointmentTypeId} (JSON, partial update). Pass changed fields (name, description, slotLength, price, ...) via the `fields` passthrough. Path ids are never sent in the body.

Input Schema

{
  "type": "object",
  "properties": {
    "profileId": {
      "type": "string",
      "description": "The profile (booking page) id (path only; required)."
    },
    "appointmentTypeId": {
      "type": "string",
      "description": "The appointment type id to update (path only; required)."
    },
    "fields": {
      "description": "Additional documented YCBM fields to send in the JSON write body — merged OVER the typed fields above.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "profileId",
    "appointmentTypeId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴youcanbookme_create_team_member(profileId, name, calendarId, fields)

MUTATES YouCanBookMe data: adds a team member to a profile. YCBM API: POST /v1/profiles/{profileId}/teammembers/items (JSON). Required: name; calendarId links the member to a calendar (find it via youcanbookme_list_available_accounts). Use the `fields` passthrough for email, description, pic, etc. The path profileId is never sent in the body.

Input Schema

{
  "type": "object",
  "properties": {
    "profileId": {
      "type": "string",
      "description": "The profile (booking page) id (path only; required)."
    },
    "name": {
      "type": "string",
      "description": "The team member's display name (required)."
    },
    "calendarId": {
      "description": "The calendar id to link (see youcanbookme_list_available_accounts).",
      "type": "string"
    },
    "fields": {
      "description": "Additional documented YCBM fields to send in the JSON write body — merged OVER the typed fields above.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "profileId",
    "name"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴youcanbookme_update_team_member(profileId, teamMemberId, fields)

MUTATES YouCanBookMe data: updates a team member on a profile. YCBM API: PATCH /v1/profiles/{profileId}/teammembers/items/{teamMemberId} (JSON, partial update). Pass changed fields (name, email, description, calendarId, ...) via the `fields` passthrough. Path ids are never sent in the body.

Input Schema

{
  "type": "object",
  "properties": {
    "profileId": {
      "type": "string",
      "description": "The profile (booking page) id (path only; required)."
    },
    "teamMemberId": {
      "type": "string",
      "description": "The team member id to update (path only; required)."
    },
    "fields": {
      "description": "Additional documented YCBM fields to send in the JSON write body — merged OVER the typed fields above.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "profileId",
    "teamMemberId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴youcanbookme_create_location(profileId, kind, strategy, value, notes, ...)

MUTATES YouCanBookMe data: adds a location to a profile. YCBM API: POST /v1/profiles/{profileId}/locations (JSON). Required: kind (location type) and strategy (how it is assigned). Use the `fields` passthrough for value, notes, and other documented fields. The path profileId is never sent in the body.

Input Schema

{
  "type": "object",
  "properties": {
    "profileId": {
      "type": "string",
      "description": "The profile (booking page) id (path only; required)."
    },
    "kind": {
      "type": "string",
      "description": "The location kind/type (required)."
    },
    "strategy": {
      "type": "string",
      "description": "The location assignment strategy (required)."
    },
    "value": {
      "description": "The location value (e.g. an address or link).",
      "type": "string"
    },
    "notes": {
      "description": "Notes shown with the location.",
      "type": "string"
    },
    "fields": {
      "description": "Additional documented YCBM fields to send in the JSON write body — merged OVER the typed fields above.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "profileId",
    "kind",
    "strategy"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Recommended Prompts

retrieve_data
Get details about [item] from youcanbookme
Expected tools: get_booking
fetch_info
Fetch [information type] using youcanbookme
Expected tools: get_booking
list_items
List all [items] available in youcanbookme
Expected tools: list_bookings
browse_collection
Show me the [collection] from youcanbookme
Expected tools: list_bookings
explore_workflow
List available [items], then get details for each one using youcanbookme
Expected tools: list_bookingsget_booking

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded18 tools
verifiedversion not recorded18 tools
verifiedversion not recorded18 tools
verifiedversion not recorded18 tools
verifiedversion not recorded18 tools