jevqueue
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@jevqueueis it safe to run: curl -s https://get.sh | bash"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
jevqueue
A decision queue in front of your agent's tools.
Your agent picks a tool. Before it runs, jevqueue asks a decision model whether it should — and refuses the call when the answer is no.
agent decides to call Bash ──► jevqueue ──► decision model
│
┌───────────────────┴───────────────────┐
▼ ▼
allow the call refuse the call, with a reasonAn ordinary agent loop asks one model to do two unrelated jobs: decide what to do next, and write the thing. The two share a pass, so two things go unchecked. The wrong tool runs, because nothing verifies the selection against anything. And the agent reports success on work that never happened, because the model that decides to stop is the model claiming it finished, and a model is a poor witness to its own reliability.
jevqueue moves the decision out of that pass and gives it a place to be enforced.
One package, two guarantees
Both live here, in one install, with no dependencies.
What it is | Who it is for | |
The decision layer | The provider is constrained to a named tool, and the result is checked against it. A provider that ignores the constraint raises before anything executes. | People building an agent |
The gate | A pre-tool hook that refuses a step the decision layer says should not run, and escalates a risky one. | People running an agent |
They are different guarantees and it matters which one you have. A hook cannot constrain a provider's generation — the provider is not yours to constrain from a hook. What it can do is refuse a step, and that is worth a great deal. See Which guarantee do you need?.
Related MCP server: Squidbrake
Install
As a plugin — Claude Code
claude plugin marketplace add iamvazghen/jevqueue
claude plugin install jevqueue@jevqueueIn one command, on Claude Code v2.1.292 or later:
claude plugin install jevqueue --marketplace iamvazghen/jevqueueOr from inside a session, on v2.1.275 or later:
/plugin install jevqueue --marketplace iamvazghen/jevqueueAs a plugin — Codex CLI
codex plugin marketplace add iamvazghen/jevqueue
codex plugin add jevqueue@jevqueueAs an extension — Gemini CLI and Qwen Code
gemini extensions install https://github.com/iamvazghen/jevqueue --consentQwen Code takes the same format, but asks which plugin to install when the URL points at a
marketplace, so name the plugin and pass --consent:
qwen extensions install iamvazghen/jevqueue:jevqueue --consentBoth install from the published GitHub release, so a new version appears with
gemini extensions update jevqueue rather than a reinstall.
As a plugin — opencode
opencode reads opencode.json from your project, so add the plugin there:
{ "plugin": ["https://github.com/iamvazghen/jevqueue"] }Everywhere else
Cursor, Windsurf, Kiro, Cline, OpenClaw, GitHub Copilot and the agents.md standard all read
a rules file, and this repository ships one for each — copy the one your agent looks for, or
point it at the jevqueue skill. Every agent that speaks MCP gets the portable core as a
tool called jevqueue_decide — registered for you by Claude Code, Codex and GitHub Copilot
when the plugin installs — and the rules file tells the agent when to use it and what to do
when it says no.
Where it runs, and what that buys you
Agent | Mechanism | What it gets |
Claude Code |
| The gate refuses the call before it runs |
Codex CLI |
| The gate refuses the call before it runs |
Gemini CLI / Qwen Code | extension: MCP server, skills, | The queue is available to ask, and the hook is configured |
opencode |
| The gate refuses the call before it runs |
Cursor, Windsurf, Kiro, Cline, OpenClaw, Copilot | rules file + | The agent is told to ask the queue first |
Any MCP agent |
| The agent can ask about any step before taking it |
Two dialects, one decision layer: Claude Code and Codex speak PreToolUse, Gemini speaks
BeforeTool, and the same gate script answers both. Where an agent has hooks, the refusal
happens before the tool runs. Where it does not, the rules file makes the agent ask first.
One honest caveat. Gemini CLI 0.45 loads an extension's hooks from hooks/hooks.json —
the same path Claude Code uses — and the two dialects cannot both live in one file. The
repository therefore keeps them apart: hooks/claude-hooks.json for Claude Code and Codex,
hooks/hooks.json in Gemini's dialect. Claude Code still inspects hooks/hooks.json, finds
an event it does not know, and reports one harmless warning while ignoring it; the hook Claude
Code actually runs is the one its manifest declares.
As a library — in the agent you are building
pip install "jevqueue @ git+https://github.com/iamvazghen/jevqueue.git"The package is not on PyPI, so the install names the repository. There are no required
dependencies. httpx is needed only for the hosted decision model, and is an extra:
pip install "jevqueue[hosted] @ git+https://github.com/iamvazghen/jevqueue.git"If you would rather work from a checkout, pip install -e . does the same thing without the
network round-trip.
from jevqueue import Governor, JevClient
from jevqueue.adapters.openai_chat import OpenAIChatHost
governor = Governor(JevClient(key))
response = governor.step(OpenAIChatHost(request, send_it))As a skill — any agent that reads SKILL.md
The two skills in skills/ work in any agent that reads SKILL.md: Claude Code, Codex,
Cursor, Windsurf, and anything else that follows the open skill format. Copy them into your
agent's skills directory and they work on their own, with no hooks and no setup.
As an MCP server — any MCP-capable agent
Claude Code, Codex and GitHub Copilot register the server themselves when you install the plugin; there is nothing to configure. For any other MCP-capable agent, expose it by hand:
python mcp/jevqueue_mcp.pyEither way the agent gains one tool, jevqueue_decide, which answers the same question the
hook answers. The plugin launches the server through bin/jevqueue-mcp.mjs, which finds a
Python interpreter — python3, python or py -3, whichever is actually there — and hands
the process over, because python and python3 are not the same interpreter and on macOS
python may not exist at all.
Configure it
Setting | Meaning |
TypeSafe API key | Optional. With it, decisions come from the hosted Jev model. Without it, the offline rules baseline — no account, no network, no cost. |
Mode |
|
Confidence floor | Below this routing confidence the step is delegated rather than gated. |
The key is read from the plugin's own settings, and nowhere else. Not from
TYPESAFE_API_KEY, not from any environment variable. A plugin that quietly picks up a
secret already sitting in your shell and ships it somewhere is doing something you did not
agree to, and it makes the data handling impossible to reason about. See
PRIVACY.md.
For the library, JevClient(key) takes the key explicitly, and the framework adapters read
TYPESAFE_API_KEY the way every Python library reads one — that is a library's job, and it
is a different surface from the plugin's.
What it does
On every tool call, the gate asks one question about the pending step:
Should this step run at all?
Not "which tool" — the agent has already chosen that, and a hook cannot constrain a provider's generation. The question worth asking at this point is whether this step is right, and there are exactly two ways it is not.
The risk gate
Some steps are irreversible, unbounded, or outside clear authorization: deleting things,
rewriting production, force-pushing, dropping tables, piping a download into a shell. The
decision layer triages the step as low, medium or high with a probability, and a
confidently high verdict stops the step and asks a human instead.
The completion gate
The most common real failure of an agent loop is an agent reporting success on work that never happened. It happens because the same model that decides to stop is the one claiming it finished. The decision layer asks the completion question separately, so the two judgments cannot see each other's answers, and when they disagree the stricter one wins and the work continues.
Risk is checked before completion. That order is the point: "this might be destructive and I am not sure" must never be answered with "but the work seems finished anyway".
The floor
Underneath both gates is a short, explicit list of operations nobody would argue about —
rm -rf /, a download piped into a shell, dd onto a block device, DROP TABLE. A decision
model that shrugs at one of those does not get to overrule the list.
It fails open
If the decision layer is unreachable, the transcript is unreadable, or something inside the plugin breaks: the tool is allowed and a diagnostic goes to stderr. A governance layer that bricks the agent on a bad day is worse than no governance layer.
It also fails narrow. The queue refuses a small number of steps rather than steering every step. A gate that refuses on doubt is a wall.
Which guarantee do you need?
You are running an agent and want its steps checked. Install the plugin. The hook runs before each tool call, asks the decision layer, and refuses the step when the answer is no. This is the guardrail guarantee.
You are building an agent and want its tool choice constrained. Use the library. The
host sets tool_choice to a named function with parallel_tool_calls=False, and the
result is checked: a provider that called something else raises JevError before anything
executes. This is the enforcement guarantee, and it is the stronger one.
Both are the same code. The difference is where the constraint is applied.
The engines
Engine | What it is | Needs |
| The decision layer: calibrated answers, a distrust layer, a guard order | Nothing — it is in this package |
| The catastrophic-operation floor, running alone because the decision layer could not be reached | Nothing |
Check which one you have:
jevqueue statusWith a credential configured, decisions come from Jev, the hosted System One model. Without one, they come from the offline rules baseline, which needs no account and no network. Both are honest about what they are; the fallback says so on every run.
Using it by hand
jevqueue status
jevqueue decide --tool Bash --input '{"command": "rm -rf build/"}'
jevqueue decide --tool Read --input '{"file_path": "/etc/shadow"}'decide prints the verdict, the engine, the model, the action, the confidence, the risk and
the completion probability. It is the same call the hook makes.
What it runs, sends and fetches
Short version: two Python scripts on your machine, one bounded summary sent to a decision model if you configured a key, nothing fetched, one small cached file written. The full detail, including exactly what is in the request, is in PRIVACY.md.
The short version of the short version: the plugin makes no network request at all unless
you have configured an API key, and when it does, the request goes to
https://api.typesafe.ai/v1/systemone and nowhere else.
Frameworks
Framework | Integration | Extra |
Any OpenAI-compatible loop |
| — |
LangChain |
|
|
Pydantic AI |
|
|
Hermes Agent | a six-line seam in | — |
OpenClaw |
| — |
Your own | seven methods — see docs/adapters.md | — |
What this is not
It is not a planner. It decides one step at a time. It does not decompose a goal.
It is not an authorization layer. A
lowrisk verdict is not permission to loosen your own tool permissions. Your existing authorization must stay correct on its own.It is not always right. A confident wrong verdict is possible. That is why the gates are narrow and why the floor exists.
It does not replace your model. The generative model still writes the arguments and the prose. jevqueue decides whether the step runs; the model still does the work.
And the honest limitation, stated up front: a pre-tool hook cannot constrain the provider's tool choice. If you need the stronger guarantee, use the library.
How it fits together
jevqueue/
├── jevqueue/ the package
│ ├── client.py the hosted model, and the DecisionModel protocol
│ ├── decision.py the parser, and the distrust layer
│ ├── governor.py the guards, in order
│ ├── questions.py the three typed questions
│ ├── state.py the bounded, read-only projection
│ ├── local.py the offline rules baseline
│ ├── policy.py the catastrophic-operation floor
│ ├── gate.py the hook-facing engine
│ ├── cli.py the command line
│ └── adapters/ Hermes, LangChain, OpenAI, OpenClaw, Pydantic AI
├── hooks/ the PreToolUse and UserPromptSubmit hooks
├── commands/ /jevqueue:setup, /jevqueue:check, /jevqueue:status
├── skills/ the portable core: jevqueue, jevqueue-adapter
├── mcp/jevqueue_mcp.py the portable core as an MCP server
├── .mcp.json registers that server with the plugin
├── scripts/ the bare-import check, the icon, the CLI shim
├── bin/ shims so `jevqueue` is on PATH, and the MCP launcher
├── docs/ architecture, limits, comparison, adapters, roadmap
└── PRIVACY.md what this plugin runs, sends and fetchesDocumentation
Install, enable, test — every agent, and how to check it is working | |
What it buys the owner of the agent, with measured token costs | |
The two-tier split, the guard order, and why each guard sits where it does | |
Writing a | |
Copy-paste Hermes integration and how to keep merging upstream | |
What this cannot do, and when not to use it | |
Against a standard loop, and against other routing approaches | |
The offline rules baseline: what it is, what it is not, and how to use it | |
Possible improvements, with the reasoning for each |
There is a full site at https://iamvazghen.github.io/jevqueue/.
Development
uv venv && uv pip install -e ".[dev,langchain,pydantic-ai]"
uv run pytest
uv run ruff check jevqueue tests hooks mcp scripts
uv run mypy
claude plugin validate --strict .368 tests, offline: no network, no API key, no provider. A test that needs a credential does not run, and one that does not run is decoration.
License
MIT, and it covers everything in this repository: the decision layer, the gate, the hook scripts, the plugin manifests, the skills, the MCP server and the documentation. Copyright (c) 2026 Vazghen Vardanian.
No third-party code is vendored. The package has no required dependencies — the decision
layer is pure standard library — and httpx, needed only for the hosted decision model, is an
optional extra. NOTICE carries the attribution.
The hosted model is not part of this license. Jev is TypeSafe's System One model, a
separately hosted service reached over the network at api.typesafe.ai. It is not distributed
here: this repository ships no model weights, no API keys and no usage credits, and using that
service is subject to TypeSafe's terms. Everything that is
in this repository — including the offline rules baseline, which needs no account and makes no
network request at all — is covered by the MIT license above.
jevqueue is an independent community project. It is not affiliated with, endorsed by, or
supported by TypeSafe AI or Nous Research. PRIVACY.md documents what the plugin
runs, reads, sends and writes.
Available Tools
1 tooljevqueue_decideA
Ask the decision layer whether a pending step should run, before running it. Returns the verdict, the action, the confidence, the risk triage and the completion probability. Use it before a destructive or irreversible step, and before continuing on work that may already be finished.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | What the agent is currently trying to do, in the user's words. Optional, and better than nothing. | |
| tool | Yes | The tool about to be called, for example Bash or Read. | |
| input | No | The tool's input, as an object. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does signal that this is a consultative/read-style call whose output governs a subsequent decision. However, it omits operationally important traits: the possible verdict values and how to act on them, latency or blocking behavior, what happens if the decision layer is unavailable, and whether the query is recorded. These gaps matter for a gate that sits in front of irreversible actions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: purpose first, return payload second, usage conditions third. Nothing is redundant and the most decision-relevant clause (run this before irreversible steps) is easy to find.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description must fully explain the return value, and it only lists field names without types or the enumeration of verdicts that an agent must branch on. For a pre-flight gate on destructive actions, the missing detail on interpreting the verdict leaves a real operational gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each of the three parameters is documented in the schema, including the note that 'goal' is optional but beneficial. The description adds no further parameter meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action against a specific resource: querying a decision layer for a verdict on a pending step before executing it. It also enumerates the return payload (verdict, action, confidence, risk triage, completion probability), so an agent knows exactly what the call produces. The opaque name 'jevqueue_decide' is fully resolved by the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives two concrete trigger conditions: before a destructive or irreversible step, and before continuing work that may already be finished. That is clear contextual guidance rather than vague advice. It stops short of stating when NOT to call it (e.g. trivial reads) or naming an alternative, but no siblings exist to route between.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.5.3- First observed
jevqueue_decide
TDQS
Scored across 1 tool
There is only one tool, so there is no possibility of overlap or misselection between tools. Its stated purpose—querying a decision layer before a risky or redundant step—is clearly bounded and not duplicated elsewhere in the set.
The single name `jevqueue_decide` uses a predictable server-prefix + verb pattern that reads clearly. With only one tool there is no mixed convention, though also no broader pattern to confirm consistency across a set.
A one-tool surface is extremely thin for a server presented as a decision layer; the rubric treats a single tool as too few for the apparent scope. All decision functionality is crammed into one opaque call with no separate operations for outcome reporting, pending-step inspection, or configuration.
If the server is purely a read-only verdict oracle, one tool can cover its core purpose. However, there are notable gaps: no way to report whether a decision was correct, no listing of pending steps, and no batch or parameterized variants, making the lifecycle only partially closed.
Maintenance
Related MCP Connectors
Pre-execution governance for AI agents. Deterministic PASS/FAIL/REVIEW verdicts, replayable proof.
Deterministic allow/require_approval/deny verdicts for agent actions, before they happen.
Runtime permission, approval, and audit layer for AI agent tool execution.
Stops runaway AI agent loops and token burn. Checks each tool call before it runs. No signup.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceA local gate that lets agents submit risky tool actions for policy evaluation and receive ALLOW, DENY, or REQUIRE_APPROVE decisions before executing irreversible side effects. It can also open human approval holds and record an activity trail without executing the side effect itself.1,336 npm3MIT
- AlicenseBqualityBmaintenanceEnables AI agents and MCP clients to route every tool call through configurable rules that allow, block, or hold risky actions for human approval, while recording decisions in a tamper-evident audit trail.12588 PyPI18Apache 2.0
- AlicenseNot gradedqualityBmaintenanceProvides governed tools for evaluating proposed agent actions against policy, classifying risk, and creating structured governance and audit records, while pausing consequential steps for explicit human approval. This lets agentic workflows run under traceable, least-privilege control rather than unrestricted automation.MIT
- AlicenseAqualityBmaintenanceEnables agents to score, inspect, and gate tool calls before they execute, resolving shell commands the way a shell would in order to block destructive actions and detect multi-step attack sequences. It also redacts credentials and PII in either direction, requires signed single-use approval tokens for high-impact actions, and keeps a tamper-evident audit trail.611 npmApache 2.0