{
  "markdown": "# Juicy Designs — Quote MCP Server + REST API (Cloudflare Worker)\n\nRequest and read-only capabilities for AI agents, exposed two ways:\n\n| Transport | Path | For |\n|---|---|---|\n| MCP (Streamable HTTP) | `POST /mcp` | ChatGPT / Claude / agent connectors |\n| REST request | `POST /quote`, `POST /strategy-session` | Agentic browsers / OpenAPI clients |\n| REST read | `GET /service-catalog` `/service-areas` `/case-studies` `/client-reviews` `/faqs` | Read reference data |\n| Discovery | `GET /`, `GET /openapi.json` | Health + machine-readable spec |\n\n### Tools\n\n| Tool | Type | Purpose |\n|---|---|---|\n| `get_quote` | request | Submit a free, no-obligation quote request. Consent-gated. |\n| `book_strategy_session` | request | Request a free strategy session. Consent-gated. |\n| `get_service_catalog` | read | Services + reference \"from\" floors (reference only). |\n| `get_service_areas` | read | Where Juicy Designs works. |\n| `get_case_studies` | read | Track record and portfolio pointer. |\n| `get_client_reviews` | read | Aggregate Google rating and review source. |\n| `get_faqs` | read | Common questions and answers. |\n\nBoth request tools share the same server-side validation and the same `forwardLead()`\nsink, which posts the lead to the **existing Juicy Designs Apps Script form handler**\nas `form_type=quote` — leads land exactly where the website form's leads land\n(email + the \"Leads\" Google Sheet). Read tools return curated static data only; no PII,\nno external calls.\n\n### Guarantees\n- **Never returns or implies a price.** Published \"from\" figures are entry-point\n  references only, never a quote or estimate. Confirms receipt + the four-working-hour SLA only.\n- **Rejects `consent_to_contact !== true`** on every request tool (POPIA).\n- **All input validated server-side** — the model's extraction is never trusted.\n- Read tools are side-effect-free and contain no per-user calculation.\n- Enum inputs map to the labels the Apps Script email/sheet expects.\n\n## Deploy\n\n```bash\ncd mcp-quote-worker\nnpm install\n\n# 1) Lead sink (the existing Apps Script /exec URL)\nnpx wrangler secret put LEAD_ENDPOINT\n#   paste: https://script.google.com/macros/s/AKfycb.../exec\n\n# 2) (optional) per-IP rate limit — Apps Script already throttles 5/10min\n# npx wrangler kv namespace create RATELIMIT   # then paste id into wrangler.toml + uncomment\n\nnpx wrangler deploy\n```\n\nDeploy prints the Worker URL, e.g. `https://juicy-designs-quote.<subdomain>.workers.dev`.\nPut that origin into `openapi.yaml` (`servers.url`) and wherever you advertise the endpoint.\n\n## Local test\n\n```bash\nnpx wrangler dev          # serves on http://localhost:8787\n\n# REST\ncurl -s localhost:8787/quote -H 'content-type: application/json' -d '{\n  \"name\":\"Sipho Dlamini\",\"email\":\"sipho@example.co.za\",\"service\":\"seo\",\n  \"project_summary\":\"E-commerce store, want to rank for running shoes in SA.\",\n  \"budget_range\":\"25k_75k\",\"timeline\":\"1_3_months\",\"consent_to_contact\":true\n}'\n\n# MCP: list tools\ncurl -s localhost:8787/mcp -H 'content-type: application/json' -d \\\n  '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\"}'\n\n# MCP: call get_quote\ncurl -s localhost:8787/mcp -H 'content-type: application/json' -d \\\n  '{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/call\",\"params\":{\"name\":\"get_quote\",\"arguments\":{\"name\":\"Sipho\",\"email\":\"s@x.co.za\",\"service\":\"seo\",\"project_summary\":\"Need SEO for a new store in Pretoria.\",\"consent_to_contact\":true}}}'\n```\nA request without `consent_to_contact:true` must come back as an error — that is the POPIA gate working.\n\n## Connect as a connector\n\n**Claude (Settings → Connectors → Add custom connector):** URL = `https://<worker>/mcp`.\n**ChatGPT (Settings → Connectors / Developer mode):** add an MCP server with the same `/mcp` URL.\nThe connector lists one tool, `get_quote`. The agent should read the fields back and confirm\nconsent with the user before calling. No authentication is required (the tool only creates a lead).\n\n## Connector discovery (so agents can find it)\n\nAfter deploy, advertise the endpoints from the site:\n1. A short docs page (e.g. `/connect/` or a section on `/quote/`) listing the MCP + OpenAPI URLs.\n2. Append to **`llms.txt`** (root of juicydesigns.co.za):\n\n```\n## For AI agents\n- MCP server (request a quote): https://<worker>/mcp\n- OpenAPI 3.1 spec: https://<worker>/openapi.json\n```\n\n(Left out of llms.txt until you have the real Worker URL — paste it in post-deploy so there is no dead link.)\n\n## Map of inputs → Apps Script fields\n\n| MCP/REST input | sent as | shown in email/sheet |\n|---|---|---|\n| `service` (enum) | `services` (label) | Services |\n| `budget_range` (enum) | `budget` (label) | Budget |\n| `project_summary` (+ timeline + source) | `message` | Message |\n| `name` / `email` / `phone` / `company` | same | as-is |\n| `form_type` | `quote` | routes to the quote email/template |\n\nSwap the body of `forwardLead()` in `src/index.ts` to send leads elsewhere (CRM, webhook, Resend).\n",
  "bytes": 4921,
  "sha": "8ddb2391529ee692dcf7a17c6b747a73fee6a6cad3e17abb9c47000bfc07e83c",
  "repo_slug": "cobusvdwest/juicy-designs-quote",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_cobusvdwest_juicy_designs_quot_fbb306bb/readme"
}