To connect CiiRUS to Claude, you wrap the CiiRUS-API, the platform's REST API covering units, reservations, calendars, rates, quotes, and reviews, in a small MCP server that runs on your own machine and shows up in Claude as a set of read-only tools. CiiRUS does not publish an MCP server of its own as of July 2026, so this guide builds one.

The catch is access. CiiRUS-API credentials are issued by the CiiRUS team through a registration process, not generated self-serve in your dashboard, and the API only accepts requests from whitelisted IP addresses. This guide covers the credentialed path in full and gives you an honest no-API workaround if that process isn't worth it for your use case.

The access reality, before you invest an afternoon

Most guides in this series start with "go to Settings and copy your API key." CiiRUS doesn't work that way, and pretending otherwise would waste your time. Two facts shape everything below, both from CiiRUS's own partner documentation.

What the docs say
  • Credentials come from CiiRUS. An APIUsername and APIPassword arrive by email after completing what the docs call the Steps to Success: a request for information, a mutual NDA, and a commercial conversation with their business development team.
  • IP whitelisting is mandatory. Per the docs, "Access to the CiiRUS-API is restricted to whitelisted IP addresses only for security purposes." Requests from unregistered addresses get a 403.
  • Auth is HTTP Basic. Every request carries Authorization: Basic Base64{APIUsername:APIPassword}.
What that means for you
  • If you're a CiiRUS customer, the fastest route is asking your account manager or support about API access for your own account. CiiRUS actively markets the API to its customers for building on Zapier, Replit, and Webflow, so this is a supported conversation, not a favor.
  • Your home IP is probably dynamic. Whitelist a static IP you control, or plan to run the server from a small cloud box with one.
  • No credentials, no problem worth hiding. Path B below works today with zero API access.

What you can ask Claude once it's connected

These assume the read-only server built below, and a portfolio that looks like a typical CiiRUS book of business: dozens of homes around Orlando, Kissimmee, and the Gulf coast.

Booking pace
  • "How many reservations arrived in the last 7 days versus the 7 days before? Split by unit."
  • "Which units have the fewest booked nights in the next 60 days? Show occupancy per unit."
Turnovers and operations
  • "List every departure this Saturday with a same-day arrival behind it. Those are my back-to-back turns."
  • "Pull tomorrow's check-ins and check-outs and group them by community."
Owner reporting
  • "For unit 4821, summarize this month's reservations, nights sold, and cancellations in a paragraph I can paste into an owner email."
  • "Which properties picked up a new review recently, and what did guests say?"

What the CiiRUS-API actually exposes

The current API (CiiRUS calls it the CiiRUS-API or Partner-API, version v2024.07.31) is documented publicly at docs.ciiruspartners.com, including an OpenAPI index. The read endpoints this guide uses:

Read endpoints https://api.ciiruspartners.com/v2024.07.31
GET/unitsThe property list: details, amenities, images. Filters for enabled, channel, pagination.
GET/reservationsBookings, with arrival, departure, and modified date-range filters plus cancelled and tentative flags.
GET/unit_calendarsAvailability calendars for a date range (start and end are required).
GET/unit_quotesQuote configuration settings per unit.
GET/reviewsGuest reviews.
GET/suppliersThe management companies behind the units.
The API also supports writes (creating, updating, and cancelling reservations) and rates. This guide deliberately touches none of that. Pagination defaults to 25 rows per page via page and page_size.

There is also a legacy SOAP API at api.ciirus.com (XML web services like XMLadditionalfunctions15.025.asmx). If you inherited an old integration, it still answers, but CiiRUS's docs ship a migration guide away from it. Build anything new against the REST API.

Two honest paths

A

API credentials + MCP server

The full build below. Live data, ask-anything flexibility, read-only by design. Requires getting credentials from the CiiRUS team and whitelisting a static IP. Worth it if you'll query this weekly or more.

B

No API: exports into Claude

Export reservation and financial reports from CiiRUS (CSV or Excel), drop them into a Claude Project, and ask the same questions against the files. Snapshot data instead of live, zero approvals, works today. CiiRUS's own in-platform AI assistant covers the basics inside the dashboard too.

Path A: the walkthrough

You need CiiRUS-API credentials, Node.js 18 or newer (check with node --version), and Claude Desktop or Claude Code.

1

Get credentials and whitelist your IP

Contact CiiRUS support (or your account manager, if you're a customer) and ask about CiiRUS-API access. The documented registration process involves an RFI, a mutual NDA, and a commercial conversation; your APIUsername and APIPassword arrive in a welcome email once it completes, along with sandbox access to CiiRUS-hosted test properties.

At the same time, give their team the static IP address your server will call from. If your office or home connection has a dynamic IP, the clean fix is running this MCP server on a $5 cloud VM with a fixed address and connecting Claude to it remotely, or asking your ISP for a static IP.

Test before you build. One curl from the whitelisted machine confirms everything: curl -u "APIUsername:APIPassword" "https://api.ciiruspartners.com/v2024.07.31/units?page_size=1". A JSON unit back means you're live. A 403 means the IP isn't whitelisted yet; a 401 means the credentials are wrong.
2

Scaffold the project

Two dependencies: the official MCP SDK and zod for describing tool inputs. No build step.

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

Write the server

Save this as index.js. It builds the Basic auth header once from your credentials and exposes five read-only tools against the documented endpoints. That's the whole file.

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.ciiruspartners.com/v2024.07.31";
const USER = process.env.CIIRUS_API_USERNAME;
const PASS = process.env.CIIRUS_API_PASSWORD;

if (!USER || !PASS) {
  console.error("Set CIIRUS_API_USERNAME and CIIRUS_API_PASSWORD first.");
  process.exit(1);
}

// CiiRUS-API auth: Authorization: Basic Base64{APIUsername:APIPassword}
const AUTH = "Basic " + Buffer.from(`${USER}:${PASS}`).toString("base64");

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: { Authorization: AUTH, Accept: "application/json" } });
  if (res.status === 403) throw new Error("403: this machine's IP is not whitelisted with CiiRUS.");
  if (!res.ok) throw new Error(`CiiRUS ${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: "ciirus", version: "1.0.0" });

server.registerTool(
  "list_units",
  {
    description: "List units (properties) in the CiiRUS account. Paginated, 25 per page by default.",
    inputSchema: {
      page: z.number().optional().describe("Page number, default 1"),
      page_size: z.number().optional().describe("Rows per page, default 25"),
      enabled: z.boolean().optional().describe("Filter to enabled units"),
    },
  },
  async ({ page, page_size, enabled }) => json(await get("/units", { page, page_size, enabled }))
);

server.registerTool(
  "list_reservations",
  {
    description: "List reservations, filterable by arrival or departure date range. Dates are ISO date-times.",
    inputSchema: {
      arrival_start: z.string().optional().describe("Earliest arrival, e.g. 2026-07-01T00:00:00Z"),
      arrival_end: z.string().optional().describe("Latest arrival"),
      departure_start: z.string().optional().describe("Earliest departure"),
      departure_end: z.string().optional().describe("Latest departure"),
      unit_id: z.number().optional().describe("Filter to one unit"),
      cancelled: z.boolean().optional().describe("Filter cancelled reservations"),
      page: z.number().optional(),
      page_size: z.number().optional().describe("Rows per page, default 25"),
    },
  },
  async (args) => json(await get("/reservations", args))
);

server.registerTool(
  "get_unit_calendars",
  {
    description: "Availability calendars for units over a date range. start and end are required.",
    inputSchema: {
      start: z.string().describe("Range start, YYYY-MM-DD"),
      end: z.string().describe("Range end, YYYY-MM-DD"),
      unit_id: z.number().optional().describe("Limit to one unit"),
      page: z.number().optional(),
      page_size: z.number().optional(),
    },
  },
  async (args) => json(await get("/unit_calendars", args))
);

server.registerTool(
  "list_reviews",
  {
    description: "List guest reviews.",
    inputSchema: { page: z.number().optional(), page_size: z.number().optional() },
  },
  async (args) => json(await get("/reviews", args))
);

server.registerTool(
  "list_suppliers",
  {
    description: "List suppliers (management companies) visible to these credentials.",
    inputSchema: { page: z.number().optional(), page_size: z.number().optional() },
  },
  async (args) => json(await get("/suppliers", args))
);

const transport = new StdioServerTransport();
await server.connect(transport);
console.error("CiiRUS MCP server running on stdio");
Pagination matters here. CiiRUS defaults to 25 rows per page, smaller than most PMS APIs. If you manage 60 homes and ask Claude to total a month across the portfolio, tell it to set page_size higher or walk the pages, otherwise it sums the first 25 rows and presents them confidently.
4

Connect it to Claude

Claude Desktop

Add a ciirus entry to your config file (~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %AppData%\Claude\claude_desktop_config.json on Windows), then fully quit and reopen the app.

claude_desktop_config.json
{
  "mcpServers": {
    "ciirus": {
      "command": "node",
      "args": ["/ABSOLUTE/PATH/TO/ciirus-mcp/index.js"],
      "env": {
        "CIIRUS_API_USERNAME": "your-api-username",
        "CIIRUS_API_PASSWORD": "your-api-password"
      }
    }
  }
}
Claude Code
terminal
claude mcp add \
  --env CIIRUS_API_USERNAME=your-api-username \
  --env CIIRUS_API_PASSWORD=your-api-password \
  --transport stdio ciirus \
  -- node /ABSOLUTE/PATH/TO/ciirus-mcp/index.js

Confirm with claude mcp list, then start a conversation and try "List my units, then show this weekend's departures with same-day arrivals behind them." Claude asks permission the first time it calls each tool.

Remember the whitelist. The tools only work from the machine whose IP CiiRUS registered. If you set this up on a laptop and it works at the office but 403s from home, that is the whitelist doing its job.

Path B: no credentials, still useful

If the partner process isn't worth it for your size or timeline, don't force it. Export what you need from CiiRUS's reporting (reservation and financial reports export to spreadsheet formats), create a Claude Project, and add the exports as project files. Every booking-pace, turnover, and owner-reporting question above works against the files; the answers are just as of the export date rather than live. Re-export weekly and you have a poor man's integration with zero approvals and nothing to host.

Also worth knowing what you already have: CiiRUS ships its own in-platform AI, including an assistant that, in CiiRUS's words, answers questions about "reservations, performance, and operations," plus AI listing content and automated messaging. For questions that live entirely inside the PMS, the built-in assistant is the shortest path. The MCP route earns its keep when you want CiiRUS data next to everything else in a Claude conversation: your spreadsheets, your other tools, your judgment.

Troubleshooting

403 Forbidden on every request

This is the IP whitelist, not your credentials. CiiRUS returns 403 for requests from unregistered addresses. Confirm the public IP of the machine running the server (search "what is my IP") matches the one you gave the CiiRUS team, and remember that home connections often rotate IPs.

401 Unauthorized

The Basic auth pair is wrong. The header must be Authorization: Basic Base64{APIUsername:APIPassword}, username and password joined by a colon before encoding. Check for trailing whitespace pasted into the env vars.

Claude doesn't show any CiiRUS tools

Claude Desktop reads its config only at startup. Fully quit (Cmd+Q on macOS, quit from the tray on Windows) and reopen. If it still fails, check the config file is valid JSON and the path to index.js is absolute.

Totals look too small on a big portfolio

Pagination. The API returns 25 rows per page by default. Tell Claude to raise page_size or iterate pages until the results run out before summing anything portfolio-wide.

An endpoint 404s or returns an unexpected shape

The CiiRUS-API is versioned (this guide targets v2024.07.31) and evolves. The full, current reference lives at docs.ciiruspartners.com, including response schemas for every endpoint. Adjust the paths or parameters in index.js to match what your credentials' version documents.

The data this server can't see: what your homes actually look like. CiiRUS's task manager has cleaners submitting photo and video evidence on every turnover. RapidEye is the layer that reads that kind of turnover photo set automatically, flagging damage and missed cleaning before the next Orlando guest walks in. If you're wiring your stack into Claude, our API is built for exactly this kind of integration.

FAQ

Does CiiRUS have an MCP server?

No. As of July 2026 CiiRUS does not publish a first-party MCP server, and we couldn't find a third-party one either. You wrap the CiiRUS-API yourself, which is the whole point of this guide.

Is the CiiRUS API self-serve?

No. Credentials are issued by the CiiRUS team after their documented registration process (RFI, mutual NDA, commercial terms), and the API only accepts whitelisted IPs. Existing customers should start with their account manager; CiiRUS markets the API to customers for exactly this kind of build.

Does CiiRUS have its own built-in AI?

Yes. An in-platform assistant for questions about reservations and performance, AI listing content, and automated messaging. This guide is for when you want CiiRUS data inside Claude, alongside everything else Claude can see.

Can I connect CiiRUS to ChatGPT the same way?

Not with this exact server. ChatGPT only talks to remote MCP servers over HTTPS; the one here runs locally over stdio, which Claude Desktop and Claude Code support natively. Host the same logic on a static-IP server and both problems (ChatGPT connectivity and the CiiRUS whitelist) are solved at once.

What about the old XML API at api.ciirus.com?

That's the legacy SOAP Booking Partner API. It still exists, but CiiRUS's docs provide a migration guide and function comparisons for moving off it. Build anything new against the REST CiiRUS-API.

More of this series

Every guide in the Claude guides library follows the same pattern: real API, working code, read-only by default.

Sources

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