Introducing Carly CLI: Run Your Scheduling Assistant From the Terminal (and From Claude)

Introducing Carly CLI: Run Your Scheduling Assistant From the Terminal (and From Claude)

Carly already lives in your inbox and your dashboard. Today she also lives in your terminal — and inside any AI agent that speaks MCP.

npm install -g carly-ai
carly login
carly bookings list --output table

That’s the whole onboarding. Three commands and your calendar, your booking pages, and every confirmed meeting are queryable from the shell. And because the same package ships an MCP server (carly mcp), every command is also a tool that Claude Code, Claude Desktop, Cursor, or any MCP client can call directly — with no wrapper code.

One Definition, Two Surfaces

Most “CLI + AI integration” stories end with a wrapper that drifts out of sync the moment a real engineer touches it. Carly CLI is built differently. Each command is a single CommandDefinition — name, Zod schema, HTTP endpoint, output columns — and both the CLI parser and the MCP server register from the same registry. Add a flag to carly booking-pages update and Claude sees the new parameter on its next launch. No drift. No second codebase.

That gives you 11 tools across 5 resource groups (booking pages, event types, calendars, slots, bookings), and they behave identically whether a human types them or an agent calls them.

What It Looks Like in Practice

Open Claude Code, point it at Carly via claude mcp add carly -- carly mcp, and the conversation gets very direct.

You: Make me a 15-minute design consult page with Google Meet.

Claude (calls booking_pages_create): Done. The page is live at usecarly.com/your-username/design-consult. Bookers get a Google Meet link the moment they confirm.

Or:

You: Only let people book Mon–Thu between 10 and 4.

Claude (calls booking_pages_update): Updated. Bookers will only see slots Monday through Thursday, 10–4. Fridays are off-limits now.

Or, the one nobody wants to do by hand at 8pm on a Sunday:

You: Before anyone books my intro, ask them for their company and what they want to discuss.

Claude (calls booking_pages_update with custom questions): Done. Bookers now have to fill in company name + agenda before the slot is confirmed.

You can do all of this from the shell too — but the point is that you don’t have to. The same commands work whichever interface fits the moment.

Pure Shell Workflows

For the “I prefer the keyboard” crowd, Carly CLI plays nicely with the rest of your toolchain. Every data-returning command supports --output json, --output pretty, or --output table, plus --fields to narrow columns and --quiet to suppress output entirely.

# What's on my calendar this week, terminal-friendly
carly bookings list --output table --fields uid,status,start_time

# Pipe it into jq for a quick stat
carly bookings list --status accepted | jq 'length'

# Pause every active booking page (focus week)
for id in $(carly booking-pages list --fields id --output json | jq '.items[].id'); do
  carly booking-pages update $id --is-active false
done

The output formatter automatically flattens Carly’s {items: [...]} envelope and the {slots: {date: [...]}} map, so you don’t have to fight the response shape.

Setup in Under a Minute

Brand-new user? The CLI handles the OAuth dance for you:

carly signup                      # opens Google OAuth in your browser
                                  # add --with microsoft for Outlook
carly login                       # paste the API key minted at /booking-pages

Already on Carly?

carly login
carly profile whoami --pretty     # confirm the key resolves

API keys are scoped server-side (booking_pages:read, booking_pages:write, bookings:read) and stored at ~/.carly-cli/config.json with mode 0600. You can also override per-call with --api-key or globally with CARLY_API_KEY for CI workflows.

Wiring It Into Claude Code

claude mcp add carly -- carly mcp

That’s it. Claude now has every Carly tool available the next time you start a session — no JSON config, no token shuffle.

For Claude Desktop or Cursor, drop the standard MCP block into your config:

{
  "mcpServers": {
    "carly": {
      "command": "carly",
      "args": ["mcp"],
      "env": { "CARLY_API_KEY": "carly_live_xxxx" }
    }
  }
}

Now ask the agent to “find me 30 minutes free next week for an intro,” “make my 30-minute intro 45 minutes,” or “who am I meeting with tomorrow?” — and it answers by hitting Carly’s actual API, not by guessing from your calendar provider.

What’s Read vs. What’s Write

The CLI exposes everything you’d expect for managing your scheduling layer: list / get / create / update / delete on booking pages, list event types, query slots (your own or a public profile’s), and read bookings. What it deliberately does not expose is bookings:write — creating, cancelling, and rescheduling bookings is intentionally kept inside the dashboard for now. Agents can read your meeting state and reshape your booking pages all day; they can’t silently move a customer’s confirmed time slot.

That asymmetry isn’t a limitation we forgot to fix. It’s the safety boundary we drew on purpose, and it’s the same boundary on both the human CLI and the MCP surface.

Where to Go Next

Install it: npm install -g carly-ai. Mint a key from your dashboard’s Booking Pages page (expand the “Generate API key” section under Use Carly from your terminal or AI agent), run carly login, and you’re in.

Source and full command reference live on GitHub. If you build something interesting on top — a CI bot that pauses your booking pages during a release, an agent that auto-tunes availability based on focus blocks, a Slack /availability command — we want to see it.

Ready to automate your busywork?

Carly schedules, researches, and briefs you—so you can focus on what matters.

Get Carly Today →

Or try our Free Group Scheduling Tool or Free Booking Page