Minimal MCP server exposing TypeSafe/OpenRouter /api/alpha/decisions as
five judgment tools for coding agents.
| Tool | Purpose | Returns |
|---|---|---|
jev_verify |
Does the evidence support the claim? | noul (0..1) + confidence |
jev_classify |
Which label fits the state? | choice + probabilities + confidence |
jev_screen |
Relevance + risk for fetched content | choice + score |
jev_decide |
Pick from rich options with criteria | choice + probabilities |
jev_extract |
Detect named fields in a state | per-field noul |
bun install
bun run buildOpenCode / Claude Code:
{
"mcpServers": {
"jev": {
"command": "node",
"args": ["/path/to/jev-mcp/dist/index.js"],
"env": {
"OPENROUTER_API_KEY": "sk-or-v1-..."
}
}
}
}Or use TYPESAFE_API_KEY (TypeSafe direct, cheaper) instead of OPENROUTER_API_KEY.
The MCP client passes tool inputs as JSON; the server returns JSON text content
plus isError: true when fail_on predicates match.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "jev_classify",
"arguments": {
"state": "I want to wash my car, the wash is 50m away",
"choices": ["question", "command", "smalltalk", "info"]
}
}
}Response:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "{\"type\":\"choice\",\"choice\":\"info\",\"probabilities\":{\"info\":0.96,...},\"confidence\":0.94}"
}
]
}
}See src/tools.ts for the JSON Schema for each tool. Highlights:
jev_verify—{ claim, evidence, instructions?, fail_on?: "true"|"false", timeout_ms? }jev_classify—{ state, choices: string[], criteria?, instructions?, fail_on?, timeout_ms? }jev_screen—{ text, relevance_labels?, fail_on?: { relevance?, min_risk? }, timeout_ms? }jev_decide—{ state, options: Record<key, description>, instructions?, fail_on?, timeout_ms? }jev_extract—{ state, fields: string[], timeout_ms? }
fail_on predicates return isError: true (rather than silently passing) when
matched, so agents see the warning and decide whether to proceed.
- Single-binary, zero runtime deps. Pure Bun stdlib +
node:fs/promises. - Provider abstraction at the wire level (TypeSafe direct or OpenRouter via the
/api/alpha/decisionsendpoint). Routing picks TYPESAFE if set, otherwise OR. - No telemetry, no state across calls. Each tool call is independent.
- Original implementation. Design intent informed only by the public MCP protocol and the public TypeSafe/OpenRouter API contracts.
MIT