Juicy Designs — Quote MCP Server + REST API (Cloudflare Worker)
Request and read-only capabilities for AI agents, exposed two ways:
Tools
Both request tools share the same server-side validation and the same forwardLead()
sink, which posts the lead to the existing Juicy Designs Apps Script form handler
as form_type=quote — leads land exactly where the website form's leads land
(email + the "Leads" Google Sheet). Read tools return curated static data only; no PII,
no external calls.
Guarantees
- Never returns or implies a price. Published "from" figures are entry-point
references only, never a quote or estimate. Confirms receipt + the four-working-hour SLA only.
- Rejects
consent_to_contact !== true on every request tool (POPIA).
- All input validated server-side — the model's extraction is never trusted.
- Read tools are side-effect-free and contain no per-user calculation.
- Enum inputs map to the labels the Apps Script email/sheet expects.
Deploy
Deploy prints the Worker URL, e.g. https://juicy-designs-quote.<subdomain>.workers.dev.
Put that origin into openapi.yaml (servers.url) and wherever you advertise the endpoint.
Local test
A request without consent_to_contact:true must come back as an error — that is the POPIA gate working.
Connect as a connector
Claude (Settings → Connectors → Add custom connector): URL = https://<worker>/mcp.
ChatGPT (Settings → Connectors / Developer mode): add an MCP server with the same /mcp URL.
The connector lists one tool, get_quote. The agent should read the fields back and confirm
consent with the user before calling. No authentication is required (the tool only creates a lead).
Connector discovery (so agents can find it)
After deploy, advertise the endpoints from the site:
- A short docs page (e.g.
/connect/ or a section on /quote/) listing the MCP + OpenAPI URLs.
- Append to
llms.txt (root of juicydesigns.co.za):
(Left out of llms.txt until you have the real Worker URL — paste it in post-deploy so there is no dead link.)
Map of inputs → Apps Script fields
Swap the body of forwardLead() in src/index.ts to send leads elsewhere (CRM, webhook, Resend).