Skip to main content
Glama

jev-mcp

Let TypeSafe Jev read files, logs and search results so your coding agent reads only the answer. For Claude Code, Codex and pi, or any MCP client.

Jev is a System One model. It returns a typed answer and a calibrated probability distribution, never prose. These tools surface that faithfully rather than hiding it behind a label.

Install

curl -fsSL https://raw.githubusercontent.com/maxkimambo/jev-mcp/main/install.sh | sh

It needs Node 20.12+ and sets up every agent it finds on PATH; name agents to choose (curl … | sh -s -- codex pi). It installs or updates:

  • Claude Code: the plugin (server, hooks, /jev:jev command, skill);

  • Codex: a checkout in ~/.local/share/jev-mcp, the server in ~/.codex/config.toml, the skill in ~/.codex/skills, and a jev on|off|status command, since Codex has no plugin commands;

  • pi: the repository as a pi package: a native extension that registers the jev tools and /jev, and the skill. pi has no MCP client by design, so the extension starts the server itself;

  • ripgrep for jev_search, through Homebrew or uv;

  • trafilatura and markitdown for jev_rank_pages, through uv, which it installs if missing;

  • your API key, asked for with hidden input and saved to ~/.config/jev/api_key (0600). Get one from console.typesafe.ai or OpenRouter.

All three share one on/off switch and one call ledger, so switching jev on in one agent switches it on in all. Run the script again to update. JEV_SOURCE=/path/to/jev-mcp sh install.sh installs from a checkout instead of GitHub.

Claude Code plugin

The plugin runs bundle/, a self-contained build committed to the repository, so installing from git needs no build step. By hand:

claude plugin marketplace add maxkimambo/jev-mcp
claude plugin install jev@jev-mcp

Then, in a session, /jev:jev on. The tools are off by default: while off, every tool refuses and sends nothing. /jev:jev off switches back, /jev:jev status shows calls, tokens, cost and latency by tool.

Besides the server and the skill, the plugin adds two hooks that only fire while jev is on:

  • UserPromptSubmit reminds the agent which jev tool replaces which read.

  • PreToolUse refuses the first Grep, or rg/grep in Bash, after each prompt and tells the agent to use jev_search instead. A later search in the same turn runs, so an exact-string lookup or a fallback when Jev fails costs one retry. Calling any jev tool first lifts the refusal. Hints alone did not work: they arrive after the search has already run. Whole-file Reads over 16 kB get a hint pointing to jev_locate, never a refusal.

Switch and ledger live in ~/.claude/jev-think/ (JEV_HOME overrides it), shared between the /jev command and the server through JEV_SWITCH_FILE and JEV_LEDGER. Claude Code runs a copy made at install time (~/.claude/plugins/cache/), so after make build (which rebuilds bundle/; commit it with the change) bump the version and reinstall, or the old build keeps running. The command is /jev:jev on|off|status; plugin commands are always prefixed with the plugin name.

pi and Codex by hand

pi install git:github.com/maxkimambo/jev-mcp

For Codex, add this to ~/.codex/config.toml, with the path of a checkout:

[mcp_servers.jev]
command = "node"
args = ["/absolute/path/to/jev-mcp/bundle/index.js"]
tool_timeout_sec = 120
env = { JEV_SWITCH_FILE = "/Users/you/.claude/jev-think/state.json", JEV_LEDGER = "/Users/you/.claude/jev-think/ledger.jsonl" }

Any MCP client

claude mcp add --scope user jev -- node /absolute/path/to/jev-mcp/bundle/index.js

Or in a client's JSON config:

{
  "mcpServers": {
    "jev": { "command": "node", "args": ["/absolute/path/to/jev-mcp/bundle/index.js"] }
  }
}

Do not register the server directly and install the plugin. Two servers named jev will otherwise both register.

The key

A TypeSafe key (ts_…) or an OpenRouter key (sk-or-…) works. An OpenRouter key is routed to https://openrouter.ai/api with model ~typesafe/jev-latest; TYPESAFE_BASE_URL and JEV_MODEL override both. The key is never a tool argument, so it cannot land in a transcript or a model's context.

The server reads TYPESAFE_API_KEY, then JEV_API_KEY, then OPENROUTER_API_KEY from its environment, then the key file $XDG_CONFIG_HOME/jev/api_key (by default ~/.config/jev/api_key; JEV_KEY_FILE overrides the path).

Prefer the file. An MCP server gets its client's environment, not your shell's, so a key exported from a shell profile usually never arrives. Create it without the key touching your shell history or another process's argv, and with 0600 from the start:

mkdir -p -m 700 ~/.config/jev
(umask 077 && read -rs key && printf '%s' "$key" > ~/.config/jev/api_key)

Paste the key at the silent prompt and press Enter. As with ssh, the server refuses a key file that someone else owns or that group or others can read, and says to chmod 600 it. The tools also refuse to read anything under ~/.config/jev/ as a file, so the key cannot be sent to Jev by path. Rotate by overwriting the file; the next session picks it up.

Plugin internals

The server is declared inline under mcpServers in .claude-plugin/plugin.json. There is no .mcp.json anywhere in the repo, and that is deliberate.

A .mcp.json at the plugin root is auto-discovered by the plugin loader, so it works. But any session opened in this directory also reads that same file as a project config, where ${CLAUDE_PLUGIN_ROOT} is undefined. The result is a missing-variable warning and a scope conflict on the same server name. The inline form has exactly one loader and produces neither. Verify with claude mcp list: the server appears as plugin:jev:jev and the diagnostics section stays empty.

One trap. claude plugin details jev reports MCP servers (0) for an inline declaration even while the server is connected and working. That is a gap in the inventory count, not a failure. Trust claude mcp list over plugin details here.

The plugin's env block sets only the switch and ledger paths, never the key. Naming the key there would expand to an empty string when the variable is unset, and an empty string is not nullish, so it would shadow the key-file fallback and turn a working setup into a missing-key error. Claude Code does not usually export an OpenRouter key to plugin servers, so the key file is the dependable route.

Related MCP server: askjev

Tools

Tool

Primitive

Use when

jev_classify

Choice

The answer is one of a fixed set you define

jev_score

Score

The answer is a degree on an ordered scale

jev_check

Noul

The answer is yes or no, and you want the probability

jev_ask

all three

You have several questions about the same state

jev_triage

all three, per item

You have many items and want one result each, with files read server-side

jev_locate

Choice + Noul per question, per window

You need the lines of one large file that answer your questions, without reading it

jev_search

Choice + Noul per question, per window

You need the lines across a directory that answer your questions, instead of pages of grep hits

jev_extract

Choice + Noul per question over regex-found values

You want short values from a file (port, version, URL, date, quoted setting) without reading it

jev_rank_pages

Nouls per question and injection signal per page, then Choice + Noul over the best page's sentences

You have search results and want the answer without fetching pages into your context

jev_screen

four Nouls + a code check

You are about to read untrusted text and want to know if it tries to steer you

jev_models

—

Confirm the key works and find a model id

jev_rank_pages fetches up to 20 URLs server-side, all at once. Jev ranks the pages per question and checks each for injection in the same request, then picks up to five sentences from each question's best page, dropping any Jev gives almost no weight, so page furniture such as "Bibliographic Tools" does not pad the answer. It answers from the best page, not from each page: to summarise every result, WebFetch each with a prompt instead. Those sentences are the only page text that comes back, and a page that looks like it tries to steer an agent has its sentences withheld. It only fetches https, and refuses any host that resolves to a private, loopback or link-local address, checked on the connection itself and again on every redirect, so a search result cannot point it at your LAN or a cloud metadata endpoint. It asks for markdown first (Accept: text/markdown), which docs platforms usually serve. HTML goes through trafilatura, which keeps the main content and drops menus, footers and ads, and falls back to plain text without it. PDF and Office documents go through markitdown. Both converters read the already-fetched bytes on stdin and never fetch anything themselves. Pages above four windows are skipped as too long to judge.

jev_search, jev_locate and jev_extract take up to 16 questions and send each window once with all of them, since the text dominates the request (parallel questions); results come back one per question, in order.

jev_search runs ripgrep over a directory server-side, so git's ignore rules, .ignore files, and hidden and binary files are handled as rg handles them; credential files are filtered out before anything is sent. Lines matching an optional regex (Rust syntax) become candidates, Jev ranks them with their neighbours, and hits come back as path, line and the line's text. jev_extract offers Jev only values that a regex found in the file, so it can pick the wrong one but never invent one. jev_screen asks fixed signals (instructions aimed at an AI, overriding instructions, exfiltration, hidden instructions) and counts invisible Unicode in code; any hidden character makes the verdict suspicious.

jev_ask takes paths instead of state to ask about files you have not read: the server reads them and Jev sees one state keyed by path. Every tool is annotated read-only, so clients may run it in parallel with other reads.

Every tool returns the full probability distribution alongside the answer, plus confidence for Choice and Score. Results come back as MCP structured content, so a client gets typed data rather than a JSON string to re-parse.

Prefer jev_ask

Jev prefills the state once and scores every question in a single forward pass, so extra questions add almost no latency or cost. TypeSafe's own measurement on a document-dominated workload puts one batched call at 12.2x cheaper and 10.0x faster than one call per question, with no change in the answers.

Questions in one request cannot see each other's answers. State any speculative premise explicitly and let your own code decide which answers apply.

Triage many items without reading them

jev_triage asks one question set about many items in a single call and returns one result per item, in input order. An item is either text you already hold or a path the server reads itself. File contents go to Jev and never enter the agent's context; the agent sees only the answers. That is what makes triage cheap: screen forty files, then open the three that matter.

{
  "query": "Find where retry backoff for the payments client is configured",
  "items": [
    { "id": "client", "path": "src/payments/client.ts" },
    { "id": "config", "path": "src/config/http.ts" },
    { "id": "notes", "text": "Backoff was moved to the shared HTTP layer in March." }
  ]
}

query is shorthand for one check named relevant. Replace it with questions for typed judgments; the shape is the same as jev_ask. Each item is its own request, so jev_ask's batching applies per item: ask everything you need in one pass.

Each result carries either answers or an error; a bad path or a rate-limited item fails in place and the rest still return. Check answers carry a verdict, choice and score answers an action. The call is an error only when every item failed. usage is summed over the items that succeeded.

File reads are confined:

  • A path must sit below an allowed root. The default root is the directory the server was started in; set JEV_FILE_ROOTS to a path.delimiter-separated list of absolute directories, or to off to refuse every path item. Relative paths resolve against the first root.

  • ~/.config/jev/roots adds directories to those, one per line, ~ for home and # for comments, so a session started in a scratch folder can still read your projects. off still turns every root off. It is read when the server starts: restart Claude Code after editing it.

    # projects Jev may read
    ~/dev/github.com
    ``` Containment is checked before and after symlinks
    are resolved, so a link cannot walk out.
  • Credential files are refused by name wherever they sit: .env*, .ssh, .aws, .gnupg, *.pem, *.key, id_rsa, credentials.json, the server's own key file, and similar. This closes the obvious channel for an injected instruction to ship a secret to the API.

  • Only regular text files are read. Binary, directories, and files above JEV_MAX_STATE_CHARS fail with a reason. Nothing is truncated.

  • No error message ever includes file contents.

Paths arrive from the model, and the model can be steered by text it has read, so they are treated as untrusted. The result reports file_roots so you can see what the server will and will not touch.

The idea of screening files inside the tool so the agent reads only what matters comes from Kush Bhuwalka's jev-sift. This implementation shares that goal and adds root confinement with a credential deny list, per-item classified errors, confidence gating, and answer validation.

Design rules

  1. The caller owns the option set. jev_classify requires options from you, so the model can pick the wrong one but can never invent one. A selector cannot choose a candidate the enumerator dropped. This is the single most common way these integrations fail.

  2. Probabilities are always returned. Not just the winner.

  3. The key lives in the environment. Never in an argument.

  4. Nothing is silently dropped, overwritten, or truncated. A request that cannot be honoured exactly fails with a reason instead of quietly changing meaning.

  5. Only JSON-RPC reaches stdout. Logs go to stderr, always.

  6. Every answer is checked against the question sent. A choice that was never offered, a distribution over the wrong options, a legend that does not match the levels, or a missing answer in a batch is an error of kind malformed_response, never a result. A caller that trusted the label alone would otherwise execute something it never proposed.

The no-match option

Each selecting tool adds a none option by default so the model can decline rather than being forced to pick. Turn it off with add_none: false when one option must always apply.

If you already use the name none for an option of your own, the added option takes a different key instead of overwriting yours, and the response reports which key carries the no-match meaning in none_option. Your option and its probability always survive intact.

Confidence gating

Choice and Score answers include an action of act, review, or abstain, derived from confidence and the thresholds you pass in act_above and review_above (defaults 0.8 and 0.5). jev_check returns a verdict of yes, no, or uncertain from yes_at_or_above and no_at_or_below (defaults 0.7 and 0.3).

These defaults are starting points, not universal rules. Calibrate them on your own data and on what it costs to be wrong; a destructive action deserves a higher bar than a read-only one. Confidence describes how concentrated the distribution is. It is not a claim that the answer is correct.

A Noul near 0.5 means yes and no are close to equally likely, not that the answer is "medium", which is why the middle band reports uncertain rather than rounding.

Errors

Failures come back with isError and a classified body: kind, retryable, and where available status, requestId, and a hint. A rejected key (authentication, never retryable) is distinguishable from a rate limit (rate_limit, retryable) and from a malformed question (invalid_request) and from an answer that fails validation against the question (malformed_response, retryable, nothing to act on) and from a path item that cannot be read (file_access, never retryable). The SDK already retries 408, 429, and 5xx with backoff before an error surfaces here.

Every judgment result also carries latency_ms for the API round trip, so calibration notes can record cost alongside confidence.

Limits

A Choice question accepts at most 255 options, which is an API limit; past that, search in two passes, one question picking a window and a second ranking within it. Question count and state size are local caps that bound cost on a single call, and both are configurable. Oversized state is rejected rather than truncated, because truncating silently changes the material the judgment rests on.

Agent skill

skills/jev-tools/SKILL.md teaches an agent to let Jev read bulk text and to read only the answer: which tool replaces which read, how to phrase the question, and how to act on act/review/abstain. Primitive semantics and state design live in TypeSafe's own typesafe-ai skill and in the docs.

Configuration

Variable

Effect

TYPESAFE_API_KEY

Required. JEV_API_KEY also works.

JEV_MODEL

Model id. Defaults to jev-latest.

JEV_TIMEOUT_MS

Per-attempt timeout. Defaults to 5000: a stalled judgment stalls the agent.

JEV_MAX_RETRIES

SDK retries after a failed attempt. Defaults to 0, for the same reason.

JEV_SWITCH_FILE

Optional. A JSON file {"enabled": true}; while it is missing or says otherwise, every tool refuses and sends nothing. Read per call.

JEV_LEDGER

Optional. A JSONL file that gets one line per call: tool, ok, questions, input tokens, cost, ms, client. Never content.

JEV_MAX_QUESTIONS

Questions per jev_ask or jev_triage. Defaults to 64.

JEV_MAX_STATE_CHARS

Largest state accepted, per item for jev_triage. Defaults to 200000.

JEV_MAX_ITEMS

Items per jev_triage call, paths per jev_ask, windows per jev_locate. Defaults to 50.

JEV_CONCURRENCY

Parallel requests within one jev_triage call. Defaults to 4, capped at 16.

JEV_FILE_ROOTS

Directories jev_triage, jev_ask paths and jev_locate may read below. Defaults to the working directory; off disables file reads. $XDG_CONFIG_HOME/jev/roots adds more.

JEV_RG_PATH

ripgrep binary for jev_search. Defaults to rg on PATH.

JEV_TRAFILATURA_PATH

trafilatura binary for HTML pages in jev_rank_pages. Defaults to trafilatura on PATH; without it pages are reduced to plain text.

JEV_MARKITDOWN_PATH

markitdown binary for PDF and Office pages in jev_rank_pages. Defaults to markitdown on PATH.

JEV_ALLOW_HOSTS

Comma-separated hosts jev_rank_pages may fetch even though they resolve to private addresses, over http too, e.g. an intranet wiki. Empty by default.

JEV_KEY_FILE

Key file path. Defaults to $XDG_CONFIG_HOME/jev/api_key, i.e. ~/.config/jev/api_key. Must be 0600 and yours. Always refused as a path item.

TYPESAFE_LOG_LEVEL

SDK verbosity. Safe at any level; all output goes to stderr.

An unusable value for any numeric setting falls back to the default and warns on stderr, rather than becoming NaN and disabling the limit it was meant to enforce.

Troubleshooting

Every call reports a missing key. Some MCP clients filter the environment before spawning servers, which drops TYPESAFE_API_KEY. Confirm the variable is exported, then pass it explicitly in the client's server config if it still does not arrive. Run jev_models to check the key in isolation.

The server connects and then dies. On a stdio transport, anything written to stdout that is not JSON-RPC breaks the connection. This server routes all logging to stderr, so TYPESAFE_LOG_LEVEL=debug is safe to turn on while debugging.

When not to reach for this

Jev earns its place on a decision that repeats thousands of times inside software, where code can enumerate the options first and you need a number to threshold on.

For a one-off judgment during a conversation, an ordinary model answer is usually better, because it comes with reasoning you can argue with. Jev gives you a number and a label. That is a feature at scale and a limitation in dialogue.

If deterministic code already decides the case correctly, keep the deterministic code. Typed output guarantees the interface, not the truth. Measure before adopting.

Do not ask Jev to compute. It is a one-pass chooser with no scratchpad, so counting, arithmetic, date comparison, and threshold cutoffs are unreliable, and the answer still comes back with a confident probability. Do that work in code and pass the result in as a fact. Add a reference date to state for any question about "today". See TypeSafe's numeric and date limitations.

Development

npm ci
npm run build
npm run typecheck
npm test          # offline: unit tests plus regression tests against a local stand-in
npm run test:e2e  # live, requires TYPESAFE_API_KEY

Releasing: bump version in package.json, .claude-plugin/plugin.json, and .claude-plugin/marketplace.json together. The plugin cache is keyed by version, so an unbumped plugin keeps serving the old snapshot.

The offline suite runs the real built server over stdio against a local stand-in for the TypeSafe API and asserts on the request bodies it actually sends, so a regression in what reaches the model fails the build.

License

MIT. jev-mcp started from rashedInt32/jev-mcp by Rashed Parvez and has since grown into its own tool set.

Available Tools

11 tools
jev_askAsk many questions about one stateA
Read-onlyIdempotent

Ask several independent questions about the same state in ONE request. Jev prefills the state once and scores every question in a single forward pass, so extra questions add almost no latency. Prefer this over repeated single-question calls: on a document-dominated workload it is dramatically cheaper and faster with no change in answers. Questions cannot see each other's answers, so state any speculative premise explicitly and let your own logic decide which answers apply. Pass 'paths' instead of 'state' to ask about files without reading them yourself: the server reads them, Jev sees them as one state keyed by path, and only the answers enter your context. Name the file in a question with its path in backticks.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathsNoFiles to read inside the server instead of state. Up to JEV_MAX_ITEMS; together they must fit JEV_MAX_STATE_CHARS. Same rules as jev_triage paths: below an allowed root, never credential files, contents never returned.
stateNoThe content to evaluate, when you already hold it. Supply exactly one of state or paths.
act_aboveNoConfidence at or above which the answer is marked 'act'. Default 0.8. Calibrate on your own data and the cost of being wrong.
questionsYes
review_aboveNoConfidence at or above which the answer is marked 'review' rather than 'abstain'. Default 0.5.

Output Schema

ParametersJSON Schema
NameRequiredDescription
filesNoWith paths: what was read, as sizes only.
modelYes
usageYes
answersYesKeyed by your question ids. Choice and Score answers also carry an 'action' gated on confidence.
latency_msYesWall-clock milliseconds for the API round trip, for your own calibration logs.
none_optionsYesFor each 'classify' question, the key carrying the no-match meaning, or null.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnly, idempotent, and non-destructive hints, so the description adds genuinely useful behavioral context beyond them: Jev prefills the state once, extra questions add almost no latency, paths are read server-side and keyed by path, and only answers enter the agent's context. These are non-obvious behaviors that materially affect invocation decisions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: batching benefit, performance trade-off, question independence caveat, the paths alternative, context containment, and file-naming guidance. Core purpose is front-loaded and the rest builds on it without repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with five parameters and an existing output schema, the description covers the essential selection and invocation context: when to prefer batching, how paths differ from state, the independence limitation, and how to phrase file references. The output schema handles return-value details, so nothing critical is missing for correct use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high at 80%, so the schema carries most parameter meaning, but the description adds real value: it explains the semantic difference between 'state' and 'paths', notes that the server reads paths and treats them as one state keyed by path, and gives the concrete guidance to name files with their path in backticks. This goes beyond the structured schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Ask') and resource ('several independent questions about the same state'), and immediately distinguishes the tool from repeated single-question calls by emphasizing ONE request and a single forward pass. It clearly conveys what the tool does and how it differs from the surrounding single-question sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Prefer this over repeated single-question calls' and gives concrete conditions for when to use 'paths' instead of 'state'. It also states that questions cannot see each other's answers, which tells the agent to avoid this tool when questions are dependent, even though it doesn't name an alternative explicitly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

jev_checkYes/no with a probabilityA
Read-onlyIdempotent

Ask a yes/no question. Returns the probability that the answer is yes, from 0 to 1, plus a verdict. There is no separate confidence: a value near 0.5 means yes and no are close to equally likely, not that the answer is 'medium'. Use one check per label when several labels may apply at once.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateYesThe content to evaluate. A plain string for text, or an object/array for structured data such as a record, a diff, or a chat log.
no_meansNoWhat a no means.
questionYesThe judgment to make. A string, or an object/array when the question has several labelled parts. This is the only instruction Jev sees, so state it in full.
yes_meansNoWhat a yes means. Sharpens the judgment.
no_at_or_belowNoProbability at or below which the verdict is 'no'. Default 0.3. Between the two the verdict is 'uncertain'.
yes_at_or_aboveNoProbability at or above which the verdict is 'yes'. Default 0.7.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modelYes
usageYes
verdictYes
latency_msYesWall-clock milliseconds for the API round trip, for your own calibration logs.
thresholdsYes
probability_yesYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds meaningful behavioral context by clarifying that a probability near 0.5 means equal likelihood, not 'medium' confidence, and by advising one check per label for multiple applicable labels. This goes beyond the annotation coverage, though it does not mention output format or error behavior, which the output schema likely covers.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. It front-loads the core purpose, then adds a critical interpretation nuance and a usage tip. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-value details are covered elsewhere. The description includes the key behavioral clarification about probability interpretation and the multi-label usage note. For a read-only tool with robust annotations and schema coverage, this is sufficient, though it doesn't mention the verdict thresholds or the exact structure of state/question beyond the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters (state, question, yes_means, no_means, no_at_or_below, yes_at_or_above) are all documented in the schema. The description adds a note about verdict interpretation but does not elaborate on individual parameter usage beyond what the schema provides. Baseline 3 is appropriate since the schema carries the load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Ask a yes/no question' and 'Returns the probability that the answer is yes, from 0 to 1, plus a verdict.' This is a specific verb and resource, distinct from the sibling tools (jev_classify, jev_score, etc.) by its focus on binary judgments. However, it does not explicitly contrast itself with alternatives, so it doesn't fully earn a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides one usage note: 'Use one check per label when several labels may apply at once.' This gives situational guidance but does not explain when to choose this tool over siblings or when not to use it. The guidance is implied rather than explicit, so it falls short of a higher score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

jev_classifyClassify into one of your optionsA
Read-onlyIdempotent

Pick exactly one option from a set you define. Returns the chosen option, the probability of every option, a confidence value, and a recommended action gated on confidence. Use when the answer is one of a fixed set. The options must be supplied by you: Jev selects among them and cannot invent a new one. Up to 255 options.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateYesThe content to evaluate. A plain string for text, or an object/array for structured data such as a record, a diff, or a chat log.
optionsYesMap of option name to a description that separates it from the others. Both the name and the description are sent to the model, so keep names short and distinct. A description may be an object or array when structure clarifies it, or null to leave it undescribed.
add_noneNoAdd a no-match option meaning none of yours fits. Defaults to true. Turn off only when one option must always apply. If you already use the name 'none', the added option takes a different key and it is reported back as none_option.
questionYesThe judgment to make. A string, or an object/array when the question has several labelled parts. This is the only instruction Jev sees, so state it in full.
act_aboveNoConfidence at or above which the answer is marked 'act'. Default 0.8. Calibrate on your own data and the cost of being wrong.
review_aboveNoConfidence at or above which the answer is marked 'review' rather than 'abstain'. Default 0.5.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modelYes
usageYes
actionYes
choiceYes
confidenceYes
latency_msYesWall-clock milliseconds for the API round trip, for your own calibration logs.
thresholdsYes
none_optionYesThe key carrying the no-match meaning, or null when none was added.
probabilitiesYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds meaningful behavioral context beyond the annotations: it returns per-option probabilities, a confidence value, and a recommended action gated on confidence. It also states the constraint that Jev cannot invent a new option and the limit of 255 options. These details complement the readOnly/idempotent hints without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the core purpose, then the return value, then usage guidance and constraint. Every sentence adds information; there is no fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 6 parameters and nested objects, the description covers purpose, usage, key constraints, and output. It relies on the schema for parameter details and thresholds, which is appropriate. It does not mention the add_none behavior or the exact return structure, but those are covered in the schema and output schema, so the description is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and every parameter is well-described. The description adds only marginal information about parameters: it reinforces the options constraint and mentions the 255 limit (which is not in the schema). It does not detail each parameter, but the schema already does, so the description meets the baseline without adding significant value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action: picking exactly one option from a user-defined set, and clarifies it cannot invent new options. It distinguishes from open-ended tools by specifying 'Use when the answer is one of a fixed set.' This clearly differentiates it from siblings like jev_ask or jev_score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear condition for use: 'Use when the answer is one of a fixed set.' This implies when not to use (open-ended questions) and notes the requirement that options must be supplied. However, it does not explicitly name alternative tools or provide a when-not list, so it stops short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

jev_extractExtract values from a fileA
Read-onlyIdempotent

Get short values out of a file (a port, a version, a URL, a date, a quoted setting) without reading the file. Code finds every value of each requested kind; Jev picks the one that answers each question, so it can pick wrong but never invent a value. Pass every value you need from the file in one call: the file is read once for all of them. Returns, per question, the value verbatim with its line, a confidence-gated action, and whether the file answers at all. value is null when it does not.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoA file read inside the server. Same rules as jev_triage paths. Supply exactly one of path or text.
textNoThe content, when you already hold it.
act_aboveNoConfidence at or above which the answer is marked 'act'. Default 0.8. Calibrate on your own data and the cost of being wrong.
questionsYesEvery value you need from this file (up to 16). They are judged in one pass over the same file, so batch them rather than calling again.
review_aboveNoConfidence at or above which the answer is marked 'review' rather than 'abstain'. Default 0.5.
no_at_or_belowNoProbability at or below which a check's verdict is 'no'. Default 0.3. Between the two the verdict is 'uncertain'.
yes_at_or_aboveNoProbability at or above which a check's verdict is 'yes'. Default 0.7.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modelYes
usageYes
resultsYesOne per question, in the order asked.
windowsYesRequests made; a question with more candidates than one request holds spans several.
latency_msYesWall-clock milliseconds for the API round trip, for your own calibration logs.
thresholdsYes

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint/idempotentHint annotations, the description discloses the tool's heuristic failure mode — 'it can pick wrong but never invent a value' — which is exactly the behavioral trait an agent needs to calibrate trust in extracted answers. It also adds the single-read performance guarantee and the null-when-unanswered return semantics, all context the annotations do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

About five dense sentences with purpose front-loaded in the first clause and no filler. The batching sentence repeats guidance already present in the schema's questions description, and the return-value sentence is partly redundant with the output schema, but the overall length is well within what the tool's complexity justifies.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the heuristic, confidence-gated nature of the tool and a rich supporting schema (100% param coverage, output schema, four safety annotations), the description covers the non-obvious essentials: candidate collection, the pick-wrong honesty caveat, batching behavior, and null semantics. Nothing needed to invoke it correctly is missing, though an explicit when-not-to-use note would have pushed this to a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all seven parameters, including defaults (0.8, 0.5, 0.3, 0.7), the path/text exclusivity rule, and the 'line' kind fallback. The description adds only marginal parameter context — 'confidence-gated action' links the act_above/review_above thresholds to output behavior — which earns the baseline 3 but nothing more.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb and resource — 'Get short values out of a file (a port, a version, a URL, a date, a quoted setting) without reading the file' — with concrete examples that make the tool's scope immediately obvious. It does not explicitly contrast a sibling tool, so it stops short of full 5-level differentiation, but the extraction-vs-classify/score/search/check operation is clear enough to distinguish within the jev_ family.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives operational context — use this when you need short values from a file rather than reading the whole thing — and adds genuine how-to guidance: 'Pass every value you need from the file in one call: the file is read once for all of them.' However, it never states when-not-to-use or names an alternative sibling, leaving selection guidance implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

jev_locateFind the lines that answer a questionA
Read-onlyIdempotent

Find which lines of a large file (a log, a long doc, a big source file) answer or address a question, without reading the file yourself. Returns line numbers only, ranked, plus the probability the file answers the question at all. Jev reads the lines in windows of up to 254 with their neighbours, so each line is judged in context. Then open just the returned line ranges. Across a whole directory, use jev_search. Pass every question you have about the file in one call: the file is read once for all of them.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoHow many lines to return per question.
pathNoA file read inside the server. Same rules as jev_triage paths. Supply exactly one of path or text.
textNoThe content, when you already hold it.
questionsYesEvery question you have about this text, each stated in full (up to 16). They are judged in one pass over the same text, so extra questions cost almost nothing: batch them rather than calling again. Questions cannot see each other's answers.
no_at_or_belowNoProbability at or below which a check's verdict is 'no'. Default 0.3. Between the two the verdict is 'uncertain'.
yes_at_or_aboveNoProbability at or above which a check's verdict is 'yes'. Default 0.7.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fileNo
modelYes
usageYes
resultsYesOne per question, in the order asked.
windowsYes
latency_msYesWall-clock milliseconds for the API round trip, for your own calibration logs.
thresholdsYes
lines_consideredYesNon-empty lines judged.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (read-only, idempotent), it discloses how the tool works: reading in windows of up to 254 lines with neighbours so line judgments have context, returning ranked line numbers plus a probability, and reading the file once per call. This gives an agent accurate expectations of cost, output, and processing behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Six short sentences, front-loaded with purpose, followed by output, behavior, and usage guidance. Every sentence earns its place, and there is no filler or repetition of structured data.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a rich 100% schema coverage, an output schema present, and a description that explains output, algorithm, and the relevant sibling alternative, an agent has enough to call the tool correctly. Return-shape details are covered by the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline applies; the description does not add parameter-level details beyond the schema. The batching advice for questions mirrors what the schema already documents, so the description adds no additional parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action and resource: finding lines of a large file that answer a question, and specifies the return scope (ranked line numbers plus an overall probability). It clearly distinguishes itself from the sibling jev_search by noting the file-level vs directory-level use case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use jev_search across a whole directory, establishing the main alternative. It also gives when-to-use context ('without reading the file yourself') and batching guidance ('pass every question... one call'), so an agent knows how to invoke it efficiently.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

jev_modelsList available modelsA
Read-onlyIdempotent

List the models this API key can use, with their release dates. Use it to confirm the key works and to find a model id for JEV_MODEL before assuming one exists. With an OpenRouter key it sends one minimal request instead and reports the model version that answered.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
modelsYes
active_modelYesThe model these tools send requests to.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate this is a read-only, idempotent, non-destructive operation. The description adds beyond that by explaining that with an OpenRouter key, it sends a minimal request and reports the model version, which is a behavioral nuance not captured by the annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, each serving a distinct purpose: stating the main function, explaining why usage is appropriate, and detailing behavior with an OpenRouter key. It is front-loaded with the core purpose and free of filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity (no params, clear output), the description is complete. It explains the tool's purpose, the use case, and the behavior variation with OpenRouter. The output schema exists to detail the return structure, so the description doesn't need to describe it in text.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has 0 parameters, and the schema documentation coverage is 100%. The description doesn't need to add parameter details because there are none. It does explain what the tool returns (model list with release dates or model version), which adds value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear purpose: to list the models available to the API key, including release dates. It distinguishes itself from siblings like jev_classify or jev_score, which perform different actions, by focusing on model discovery and key verification.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use the tool: to confirm the key works and to find a model id before assuming one exists. It also explains the difference between using an OpenRouter key and a direct key, providing clear context for when this tool is needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

jev_rank_pagesAnswer from web search results without fetching themA
Read-onlyIdempotent

After a web search, pass every result URL and every question you have. The server fetches the pages itself (https only, never private addresses; markdown when offered, HTML reduced to its main content, PDF and Office via markitdown), and Jev ranks the pages per question and picks the lines of the best page that answer it. Returns, per question, the top pages and those lines verbatim, so you usually need no WebFetch at all; fetch a page only when its lines are not enough. Lines from a page that looks like it tries to steer an agent are withheld. It answers each question from the best page, not from every page: to summarise each result separately (a survey of papers, say), WebFetch each with a prompt instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlsYesThe candidate pages, e.g. every result of a web search (up to 20).
questionsYesEvery question you have about this text, each stated in full (up to 16). They are judged in one pass over the same text, so extra questions cost almost nothing: batch them rather than calling again. Questions cannot see each other's answers.
no_at_or_belowNoProbability at or below which a check's verdict is 'no'. Default 0.3. Between the two the verdict is 'uncertain'.
yes_at_or_aboveNoProbability at or above which a check's verdict is 'yes'. Default 0.7.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modelYes
pagesYesThe URLs as given; everything else refers to them by index.
usageYes
failedYesPages that could not be fetched. They were never judged; that is not evidence they are irrelevant.
resultsYesOne per question, in the order asked.
windowsYesRequests made.
latency_msYesFetching and judging together.
suspiciousYesPages that look like they try to steer an agent. Still ranked; their lines are withheld.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=true etc.), the description discloses substantial behavioral detail: server-side fetching with https-only and no private addresses, markdown/HTML/PDF/Office conversion, verbatim line returns, withholding of lines from pages that try to steer agents, and the 'answers from the best page, not every page' behavior. It also notes that questions cannot see each other's answers. This goes far beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and well-structured: first sentence explains the core mechanism and constraints, second sentence covers the main use case boundary and the caveat about per-page summarization. Every sentence earns its place; no filler or repetition of schema trivia.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return values need not be described. The description covers the tool's input expectations (search result URLs and full questions), processing behavior (fetch, rank, extract), constraints (https, private addresses), and edge cases (agent-steering pages, best-page-only answers). For a tool with this complexity and a full output schema, the description is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaning by clarifying that 'urls' are web search result pages and that 'questions' should be batched to save cost, which directly informs parameter usage. However, it does not explicitly expand on the probability threshold parameters beyond what the schema already says, so a 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description precisely states the tool's function: after a web search, pass every result URL and questions, and the server fetches pages itself, ranks them per question, and returns the best page's answering lines verbatim. It clearly distinguishes itself from WebFetch by explaining when fetching is not needed, which differentiates it from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when to use this tool (after a web search, with all result URLs and full questions) and when not to use it ('to summarise each result separately... WebFetch each with a prompt instead'). This direct alternative routing is the gold standard for usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

jev_scoreRate on an ordered scaleA
Read-onlyIdempotent

Rate the state along an ordered scale you define. Returns a probability-weighted score that can land between levels, the distribution, confidence, and a recommended action. Use for degree or severity, not for picking a category.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateYesThe content to evaluate. A plain string for text, or an object/array for structured data such as a record, a diff, or a chat log.
levelsYesOrdered level descriptions, lowest first. At least two. Each level must describe a concrete situation and stand on its own.
questionYesThe judgment to make. A string, or an object/array when the question has several labelled parts. This is the only instruction Jev sees, so state it in full.
act_aboveNoConfidence at or above which the answer is marked 'act'. Default 0.8. Calibrate on your own data and the cost of being wrong.
review_aboveNoConfidence at or above which the answer is marked 'review' rather than 'abstain'. Default 0.5.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modelYes
scoreYes
usageYes
actionYes
legendYes
confidenceYes
latency_msYesWall-clock milliseconds for the API round trip, for your own calibration logs.
thresholdsYes
probabilitiesYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry the safety profile (readOnlyHint=true, idempotentHint=true, openWorldHint=true, destructiveHint=false), lowering the bar. The description adds genuinely useful behavioral context beyond those annotations: the result is probabilistic, 'can land between levels' (non-integer outcomes), and includes distribution, confidence, and a recommended action. This frames how the tool behaves semantically.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences with zero filler. The purpose and return behavior are front-loaded, and the usage guidance (the differentiator from siblings) comes second. Every clause earns its place, and nothing repeats what the schema or annotations already provide.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, so return values need no explanation. The description covers purpose, usage scope, and behavioral output adequately. The threshold parameters (act_above, review_above) are left to the schema, which documents them fully. Only minor enhancement would be naming the alternative sibling explicitly, which the usage guidance dimension already captures.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 — the schema already documents that levels must be 'ordered, lowest first' and that question is 'the only instruction Jev sees.' The description adds only marginal signal: 'along an ordered scale you define' reinforces the levels parameter's semantics that the schema already states. It does not materially extend parameter meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Rate the state along an ordered scale you define') and distinguishes itself from category-picking tools. The sentence 'Use for degree or severity, not for picking a category' explicitly separates it from siblings like jev_classify, leaving no ambiguity about what operation this tool performs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use for degree or severity, not for picking a category' provides an explicit when-to-use and when-not-to-use rule. It clearly signals a category-picking alternative exists among the siblings, though it stops short of naming the specific tool (jev_classify) that should be selected instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

jev_screenScreen untrusted text for prompt injectionA
Read-onlyIdempotent

Check a web page, issue, email, or file you did not write for prompt injection BEFORE reading it into your context. Asks fixed yes/no signals (instructions aimed at an AI, attempts to override your instructions, requests to exfiltrate data, hidden instructions) and counts invisible Unicode characters in code. Returns verdict 'suspicious', 'uncertain' or 'clean' with every signal's probability. A clean verdict lowers the risk; it does not prove the text safe.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoA file read inside the server. Same rules as jev_triage paths. Supply exactly one of path or text.
textNoThe content, when you already hold it.
no_at_or_belowNoProbability at or below which a check's verdict is 'no'. Default 0.3. Between the two the verdict is 'uncertain'.
yes_at_or_aboveNoProbability at or above which a check's verdict is 'yes'. Default 0.7.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modelYes
usageYes
chunksYes
signalsYesProbability of each signal, the highest across chunks.
verdictYes
latency_msYesWall-clock milliseconds for the API round trip, for your own calibration logs.
thresholdsYes
hidden_charactersYesZero-width and bidi control characters found. Any makes the verdict suspicious.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly, idempotent, non-destructive), the description reveals what the tool actually does: asks fixed yes/no signals, counts invisible Unicode characters, returns a three-way verdict with probabilities, and clarifies that a clean verdict only lowers risk rather than proving safety. This is substantial behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences front-load the main action, then describe the signals, output, and a key limitation. Every sentence contributes meaningful information and there is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and annotations cover safety/idempotence, the description provides what an agent needs: input types, screening mechanism, verdict values, and a caution about interpreting a clean result. No critical behavioral gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents path, text, no_at_or_below, and yes_at_or_below thoroughly. The description adds context about the screening behavior but does not add any parameter-specific meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Check') and names concrete targets ('web page, issue, email, or file') and a clear goal ('for prompt injection'), and it states the timing ('BEFORE reading it into your context'). It does not explicitly distinguish this tool from its siblings such as jev_check or jev_triage, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear when-to-use guidance: apply it to content you did not write and before pulling it into context. It does not mention when not to use it or name alternative tools, so there are no explicit exclusions or sibling trade-offs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

jev_triageScreen many items, reading files server-sideA
Read-onlyIdempotent

Ask the same question set about many items in one call and get one result per item, in input order. Pass a file path per item and the server reads it, so the contents reach Jev without ever entering your context: you see only the answers. Use it to decide which of many files, documents, or candidates deserve a closer look before opening any. Give a plain 'query' for a single relevance check, or 'questions' for typed judgments. Each item is its own request; a failed item reports its error in place and the others still return. Nothing is truncated: an oversized file fails, it is not cut.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesUp to JEV_MAX_ITEMS (default 50) items, each with an id and exactly one of text or path.
queryNoShorthand for one check named 'relevant': does this item help with the stated task? Supply either query or questions, not both.
act_aboveNoConfidence at or above which the answer is marked 'act'. Default 0.8. Calibrate on your own data and the cost of being wrong.
questionsNoTyped questions asked of every item. Same shape as jev_ask.
review_aboveNoConfidence at or above which the answer is marked 'review' rather than 'abstain'. Default 0.5.
no_at_or_belowNoProbability at or below which a check's verdict is 'no'. Default 0.3. Between the two the verdict is 'uncertain'.
yes_at_or_aboveNoProbability at or above which a check's verdict is 'yes'. Default 0.7.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modelYes
usageYesSummed over the items that succeeded.
failedYesHow many items carry an error.
resultsYesOne entry per item, in input order.
file_rootsYesDirectories a path item may sit below. Empty when file reads are disabled.
latency_msYesWall-clock time for the whole batch.
thresholdsYes
none_optionsYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses multiple behaviors beyond the annotations: files are read server-side so contents never enter context, each item is an independent request with failures reported in place, and nothing is truncated (oversized files fail rather than being cut). These add significant value beyond the readOnlyHint and idempotentHint annotations, giving the agent a clear picture of failure modes and data handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, dense paragraph that front-loads the core purpose and key differentiators. Every sentence earns its place: it covers the batch nature, file reading, use case, query vs questions, failure isolation, and truncation policy without fluff. It is concise yet complete, ideal for an agent scanning for the essentials.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (7 parameters, nested question structure) and the presence of an output schema and comprehensive annotations, the description covers all critical operational aspects: the batch workflow, server-side file reading, independent failure handling, and the no-truncation guarantee. An agent can confidently invoke it for triage without needing additional clarification.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are fully documented in the schema. The description adds semantic meaning by explaining the conceptual difference between 'query' (single relevance check) and 'questions' (typed judgments), the file-path mechanism for avoiding context pollution, and the per-item independence. This goes beyond mere parameter listings, enriching the agent's understanding of how to compose calls.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Ask the same question set about many items in one call and get one result per item, in input order.' It specifies the verb (Ask), resource (many items), and the key differentiator (batch processing with server-side file reading). This distinguishes it from single-item siblings like jev_ask or jev_classify, which handle one item at a time.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit guidance on when to use: 'Use it to decide which of many files, documents, or candidates deserve a closer look before opening any.' This clearly indicates the batch triage scenario. However, it does not name specific alternatives or state when not to use it (e.g., when you have few items), so it lacks explicit exclusions. Still, the use case is clear enough for an agent to decide.

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. 11 tool updatesv0.14.0
    • First observedjev_ask
    • First observedjev_check
    • First observedjev_classify
    • First observedjev_extract
    • First observedjev_locate
    • First observedjev_models
    • First observedjev_rank_pages
    • First observedjev_score
    • First observedjev_screen
    • First observedjev_search
    • First observedjev_triage

TDQS

A4.4/5.0

Scored across 11 tools

Disambiguation5/5

Each tool has a clearly identified job: classification, scoring, yes/no checks, batched questions, batched files, directory line search, single-file line search, short-value extraction, injection screening, web ranking, and model listing. Even the similar pair jev_search and jev_locate are explicitly split by directory versus single-file use, so an agent should not misselect.

Naming Consistency4/5

All tools share the jev_ prefix and nearly all use a simple verb form, creating a predictable pattern. The only minor deviation is jev_models, which is a noun rather than a verb like list_models, but it is still recognizable and does not break the overall convention.

Tool Count5/5

Eleven tools is within the ideal range and each tool addresses a distinct need in the Jev workflow, from asking questions of files to ranking web pages to screening for prompt injection. The count feels deliberate rather than padded.

Completeness5/5

The surface covers the full read-and-analyze lifecycle: single questions, batched questions, many-file triage, directory search, large-file location, short extraction, classification, scoring, web ranking, and security screening. No obvious dead ends or missing operations stand out for the stated domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables frontier coding agents to delegate routine probabilistic judgments to TypeSafe Jev, providing calibrated triage signals for failures, attempts, completion, context ranking, findings, risk, and generic evidence-grounded questions.
    7
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables agents to get fast, calibrated probabilistic answers from Jev (Typesafe AI) to yes/no, scale, or choice questions about provided material, without using a generative model.
    1
    208 npm
    2
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables coding or reasoning agents to request structured judgments from TypeSafe's Jev model at decision points, including choices, scores, claim verification, and code reviews, with probabilities and confidence returned as data.
    5
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Enables AI agents to obtain typed judgments from TypeSafe's Jev System One models, including yes/no probabilities, multiple-choice selections with distributions, and rubric-based scores, directly usable in code.
    5
    1
    AGPL 3.0