PromptWell sits between you and Fable 5.
Messy prompt in. Crisp prompt out. Fewer tokens burned.
// In Claude Code, call it as an MCP tool: mcp__promptwell__crisp({ task: "fix the auth bug", context: "Next.js app, JWT auth in src/lib/auth.ts" // optional }) // Returns: { crisp_prompt: "Goal: Fix JWT token expiry handling...\n\nConstraints:\n- do not change token format\n...", blueprint: { structural_goal: "Fix JWT token expiry in auth middleware", disambiguation_score: 72, what_was_vague: ["no file path specified", "unclear which auth system"] }, estimated_token_savings: "~2,880 tokens" }
mcp__promptwell__score({
original_prompt: "fix the auth bug",
disambiguation_score: 72, // from crisp()
what_was_vague: ["no file path specified"], // from crisp()
result_summary: "Fixed JWT expiry, all tests pass",
tokens_used: 4200 // optional
})
mcp__promptwell__stats()
// Example output:
PromptWell Stats
Sessions tracked: 24
Avg disambiguation score: 48/100 (lower = crisper)
7-day avg: 41/100
30-day avg: 56/100
Estimated tokens saved: ~38,400
Top patterns to fix:
- no file path specified (seen 14x)
- no success criteria (seen 9x)
- unclear which system (seen 6x)
npx promptwell init runs, PromptWell is registered as an MCP server.
Claude Code can call it automatically — you never need to leave the chat.
// Rich context = much better crisp prompt: "crisp this: fix the login button in src/components/LoginButton.tsx — it shows on iOS Safari but tap does nothing. Don't change the API contract." // Claude Code routes it as: mcp__promptwell__crisp({ task: "fix the login button", context: "src/components/LoginButton.tsx, iOS Safari, tap has no effect" })
crisp() is right before you'd normally type a long, multi-sentence prompt to Fable 5.
If you can describe the task in one crisp sentence with a file path and a success criterion, you probably don't need it.
If you can't — you do.