Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

DecisionLint: Jev/Luna Lint

NPM · DECISIONLINT-MCP

Lint Jev and Luna decision-model questions, or ask the model to check them with your key.

Available components

+3 this week 80 Trust /100

Last scanned (7 hours ago)

Scores higher than 70% of npm servers

Category Developer Tools

Trust breakdown (7 categories)

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. How we score → Why this is hard to score →

Supply Chain Security100
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • No production dependencies, so there is no dependency health to assess. View diagnostics → Pass
Provenance & Transparency97
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to nolindnaidoo/decisionlint). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 0 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability61
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 2140 tokens (~267/item across 8 items; 8 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management33
  • Stability observed for 10 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 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. See how to fix → Fail
  • An AI judge read all 9 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities60
  • Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28. See how to fix → Fail
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 25 Oct 26 +16
    • Malware scan: unverified → pass ▲ security
  • 24 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
    • Package version: 1.0.1 → 1.1.0 functional
  • 22 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

  • 20 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

  • 18 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

  • 16 Oct 26 +1
    • Tool safety: pass → unverified ▼ security
    • Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet. security
    • Capabilities: fail → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • Stability: unverified → 0.03 ▲ functional
    • First check of Schema quality: unverified functional
    • Package version: 1.0.0 → 1.0.1 functional
  • 15 Oct 26 75

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 25 Oct 2026 · Analysed npm/decisionlint-mcp@1.1.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo nolindnaidoo/decisionlint
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/nolindnaidoo/decisionlint/.github/workflows/release.yml@refs/heads/main
Rekor log index 3442966581
Predicate type SLSA build provenance https://slsa.dev/provenance/v1
Subject digest sha512:5acbe6481eb31faa59efcb3a5d6d5593034c96d11ae00d15a8db518007b0b022e602049f7d507342cab14dae9bcf52f2a943975148d65358639acf29f

Background: How many MCP packages publish verified provenance →

Dependencies 0 packages
Packages resolved 0
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 8 exposed · ~1,987 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
ask_model ~616

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_ask first when the cost matters. The key is read from the platform's own variable, TYPESAFE_API_KEY, OPENAI_API_KEY, OPENROUTER_API_KEY, AI_GATEWAY_API_KEY, LLM_GATEWAY_API_KEY or LIQUID_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. Where the requests go is the platform the model id's spelling names, or DECISIONLINT_ASK_ENDPOINT in that environment for a host the user runs, never an argument either. 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.

NameTypeReqDescription
filenamestring–A file name whose extension says what the text is: .json, .ts, .js, .py, .rs or .go. Defaults to request.jev.json.
maxCallsinteger–The most requests the call may send. Defaults to 25. Requests past it are counted and not sent.
modelstring–The model to ask: a Jev version, gpt-6-luna for OpenAI's Decisions API, or a model id in another platform's spelling, such as ~typesafe/jev-latest for OpenRouter. It is sent to the platform the spell…
pathsarray–Files or directories on disk, relative to the directory the server was started in.
platformstring–Where to send, named outright: typesafe for Jev, openai for Luna, or openrouter, vercel, llmgateway or liquid. Each has its own key variable and a default model. Without it the model id goes where it…
rulesobject–Rule levels to override, such as { "DEC004": "off" }. Levels: off, hint, info, warning, error.
sendStateboolean–Also send the state written out in the text, to the checks that read it. Defaults to false.
textstring–The request JSON or the source code.
NameTypeReqDescription
filesarrayyes–
keySourcestringyesWhere the API key was found: the environment, .env.local or .env. Never the key.
shortfallstring|nullyesWhy the check covered less than it planned, or null when it covered everything: a failed request, a stop, or questions past maxCalls.
totalsobjectyes–

No examples provided.

explain_rule ~83

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.

NameTypeReqDescription
codestringyesThe rule, such as DEC004.
NameTypeReqDescription
codestringyes–
defaultstringyesThe level the rule runs at unless a setting changes it.
docsstringyesThe vendor page behind the rule.
markdownstringyesThe rule's page, as Markdown.
meaningstringyesWhat the rule catches, in one sentence.
namestringyes–
pagestringyesThe rule's own page.
runsHerebooleanyesFalse for a rule that asks the model itself, which only ask_model runs.

No examples provided.

fix_text ~229

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.

NameTypeReqDescription
filenamestring–A file name whose extension says what the text is: .json, .ts, .js, .py, .rs or .go. Defaults to request.jev.json.
rulesobject–Rule levels to override, such as { "DEC004": "off" }. Levels: off, hint, info, warning, error.
textstringyesThe request JSON or the source code.
NameTypeReqDescription
filesarrayyes–
fixedintegeryesFindings mended.
textstringyesThe text with the safe fixes applied.
totalsobjectyes–

No examples provided.

lint_paths ~114

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.

NameTypeReqDescription
pathsarrayyesFiles or directories on disk, relative to the directory the server was started in.
rulesobject–Rule levels to override, such as { "DEC004": "off" }. Levels: off, hint, info, warning, error.
NameTypeReqDescription
filesarrayyes–
totalsobjectyes–

No examples provided.

lint_text ~236

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.

NameTypeReqDescription
filenamestring–A file name whose extension says what the text is: .json, .ts, .js, .py, .rs or .go. Defaults to request.jev.json.
rulesobject–Rule levels to override, such as { "DEC004": "off" }. Levels: off, hint, info, warning, error.
textstringyesThe request JSON or the source code.
NameTypeReqDescription
filesarrayyes–
totalsobjectyes–

No examples provided.

list_rules ~52

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 ask_model asks the model.

Input schema present but exposes no named parameters.

NameTypeReqDescription
rulesarrayyes–

No examples provided.

plan_ask ~427

Say what ask_model 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.

NameTypeReqDescription
filenamestring–A file name whose extension says what the text is: .json, .ts, .js, .py, .rs or .go. Defaults to request.jev.json.
maxCallsinteger–The most requests the call may send. Defaults to 25. Requests past it are counted and not sent.
modelstring–The model to ask: a Jev version, gpt-6-luna for OpenAI's Decisions API, or a model id in another platform's spelling, such as ~typesafe/jev-latest for OpenRouter. It is sent to the platform the spell…
pathsarray–Files or directories on disk, relative to the directory the server was started in.
platformstring–Where to send, named outright: typesafe for Jev, openai for Luna, or openrouter, vercel, llmgateway or liquid. Each has its own key variable and a default model. Without it the model id goes where it…
rulesobject–Rule levels to override, such as { "DEC004": "off" }. Levels: off, hint, info, warning, error.
sendStateboolean–Also send the state written out in the text, to the checks that read it. Defaults to false.
textstring–The request JSON or the source code.
NameTypeReqDescription
filesarrayyes–
totalsobjectyes–

No examples provided.

probe_question ~230

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 ask_model finds it. It costs money, so call it only when the user asks to probe a question.

NameTypeReqDescription
filenamestring–A file name whose extension says what the text is: .json, .ts, .js, .py, .rs or .go. Defaults to request.jev.json.
modelstring–A Jev version. Defaults to jev-1.13.0.
questionIdstring–The id of the question to probe. Needed when the text has more than one.
textstringyesThe request JSON or the source code.
NameTypeReqDescription
keySourcestringyesWhere the API key was found: the environment, .env.local or .env. Never the key.
markdownstringyesThe full report, as Markdown.
modelstringyes–
movedarrayyesThe variants that changed the decision. Empty when the answer held.
questionIdstringyes–
requestsintegeryesRequests sent: three as written, then one per layout change.
verdictstringyesThe one sentence the report opens with.

No examples provided.

Install

How do I install the DecisionLint: Jev/Luna Lint MCP server?

DecisionLint: Jev/Luna Lint runs locally as an npm package, launched with npx -y decisionlint-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · decisionlint-mcp

# add to Claude Code
claude mcp add nolindnaidoo-decisionlint -- npx -y decisionlint-mcp
Common questions

What is the DecisionLint: Jev/Luna Lint MCP server?

DecisionLint: Jev/Luna Lint is an MCP server listed in the public MCP registry as io.github.nolindnaidoo/decisionlint. Lint Jev and Luna decision-model questions, or ask the model to check them with your key. This page covers its npm package (decisionlint-mcp).

Is the DecisionLint: Jev/Luna Lint MCP server safe to use?

DecisionLint: Jev/Luna Lint scores 80 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 25 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 DecisionLint: Jev/Luna Lint MCP server expose?

DecisionLint: Jev/Luna Lint exposes 8 tools: lint_text, lint_paths, fix_text, list_rules, explain_rule, and 3 more. Their descriptions and schemas cost roughly 1,987 tokens of context every time the server is loaded.

Is the DecisionLint: Jev/Luna Lint MCP server still maintained?

DecisionLint: Jev/Luna Lint is still listed as active in the MCP registry. We last reached this channel on 25 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 DecisionLint: Jev/Luna Lint MCP server under?

DecisionLint: Jev/Luna Lint declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.