carly-cli
OfficialThis MCP server provides an agent-native interface to Carly, an AI scheduling assistant, for managing calendars, booking pages, event types, slots, and bookings.
Authentication & Profile
whoami— Verify identity and confirm the current user/API key
Calendars
calendars_list— List connected calendars (Google, Outlook, etc.) with conflict-checking statuscalendars_select/calendars_unselect— Toggle whether a calendar counts against booking-page availability (requiresbooking_pages:write)
Booking Pages
booking_pages_list— List all booking pagesbooking_pages_get— Retrieve a specific booking page by event type IDbooking_pages_create— Create a new booking page (title, slug, duration, location, video provider, timezone, availability windows, custom questions, buffers, etc.)booking_pages_update— Update any subset of fields on an existing booking page (nested fields replace wholesale)booking_pages_delete— Soft-deactivate a booking page (reversible via update)
Event Types
event_types_list— List your own event types, or a public profile's active event types by username
Slots
slots_list— List available booking slots within a time range, identified by event type ID or username + slug
Bookings
bookings_list— List bookings with optional filters (status, event type, time range, limit)bookings_get— Retrieve a single booking by its UID
Note: Booking write operations (create, cancel, reschedule) are intentionally not exposed — use the Carly web dashboard for those.
Allows connecting and managing Google Calendar accounts for scheduling, including OAuth-based authentication and calendar listing.
Supports connecting Zoom for video conferencing as a meeting provider in scheduling workflows.
carly-cli
Agent-native CLI and MCP server for Carly — the AI scheduling assistant. Read and manage booking pages, event types, calendars, and bookings from your shell or any MCP-compatible client.
11 tools across 5 resource groups. Same command definitions drive the CLI and the MCP server, so there is no drift between human and agent interfaces.
Works with Google Calendar, Outlook, and Zoom.
Install
npm install -g carly-aiOr run from source:
git clone https://github.com/usecarly/carly-cli.git
cd carly-cli
npm install && npm run build
npm link # exposes `carly` on PATHRelated MCP server: booking_chest
Quick start
Brand new user? Sign up from the CLI — it opens the OAuth consent page in your browser, connects your calendar, and you land back in the dashboard. Then mint an API key and run carly login.
carly signup # opens Google OAuth (use --with microsoft for Outlook)
# ... approve in browser, then:
carly login # paste the API key you minted at /booking-pages (expand "Generate API key")Already have a Carly account?
# 1. Authenticate (interactive — saves to ~/.carly-cli/config.json)
carly login
# 2. Confirm the key works
carly profile whoami --pretty
# 3. See what you have
carly calendars list --output table
carly booking-pages list --output table
carly schedules list --output table
carly bookings list --output tableConnect additional calendars / video providers
carly calendars connect google # Google Calendar (also handles first-time signup)
carly calendars connect microsoft # Outlook calendar + Teams meetings
carly calendars connect zoom # Zoom (for video-only; requires existing Carly account)Each command opens the dashboard's OAuth page in your browser. No tokens touch the CLI.
Authentication
Resolved in priority order:
# | Method | Example |
1 |
|
|
2 |
|
|
3 | Config file |
|
Base URL defaults to https://carlyassistant.com and can be overridden with --api-base-url or CARLY_API_BASE_URL. The legacy dashboard.carlyassistant.com host serves the same API and still works.
Mint a key at <base-url>/booking-pages → expand Generate API key (under "Use Carly from your terminal or AI agent"). Scopes are enforced server-side; see Scopes below.
MCP server setup
carly mcp starts an MCP server over stdio that exposes every CLI command as a tool to any MCP-compatible client.
Claude Code
claude mcp add carly -- carly mcp
# or, before `npm link`:
claude mcp add carly -- node /path/to/carly-cli/dist/mcp.jsClaude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"carly": {
"command": "carly",
"args": ["mcp"],
"env": {
"CARLY_API_KEY": "carly_live_xxxx"
}
}
}
}Cursor
Add to .cursor/mcp.json:
{
"mcpServers": {
"carly": {
"command": "carly",
"args": ["mcp"],
"env": {
"CARLY_API_KEY": "carly_live_xxxx"
}
}
}
}Command reference
Auth + utility
carly login # Interactive API key setup
carly logout # Remove stored credentials
carly auth-status # Show current auth resolution
carly mcp # Start MCP server (stdio)
carly profile whoami # Confirm identity + key validityCalendars
carly calendars list # Connected calendars (provider + account + key)Use calendar_key values from this list as the --calendar-key argument when creating/updating booking pages.
Booking pages (6 commands)
carly booking-pages list
carly booking-pages get <event-type-id>
carly booking-pages create --title <title> [options]
--slug <slug> # URL slug (e.g. "15min")
--description <text>
--duration <min> # Meeting length (default 30)
--location <loc> # Physical location or URL
--video-provider <name> # google_meet, teams, zoom, ...
--calendar-key <key> # From `carly calendars list`
--timezone <tz> # IANA TZ (e.g. America/New_York)
--username <username> # Profile username (lowercase)
--display-name <name>
--event-name-template <tpl>
--min-notice-minutes <n> # Default 120
--max-days-ahead <n> # Default 60
--before-event-buffer <min>
--after-event-buffer <min>
--slot-interval <min>
--availability <json> # [{"days":[1,2,3,4,5],"start_time":"09:00","end_time":"17:00"}]
--date-overrides <json> # [{"date":"2026-12-24","windows":[]}] (empty windows = day blocked)
--custom-questions <json> # [{"label":"Company","type":"text","required":true}]
--duration-options <list> # CSV (15,30,60) or JSON array ([15,30,60])
--widgets <json> # Page content blocks
--schedule-id <id> # Book on a library schedule (see `carly schedules list`); omit to follow your default
--schedule-name <name> # Name for the schedule created from --availability/--timezone
# Team pages
--organization-id <id> --scheduling-type <round_robin|collective|managed>
--hosts <json> # [{"user_id":12,"is_fixed":false,"priority":1,"schedule_id":null}]
--assign-all-team-members <true|false> --member-fields-unlocked <true|false>
--rr-reset-interval <day|month> --rr-timestamp-basis <created_at|start_time>
--include-no-show-in-rr-calculation <true|false> --reschedule-with-same-round-robin-host <true|false>
# Limits and windows
--booking-window-mode <rolling|business_days|range> --booking-window-business-days <n>
--booking-window-start <date> --booking-window-end <date>
--booking-limit-count <n> --booking-limit-period <day|week|month|year> --booking-limit-duration-minutes <n>
--booker-active-booking-limit <n> --offset-start-minutes <n> --only-show-first-available-slot <true|false>
# Guest controls and privacy
--requires-confirmation <true|false> --confirmation-threshold-minutes <n>
--disable-guests / --disable-cancelling / --disable-rescheduling <true|false> --minimum-reschedule-notice <n>
--hide-calendar-notes / --hide-calendar-event-details / --hide-organizer-email <true|false>
--requires-private-link <true|false> --locked-timezone <tz> --color <#RRGGBB>
--success-redirect-url <url> --forward-params-success-redirect <true|false>
# Seats, recurrence, reminders
--seats-per-time-slot <n> --seats-show-attendees <true|false> --seats-show-availability-count <true|false>
--recurrence-frequency <weekly|monthly|yearly> --recurrence-interval <n> --recurrence-occurrences <n>
--reminder-configs <json>
carly booking-pages update <event-type-id> [options] # Same flags as create, all optional
--is-active <true|false> # Enable or disable the page
carly booking-pages delete <event-type-id> # Soft-delete: sets is_active=false. Re-activate with `update <id> --is-active true`.
carly booking-pages check-username <username> # Is this profile username free?Nested-field notes:
--availabilitydays are numbered Sunday=0, Monday=1, …, Saturday=6. Times are HH:MM in the page's timezone.--date-overridesare one-off exceptions that replace the weekly hours for a single date, read in the page's timezone."windows": []blocks the date entirely; otherwise only the listed windows are bookable. An override can also open a date the weekly pattern leaves closed. Max 100 overrides / 500 windows per page.--availabilityand--date-overridesare independent — updating one leaves the other intact. Pass--date-overrides '[]'to clear every override without touching the weekly hours.--custom-questionstypeis one oftext,textarea,number,phone,email,select,checkbox,radio,boolean.optionsis only required forselect/radio.On
update, any nested field you pass replaces the previous value wholesale — there is no partial merge.MCP callers may pass these as native arrays/objects instead of stringified JSON.
Schedules (6 commands)
Working hours live in a library of schedules, not on the page. You have one default (every page without --schedule-id follows it); a team can own shared schedules a team page imposes on every host. booking-pages update --availability edits the page's own schedule — or, for a page that follows your default, gives it a copy of its own.
carly schedules list --output table
carly schedules get <schedule-id> # hours, overrides, timezone, and the pages using it
carly schedules create --name "Working hours" --timezone America/New_York --availability '<json>'
carly schedules create --name "Front desk" --organization-id 4 --timezone America/Chicago --availability '<json>'
carly schedules create --for-user-id 388 # seed a 9-5 default for a team member with no hours
carly schedules update <schedule-id> --timezone Europe/Berlin --availability '<json>' --date-overrides '<json>'
carly schedules set-default <schedule-id>
carly schedules delete <schedule-id> # refused while a page uses itEvent types
carly event-types list # Caller's own event types
carly event-types list --username <username> # Public active event types for a profileSlots
carly slots list --event-type-id <id> --start-time <iso> --end-time <iso> [--duration <min>]
# or, public access via profile+slug:
carly slots list --username <username> --event-type-slug <slug> \
--start-time <iso> --end-time <iso>Bookings
carly bookings list [options]
--status <status> # accepted, cancelled, rescheduled, ...
--event-type-id <id>
--limit <n> # 1–1000, default 100
--start-time <iso>
--end-time <iso>
carly bookings get <uid>bookings:write (create, cancel, reschedule) is intentionally not exposed on this CLI or the MCP surface; use the web dashboard.
Output formats
Every data-returning command accepts these global/per-command flags:
Flag | Behavior |
| Single-line JSON to stdout |
| Pretty-printed JSON |
| Shortcut for |
| Fixed-width table; columns come from the command's |
| Narrow JSON keys; override table columns |
| Suppress stdout (exit code only) |
Table mode flattens Carly's {items: [...]} envelope and the {slots: {date: [...]}} map automatically. For single-object responses (e.g. bookings get), table mode falls back to pretty JSON with a note on stderr.
# Default compact JSON
carly bookings list
# Human-friendly table
carly bookings list --output table
# Just the columns you care about
carly bookings list --output table --fields uid,status,start_time
# Pretty JSON with a field filter
carly bookings list --fields uid,status,start_time --prettyScopes
Scope | Needed for |
|
|
|
|
|
|
bookings:write is not accepted when minting new keys and is not surfaced on this CLI or the MCP server. Existing keys that were minted with it still authenticate, but no write paths are wired up for bookings.
Architecture
src/
├── index.ts # CLI entry (Commander.js)
├── mcp.ts # MCP entry (re-exports server.ts)
├── core/
│ ├── types.ts # CommandDefinition — single source of truth
│ ├── client.ts # CarlyClient (fetch + retry/backoff)
│ ├── auth.ts # Flag → env → config resolution
│ ├── config.ts # ~/.carly-cli/config.json (mode 0600)
│ ├── handler.ts # executeCommand (path/query/body routing)
│ ├── output.ts # json | pretty | table renderer + --fields
│ └── errors.ts # AuthError, NotFoundError, RateLimitError, ...
├── commands/
│ ├── index.ts # allCommands registry + Commander wiring
│ ├── auth/ # login, logout, auth-status
│ ├── profile/ # whoami
│ ├── calendars/ # list
│ ├── booking-pages/ # list, get, create, update, delete
│ ├── event-types/ # list
│ ├── slots/ # list
│ └── bookings/ # list, get
└── mcp/
└── server.ts # Register every CommandDefinition as an MCP toolEach CommandDefinition carries:
name — MCP tool name (e.g.
booking_pages_update)group / subcommand — CLI routing (e.g.
carly booking-pages update)inputSchema — Zod schema shared by CLI validation and MCP input schema
endpoint — HTTP method + path template (e.g.
PATCH /booking-pages/{eventTypeId})fieldMappings — per-field routing to
path,query, orbodydefaultColumns — optional; columns used by
--output tablehandler — executes via
CarlyClient
Development
git clone https://github.com/usecarly/carly-cli.git
cd carly-cli
npm install
# Hot reload via tsx (no build step)
npm run dev -- profile whoami --pretty
npm run dev -- bookings list --output table
# Typecheck only
npm run typecheck
# Production build
npm run build # → dist/index.js + dist/mcp.js
npm link # expose `carly` on PATHTo add a command:
Author a
CommandDefinitioninsrc/commands/<group>/index.tsExport it from the group's
*CommandsarrayInclude the group in
src/commands/index.ts→allCommandsnpm run build && carly <group> <subcommand> --help
Both the CLI and the MCP server pick it up automatically.
License
MIT
Available Tools
13 toolsbooking_pages_createC
Create a new booking page. Requires the booking_pages:write scope. Accepts nested fields (--availability, --custom-questions, --duration-options) as JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| slug | No | ||
| description | No | ||
| duration | No | ||
| location | No | ||
| videoProvider | No | ||
| calendarKey | No | ||
| timezone | No | ||
| username | No | ||
| displayName | No | ||
| eventNameTemplate | No | ||
| minNoticeMinutes | No | ||
| maxDaysAhead | No | ||
| beforeEventBuffer | No | ||
| afterEventBuffer | No | ||
| slotInterval | No | ||
| availability | No | ||
| customQuestions | No | ||
| durationOptions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses required scope and notes nested fields as JSON, but no annotations exist to compensate. Lacks details on side effects, duplicate handling, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Efficient two sentences with clear purpose and scope. Could be improved by listing key parameters, but remains concise and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 19 parameters, no output schema, and no annotations, the description is severely inadequate. An agent would lack essential context to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, description adds almost no parameter meaning. Only mentions nested fields broadly; 19 parameters are left unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Create a new booking page' with a specific verb and resource. Differentiates from sibling tools (delete, get, list, update) by focusing on creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides scope requirement but no guidance on when to use this tool vs alternatives (e.g., update vs create). No mention of prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
booking_pages_deleteA
Deactivate (pause) a booking page by its event type ID. The server soft-deletes: the page is hidden from public booking (is_active=false) but the row is retained and the page can be re-activated via update <id> --is-active true. Requires the booking_pages:write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| eventTypeId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavioral traits: soft-delete (row retained, is_active=false), public hiding, and re-activability. It also notes the required OAuth scope, covering safety and side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The first sentence immediately states the action, followed by key behavioral details and a scope requirement. Efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description provides complete context: what it does, how it works (soft-delete), how to reverse (update), and required permissions. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description references 'by its event type ID', connecting the single parameter to the resource. It adds essential meaning beyond the schema (which only defines type and constraints), though more detail on the parameter format is absent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Deactivate (pause) a booking page' and identifies the resource via event type ID. It distinguishes itself from siblings like booking_pages_create and booking_pages_update by explaining the soft-delete behavior and re-activation path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description specifies the required scope ('booking_pages:write') and mentions that re-activation is done via the update tool. It implicitly tells when to use this tool (to pause a page), but does not explicitly state alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
booking_pages_getA
Get a single booking page by its event type ID
| Name | Required | Description | Default |
|---|---|---|---|
| eventTypeId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears the full burden. It only states the basic operation but omits any behavioral traits such as authentication requirements, rate limits, idempotency, or error handling (e.g., what happens if the ID does not exist).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundant words. It efficiently conveys the tool's purpose and key parameter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema, no annotations), the description covers the essential function. It is complete enough for an agent to understand when to invoke this tool, though it lacks details on return value or error behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description adds meaning by specifying that the 'eventTypeId' parameter identifies the booking page. This provides context beyond the schema's type definition, though it does not elaborate on what an event type ID represents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'a single booking page', and identifies the key parameter 'event type ID'. This distinguishes it from sibling tools like booking_pages_list (multiple pages) and booking_pages_create/update/delete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (when you need a single page by ID) but provides no explicit guidance on when not to use it, alternatives, or prerequisites. The existence of booking_pages_list suggests a sibling for listing all pages, but no direct comparison is made.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
booking_pages_listA
List the authenticated user's booking pages (event types with public links)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It accurately portrays a read-only list operation with no mention of side effects. However, it omits potential details like pagination or rate limits, but for a simple list, it is sufficiently transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with 12 words, no unnecessary information. Perfectly concise and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters, no output schema, and no annotations, the description is complete for a straightforward list tool. It covers the operation and clarifies the resource.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so the baseline is 4. The description adds meaning by clarifying that booking pages are event types with public links, which goes beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'booking pages,' adding context that these are event types with public links for the authenticated user. It distinguishes from siblings like booking_pages_get (single page) and booking_pages_create.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives like booking_pages_get for a single page or booking_pages_create. The description only states what it does without exclusions or context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
booking_pages_updateA
Update an existing booking page by its event type ID. Requires the booking_pages:write scope. Only fields you pass are updated. Nested fields (--availability, --custom-questions, --duration-options) accept JSON and replace the previous value.
| Name | Required | Description | Default |
|---|---|---|---|
| eventTypeId | Yes | ||
| title | No | ||
| isActive | No | ||
| slug | No | ||
| description | No | ||
| duration | No | ||
| location | No | ||
| videoProvider | No | ||
| calendarKey | No | ||
| timezone | No | ||
| username | No | ||
| displayName | No | ||
| eventNameTemplate | No | ||
| minNoticeMinutes | No | ||
| maxDaysAhead | No | ||
| beforeEventBuffer | No | ||
| afterEventBuffer | No | ||
| slotInterval | No | ||
| availability | No | ||
| customQuestions | No | ||
| durationOptions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully convey behavior. It discloses the write scope, partial update behavior, and nested field replacement ('Nested fields... accept JSON and replace the previous value'). However, it lacks details on success responses, error handling, or rate limits, which are important for a mutation tool with 21 parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each serving a purpose: purpose, scope, and update semantics. No redundant information, and the most critical fact (update by ID) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 21 parameters, no output schema, and no annotations, the description is too sparse. It does not explain return values, failure modes, or constraints like field optionality beyond the schema. The nested field explanation is helpful but does not compensate for the lack of broader context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for 21 parameters. The description only adds meaning for nested fields ('availability, --custom-questions, --duration-options') noting they replace previous values. This is insufficient for the vast majority of parameters, leaving agents to infer their purpose from names alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Update an existing booking page by its event type ID.' This specifies a distinct verb and resource, differentiating it from siblings like 'booking_pages_create' (create) and 'booking_pages_get' (read).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates when to use (update by event type ID) and notes partial updates: 'Only fields you pass are updated.' It also mentions required scope. However, it does not explicitly exclude scenarios or reference alternatives, but the context is sufficient for most use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookings_getA
Get a single booking by its UID
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only states it 'gets' a booking, implying a read operation, but does not mention side effects, permissions, rate limits, or data shape. Minimal disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence of six words with no extraneous information. It is front-loaded with the verb and resource, achieving maximum conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get-by-ID tool with one parameter and no output schema, the description is minimally adequate. However, it lacks information about the return format or what fields the booking includes, which would help an agent understand the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage for the 'uid' parameter. The description clarifies that uid is the booking's identifier, which adds some meaning, but does not specify format, type constraints, or any additional details beyond the schema's minLength constraint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get a single booking by its UID' clearly states the action (get), the resource (booking), and the unique identifier (UID). It distinguishes from the sibling tool 'bookings_list' which likely retrieves multiple bookings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool should be used to fetch a specific booking by UID, but does not explicitly contrast with 'bookings_list' or provide guidance on when not to use it. Usage context is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookings_listB
List the authenticated user's bookings. Supports filters for status, event type, and time range.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | ||
| eventTypeId | No | ||
| limit | No | ||
| startTime | No | ||
| endTime | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description does not disclose important traits like pagination, rate limits, authentication, or ordering. Only mentions filter support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence that is front-loaded with the core action and concise, no extraneous text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Missing important context for a list tool: no mention of pagination, default limits, response structure, or ordering. With 5 parameters and no output schema, the description should provide more operational detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions are absent (0% coverage). Description names three filter categories (status, event type, time range) that map to four parameters, but fails to mention the 'limit' parameter or provide format details for time strings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it lists the authenticated user's bookings, with filter support. Distinguishes from sibling tools like bookings_get and event_types_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage for listing bookings, but no explicit guidance on when to use versus alternatives like bookings_get or booking_pages_list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendars_listA
List connected calendars for the authenticated user. The selected field mirrors the "Check for conflicts on" state in the web UI — calendars with selected: true count against booking-page availability.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains the `selected` field's significance and its effect on booking-page availability, providing behavioral context beyond the empty schema. However, it does not explicitly state read-only nature or authentication requirements, but these are implied by the operation type.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with no wasted words, front-loading the primary action and adding valuable detail in the second sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core functionality and the important `selected` field. It could mention whether pagination applies or list other common fields, but for a simple list tool with no output schema, it is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters and 100% schema coverage, the description adds meaningful context about what the tool returns and how the `selected` field works, which is necessary since there is no output schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List connected calendars for the authenticated user' with a specific verb and resource. It also adds context about the `selected` field, distinguishing it from sibling tools that modify calendar selection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus sibling tools like calendars_select or calendars_unselect. The description implies it is for viewing, but does not state alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendars_selectA
Mark a calendar as counting against booking-page availability ("Check for conflicts on"). Requires the booking_pages:write scope. The flag is account-wide — every booking page on this calendar's integration will honor it on the next availability check.
| Name | Required | Description | Default |
|---|---|---|---|
| calendar_key | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses that the tool is a mutation (marking a calendar), requires a specific scope, and has an account-wide effect that persists across booking pages. It does not mention whether the action is reversible or the exact timing of effect, but the included details are valuable beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long and front-loaded with the primary purpose. Every sentence adds value: the first defines the action, the second provides scope and behavioral context. No redundant or verbose content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (1 parameter, no output schema), the description covers the core behavior, required scope, and account-wide effect. It is missing information on return values or error handling, but these are minor gaps for a straightforward selection tool. Sibling 'calendars_list' can supply the calendar_key.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 1 parameter (calendar_key) with 0% description coverage. The description does not explicitly define the parameter, only implying it refers to a calendar within an integration. While the parameter name is somewhat self-explanatory, the description does not add meaningful guidance on its format, source, or constraints beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: 'Mark a calendar as counting against booking-page availability', which is a specific verb-resource combination. It also provides the colloquial name 'Check for conflicts on' and implicitly distinguishes it from the sibling tool 'calendars_unselect' which likely reverses this action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly mentions the required OAuth scope ('booking_pages:write'), providing a clear usage prerequisite. It also notes the account-wide effect, which helps set context. However, it does not explicitly state when to use this tool vs alternatives (e.g., calendars_unselect) or provide scenarios where it should not be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendars_unselectA
Stop counting a calendar against booking-page availability. Requires the booking_pages:write scope. Inverse of carly calendars select.
| Name | Required | Description | Default |
|---|---|---|---|
| calendar_key | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that the tool modifies state (stops counting), requires a specific scope, and is the counterpart to a select operation. This gives the agent a reasonable understanding of the behavior, though it could mention that it is not a destructive irreversible action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with three short sentences. Every sentence adds essential information: the action, the required scope, and the relationship to the sibling tool. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema, no annotations), the description covers the core purpose, preconditions, and relationship. It could be slightly more complete by briefly noting the effect on existing bookings or the expected output, but overall it is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description should add meaning to the parameter 'calendar_key', but it does not. The parameter is only defined as a required string with minLength 1. The description does not clarify what value to provide (e.g., calendar ID or name), leaving the agent to infer from the tool name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Stop counting a calendar against booking-page availability.' It uses a specific verb ('stop counting') and identifies the resource ('calendar'). It also distinguishes itself from the sibling tool 'calendars_select' by naming it as the inverse.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly mentions the required scope ('booking_pages:write') and notes that this tool is the inverse of 'carly calendars select', providing clear context. However, it does not explicitly state when not to use this tool or list alternatives beyond the inverse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
event_types_listA
List event types. Without --username, returns the authenticated caller's own event types. With --username, returns that public profile's active event types.
| Name | Required | Description | Default |
|---|---|---|---|
| username | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses two modes of operation (own vs public) but does not mention authorization requirements, side effects, or rate limits. Adequate but with gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with main action, no wasted words. Efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter and no output schema, description covers both modes. Missing output format details, but largely complete for its complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has zero description coverage, but description explains the sole parameter --username and its effect on results. Adds significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'List event types' and distinguishes behavior based on the username parameter, specifying ownership vs public profile. It is a specific verb+resource with clear scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit context for two usage scenarios (with and without --username), but does not mention when not to use or alternatives. Clear context but no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slots_listB
List available booking slots in a time range. Provide either --event-type-id, or both --username and --event-type-slug.
| Name | Required | Description | Default |
|---|---|---|---|
| eventTypeId | No | ||
| username | No | ||
| eventTypeSlug | No | ||
| startTime | Yes | ||
| endTime | Yes | ||
| duration | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description must fully disclose behavior. It lists the operation as read-only (listing) but does not mention what happens if both identification methods are provided, timezone handling, pagination, or any side effects. Minimal disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loading the core action. No unnecessary words. However, it could be slightly expanded to include missing details without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, no output schema, and no annotations, the description is incomplete. It omits return value format, parameter formats, and handling of edge cases (e.g., no available slots). Does not fully equip an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It clarifies the mutual exclusivity between eventTypeId and (username+eventTypeSlug), which is not in the schema. However, it does not explain the format of startTime/endTime, the role of duration, or other constraints. Partial addition of meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('available booking slots') and clearly states the scope ('in a time range'). It also specifies the identification parameters, distinguishing it from sibling tools like bookings_list or event_types_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions the required identification parameters but does not provide guidance on when to use this tool versus alternatives (e.g., when to use slot search vs. booking list). No when-not or comparison to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoamiA
Show the user the API key belongs to
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It implies a read-only operation with no side effects, but does not explicitly mention that it does not modify data or detail any return format. Adequate for a simple tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with the key action and object. No wasted words; every part adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, no output schema), the description is sufficient. Could optionally mention the return value (e.g., user info), but not required for correctness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, and the schema coverage is 100%. The description adds no parameter details because none are needed. Baseline of 4 for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool shows the user associated with the API key. The verb 'show' and resource 'user' are specific, and among siblings (bookings, calendars, etc.), it uniquely stands out as an identity tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or alternatives are provided, but the tool's purpose is self-evident and no sibling tool performs a similar function. The context implicitly suggests it is for verifying the API key owner.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
13 tool updates
v1.0.0- First observed
booking_pages_create - First observed
booking_pages_delete - First observed
booking_pages_get - First observed
booking_pages_list - First observed
booking_pages_update - First observed
bookings_get - First observed
bookings_list - First observed
calendars_list - First observed
calendars_select - First observed
calendars_unselect - First observed
event_types_list - First observed
slots_list - First observed
whoami
TDQS
Each tool targets a distinct resource and action: booking pages have separate CRUD tools, bookings have get/list, calendars have list/select/unselect, plus event_types_list, slots_list, and whoami. No two tools overlap in purpose.
All tool names follow a consistent pattern of `resource_action` in lowercase with underscores (e.g., booking_pages_create, calendars_select). No mixing of conventions or verb styles.
13 tools is well-scoped for a booking management CLI. It covers all necessary operations without being too few or excessive, providing a focused and manageable surface.
The tool set provides full CRUD for booking pages, listing bookings, calendar management, event types, slots, and user info. No obvious gaps for the intended domain of managing bookings and availability.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Hosted Google Calendar MCP server for AI agents. No self-hosting or Google Cloud setup.
MCP server exposing the Backtest360 engine API as tools for AI agents.
Hosted MCP server for Cliniko — patients, appointments, availability, and invoices for AI agents.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server that connects AI agents to calendars, bookings, and scheduling polls via the Model Context Protocol.2217MIT
- FlicenseBqualityDmaintenanceMCP server for Cal.com scheduling, providing ~70 tools to manage schedules, event types, bookings, calendars, webhooks, and teams. Enables natural language control of Cal.com from Claude or any MCP-compatible client.68-
- AlicenseAqualityDmaintenanceMCP server for the Cal.com API v2, providing 24 tools for managing bookings, event types, availability slots, schedules, calendars, user profile, and out-of-office entries.24121MIT
- FlicenseNot gradedqualityDmaintenanceExposes Cal.com scheduling tools to AI agents via MCP, enabling listing event types, checking availability, and managing bookings (create, cancel, reschedule).-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/UseCarly/carly-cli'
If you have feedback or need assistance with the MCP directory API, please join our Discord server