The Happy Hamper
Laundry pickup and delivery in St George, Utah: check an address, book and manage pickups.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"laundry": {
"url": "https://www.thehappyhamper.com/mcp"
}
}
}Remote endpoints
https://www.thehappyhamper.com/mcpstreamable-httpWhat it can do
Tool inventory
Tools (19)
🟢get_service_info
The areas we pick up in, the current prices (in cents, before tax) and the subscriber discount, and the first day a pickup can be booked.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢check_address(line1, city, state, postalCode)
Whether we pick up at an address, and if we do, its pickup options: each day and how often (every week or every other week), the first pickup, when it comes back, and the prices with any subscriber discount.
Input Schema
{
"type": "object",
"properties": {
"line1": {
"type": "string",
"description": "Street address, e.g. 123 Main St"
},
"city": {
"type": "string"
},
"state": {
"type": "string",
"description": "e.g. UT"
},
"postalCode": {
"type": "string",
"description": "ZIP code"
}
},
"required": [
"line1",
"city",
"state",
"postalCode"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}⚪join_waitlist(email, line1, city, state, postalCode)
Leave an email for an address we don't pick up at yet; we email them when we do.
Input Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"line1": {
"type": "string",
"description": "Street address, e.g. 123 Main St"
},
"city": {
"type": "string"
},
"state": {
"type": "string",
"description": "e.g. UT"
},
"postalCode": {
"type": "string",
"description": "ZIP code"
}
},
"required": [
"email",
"line1",
"city",
"state",
"postalCode"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢get_account
The customer's profile, addresses (with their ids), Laundry preferences, whether a card is saved, subscriptions and one-time bookings, and upcoming pickups. Needs the customer's Happy Hamper login.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡update_profile(name, phone)
Change the customer's name or phone number. Needs the customer's Happy Hamper login.
Input Schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"phone": {
"description": "A US phone number",
"type": "string",
"maxLength": 40
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡add_address(line1, city, state, postalCode, line2, ...)
Save a pickup or dropoff address. The reply's serviceZoneId is null when we don't pick up there. Needs the customer's Happy Hamper login.
Input Schema
{
"type": "object",
"properties": {
"line1": {
"type": "string",
"description": "Street address, e.g. 123 Main St"
},
"city": {
"type": "string"
},
"state": {
"type": "string",
"description": "e.g. UT"
},
"postalCode": {
"type": "string",
"description": "ZIP code"
},
"line2": {
"description": "Apartment or unit",
"type": "string",
"maxLength": 200
},
"label": {
"description": "e.g. \"Home\"",
"type": "string",
"maxLength": 120
},
"note": {
"description": "Address notes: a gate code, where the bags will be, where to leave the clean laundry",
"type": "string",
"maxLength": 500
}
},
"required": [
"line1",
"city",
"state",
"postalCode"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡update_address(addressId, label, note, line1, line2, ...)
Change an address's label or Address notes, or its street (only until a pickup has been booked there). Needs the customer's Happy Hamper login.
Input Schema
{
"type": "object",
"properties": {
"addressId": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"label": {
"anyOf": [
{
"type": "string",
"maxLength": 120
},
{
"type": "null"
}
]
},
"note": {
"description": "Address notes",
"anyOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "null"
}
]
},
"line1": {
"type": "string"
},
"line2": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"postalCode": {
"type": "string"
}
},
"required": [
"addressId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡set_laundry_preferences(detergent, scent)
The detergent and scent every load is washed with, unless a subscription or pickup says otherwise. Needs the customer's Happy Hamper login.
Input Schema
{
"type": "object",
"properties": {
"detergent": {
"type": "string",
"enum": [
"regular",
"athletic",
"free_clear"
],
"description": "free_clear is fragrance-free, and takes no scent"
},
"scent": {
"anyOf": [
{
"type": "string",
"enum": [
"fresh_linen",
"island_breeze",
"amberwood",
"warm_vanilla"
]
},
{
"type": "null"
}
],
"description": "null = unscented"
}
},
"required": [
"detergent",
"scent"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢get_pickup_options(addressId)
The subscriptions the customer can start at one of their addresses: each option's serviceZoneScheduleId, day, how often, first pickup (nextDate), when it comes back (backDate), and prices with their discount. Needs the customer's Happy Hamper login.
Input Schema
{
"type": "object",
"properties": {
"addressId": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"addressId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢quote_one_time_pickup(addressId, date)
What a one-time pickup at one of their addresses would cost on a date, whether that date can be booked, and when it would come back. Needs the customer's Happy Hamper login.
Input Schema
{
"type": "object",
"properties": {
"addressId": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"date": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "YYYY-MM-DD"
}
},
"required": [
"addressId",
"date"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢add_card
A link where the customer adds their card on our site; booking needs one. You can't take card details yourself. Needs the customer's Happy Hamper login.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢start_subscription(addressId, dropoffAddressId, serviceZoneScheduleId, bags, bagCount, ...)
Regular pickups on an option from get_pickup_options. Get the customer's go-ahead on the day and price first. Needs the customer's Happy Hamper login.
Input Schema
{
"type": "object",
"properties": {
"addressId": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Pickup address"
},
"dropoffAddressId": {
"description": "Where it comes back; the pickup address if left out",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"serviceZoneScheduleId": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"bags": {
"anyOf": [
{
"type": "number",
"const": 1
},
{
"type": "number",
"const": 2
}
],
"description": "Bags each pickup is booked with: 1 or 2 (the 1-bag or 2-bag price)"
},
"bagCount": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"description": "Bags every pickup has, extra ones included (extras cost more)"
},
"discountCode": {
"type": "string",
"maxLength": 30
}
},
"required": [
"addressId",
"serviceZoneScheduleId",
"bags"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢book_one_time_pickup(addressId, dropoffAddressId, date, bags, express, ...)
One pickup on a date (check it with quote_one_time_pickup first). Get the customer's go-ahead on the price first. Needs the customer's Happy Hamper login.
Input Schema
{
"type": "object",
"properties": {
"addressId": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Pickup address"
},
"dropoffAddressId": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"date": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "YYYY-MM-DD"
},
"bags": {
"anyOf": [
{
"type": "number",
"const": 1
},
{
"type": "number",
"const": 2
}
],
"description": "Bags each pickup is booked with: 1 or 2 (the 1-bag or 2-bag price)"
},
"express": {
"description": "24-hour turnaround, for a fee",
"type": "boolean"
},
"discountCode": {
"type": "string",
"maxLength": 30
}
},
"required": [
"addressId",
"date",
"bags"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡change_subscription(subscriptionId, serviceZoneScheduleId, addressId, dropoffAddressId, bags)
Moves a subscription to another option, address or number of bags: it starts again, with its pickups booked right away, each at the price for its date. Needs the customer's Happy Hamper login.
Input Schema
{
"type": "object",
"properties": {
"subscriptionId": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"serviceZoneScheduleId": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"addressId": {
"description": "New pickup address",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"dropoffAddressId": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"bags": {
"anyOf": [
{
"type": "number",
"const": 1
},
{
"type": "number",
"const": 2
}
],
"description": "Bags each pickup is booked with: 1 or 2 (the 1-bag or 2-bag price)"
}
},
"required": [
"subscriptionId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴update_subscription(subscriptionId, action, pausedUntil, cancelReason, bagCount, ...)
Pause (until a date, or until resumed), resume or cancel a subscription, or change its bag count, Job notes, or detergent and scent. Canceling also cancels its upcoming pickups. Needs the customer's Happy Hamper login.
Input Schema
{
"type": "object",
"properties": {
"subscriptionId": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"action": {
"type": "string",
"enum": [
"pause",
"resume",
"cancel"
]
},
"pausedUntil": {
"description": "With pause: pickups start again on this date (YYYY-MM-DD)",
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"cancelReason": {
"type": "string",
"maxLength": 500
},
"bagCount": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"description": "Bags every pickup has, extra ones included (extras cost more)"
},
"jobNotes": {
"description": "Job notes for every pickup; blank clears them",
"anyOf": [
{
"type": "string",
"maxLength": 280
},
{
"type": "null"
}
]
},
"wash": {
"anyOf": [
{
"type": "object",
"properties": {
"detergent": {
"type": "string",
"enum": [
"regular",
"athletic",
"free_clear"
],
"description": "free_clear is fragrance-free, and takes no scent"
},
"scent": {
"anyOf": [
{
"type": "string",
"enum": [
"fresh_linen",
"island_breeze",
"amberwood",
"warm_vanilla"
]
},
{
"type": "null"
}
],
"description": "null = unscented"
}
},
"required": [
"detergent",
"scent"
]
},
{
"type": "null"
}
],
"description": "Detergent and scent; null goes back to their Laundry preferences"
}
},
"required": [
"subscriptionId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡update_pickup(pickupId, bagCount, jobNotes, express, wash)
Change one upcoming pickup before we collect it: its bag count, Job notes, 24-hour turnaround, or detergent and scent. Needs the customer's Happy Hamper login.
Input Schema
{
"type": "object",
"properties": {
"pickupId": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"bagCount": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"description": "Bags every pickup has, extra ones included (extras cost more)"
},
"jobNotes": {
"anyOf": [
{
"type": "string",
"maxLength": 280
},
{
"type": "null"
}
]
},
"express": {
"description": "24-hour turnaround, for a fee",
"type": "boolean"
},
"wash": {
"anyOf": [
{
"type": "object",
"properties": {
"detergent": {
"type": "string",
"enum": [
"regular",
"athletic",
"free_clear"
],
"description": "free_clear is fragrance-free, and takes no scent"
},
"scent": {
"anyOf": [
{
"type": "string",
"enum": [
"fresh_linen",
"island_breeze",
"amberwood",
"warm_vanilla"
]
},
{
"type": "null"
}
],
"description": "null = unscented"
}
},
"required": [
"detergent",
"scent"
]
},
{
"type": "null"
}
],
"description": "Detergent and scent; null goes back to their Laundry preferences"
}
},
"required": [
"pickupId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴cancel_pickup(pickupId)
Cancel one upcoming pickup (a subscription carries on). Before 8:00 AM on the day, nothing is charged. Needs the customer's Happy Hamper login.
Input Schema
{
"type": "object",
"properties": {
"pickupId": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"pickupId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}⚪uncancel_pickup(pickupId)
Bring back a pickup canceled by mistake, as it was (until 1:00 AM on its day). Needs the customer's Happy Hamper login.
Input Schema
{
"type": "object",
"properties": {
"pickupId": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"pickupId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢list_past_pickups
The customer's last 20 finished pickups, newest first. Needs the customer's Happy Hamper login.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence