Skip to main content
Glama

Jev MCP Proxy

Python Version Protocol License

A high-performance Model Context Protocol (MCP) proxy server that routes System One evaluation requests from AI agent skills directly to TypeSafe AI's Jev model.


Background: System One & Jev

As introduced by TypeSafe AI in Introducing System One Models & Jev, System One models represent a new class of frontier AI designed for automation within code. Rather than generating conversational strings token-by-token, Jev takes program state and answers typed questions in parallel with calibrated probabilities.

  • Fast & Hardware-Aware: 70ms–500ms end-to-end response time.

  • Typed Outputs: Strictly evaluates against defined rubrics (no string hallucinations or schema mismatches).

  • Calibrated Uncertainty: Communicates exact confidence scores and probabilities.

This MCP server acts as the dedicated router between agent skills (in Google Antigravity, Claude Code, Cursor, etc.) and Jev.

┌─────────────────────────────────────────────────────────────┐
│                       Agent Platform                        │
│             (Google Antigravity / Claude Code)             │
│                                                             │
│   ┌──────────────────┐             ┌────────────────────┐   │
│   │  Routing Skill   │             │  Moderation Skill  │   │
│   └────────┬─────────┘             └─────────┬──────────┘   │
└────────────┼─────────────────────────────────┼──────────────┘
             │           MCP Tools             │
             ▼                                 ▼
┌─────────────────────────────────────────────────────────────┐
│                    Jev MCP Proxy Server                     │
│    (jev_evaluate, jev_choice, jev_noul, jev_score)          │
│                                                             │
│  - JSON-RPC stdio transport                                 │
│  - Auto-retries with exponential backoff on 429 & 529       │
│  - Stderr request tracing & latency measurement             │
└──────────────────────────────┬──────────────────────────────┘
                               │ HTTPS / Bearer Token
                               ▼
┌─────────────────────────────────────────────────────────────┐
│                 TypeSafe AI Jev API                         │
│         (https://api.typesafe.ai/v1/systemone)              │
└─────────────────────────────────────────────────────────────┘

Related MCP server: jev-mcp

Features

  • Lean & Focused: The only functionality of this MCP server is to route requests to Jev when skills need them.

  • Full Parallel Evaluation: jev_evaluate allows evaluating arbitrary state against multiple typed questions in a single round-trip.

  • Convenience Tool Shortcuts: High-level tools (jev_choice, jev_noul, jev_score) for common skill operations.

  • Resilience: Automatic retry logic with exponential backoff for HTTP 429 (Rate Limit) and 529 (Service Overloaded).

  • Live Tracing: Emits structured timing, token usage, and status traces directly to stderr (visible in MCP host logs without interfering with JSON-RPC over stdout).


Exposed MCP Tools

1. jev_evaluate

Primary batch router for TypeSafe AI Jev. Evaluates state (text or structured data) against multiple typed questions simultaneously.

Parameters:

  • state (string | object | array, required): The application state, document, log, or conversation context to evaluate.

  • questions (object, required): Dictionary of question IDs mapping to question definitions.

    • type: "noul" | "choice" | "score"

    • instructions: Prompt or criteria instructions.

    • criteria: Required for choice (map of options to descriptions) and score (list of level strings). Optional for noul.

  • model (string, optional): Jev model version (default: "jev-latest").

  • api_key (string, optional): Override for TYPESAFE_API_KEY.

Example:

{
  "state": "The user reported: Database pool connection timeout after 30s in checkout service.",
  "questions": {
    "is_incident": {
      "type": "noul",
      "instructions": "Does this indicate a production incident?"
    },
    "service_area": {
      "type": "choice",
      "instructions": "Which domain team owns this?",
      "criteria": {
        "database": "Database servers and connection pooling",
        "billing": "Checkout, credit cards, payment logic",
        "frontend": "UI buttons and rendering"
      }
    }
  }
}

2. jev_choice

Categorical classification shortcut. Selects one option from a defined set, returning the selected choice, confidence score, and full probability distribution.

Parameters:

  • state (string | object | array): Context to evaluate.

  • instructions (string | object | array): What the model should decide.

  • criteria (object): Dictionary mapping option keys to descriptive rubrics.

  • model (string, optional): Default "jev-latest".

  • question_id (string, optional): Default "choice".

Example Response:

{
  "choice": "database",
  "confidence": 0.88,
  "probabilities": {
    "database": 0.88,
    "billing": 0.10,
    "frontend": 0.02
  },
  "usage": { "input_tokens": 140, "output_tokens": 25 }
}

3. jev_noul

Binary probability shortcut. Evaluates a yes/no question and returns the calibrated probability ($0.0 \le P \le 1.0$) that the statement is true.

Parameters:

  • state (string | object | array): Context to evaluate.

  • instructions (string | object | array): The yes/no question.

  • criteria (object, optional): Optional definitions for {"true": "...", "false": "..."}.

Example Response:

{
  "probability": 0.95,
  "is_likely": true,
  "usage": { "input_tokens": 98, "output_tokens": 12 }
}

4. jev_score

Rubric rating shortcut. Rates state across an ordered rubric of at least two descriptive levels, returning a weighted score and confidence.

Parameters:

  • state (string | object | array): Context to evaluate.

  • instructions (string | object | array): Rating criteria.

  • criteria (array of strings): Ordered list of descriptive levels (e.g. ["Low", "Medium", "High", "Critical"]).

Example Response:

{
  "score": 2.8,
  "confidence": 0.84,
  "legend": { "0": "Low", "1": "Medium", "2": "High", "3": "Critical" },
  "probabilities": { "0": 0.0, "1": 0.05, "2": 0.15, "3": 0.80 }
}

Installation & Setup

Prerequisites

  • Python 3.10+

  • uv (recommended) or pip

git clone https://github.com/altregubov/jev-antigravity-mcp.git
cd jev-antigravity-mcp
uv sync

Environment Variables

  • TYPESAFE_API_KEY: Your API key from the TypeSafe AI Console.

  • TYPESAFE_BASE_URL: (Optional) Custom API endpoint (default: https://api.typesafe.ai/v1/systemone).

  • JEV_DEBUG: Set to "1" (default) to log request traces to stderr.


Configuration

Google Antigravity 2.0

Option A: Zero-Install from GitHub via uvx (Recommended)

No local repository cloning needed. Antigravity will automatically fetch and run the server in an isolated environment.

Add the following to your global Antigravity MCP configuration (~/.gemini/config/mcp_config.json):

{
  "mcpServers": {
    "jev-proxy": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/altregubov/jev-antigravity-mcp",
        "jev-mcp"
      ],
      "env": {
        "TYPESAFE_API_KEY": "YOUR_TYPESAFE_API_KEY"
      }
    }
  }
}

Option B: Via the Antigravity 2.0 Desktop UI

  1. Open the Antigravity 2.0 desktop app.

  2. In the left-hand sidebar, click Skills & Customizations (or click the ... menu in the top-right $\rightarrow$ MCP Servers).

  3. Click Add MCP Server (or +).

  4. Configure as Stdio Transport:

    • Name: jev-proxy

    • Command: uvx

    • Arguments: --from git+https://github.com/altregubov/jev-antigravity-mcp jev-mcp

    • Environment Variables:

      • TYPESAFE_API_KEY: YOUR_TYPESAFE_API_KEY

  5. Click Save & Connect.

Option C: Local Development / Cloned Repository

If you cloned the repository locally:

{
  "mcpServers": {
    "jev-proxy": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "/path/to/jev-antigravity-mcp",
        "jev-mcp"
      ],
      "env": {
        "TYPESAFE_API_KEY": "YOUR_TYPESAFE_API_KEY"
      }
    }
  }
}

Note: After adding the server, start a New Conversation or click Refresh in Skills & Customizations to mount the tools (jev_evaluate, jev_choice, jev_noul, jev_score).

Claude Code / Cursor

Add to your Claude Code or Cursor MCP configuration:

{
  "mcpServers": {
    "jev-proxy": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "/path/to/jev-antigravity-mcp",
        "jev-mcp"
      ],
      "env": {
        "TYPESAFE_API_KEY": "YOUR_TYPESAFE_API_KEY"
      }
    }
  }
}

Tracing and Diagnostics

The proxy logs structured traces to stderr without interfering with the JSON-RPC communication on stdout:

[17:45:03] [jev_proxy] INFO: --> Routing request to JEV: POST https://api.typesafe.ai/v1/systemone | model=jev-latest | questions=['is_incident', 'service_area']
[17:45:04] [jev_proxy] INFO: <-- 200 OK from JEV in 184.2ms | model=jev-1.13.0 | tokens(in=320, out=45)

To see complete HTTP wire traces (request headers, connection pools, raw bytes):

HTTPX_LOG_LEVEL=trace uv run jev-mcp

Running Tests

The test suite covers client routing, question shortcuts, error handling (401, 422), rate limit backoff retries, and stdio JSON-RPC handshakes:

uv run pytest

License

MIT License. See LICENSE for details.

Available Tools

4 tools
jev_choiceC

Route a single Choice question to Jev. Categorizes or selects one option from a defined rubric, returning the selected choice, confidence score, and full probability distribution.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNojev-latest
stateYes
api_keyNo
criteriaYes
question_idNochoice
instructionsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries full responsibility for behavioral disclosure. It does mention the return format (choice, confidence, probability distribution), which is useful, but it omits critical context such as whether the tool has side effects, requires authentication (api_key is a parameter), has rate limits, or is read-only. The behavior is only partially described.

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?

The description is two sentences long, with the purpose front-loaded and no unnecessary detail. It efficiently conveys the core action and expected output. Slight deduction for not providing any usage context, but the structure itself is clean and focused.

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

Completeness2/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, nested objects (state, criteria), and an output schema, the description is incomplete. It does not explain how to structure state or criteria, when to override the model, or how to supply the api_key. While the output schema covers return values, the input construction is left ambiguous, so an agent would struggle to call it correctly.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate by explaining parameters. It references a 'defined rubric' (likely criteria) and the act of categorizing, but does not explain the roles of state, instructions, model, api_key, or question_id. This leaves most parameters undocumented, making it hard for an agent to construct valid arguments.

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 routes a single Choice question to Jev and performs categorization/selection from a rubric, with explicit output (choice, confidence, probability distribution). However, it does not explicitly differentiate from sibling tools like jev_score or jev_evaluate, leaving the distinction implied by the name rather than stated.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus its siblings. The description only says what it does, not when it is appropriate or when to avoid it. No alternatives or exclusions are mentioned, so an agent cannot decide between jev_choice and similar tools.

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

jev_evaluateA

Primary proxy router for TypeSafe AI Jev. Evaluates unstructured or structured state against multiple typed questions (noul, choice, score) in parallel. Returns answers with calibrated probabilities, confidence scores, and token usage.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNojev-latest
stateYes
api_keyNo
questionsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description carries the burden. It discloses parallelism, input flexibility, and return contents (calibrated probabilities, confidence scores, token usage), but does not address safety/mutation, auth, or error behavior. Parallel evaluation and return details are useful but not a full behavioral profile.

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 short sentences front-load the router role, the operation, the input types, and the output. Every sentence adds information; no filler or repetition of schema titles.

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

Completeness3/5

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

The description gives a competent overview for selection and basic invocation, but the tool is a multi-question router with nested input and no annotations. It omits how individual typed questions are structured and does not mention credential/model parameters, so an agent is not fully equipped to call it correctly.

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 0%, so the description must add meaning. It clarifies that 'state' may be unstructured or structured and that 'questions' are typed evaluation questions, but it does not explain 'model' or 'api_key' or the expected shape of a question object.

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 ('evaluates'), a resource ('unstructured or structured state'), and a distinguishing scope ('multiple typed questions (noul, choice, score) in parallel'). This clearly separates it from the 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 Guidelines4/5

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

It is identified as the primary proxy router, and 'multiple' plus 'in parallel' signal when to prefer it over the individual typed tools. It does not explicitly state when not to use it or name those tools as alternatives, so it stops short of a 5.

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

jev_noulB

Route a single Noul (yes/no) question to Jev. Returns the calibrated probability (0.0 to 1.0) that the answer is yes, suitable for confidence gating and binary routing.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNojev-latest
stateYes
api_keyNo
criteriaNo
question_idNonoul
instructionsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden and does disclose the key output behavior: a calibrated probability between 0.0 and 1.0. It does not, however, mention that the api_key parameter implies an external service call — with attendant auth, cost, and network-failure implications — nor does it disclose error behavior, latency, or whether the call is idempotent.

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?

A single tightly-worded sentence front-loads the purpose and follows with the return contract and use case. Every clause earns its place and there is zero filler or redundancy.

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

Completeness2/5

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

Although an output schema exists (so return values need not be spelled out), the input side is badly under-specified: two required polymorphic parameters with no guidance, no annotation safety profile, and sibling tools that could be confused with it. An agent receiving this definition cannot confidently construct a correct call to state and instructions.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for six undocumented parameters — but it explains none of them. The required params state and instructions are polymorphic (string/object/array) and the agent is left guessing what content belongs in each; criteria, model, question_id, and api_key are likewise unexplained. The description only covers tool-level purpose, not how to populate the arguments.

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 states a specific verb and resource: 'Route a single Noul (yes/no) question to Jev' and defines the output precisely as 'the calibrated probability (0.0 to 1.0) that the answer is yes.' This clearly distinguishes it from the sibling set (evaluate/choice/score) by its yes/no-with-probability nature, though it never names the siblings explicitly.

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 phrase 'suitable for confidence gating and binary routing' gives useful implied usage context, signaling this is a decision/threshold tool rather than a free-form evaluation. However, it offers no explicit when-to-use versus when-not-to-use guidance against the siblings jev_evaluate, jev_choice, and jev_score, leaving the selection logic to inference.

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

jev_scoreB

Route a single Score question to Jev. Rates the input along an ordered rubric of at least two descriptive levels, returning a weighted score and confidence.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNojev-latest
stateYes
api_keyNo
criteriaYes
question_idNoscore
instructionsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It does add useful behavior: the input is rated along an ordered rubric of at least two descriptive levels datapoints and the result includes a weighted score and confidence. However, it omits important behavioral context such as whether an API key is required, how the weighting is determined, what confidence means, and failure/error 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?

The description is two sentences with no filler. Every phrase earns its place: the resource, the routing action, the rubric constraint, and the returned values. It is tight, front-loaded, and quickly scannable.

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

Completeness2/5

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

Although an output schema is presentasi and the return values are partially described, the description is incomplete for a tool with six parameters and three required fields. The agent still lacks enough detail to construct valid calls, especially for the required instructions and criteria, and receives no guidance about sibling distinctions. The overall context is too sparse for reliable invocation.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for six undocumented parameters. The terms 'input' and 'ordered rubric' vaguely map to state and criteria, but neither required parameters such as instructions and criteria nor optional ones like model, api_key, and question_id are explicitly explained. The description adds only a thin layer of meaning beyond the raw schema.

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 specific verbs ('Route', 'Rates') and identifies a concrete resource ('a single Score question'), a scoring mechanism ('ordered rubric'), and the output ('weighted score and confidence'). It implicitly separates this tool from siblings like jev_choice and jev_evaluate by focusing on rubric-based scoring, but it never names or contrasts them explicitly.

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

Usage Guidelines2/5

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

The phrase 'a single Score question' hints at a narrow use case, but the description gives no explicit guidance on when to choose this tool over jev_evaluate, jev_choice, or jev_noul. It does not state conditions, exclusions, or alternatives, leaving the agent to infer the appropriate context.

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. 4 tool updatesv0.1.0
    • First observedjev_choice
    • First observedjev_evaluate
    • First observedjev_noul
    • First observedjev_score

TDQS

B3.4/5.0

Scored across 4 tools

Disambiguation4/5

jev_evaluate is clearly the multi-question router, while jev_choice, jev_noul, and jev_score each target a distinct question type. There is minor potential overlap because a single question could be sent through either jev_evaluate or the specific single-type tool, but the descriptions make the intended use clear.

Naming Consistency4/5

All tools share the consistent jev_ prefix and lowercase snake_case style, which makes them recognizable as a family. However, jev_evaluate uses a verb while jev_choice, jev_noul, and jev_score use noun-like type names, so the action pattern is not perfectly uniform.

Tool Count5/5

Four tools is a well-scoped surface for this proxy: one aggregate router plus one tool for each supported question type. There is no redundancy or unnecessary bloat.

Completeness5/5

The tool set fully covers the apparent domain: the three question types (noul, choice, score) are each directly accessible, and jev_evaluate provides the multi-question parallel path. No obvious missing lifecycle or operational tools are needed for a stateless evaluation service.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables MCP clients to call TypeSafe's JEV classifier and receive structured, typed judgments with probabilities for binary, choice, and scoring questions.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Provides coding agents and CI with a typed decision layer that sends bounded state and questions to Jev, then returns deterministic actions for review, risk assessment, requirement checks, and verification.
    9
    MIT
  • 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
    MIT