Skip to content

Jev Agents & MCP

Building MCP servers that expose decisions, not just tools

Most MCP servers expose tools. A decision server exposes questions. How to design one that returns typed answers, handles auth, and stays small.
Published
Category
Jev Agents & MCP
Resources cited
8
Reading time
6 min
Tags#agents#mcp#tools#decisions

An MCP server that exposes only tools leaves the judgment to the caller. The agent still has to decide which tool fits, whether the call is safe, and what to do with a result it does not understand. A decision server exposes that judgment directly: typed questions in, calibrated answers out, with no action attached.

The interface should be a judgment

The cleanest decision server has one tool and a narrow contract. Typesafe MCP exposes a single evaluate tool for noul, choice, and score questions. It ships as one static Go binary, registers itself with Claude Code, Claude Desktop, and Codex in one command, retries 429 and 529 with exponential backoff, applies a 60-second timeout and a 16 MiB response cap, and can score up to 500 records in one call. It is effectively a thin wrapper around Jev's REST API, and that is the point: the interface is the judgment, not a workflow.

Glama's Jev Decision MCP takes the same shape further into minimalism. One read-only tool, jev_decide; choice takes 1–255 named options, score rates 2–10 ordered levels with a 0-based score, and noul returns a 0–1 probability. It batches independent questions in one call and preserves question IDs. Questions in a batch cannot see each other's answers. It never executes an action.

Jev Decision Layer for Cursor ships four advisory tools, each building exactly one Choice question and returning a decision. The README states that nothing is ever executed. That constraint is worth copying: a decision server that also acts is two products with one permission model.

Batch independent questions and preserve IDs

Batching is not just a latency trick. It changes what the caller has to reason about. Glama's server keeps question IDs stable across a batch, so the caller can map answers back without guessing from order. Each question is independent, which means a batch is safe only when the questions do not depend on each other's answers. If B depends on A, send them in separate calls.

Jev MCP shows what a larger surface looks like. It ships nine tools (jev_step, jev_coding_loop, jev_tool_route, jev_review, jev_verify, jev_gate, jev_screen, jev_rank, and jev_evaluate) with a prepared-call router that accepts at most 32 candidates, rank handling up to 5,000 candidates at no more than 250 options per upstream call, and a state-plus-questions budget of an estimated 64,000 tokens. Calls default to a 30-second deadline. The limits are part of the contract: over-budget questions are rejected rather than silently truncated.

The catalog is honest about the gap. Jev MCP's README says live quality and cost savings have not been measured, and JEV_MCP_MOCK=1 is for tests and demos rather than production. The batching and routing are structural; the savings are not yet evidence.

Name the action, or leave it to the caller

There are two defensible designs. The first returns probabilities and lets the caller decide. Glama's server does this: thresholds, escalation, and action execution stay outside the model. The second returns an action label alongside the numbers. Jev MCP returns auto, review, or escalate with token usage, and incomplete context never permits auto.

ServerSurfaceReturnsExecutes?Notable limit
Typesafe MCPOne evaluate toolNoul, choice, score answersNo500 records per call; 16 MiB response cap
Glama Jev Decision MCPOne jev_decide toolAnswers and usageNo1–255 options; 2–10 score levels
Jev MCPNine toolsTyped answers plus actionNo64k token budget; 32-candidate router
OpenRouter Jev MCPFive toolsChecks, classifications, scoresNoAlpha OpenRouter endpoint

An action label is only useful if code treats it as advice and keeps its own policy floor. A probability is only useful if the caller has a threshold and a human path. The server's job is to make the judgment legible; the application's job is to decide.

Failure semantics matter more than tool count

OpenRouter Jev MCP is a good stress test because it depends on an alpha endpoint. Five tools cover yes/no checks, classification, scoring, multi-question evaluation, and health. It retries transient HTTP codes up to three attempts with exponential backoff from 0.25 seconds, enforces a 20-second network deadline, and allows at most eight requests in flight per instance. Malformed JSON, missing answers, and invalid values produce structured errors; failures are treated as no judgment, not as a negative verdict. Diagnostics log to a local state directory with a 20 MiB cap and 24-hour retention, and secret filtering is best effort.

That last detail matters. A decision server that logs state is a data processor, and "best effort" is not a retention policy. Read the log path before you point it at production traffic.

The smaller servers have simpler failure contracts. Typesafe MCP retries 429 and 529 and caps responses. Glama's server starts without a key so the client can discover the tool, but decision calls return MISSING_API_KEY; it does not invent an answer. OpenRouter's server does not accept native TypeSafe keys at all. These are not edge cases. They are the first things to test.

Discovery and dispatch

A dispatcher is a different product from a decision server, and it is easy to confuse the two. jev-mcp-dispatcher discovers a server's tools at runtime with list_tools() and routes plain-language commands using only Jev Choice and Noul, with no general-purpose LLM calls. Tool selection is a Choice over live tool names and descriptions. Non-enum arguments use a per-word Noul pass, and values are exact substrings copied from the command.

The limits are severe: only string, integer, number, boolean, and enum parameters; values must appear literally; optional parameters are still force-extracted; there is no confidence gating, retry, or multi-turn clarification; two same-typed numbers can claim the same word. It is a proof of concept, not a router you should put in front of an arbitrary MCP catalog.

MCP Router is the production-shaped version. It discovers, catalogs, classifies, and deduplicates servers and tools, exposes each agent only the small authorized subset it needs, and runs routing as System One Choice, Score, or Noul questions. The decision engine is pluggable: Laya, a 421M open-weight Jev-compatible model under Apache 2.0, at the edge; a hosted endpoint; or Azure OpenAI. Retrieval uses Postgres with pgvector plus full-text search, fused with reciprocal-rank fusion. A deterministic, deny-by-default policy engine and execution manager gate everything, and model scores are relevance data that can never widen access. Exposure budgets can be lowered per request but never raised. The README publishes no benchmarks, and the stack assumes Postgres with pgvector.

That is the right division: the model ranks, the policy engine authorizes, and the caller executes.

What to build

  • Expose judgment, not side effects. If the server acts, it needs the same permission design as any other tool.
  • Keep question IDs stable and batch only independent questions.
  • Publish limits: option counts, score levels, token budgets, timeouts, and what happens over budget.
  • Return typed errors, never a fabricated answer. Treat provider failure as no judgment.
  • Leave thresholds and actions in the caller, or return an action label that is explicitly advisory.
  • Log enough to audit the decision, and define retention before collecting state.

The MCP server is a transport, not a policy. Agent Skill can teach an agent how to structure the questions, but it is guidance, not a runtime library. For the routing side, MCP Tool Routing covers how tool choice becomes a decision; Jev in Coding Agents shows the client side; and One Request, Many Questions is the batching background. Build the server so a decision model is useful without being trusted.

From the Jev directory

The resources behind this article.

353GitHub stars
A single-binary Go MCP server exposing one evaluate tool for noul, choice, and score questions, with one-command registration for Claude Code, Claude Desktop, and Codex.
Jev Tools & CLIs#community#go#mcp
Amidabuddha's local stdio MCP server wraps TypeSafe's Jev in a single jev_decide tool: batched choice, score, and noul judgments with probabilities and token usage, leaving thresholds and actions to the caller.
Jev Agents & MCP#community#mcp#typescript
Community
Four advisory decision tools for AI agents, shipped as a zero-dependency stdio MCP server backed by the TypeSafe System One API (Jev model). Each tool builds exactly one Choice question and returns a decision; nothing is ever executed.
Jev Agents & MCP#community#github#mcp
64GitHub stars
An MCP server that puts Jev in the coding loop for Cursor, Codex, and other MCP clients: coding-loop checks, ranking, verification, and review tools.
Jev Tools & CLIs#community#mcp#coding-agent
4GitHub stars
Proof-of-concept dispatcher that discovers an MCP server's tools at runtime with list_tools() and routes plain-language commands using only Jev Choice and Noul, with no general-purpose LLM calls.
Jev Agents & MCP#community#jevbest#catalog-import
0GitHub stars
An open-source Jev-based MCP router: it discovers, catalogs, classifies and deduplicates every MCP server and tool you have, then exposes each agent only the small, authorized subset it needs for the task. Routing decisions are System One Choice/Score/Noul questions, scored by a pluggable engine at the edge or hosted.
Jev Agents & MCP#community#catalog-import#logicrw
3GitHub stars
A Python decision gateway and stdio MCP server that exposes Jev through OpenRouter's alpha decisions endpoint. Five tools cover yes/no checks, classification, scoring, multi-question evaluation and health, with bounded retries, validated answers and local diagnostics.
Jev Agents & MCP#community#mcp#openrouter
2.7kGitHub stars
Drop-in skill for Claude Code, Codex, and other agent environments that teaches the right way to structure states and questions.
Jev Tools & CLIsDocs#official#agent#skill
Back to all articles

Related Jev articles

An agent can send a malformed argument or trust a poisoned result. How to validate both sides with typed decisions and deterministic checks.
Jev Agents & MCP#agents#tools#validation
Read article
A gate, a router, a critic, or a judge? Where a decision model fits in an agent loop, and how to keep the loop from becoming a chain of model calls.
Jev Agents & MCP#agents#routing#gates
Read article

From the Jev AI model community

Posts from builders shipping with Jev right now.

Follow @typesafeai