jev
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| JEV_HOME | No | Directory for switch and ledger files. Defaults to ~/.claude/jev-think. | |
| JEV_MODEL | No | Model id. Defaults to jev-latest. | jev-latest |
| JEV_LEDGER | No | Optional. Path to a JSONL ledger file. Defaults to $JEV_HOME/ledger.jsonl. | |
| JEV_API_KEY | No | Alternative to TYPESAFE_API_KEY. Your TypeSafe API key. | |
| JEV_RG_PATH | No | Path to ripgrep binary. Defaults to 'rg' on PATH. | rg |
| JEV_KEY_FILE | No | Path to the API key file. Defaults to $XDG_CONFIG_HOME/jev/api_key. | |
| JEV_MAX_ITEMS | No | Items per jev_triage, paths per jev_ask, windows per jev_locate. Defaults to 50. | 50 |
| JEV_FILE_ROOTS | No | Directories that file-reading tools may access. Defaults to the working directory; 'off' disables file reads. | |
| JEV_TIMEOUT_MS | No | Per-attempt timeout. Defaults to 5000. | 5000 |
| JEV_ALLOW_HOSTS | No | Comma-separated hosts that may be fetched even if they resolve to private addresses. Empty by default. | |
| JEV_CONCURRENCY | No | Parallel requests within one jev_triage call. Defaults to 4, capped at 16. | 4 |
| JEV_MAX_RETRIES | No | SDK retries after a failed attempt. Defaults to 0. | 0 |
| JEV_SWITCH_FILE | No | Optional. Path to a JSON file containing the switch state. Defaults to $JEV_HOME/state.json. | |
| TYPESAFE_API_KEY | No | Required. Your TypeSafe API key. | |
| JEV_MAX_QUESTIONS | No | Questions per jev_ask or jev_triage. Defaults to 64. | 64 |
| TYPESAFE_BASE_URL | No | Base URL override for the TypeSafe API. Defaults to https://api.typesafe.ai. | |
| OPENROUTER_API_KEY | No | Alternative API key. Your OpenRouter API key. | |
| TYPESAFE_LOG_LEVEL | No | SDK verbosity. Safe at any level; all output goes to stderr. | |
| JEV_MARKITDOWN_PATH | No | Path to markitdown binary. Defaults to 'markitdown' on PATH. | markitdown |
| JEV_MAX_STATE_CHARS | No | Largest state accepted. Defaults to 200000. | 200000 |
| JEV_TRAFILATURA_PATH | No | Path to trafilatura binary. Defaults to 'trafilatura' on PATH. | trafilatura |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| jev_classifyA | 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. |
| jev_scoreA | 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. |
| jev_checkA | 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. |
| jev_askA | 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. |
| jev_triageA | 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. |
| jev_locateA | 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. |
| jev_searchA | Find the lines across a whole directory that answer a question, instead of reading pages of grep hits. The server runs ripgrep (honouring .gitignore and .ignore, skipping hidden, binary and credential files), keeps lines matching an optional regex 'pattern' as candidates, and Jev ranks them with their neighbouring lines. Returns path, line number and the line's text for the best hits, per question. Use a broad pattern to narrow cheaply (e.g. 'retr|backoff'), then let Jev judge meaning. Without a pattern every non-empty line is a candidate, so also set include or a small dir. Pass every question you have about this area in one call, with a pattern covering all of them: the candidates are read once for all questions. |
| jev_extractA | 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. |
| jev_screenA | 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. |
| jev_rank_pagesA | 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. |
| jev_modelsA | 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 11 tools
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.
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.
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.
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.