{"serverId":"mcp-registry/app.steadywrk/mcp-dispatch","tools":[{"name":"acp.validate","fixed":{"name":"acp_validate","description":"Free validator for a store's Agentic Commerce Protocol (ACP) discovery file at /.well-known/acp.json. Pass url to fetch a public store's file, or document to check pasted JSON. Returns a verdict, every rule result, and a fix list: each failed rule with the change that fixes it. Reads one public file, stores nothing, calls no checkout endpoint. No API key required.","inputSchema":{"type":"object","properties":{"url":{"type":"string","maxLength":255,"description":"Public store URL or domain, e.g. shop.example.com"},"document":{"type":"string","maxLength":262144,"description":"The discovery document's JSON text, checked without any fetch"}},"description":"Send exactly one of url or document."},"annotations":{"title":"Validate a store's ACP discovery file","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Validate a store's ACP discovery file"},"changes":[{"kind":"name","detail":"Renamed \"acp.validate\" → \"acp_validate\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":205,"tokensAfter":205},{"name":"agentic.readiness_probe","fixed":{"name":"agentic_readiness_probe","description":"Run a one-time readiness check on a public storefront and return a score, a grade and per-check results (UCP and ACP discovery files, product schema, robots rules, answer-engine maps). The result is a dated snapshot of public files, not an attested Store Guard grade. Input: url, a public storefront URL or domain (up to 255 characters; local, private and numeric hosts are refused). Each run may store a public snapshot record, at most one per host per UTC day, linked in the response. The response ","inputSchema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","maxLength":255,"description":"Public storefront URL or domain"}}},"annotations":{"title":"Inspect storefront readiness","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Inspect storefront readiness"},"changes":[{"kind":"name","detail":"Renamed \"agentic.readiness_probe\" → \"agentic_readiness_probe\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":196,"tokensAfter":196},{"name":"dispatch.estimate","fixed":{"name":"dispatch_estimate","description":"Public modeled field-service price estimate with cited BLS wage benchmarks. Returns customer hourly rates, line items, ranges and a total alongside geographic scope and source provenance. Model estimates are not observed transaction prices or binding quotes. Use dispatch.quote with an accepted credential to request a quote. No API key required.","inputSchema":{"type":"object","required":["trade","location"],"properties":{"trade":{"type":"string","description":"Trade code: hvac, plumbing, electrical, general_maintenance, roofing, painting, carpentry or locksmith (see dispatch.index)."},"urgency":{"enum":["emergency","urgent","routine","scheduled"],"type":"string","default":"routine"},"location":{"type":"object","required":["state"],"properties":{"zip":{"type":"string","maxLength":10},"city":{"type":"string","maxLength":255},"state":{"type":"string","maxLength":2,"minLength":2}}}}},"annotations":{"title":"Estimate dispatch cost","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"title":"Estimate dispatch cost"},"changes":[{"kind":"name","detail":"Renamed \"dispatch.estimate\" → \"dispatch_estimate\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":260,"tokensAfter":260},{"name":"dispatch.evals","fixed":{"name":"dispatch_evals","description":"Return the public evaluation document for a selected rolling window. Consult its per-field provenance and methodology to distinguish self-reported estimates, measurements, and unavailable fields. It is not an independent audit or a service-level guarantee. No API key required.","inputSchema":{"type":"object","properties":{"period":{"enum":["rolling_7d","rolling_30d","rolling_90d"],"type":"string","default":"rolling_30d"}}},"annotations":{"title":"Read dispatch evaluations","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"title":"Read dispatch evaluations"},"changes":[{"kind":"name","detail":"Renamed \"dispatch.evals\" → \"dispatch_evals\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":130,"tokensAfter":130},{"name":"dispatch.index","fixed":{"name":"dispatch_index","description":"Return the catalog of 8 dispatch trade verticals. Per trade: the BLS OES hourly WAGE benchmark (medianRateDollars/p25/p75 — what a technician earns, NOT a price) alongside billedHourlyRateRoutineDollars, a modeled customer hourly estimate at routine urgency. Estimates are not observed transaction prices or binding quotes. No API key required.","inputSchema":{"type":"object","properties":{}},"annotations":{"title":"Read the dispatch trade catalog","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"title":"Read the dispatch trade catalog"},"changes":[{"kind":"name","detail":"Renamed \"dispatch.index\" → \"dispatch_index\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":121,"tokensAfter":121},{"name":"dispatch.order","fixed":{"name":"dispatch_order","description":"Create a field-service order and return its status URL. HTTP 201 returns a created order; HTTP 202 returns an order accepted_pending_fulfilment with fulfilled=false. Order creation requires a provisioned integration key through x-api-key. MCP also accepts that key through Authorization: Bearer; direct REST order creation requires x-api-key. A self-serve OAuth token authenticates but is not entitled to create orders: HTTP 402 payment_required (JSON-RPC -32002 over MCP). Anonymous callers receive ","inputSchema":{"type":"object","required":["trade","location","description"],"properties":{"trade":{"type":"string","description":"Trade code, as listed by dispatch.index (e.g. plumbing, hvac, electrical)."},"urgency":{"enum":["emergency","urgent","routine","scheduled"],"type":"string","default":"routine"},"location":{"type":"object","required":["state"],"properties":{"zip":{"type":"string","maxLength":10},"city":{"type":"string","maxLength":255},"name":{"type":"string","maxLength":500},"state":{"type":"string","maxLength":2,"minLength":2},"address":{"type":"string","maxLength":1000}}},"nte_cents":{"type":"integer","maximum":5000000,"minimum":2500},"test_mode":{"type":"boolean","description":"true: a test booking with your STEADYWRK key (any key, including the free one). Answered whether orders are open or not, marked test: true; nothing is dispatched, matched or charged."},"description":{"type":"string","maxLength":5000,"minLength":1},"callback_url":{"type":"string","format":"uri"},"reference_id":{"type":"string","maxLength":255}}},"annotations":{"title":"Create a dispatch work order","readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":true},"title":"Create a dispatch work order"},"changes":[{"kind":"name","detail":"Renamed \"dispatch.order\" → \"dispatch_order\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":442,"tokensAfter":442},{"name":"dispatch.order_status","fixed":{"name":"dispatch_order_status","description":"Return the current state of a work order created by dispatch.order: status, assignment, quote and timestamps. Same key as dispatch.order (the order's status_url, served over MCP). A self-serve OAuth token cannot have created an order, so it receives HTTP 402 payment_required (JSON-RPC -32002). Anonymous callers receive HTTP 401 with WWW-Authenticate. To be provisioned, POST JSON to https://steadywrk.app/api/integration-key-request or use https://steadywrk.app/developers/keys and a person reviews","inputSchema":{"type":"object","required":["order_id"],"properties":{"order_id":{"type":"string","maxLength":36,"minLength":1,"description":"The order.id returned by dispatch.order."}}},"annotations":{"title":"Read a dispatch work order","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"title":"Read a dispatch work order"},"changes":[{"kind":"name","detail":"Renamed \"dispatch.order_status\" → \"dispatch_order_status\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":205,"tokensAfter":205},{"name":"dispatch.quote","fixed":{"name":"dispatch_quote","description":"Request a field-service quote by trade, location, and urgency. Returns availability and quote details when available. Accepts a provisioned integration key through x-api-key or, when OAuth is enabled, a scoped self-serve OAuth token through Authorization: Bearer. MCP also accepts the provisioned key through Authorization: Bearer. Request an integration key: POST JSON to https://steadywrk.app/api/integration-key-request (GET it for the fields), or use https://steadywrk.app/developers/keys and a p","inputSchema":{"type":"object","required":["trade","location"],"properties":{"trade":{"type":"string","description":"Trade code: hvac, plumbing, electrical, general_maintenance, roofing, painting, carpentry or locksmith (see dispatch.index)."},"company":{"type":"string","maxLength":255},"urgency":{"enum":["emergency","urgent","routine","scheduled"],"type":"string","default":"routine"},"location":{"type":"object","required":["state"],"properties":{"zip":{"type":"string","maxLength":10},"city":{"type":"string","maxLength":255},"state":{"type":"string","maxLength":2,"minLength":2}}},"nte_cents":{"type":"integer","minimum":1},"test_mode":{"type":"boolean","description":"true: a test booking with your STEADYWRK key (any key, including the free one). Answered whether orders are open or not, marked test: true; nothing is dispatched, matched or charged."},"description":{"type":"string","maxLength":2000},"contact_name":{"type":"string","maxLength":255},"contact_email":{"type":"string","format":"email","maxLength":255,"description":"Only without a key: where a person replies with the quote. The request is filed for review."}}},"annotations":{"title":"Get a dispatch quote","readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"title":"Get a dispatch quote"},"changes":[{"kind":"name","detail":"Renamed \"dispatch.quote\" → \"dispatch_quote\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":466,"tokensAfter":466},{"name":"ucp.validate","fixed":{"name":"ucp_validate","description":"Free validator for a store's Universal Commerce Protocol (UCP) discovery file at /.well-known/ucp. Pass url to fetch a public store's file, or document to check pasted JSON. Returns a verdict, every rule result, and a fix list: each failed rule with the change that fixes it. Reads one public file, stores nothing, calls no checkout endpoint. No API key required.","inputSchema":{"type":"object","properties":{"url":{"type":"string","maxLength":255,"description":"Public store URL or domain, e.g. shop.example.com"},"document":{"type":"string","maxLength":262144,"description":"The discovery document's JSON text, checked without any fetch"}},"description":"Send exactly one of url or document."},"annotations":{"title":"Validate a store's UCP discovery file","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Validate a store's UCP discovery file"},"changes":[{"kind":"name","detail":"Renamed \"ucp.validate\" → \"ucp_validate\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":205,"tokensAfter":205}],"toolsChanged":9,"tokensSaved":0,"todo":[{"tool":"dispatch_estimate","params":["urgency","location"]},{"tool":"dispatch_evals","params":["period"]},{"tool":"dispatch_order","params":["urgency","location","nte_cents","description","callback_url","reference_id"]},{"tool":"dispatch_quote","params":["company","urgency","location","nte_cents","description","contact_name"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}