scale4-mcp-server
v0.1.1
Published
Anti-sycophancy startup-idea assessment protocol, distributed via MCP. AI coding agents (Cursor, Claude Desktop, Claude Code, Cline, …) call scale4.start({pitch}) and walk a 7-axis evidence-grounded protocol with Bayesian posterior + risk-weighted roadmap
Maintainers
Readme
scale4-mcp-server
Anti-sycophancy startup-idea assessment protocol distributed as an MCP server.
Forces evidence-grounded scoring across seven axes, kills sycophancy by construction (you cannot score without disconfirming evidence), and emits a risk-weighted roadmap as the closing artifact.
Install
{
"mcpServers": {
"scale4": {
"command": "npx",
"args": ["-y", "scale4-mcp-server"],
"env": {
"SCALE4_SESSION_SECRET": "<32+ char random string>",
"SCALE4_API_KEY": "<optional — Pro/Team features and quota enforcement>"
}
}
}
}SCALE4_SESSION_SECRET is required. Generate one with:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"SCALE4_API_KEY is optional. Without it, all free-tier tools work and no
server-side quota is enforced. With a free-tier key the 3-assessment/month
limit is enforced; with a Pro/Team key gated tools are unlocked.
Tools
| Tool | Tier | Description |
|------|------|-------------|
| scale4.start | free | Open an assessment session. Returns protocol spec + session token. |
| scale4.submit_signal | free | Submit one piece of evidence for one axis. Validates shape (URL HEAD-check, length, placeholder detection). Returns refreshed token. |
| scale4.check_progress | free | Per-axis completeness summary — how many signals collected vs required. |
| scale4.score | free (gated) | Gated: runs only when all axes have minimum required signals. Returns 70-point scorecard + verdict. |
| scale4.generate_roadmap | free | Risk-weighted milestone list from scored axes. Requires score() first. |
| scale4.export | free | Markdown bundle of assessment + evidence ledger + roadmap. PDF format requires Pro. |
| scale4.deep_research_mode | Pro+ | Returns optional-signal spec for an axis (competitor pricing, LinkedIn lookup, search volume). |
| scale4.stackforge_handoff | free (build verdict) | Translates passed assessment into a Stackforge compose_stack intent. Gated by build verdict. |
| scale4.pitchforge_handoff | Pro+ | Translates assessment into a Pitchforge deck-generation seed. |
The 7-axis protocol
Axis Required signals
───────────── ─────────────────────────────────────────────────────────
problem user_quote ×3, counterfactual_quote ×1
market icp_definition ×1, named_prospect ×3, acv_estimate ×1
solutions named_competitor ×5, dissatisfaction_quote ×3, pricing_row ×3
wedge wedge_statement ×1, anti_wedge ×1, replication_estimate ×1
distribution channel_choice ×1, cac_benchmark ×1, founder_channel_fit ×1
economics cac ×1, ltv ×1, gross_margin ×1, breakeven_customers ×1
founder domain_years ×1, unfair_advantage ×1, shipped_artifact ×1Maximum: 70 points. Verdicts:
- build — total ≥ 56, no axis below 6
- iterate — total 42–55
- scope_cut — 3+ axes ≤ 5
- pivot — any axis ≤ 3
- kill — pivot conditions AND total < 42
State posture
The server holds zero state. Every tool call takes a signed session token
(srv1.<payload>.<hmac>), verifies the HMAC, and returns an updated token.
The agent stores the token. Losing the token means starting over.
Expiry: 30 days from start. Token size limit: 32 KB (~80 full signal entries).
Anti-sycophancy guarantee
Every axis has at least one required disconfirming signal:
problem— requires a counterfactual quote (someone for whom the pain is NOT acute)solutions— requires naming 5 competitors (not zero or one)wedge— requires explaining why incumbents haven't done this (specific reason required)
The scoring gate refuses to run until evidence is in. The agent can't simulate validation — it has to do it.
Security notes
- Session tokens are HMAC-SHA256 signed; any tampering breaks verification
- Axis JSON files are ed25519 signed; the public key is pinned in the binary
SCALE4_TRUST_INSECURE=1bypasses axis signature verification in dev only (NODE_ENV !== 'production')- URL HEAD-check validator fails closed (4xx/5xx → signal rejected)
- Scoring expression evaluator uses a Pratt parser — no eval(), no Function()
