The Happy Hamper MCP
Official MCP server for The Happy Hamper laundry service in St. George, Utah. Enables AI assistants to check address availability, view pricing, and manage laundry pickups and subscriptions for authenticated users.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://www.thehappyhamper.com/mcpWhat you can do with it
- Check if laundry pickup is available at a specific address
- View subscription and one-time pickup pricing
- Book, pause, change, or cancel laundry pickups
- Manage laundry preferences and address notes
Source and maintenance
Protocol and capabilities
- Server
- com.thehappyhamper/laundry 1.0.0
- MCP protocol
- 2025-06-18
- Tools
- 19 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": true
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
19 advertised
get_service_info — What we charge and where
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.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}{
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}check_address — Check an address
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.
{
"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"
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}join_waitlist — Join the waitlist
Leave an email for an address we don't pick up at yet; we email them when we do.
{
"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"
}
}
}{
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}get_account — Their 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.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}{
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}update_profile — Change their name or phone
Change the customer's name or phone number. Needs the customer's Happy Hamper login.
{
"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"
}
}
}{
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}add_address — Add an address
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.
{
"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"
}
}
}{
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}update_address — Change an address
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.
{
"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"
}
}
}{
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}set_laundry_preferences — Set Laundry preferences
The detergent and scent every load is washed with, unless a subscription or pickup says otherwise. Needs the customer's Happy Hamper login.
{
"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"
}
}
}{
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}get_pickup_options — Pickup options at an address
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.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"addressId"
],
"properties": {
"addressId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}quote_one_time_pickup — Price a one-time pickup
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.
{
"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
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}add_card — Add a 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.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}{
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}start_subscription — Start a subscription
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.
{
"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
}
}
}{
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}book_one_time_pickup — Book a one-time pickup
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.
{
"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
}
}
}{
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}change_subscription — Change a subscription's day, address or 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.
{
"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
}
}
}{
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}update_subscription — Pause, resume, cancel or adjust a subscription
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.
{
"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
}
}
}{
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}update_pickup — Change an upcoming pickup
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.
{
"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
}
}
}{
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}cancel_pickup — Cancel a pickup
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.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"pickupId"
],
"properties": {
"pickupId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
}
}{
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}uncancel_pickup — Bring back a canceled pickup
Bring back a pickup canceled by mistake, as it was (until 1:00 AM on its day). Needs the customer's Happy Hamper login.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"pickupId"
],
"properties": {
"pickupId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
}
}{
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}list_past_pickups — Past pickups
The customer's last 20 finished pickups, newest first. Needs the customer's Happy Hamper login.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}{
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}Prompts
Not advertised
Resources
Not advertised
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 410 ms
- 95th percentile latency
- 410 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 410 ms · metadata changed · 19 tool(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http the-happy-hamper-mcp https://www.thehappyhamper.com/mcpCodex
codex mcp add the-happy-hamper-mcp --url https://www.thehappyhamper.com/mcpCursor
{
"mcpServers": {
"the-happy-hamper-mcp": {
"url": "https://www.thehappyhamper.com/mcp"
}
}
}Cline
{
"mcpServers": {
"the-happy-hamper-mcp": {
"type": "streamableHttp",
"url": "https://www.thehappyhamper.com/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"the-happy-hamper-mcp": {
"type": "http",
"url": "https://www.thehappyhamper.com/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http the-happy-hamper-mcp https://www.thehappyhamper.com/mcpClaude Desktop
{
"mcpServers": {
"the-happy-hamper-mcp": {
"url": "https://www.thehappyhamper.com/mcp"
}
}
}Windsurf
{
"mcpServers": {
"the-happy-hamper-mcp": {
"serverUrl": "https://www.thehappyhamper.com/mcp"
}
}
}Let your agent find its tools
Find servers like The Happy Hamper MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other productivity and knowledge servers
Do you run The Happy Hamper MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.