HomeMaster MCP server
Book home cleaning and aircon servicing in Singapore from any AI assistant.
HomeMaster's Model Context Protocol server lets an assistant check coverage, open times and exact prices, then either hand the customer a checkout link with their visit already filled in, or send the customer Helen's booking card on WhatsApp to confirm with one tap. Either way the customer confirms it is their phone and pays on our page. After booking, Helen, our assistant on WhatsApp, handles reminders and changes.
| Endpoint | https://homemaster.co/mcp |
| Transport | Streamable HTTP (stateless JSON responses, no SSE stream) |
| Auth | None. No key, no sign-in |
| Tools | 8: seven read-only, and request_booking, which sends the customer a WhatsApp card to confirm |
| Protocol versions | 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05 |
| Docs for people | homemaster.co/agents · llms.txt |
Connect
Claude (claude.ai, Claude Desktop): add a custom connector with the URL https://homemaster.co/mcp.
Claude Code:
claude mcp add --transport http homemaster https://homemaster.co/mcp
ChatGPT: in developer mode, add a connector with the URL https://homemaster.co/mcp.
Cursor (~/.cursor/mcp.json) and most clients that take a JSON config:
{ "mcpServers": { "homemaster": { "url": "https://homemaster.co/mcp" } } }
VS Code (.vscode/mcp.json):
{ "servers": { "homemaster": { "type": "http", "url": "https://homemaster.co/mcp" } } }
Try it from a terminal with the official inspector:
npx @modelcontextprotocol/inspector --cli https://homemaster.co/mcp --transport http --method tools/list
npx @modelcontextprotocol/inspector --cli https://homemaster.co/mcp --transport http \
--method tools/call --tool-name get_quote --tool-arg hours=3
Tools
| Tool | What it does | Inputs |
|---|---|---|
find_services | What we sell, the options and list prices (SGD, GST included) | none |
check_area | Whether we cover a Singapore postal code | postal_code, service |
find_times | Open dates for the next 14 days, or one day's start times, each with its price | postal_code, service, hours + frequency (cleaning) or job_type + unit_count (aircon), optional date, end_date |
get_quote | The exact price our checkout will show a new customer, with any evening rate or public voucher | service, hours, frequency (or job_type, unit_count), optional date + start_time |
start_booking | A checkout link with the address and visit filled in (refused for an address we cannot serve) | postal_code, service, optional hours, frequency |
ask_homemaster | Policies and what a clean includes, answered only from our service guide | question |
request_booking | Sends the customer Helen's booking card on WhatsApp. Nothing is booked until they tap "Yes, book it" within 60 minutes; they then pay by link. Returns a reference. Cleaning only | postal_code, unit, date, start_time, hours, phone, optional frequency, agent_name |
booking_status | Where a request_booking request stands: waiting for the customer, declined, expired, awaiting payment (with the payment link), finding a cleaning expert, booked (with the next visit), done or cancelled | reference |
service is cleaning (by the hour: 2, 3 or 4 hours; one-time, weekly or bi-weekly) or aircon (per job and number of units; see find_services for the jobs).
A typical booking
check_area {"postal_code": "238823"}find_times {"postal_code": "238823", "hours": 3}, then with adatefor that day's timesget_quote {"hours": 3, "date": "2026-10-03", "start_time": "09:00"}start_booking {"postal_code": "238823", "hours": 3, "frequency": "one-time"}- Give the customer the link. They pick the time, confirm their phone and pay.
Example get_quote result (one-time, 3 hours, no time chosen):
{
"service": "cleaning", "hours": 3, "frequency": "one-time", "currency": "SGD", "gst_included": true,
"pay_now": 57, "list_price": 75, "saving": 18,
"offer": "voucher \"You're invited to HomeMaster\" applied (saves S$18.00), for customers booking with us for the first time",
"evening_rate": "One-time visits starting from 6:00 PM in the next 3 days cost S$18/hour (S$54.00 for 3 hours) when that is cheaper. ...",
"caveat": "This is what the checkout shows a new customer before their phone is checked. ..."
}
Example start_booking result (trimmed):
{
"bookable": true,
"booking_url": "https://homemaster.co/book/clean?postal=238823&hours=3&frequency=one-time&utm_source=your-client&utm_medium=ai_agent&utm_campaign=mcp",
"link_note": "Give the customer this link exactly as it is. ...",
"customer_steps": ["Open the link. ...", "Pick a start time. It is held for 7 minutes ...", "..."]
}
Booking for the customer
With the customer's agreement, request_booking does the booking for them. Use a start time from find_times:
request_booking {"postal_code": "238823", "unit": "#05-12", "date": "2026-10-03", "start_time": "09:00", "hours": 3, "phone": "+6591234567", "agent_name": "Claude"}- We send the customer Helen's booking card on WhatsApp: "Claude asked us to book this for you", the date, their address, the clean and their price, with Yes, book it and No, cancel.
- Tell the customer to tap Yes, book it there within 60 minutes. Helen then sends them a payment link. The time is not held while they decide; if it has gone by then, Helen offers other times.
booking_status {"reference": "hmr_..."}at any time.
Example request_booking result (trimmed):
{
"reference": "hmr_2yq...",
"status": "waiting_for_customer",
"expires_at": "2026-10-01T07:05:00.000Z",
"when": "Saturday, 3 October at 9:00 AM",
"price": "$75 - $18 = $57",
"total": 57
}
Figures above are illustrative; the tools always return today's prices.
What it will and will not do
- Nothing is booked or paid without the customer.
start_bookingreturns a link; the booking happens on our checkout, where the customer confirms their own phone with a 6-digit WhatsApp code and pays.request_bookingonly sends the customer a card: their tap on "Yes, book it" is what books it (and proves the phone is theirs), and they pay by link, never by a saved card. Ask the customer before you use it, because it messages their phone. Never pay on a customer's behalf. - Prices match the checkout.
get_quoteandfind_timesrun the same pricing rules as our checkout for a new customer. An invite code, a returning-customer offer or account credit can only lower the figure the customer then sees. - Same-day rule. Today is bookable only for a one-time clean, only its evening slots, and only until 2 PM. Weekly, every-2-weeks and aircon bookings start tomorrow.
- Existing bookings (changes and cancellations, and the status of a booking made through the link) are handled by Helen on WhatsApp: https://wa.me/6589154889. If you hand a customer to Helen, put their whole request in the message (service, postal code, unit, hours, preferred date).
Without MCP
- Booking link:
https://homemaster.co/book/clean?postal=238823&hours=3&frequency=weekly(postal6 digits,hoursone we sell,frequencyone-time/weekly/bi-weekly; each optional). Aircon:https://homemaster.co/book/aircon?postal=238823. Addutm_source=<your assistant>&utm_medium=ai_agent. - REST API: services, coverage and availability answer without a key, and so do booking requests (
POST /v1/booking-requests, thenGET /v1/booking-requests/{reference}), which work likerequest_booking. Creating a booking directly needs a partner key. Spec: homemaster.co/api/openapi.yaml.
Limits
Per caller (by IP address): 60 tool calls a minute and 300 an hour; 3,000 an hour across all callers; ask_homemaster 20 an hour per caller; request_booking 10 an hour per caller. One phone number can have one request waiting at a time, and at most 3 a day. A limited call returns a tool error saying so. initialize, tools/list and ping are not counted.
Privacy
The tools ask for a postal code and booking choices, never a name or payment detail. request_booking also asks for the customer's WhatsApp number and unit number: we message that number once, and keep the request so the customer's tap can book it. booking_status never returns the customer's name, phone, address or cleaning expert. No other tool reads customer records. The text of an ask_homemaster question is answered by our AI model provider, so do not put personal details in it. For rate limiting we keep a salted hash of the caller's IP address (never the address itself), deleted within 7 days. The name your client sends at initialize is used only to credit bookings made through the link (utm_source).
Errors
Invalid input and limits come back as tool results with isError: true and a plain message the model can act on. Unknown tools and malformed requests get standard JSON-RPC errors.
Contact
Partners and developers: partnership@homemaster.co. Customers: Helen on WhatsApp, https://wa.me/6589154889.