No first-party MCP
as of July 2026; the API is the sanctioned route in
~15 min
setup, API key auth, no OAuth dance
3 read scopes
reservations, housekeeping, guests; nothing writable
Hand it to Claude Code

The short answer

Does Cloudbeds have an MCP server? Not a first-party one as of July 2026. Cloudbeds has gone deep on AI inside its own platform, announcing Ask Signals, a conversational interface over its unified hotel data, in May 2026, and its developer portal even publishes an llms.txt index so AI agents can read the docs. But there is no official Cloudbeds MCP server, only third-party wrappers on MCP directories.

The good news: you don't need one. Cloudbeds has a documented REST API (v1.3) with self-serve API keys, and a small read-only MCP server you run on your own machine takes about fifteen minutes to stand up. Once connected, Claude can read your reservations, housekeeping room status, and guest list and answer questions about them in plain English. This guide has the full working code.

What you can ask once it's connected

"How many arrivals do we have tomorrow, and how many of the rooms they're going into are still marked dirty?"
"List every occupied room marked dirty right now, with the assigned housekeeper."
"Which guests checking in this weekend have stayed with us before?"
"How many bookings did we take in the last 7 days, by status?"
"Pull this month's no-shows and cancellations into a table."

What the API exposes: three scopes, three tools

Cloudbeds API keys are scoped: when you create the key you pick exactly which permissions it carries, and this guide only ever needs three read scopes. Each maps to one tool in the server below.

read:reservation
GET /getReservations · reservations filtered by status (confirmed, checked_in, checked_out, canceled, no_show, not_confirmed), check-in/check-out date ranges, or booking date. Arrivals, departures, pace, and pickup all come from here.
read:housekeeping
GET /getHousekeepingStatus · every room's condition (clean or dirty), occupancy, front desk status (check-in, check-out, stayover, turnover, unused), assigned housekeeper, and comments. The live room board, as data.
read:guest
GET /getGuestList · guest records searchable by name, email, phone, and stay dates. Repeat-guest questions and arrival prep live here.

Before you start

Three things: a Cloudbeds account with access to the API Credentials page (found under Apps & Marketplace), Node.js 18 or newer (check with node --version), and either Claude Desktop or Claude Code.

1

Create a Cloudbeds API key

According to Cloudbeds' developer documentation, API keys are the primary authentication method (OAuth 2.0 exists as an alternative), and a property-level user can create one self-serve:

  1. Log in to Cloudbeds and open Account → Apps & Marketplace (upper right corner).
  2. Go to the API Credentials page from the top menu and click + New Credentials.
  3. Name the application, pick a category, and enter https://localhost as the Redirect URI (it isn't used for API-key access). Tick "Enable for entire organization" if you manage multiple properties.
  4. Back in the API Credentials table, click Create in the API Key column and select the scopes: read:reservation, read:housekeeping, read:guest.
Copy the key immediately. Cloudbeds shows the API key only once, and it can't be viewed again after the dialog closes. Keys don't expire as long as they're used at least once every 30 days.
2

Scaffold the project

Two dependencies: the official MCP SDK and zod (used to describe each tool's inputs). No build step.

terminal
mkdir cloudbeds-mcp && cd cloudbeds-mcp
npm init -y
npm pkg set type="module"
npm install @modelcontextprotocol/sdk zod
3

Write the server

Save this as index.js. Because Cloudbeds uses long-lived API keys, there's no token exchange or caching to manage; every request just sends the x-api-key header. Three read-only tools, one per scope.

index.js
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

const API_BASE = "https://api.cloudbeds.com/api/v1.3";
const API_KEY = process.env.CLOUDBEDS_API_KEY;

if (!API_KEY) {
  console.error("Set CLOUDBEDS_API_KEY first.");
  process.exit(1);
}

// Cloudbeds API keys are long-lived (no expiry while used monthly),
// so auth is a single header on every request. No token dance.
async function get(path, params = {}) {
  const url = new URL(`${API_BASE}${path}`);
  for (const [k, v] of Object.entries(params)) {
    if (v !== undefined && v !== null && v !== "") url.searchParams.set(k, String(v));
  }
  const res = await fetch(url, {
    headers: { "x-api-key": API_KEY, Accept: "application/json" },
  });
  if (!res.ok) throw new Error(`Cloudbeds ${res.status}: ${await res.text()}`);
  return res.json();
}

function json(data) {
  return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
}

const server = new McpServer({ name: "cloudbeds", version: "1.0.0" });

server.registerTool(
  "get_reservations",
  {
    description: "List reservations. Filter by status and/or check-in date range. Statuses: not_confirmed, confirmed, canceled, checked_in, checked_out, no_show.",
    inputSchema: {
      propertyID: z.string().optional().describe("Property ID(s), comma-separated, for multi-property accounts"),
      status: z.string().optional().describe("Reservation status filter"),
      checkInFrom: z.string().optional().describe("Earliest check-in, YYYY-MM-DD"),
      checkInTo: z.string().optional().describe("Latest check-in, YYYY-MM-DD"),
      resultsFrom: z.string().optional().describe("Earliest booking date, YYYY-MM-DD (for pickup/pace questions)"),
      pageNumber: z.number().optional().describe("Page, default 1"),
    },
  },
  async (args) => json(await get("/getReservations", args))
);

server.registerTool(
  "get_housekeeping_status",
  {
    description: "Get every room's live housekeeping state: condition (clean/dirty), occupancy, front desk status (check-in, check-out, stayover, turnover, unused), assigned housekeeper, and comments.",
    inputSchema: {
      propertyID: z.string().optional().describe("Property ID"),
      roomCondition: z.enum(["clean", "dirty"]).optional().describe("Filter by condition"),
      roomOccupied: z.boolean().optional().describe("Filter by occupancy"),
    },
  },
  async (args) => json(await get("/getHousekeepingStatus", args))
);

server.registerTool(
  "get_guest_list",
  {
    description: "Search guest records by name, email, or stay dates. Good for repeat-guest and arrival-prep questions.",
    inputSchema: {
      propertyIDs: z.string().optional().describe("Property ID(s), comma-separated"),
      guestLastName: z.string().optional().describe("Filter by last name"),
      guestEmail: z.string().optional().describe("Filter by email"),
      checkInFrom: z.string().optional().describe("Earliest check-in, YYYY-MM-DD"),
      checkInTo: z.string().optional().describe("Latest check-in, YYYY-MM-DD"),
      includeGuestInfo: z.boolean().optional().describe("Include extended guest details"),
      pageSize: z.number().optional().describe("Rows per page, max 100"),
    },
  },
  async (args) => json(await get("/getGuestList", args))
);

const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Cloudbeds MCP server running on stdio");
Multi-property accounts: if your key was created with "Enable for entire organization," pass propertyID to scope each question, or leave it off and let Claude compare across properties. getHousekeepingStatus pages at 100 rooms by default (up to 5,000), so even large portfolios come back in one call.
4

Connect it to Claude

Claude Desktop: edit ~/Library/Application Support/Claude/claude_desktop_config.json on macOS (or %AppData%\Claude\claude_desktop_config.json on Windows), then fully quit and reopen Claude.

claude_desktop_config.json
{
  "mcpServers": {
    "cloudbeds": {
      "command": "node",
      "args": ["/ABSOLUTE/PATH/TO/cloudbeds-mcp/index.js"],
      "env": { "CLOUDBEDS_API_KEY": "cbat_your-key-here" }
    }
  }
}

Claude Code:

terminal
claude mcp add \
  --env CLOUDBEDS_API_KEY=cbat_your-key-here \
  --transport stdio cloudbeds \
  -- node /ABSOLUTE/PATH/TO/cloudbeds-mcp/index.js

Confirm with claude mcp list. Add --scope user to make it available in every project.

5

Try it

try these
Who checks in tomorrow, and are any of their rooms still dirty? Cross-reference.

Show the current room board: condition, occupancy, and front desk status per room.

How many confirmed bookings did we take in the last 7 days vs the 7 before?

Prefer to skip the typing?

Paste this into Claude Code (or any coding agent) and it will build, install, and wire up the server for you. Then come back to step 1 for your API key.

prompt for Claude Code
Build a local MCP server (Node.js, ESM, @modelcontextprotocol/sdk and zod)
that wraps the Cloudbeds API (base https://api.cloudbeds.com/api/v1.3).
Read CLOUDBEDS_API_KEY from the environment and send it as the x-api-key
header on every request (no OAuth needed; keys are long-lived). Docs index
for AI agents: https://developers.cloudbeds.com/llms.txt. Register three
read-only tools built with URLSearchParams:
get_reservations(propertyID?, status?, checkInFrom?, checkInTo?,
resultsFrom?, pageNumber?) -> /getReservations;
get_housekeeping_status(propertyID?, roomCondition?, roomOccupied?) ->
/getHousekeepingStatus; get_guest_list(propertyIDs?, guestLastName?,
guestEmail?, checkInFrom?, checkInTo?, includeGuestInfo?, pageSize?) ->
/getGuestList. Use StdioServerTransport; log startup to stderr. Then make
a package.json (type: module), install the deps, and show me the
claude mcp add command, the claude_desktop_config.json block, and three
prompts to try.

Troubleshooting

401 Unauthorized or "invalid API key"

Check the header is exactly x-api-key (Cloudbeds also accepts Authorization: Bearer cbat_...). If the key was pasted with whitespace, trim it. If you lost the key, you'll need to create a new one; Cloudbeds only shows it once.

Also note keys expire if unused for 30 days. If the integration sat idle for a month, mint a fresh key.

403 on a specific endpoint

The key is valid but missing a scope. Each tool needs its scope granted at key creation: read:reservation for reservations, read:housekeeping for the room board, read:guest for the guest list. Create a new key with all three ticked.

Claude says it doesn't see any Cloudbeds tools

Claude Desktop only reads its config at startup. Fully quit (Cmd+Q on macOS, right-click tray icon then Quit on Windows) and reopen. Closing the window is not enough.

Still broken? Check Help → Open Logs Folder. Common causes: invalid JSON in the config, wrong absolute path to index.js, or node not on your PATH.

Empty results on a multi-property account

If the key wasn't created with "Enable for entire organization," it's bound to one property. Either recreate it org-wide or pass the right propertyID explicitly in your question ("...for property 12345").

I want to add write operations

The guide ships read-only on purpose: the scopes you granted can't write, so Claude can't change a rate or move a reservation even if asked. To add writes, create a key with the matching write scopes, add a POST helper, and register write tools deliberately. Confirm each endpoint's fields in the Cloudbeds API reference first, and keep the write server separate from the read one.

clean dirty inspected

What Cloudbeds tracks: status

Cloudbeds housekeeping is deliberately status-based: rooms move between clean, dirty, and inspected, with front desk status and housekeeper assignment alongside. That's what the API returns, and it's exactly the right layer for a PMS to own. What it doesn't carry is visual evidence; the module and API have no photo or video capture, which Cloudbeds leaves to integrations built on its platform.

RapidEye

What sits on top: proof

That's the layer RapidEye adds. Housekeepers photograph the room as part of the clean, and AI reads every image, flagging damage, missed cleaning, and staging errors before the room is marked ready. "Inspected" becomes a verdict backed by evidence instead of a tap on a screen. It's the same photo-verified readiness we run on vacation rental turnovers, applied to hotel rooms.

FAQ

Does Cloudbeds have an MCP server?

Not a first-party one as of July 2026. Cloudbeds' AI investment has gone into its own platform: the Signals data architecture and the Ask Signals conversational interface (announced May 21, 2026, in early pilot). Its developer portal does publish an llms.txt docs index for AI agents, and third-party MCP wrappers exist on MCP directories, but there's no official Cloudbeds MCP server. Building your own, as here, keeps the tool surface under your control.

Can you connect Cloudbeds to Claude?

Yes. The Cloudbeds API v1.3 is documented at developers.cloudbeds.com, authenticates with a self-serve API key, and covers reservations, housekeeping status, guests, payments, and more. A small local MCP server (this guide) exposes it to Claude in about fifteen minutes.

How is this different from Ask Signals?

Ask Signals is Cloudbeds' conversational AI inside Cloudbeds, built on its unified Signals data. Connecting to Claude puts Cloudbeds data next to everything else Claude can reach: your files, other MCP servers (a PriceLabs connection, say), and general reasoning. They're complementary, not competing.

Can Claude see room photos through this?

No. Cloudbeds housekeeping tracks room conditions (clean, dirty, inspected) and front desk status; neither the module nor the API carries photos or video. If you want Claude-adjacent AI looking at actual room images, that's an inspection layer like RapidEye on top of the PMS, or the RapidEye API if you're building your own stack.

Can I do this with Guesty, Hostaway, or OwnerRez too?

Yes. The structure is identical for any PMS with a public REST API; only the auth step changes (Cloudbeds is actually the easiest, since it's a plain API key). See all of them at Claude Guides, including Guesty, Hostaway, and OwnerRez.

Keep going

Sources

Independent integration guide. RapidEye is not affiliated with or endorsed by Cloudbeds or Anthropic. API behavior and dashboard menus can change; confirm specifics against the official docs above. Last reviewed July 18, 2026.