Laundry pickup and delivery in St George, Utah: check an address, book and manage pickups.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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.
Street address, e.g. 123 Main St
e.g. UT
ZIP code
Address notes: a gate code, where the bags will be, where to leave the clean laundry
e.g. "Home"
Apartment or unit
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http laundry https://www.thehappyhamper.com/mcp
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.
| Argument | Type | Description |
|---|---|---|
| city* | string | |
| note | string | Address notes: a gate code, where the bags will be, where to leave the clean laundry |
| label | string | e.g. "Home" |
| line1* | string | Street address, e.g. 123 Main St |
| line2 | string | Apartment or unit |
| state* | string | e.g. UT |
| postalCode* | string | ZIP code |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"line1",
"city",
"state",
"postalCode"
],
"properties": {
"city": {
"type": "string"
},
"note": {
"type": "string",
"maxLength": 500,
"description": "Address notes: a gate code, where the bags will be, where to leave the clean laundry"
},
"label": {
"type": "string",
"maxLength": 120,
"description": "e.g. \"Home\""
},
"line1": {
"type": "string",
"description": "Street address, e.g. 123 Main St"
},
"line2": {
"type": "string",
"maxLength": 200,
"description": "Apartment or unit"
},
"state": {
"type": "string",
"description": "e.g. UT"
},
"postalCode": {
"type": "string",
"description": "ZIP code"
}
}
}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.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}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.
| Argument | Type | Description |
|---|---|---|
| bags* | any | Bags each pickup is booked with: 1 or 2 (the 1-bag or 2-bag price) |
| date* | string | YYYY-MM-DD |
| express | boolean | 24-hour turnaround, for a fee |
| addressId* | integer | Pickup address |
| discountCode | string | |
| dropoffAddressId | integer |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"addressId",
"date",
"bags"
],
"properties": {
"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)"
},
"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"
},
"express": {
"type": "boolean",
"description": "24-hour turnaround, for a fee"
},
"addressId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Pickup address"
},
"discountCode": {
"type": "string",
"maxLength": 30
},
"dropoffAddressId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| pickupId* | integer |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"pickupId"
],
"properties": {
"pickupId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
}
}Moves a subscription to another option, address or number of bags: it starts again at the current price, with its pickups booked right away. Needs the customer's Happy Hamper login.
| Argument | Type | Description |
|---|---|---|
| bags | any | Bags each pickup is booked with: 1 or 2 (the 1-bag or 2-bag price) |
| addressId | integer | New pickup address |
| subscriptionId* | integer | |
| dropoffAddressId | integer | |
| serviceZoneScheduleId | integer |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"subscriptionId"
],
"properties": {
"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)"
},
"addressId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "New pickup address"
},
"subscriptionId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"dropoffAddressId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"serviceZoneScheduleId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| city* | string | |
| line1* | string | Street address, e.g. 123 Main St |
| state* | string | e.g. UT |
| postalCode* | string | ZIP code |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"line1",
"city",
"state",
"postalCode"
],
"properties": {
"city": {
"type": "string"
},
"line1": {
"type": "string",
"description": "Street address, e.g. 123 Main St"
},
"state": {
"type": "string",
"description": "e.g. UT"
},
"postalCode": {
"type": "string",
"description": "ZIP code"
}
}
}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.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}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.
| Argument | Type | Description |
|---|---|---|
| addressId* | integer |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"addressId"
],
"properties": {
"addressId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
}
}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.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Leave an email for an address we don't pick up at yet; we email them when we do.
| Argument | Type | Description |
|---|---|---|
| city* | string | |
| email* | string | |
| line1* | string | Street address, e.g. 123 Main St |
| state* | string | e.g. UT |
| postalCode* | string | ZIP code |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"email",
"line1",
"city",
"state",
"postalCode"
],
"properties": {
"city": {
"type": "string"
},
"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"
},
"state": {
"type": "string",
"description": "e.g. UT"
},
"postalCode": {
"type": "string",
"description": "ZIP code"
}
}
}The customer's last 20 finished pickups, newest first. Needs the customer's Happy Hamper login.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}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.
| Argument | Type | Description |
|---|---|---|
| date* | string | YYYY-MM-DD |
| addressId* | integer |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"addressId",
"date"
],
"properties": {
"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"
},
"addressId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
}
}The detergent and scent every load is washed with, unless a subscription or pickup says otherwise. Needs the customer's Happy Hamper login.
| Argument | Type | Description |
|---|---|---|
| scent* | any | null = unscented |
| detergent* | string | free_clear is fragrance-free, and takes no scent |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"detergent",
"scent"
],
"properties": {
"scent": {
"anyOf": [
{
"enum": [
"fresh_linen",
"island_breeze",
"amberwood",
"warm_vanilla"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "null = unscented"
},
"detergent": {
"enum": [
"regular",
"athletic",
"free_clear"
],
"type": "string",
"description": "free_clear is fragrance-free, and takes no scent"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| bags* | any | Bags each pickup is booked with: 1 or 2 (the 1-bag or 2-bag price) |
| bagCount | integer | Bags every pickup has, extra ones included (extras cost more) |
| addressId* | integer | Pickup address |
| discountCode | string | |
| dropoffAddressId | integer | Where it comes back; the pickup address if left out |
| serviceZoneScheduleId* | integer |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"addressId",
"serviceZoneScheduleId",
"bags"
],
"properties": {
"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",
"maximum": 20,
"minimum": 1,
"description": "Bags every pickup has, extra ones included (extras cost more)"
},
"addressId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Pickup address"
},
"discountCode": {
"type": "string",
"maxLength": 30
},
"dropoffAddressId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Where it comes back; the pickup address if left out"
},
"serviceZoneScheduleId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
}
}Bring back a pickup canceled by mistake, as it was (until 1:00 AM on its day). Needs the customer's Happy Hamper login.
| Argument | Type | Description |
|---|---|---|
| pickupId* | integer |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"pickupId"
],
"properties": {
"pickupId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| city | string | |
| note | any | Address notes |
| label | any | |
| line1 | string | |
| line2 | any | |
| state | string | |
| addressId* | integer | |
| postalCode | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"addressId"
],
"properties": {
"city": {
"type": "string"
},
"note": {
"anyOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "null"
}
],
"description": "Address notes"
},
"label": {
"anyOf": [
{
"type": "string",
"maxLength": 120
},
{
"type": "null"
}
]
},
"line1": {
"type": "string"
},
"line2": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"state": {
"type": "string"
},
"addressId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"postalCode": {
"type": "string"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| wash | any | Detergent and scent; null goes back to their Laundry preferences |
| express | boolean | 24-hour turnaround, for a fee |
| bagCount | integer | Bags every pickup has, extra ones included (extras cost more) |
| jobNotes | any | |
| pickupId* | integer |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"pickupId"
],
"properties": {
"wash": {
"anyOf": [
{
"type": "object",
"required": [
"detergent",
"scent"
],
"properties": {
"scent": {
"anyOf": [
{
"enum": [
"fresh_linen",
"island_breeze",
"amberwood",
"warm_vanilla"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "null = unscented"
},
"detergent": {
"enum": [
"regular",
"athletic",
"free_clear"
],
"type": "string",
"description": "free_clear is fragrance-free, and takes no scent"
}
}
},
{
"type": "null"
}
],
"description": "Detergent and scent; null goes back to their Laundry preferences"
},
"express": {
"type": "boolean",
"description": "24-hour turnaround, for a fee"
},
"bagCount": {
"type": "integer",
"maximum": 20,
"minimum": 1,
"description": "Bags every pickup has, extra ones included (extras cost more)"
},
"jobNotes": {
"anyOf": [
{
"type": "string",
"maxLength": 280
},
{
"type": "null"
}
]
},
"pickupId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
}
}Change the customer's name or phone number. Needs the customer's Happy Hamper login.
| Argument | Type | Description |
|---|---|---|
| name | string | |
| phone | string | A US phone number |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"phone": {
"type": "string",
"maxLength": 40,
"description": "A US phone number"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| wash | any | Detergent and scent; null goes back to their Laundry preferences |
| action | string | |
| bagCount | integer | Bags every pickup has, extra ones included (extras cost more) |
| jobNotes | any | Job notes for every pickup; blank clears them |
| pausedUntil | string | With pause: pickups start again on this date (YYYY-MM-DD) |
| cancelReason | string | |
| subscriptionId* | integer |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"subscriptionId"
],
"properties": {
"wash": {
"anyOf": [
{
"type": "object",
"required": [
"detergent",
"scent"
],
"properties": {
"scent": {
"anyOf": [
{
"enum": [
"fresh_linen",
"island_breeze",
"amberwood",
"warm_vanilla"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "null = unscented"
},
"detergent": {
"enum": [
"regular",
"athletic",
"free_clear"
],
"type": "string",
"description": "free_clear is fragrance-free, and takes no scent"
}
}
},
{
"type": "null"
}
],
"description": "Detergent and scent; null goes back to their Laundry preferences"
},
"action": {
"enum": [
"pause",
"resume",
"cancel"
],
"type": "string"
},
"bagCount": {
"type": "integer",
"maximum": 20,
"minimum": 1,
"description": "Bags every pickup has, extra ones included (extras cost more)"
},
"jobNotes": {
"anyOf": [
{
"type": "string",
"maxLength": 280
},
{
"type": "null"
}
],
"description": "Job notes for every pickup; blank clears them"
},
"pausedUntil": {
"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": "With pause: pickups start again on this date (YYYY-MM-DD)"
},
"cancelReason": {
"type": "string",
"maxLength": 500
},
"subscriptionId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Oct 31, 2026.