# JevLint-LE (npm · jevlint-le-mcp)

Lint questions for TypeSafe's Jev and OpenAI's Luna offline, or ask the model itself with your key.

- Trust score: 69/100 (medium)
- Registry status: deprecated
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-16

> **Deprecated**: this server is marked deprecated in the MCP registry. The registry records this reason: "Renamed to io.github.nolindnaidoo/decisionlint. Install decisionlint-mcp; jevlint-le-mcp 0.9.0 forwards to it."

## Components

- npm · `jevlint-le-mcp`: 69/100 (this document), [markdown](https://verifymcp.io/servers/nolindnaidoo-jevlint-le/jevlint-le-mcp.md), [page](https://verifymcp.io/servers/nolindnaidoo-jevlint-le/jevlint-le-mcp)

## Channel facts

- Registry: `npm`
- Package: `jevlint-le-mcp`
- Version: `0.8.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-16.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - No production dependencies, so there is no dependency health to assess.
- **Provenance & Transparency**: 65/100
  - Repository check failed: the declared repository URL redirects; it must resolve directly.
  - Cryptographically verified build provenance (signed, bound to nolindnaidoo/jevlint-le).
  - Clear OSI-approved license (MIT).
  - Maintenance check failed: the publisher has marked this version as deprecated on the registry, telling users to stop installing it.
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 63/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 1836 tokens (~229/item across 8 items; 8 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 75/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "probe_question" implies "send" and declares readOnlyHint instead, contradicting what its own name says it does.
  - An AI judge read all 9 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 60/100
  - Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the JevLint-LE MCP server?

JevLint-LE runs locally as an npm package, launched with npx -y jevlint-le-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add nolindnaidoo-jevlint-le -- npx -y jevlint-le-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "nolindnaidoo-jevlint-le": {
      "command": "npx",
      "args": [
        "-y",
        "jevlint-le-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "nolindnaidoo-jevlint-le": {
      "command": "npx",
      "args": [
        "-y",
        "jevlint-le-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add nolindnaidoo-jevlint-le -- npx -y jevlint-le-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "nolindnaidoo-jevlint-le": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "jevlint-le-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add nolindnaidoo-jevlint-le --command npx --arg -y --arg jevlint-le-mcp
```

### Hermes

```yaml
mcp_servers:
  nolindnaidoo-jevlint-le:
    command: "npx"
    args: ["-y", "jevlint-le-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "nolindnaidoo-jevlint-le": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "jevlint-le-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add nolindnaidoo-jevlint-le -t stdio -c npx -a -y jevlint-le-mcp
```

### Other

```json
{
  "mcpServers": {
    "nolindnaidoo-jevlint-le": {
      "command": "npx",
      "args": [
        "-y",
        "jevlint-le-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-16 (score 69, −1)

- [functional regression] Maintenance: pass → fail

### 2026-10-15 (score 70, +21)

- [security regression] Source repository: pass → fail
- [security improvement] Injection markers: unverified → pass
- [security] First check of Judged manipulation: pass
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [functional regression] MCP protocol: unverified → fail
- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: excellent
- [functional] First check of Schema quality: fail
- [functional] First check of Destructive annotations: 0
- [functional] First check of Tool coverage: 100
- [functional] First check of Tool coverage: 100

### 2026-10-14 (score 49, 0)

- [functional] Package version: 0.8.0 → 0.8.1

### 2026-10-13 (score 49, 0)

- [functional] Package version: 0.7.0 → 0.8.0

### 2026-10-12 (score 49)

First indexed and scored.

## MCP tools (8)

### `lint_text` (~237 tokens)

Lint text

Lint questions written for a decision model before they are sent: TypeSafe's Jev (System One, /v1/systemone) and OpenAI's Decisions API (gpt-6-luna, /v1/decisions), in either request shape, or the Vercel AI SDK's decide() for both. Pass a request body as JSON, or source code that builds one. Returns each finding with its rule, message, position and docs link, the edit that would mend it when there is one, plus how many questions were found and how many could not be read in full. Use it after writing or changing a question. It sends nothing over the network.

Input parameters:

- `filename` (string): A file name whose extension says what the text is: .json, .ts, .js, .py, .rs or .go. Defaults to request.jev.json.
- `rules` (object): Rule levels to override, such as { "JEV004": "off" }. Levels: off, hint, info, warning, error.
- `text` (string, required): The request JSON or the source code.

Output parameters:

- `files` (array)
- `totals` (object)

### `lint_paths` (~115 tokens)

Lint files

Lint the Jev and OpenAI Decisions questions in files or directories on disk. A directory is searched for the file types the linter reads. Returns the same report as lint_text, one entry per file. It sends nothing over the network.

Input parameters:

- `paths` (array, required): Files or directories on disk, relative to the directory the server was started in.
- `rules` (object): Rule levels to override, such as { "JEV004": "off" }. Levels: off, hint, info, warning, error.

Output parameters:

- `files` (array)
- `totals` (object)

### `fix_text` (~230 tokens)

Fix text

Apply the safe fixes to a request body or source code passed as text, and return the mended text with how many findings were mended and the report of what is left. A safe fix only mends what the API would refuse: a criteria key written yes where it takes true, a mistyped question type, criteria in the wrong shape. A fix that changes what a working request does, such as adding a fallback option or pinning a model, is never applied here. It stays in the report with its edit marked safe: false, for you to make or to leave. Nothing is written to disk and nothing is sent over the network.

Input parameters:

- `filename` (string): A file name whose extension says what the text is: .json, .ts, .js, .py, .rs or .go. Defaults to request.jev.json.
- `rules` (object): Rule levels to override, such as { "JEV004": "off" }. Levels: off, hint, info, warning, error.
- `text` (string, required): The request JSON or the source code.

Output parameters:

- `files` (array)
- `fixed` (integer): Findings mended.
- `text` (string): The text with the safe fixes applied.
- `totals` (object)

### `list_rules` (~54 tokens)

List rules

List every rule with its code, name, what it catches, default level, its own page with an example, the vendor page behind it, and whether it runs offline here or only when check_with_jev asks the model.

Output parameters:

- `rules` (array)

### `explain_rule` (~84 tokens)

Explain a rule

A rule's own page, as Markdown: what it catches, an example that is flagged with the message the linter gives, one that is not, how to fix it and how to silence it. Use it before making a fix that fix_text leaves to you, or before silencing a finding.

Input parameters:

- `code` (string, required): The rule, such as JEV004.

Output parameters:

- `code` (string)
- `default` (string): The level the rule runs at unless a setting changes it.
- `docs` (string): The vendor page behind the rule.
- `markdown` (string): The rule's page, as Markdown.
- `meaning` (string): What the rule catches, in one sentence.
- `name` (string)
- `page` (string): The rule's own page.
- `runsHere` (boolean): False for a rule that asks the model itself, which only check_with_jev runs.

### `plan_jev` (~305 tokens)

Plan a check with the model

Say what check_with_jev would send for the given text or paths, and send nothing: how many requests, to which model, about how many input tokens, how many questions are held back for having a part built at runtime, and how many fall past maxCalls. Needs no key. Call it first when the user wants to know the cost of a check before paying for it.

Input parameters:

- `filename` (string): A file name whose extension says what the text is: .json, .ts, .js, .py, .rs or .go. Defaults to request.jev.json.
- `maxCalls` (integer): The most requests the call may send. Defaults to 25. Requests past it are counted and not sent.
- `model` (string): The model to ask: a Jev version, or gpt-6-luna for OpenAI's Decisions API. Defaults to jev-1.13.0, which the checks were measured on.
- `paths` (array): Files or directories on disk, relative to the directory the server was started in.
- `rules` (object): Rule levels to override, such as { "JEV004": "off" }. Levels: off, hint, info, warning, error.
- `sendState` (boolean): Also send the state written out in the text, to the checks that read it. Defaults to false.
- `text` (string): The request JSON or the source code.

Output parameters:

- `files` (array)
- `totals` (object)

### `check_with_jev` (~424 tokens)

Check with the model

Ask the model itself, TypeSafe's Jev or OpenAI's Luna, to check the questions in the given text or paths after linting them: overlapping options, a question that needs counting, a label that does not match its description, and the other checks list_rules marks runsHere: false. This sends the questions to the vendor with the user's own API key and costs money, so call it only when the user asks for a check with Jev or Luna, never on every edit, and use plan_jev first when the cost matters. The key is read from TYPESAFE_API_KEY or OPENAI_API_KEY in the environment the server was started with, or from .env.local or .env in its working directory, and is never taken as an argument. Returns the lint report with the model's findings added, each with the probability the model gave, what was sent and answered, and why the check fell short when it did. Bounded by maxCalls.

Input parameters:

- `filename` (string): A file name whose extension says what the text is: .json, .ts, .js, .py, .rs or .go. Defaults to request.jev.json.
- `maxCalls` (integer): The most requests the call may send. Defaults to 25. Requests past it are counted and not sent.
- `model` (string): The model to ask: a Jev version, or gpt-6-luna for OpenAI's Decisions API. Defaults to jev-1.13.0, which the checks were measured on.
- `paths` (array): Files or directories on disk, relative to the directory the server was started in.
- `rules` (object): Rule levels to override, such as { "JEV004": "off" }. Levels: off, hint, info, warning, error.
- `sendState` (boolean): Also send the state written out in the text, to the checks that read it. Defaults to false.
- `text` (string): The request JSON or the source code.

Output parameters:

- `files` (array)
- `keySource` (string): Where the API key was found: the environment, .env.local or .env. Never the key.
- `shortfall` (string|null): Why the check covered less than it planned, or null when it covered everything: a failed request, a stop, or questions past maxCalls.
- `totals` (object)

### `probe_question` (~232 tokens)

Probe a question

Send one question to Jev several times, as written and with its layout changed, options reversed, labels hidden, levels reversed, criteria removed, to see whether the answer holds. Returns a report as Markdown with a verdict and which variants moved the decision. The text must carry the state the question is asked against, and when it has more than one question, questionId names the one. Asks Jev only, about a dozen requests, with the user's TypeSafe key found the way check_with_jev finds it. It costs money, so call it only when the user asks to probe a question.

Input parameters:

- `filename` (string): A file name whose extension says what the text is: .json, .ts, .js, .py, .rs or .go. Defaults to request.jev.json.
- `model` (string): A Jev version. Defaults to jev-1.13.0.
- `questionId` (string): The id of the question to probe. Needed when the text has more than one.
- `text` (string, required): The request JSON or the source code.

Output parameters:

- `keySource` (string): Where the API key was found: the environment, .env.local or .env. Never the key.
- `markdown` (string): The full report, as Markdown.
- `model` (string)
- `moved` (array): The variants that changed the decision. Empty when the answer held.
- `questionId` (string)
- `requests` (integer): Requests sent: three as written, then one per layout change.
- `verdict` (string): The one sentence the report opens with.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/nolindnaidoo-jevlint-le/jevlint-le-mcp#diagnostics

## Score history

- 2026-10-16: 69
- 2026-10-15: 70
- 2026-10-14: 49
- 2026-10-13: 49
- 2026-10-12: 49

## Common questions

### What is the JevLint-LE MCP server?

JevLint-LE is an MCP server listed in the public MCP registry as io.github.nolindnaidoo/jevlint-le. Lint questions for TypeSafe's Jev and OpenAI's Luna offline, or ask the model itself with your key. This page covers its npm package (jevlint-le-mcp).

### Is the JevLint-LE MCP server safe to use?

JevLint-LE scores 69 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 16 October 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the JevLint-LE MCP server expose?

JevLint-LE exposes 8 tools: lint_text, lint_paths, fix_text, list_rules, explain_rule, and 3 more. Their descriptions and schemas cost roughly 1,681 tokens of context every time the server is loaded.

### Is the JevLint-LE MCP server still maintained?

JevLint-LE is marked deprecated in the MCP registry. We last reached this channel on 16 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the JevLint-LE MCP server under?

JevLint-LE declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/jevlint-le-mcp
- Socket report: https://socket.dev/npm/package/jevlint-le-mcp
- Website: https://letools.dev/tools/jevlint-le
- Changelog RSS feed: https://verifymcp.io/servers/nolindnaidoo-jevlint-le/jevlint-le-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/nolindnaidoo-jevlint-le/jevlint-le-mcp.json
- HTML version of this page: https://verifymcp.io/servers/nolindnaidoo-jevlint-le/jevlint-le-mcp
