TIDY is an AI-powered property management platform. This skill provides complete access to all TIDY capabilities: property management, cleaning scheduling, guest reservations, maintenance tasks, service professionals, and a natural language AI assistant.
Base URL: https://public-api.tidy.com Interactive API docs: https://public-api.tidy.com/docs MCP endpoint: https://public-api.tidy.com/mcp
The fastest way to interact with TIDY is the CLI or the natural language message-tidy endpoint.
bash
# Install
brew install tidyapp/tap/tidy-request # or: npm i -g @tidydotcom/cli
# Authenticate
tidy-request signup # new account
tidy-request login # existing account
# Send any property management request in plain English
tidy-request "Schedule a deep clean for next Tuesday at my Beach House"
tidy-request "Create a guest reservation for April 10-14"
tidy-request "Report a broken window at address 123" --address-id 123
bash
# Get a token
curl -X POST https://public-api.tidy.com/api/v2/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"you@example.com","password":"yourpassword"}'
# Returns: { "token": "abc123..." }
export TIDY_API_TOKEN="abc123..."
# Send a natural language request
curl -X POST https://public-api.tidy.com/api/v2/message-tidy \
-H "Authorization: Bearer $TIDY_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"message":"Schedule a cleaning for next Tuesday"}'
bash
curl -X POST https://public-api.tidy.com/api/v2/auth/signup \
-H "Content-Type: application/json" \
-d '{
"first_name": "Jane",
"last_name": "Doe",
"email": "jane@example.com",
"password": "secret123"
}'
bash
curl -X POST https://public-api.tidy.com/api/v2/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"jane@example.com","password":"secret123"}'
Both return: { "token": "abc123..." }. Tokens do not expire.
Use Authorization: Bearer <token> on all subsequent requests.
bash
tidy-request signup # interactive: prompts for name, email, password
tidy-request login # interactive: prompts for email, password
tidy-request logout # removes stored credentials
Credentials are stored at ~/.config/tidy/credentials. Set TIDY_API_TOKEN as an environment variable to override stored credentials.
TIDY exposes an MCP (Model Context Protocol) server for use with Claude Desktop, Claude Code, Cursor, and any MCP client.
Endpoint: https://public-api.tidy.com/mcp (Streamable HTTP, POST)
ToolAuth RequiredDescriptionloginNoAuthenticate with email/passwordsignupNoCreate accountmessage_tidyYesSend natural language request (async)get_message_tidyYesPoll for async message resultlist_messages_tidyYesList all previous messageslist_addressesYesList all managed propertiescreate_addressYesAdd a new propertyget_addressYesGet property detailsupdate_addressYesUpdate a propertydelete_addressYesRemove a propertylist_bookingsYesList cleaning jobscreate_bookingYesSchedule a cleaningget_bookingYesGet job detailsupdate_bookingYesModify a jobcancel_bookingYesCancel a jobreschedule_bookingYesReschedule a joblist_booking_availabilitiesYesFind available time slotslist_guest_reservationsYesList guest stayscreate_guest_reservationYesCreate a guest stayget_guest_reservationYesGet reservation detailsdelete_guest_reservationYesCancel a guest staylist_tasksYesList maintenance issuescreate_taskYesReport a maintenance issueget_taskYesGet task detailsupdate_taskYesUpdate a taskdelete_taskYesRemove a tasklist_to_do_listsYesList cleaning checklistscreate_proYesAdd a service professional
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
json
{
"mcpServers": {
"tidy": {
"url": "https://public-api.tidy.com/mcp"
}
}
}
bash
claude mcp add tidy --transport http https://public-api.tidy.com/mcp
bash
npx @tidydotcom/mcp-server
npx @tidydotcom/mcp-server --api-token YOUR_TOKEN
message_tidy is asynchronous:
login or signup to get a tokenmessage_tidy with your request in plain Englishidget_message_tidy with that ID every 3–5 secondsstatus is completed, read response_message for the resultSend any property management request in plain English and TIDY's AI handles it.
bash
curl -X POST https://public-api.tidy.com/api/v2/message-tidy \
-H "Authorization: Bearer $TIDY_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"message": "Schedule a turnover cleaning before my next guest arrives on April 10",
"context": { "address_id": 123, "guest_reservation_id": 456 }
}'
Parameters:
message (required): natural language requestcontext (optional): { address_id, booking_id, issue_id, guest_reservation_id } to scope the requestresponse_schema (optional): JSON Schema describing desired structured response formatStatus values: queued → in_progress → completed or failed
bash
curl -s https://public-api.tidy.com/api/v2/message-tidy/123 \
-H "Authorization: Bearer $TIDY_API_TOKEN"
Poll every 3–5 seconds. When status is completed, the answer is in response_message.
bash
curl -s "https://public-api.tidy.com/api/v2/message-tidy?status=completed" \
-H "Authorization: Bearer $TIDY_API_TOKEN"
MethodPathDescriptionGET/api/v2/addressesList all addressesGET/api/v2/addresses/:idGet address detailsPOST/api/v2/addressesCreate an addressPUT/api/v2/addresses/:idUpdate an addressDELETE/api/v2/addresses/:idDelete an address
bash
curl -X POST https://public-api.tidy.com/api/v2/addresses \
-H "Authorization: Bearer $TIDY_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"address": "123 Beach Rd",
"city": "Miami",
"postal_code": "33139",
"country_code": "US",
"address_name": "Beach House",
"notes": {
"access": "Lockbox code 4521 on side gate",
"closing": "Leave keys on kitchen counter"
},
"parking": {
"paid_parking": false,
"parking_spot": "myspot",
"parking_pay_with": "card",
"max_parking_cost": 0,
"parking_notes": "Park in driveway spot #2"
}
}'
Required: address, city, postal_code, parking (with paid_parking, parking_spot, parking_notes).
Optional: unit, country_code (default "US"), address_name, notes (with access, closing).
parking_spot values: myspot, meter, street, guest, paidlot.
parking_pay_with values: card, cash (default "card").
MethodPathDescriptionGET/api/v2/jobsList all jobsGET/api/v2/jobs/:idGet job detailsPOST/api/v2/jobsCreate a jobPUT/api/v2/jobs/:idUpdate a jobPOST/api/v2/jobs/:id/cancelCancel a jobPOST/api/v2/jobs/:id/rescheduleReschedule a job
KeyDescriptionregular_cleaning.one_hour1-hour regular cleaningregular_cleaning.two_and_a_half_hours2.5-hour regular cleaningregular_cleaning.four_hours4-hour regular cleaningdeep_cleaning.two_and_a_half_hours2.5-hour deep cleaningdeep_cleaning.four_hours4-hour deep cleaningturnover_cleaning.two_and_a_half_hours2.5-hour turnover cleaningturnover_cleaning.four_hours4-hour turnover cleaning
scheduled → in_progress → completed or cancelled or failed
bash
curl -X POST https://public-api.tidy.com/api/v2/jobs \
-H "Authorization: Bearer $TIDY_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"address_id": 123,
"service_type_key": "regular_cleaning.two_and_a_half_hours",
"start_no_earlier_than": { "date": "2026-04-10", "time": "09:00" },
"end_no_later_than": { "date": "2026-04-10", "time": "17:00" },
"preferred_start_datetime": { "date": "2026-04-10", "time": "10:00" },
"to_do_list_id": 789
}'
Required: address_id, service_type_key, start_no_earlier_than (date + time), end_no_later_than (date + time).
Optional: preferred_start_datetime, to_do_list_id.
bash
curl -X POST https://public-api.tidy.com/api/v2/jobs/456/cancel \
-H "Authorization: Bearer $TIDY_API_TOKEN"
bash
curl -X POST https://public-api.tidy.com/api/v2/jobs/456/reschedule \
-H "Authorization: Bearer $TIDY_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"service_type_key": "regular_cleaning.two_and_a_half_hours",
"start_no_earlier_than": { "date": "2026-04-15", "time": "09:00" },
"end_no_later_than": { "date": "2026-04-15", "time": "17:00" }
}'
bash
curl -s "https://public-api.tidy.com/api/v2/booking-availabilities?address_id=123&service_type_key=regular_cleaning.two_and_a_half_hours" \
-H "Authorization: Bearer $TIDY_API_TOKEN"
Required: address_id, service_type_key.
MethodPathDescriptionGET/api/v2/guest-reservationsList reservations (optional address_id filter)GET/api/v2/guest-reservations/:idGet reservation detailsPOST/api/v2/guest-reservationsCreate a reservationDELETE/api/v2/guest-reservations/:idDelete a reservation
bash
curl -X POST https://public-api.tidy.com/api/v2/guest-reservations \
-H "Authorization: Bearer $TIDY_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"address_id": 123,
"check_in": { "date": "2026-04-10", "time": "15:00" },
"check_out": { "date": "2026-04-14", "time": "11:00" }
}'
Required: address_id, check_in.date, check_out.date.
Optional: check_in.time, check_out.time.
MethodPathDescriptionGET/api/v2/tasksList tasks (filter by address_id, status, type, urgency, assigned_to_concierge)GET/api/v2/tasks/:idGet task detailsPOST/api/v2/tasksCreate a taskPUT/api/v2/tasks/:idUpdate a taskDELETE/api/v2/tasks/:idDelete a task
reported → in_progress → completed
low, normal, high, emergency
bash
curl -X POST https://public-api.tidy.com/api/v2/tasks \
-H "Authorization: Bearer $TIDY_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"address_id": 123,
"title": "Broken window in master bedroom",
"description": "Left pane is cracked, needs glass replacement.",
"type": "repair",
"urgency": "high",
"due_date": "2026-04-05",
"assigned_to_concierge": true
}'
Required: address_id, title, description, type.
Optional: status, urgency, due_date, assigned_to_concierge.
bash
curl -s "https://public-api.tidy.com/api/v2/to-do-lists?address_id=123" \
-H "Authorization: Bearer $TIDY_API_TOKEN"
bash
curl -X POST https://public-api.tidy.com/api/v2/pros \
-H "Authorization: Bearer $TIDY_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Maria Garcia",
"email": "maria@example.com",
"phone": "+1-555-0199",
"service_types": ["regular_cleaning"]
}'
Required: name, email. Optional: phone, service_types.
bash
brew install tidyapp/tap/tidy-request # macOS/Linux via Homebrew
npm install -g @tidydotcom/cli # via npm
bash
tidy-request login # authenticate
tidy-request signup # create account
tidy-request logout # remove credentials
tidy-request "your request" # natural language request
tidy-request "message" --address-id 123 # with address context
tidy-request "message" --booking-id 456 # with booking context
tidy-request "message" --issue-id 789 # with task context
tidy-request "message" --reservation-id 101 # with reservation context
tidy-request --list # list all messages
tidy-request --get ID # get a specific message
tidy-request --help # help
tidy-request --version # version
VariableDescriptionDefaultTIDY_API_HOSTAPI base URLhttps://public-api.tidy.com``TIDY_API_TOKENBearer token (overrides stored credentials)—
MethodPathDescriptionPOST/api/v2/auth/signupCreate accountPOST/api/v2/auth/loginLog inPOST/api/v2/message-tidySend AI message (async)GET/api/v2/message-tidy/:idPoll message resultGET/api/v2/message-tidyList messagesGET/api/v2/addressesList addressesPOST/api/v2/addressesCreate addressGET/api/v2/addresses/:idGet addressPUT/api/v2/addresses/:idUpdate addressDELETE/api/v2/addresses/:idDelete addressGET/api/v2/jobsList jobsPOST/api/v2/jobsCreate jobGET/api/v2/jobs/:idGet jobPUT/api/v2/jobs/:idUpdate jobPOST/api/v2/jobs/:id/cancelCancel jobPOST/api/v2/jobs/:id/rescheduleReschedule jobGET/api/v2/guest-reservationsList reservationsPOST/api/v2/guest-reservationsCreate reservationGET/api/v2/guest-reservations/:idGet reservationDELETE/api/v2/guest-reservations/:idDelete reservationGET/api/v2/tasksList tasksPOST/api/v2/tasksCreate taskGET/api/v2/tasks/:idGet taskPUT/api/v2/tasks/:idUpdate taskDELETE/api/v2/tasks/:idDelete taskGET/api/v2/to-do-listsList to-do listsPOST/api/v2/prosAdd a proGET/api/v2/booking-availabilitiesCheck availability
Full interactive documentation: https://public-api.tidy.com/docs
YYYY-MM-DD (e.g., 2026-04-10)HH:MM 24-hour format (e.g., 09:00, 17:30){ "date": "2026-04-10", "time": "09:00" }All errors return:
json
{
"object": "error",
"type": "authentication_error",
"code": "ErrorCode",
"message": "Human-readable description",
"invalid_params": []
}
HTTP StatusError TypeWhen400invalid_request_errorMissing or invalid parameters401authentication_errorBad credentials or missing token404not_found_errorResource does not exist500internal_errorServer error