integrate
Four routes, from "paste this" to "call this". They all reach the same bar: a score computed by code, and a gate that can refuse. Pick the one that matches how you already work — you do not need to be technical for the first two.
Paste a brief, press score, read what fails and fix it in place. Works offline on a keyword stub, and the live judge reads the meaning of any language. Nothing to install, nothing to sign.
seconds → open the consoleCopy one prompt into an assistant that can reach the network — Claude Code, Cursor, your editor's assistant, or anything wired to the MCP server. It fixes the gate first, quotes the evidence and re-scores. No account, no key, no code. Browser chats cannot reach the API: their sandboxes block the host.
1 minute → copy the promptYour assistant gets four tools — read the rules, score, suggest fixes, check the bar — and a guided prompt. It runs on your machine and talks to the public API; bring your own model key if you want to.
5 minutes → set it up belowOne POST returns the score, the gate and a verdict per rule with verbatim evidence. Stable, versioned, and pinned by a contract test suite: what you build against will not move under you.
10 minutes → API docs| where you work | MCP server | paste a prompt | call the API |
|---|---|---|---|
| Claude · Desktop, Code | ✓ | ✓ | ✓ |
| claude.ai · ChatGPT, in the browser | ✓ add briefs.welance.com/mcp as a connector | no — the chat sandbox cannot POST | no |
| Cursor · VS Code · Zed | ✓ | ✓ | ✓ |
| Any other assistant | if it speaks MCP | ✓ | ✓ |
| Your code · CI · a product | — | — | ✓ |
A chat in the browser runs its tools in a sandbox that cannot reach this API, and its fetch tool is GET only. Its door is the hosted connector: add the URL below in the assistant's connector settings and the platform makes the calls for it.
Every route reaches the same bar; only the effort differs. Nothing here is a partnership or a plugin store — it is one open endpoint and one small server you can read.
One interest to declare, wherever your brief comes in from: this bar gates welance's own Directory, welance pitches there as a team, and what that obliges the operator to is written in the Operator Covenant.
Your assistant, holding a bar it cannot bend.
In the browser (claude.ai, ChatGPT): add this URL as a custom connector in the assistant's settings. Same four tools, same prompt, nothing to install. It runs on the service-funded judge, so no key is involved and the usual per-address limit applies.
https://briefs.welance.com/mcp
On your own machine, the local server below is the same bar and adds one thing the hosted one never will: your own key.
Install nothing: uvx fetches and runs it. You need uv (or use pipx).
Add this to your assistant's MCP configuration — Claude Desktop, Claude Code, Cursor, or anything else that speaks MCP.
{
"mcpServers": {
"brief-bar": {
"command": "uvx",
"args": ["--from", "git+https://github.com/welance/perfect-brief#subdirectory=mcp-server", "brief-bar-mcp"]
}
}
}
Ask it to score a brief. It will read the rules first, report the decision, and fix the gate before anything else — that order is built into the server's own prompt.
Optional: set PB_LLM_KEY to your own OpenRouter key and the judge runs on your account — we forward the call and run no model for you. See your brief, your key for exactly what travels where.
The console imports PDF, TXT and Markdown files up to 10 MB and extracts text locally in the browser. The public API accepts the extracted brief string, up to 1,000,000 characters by default; operators may set a lower limit, and model context limits still apply. Original file bytes are not uploaded. Scanned or password-protected PDFs require preparation before import. Attachment publishing is a separate concern.
curl -X POST https://briefs.welance.com/v1/score \
-H 'content-type: application/json' \
-d '{"brief":"…","judge":"llm"}'
const res = await fetch("https://briefs.welance.com/v1/score", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ brief, judge: "llm" }),
});
const { score, decision, gate } = await res.json();
import httpx
r = httpx.post("https://briefs.welance.com/v1/score",
json={"brief": brief, "judge": "llm"})
score, decision = r.json()["score"], r.json()["decision"]
Read the bar first with GET /v1/rules, or point a machine at llms.txt. Full reference in the API docs.
It scores articulation, not truth.
A brilliantly written brief for a doomed product will score well. What the bar gives you is narrower and more useful than a verdict on your idea: a number two people get the same way, a gate that refuses on policy rather than taste, and a shared vocabulary — "success-metrics is failing, weight 10" beats "the AI thinks it could be better". Build on that, not on the promise of good judgement.