MCP server that gives AI agents typed decisions instead of prose: classify, route, score, and flag with calibrated probabilities. npx -y openjev-mcp
openjev-mcp
以下摘录自该仓库的 README(片段) · 在 GitHub 读完整 README →
**Give your agent decisions, not paragraphs.** An MCP server that turns "classify this",
"how severe is this", and "is this urgent?" into typed answers with calibrated
probabilities that your code can branch on.
%22%2C%22password%22%3Atrue%7D%5D&config=%7B%22name%22%3A%22openjev%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22openjev-mcp%22%5D%2C%22env%22%3A%7B%22OPENJEV_API_KEY%22%3A%22%24%7Binput%3Aopenjev_api_key%7D%22%7D%7D)
A real call: one ticket, three questions, one request. Reproduce it with
OPENJEV_API_KEY=... npm run demo (demo/run.mjs).
**See an agent use it:** recorded transcripts of DeepSeek Harness triaging an
electric co-op's help desk, from one member complaint to a morning's queue.
It's powered by **Jev**, TypeSafe's System One model, through the public
OpenJEV API. You send one context and any number of
independent questions in one call, and the server checks the request locally, retries
transient failures, and validates every answer before your agent sees it.
What people use it for
| Use case | Tool | Example question |
| --- | --- | --- |
| Support triage | jev_ask | Which team owns this ticket, and is it urgent? |
| Content moderation | jev_score | How harmful is this message: none, mild, serious? |
| Prompt-injection screening | jev_noul | Is this input trying to override instructions? |
| Agent routing | jev_choice | Which sub-agent or workflow should handle this request? |
| PR / change risk | jev_score | How risky is this diff to deploy on a Friday? |
| Lead qualification | jev_ask | Company size bucket? Buying intent? Budget mentioned? |
| LLM-as-judge evals | jev_score | Does this answer fully address the question? |
| Free text to a known value | jev_choice | Which of our 200 product SKUs is this customer describing? |
| Queue triage and backfills | jev_batch | For each of these 80 open tickets: which category, and is anyone in danger? |
The rule of thumb: if ordinary code can't express the decision but your code needs to
act on the result, it's a Jev question.
Quick start
You need Node.js 20+ and an API key from .
**Claude Code**
**Cursor, VS Code:** use the install buttons above, then paste your key.
**Claude Desktop, Windsurf, Cline, and any other client** that uses the mcpServers
shape:
Then ask your agent something like *"Use jev_ask to route this ticket and tell me if
it's urgent: …"*.
If calls fail with a missing key, the key is in the wrong place. Each client reads it
from a different spot, and some spots silently do nothing:
see **Where the API key goes**.
Verify the key
It spends one small judgment and exits 0. A rejected key exits 1 with the reason;
a missing key exits 2. Running the server by hand without --check proves nothing:
it waits silently for a client on stdin.
DeepSeek Harness
This server is developed and verified against
DeepSeek Harness. Add one entry to
the profile patch layer at ~/.dsh/profiles/ /cordis.patch.yml:
Two fields are deliberate. The key is named in env because the harness hands MCP
children a scrubbed environment with credential-shaped names removed. The timeout is
raised because the server's own worst case is ~120 s (see
docs/production.md), and the 60 s default would abort the third
attempt.
Other ways to install
- **Global install**, for a pinned version and a faster start than npx:
npm install -g openjev-mcp, then use "command": "openjev-mcp" with no args.
- **From a checkout:** npm ci && npm run build, then "command": "node" and
"args": ["/absolute/path/to/openjev-mcp/dist/index.js"].
Passing --env-file=... through args does **not** work with openjev-mcp or npx:
Node validates the flag when it appears after the script name but does not load it, so
the server would start without a key. To keep the key in a file, use command: node
with args: ["--env-file=/path/to/.env", "/path/to/dist/index.js"].
The server **exits immediately** if the key is missing or a setting cannot be parsed,