Skip to main content
Glama
UseCarly

carly-cli

Official
by UseCarly

carly-cli

License: MIT

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-ai

Or 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 PATH

Related 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 table

Connect 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

--api-key flag

carly --api-key carly_live_xxxx profile whoami

2

CARLY_API_KEY env var

export CARLY_API_KEY=carly_live_xxxx

3

Config file

carly login writes ~/.carly-cli/config.json (mode 0600)

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

Claude 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 validity

Calendars

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:

  • --availability days are numbered Sunday=0, Monday=1, …, Saturday=6. Times are HH:MM in the page's timezone.

  • --date-overrides are 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.

  • --availability and --date-overrides are independent — updating one leaves the other intact. Pass --date-overrides '[]' to clear every override without touching the weekly hours.

  • --custom-questions type is one of text, textarea, number, phone, email, select, checkbox, radio, boolean. options is only required for select/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 it

Event types

carly event-types list                          # Caller's own event types
carly event-types list --username <username>    # Public active event types for a profile

Slots

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

--output json (default)

Single-line JSON to stdout

--output pretty

Pretty-printed JSON

--pretty

Shortcut for --output pretty

--output table

Fixed-width table; columns come from the command's defaultColumns (or scalar keys of the first row)

--fields <a,b,c>

Narrow JSON keys; override table columns

--quiet

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 --pretty

Scopes

Scope

Needed for

booking_pages:read

calendars list, booking-pages list/get, event-types list (own), slots list (own event type)

booking_pages:write

booking-pages create/update/delete

bookings:read

bookings list, bookings get

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 tool

Each 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, or body

  • defaultColumns — optional; columns used by --output table

  • handler — 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 PATH

To add a command:

  1. Author a CommandDefinition in src/commands/<group>/index.ts

  2. Export it from the group's *Commands array

  3. Include the group in src/commands/index.tsallCommands

  4. npm run build && carly <group> <subcommand> --help

Both the CLI and the MCP server pick it up automatically.

License

MIT

Available Tools

13 tools
booking_pages_createC

Create a new booking page. Requires the booking_pages:write scope. Accepts nested fields (--availability, --custom-questions, --duration-options) as JSON.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
slugNo
descriptionNo
durationNo
locationNo
videoProviderNo
calendarKeyNo
timezoneNo
usernameNo
displayNameNo
eventNameTemplateNo
minNoticeMinutesNo
maxDaysAheadNo
beforeEventBufferNo
afterEventBufferNo
slotIntervalNo
availabilityNo
customQuestionsNo
durationOptionsNo

TDQS

C2.7/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness1/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
eventTypeIdYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
eventTypeIdYes

TDQS

A3.6/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
eventTypeIdYes
titleNo
isActiveNo
slugNo
descriptionNo
durationNo
locationNo
videoProviderNo
calendarKeyNo
timezoneNo
usernameNo
displayNameNo
eventNameTemplateNo
minNoticeMinutesNo
maxDaysAheadNo
beforeEventBufferNo
afterEventBufferNo
slotIntervalNo
availabilityNo
customQuestionsNo
durationOptionsNo

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNo
eventTypeIdNo
limitNo
startTimeNo
endTimeNo

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
calendar_keyYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
calendar_keyYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameNo

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
eventTypeIdNo
usernameNo
eventTypeSlugNo
startTimeYes
endTimeYes
durationNo

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 13 tool updatesv1.0.0
    • First observedbooking_pages_create
    • First observedbooking_pages_delete
    • First observedbooking_pages_get
    • First observedbooking_pages_list
    • First observedbooking_pages_update
    • First observedbookings_get
    • First observedbookings_list
    • First observedcalendars_list
    • First observedcalendars_select
    • First observedcalendars_unselect
    • First observedevent_types_list
    • First observedslots_list
    • First observedwhoami

TDQS

A3.9/5.0
Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityActive
ResponsivenessSyncing

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

Related MCP Servers

Latest Blog Posts

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