← WebMCP Directory

Tool tree

buildvsbuy-ai.vercel.app

Productivity & BusinessTools verified
Website
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.
Explore capabilities
    create_decisionAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    set_decision_contextAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    add_optionAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    set_priority_weightAction

    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).

    View tool JSON
    {
      "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).",
      "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
      }
    }
    rerank_decision_optionsAction

    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.

    View tool JSON
    {
      "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.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    compare_decision_optionsAnswer

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    simulate_future_scenarioAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    solve_winning_conditionsAction

    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.

    View tool JSON
    {
      "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.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "target_option_id": {
            "type": "string",
            "description": "Option id that should win."
          }
        },
        "required": [
          "target_option_id"
        ],
        "additionalProperties": false
      }
    }
    apply_human_preference_overrideAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }