Tidy

v1.1.0

Full-featured AI property management — addresses, cleanings, reservations, tasks, pros, and natural language messaging.

0· 127·0 current·0 all-time

Install

OpenClaw Prompt Flow

Install with OpenClaw

Best for remote or guided setup. Copy the exact prompt, then paste it into OpenClaw for mchusma/tidy.

Previewing Install & Setup.
Prompt PreviewInstall & Setup
Install the skill "Tidy" (mchusma/tidy) from ClawHub.
Skill page: https://clawhub.ai/mchusma/tidy
Keep the work scoped to this skill only.
After install, inspect the skill metadata and help me finish setup.
Required env vars: TIDY_API_TOKEN
Required binaries: tidy-request
Use only the metadata you can verify from ClawHub; do not invent missing requirements.
Ask before making any broader environment changes.

Command Line

CLI Commands

Use the direct CLI path if you want to install manually and keep every step visible.

OpenClaw CLI

Bare skill slug

openclaw skills install tidy

ClawHub CLI

Package manager switcher

npx clawhub@latest install tidy
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Benign
high confidence
Purpose & Capability
Name/description (AI property management) matches the requested artifacts: tidy-request CLI binary and a TIDY_API_TOKEN. Required binaries and env var are appropriate for calling the TIDY REST/MCP APIs described in the SKILL.md.
Instruction Scope
Runtime instructions stay within the domain of TIDY's APIs and CLI. The SKILL.md does instruct the user to modify third-party client config (e.g., add the MCP server to Claude Desktop's config) and references storing credentials at ~/.config/tidy/credentials; modifying other app config is expected for integration but is a broader scope than purely calling an API and should be done intentionally by the user.
Install Mechanism
This is an instruction-only skill with no install spec. The docs recommend installing tidy-request via a Homebrew tap or npm -g, which is typical for a CLI; nothing in the skill attempts to download or execute arbitrary code automatically.
Credentials
Only TIDY_API_TOKEN is required, which is proportionate. However the docs state tokens do not expire and are not invalidated on re-login, and the CLI stores credentials in ~/.config/tidy/credentials by default — these are security considerations (long-lived credential, on-disk storage) the user should weigh before supplying the token.
Persistence & Privilege
The skill does not request 'always: true' or elevated privileges. It does instruct users how to add the MCP endpoint to other clients' configuration files (e.g., Claude Desktop), which is a normal integration step but modifies other applications' config and should be done explicitly by the user.
Assessment
This skill appears to do what it says: it requires the tidy-request CLI and a TIDY_API_TOKEN to call tidy.com's REST and MCP APIs. Before installing or providing a token: (1) verify you trust the tidy-request binary source (brew tap or npm package) and inspect it if possible; (2) prefer setting the TIDY_API_TOKEN as an environment variable instead of leaving credentials on disk, and be aware the docs say tokens do not expire and old tokens remain valid — rotate/revoke tokens if compromised; (3) only add the MCP endpoint to other clients (e.g., Claude Desktop) if you intend to integrate TIDY with those applications; and (4) limit the token's use to machines/users you trust. If you want a stronger assurance, ask the publisher for documentation about token scopes, revocation, and the tidy-request project's source code/release artifacts before proceeding.

Like a lobster shell, security has layers — review code before you run it.

Runtime requirements

Clawdis
OSmacOS · Linux
Binstidy-request
EnvTIDY_API_TOKEN
Primary envTIDY_API_TOKEN
latestvk970ze8rg9vbx7czvtxqars9ad83wdak
127downloads
0stars
2versions
Updated 4w ago
v1.1.0
MIT-0
macOS, Linux

TIDY — AI Property Management Platform

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

Quick Start

The fastest way to interact with TIDY is the CLI or the natural language message-tidy endpoint.

CLI Quick Start

# 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

API Quick Start

# 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"}'

Authentication

Sign Up

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"
  }'

Log In

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.

CLI Authentication

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.


MCP Server

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)

Available MCP Tools

ToolAuth RequiredDescription
loginNoAuthenticate with email/password
signupNoCreate account
message_tidyYesSend natural language request (async)
get_message_tidyYesPoll for async message result
list_messages_tidyYesList all previous messages
list_addressesYesList all managed properties
create_addressYesAdd a new property
get_addressYesGet property details
update_addressYesUpdate a property
delete_addressYesRemove a property
list_bookingsYesList cleaning jobs
create_bookingYesSchedule a cleaning
get_bookingYesGet job details
update_bookingYesModify a job
cancel_bookingYesCancel a job
reschedule_bookingYesReschedule a job
list_booking_availabilitiesYesFind available time slots
list_guest_reservationsYesList guest stays
create_guest_reservationYesCreate a guest stay
get_guest_reservationYesGet reservation details
delete_guest_reservationYesCancel a guest stay
list_tasksYesList maintenance issues
create_taskYesReport a maintenance issue
get_taskYesGet task details
update_taskYesUpdate a task
delete_taskYesRemove a task
list_to_do_listsYesList cleaning checklists
create_proYesAdd a service professional

Connect from Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "tidy": {
      "url": "https://public-api.tidy.com/mcp"
    }
  }
}

Connect from Claude Code

claude mcp add tidy --transport http https://public-api.tidy.com/mcp

Stdio Proxy (for clients that only support stdio)

npx @tidydotcom/mcp-server
npx @tidydotcom/mcp-server --api-token YOUR_TOKEN

MCP Async Workflow

message_tidy is asynchronous:

  1. Call login or signup to get a token
  2. Call message_tidy with your request in plain English
  3. Note the returned id
  4. Poll get_message_tidy with that ID every 3–5 seconds
  5. When status is completed, read response_message for the result

Message TIDY (Natural Language AI)

Send any property management request in plain English and TIDY's AI handles it.

Send a message

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 request
  • context (optional): { address_id, booking_id, issue_id, guest_reservation_id } to scope the request
  • response_schema (optional): JSON Schema describing desired structured response format

Status values: queuedin_progresscompleted or failed

Poll for result

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.

List all messages

curl -s "https://public-api.tidy.com/api/v2/message-tidy?status=completed" \
  -H "Authorization: Bearer $TIDY_API_TOKEN"

Addresses (Properties)

MethodPathDescription
GET/api/v2/addressesList all addresses
GET/api/v2/addresses/:idGet address details
POST/api/v2/addressesCreate an address
PUT/api/v2/addresses/:idUpdate an address
DELETE/api/v2/addresses/:idDelete an address

Create an address

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").


Jobs (Cleaning Bookings)

MethodPathDescription
GET/api/v2/jobsList all jobs
GET/api/v2/jobs/:idGet job details
POST/api/v2/jobsCreate a job
PUT/api/v2/jobs/:idUpdate a job
POST/api/v2/jobs/:id/cancelCancel a job
POST/api/v2/jobs/:id/rescheduleReschedule a job

Service Types

KeyDescription
regular_cleaning.one_hour1-hour regular cleaning
regular_cleaning.two_and_a_half_hours2.5-hour regular cleaning
regular_cleaning.four_hours4-hour regular cleaning
deep_cleaning.two_and_a_half_hours2.5-hour deep cleaning
deep_cleaning.four_hours4-hour deep cleaning
turnover_cleaning.two_and_a_half_hours2.5-hour turnover cleaning
turnover_cleaning.four_hours4-hour turnover cleaning

Booking Statuses

scheduledin_progresscompleted or cancelled or failed

Create a job

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.

Cancel a job

curl -X POST https://public-api.tidy.com/api/v2/jobs/456/cancel \
  -H "Authorization: Bearer $TIDY_API_TOKEN"

Reschedule a job

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" }
  }'

Booking Availability

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.


Guest Reservations

MethodPathDescription
GET/api/v2/guest-reservationsList reservations (optional address_id filter)
GET/api/v2/guest-reservations/:idGet reservation details
POST/api/v2/guest-reservationsCreate a reservation
DELETE/api/v2/guest-reservations/:idDelete a reservation

Create a reservation

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.


Tasks (Maintenance / Issues)

MethodPathDescription
GET/api/v2/tasksList tasks (filter by address_id, status, type, urgency, assigned_to_concierge)
GET/api/v2/tasks/:idGet task details
POST/api/v2/tasksCreate a task
PUT/api/v2/tasks/:idUpdate a task
DELETE/api/v2/tasks/:idDelete a task

Task Statuses

reportedin_progresscompleted

Task Urgency Levels

low, normal, high, emergency

Create a task

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.


To-Do Lists

curl -s "https://public-api.tidy.com/api/v2/to-do-lists?address_id=123" \
  -H "Authorization: Bearer $TIDY_API_TOKEN"

Service Professionals (Pros)

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.


CLI Reference

Install

brew install tidyapp/tap/tidy-request   # macOS/Linux via Homebrew
npm install -g @tidydotcom/cli          # via npm

Commands

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

Environment Variables

VariableDescriptionDefault
TIDY_API_HOSTAPI base URLhttps://public-api.tidy.com
TIDY_API_TOKENBearer token (overrides stored credentials)

Complete API Endpoint Reference

MethodPathDescription
POST/api/v2/auth/signupCreate account
POST/api/v2/auth/loginLog in
POST/api/v2/message-tidySend AI message (async)
GET/api/v2/message-tidy/:idPoll message result
GET/api/v2/message-tidyList messages
GET/api/v2/addressesList addresses
POST/api/v2/addressesCreate address
GET/api/v2/addresses/:idGet address
PUT/api/v2/addresses/:idUpdate address
DELETE/api/v2/addresses/:idDelete address
GET/api/v2/jobsList jobs
POST/api/v2/jobsCreate job
GET/api/v2/jobs/:idGet job
PUT/api/v2/jobs/:idUpdate job
POST/api/v2/jobs/:id/cancelCancel job
POST/api/v2/jobs/:id/rescheduleReschedule job
GET/api/v2/guest-reservationsList reservations
POST/api/v2/guest-reservationsCreate reservation
GET/api/v2/guest-reservations/:idGet reservation
DELETE/api/v2/guest-reservations/:idDelete reservation
GET/api/v2/tasksList tasks
POST/api/v2/tasksCreate task
GET/api/v2/tasks/:idGet task
PUT/api/v2/tasks/:idUpdate task
DELETE/api/v2/tasks/:idDelete task
GET/api/v2/to-do-listsList to-do lists
POST/api/v2/prosAdd a pro
GET/api/v2/booking-availabilitiesCheck availability

Full interactive documentation: https://public-api.tidy.com/docs


Date and Time Formats

  • Dates: YYYY-MM-DD (e.g., 2026-04-10)
  • Times: HH:MM 24-hour format (e.g., 09:00, 17:30)
  • Date-time fields use nested objects: { "date": "2026-04-10", "time": "09:00" }

Error Handling

All errors return:

{
  "object": "error",
  "type": "authentication_error",
  "code": "ErrorCode",
  "message": "Human-readable description",
  "invalid_params": []
}
HTTP StatusError TypeWhen
400invalid_request_errorMissing or invalid parameters
401authentication_errorBad credentials or missing token
404not_found_errorResource does not exist
500internal_errorServer error

Detailed Reference Documentation

Related Skills

Comments

Loading comments...