Turn a quote into a link the customer approves online. Free, no account.
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.
Cancel a Quote Link so the customer can no longer approve it: the customer link then says the quote was cancelled. Call it only when the user clearly asks to cancel or withdraw the quote. To change prices or options instead, use revise_quote_link. There is no tool to undo a cancel. The answers and versions so far are kept. Needs the quote's manage_token (the code after # in the private link https://www.workeey.com/q/m/#…; the whole private link is accepted too).
The quote's private manage token: the long code after # in the private link (https://www.workeey.com/q/m/#<token>), returned as manage_token by create_quote_link. The whole private link is accepted too. Required, unless your MCP client already sends it as an Authorization: Bearer header.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http quote-links https://www.workeey.com/api/mcp
Cancel a Quote Link so the customer can no longer approve it: the customer link then says the quote was cancelled. Call it only when the user clearly asks to cancel or withdraw the quote. To change prices or options instead, use revise_quote_link. There is no tool to undo a cancel. The answers and versions so far are kept. Needs the quote's manage_token (the code after # in the private link https://www.workeey.com/q/m/#…; the whole private link is accepted too).
| Argument | Type | Description |
|---|---|---|
| manage_token | string | The quote's private manage token: the long code after # in the private link (https://www.workeey.com/q/m/#<token>), returned as manage_token by create_quote_link. The whole private link is accepted too. Required, unless your MCP client already sends it as an Authorization: Bearer header. |
{
"type": "object",
"properties": {
"manage_token": {
"type": "string",
"maxLength": 400,
"minLength": 20,
"description": "The quote's private manage token: the long code after # in the private link (https://www.workeey.com/q/m/#<token>), returned as manage_token by create_quote_link. The whole private link is accepted too. Required, unless your MCP client already sends it as an Authorization: Bearer header."
}
},
"additionalProperties": false
}Create a Quote Link: a web page where the user's customer sees a quote for a job, picks one of up to 4 options and any add-ons, types their name, and approves, declines or asks for changes. Free; nobody needs an account. For a tradesperson or small service business who wants to send a customer a quote or estimate they can approve online. Call it ONLY when the user asks you to publish the quote for them: the page is live the moment it is created. Otherwise give the user a ready-made link, which publishes nothing (price_check's draft_link, or https://www.workeey.com/quote-links/new#draft= followed by the quote JSON passed through encodeURIComponent): they open it, check the quote and press Create approval link themselves. Before calling: use only prices the user gave you, or a starting price from price_check, shown with its sources, that they agreed to (never invent or guess one; ask), and confirm the details with the user, because the page is live as soon as it is created (it can be revised or cancelled later). Rules for every text field: no links or web addresses, no email addresses (only business.email), and no payment details (Zelle, Venmo, Cash App, PayPal, bank, card or account numbers, crypto); the user sends payment details to the customer themselves. customer.name is a display name only, such as "Dana": never the customer's phone, email or address. Returns customer_url, manage_url and manage_token. Give the customer_url to the user to send to their customer. Give the manage_url to the user only, and tell them to save it: it works like a password (it shows the customer's answer and can revise or cancel the quote), so it never goes to the customer. Keep manage_token for get_quote_status, revise_quote_link and cancel_quote_link. If the call returns errors, each one names the field, the problem and the fix: apply every fix and call again. Workeey adds up the totals; tax is applied only as supplied (a rate, an amount or a note). Workeey does not verify businesses or quotes. Quote Links is not the estimates feature inside the Workeey app. Full guide: https://www.workeey.com/quote-links/for-ai/
| Argument | Type | Description |
|---|---|---|
| tax | object | Optional. Tax exactly as the user supplies it: Workeey never decides tax rules. Send ONE of rate_percent (applied to the chosen option plus the chosen add-ons), amount (a fixed tax amount) or note (for example "Tax not included"). Leave tax out if the user gave no tax information. |
| notes | string | Optional. Anything else the customer should know: what is included, timing, access. No links, email addresses or payment details (Zelle, Venmo, Cash App, PayPal, bank or card numbers, crypto). |
| terms | string | Optional. The business's terms, such as warranty or cancellation. No links, email addresses or payment details (Zelle, Venmo, Cash App, PayPal, bank or card numbers, crypto). |
| title* | string | The job, in a few words. |
| addons | array | Optional. Extras the customer can tick on top of the option they pick (up to 10). |
| source | object | Optional. Which AI app is making this quote. Recorded as an unverified claim and never shown to the customer. |
| deposit | object | Optional. Deposit wording shown on the quote: percent OR amount, and an optional note. Text only: Workeey takes no payments. |
| options* | array | The choices the customer picks between: 1 to 4 options (for example Standard and Premium), each priced on its own. A quote with a single price has one option. Workeey adds up every option, so send no totals. |
| business* |
See where a Quote Link stands: its status, how often the customer page was opened, and every answer the customer gave (approve, decline or changes; the option and add-ons picked, the amount, the name they typed, the time, and which version of the quote it answered, with any message), plus every version of the quote, the date it is valid until, and the customer_url. Read-only. Status is one of open, approved, declined, changes_requested, expired, cancelled or disabled. Needs the quote's manage_token (from create_quote_link, or the code after # in the private link https://www.workeey.com/q/m/#…; the whole private link is accepted too). An answer names its option by index from 0; option_name and addon_names give the names from the version that was answered. Report what you find to the user only: the manage token and private link never go to the customer. To change the quote, call revise_quote_link with the complete new quote (start from the quote in the last entry of versions).
| Argument | Type | Description |
|---|---|---|
| manage_token | string | The quote's private manage token: the long code after # in the private link (https://www.workeey.com/q/m/#<token>), returned as manage_token by create_quote_link. The whole private link is accepted too. Required, unless your MCP client already sends it as an Authorization: Bearer header. |
{
"type": "object",
"properties": {
"manage_token": {
"type": "string",
"maxLength": 400,
"minLength": 20,
"description": "The quote's private manage token: the long code after # in the private link (https://www.workeey.com/q/m/#<token>), returned as manage_token by create_quote_link. The whole private link is accepted too. Required, unless your MCP client already sends it as an Authorization: Bearer header."
}
},
"additionalProperties": false
}For a trade job (plumbing, electrical, HVAC, handyman and more) and a place in the United States: whether it needs a permit, which license, whether sales tax goes on the invoice, the official forms, and where to take the waste — each with the official pages quoted, their dates and the day it was checked, and who to confirm with. New York City is researched in full and may ask follow-up questions (a first call with no answers returns them); every state has its license and sales tax answers, and its permit is not researched yet. From Workeey's researched data, read-only, no AI. Not legal or tax advice.
| Argument | Type | Description |
|---|---|---|
| job* | string | The job. replace-faucet-or-sink: Replace a faucet or sink; replace-toilet: Replace a toilet; replace-water-heater-gas: Replace a gas water heater; replace-water-heater-electric: Replace an electric water heater; replace-gas-range-or-appliance: Replace a gas range or connect a gas appliance (stove, oven, dryer); replace-light-fixture: Replace a light fixture; add-or-replace-outlet-or-switch: Add or replace an outlet or switch; install-ceiling-fan: Install a ceiling fan; replace-electrical-panel: Replace an electrical panel; interior-painting: Interior painting; drywall-repair-or-patch: Drywall repair or patch; replace-flooring: Replace flooring; tile-bathroom-or-backsplash: Tile a bathroom or kitchen backsplash; replace-kitchen-cabinets-and-countertops: Replace kitchen cabinets and countertops; install-window-or-through-wall-ac: Install a window or through-wall AC unit; install-ductless-mini-split: Install a ductless mini-split; replace-windows: Replace windows; small-bathroom-remodel-fixtures-in-place: Small bathroom remodel (fixtures stay in place); replace-boiler: Replace a boiler. |
| work | string | For sales tax, the kind of work: repairTPP: Repairing a thing; repairRealProperty: Repairing a home or building; installation: Installing; newConstruction: New build. Leave it out to see all four answers. |
A starting price for a job, from Workeey's price book (plumbing, electrical, hvac, handyman, house cleaning, landscaping), for a US place. Give the job in words and where ("toilet repair", "Brooklyn, NY"): it answers with the one matching job, priced as labor (hours × an hourly rate) + parts (with markup) + optional travel, what the job includes, its parts with the product pages they were priced from, the place it priced for, and draft_link: a Quote Links address that opens the quote form already filled in with that job and price. Or give a trade (no job) for every job of the trade. You can give your own rate, markup, travel, and hours or parts cost. The rate starts from government data on what employees are paid and what employers pay on top (BLS), turned into a self-employed rate by our hourly rate calculator's math; parts are retailers' online shelf prices we checked by hand on November 6, 2026, each with its link (a price from Ace Hardware or Menards is one store's online price, not a national one); the two we could not check say "not checked"; job hours are starting guesses, so set your own. This is not what others charge. With no BLS figure for a place, it uses the state's or the national one and says so (place.fallback). Every checked figure carries its source and the day it was checked. From Workeey's data, read-only, no AI.
| Argument | Type | Description |
|---|---|---|
| job | string | The job in words, as the customer or tradesperson said it ("fix a running toilet", "install a ceiling fan"). Answers with the one matching job; a near tie or no match says so and lists the closest. |
| jobs | object | Without job: per job of the trade, by its id, your own hours or parts cost in dollars. The answer lists every job's id. |
| rate | number | Your own hourly rate in dollars. Leave it out to use the suggested rate. |
Change a Quote Link that already exists: send the COMPLETE new quote (every field, exactly as for create_quote_link, not only the changes) together with the quote's manage_token. Start from the quote in the last entry of versions from get_quote_status, change what the user asked, and send all of it. The customer link stays the same and now shows the new version, marked as updated. Earlier answers stay attached to the version they answered (an approval of version 1 shows as approved v1, quote since revised), and the customer can answer the new version. Same rules as create_quote_link: only prices the user gave you or agreed to from price_check; no links, email addresses (except business.email) or payment details; the customer's display name only. Returns the new version number and its totals. If it returns errors, each one names the field, the problem and the fix: apply every fix and call again.
| Argument | Type | Description |
|---|---|---|
| tax | object | Optional. Tax exactly as the user supplies it: Workeey never decides tax rules. Send ONE of rate_percent (applied to the chosen option plus the chosen add-ons), amount (a fixed tax amount) or note (for example "Tax not included"). Leave tax out if the user gave no tax information. |
| notes | string | Optional. Anything else the customer should know: what is included, timing, access. No links, email addresses or payment details (Zelle, Venmo, Cash App, PayPal, bank or card numbers, crypto). |
| terms | string | Optional. The business's terms, such as warranty or cancellation. No links, email addresses or payment details (Zelle, Venmo, Cash App, PayPal, bank or card numbers, crypto). |
| title* |
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 Nov 11, 2026.
| object |
| The user's own business, the one sending the quote. The customer sees these details marked as provided by the creator, not verified by Workeey. |
| currency | string | Optional. Three-letter ISO 4217 code of a currency with cents (2 decimals), like USD, CAD or EUR. Default USD. A currency without 2-decimal cents (JPY, KWD) isn't supported yet. |
| customer* | object | Who the quote is for: a display name only. Never the customer's phone, email or address; quote links get shared and stay in chat history. |
| location | string | Optional. Where the job is: city and state only, never the customer's street address. |
| exclusions | string | Optional. What the price does not include. |
| valid_until | string | Optional. The date the quote is valid until, YYYY-MM-DD. Default 30 days from today; at most 365 days ahead. |
{
"type": "object",
"examples": [
{
"title": "Replace 50-gallon gas water heater",
"options": [
{
"name": "Standard",
"items": [
{
"unit_price": 1600,
"description": "50-gallon gas water heater, installed"
}
]
}
],
"business": {
"name": "Rivera Plumbing"
},
"customer": {
"name": "Dana"
}
}
],
"required": [
"business",
"customer",
"title",
"options"
],
"properties": {
"tax": {
"type": "object",
"properties": {
"note": {
"type": "string",
"examples": [
"Tax not included"
],
"maxLength": 80,
"description": "A tax note instead of a number."
},
"label": {
"type": "string",
"examples": [
"Sales tax"
],
"maxLength": 40,
"description": "Optional, with rate_percent or amount: what the tax is called."
},
"amount": {
"type": "number",
"minimum": 0,
"examples": [
120
],
"description": "A fixed tax amount."
},
"rate_percent": {
"type": "number",
"maximum": 30,
"minimum": 0,
"examples": [
8.875
],
"description": "A tax rate in percent: 8.875 means 8.875%."
}
},
"description": "Optional. Tax exactly as the user supplies it: Workeey never decides tax rules. Send ONE of rate_percent (applied to the chosen option plus the chosen add-ons), amount (a fixed tax amount) or note (for example \"Tax not included\"). Leave tax out if the user gave no tax information.",
"additionalProperties": false
},
"notes": {
"type": "string",
"maxLength": 2000,
"description": "Optional. Anything else the customer should know: what is included, timing, access. No links, email addresses or payment details (Zelle, Venmo, Cash App, PayPal, bank or card numbers, crypto)."
},
"terms": {
"type": "string",
"maxLength": 2000,
"description": "Optional. The business's terms, such as warranty or cancellation. No links, email addresses or payment details (Zelle, Venmo, Cash App, PayPal, bank or card numbers, crypto)."
},
"title": {
"type": "string",
"examples": [
"Replace 50-gallon gas water heater"
],
"maxLength": 120,
"minLength": 1,
"description": "The job, in a few words."
},
"addons": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"price"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Expansion tank"
],
"maxLength": 80,
"minLength": 1,
"description": "Add-on name."
},
"price": {
"type": "number",
"minimum": 0,
"examples": [
95
],
"description": "The add-on price as a plain number."
},
"description": {
"type": "string",
"maxLength": 300,
"description": "Optional. A short explanation."
}
},
"additionalProperties": false
},
"maxItems": 10,
"description": "Optional. Extras the customer can tick on top of the option they pick (up to 10)."
},
"source": {
"type": "object",
"properties": {
"client": {
"type": "string",
"examples": [
"Claude",
"ChatGPT",
"Gemini"
],
"maxLength": 60,
"description": "The name of your AI app."
}
},
"description": "Optional. Which AI app is making this quote. Recorded as an unverified claim and never shown to the customer.",
"additionalProperties": false
},
"deposit": {
"type": "object",
"properties": {
"note": {
"type": "string",
"examples": [
"Due when the job is booked"
],
"maxLength": 200,
"description": "Optional. When the deposit is due. No links, email addresses or payment details (Zelle, Venmo, Cash App, PayPal, bank or card numbers, crypto)."
},
"amount": {
"type": "number",
"minimum": 0,
"description": "Deposit as a fixed amount."
},
"percent": {
"type": "number",
"maximum": 100,
"minimum": 0,
"examples": [
25
],
"description": "Deposit as a percent of the total."
}
},
"description": "Optional. Deposit wording shown on the quote: percent OR amount, and an optional note. Text only: Workeey takes no payments.",
"additionalProperties": false
},
"options": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"items"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Standard"
],
"maxLength": 40,
"minLength": 1,
"description": "Option name."
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"description",
"unit_price"
],
"properties": {
"quantity": {
"type": "number",
"default": 1,
"maximum": 100000,
"examples": [
1
],
"description": "Optional. How many units. Default 1.",
"exclusiveMinimum": 0
},
"unit_price": {
"type": "number",
"maximum": 10000000,
"minimum": 0,
"examples": [
1150
],
"description": "The price of one unit as a plain number with at most 2 decimals: 1450 or 2.1, never \"$1,450\" or \"about 1.5k\". Use only prices the user gave you, or a starting price from price_check that they agreed to."
},
"description": {
"type": "string",
"examples": [
"50-gallon gas water heater, 6-year warranty"
],
"maxLength": 200,
"minLength": 1,
"description": "What the line is for."
}
},
"additionalProperties": false
},
"maxItems": 50,
"minItems": 1,
"description": "The option's line items (1 to 50). The option's subtotal is the sum of quantity × unit_price."
},
"description": {
"type": "string",
"maxLength": 500,
"description": "Optional. What this option includes, or how it differs from the others."
}
},
"additionalProperties": false
},
"maxItems": 4,
"minItems": 1,
"description": "The choices the customer picks between: 1 to 4 options (for example Standard and Premium), each priced on its own. A quote with a single price has one option. Workeey adds up every option, so send no totals."
},
"business": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Rivera Plumbing"
],
"maxLength": 80,
"minLength": 1,
"description": "Business name, shown as the heading of the quote."
},
"email": {
"type": "string",
"examples": [
"[email protected]"
],
"maxLength": 120,
"description": "Optional. The business's email address: the only field where an email address is allowed."
},
"phone": {
"type": "string",
"examples": [
"718-555-0142"
],
"maxLength": 30,
"description": "Optional. The business's phone number, written the way the user wants it shown."
},
"address": {
"type": "string",
"maxLength": 160,
"description": "Optional. The business's address."
},
"license": {
"type": "string",
"examples": [
"NYC LMP 12345"
],
"maxLength": 60,
"description": "Optional. The business license number, as the user gives it."
}
},
"description": "The user's own business, the one sending the quote. The customer sees these details marked as provided by the creator, not verified by Workeey.",
"additionalProperties": false
},
"currency": {
"type": "string",
"default": "USD",
"pattern": "^[A-Z]{3}$",
"examples": [
"USD"
],
"description": "Optional. Three-letter ISO 4217 code of a currency with cents (2 decimals), like USD, CAD or EUR. Default USD. A currency without 2-decimal cents (JPY, KWD) isn't supported yet."
},
"customer": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Dana"
],
"maxLength": 80,
"minLength": 1,
"description": "The name the customer sees on the quote, such as a first name."
}
},
"description": "Who the quote is for: a display name only. Never the customer's phone, email or address; quote links get shared and stay in chat history.",
"additionalProperties": false
},
"location": {
"type": "string",
"examples": [
"Brooklyn, NY"
],
"maxLength": 80,
"description": "Optional. Where the job is: city and state only, never the customer's street address."
},
"exclusions": {
"type": "string",
"maxLength": 2000,
"description": "Optional. What the price does not include."
},
"valid_until": {
"type": "string",
"format": "date",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Optional. The date the quote is valid until, YYYY-MM-DD. Default 30 days from today; at most 365 days ahead."
}
},
"additionalProperties": false
}| place* | string | nyc for New York City, or a state's two-letter code in lower case (ny is New York outside New York City, dc is Washington, DC). |
| answers | object | New York City only: the job's follow-up questions, each question id → one of its options, in its words or by its number from 1. The answer lists the questions and their options. |
{
"type": "object",
"required": [
"job",
"place"
],
"properties": {
"job": {
"enum": [
"replace-faucet-or-sink",
"replace-toilet",
"replace-water-heater-gas",
"replace-water-heater-electric",
"replace-gas-range-or-appliance",
"replace-light-fixture",
"add-or-replace-outlet-or-switch",
"install-ceiling-fan",
"replace-electrical-panel",
"interior-painting",
"drywall-repair-or-patch",
"replace-flooring",
"tile-bathroom-or-backsplash",
"replace-kitchen-cabinets-and-countertops",
"install-window-or-through-wall-ac",
"install-ductless-mini-split",
"replace-windows",
"small-bathroom-remodel-fixtures-in-place",
"replace-boiler"
],
"type": "string",
"description": "The job. replace-faucet-or-sink: Replace a faucet or sink; replace-toilet: Replace a toilet; replace-water-heater-gas: Replace a gas water heater; replace-water-heater-electric: Replace an electric water heater; replace-gas-range-or-appliance: Replace a gas range or connect a gas appliance (stove, oven, dryer); replace-light-fixture: Replace a light fixture; add-or-replace-outlet-or-switch: Add or replace an outlet or switch; install-ceiling-fan: Install a ceiling fan; replace-electrical-panel: Replace an electrical panel; interior-painting: Interior painting; drywall-repair-or-patch: Drywall repair or patch; replace-flooring: Replace flooring; tile-bathroom-or-backsplash: Tile a bathroom or kitchen backsplash; replace-kitchen-cabinets-and-countertops: Replace kitchen cabinets and countertops; install-window-or-through-wall-ac: Install a window or through-wall AC unit; install-ductless-mini-split: Install a ductless mini-split; replace-windows: Replace windows; small-bathroom-remodel-fixtures-in-place: Small bathroom remodel (fixtures stay in place); replace-boiler: Replace a boiler."
},
"work": {
"enum": [
"repairTPP",
"repairRealProperty",
"installation",
"newConstruction"
],
"type": "string",
"description": "For sales tax, the kind of work: repairTPP: Repairing a thing; repairRealProperty: Repairing a home or building; installation: Installing; newConstruction: New build. Leave it out to see all four answers."
},
"place": {
"enum": [
"nyc",
"al",
"ak",
"az",
"ar",
"ca",
"co",
"ct",
"de",
"dc",
"fl",
"ga",
"hi",
"id",
"il",
"in",
"ia",
"ks",
"ky",
"la",
"me",
"md",
"ma",
"mi",
"mn",
"ms",
"mo",
"mt",
"ne",
"nv",
"nh",
"nj",
"nm",
"ny",
"nc",
"nd",
"oh",
"ok",
"or",
"pa",
"ri",
"sc",
"sd",
"tn",
"tx",
"ut",
"vt",
"va",
"wa",
"wv",
"wi",
"wy"
],
"type": "string",
"description": "nyc for New York City, or a state's two-letter code in lower case (ny is New York outside New York City, dc is Washington, DC)."
},
"answers": {
"type": "object",
"description": "New York City only: the job's follow-up questions, each question id → one of its options, in its words or by its number from 1. The answer lists the questions and their options.",
"additionalProperties": {
"type": "string"
}
}
},
"additionalProperties": false
}| hours | number | With job: your own hours for it. Leave it out for the book's starting hours. |
| metro | string | A BLS metropolitan area code inside that state (a wrong one lists the state's areas). Leave it out for the state's figure. Not with where. |
| parts | number | With job: your own parts cost for it, in dollars, before markup. Leave it out for the checked retail midpoint. |
| state | string | A state's two-letter code (DC for Washington, DC). Leave it out for the national figure. Not with where. |
| trade | string | The trade. plumbing: Plumbing; electrical: Electrical; hvac: HVAC; handyman: Handyman; cleaning: House cleaning; landscaping: Landscaping. With job, it narrows the search; without job, the answer is every job of the trade. |
| where | string | Where the job is, in words: "City, ST" ("Austin, TX"), a state, or a New York City borough. Instead of state and metro. |
| markup | number | Your markup on parts, in percent. Leave it out for 20%. |
| travel | object | Travel added to every job: on, the miles and the minutes of a trip (miles at the IRS rate, minutes at your rate). Off unless on is true; 20 miles and 30 minutes when not given. |
| business | string | The business name, if known ("Rivera Plumbing"): when two trades have the same job, its trade wins. |
{
"type": "object",
"properties": {
"job": {
"type": "string",
"description": "The job in words, as the customer or tradesperson said it (\"fix a running toilet\", \"install a ceiling fan\"). Answers with the one matching job; a near tie or no match says so and lists the closest."
},
"jobs": {
"type": "object",
"description": "Without job: per job of the trade, by its id, your own hours or parts cost in dollars. The answer lists every job's id.",
"additionalProperties": {
"type": "object",
"properties": {
"hours": {
"type": "number"
},
"parts": {
"type": "number"
}
},
"additionalProperties": false
}
},
"rate": {
"type": "number",
"description": "Your own hourly rate in dollars. Leave it out to use the suggested rate."
},
"hours": {
"type": "number",
"description": "With job: your own hours for it. Leave it out for the book's starting hours."
},
"metro": {
"type": "string",
"description": "A BLS metropolitan area code inside that state (a wrong one lists the state's areas). Leave it out for the state's figure. Not with where."
},
"parts": {
"type": "number",
"description": "With job: your own parts cost for it, in dollars, before markup. Leave it out for the checked retail midpoint."
},
"state": {
"type": "string",
"description": "A state's two-letter code (DC for Washington, DC). Leave it out for the national figure. Not with where."
},
"trade": {
"enum": [
"plumbing",
"electrical",
"hvac",
"handyman",
"cleaning",
"landscaping"
],
"type": "string",
"description": "The trade. plumbing: Plumbing; electrical: Electrical; hvac: HVAC; handyman: Handyman; cleaning: House cleaning; landscaping: Landscaping. With job, it narrows the search; without job, the answer is every job of the trade."
},
"where": {
"type": "string",
"description": "Where the job is, in words: \"City, ST\" (\"Austin, TX\"), a state, or a New York City borough. Instead of state and metro."
},
"markup": {
"type": "number",
"description": "Your markup on parts, in percent. Leave it out for 20%."
},
"travel": {
"type": "object",
"properties": {
"on": {
"type": "boolean"
},
"miles": {
"type": "number"
},
"minutes": {
"type": "number"
}
},
"description": "Travel added to every job: on, the miles and the minutes of a trip (miles at the IRS rate, minutes at your rate). Off unless on is true; 20 miles and 30 minutes when not given.",
"additionalProperties": false
},
"business": {
"type": "string",
"description": "The business name, if known (\"Rivera Plumbing\"): when two trades have the same job, its trade wins."
}
},
"additionalProperties": false
}| string |
| The job, in a few words. |
| addons | array | Optional. Extras the customer can tick on top of the option they pick (up to 10). |
| source | object | Optional. Which AI app is making this quote. Recorded as an unverified claim and never shown to the customer. |
| deposit | object | Optional. Deposit wording shown on the quote: percent OR amount, and an optional note. Text only: Workeey takes no payments. |
| options* | array | The choices the customer picks between: 1 to 4 options (for example Standard and Premium), each priced on its own. A quote with a single price has one option. Workeey adds up every option, so send no totals. |
| business* | object | The user's own business, the one sending the quote. The customer sees these details marked as provided by the creator, not verified by Workeey. |
| currency | string | Optional. Three-letter ISO 4217 code of a currency with cents (2 decimals), like USD, CAD or EUR. Default USD. A currency without 2-decimal cents (JPY, KWD) isn't supported yet. |
| customer* | object | Who the quote is for: a display name only. Never the customer's phone, email or address; quote links get shared and stay in chat history. |
| location | string | Optional. Where the job is: city and state only, never the customer's street address. |
| exclusions | string | Optional. What the price does not include. |
| valid_until | string | Optional. The date the quote is valid until, YYYY-MM-DD. Default 30 days from today; at most 365 days ahead. |
| manage_token | string | The quote's private manage token: the long code after # in the private link (https://www.workeey.com/q/m/#<token>), returned as manage_token by create_quote_link. The whole private link is accepted too. Required, unless your MCP client already sends it as an Authorization: Bearer header. |
{
"type": "object",
"required": [
"business",
"customer",
"title",
"options"
],
"properties": {
"tax": {
"type": "object",
"properties": {
"note": {
"type": "string",
"examples": [
"Tax not included"
],
"maxLength": 80,
"description": "A tax note instead of a number."
},
"label": {
"type": "string",
"examples": [
"Sales tax"
],
"maxLength": 40,
"description": "Optional, with rate_percent or amount: what the tax is called."
},
"amount": {
"type": "number",
"minimum": 0,
"examples": [
120
],
"description": "A fixed tax amount."
},
"rate_percent": {
"type": "number",
"maximum": 30,
"minimum": 0,
"examples": [
8.875
],
"description": "A tax rate in percent: 8.875 means 8.875%."
}
},
"description": "Optional. Tax exactly as the user supplies it: Workeey never decides tax rules. Send ONE of rate_percent (applied to the chosen option plus the chosen add-ons), amount (a fixed tax amount) or note (for example \"Tax not included\"). Leave tax out if the user gave no tax information.",
"additionalProperties": false
},
"notes": {
"type": "string",
"maxLength": 2000,
"description": "Optional. Anything else the customer should know: what is included, timing, access. No links, email addresses or payment details (Zelle, Venmo, Cash App, PayPal, bank or card numbers, crypto)."
},
"terms": {
"type": "string",
"maxLength": 2000,
"description": "Optional. The business's terms, such as warranty or cancellation. No links, email addresses or payment details (Zelle, Venmo, Cash App, PayPal, bank or card numbers, crypto)."
},
"title": {
"type": "string",
"examples": [
"Replace 50-gallon gas water heater"
],
"maxLength": 120,
"minLength": 1,
"description": "The job, in a few words."
},
"addons": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"price"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Expansion tank"
],
"maxLength": 80,
"minLength": 1,
"description": "Add-on name."
},
"price": {
"type": "number",
"minimum": 0,
"examples": [
95
],
"description": "The add-on price as a plain number."
},
"description": {
"type": "string",
"maxLength": 300,
"description": "Optional. A short explanation."
}
},
"additionalProperties": false
},
"maxItems": 10,
"description": "Optional. Extras the customer can tick on top of the option they pick (up to 10)."
},
"source": {
"type": "object",
"properties": {
"client": {
"type": "string",
"examples": [
"Claude",
"ChatGPT",
"Gemini"
],
"maxLength": 60,
"description": "The name of your AI app."
}
},
"description": "Optional. Which AI app is making this quote. Recorded as an unverified claim and never shown to the customer.",
"additionalProperties": false
},
"deposit": {
"type": "object",
"properties": {
"note": {
"type": "string",
"examples": [
"Due when the job is booked"
],
"maxLength": 200,
"description": "Optional. When the deposit is due. No links, email addresses or payment details (Zelle, Venmo, Cash App, PayPal, bank or card numbers, crypto)."
},
"amount": {
"type": "number",
"minimum": 0,
"description": "Deposit as a fixed amount."
},
"percent": {
"type": "number",
"maximum": 100,
"minimum": 0,
"examples": [
25
],
"description": "Deposit as a percent of the total."
}
},
"description": "Optional. Deposit wording shown on the quote: percent OR amount, and an optional note. Text only: Workeey takes no payments.",
"additionalProperties": false
},
"options": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"items"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Standard"
],
"maxLength": 40,
"minLength": 1,
"description": "Option name."
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"description",
"unit_price"
],
"properties": {
"quantity": {
"type": "number",
"default": 1,
"maximum": 100000,
"examples": [
1
],
"description": "Optional. How many units. Default 1.",
"exclusiveMinimum": 0
},
"unit_price": {
"type": "number",
"maximum": 10000000,
"minimum": 0,
"examples": [
1150
],
"description": "The price of one unit as a plain number with at most 2 decimals: 1450 or 2.1, never \"$1,450\" or \"about 1.5k\". Use only prices the user gave you, or a starting price from price_check that they agreed to."
},
"description": {
"type": "string",
"examples": [
"50-gallon gas water heater, 6-year warranty"
],
"maxLength": 200,
"minLength": 1,
"description": "What the line is for."
}
},
"additionalProperties": false
},
"maxItems": 50,
"minItems": 1,
"description": "The option's line items (1 to 50). The option's subtotal is the sum of quantity × unit_price."
},
"description": {
"type": "string",
"maxLength": 500,
"description": "Optional. What this option includes, or how it differs from the others."
}
},
"additionalProperties": false
},
"maxItems": 4,
"minItems": 1,
"description": "The choices the customer picks between: 1 to 4 options (for example Standard and Premium), each priced on its own. A quote with a single price has one option. Workeey adds up every option, so send no totals."
},
"business": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Rivera Plumbing"
],
"maxLength": 80,
"minLength": 1,
"description": "Business name, shown as the heading of the quote."
},
"email": {
"type": "string",
"examples": [
"[email protected]"
],
"maxLength": 120,
"description": "Optional. The business's email address: the only field where an email address is allowed."
},
"phone": {
"type": "string",
"examples": [
"718-555-0142"
],
"maxLength": 30,
"description": "Optional. The business's phone number, written the way the user wants it shown."
},
"address": {
"type": "string",
"maxLength": 160,
"description": "Optional. The business's address."
},
"license": {
"type": "string",
"examples": [
"NYC LMP 12345"
],
"maxLength": 60,
"description": "Optional. The business license number, as the user gives it."
}
},
"description": "The user's own business, the one sending the quote. The customer sees these details marked as provided by the creator, not verified by Workeey.",
"additionalProperties": false
},
"currency": {
"type": "string",
"default": "USD",
"pattern": "^[A-Z]{3}$",
"examples": [
"USD"
],
"description": "Optional. Three-letter ISO 4217 code of a currency with cents (2 decimals), like USD, CAD or EUR. Default USD. A currency without 2-decimal cents (JPY, KWD) isn't supported yet."
},
"customer": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Dana"
],
"maxLength": 80,
"minLength": 1,
"description": "The name the customer sees on the quote, such as a first name."
}
},
"description": "Who the quote is for: a display name only. Never the customer's phone, email or address; quote links get shared and stay in chat history.",
"additionalProperties": false
},
"location": {
"type": "string",
"examples": [
"Brooklyn, NY"
],
"maxLength": 80,
"description": "Optional. Where the job is: city and state only, never the customer's street address."
},
"exclusions": {
"type": "string",
"maxLength": 2000,
"description": "Optional. What the price does not include."
},
"valid_until": {
"type": "string",
"format": "date",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Optional. The date the quote is valid until, YYYY-MM-DD. Default 30 days from today; at most 365 days ahead."
},
"manage_token": {
"type": "string",
"maxLength": 400,
"minLength": 20,
"description": "The quote's private manage token: the long code after # in the private link (https://www.workeey.com/q/m/#<token>), returned as manage_token by create_quote_link. The whole private link is accepted too. Required, unless your MCP client already sends it as an Authorization: Bearer header."
}
},
"additionalProperties": false
}