Find and book local service businesses (plumbers, HVAC, detailers) at real prices, with approval.
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.
Use only after the customer explicitly approves the total / quote / final price. Sends it to the business. When offered_slots is present, pass the customer's chosen slot_start. If the business takes online payment, the result is status awaiting_payment with a payment_url: give that link to the customer; they pay on that page themselves.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Use only after the customer explicitly approves the total / quote / final price. Sends it to the business. When offered_slots is present, pass the customer's chosen slot_start. If the business takes online payment, the result is status awaiting_payment with a payment_url: give that link to the customer; they pay on that page themselves.
| Argument | Type | Description |
|---|---|---|
| ref* | string | |
| slot_start | string | |
| customer_token* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ref",
"customer_token"
],
"properties": {
"ref": {
"type": "string"
},
"slot_start": {
"type": "string"
},
"customer_token": {
"type": "string"
}
}
}Book a flat-rate service (e.g. drain cleaning) into a slot from get_availability. Returns a draft awaiting the customer's approval.
| Argument | Type | Description |
|---|---|---|
| slug* | string | |
| notes | string | |
| customer* | object | Who the job/order is for. Use what the customer already gave you; ask only for what a tool says is missing. |
| slot_start* | string | ISO start from get_availability |
| service_sku* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug",
"service_sku",
"slot_start",
"customer"
],
"properties": {
"slug": {
"type": "string"
},
"notes": {
"type": "string"
},
"customer": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"email": {
"type": "string"
},
"notes": {
"type": "string"
},
"phone": {
"type": "string"
},
"address": {
"type": "object",
"required": [
"line1",
"zip"
],
"properties": {
"zip": {
"type": "string"
},
"city": {
"type": "string"
},
"line1": {
"type": "string"
},
"line2": {
"type": "string"
},
"state": {
"type": "string"
}
}
}
},
"description": "Who the job/order is for. Use what the customer already gave you; ask only for what a tool says is missing."
},
"slot_start": {
"type": "string",
"description": "ISO start from get_availability"
},
"service_sku": {
"type": "string"
}
}
}Cancel an order, quote or booking on the customer's behalf.
| Argument | Type | Description |
|---|---|---|
| ref* | string | |
| reason | string | |
| customer_token* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ref",
"customer_token"
],
"properties": {
"ref": {
"type": "string"
},
"reason": {
"type": "string"
},
"customer_token": {
"type": "string"
}
}
}Deterministic yes/no: does this business come to the customer's zip? Returns reason, the zips it serves, excluded zips, and alternative businesses when no.
| Argument | Type | Description |
|---|---|---|
| zip* | string | Customer's 5-digit zip |
| slug* | string | |
| emergency | boolean |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug",
"zip"
],
"properties": {
"zip": {
"type": "string",
"description": "Customer's 5-digit zip"
},
"slug": {
"type": "string"
},
"emergency": {
"type": "boolean"
}
}
}Live bookable windows over the next days, from the business's own schedule (hours, crew, jobs, holds, blocks). Pass service_sku to get windows sized for that service's duration and crew, plus: operating_state (open | closed | open_fully_booked | emergency_only | temporarily_unavailable | booking_future | unknown), confidence (verified | stale, with a note when not verified recently), earliest, the service's price and whether it auto-books or needs the owner. Use a slot's start with place_service_request or book_slot; the slot is held the moment the draft is created.
| Argument | Type | Description |
|---|---|---|
| date | string | YYYY-MM-DD to start from |
| days | number | 1 to 14, default 5 |
| slug* | string | |
| service_sku | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug"
],
"properties": {
"date": {
"type": "string",
"description": "YYYY-MM-DD to start from"
},
"days": {
"type": "number",
"description": "1 to 14, default 5"
},
"slug": {
"type": "string"
},
"service_sku": {
"type": "string"
}
}
}Full agent-readable profile: verified identity and license, services with real prices (what's included / excluded), hours, service zips, delivery rules, policies, and exactly how to act (order, quote, or book).
| Argument | Type | Description |
|---|---|---|
| slug* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string"
}
}
}Current status, ETA / arrival window, business response, and the next step. Poll this while waiting on a business.
| Argument | Type | Description |
|---|---|---|
| ref* | string | |
| customer_token* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ref",
"customer_token"
],
"properties": {
"ref": {
"type": "string"
},
"customer_token": {
"type": "string"
}
}
}Before creating a request: the exact questions to ask the customer for this service (required_fields / optional_fields, each with type and options), the pricing flow, and what happens next.
| Argument | Type | Description |
|---|---|---|
| slug* | string | |
| service_sku* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug",
"service_sku"
],
"properties": {
"slug": {
"type": "string"
},
"service_sku": {
"type": "string"
}
}
}The business's services with pricing mode (fixed | starting_at | range | diagnostic_fee_then_quote | quote_required), price, what's included/excluded, and which intake fields are required.
| Argument | Type | Description |
|---|---|---|
| slug* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string"
}
}
}Draft an order (food/retail). Returns line items, total, a ref and a customer_token. Nothing reaches the business until approve_request. Ask the customer to confirm the total first.
| Argument | Type | Description |
|---|---|---|
| slug* | string | |
| items* | array | |
| customer* | object | Who the job/order is for. Use what the customer already gave you; ask only for what a tool says is missing. |
| fulfillment* | string | |
| requested_time | string | ISO datetime; omit for ASAP |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug",
"items",
"fulfillment",
"customer"
],
"properties": {
"slug": {
"type": "string"
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"sku"
],
"properties": {
"qty": {
"type": "number"
},
"sku": {
"type": "string"
},
"size": {
"type": "string",
"description": "option id from the menu, e.g. 16oz"
},
"notes": {
"type": "string"
},
"add_ons": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"minItems": 1
},
"customer": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"email": {
"type": "string"
},
"notes": {
"type": "string"
},
"phone": {
"type": "string"
},
"address": {
"type": "object",
"required": [
"line1",
"zip"
],
"properties": {
"zip": {
"type": "string"
},
"city": {
"type": "string"
},
"line1": {
"type": "string"
},
"line2": {
"type": "string"
},
"state": {
"type": "string"
}
}
}
},
"description": "Who the job/order is for. Use what the customer already gave you; ask only for what a tool says is missing."
},
"fulfillment": {
"enum": [
"pickup",
"delivery"
],
"type": "string"
},
"requested_time": {
"type": "string",
"description": "ISO datetime; omit for ASAP"
}
}
}One call for any trade job (repair, quote, booking). Pass service_sku (or a plain description and it matches one), intake_answers keyed by the field ids from get_service_requirements, customer (name, phone, address with line1+zip), preferred_time, and slot_start only when the service flow asks for one. For an unchanged retry after receiving a receipt, include retry_ref and its customer_token with the original details. For quote-first requests without a slot, optionally generate and securely save intent_capability before the first submission; explicitly repeat the same business/details/capability to recover a lost first receipt. Do not silently resubmit. Without either capability this creates a separate request, even if the phone matches. A quote_required request is sent to the business without a price; a priced booking draft waits for the customer's approval. Follow the returned next_step, and never call a request booked until the business confirms.
| Argument | Type | Description |
|---|---|---|
| slug* | string | |
| notes | string | |
| photos | array | URLs (use upload_photo to turn an image into a URL) |
| urgency | string | |
| customer* | object | Who the job/order is for. Use what the customer already gave you; ask only for what a tool says is missing. |
| retry_ref | string | Existing request reference for an unchanged retry; requires customer_token. A phone number never authorizes a retry. |
Ask a service business (plumber, etc.) for a price. Describe the problem in plain English. Many businesses answer instantly with an estimate and bookable slots; others reply within their stated response time (poll get_request_status).
| Argument | Type | Description |
|---|---|---|
| slug* | string | |
| photos | array | URLs |
| urgency | string | |
| customer* | object | Who the job/order is for. Use what the customer already gave you; ask only for what a tool says is missing. |
| description* | string | What's wrong, in the customer's words |
| service_sku | string | If the profile's service list clearly matches |
| preferred_times | array |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug",
"description",
"customer"
],
"properties": {
"slug": {
"type": "string"
},
"photos": {
"type": "array",
"items": {
"type": "string"
},
"description": "URLs"
},
"urgency": {
"enum": [
"emergency",
"today",
"this_week",
"flexible"
],
"type": "string"
},
"customer": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"email": {
"type": "string"
},
"notes": {
"type": "string"
},
"phone": {
"type": "string"
},
"address": {
"type": "object",
"required": [
"line1",
"zip"
],
"properties": {
"zip": {
"type": "string"
},
"city": {
"type": "string"
},
"line1": {
"type": "string"
},
"line2": {
"type": "string"
},
"state": {
"type": "string"
}
}
}
},
"description": "Who the job/order is for. Use what the customer already gave you; ask only for what a tool says is missing."
},
"description": {
"type": "string",
"description": "What's wrong, in the customer's words"
},
"service_sku": {
"type": "string",
"description": "If the profile's service list clearly matches"
},
"preferred_times": {
"type": "array",
"items": {
"type": "string"
}
}
}
}Find businesses in the network by what the customer needs (e.g. 'plumber', 'smoothie', 'clogged sink'), optionally filtered by category, zip, location and open-now. Returns summaries with starting prices and whether they serve the zip.
| Argument | Type | Description |
|---|---|---|
| q | string | Free text: the need, a service, or a business name |
| lat | number | |
| lng | number | |
| zip | string | Customer's 5-digit zip; results show serves_your_zip |
| accepts | string | Only businesses that support this action |
| category | string | e.g. plumber, smoothies |
| open_now | boolean |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"q": {
"type": "string",
"description": "Free text: the need, a service, or a business name"
},
"lat": {
"type": "number"
},
"lng": {
"type": "number"
},
"zip": {
"type": "string",
"description": "Customer's 5-digit zip; results show serves_your_zip"
},
"accepts": {
"enum": [
"order",
"quote",
"booking"
],
"type": "string",
"description": "Only businesses that support this action"
},
"category": {
"type": "string",
"description": "e.g. plumber, smoothies"
},
"open_now": {
"type": "boolean"
}
}
}Stores an image and returns a URL to pass in photos[] of place_service_request. Some services require a photo (get_service_requirements says which).
| Argument | Type | Description |
|---|---|---|
| media_type | string | image/jpeg (default), image/png, image/webp, image/heic |
| image_base64* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"image_base64"
],
"properties": {
"media_type": {
"type": "string",
"description": "image/jpeg (default), image/png, image/webp, image/heic"
},
"image_base64": {
"type": "string"
}
}
}| slot_start | string | ISO start from get_availability |
| description | string | The problem in the customer's words; used to match a service if service_sku is omitted |
| referred_by | string | Slug of the business whose error response listed this one under referrals[] (its trusted partner). Lets both businesses see the referral. |
| service_sku | string |
| customer_token | string | Customer token returned with retry_ref; only for an unchanged retry of that request. |
| intake_answers | object |
| preferred_time | string | e.g. 'Tomorrow morning' or an ISO datetime |
| intent_capability | string | Optional secret 32-byte random client capability, encoded as lowercase hex. Save before sending a quote-first request without a slot; explicitly repeat unchanged details with the same capability to recover a lost first receipt. Never combine with retry_ref/customer_token; never silently resubmit. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug",
"customer"
],
"properties": {
"slug": {
"type": "string"
},
"notes": {
"type": "string"
},
"photos": {
"type": "array",
"items": {
"type": "string"
},
"description": "URLs (use upload_photo to turn an image into a URL)"
},
"urgency": {
"enum": [
"emergency",
"today",
"this_week",
"flexible"
],
"type": "string"
},
"customer": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"email": {
"type": "string"
},
"notes": {
"type": "string"
},
"phone": {
"type": "string"
},
"address": {
"type": "object",
"required": [
"line1",
"zip"
],
"properties": {
"zip": {
"type": "string"
},
"city": {
"type": "string"
},
"line1": {
"type": "string"
},
"line2": {
"type": "string"
},
"state": {
"type": "string"
}
}
}
},
"description": "Who the job/order is for. Use what the customer already gave you; ask only for what a tool says is missing."
},
"retry_ref": {
"type": "string",
"description": "Existing request reference for an unchanged retry; requires customer_token. A phone number never authorizes a retry."
},
"slot_start": {
"type": "string",
"description": "ISO start from get_availability"
},
"description": {
"type": "string",
"description": "The problem in the customer's words; used to match a service if service_sku is omitted"
},
"referred_by": {
"type": "string",
"description": "Slug of the business whose error response listed this one under referrals[] (its trusted partner). Lets both businesses see the referral."
},
"service_sku": {
"type": "string"
},
"customer_token": {
"type": "string",
"description": "Customer token returned with retry_ref; only for an unchanged retry of that request."
},
"intake_answers": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"preferred_time": {
"type": "string",
"description": "e.g. 'Tomorrow morning' or an ISO datetime"
},
"intent_capability": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"description": "Optional secret 32-byte random client capability, encoded as lowercase hex. Save before sending a quote-first request without a slot; explicitly repeat unchanged details with the same capability to recover a lost first receipt. Never combine with retry_ref/customer_token; never silently resubmit."
}
}
}