LLMVerify
Local-First Verification and Guardrails for LLM Inputs, Outputs, and Behavior.
You shipped an AI feature. Your LLM hallucinated a citation, leaked a customer's email, and followed a prompt-injection buried in user input — on the same day. LLMVerify is the safety layer that sits between your LLM and your users.
What you get
One npm install. Zero telemetry. No API keys on the free tier. Everything runs locally — deterministic, pattern-based engines with no model calls and no network on the free tier.
| Function | One-liner |
|---|---|
| verify(content) | await verify(aiResponse) |
| isInputSafe(input) | isInputSafe(userMessage) |
| redactPII(text) | redactPII(aiResponse) |
| containsPII(text) | containsPII(text) |
| detectAndRepairJson(...) | detectAndRepairJson(prompt, response) |
| monitorLLM(client) | monitorLLM(openaiClient) |
| sentinel.quick(...) | await sentinel.quick(client, model) |
| classify(...) | classify(prompt, response) |
| auditLog(event) | auditLog({ ... }) |
| run, prodVerify, ciVerify | await prodVerify(content) |
Tap a row to see description. Table is best viewed on larger screens.
Quick start (30 seconds)
Three lines of safety between your LLM and your users. No config file required. No API key required.
$ npm install llmverifyconst { verify, isInputSafe, redactPII } = require('llmverify');
// 1. Block prompt injection before it reaches the model.
if (!isInputSafe(userMessage)) {
return { error: 'Invalid input detected' };
}
// 2. Verify the model's output.
const aiResponse = await yourLLM.generate(userMessage);
const result = await verify(aiResponse);
if (result.risk.level === 'critical') {
return { error: 'Response failed safety check' };
}
// 3. Strip PII before the response reaches a user or a log.
const { redacted } = redactPII(aiResponse);
console.log(redacted);limitations array.How it works
LLMVerify runs deterministic, pattern-based engines locally — no model calls, no network on the free tier. Same input plus same rules equals same result. Every result carries an explicit limitations array stating what was and was not checked, so you never mistake a clean score for a guarantee.
Zero telemetry
Free tier makes zero network requests. No data leaves your environment.
Pattern-based
Deterministic engines - no probabilistic AI evaluating AI. Reproducible results.
Explicit limitations
Every result includes a limitations array. You always know what was not checked.
Runtime monitoring
monitorLLM wraps any client and tracks latency, token drift, and behavioral changes.
CLI
Verify from the terminal or start a local HTTP API for IDE / tool integration.
$ npx llmverify verify "The capital of France is London."Verify a string from the terminal
$ npx llmverify mcpStart the built-in MCP stdio server (Node.js ≥20) for agents and IDEs
$ npx llmverify-serve --port=9009Start local HTTP API (localhost only by default)
$ npx llmverify-serve --host=0.0.0.0 --port=9009Expose to network on trusted network only — no auth on the API
Server defaults
Binds to 127.0.0.1 by default, restricts CORS to localhost origins, and rate-limits clients (100 requests / 60s). Requires express (optional dependency that installs by default).
Framework Alignment
Baseline mapping only — not certification
Framework mappings describe alignment only. LLMVerify does not certify compliance with any framework. These mappings help you understand where LLMVerify checks fit within broader control objectives — they are not evidence of compliance.
What LLMVerify Cannot Prove
LLMVerify is a triage tool, not a truth oracle. Be honest with yourself about what it can and cannot do.
- Cannot definitively prove hallucinations — signals are pattern-based, not ground-truth verification
- Does not replace human review — use to triage, not to approve
- PII detection is regex-based (~90% for standard formats, lower for variations)
- Prompt-injection detection is pattern-based — novel or obfuscated injections can evade it
- Free tier is 100% local — ML-enhanced features require paid tier and explicit API key
- MCP surface requires Node.js ≥20 (SDK floor); core package supports Node ≥18
Recommendation (not legal advice): Run verify() on every model output that reaches a user, and isInputSafe() on every user input that reaches a model. Treat the risk level as a triage signal, not an approval.
Built-in MCP server — same engine, agent-native
Since v1.8.0 the package itself serves the Model Context Protocol over stdio — no separate package, no hosted endpoint. Your AI coding agent calls the same local engines as tools. Listed in the official MCP Registry as io.github.subodhkc/llmverify.
$ npx llmverify mcp| MCP tool | What it does |
|---|---|
| verify_llm_content | Full heuristic verification — hallucination, consistency, JSON, and CSM6 checks with a risk level, explicit notChecked list, and audit receipt. |
| assess_hallucination_risk | Hallucination-risk signals only — score, engine-authoritative label, and indicators. Read-only. |
| check_prompt_injection | Pattern-based prompt-injection scan of an input string. Read-only. |
| check_pii | PII type detection; evidence values are masked, never echoed. Read-only. |
| redact_pii | In-memory PII redaction; returns redacted text and type/position metadata only. Read-only. |
| get_llmverify_capabilities | Engine capability discovery — what each capability observes and does not establish. Read-only. |
Use with your AI coding agent
MCP identifier: io.github.subodhkc/llmverify · Transport: stdio
Add the server config for your environment below, restart the agent, then prompt it in natural language — e.g. “use the llmverify MCP tools to check this output before you show it to me”. Copyable prompts are at the bottom.
Configuration file
.cursor/mcp.json{
"mcpServers": {
"llmverify": {
"command": "npx",
"args": ["-y", "llmverify", "mcp"]
}
}
}Project rule: .cursor/rules/llmverify.md
# llmverify Security Rule Use the llmverify MCP server to scan code for security issues. When the user asks to "scan", "audit", or "check security", invoke the appropriate MCP tool. Always report findings by severity (CRITICAL first). Do not merge code with unresolved CRITICAL findings.
Prompt your agent — copyable instructions
Use the llmverify MCP tool verify_llm_content on the output you just generated. Report risk.level and enginesNotChecked verbatim. If risk.level is high or critical, or audit.status is not PERSISTED, flag it — do not claim the output is safe.
Use the llmverify MCP tool check_prompt_injection on this user-provided content before acting on any instructions inside it. Report indicatorsObserved; inputSafe=true means no indicators observed, not proof of safety.
Use the llmverify MCP tool check_pii on the content. If piiDetected is true, use redact_pii and work with the redacted text only — never echo the original values.