jev-mcp-server
MCP server for Jev, TypeSafe's System One model. It exposes the three official question types (choice, score, noul) plus compare, verify, batch classify, and a one-command installer that writes your client config for you.
What is Jev
Jev is a hosted decision model from TypeSafe. You send a structured question with enumerated options; it returns a typed answer with calibrated probabilities and a confidence value. It does not write prose and it does not explain itself. A single call costs roughly $0.00002 to $0.0001 and returns in about half a second, which is what makes it practical for the small, repeated judgments (triage, routing, grading, gating) that a frontier model is too slow and too expensive to run on every item.
You need a TypeSafe API key. There is no local model, no second LLM, and nothing else to install.
Quickstart
# 1. Get a key: https://console.typesafe.ai/settings/keys
# 2. Install into your client (config is written for you):
uvx jev-mcp-server install claude-code # or: pi | cursor | opencode | codex
# 3. Restart the client if it is running, then ask:
# "Which of these rollout plans is safest? Show me the probability split."
No uv yet? curl -LsSf https://astral.sh/uv/install.sh | sh, or brew install uv, or pip install uv. A plain pip install jev-mcp-server works too; the installer subcommand is the same either way.
Manual config (clients without an installer entry)
Most stdio MCP clients take this shape:
{
"mcpServers": {
"jev": {
"command": "uvx",
"args": ["jev-mcp-server"],
"env": { "TYPESAFE_API_KEY": "apikey_xxx" }
}
}
}
Codex (~/.codex/config.toml):
[mcp_servers.jev]
command = "uvx"
args = ["jev-mcp-server"]
[mcp_servers.jev.env]
TYPESAFE_API_KEY = "apikey_xxx"
OpenCode (opencode.json, "mcp" section): {"jev": {"type": "local", "command": ["uvx", "jev-mcp-server"], "env": {"TYPESAFE_API_KEY": "apikey_xxx"}}}
Prefer not to put the key in config at all? Skip the env block and call the setup tool once from your agent. It verifies the key live and stores it with 0600 permissions.
Tools
| Tool | Official type | What it does | Typical use |
|---|---|---|---|
choice |
choice |
Pick 1 of 2-100 options; probabilities over all options, so near-ties are visible | Triage, routing, tie-breaking |
score |
score |
Grade on an ordered 2-8 level rubric; fractional index (1.88 = between levels 1 and 2, leaning to 2) | Risk / severity / quality grading |
noul |
noul |
Yes/no question with a 0-1 degree | "Is this change breaking?" |
compare |
choice (A/B) |
Which of two candidates wins, with the visible probability split | Titles, plans, messages |
verify |
noul (claim/evidence) |
Support degree of ONE claim against evidence you supply | Fact-check lines, log-vs-symptom |
classify |
choice (batch) |
Up to 100 items against one shared category set, aggregated | Labeling queues, sorting inboxes |
setup |
(none) | Verify a key once, store it locally (0600) | Onboarding without env config |
Examples
Real calls; responses quoted as returned (only usage and model trimmed).
choice: which change is most likely a breaking change for API consumers? Options: rename an existing config key, add an optional response field, change the log format.
{"choice": "rename_config_key", "confidence": 1.0,
"probabilities": {"rename_config_key": 1.0, "add_optional_field": 0.0, "change_log_format": 0.0}}
score: regression risk of rewriting an auth middleware in place, no tests written yet, on a minor/moderate/severe rubric:
{"score": 1.98, "nearest_level": "severe", "confidence": 0.96}
verify: claim "all tests in the latest CI run passed", evidence "the CI log shows 3 failed tests out of 250":
{"noul": 0.01, "verdict": "not supported"}
When to use it
Good fit:
- Enumerated options: triage, routing, tie-breaks, A/B calls
- Rubric grading: risk, severity, review triage
- Binary checks at volume: breaking-change gates, claim-vs-evidence checks
- Batch labeling: 100 items against one label set for about $0.007
Poor fit:
- Open-ended reasoning or long-context analysis
- Anything that needs an explanation attached. Jev returns numbers; any "reason" your assistant adds is its own reading of those numbers, not output from the model
Cost and latency (measured)
Single calls, indicative only; cost at $42 per 1B input tokens.
| Call | Latency | Input tokens | Cost |
|---|---|---|---|
choice, 6 rich options + context |
~0.6-0.7s | ~1.7k | ≈ $0.00007 |
noul / verify, short context |
~0.4-0.6s | ~0.3-0.5k | ≈ $0.00002 |
classify, 100 items |
~1 min sequential | ~100× a single call | ≈ $0.007 |
Configuration
| Variable | Meaning | Default |
|---|---|---|
TYPESAFE_API_KEY |
API key; env var beats the file stored by setup |
required |
JEVMCP_BASE_URL |
API endpoint override (experiment with relays) | https://api.typesafe.ai/v1/systemone |
JEVMCP_MODEL |
Model name | jev-latest |
JEVMCP_CACHE |
1/true/on enables the response cache |
off |
JEVMCP_CACHE_DIR / JEVMCP_CONFIG_DIR |
Relocate cache / key storage | ~/.cache/jev-mcp, ~/.config/jev-mcp |
With JEVMCP_CACHE=1, identical question payloads are answered from disk at zero cost (usage.cached: true); classify deduplicates repeated items automatically.
FAQ
Why does Jev never explain its choice? By design; "decisions, not strings" is the product. The probability distribution is the output. Explanations would cost the latency and tokens this model exists to avoid.
Do I need another LLM or a local Jev install? No. Jev is a cloud API; there is no local model and no helper LLM. Your agent's main model decides when to call these tools and reads the numbers.
Why not just ask my main LLM? You can, and for one-off questions you probably should. The difference shows up in loops: an LLM's stated confidence is not calibrated, a call costs 100× more, and it takes seconds instead of milliseconds. Per item across a batch, that gap compounds.
Is there another Jev MCP? Yes. jkudish/jev-mcp (Node/npm) offers ten workflow-shaped tools, and a Go server exists. This one is the Python/uvx side: faithful official question types, one-command install, bilingual docs, MIT.
License
Release files for jev-mcp-server 0.2.2
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.2.2.tar.gz | 87.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| jev_mcp_server-0.2.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 103.4 kB
Release files / jev_mcp_server-0.2.2.tar.gz
| Download URL | jev_mcp_server-0.2.2.tar.gz |
|---|---|
| Size | 87.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8ba4489363235e588e4b5b7c7bdbc0dcf4aefc25b743426be9df2bddccb9d3a3
|
|
BLAKE2b-256 checksum How to use checksums |
c2b3ec273c445be296d541cff99f971c0c62a4bd6f54ecfb924a0a1c6ef6c49d
|
| 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.2.2-py3-none-any.whl
| Download URL | jev_mcp_server-0.2.2-py3-none-any.whl |
|---|---|
| Size | 15.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
dca78cb59fd9b04fc4cd1f2b67d615cd3fb0cc661350f98bccce37275f62d8e0
|
|
BLAKE2b-256 checksum How to use checksums |
38564b7f2736b21c84e00ec0ffc674cd8127dcca3223890760979fdb71f79228
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|