How we reviewed this: we installed the package in Docker on Python 3.12 exactly as the README says, ran its tests, drove the MCP server over stdio, and captured its requests against a stand-in.
What it is
Three things in one package: a CLI called jev with the familiar commands (verify, screen, classify, extract, match, route…), prompt libraries and slash commands for agent hosts, and an MCP server called jev-studio.
The README is upfront about where the CLI came from: “a Python port of the TypeScript jev-cli, rebuilt on the standard library with the same command surface and question shapes”. Crediting the original is the right thing to do, and reimplementing a TypeScript CLI in dependency-free Python is a reasonable thing to want.
The MCP server does not start
The README’s install is two lines. Following them:
$ pip install jev-studio && jev-studio
ModuleNotFoundError: No module named 'mcp.server.fastmcp'. This is mcp 2.x, where
FastMCP was renamed to MCPServer … or pin 'mcp<2' to keep running v1 code.
pyproject.toml asks for mcp>=1.0.0, and pip resolves that to 2.x, where the import moved. Every fresh install gets a server that exits on startup. With mcp<2 installed, it comes up and completes a handshake:
initialize: ok
tools: 1 ['jev_instructions']
One tool, which serves the ruleset text. The package description says “MCP tools for Choice/Noul/Score”, so a reader would expect three tools that ask questions; what is served is instructions for an agent that will ask them itself. Both are reasonable products; they are not the same product.
The port inherited two bugs that are already fixed upstream
We reviewed jev-cli two days ago and reported four things; the maintainer merged the fixes and released them. The port predates that, and it shows:
$ jev ask "I was charged twice" -q @/tmp/q.json --dry-run
jev: error: unrecognized arguments: @/tmp/q.json # -q is taken by --quiet
$ jev models --dry-run # against a dead base URL
jev: Transport error: [Errno 111] Connection refused # it tried
--questions works, as it did upstream. Neither is a deep bug; both are the kind of thing a port acquires by being a faithful copy at the wrong moment, and both have a one-line fix in the original to copy from.
Two details to know
It identifies as jevctl on the wire. provider.py sets USER_AGENT = "jevctl", which is the npm package name of the project it was ported from. Your requests are labelled as the other tool.
It shares a keychain entry. credentials.py sets SERVICE = "jevctl", so on a machine with both installed, storing or deleting a key in one reaches into the other’s keyring item. A distinct service name would avoid a confusing afternoon.
To its credit, what goes over the wire is clean. We captured a real request against a stand-in:
{"state": "I was charged twice", "questions": {"ok": {"type": "noul", …}}, "model": "jev-latest"}
State, questions, model, nothing else — the dry-run view prints a cwd field locally, but it does not travel.
Maintenance
Created 19 September, twenty-one commits, MIT, published to PyPI as jev-studio 0.2.0. The test suite is three tests, all passing, covering the instructions module; the ported CLI has none of its own.
The MIT licence carries the porting author’s copyright only. The README credits jev-cli in prose, which is the important part for readers; whether a port needs to carry the original notice as well is a question for the two authors, and a NOTICE line would settle it either way.
Verdict
The pieces are reasonable and the honesty about the port is welcome, but the front door is broken: the MCP server that the package is named after will not start after a plain pip install, and that is a one-character fix in pyproject.toml (mcp>=1.0.0,<2). We’ve reported it, along with the two inherited bugs and the shared jevctl names.
If you want the CLI, take jev-cli 0.2.3, where the two bugs above are fixed. If you want the prompt libraries and slash commands, install this and pin mcp<2 yourself until it is fixed.
See how it compares with other tools in Best Jev tools, tested hands-on.
Review updated Sep 21, 2026. Numbers quoted from the project are its author's own; we don't publish our own measurements of Jev.