Connects Claude to the Zenoti spa and wellness management platform through their REST API. Exposes tools for the full booking lifecycle: search and create guest profiles, book services through a consolidated 4-step workflow, manage appointment status and check-ins, and handle invoices and payments. Returns context-efficient responses with human-readable formatting instead of raw IDs. You'd reach for this to build AI-powered front desk operations, automated booking assistants, or conversational interfaces for spa scheduling. Requires a Zenoti API key from their admin dashboard with appropriate module permissions. Built to minimize token usage and guide agents through multi-step workflows like availability checks and reservation confirmations.
A Model Context Protocol (MCP) server that provides intelligent access to the Zenoti spa/wellness management API. Designed for AI agents to efficiently manage appointments, guests, services, and billing workflows.
git clone https://github.com/yourusername/zenoti-mcp-server.git
cd zenoti-mcp-server
npm install
cp .env.example .env
# Edit .env with your Zenoti API credentials
npm run build
ZENOTI_API_KEY: Your Zenoti API key (required)ZENOTI_API_URL: Zenoti API base URL (default: https://api.zenoti.com)ZENOTI_CENTER_ID: Default center ID for operationsZENOTI_ORG_ID: Your organization ID# Development mode with auto-reload
npm run dev
# Production mode
npm start
# Test the server with example client
npm test
Add to your Claude Desktop configuration (claude_desktop_config.json):
{
"mcpServers": {
"zenoti": {
"command": "node",
"args": ["/path/to/zenoti-mcp-server/dist/index.js"],
"env": {
"ZENOTI_API_KEY": "your_api_key",
"ZENOTI_API_URL": "https://api.zenoti.com",
"ZENOTI_CENTER_ID": "your_center_id"
}
}
}
}
book_serviceComplete 4-step service booking workflow in a single tool.
Parameters:
guest_id (required): Guest ID or search queryservice_id (required): Service ID or namedate (required): Appointment date (YYYY-MM-DD)time (optional): Preferred time (HH:MM)therapist_id (optional): Therapist ID or namenotes (optional): Booking notespay_later (optional): Skip payment (default: true)Example:
{
"guest_id": "john.doe@email.com",
"service_id": "Deep Tissue Massage",
"date": "2025-11-15",
"time": "14:00"
}
search_guestsSearch for guests by name, email, or phone.
Parameters:
query (required): Search querylimit (optional): Max results (default: 10)create_guestCreate a new guest profile.
Parameters:
first_name (required)last_name (required)email (optional)phone (optional)gender (optional)date_of_birth (optional)list_appointmentsList appointments with filters.
Parameters:
start_date (required): Start date (YYYY-MM-DD)end_date (optional): End date (default: start_date)status (optional): Filter by statusguest_id (optional): Filter by guestlimit (optional): Max results (default: 50)check_in_appointmentCheck in a guest for their appointment.
Parameters:
appointment_id (required): Appointment or group IDupdate_appointment_statusUpdate appointment status (confirm, cancel, no-show).
Parameters:
appointment_id (required)status (required): "confirmed", "cancelled", "no_show"reason (optional): Cancellation reasonget_invoiceRetrieve invoice details.
Parameters:
invoice_id (required)include_details (optional): Include line items (default: true)close_invoiceProcess payment and close invoice.
Parameters:
invoice_id (required)payment_method (optional): Payment typeamount (optional): Payment amountlist_appointment_formsGet forms for an appointment.
Parameters:
appointment_id (required)submit_feedbackSubmit guest feedback for appointment.
Parameters:
appointment_id (required)rating (required): 1-5 or 1-10comments (optional)The server provides actionable error messages to guide agents:
{
"error": "No available slots found",
"suggestion": "Try a different date or remove therapist preference",
"alternatives": ["2025-11-16", "2025-11-17"]
}
The server implements intelligent rate limiting:
zenoti-mcp-server/
├── src/
│ ├── index.ts # MCP server entry point
│ ├── zenoti-client.ts # Zenoti API client
│ ├── tools/ # Tool implementations
│ │ ├── booking.ts # Service booking tools
│ │ ├── guests.ts # Guest management tools
│ │ ├── appointments.ts # Appointment tools
│ │ └── invoices.ts # Invoice tools
│ ├── utils/ # Shared utilities
│ │ ├── errors.ts # Error handling
│ │ ├── formatters.ts # Response formatting
│ │ └── validators.ts # Input validation
│ └── test-client.ts # Test client
├── package.json
├── tsconfig.json
└── README.md
Run the test client to verify functionality:
npm test
The test client demonstrates:
API Key Authorization Denied (Error 602)
No Available Slots
Guest Not Found
MIT License - See LICENSE file for details
For issues or questions:
ZENOTI_API_KEY*secretZenoti API key from Org Settings → API
ZENOTI_API_URL*Zenoti API base URL (e.g. https://api.zenoti.com/v1)
ZENOTI_CENTER_ID*Center/location identifier
ZENOTI_ORG_ID*Organization identifier