jev-mcp-server
MCP server for Jev (TypeSafe System One) — a faithful mapping of the three official question types, plus batch classify.
When your coding agent needs a judgment — which log line is the root cause, how risky is this diff, is this change breaking — it usually burns a frontier LLM call and gets prose back. Jev answers with a typed decision and calibrated probabilities in a fraction of a second, for a fraction of a cent:
| Question type | Tool | Returns | Measured* |
|---|---|---|---|
choice |
pick 1 of 2-100 options | winner + probabilities over ALL options + confidence | ~0.6 s, ~$0.00002 |
score |
grade on a rubric of 2-8 levels | fractional index + per-level probabilities | ~0.5 s, ~$0.00002 |
noul |
yes / no | 0-1 degree | ~0.4 s, ~$0.00001 |
classify |
label up to 100 items | per-item choice + aggregate summary | ~0.5 s × items |
* Measured against jev-1.13.0, 2026-09, from real sessions (see Benchmarks).
Why this one
- 1:1 with the official API. Tool names match the System One question types (
choice/score/noul), so anything you learn from TypeSafe's docs transfers directly. No invented abstractions. - Decisions, not explanations. Jev never returns reasons — any "why" your assistant writes is its own interpretation of the probability distribution. The README (and the tool docs) say so explicitly, so reports built on top stay honest.
- Batch
classifyfor routing/labeling workflows, with per-item caching. - One-time
setuptool: paste your API key once in chat; it's verified live, stored with0600permissions, and never echoed back. - Bilingual docs (English / 简体中文), configs for Claude Code, Codex, OpenCode, pi, and any stdio MCP client.
- Offline-tested (no network in CI), retries on 429/503/529, response validation (probabilities sum to 1, winner is the max), optional response cache.
Quickstart
- Get a TypeSafe API key at console.typesafe.ai/settings/keys.
- Register the server with your client (pick one below).
- Either export
TYPESAFE_API_KEY, or just ask your agent: "run the jev setup tool with keytsk_...".
Claude Code
claude mcp add jev --env TYPESAFE_API_KEY=YOUR_KEY -- uvx jev-mcp-server
Codex (~/.codex/config.toml)
[mcp_servers.jev]
command = "uvx"
args = ["jev-mcp-server"]
env = { TYPESAFE_API_KEY = "YOUR_KEY" }
OpenCode (~/.config/opencode/opencode.json)
{
"mcp": {
"jev": { "type": "local", "command": ["uvx", "jev-mcp-server"], "enabled": true }
}
}
pi (~/.pi/agent/mcp.json)
{
"mcpServers": {
"jev": { "command": "uvx", "args": ["jev-mcp-server"], "lifecycle": "lazy" }
}
}
Any stdio MCP client
{ "command": "uvx", "args": ["jev-mcp-server"] }
From source (this repo)
{ "command": "uv", "args": ["run", "--directory", "/path/to/jev-mcp-server", "jev-mcp-server"] }
Tools
choice(question, options, context="")
Pick ONE of 2-100 mutually exclusive options. Returns probabilities over all options (near-ties are visible), confidence, and the runner-up.
{"choice": "E1", "confidence": 0.67,
"probabilities": {"E1": 0.72, "E6": 0.2, "E5": 0.05, "E2": 0.01, "E3": 0.01, "E4": 0.01},
"runner_up": "E6", "model": "jev-1.13.0", "latency_ms": 678,
"usage": {"input_tokens": 1677, "output_tokens": 66}}
score(question, levels, context="")
Grade on an ordered rubric of 2-8 levels. score is a fractional 0-based index: 2.22 with levels ["minor","moderate","severe","critical"] means severe, leaning critical.
{"score": 2.22, "nearest_level": "severe", "confidence": 0.59,
"probabilities": {"severe": 0.6, "critical": 0.2, "moderate": 0.2}, "...": "..."}
noul(question, context="")
Yes/no with a 0-1 degree (>= 0.5 leans yes). No probability list — the degree is the answer.
{"noul": 0.76, "verdict": "yes", "model": "jev-1.13.0", "latency_ms": 402, "usage": {"...": "..."}}
classify(items, options, question=..., context="")
Batch-label up to 100 items against one shared category set. One choice call per item, aggregated:
{"results": [{"item": "ticket #1", "choice": "billing", "confidence": 0.81, "probabilities": {"...": "..."}}],
"summary": {"billing": 12, "bug": 7, "howto": 3},
"usage": {"input_tokens": 8210, "output_tokens": 210, "calls": 22, "cached_calls": 0}}
setup(api_key)
One-time onboarding: verifies the key with a live call, stores it at ~/.config/jev-mcp/key (0600), never echoes it. An env var TYPESAFE_API_KEY always wins over the stored file.
Caching (off by default)
Set JEVMCP_CACHE=1 to enable. The cache key is the SHA-256 of the exact question payload, so:
- Identical repeated decisions (retries, re-runs, deterministic pipelines) return in ~0 ms at zero API cost;
usagethen reports{"cached": true}. classifybenefits automatically: duplicate items inside one batch are single-billed.
Keep it off when decisions must stay fresh (live triage of changing data). Cache files live in ~/.cache/jev-mcp/ (override with JEVMCP_CACHE_DIR); delete them anytime.
Configuration
| Variable | Default | Purpose |
|---|---|---|
TYPESAFE_API_KEY |
— | API key (env wins over the file written by setup) |
JEVMCP_MODEL |
jev-latest |
Model name sent to the API |
JEVMCP_BASE_URL |
https://api.typesafe.ai/v1/systemone |
Point at a compatible gateway (experimental) |
JEVMCP_CACHE |
off | 1/true enables the response cache |
JEVMCP_CACHE_DIR |
~/.cache/jev-mcp |
Cache location |
JEVMCP_CONFIG_DIR |
~/.config/jev-mcp |
Where setup stores the key |
Note on OpenRouter: Jev was announced for OpenRouter (
~typesafe/jev-latest), but at publish time it does not appear in OpenRouter's public model catalog, and we could not verify a compatible call shape. If you route Jev through a gateway, setJEVMCP_BASE_URLaccordingly and please open an issue with your findings.
Decisions, not explanations
Jev's contract is: a decision, calibrated probabilities, and nothing else — no rationale text. That is why it is fast and cheap. When your assistant narrates "jev chose E1 because...", that explanation is the assistant's interpretation of the numbers, not Jev's output. For formal reports (root-cause analyses, review verdicts), either let the LLM reason itself, or use the two-step pattern — Jev decides, LLM explains, clearly labeled.
Benchmarks
Measured 2026-09 against jev-1.13.0, single questions, real sessions:
| Call | Latency | Input tokens | Output tokens |
|---|---|---|---|
choice, 6 options |
615-678 ms | 344-1677 | 31-66 |
score, 3 levels |
~500 ms | ~350 | ~30 |
noul |
~400 ms | ~300 | ~25 |
At $42 / 1B input tokens a typical call costs ≈ $0.00002 — roughly two orders of magnitude below a frontier-LLM judgment call.
Alternatives (fair and square)
- jkudish/jev-mcp — Node/npm, ten opinionated workflow tools (verify, screen, rerank, gate...). Pick it if you want ready-made agent-safety workflows.
- itsmostafa/typesafe-mcp — Go binary, one generic
evaluatetool, one-command client setup.
jev-mcp-server is the close-to-the-metal option: the three official question types, named exactly as TypeSafe names them, with batch classify, bilingual docs, and measured numbers. Pick whichever fits your taste — they're all MIT.
Development
uv sync
uv run ruff check .
uv run pytest -q
Tests are fully offline (the HTTP layer is mocked; CI never spends API credits).
License
Release files for jev-mcp-server 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| jev_mcp_server-0.1.0.tar.gz | 84.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| jev_mcp_server-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 97.6 kB
Release files / jev_mcp_server-0.1.0.tar.gz
| Download URL | jev_mcp_server-0.1.0.tar.gz |
|---|---|
| Size | 84.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9c62dea23f3e2bf2388ef93b7508f8a3054aa74005dde13d761fc1c95b282e3d
|
|
BLAKE2b-256 checksum How to use checksums |
2e39b0f7d3f6956b36565689b9cc4dcb21003f283c5a4b532123360301b27cc3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / jev_mcp_server-0.1.0-py3-none-any.whl
| Download URL | jev_mcp_server-0.1.0-py3-none-any.whl |
|---|---|
| Size | 13.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
dbab423bcf6cd0abe66db9920aa4066710919cbc581167a9ddd1c56f6b70aeb7
|
|
BLAKE2b-256 checksum How to use checksums |
91b922bc756a5230e3969c781b20740ae2ee645150347c732c1e1a15f9b67454
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|