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.
- 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}.
- 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.
- "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."
- "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."
- "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:
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
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.
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.
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.
Scaffold the project
Two dependencies: the official MCP SDK and zod for describing tool inputs. No build step.
mkdir ciirus-mcp && cd ciirus-mcp
npm init -y
npm pkg set type="module"
npm install @modelcontextprotocol/sdk zod
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.
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");
Connect it to Claude
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.
{
"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 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.
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
- Getting Started with the CiiRUS-API (auth model, IP whitelisting, credential issuance, endpoint catalog)https://docs.ciiruspartners.com/docs/getting-started
- CiiRUS-API Introductionhttps://docs.ciiruspartners.com/docs/partner-api-introduction
- CiiRUS-API Steps to Success (RFI, NDA, commercial terms, sandbox)https://docs.ciiruspartners.com/docs/steps-to-success
- CiiRUS-API Reference: Retrieve Units (base URL and parameters)https://docs.ciiruspartners.com/reference/get_units
- CiiRUS-API Reference: Retrieve Reservationshttps://docs.ciiruspartners.com/reference/get_reservations
- CiiRUS AI Tools (in-platform assistant, API for Zapier / Replit / Webflow builds)https://www.ciirus.com/ai
- CiiRUS Task Manager (housekeeping, photo and video evidence, inspections)https://www.ciirus.com/features/task-manager
- Model Context Protocol: Build an MCP serverhttps://modelcontextprotocol.io/quickstart/server
- Claude Code: Connect to tools via MCPhttps://code.claude.com/docs/en/mcp
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.

