Can you connect Tokeet to Claude? Yes. Tokeet has a documented Client API, and you wrap it in a small MCP server: a lightweight program on your own machine that exposes Tokeet endpoints to Claude as tools. Once connected, Claude can list your rentals, check availability, look up guests, and review tasks and expenses in plain English.
Two things are specific to Tokeet. First, there is no official or community Tokeet MCP server as of July 2026, so you build a small one yourself (working code below, about 20 minutes). Second, the Client API does not publish a bookings endpoint; bookings come out of Tokeet through a data feed URL instead, and the server below includes a tool for that.
What you can ask once it's connected
- "List all my Tokeet rentals with their sleep counts and cities."
- "Which of my units are available the first week of September?"
- "Pull my bookings feed and tell me which check-ins land this weekend, by rental."
- "Look up the guest with this email and summarize their past stays and notes."
- "What open tasks are on my list right now, and which rentals are they tied to?"
- "Total my unpaid expenses this month and group them by rental."
The Tokeet API, in one card
Tokeet's developer surface is the Client API, or CAPI. The docs live at apidocs.tokeet.com as a published Postman collection, and the collection's own description states it "is for property managers only"; partners who need the separate partner API are told to contact support. According to the same documentation, be careful with writes: deleted or updated data cannot be recovered.
- Base URL
- https://capi.tokeet.com/v1
- Auth
- Your API key goes in the Authorization header of every request, and your account ID rides the query string as ?account=
- Where the key lives
- Settings > Account Info in Tokeet. Click Generate Key; the account ID sits right next to it
- Format
- JSON request bodies, JSON responses shaped { data, error }
- Errors
- Standard HTTP: 400 invalid, 401 unauthenticated, 404 not found, 500 server error
- Docs
- apidocs.tokeet.com (Postman-published collection)
- Rentals + per-rental availability
- Guests incl. lookup by email
- Rates standard, promotion, dynamic
- Tasks and expenses
- Templates and triggers
- Users
- Inquiries / bookings (use data feeds)
- Messages
- Invoices
- A published rate limit
That first gap is the one that matters. When a user asked how to retrieve property bookings through the API, the answer on Tokeet's own community forum was to use the Inquiry data feed instead: a secure CSV URL you create under Settings > Data Feeds. Per Tokeet's data feeds help article, each feed returns up to 1,000 records per request and accepts filters like ?booked=1, start/end dates, a rental ID, and skip/limit pagination. Our server treats that feed as a first-class tool, so Claude gets bookings too.
Before you start
Three things: a Tokeet account (an admin login that can reach Settings), Node.js 18 or newer (check with node --version), and either Claude Desktop or Claude Code. No paid add-ons; the Client API and data feeds are part of the platform.
Get your API key, account ID, and bookings feed
Log in to Tokeet and open Settings > Account Info. At the top of the first table you'll see the API key section; click Generate Key if none exists. Copy it immediately: per Tokeet's API docs, the key is only visible for the remainder of your session, and generating a new key automatically disables the old one. Your account ID is right next to the key; copy that too.
Then grab the bookings feed. Go to Settings > Data Feeds, click Create, name it, and choose the Inquiry feed type. Copy the secure URL it gives you. That URL is the credential, so treat it like a password.
Scaffold the project
Make a folder and install the two dependencies: the official MCP SDK and zod, which describes each tool's inputs. No build step.
mkdir tokeet-mcp && cd tokeet-mcp
npm init -y
npm pkg set type="module"
npm install @modelcontextprotocol/sdk zod
Write the server
Save this as index.js. It exposes seven read-only tools: six GET wrappers over the Client API plus one that fetches your Inquiry data feed for bookings. Every CAPI call sends the API key in the Authorization header and appends account= to the query string, exactly as the docs require.
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const BASE = "https://capi.tokeet.com/v1";
const API_KEY = process.env.TOKEET_API_KEY;
const ACCOUNT = process.env.TOKEET_ACCOUNT_ID;
const INQUIRY_FEED = process.env.TOKEET_INQUIRY_FEED_URL; // optional
if (!API_KEY || !ACCOUNT) {
console.error("Set TOKEET_API_KEY and TOKEET_ACCOUNT_ID first.");
process.exit(1);
}
// Every CAPI request: raw API key in the Authorization header,
// account id on the query string.
async function capiGet(path, params = {}) {
const url = new URL(`${BASE}${path}`);
url.searchParams.set("account", ACCOUNT);
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: API_KEY, Accept: "application/json" },
});
const text = await res.text();
if (!res.ok) throw new Error(`Tokeet CAPI ${res.status}: ${text.slice(0, 400)}`);
return text;
}
const server = new McpServer({ name: "tokeet", version: "1.0.0" });
const asText = (text) => ({ content: [{ type: "text", text }] });
server.tool(
"list-rentals",
"List all rentals in the Tokeet account. Returns each rental's id (pkey), name, address, and settings. Run this first to discover rental ids.",
{},
async () => asText(await capiGet("/rental"))
);
server.tool(
"get-rental",
"Get one rental's full record by its pkey.",
{ rental_pkey: z.string().describe("Rental id from list-rentals") },
async ({ rental_pkey }) => asText(await capiGet(`/rental/${rental_pkey}`))
);
server.tool(
"get-rental-availability",
"Get the availability calendar for one rental.",
{ rental_pkey: z.string().describe("Rental id from list-rentals") },
async ({ rental_pkey }) =>
asText(await capiGet(`/rental/${rental_pkey}/availability`))
);
server.tool(
"list-guests",
"List guests. Supports pagination (limit/skip), sort (1 asc, -1 desc), booked=1 for guests with bookings, source (e.g. airbnb), and a name filter.",
{
limit: z.number().optional().describe("Max records, e.g. 100"),
skip: z.number().optional().describe("Records to skip for pagination"),
sort: z.number().optional().describe("1 ascending, -1 descending"),
booked: z.number().optional().describe("1 = only guests with bookings"),
source: z.string().optional().describe("Channel filter, e.g. airbnb"),
name: z.string().optional().describe("Name search"),
},
async (params) => asText(await capiGet("/guest", params))
);
server.tool(
"get-guest-by-email",
"Look up a guest record by email address.",
{ email: z.string().describe("Guest email") },
async ({ email }) =>
asText(await capiGet(`/guest/email/${encodeURIComponent(email)}`))
);
server.tool(
"list-tasks",
"List all tasks in the account (cleaning, maintenance, anything on a task list). Tasks can carry a rental id, inquiry id, assigned user, and due date.",
{},
async () => asText(await capiGet("/task"))
);
server.tool(
"list-expenses",
"List expenses. Supports limit, skip, and sort (1 asc, -1 desc). Expenses carry amount, status (1 unpaid, 2 paid), method, and an optional rental or inquiry id.",
{
limit: z.number().optional(),
skip: z.number().optional(),
sort: z.number().optional(),
},
async (params) => asText(await capiGet("/expense", params))
);
// Bookings: the published Client API has no inquiry/booking endpoint.
// Tokeet's answer is the Inquiry data feed (Settings > Data Feeds), a
// secure CSV URL. 1000 records max per request; filter with booked=1,
// start/end dates, rental=<id>, and paginate with skip/limit.
if (INQUIRY_FEED) {
server.tool(
"list-bookings",
"Fetch the Tokeet Inquiry data feed as CSV. Defaults to booked inquiries only. Returns up to 1000 rows per call; use skip/limit to page.",
{
booked: z.number().optional().describe("1 = only booked inquiries (default 1)"),
start: z.string().optional().describe("Bookings starting on/after, YYYY-MM-DD"),
end: z.string().optional().describe("Bookings ending on/before, YYYY-MM-DD"),
rental: z.string().optional().describe("Limit to one rental id"),
skip: z.number().optional(),
limit: z.number().optional(),
},
async (params) => {
const url = new URL(INQUIRY_FEED);
const merged = { booked: 1, ...params };
for (const [k, v] of Object.entries(merged)) {
if (v !== undefined && v !== null && v !== "") url.searchParams.set(k, String(v));
}
const res = await fetch(url);
if (!res.ok) throw new Error(`Data feed ${res.status}`);
return asText(await res.text());
}
);
}
const transport = new StdioServerTransport();
await server.connect(transport);
Connect it to Claude
Claude Desktop
Edit claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\) and merge this into mcpServers:
{
"mcpServers": {
"tokeet": {
"command": "node",
"args": ["/absolute/path/to/tokeet-mcp/index.js"],
"env": {
"TOKEET_API_KEY": "your-api-key",
"TOKEET_ACCOUNT_ID": "your-account-id",
"TOKEET_INQUIRY_FEED_URL": "https://...your-inquiry-feed-url..."
}
}
}
}
Then fully quit and reopen Claude Desktop. Closing the window is not enough; the config is only read at startup.
Claude Code
claude mcp add tokeet \
-e TOKEET_API_KEY=your-api-key \
-e TOKEET_ACCOUNT_ID=your-account-id \
-e TOKEET_INQUIRY_FEED_URL="https://...feed..." \
-- node /absolute/path/to/tokeet-mcp/index.js
First prompt to try: "List my Tokeet rentals as a table, then pull the bookings feed and show every check-in over the next 7 days."
Troubleshooting
401 Unauthorized on every call
Three usual causes. The key is wrong (remember: generating a new key automatically disables the old one, and the key is only shown during the session you generated it in). The account= query parameter is missing or wrong; Tokeet wants the account ID on every request, not just the key. Or the header shape is off: the docs' own example puts the raw key straight into the Authorization header, no Bearer prefix.
Where are my bookings? There's no /inquiry endpoint
Correct, and it's not you. The published Client API collection has folders for rentals, guests, rates, tasks, expenses, templates, triggers, and users, but no inquiries or bookings. Tokeet's community forum points booking retrieval at the Inquiry data feed instead. Create one under Settings > Data Feeds, set TOKEET_INQUIRY_FEED_URL, and use the list-bookings tool.
The bookings feed cuts off at 1,000 rows
That's the documented ceiling: data feed URLs return no more than 1,000 records at a time. Page with skip and limit (the feed docs show ?skip=1000&limit=2000 for the second page), or narrow the window with start and end dates. Claude can chain multiple list-bookings calls itself if you tell it to keep paging.
Claude doesn't show any Tokeet tools
Claude Desktop reads the config only at startup: fully quit (Cmd+Q on macOS, quit from the tray on Windows) and reopen. If it's still missing, check for invalid JSON in the config, a non-absolute path to index.js, or node not being on your PATH. In Claude Code, run claude mcp list to confirm the server registered.
I want Claude to change rates or create tasks
The Client API can do it: rates, tasks, guests, and expenses all have POST/PUT/DELETE endpoints in the collection. This guide deliberately doesn't wire them up, because Tokeet's docs are explicit that destroyed data is unrecoverable. If you add writes, keep them in a separate server, and consider Tokeet's Zapier integration or Automata triggers for automation that doesn't need an open-ended AI in the loop.
Quick FAQ
Does Tokeet have an official MCP server?
No. As of July 2026 we could find no first-party or community Tokeet MCP server anywhere: a GitHub repository search for "tokeet mcp" returns zero results, and an npm registry search for "tokeet" returns zero packages. Building your own, as above, is the path that works today, and it has a silver lining: you decide exactly which tools Claude gets.
Is the Tokeet API free? Is there a rate limit?
The Client API is part of the platform for property-manager accounts; the docs describe generating a key from your own account settings with no separate signup. The published documentation does not mention a rate limit either way. Be a good citizen anyway: the read-only server above makes one HTTP call per tool invocation.
What about the AdvanceCM rebrand?
Tokeet the company now markets its flagship all-in-one PMS as AdvanceCM, with Sympl positioned for 1-5 property hosts, alongside Rategenie (pricing), Automata (workflow automation), Webready (direct booking sites), and Checklist (cleaning and service jobs). The Client API documented here is the classic Tokeet developer surface at capi.tokeet.com; if your account has moved to AdvanceCM and something doesn't line up, confirm your API access with Tokeet support.
Can I do this without writing code?
Partly. Tokeet has an official Zapier integration with triggers for booking events (canceled, checked-out, cost updated, guest or rental changed), new guests, invoices, and messages. That's push-based automation rather than conversational querying: good for "when a booking cancels, post to Slack," but it won't let you ask open questions about your portfolio the way an MCP connection does. Tokeet's trigger system can also fire webhooks natively via its WebhookHandler.
Is this safe to run?
The server runs locally, your API key lives in an environment variable on your machine, and every tool is a read. Claude cannot modify or delete anything in your Tokeet account with the code above. The one credential-shaped thing to guard is the data feed URL itself, since anyone holding it can read the feed.
Sources
- Tokeet Client API documentation (published Postman collection)https://apidocs.tokeet.com/
- Tokeet Data Feeds, Tokeet Help Centerhttps://www.tokeet.com/help/data-feeds/tokeet-data-feeds
- Property bookings retrieving through Tokeet API, Tokeet Communityhttps://www.tokeet.com/community/topic/91/property-bookings-retrieving-through-tokeet-api
- Tokeet Integrations, Zapierhttps://zapier.com/apps/tokeet/integrations
- Tokeet, Advanced Vacation Rental Management Softwarehttps://www.tokeet.com/
- Checklist by Tokeethttps://www.usechecklist.com/
- Model Context Protocol TypeScript SDK, GitHubhttps://github.com/modelcontextprotocol/typescript-sdk
RapidEye is not affiliated with Tokeet. Endpoints and menu paths verified against the sources above in July 2026; if Tokeet moves something, the Postman docs at apidocs.tokeet.com are the source of truth.
Keep reading
All Claude guides
Every PMS, pricing, and ops tool we've wired to Claude for STR operators.
PMSConnect Hostaway to Claude
Same pattern against the Hostaway API: listings, reservations, calendar.
RapidEyeThe RapidEye API
Inspection intelligence as an API: pipe damage findings into your own stack.

