{"ok":true,"site":{"host":"buildvsbuy-ai.vercel.app","url":"https://buildvsbuy-ai.vercel.app/","type":"live","desc":"BuildVsBuy.ai — a WebMCP decision canvas. Humans and browser-integrated agents co-manipulate one structured build-vs-buy model (Auth or AI Web Scraping) via typed tools, not DOM scraping.","tools":[{"name":"create_decision","kind":"act","impl":"imperative","description":"Initialize or replace the single active decision workspace. For authentication / Clerk / login / tenant problems use preset \"auth\" (4 seeded options). For scraping / crawl / Firecrawl use preset \"scraping\" (4 seeded options). If you omit preset, the engine infers auth or scraping from title/problem_statement and seeds those options — do not invent options with add_option after that. Only preset \"custom\" starts blank and requires add_option for each candidate (estimate=true until the human confirms). After seeding: set current intake with set_decision_context + rerank; for hypothetical future scale/compliance stress call simulate_future_scenario (do not rewrite live context to the future). IMPORTANT: if auth or scraping is already loaded, do NOT replace it with a blank/custom \"rapid prototyping\" / vibe-coding workspace — that path is REFUSED. For speed follow-ups call set_priority_weight(time_to_prototype, 9 or 10) — it auto-reranks. Only replace a seeded demo when switching domains auth↔scraping.","title":"Create decision","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"title":{"type":"string","description":"Decision title shown in the UI."},"problem_statement":{"type":"string","description":"One-line problem framing."},"org_context":{"type":"string","enum":["solo","startup","enterprise"],"description":"Organization context for skill and scale assumptions."},"skill_level":{"type":"string","enum":["vibe","mid","senior"],"description":"Team skill profile. vibe penalizes Build/heavy self-host only (not Adopt)."},"preset":{"type":"string","enum":["auth","scraping","custom"],"description":"auth = Authentication flagship (4 options). scraping = AI Web Scraping (4 options). custom = blank slate. Omit to let the engine infer auth/scraping from title/problem."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_decision_context","kind":"act","impl":"imperative","description":"Write CURRENT intake into hard decision state: scale_band, compliance_tier, is_core_ip, timeline_days. Marks ranking stale — call rerank_decision_options after. Use for today's constraints only. Do NOT use this for hypothetical future stress (\"if we end up HIPAA\", \"at 50k+ users later\") — call simulate_future_scenario instead so baseline cards stay put and the UI shows a projection banner. On the scraping preset, agent writes that combine hipaa/soc2 with 50k+ are refused.","title":"Set decision context","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"scale_band":{"type":"string","enum":["<1k","1k-10k","10k-50k","50k+"],"description":"Monthly active users / MRU band (current state)."},"compliance_tier":{"type":"string","enum":["none","soc2","hipaa"],"description":"Current compliance requirement tier — not a future projection."},"is_core_ip":{"type":"boolean","description":"True when the capability is strategic IP (Act 3 pin narrative)."},"timeline_days":{"type":"number","minimum":1,"description":"Days until launch deadline."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_option","kind":"act","impl":"imperative","description":"Add a candidate option (Build, Buy, Adopt/open_source, or Hybrid). Use only on a custom (blank) decision — not after auth/scraping presets already seeded 4 options (those calls are REFUSED). All numeric metrics are required. Set estimate=true when inventing numbers for custom dilemmas — the UI will badge them until the human confirms. Marks ranking stale; call rerank_decision_options after adding options. For vibe-coding / speed on a seeded demo: set_priority_weight(time_to_prototype, 9 or 10) then rerank — do not invent cards.","title":"Add option","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Stable option id (e.g. build, buy, adopt, hybrid)."},"name":{"type":"string","description":"Human-readable option label."},"type":{"type":"string","enum":["build","buy","open_source","hybrid"],"description":"build | buy | open_source (Adopt) | hybrid."},"prototype_time_hours":{"type":"number","minimum":0,"description":"Hours to functional v1 (TTP)."},"monthly_cash_cost":{"type":"number","minimum":0,"description":"Recurring cash per month (USD)."},"monthly_maintenance_hours":{"type":"number","minimum":0,"description":"Expected monthly engineering hours (MDO)."},"customization_score":{"type":"number","minimum":1,"maximum":10,"description":"CTL 1–10, higher = more control."},"security_risk_score":{"type":"number","minimum":1,"maximum":10,"description":"SCR 1–10, higher = more risk."},"learning_value_score":{"type":"number","minimum":1,"maximum":10,"description":"LSM 1–10, higher = more moat value."},"vendor_lockin_score":{"type":"number","minimum":1,"maximum":10,"description":"VLR 1–10, higher = more lock-in."},"estimate":{"type":"boolean","description":"True if metrics are agent-invented until human confirms."},"sources":{"type":"array","items":{"type":"string"},"description":"Short assumption/source lines shown on the option card (optional)."}},"required":["id","name","type","prototype_time_hours","monthly_cash_cost","monthly_maintenance_hours","customization_score","security_risk_score","learning_value_score","vendor_lockin_score"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_priority_weight","kind":"act","impl":"imperative","description":"Set the numeric weight (0–10) of exactly one decision criterion on the EXISTING workspace, then AUTOMATICALLY recalculate ranking (same as calling rerank_decision_options). Higher weight means that axis counts more. For vibe-coding / \"prototype speed above all\" / ship-fast follow-ups: set criterion time_to_prototype to 9 or 10 — Build falls last on the auth preset and cards update immediately. Do NOT create_decision or add_option for those follow-ups. If the weight is already at the requested value, still auto-rerank and re-emit ranking (idempotent money shot — no silent no-op).","title":"Set priority weight","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"criterion":{"type":"string","enum":["time_to_prototype","cash_tco","maintenance_overhead","customization","security_risk","strategic_learning","vendor_lockin"],"description":"Criterion key to update."},"weight":{"type":"number","minimum":0,"maximum":10,"description":"Absolute weight 0–10."}},"required":["criterion","weight"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"rerank_decision_options","kind":"act","impl":"imperative","description":"Recalculate option ranking from current priority weights, context, and skill modifiers. Required after set_priority_weight or set_decision_context — those tools mark ranking stale. Call once after finishing weight or context updates. The same ranking is shown in the human UI. This is the ONLY tool that produces an authoritative ranking. Never state, declare, or compare a winner without calling this tool first; if asked to declare a winner, call this and report only its output.","title":"Rerank decision options","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"compare_decision_options","kind":"answer","impl":"imperative","description":"Pairwise comparison of two options across all seven scoring axes using current weights and skill-adjusted metrics. Read-only — does not mutate state or refresh ranking. After set_priority_weight, ranking may be stale but comparison still uses live weights. Never declare a pairwise winner without calling this tool first; if asked which of two options wins, call this and report only its output.","title":"Compare decision options","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"first_option_id":{"type":"string","description":"First option id."},"second_option_id":{"type":"string","description":"Second option id (must differ)."}},"required":["first_option_id","second_option_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"simulate_future_scenario","kind":"act","impl":"imperative","description":"REQUIRED for future / hypothetical stress: \"if we end up HIPAA\", \"at 50k+ users\", compliance or scale projections, timeline crunch. Stress-tests ranking WITHOUT mutating baseline options or canvas cards — the UI shows a projection banner; baseline ranks stay until a real rerank. Prefer compliance_tier hipaa/soc2 and scale_band 50k+ for Act 2 (on scraping, projected leader typically flips away from Buy toward Hybrid). Also supports timeline_days_available and team_size_change. Response includes assumptions[] for auditable math. Never substitute set_decision_context + rerank for this tool.","title":"Simulate future scenario","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"scenario_name":{"type":"string","description":"Short label for the scenario (required)."},"scale_band":{"type":"string","enum":["<1k","1k-10k","10k-50k","50k+"]},"compliance_tier":{"type":"string","enum":["none","soc2","hipaa"]},"team_size_change":{"type":"number","description":"Team size delta. Each unit scales self-run maintenance (build/hybrid) by 10%; vendor options are unaffected."},"timeline_days_available":{"type":"number","minimum":1,"description":"Days until deadline for timeline crunch stress."}},"required":["scenario_name"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"solve_winning_conditions","kind":"act","impl":"imperative","description":"Sensitivity analysis: what must change for target_option_id to beat the current math leader? NOT for vibe-coding / prototype-speed / \"does that change who you'd recommend\" — those are set_priority_weight(time_to_prototype, 9 or 10) which auto-reranks. On the auth preset, this tool is REFUSED until a real set_priority_weight has run this session. After priorities are set: computes flip_levers (0-10, step 0.1), score_gap, and suggested_context_shifts. Never assert flip-lever claims without calling this tool.","title":"Solve winning conditions","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"target_option_id":{"type":"string","description":"Option id that should win."}},"required":["target_option_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"apply_human_preference_override","kind":"act","impl":"imperative","description":"Record a human strategic override when math and judgment diverge (Act 3 / Prompt 4). For \"own it\" / core IP / crawl-is-core: ALWAYS pass pin_recommendation=true and override_reason stating ownership — this pins Build (sets is_core_ip), surfaces score gap vs math leader, and fills the Liability Ledger. Does NOT recalculate ranking and never silently swaps the math winner. Missing is_core_ip is OK — the tool sets it when pinning Build.","title":"Apply human preference override","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"override_reason":{"type":"string","description":"Human justification for overriding the math recommendation."},"heavily_favored_criterion":{"type":"string","enum":["time_to_prototype","cash_tco","maintenance_overhead","customization","security_risk","strategic_learning","vendor_lockin"],"description":"Criterion the human weighted most in judgment."},"tolerance_level":{"type":"string","enum":["low","medium","high"],"description":"Tolerance for maintenance/security liabilities."},"pin_recommendation":{"type":"boolean","description":"Pin recommendation to strategic choice (Build when is_core_ip)."}},"required":["override_reason"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Productivity & Business","favicon":"/favicons/buildvsbuy-ai.vercel.app.svg","apiSurface":"spec","toolCount":9}}