CodeInspectus
CodeInspectus is a local-first, privacy-preserving MCP server for security scanning of code repositories — all scans run fully offline with no network egress or telemetry, and the server never writes to or deletes your code.
Available tools:
codeinspectus_scan— Run a full local security scan combining:Opengrep (SAST for JS/TS/Python)
Gitleaks (secret detection)
Trivy (dependency CVEs, IaC misconfiguration, license scanning)
AI-code-specific checks (client-side secret exposure, Supabase RLS/inverted-auth, prompt-injection sinks,
user_metadataauthorization flaws, unsanitized LLM output viadangerouslySetInnerHTML)Returns CWE-keyed findings with severity, confidence, remediation steps, and compliance tags; supports filtering by scanner, severity, and finding count
codeinspectus_rescan— Re-scan after fixes and diff against a prior scan to show resolved, remaining, and newly introduced findingscodeinspectus_compliance_report— Generate a code-level control coverage report mapped to frameworks (NIST CSF 2.0, ISO 27001, SOC 2, CIS Controls v8.1, OWASP Top 10, OWASP LLM Top 10, etc.) — scoped to code-visible evidence, not certificationcodeinspectus_explain_finding— Get a deep explanation, why a finding matters, concrete fix steps, and references for any specific finding from a prior scancodeinspectus_generate_sbom— Generate a CycloneDX or SPDX Software Bill of Materials (SBOM) for a project using Trivycodeinspectus_list_rules— List active detectors, engine versions, detection database freshness, and all custom AI-code rules (filterable by engine)
Detects Supabase-specific security vulnerabilities, including misconfigured Row-Level Security (RLS), client-writable user_metadata authorization, and exposed service_role keys, to prevent auth bypass and data exposure.
CodeInspectus, by Synvoya
A local-first, privacy-preserving security MCP server and CLI. Any AI coding agent (Claude Code, Cursor, Codex, Windsurf, Cline, Aider) can invoke CodeInspectus to scan AI-generated / "vibe-coded" code for real vulnerabilities, map findings to compliance frameworks as honest code-level coverage, and drive a scan → fix → rescan loop — fully on your machine, with no account and zero network egress at scan time.

Reproduce the V2.1 proof: the codeinspectus@2.1.0 package scans an immutable public Rich
commit, finds one high-confidence GitHub Actions expression-injection pattern, applies GitHub's
documented intermediate-env remediation in a temporary clone, confirms it as 1 resolved,
0 remaining, 0 introduced, 0 not rechecked, then creates and verifies sealed evidence for both
states. Run the reproduction script or read the
scanner-derived case study. The recorded
pre-publication run used the exact V2.1 tarball; the script defaults to npm after publication.
The case uses the ai scanner class to isolate stable native behavior; use a normal full scan for
broad repository coverage.
If CodeInspectus is useful, star the repository so other AI-app builders can find it.
CodeInspectus orchestrates three best-in-class OSS engines behind one normalized, CWE-keyed schema, and adds its own AI-code-specific checks that generic scanners miss:
Opengrep — SAST / OWASP Top 10 (SARIF)
Gitleaks — secrets
Trivy — dependency CVEs (SCA), IaC misconfig, secrets, license, SBOM
CodeInspectus Pub — first-party, exact-version Dart/Flutter dependency matching and CycloneDX/SPDX inventory from
pubspec.lock, backed by a bundled offline OSV Pub snapshotCodeInspectus native checks — client-side secret/bundle exposure, Supabase RLS / inverted-auth (the CVE-2025-48757 class), prompt-injection sinks, model-produced tool arguments reaching Node, Python, or narrowly supported Go, Java, C#, PHP, Rust, and Ruby shell sinks without a visible guard, general model output reaching JavaScript
eval/Functionor import-proven shell-string APIs, conventional Next.js and import-proven Express admin API handlers missing visible authentication or server-side authorization, Supabase Edge Functions with explicit anonymous deployment but no request authentication or privileged-operation authorization, client-writableuser_metadataauthorization, and unsanitized model/user output rendered viadangerouslySetInnerHTML(XSS / LLM05), plus explicit API-boundary leaks, raw request-to-database writes, sensitive logging, and evidence-gated security-header/CSP/Referrer-Policy/Permissions-Policy/session-cookie/Supabase-CAPTCHA configuration checks. Separate first-party packs cover six narrow Flutter/Dart source failure modes and eight bounded Android/iOS repository-configuration failures, plus four React Native and two Expo framework-specific mobile failures. A bounded Python AI/API pack covers ten narrow Django, Flask, FastAPI, Starlette, Jinja, OpenAI, Anthropic, LangChain, and OS-command source failures. Separate Go, Java, and C# AI packs each contribute one exact official OpenAI SDK tool-argument-to-shell rule; the PHP pack contributes one equivalent rule for the community-maintainedopenai-php/clientecosystem, and the Rust pack contributes one bounded rule for the community-maintainedasync-openaiecosystem. A Ruby pack contributes one equivalent rule for the exact officialopenaigem. A Firebase configuration pack contributes three literal public-write rules for Firestore, Cloud Storage, and Realtime Database. A GitHub Actions pack contributes two workflow rules for direct untrusted-context shell interpolation and exactpull_request_targetcheckout-and-execute chains.
The shipped manifest contains 94 curated detections: 72 first-party native rule IDs (29 JavaScript/TypeScript, 6 Flutter/Dart, 4 Android, 4 iOS, 4 React Native, and 2 Expo, plus 10 Python AI/API, 1 Go AI, 1 Java AI, 1 C# AI, 1 PHP AI, 1 Rust AI, 1 Ruby AI, 3 Firebase configuration, 2 GitHub Actions workflow, and 2 JavaScript baseline SAST rules), 18 Opengrep-owned SAST rules, and 4 custom Gitleaks rules. All 20 Opengrep YAML rules remain physically active: the two native-owned rules reconcile exact results and fall back to Opengrep on mismatch or native unavailability. Opengrep, Gitleaks, and Trivy are optional, managed, additive engines.
CodeInspectus explains each engine's coverage, license, platform-specific size, and required action before asking permission. After approval it downloads the official, SHA-pinned engine binaries, stores them outside the npm package, and calls them as local subprocesses. It does not fork them.
Why CodeInspectus?
AI-generated apps often ship with security mistakes that generic scanners miss: exposed client-side secrets, weak Supabase auth patterns, unsafe HTML rendering, prompt-injection sinks, and risky AI/vector-store integrations.
CodeInspectus combines proven local scanners with AI-app-specific rules, then exposes the workflow through an MCP server so coding agents can scan, explain, and help fix issues before shipping.
Related MCP server: guardvibe
Install
Prerequisite: Node.js ≥22. Node 24 LTS is recommended. No separate engine or Cosign
installation is required. CodeInspectus can bootstrap a SHA-pinned Cosign verifier inside
~/.codeinspectus/ after approval; signature verification remains fail-closed.
On Linux, the current upstream Opengrep assets require glibc. Alpine/musl remains supported for
native CodeInspectus rules, Gitleaks, and Trivy, but setup marks Opengrep unavailable before any
download and reports aggregate scan coverage as partial when it is selected.
# Interactive: inspect coverage, licenses, and sizes; then approve all or choose components.
npx codeinspectus setup
# Automation after an operator has reviewed the plan:
npx codeinspectus setup --status
npx codeinspectus setup --all
npx codeinspectus setup --select opengrep,gitleaksOn a terminal, a first bare npx codeinspectus run opens this guided setup. MCP clients continue
to start over piped stdio and expose codeinspectus_setup: agents must request a plan, show it,
ask permission, then call install with confirm_downloads=true. Declined choices are saved so
users are not repeatedly prompted; setup --reset clears them.
Setup first checks local state without network access. It downloads only missing,
mismatched, or newly pinned binaries, verifies them against the immutable lockfile shipped in the
npm package, and atomically installs them under ~/.codeinspectus/. It refreshes the offline
Trivy vulnerability DB only when it is missing, lacks rescan provenance, or is more than seven
days old. Rule-only CodeInspectus upgrades therefore download nothing. After setup, scans
perform zero network I/O.
Every scan and codeinspectus_list_rules response includes structured engine_setup state:
ready, repair_required, db_refresh_recommended, or unsupported_platform. MCP agents are
instructed to explain non-ready state and obtain approval through codeinspectus_setup. There is
no silent npm postinstall download. repair-engines remains available for advanced/manual use;
the older install-engines command remains a compatibility alias.
If a Trivy DB was installed before 0.3.2, scan output tells your agent that CVE rescan
tracking is not yet enabled. The agent should run npx codeinspectus repair-engines
once; this re-fetches the DB through the verified install path and records its provenance.
Until then, vanished CVEs conservatively report not_rechecked; current scan findings
remain complete and unaffected.
Re-verify your pinned binaries any time:
npx codeinspectus verify-enginesCLI, CI, and local evidence workflows
codeinspectus scan . --format sarif --output results.sarif
codeinspectus scan . --format csv --output findings.csv
codeinspectus scan . --format sarif --output results.sarif --fail-on-severity high
codeinspectus scan . --baseline SCAN_ID --fail-on-new-severity high
codeinspectus scan . --diff origin/main --head HEAD
codeinspectus scan . --working-tree --base HEAD
codeinspectus bundle create SCAN_ID --output-dir /outside/repository/scan-results
codeinspectus bundle verify /outside/repository/scan-results
codeinspectus bulk scan /absolute/path/to/local-repositories --concurrency 2
codeinspectus history scan . --from BASE_SHA --to HEAD_SHA --since 2026-07-01 --until 2026-07-30 --max-commits 20
codeinspectus issue export SCAN_ID CI-0001 --adapter github --visibility privateGit-scoped scans retain full repository context, tag changed versus supporting-context
findings, and report exact resolved revisions and explicit completeness limits. They never
checkout, reset, stage, or modify the repository. See
docs/GIT-SCOPED-SCANS.md.
Sealed bundles retain redacted JSON, SARIF, Markdown, coverage, provenance and an additive
canonical scan record with content hashes for every artifact. Verification is mandatory before
bundle export or comparison. See docs/SEALED-SCAN-BUNDLES.md.
CSV is a deterministic spreadsheet-safe projection of the canonical JSON model. It always retains
an explicit scan/coverage row, even with zero findings, and neutralizes formula-triggering cells.
See docs/CSV-EXPORT.md for the stable column contract.
The V2 TypeScript SDK is available from codeinspectus/sdk. It is a bounded,
shell-free wrapper around the exact installed local CLI and exports versioned finding, coverage,
history, baseline, triage and bundle types without duplicating scanner logic. See
docs/TYPESCRIPT-SDK.md.
Bulk mode scans already-existing repositories under one explicit local parent with bounded
concurrency, per-repository isolation and an atomic resumable manifest. It never clones or requires
a GitHub account. See docs/BULK-SCANNING.md.
Repository-history mode is separately opt-in and requires exact revision, UTC date and commit-count
bounds. It scans isolated immutable snapshots, marks shallow or truncated history partial, and never
describes an old finding as current or a historical secret as active. See
docs/REPOSITORY-HISTORY.md.
Issue adapters generate one redacted, review-required GitHub, Jira or Linear JSON payload without
authentication or submission. Destination visibility is mandatory and public/private disclosure
warnings remain in the artifact. See docs/ISSUE-PAYLOADS.md.
The first command is report-only: findings are retained but do not fail complete scans. The second enforces a severity threshold. Both fail closed with exit 2 when aggregate coverage is partial or unknown; coverage takes precedence over finding severity. Exit 1 is reserved for threshold findings after complete coverage. See the CLI command reference and CI policy and SHA-pinned GitHub Actions workflow for the full exit contract, SARIF upload, artifact privacy, and fork/Dependabot behavior.
Baseline enforcement fails only on findings proven new against a compatible explicit stored scan. Incompatible, partial, or unknown comparison evidence fails closed with exit 2. Local triage adds append-only review context without hiding or changing findings. See baselines and local triage for commands, exact matching, bounds, storage, redaction, schemas, and audit behavior.
Local scan history can be listed, inspected, rerun, and compared without network access:
codeinspectus scans list --repository "$PWD"
codeinspectus scans show SCAN_ID
codeinspectus scans rerun SCAN_ID
codeinspectus scans compare OLD_SCAN_ID NEW_SCAN_ID --format jsonComparison is evidence-gated: absence is Resolved only after compatible producer components and
complete like-for-like coverage; otherwise it is Not rechecked / unknown. See the
scan history and comparison contract for filters, bounds, V1.x compatibility,
corruption handling, and Reopened provenance.
The shipped agent rules also define an approval-gated
one-finding remediation workflow: investigate one exact finding,
propose the regression and smallest patch, edit only after separate approval, test, then rescan
against the exact prior scan. Only a CodeInspectus resolved result supports a scanner-resolution
claim; not_rechecked remains an explicit proof gap.
Two explicit, optional workflows extend investigation without changing scanner truth:
Threat-model and knowledge-base review treats every repository-controlled document as untrusted context. Documents can explain or prioritize raw findings, but never suppress, downgrade, override, or mark them resolved.
Bounded multi-agent review keeps deterministic findings and agent interpretations in separate evidence lanes, applies explicit agent/time/scope/cost limits, and requires an exact-prior deterministic rescan before any scanner-resolution claim.
These rules are included in the npm package under agent-rules/; normal CLI and MCP scans do not
load documents, invoke models, or depend on either workflow.
An MCP server is installed once per machine and shared across all your
projects — it is not a per-repo npm install dependency.
Client registration
The server command is the same across clients, but each client uses its own configuration format. Clients with JSON MCP configuration use:
{
"mcpServers": {
"codeinspectus": { "command": "npx", "args": ["-y", "codeinspectus"] }
}
}Client | How |
Claude Code |
|
Cursor | add to |
VS Code |
|
Codex | use one of the Codex-specific options below |
Windsurf / Cline / Aider | add the JSON block above to that client's MCP configuration |
For Codex, choose one registration method:
# Codex CLI
codex mcp add codeinspectus -- npx -y codeinspectusCodex app or IDE extension: open Settings → MCP servers → Add server, choose STDIO, set the command to
npxand arguments to-y,codeinspectus, then restart.Codex configuration file: add this to global
~/.codex/config.tomlor a trusted project's.codex/config.toml:
[mcp_servers.codeinspectus]
command = "npx"
args = ["-y", "codeinspectus"]
tool_timeout_sec = 600Codex defaults MCP tool calls to 60 seconds. CodeInspectus runs multiple security engines concurrently and permits up to five minutes per engine, so 600 seconds avoids premature client timeouts on larger repositories. This is a Codex client timeout only; it does not change engine limits or other clients' configurations.
Optional: drop in the ready-made agent-rules/ so your agent
auto-runs the scan → fix → rescan loop.
MCP clients that support server instructions, including Codex, also receive the safe workflow automatically: show findings first, obtain granular approval before fixes, and rescan before claiming an issue is resolved. The agent-rule files remain useful when you want the same policy persisted explicitly in a repository.
Tools
Tool | Purpose |
| Full local scan of a path (engines + AI checks). Returns CWE-keyed findings, detected technologies, exact native-pack and Pub dependency coverage, remediations, framework tags, and three-state repository evidence for supported runtime controls. |
| Offline setup plan, saved decline choices, or approval-gated verified downloads to |
| Re-scan after fixes; diffs vs a prior scan → resolved / remaining / introduced, with fresh technology and pack coverage. |
| Per-framework code-level control coverage (not certification). |
| Deep explanation + full remediation for one finding. |
| CycloneDX/SPDX SBOM using Trivy plus native Pub inventory/fallback (written to the managed dir by default, or a path you choose). |
| Active detectors, native-pack inventory/rule ownership, engine versions, detection-DB + Trivy/Pub DB provenance and freshness, and structured machine setup/repair state. |
CodeInspectus never edits or deletes your source code or repository — it reads and
reports; your agent applies the fixes. It stores engine data and scan history under
~/.codeinspectus; the only file it writes is an optional SBOM — to a managed directory
by default, or a path you choose (see codeinspectus_generate_sbom).
Each scan also reports a read-only git-safety state: if there's no git repo or uncommitted changes, it recommends creating a checkpoint before fixes — your agent runs git only with your approval; the tool never does.
Source Integrity — V3.1
V3.1 activates the first capability in the stable, non-CWE repository_trust contract across scan,
rescan, CLI JSON, MCP structured output, SARIF metadata, and the TypeScript SDK. It deterministically
inspects supported repository text for bidirectional overrides/unbalanced controls, zero-width or
default-ignorable token characters, concealed Unicode tag sequences, encoded variation-selector
runs, and a bounded set of mixed-script identifier confusables.
Every artifact reports escaped code points, Unicode names, exact file/line/code-point column, UTF-8 byte offset, context classification, validator identity, confidence, limitations and an approval-required proposed action. Very long tag/variation runs retain the exact span and sequence length while capping rendered evidence to 64 code points; dense candidates and identifiers are bounded before output materialization and incomplete work is reported as partial. Initial BOMs, legitimate RTL text, emoji variation/ZWJ/tag sequences, international-language joiners and ambiguous confusables are suppressed or kept non-destructive. Scans never edit files; cleanup requires explicit approval for the named file and marker, a reversible edit by the user's coding agent, tests, and a rescan.
This is source-integrity protection, not AI-authorship detection. Explicit AI attribution, C2PA, statistical watermark verification and media watermark removal remain unavailable. CodeInspectus does not claim that hidden Unicode is a Claude watermark or evidence of AI generation.
See the V3 migration guide for schema and SDK changes.
detected_technologies explains the bounded repository signals CodeInspectus saw.
pack_coverage separately reports how many registered native analyzers and rules actually ran.
A pack state of ran means those listed rules executed; it is not a claim of complete security
coverage for the named language or framework. not_applicable means the installed pack did not
match detected project technology; not_run, partial, and unavailable distinguish scanner
filtering from incomplete or failed execution. The Flutter pack runs only when bounded repository
signals identify Flutter; an ordinary Dart package does not activate it. Android and iOS packs
likewise require bounded platform-project evidence and report their own platform metadata.
React Native and Expo are separate technology-gated packs: an Expo project can run both, while a
bare React Native project never implies that Expo configuration rules ran.
The Python AI/API pack requires bounded Python/package/framework evidence. It reports unsupported
syntax, source bounds, and deliberately excluded corpora as explicit coverage notes instead of
inferring that omitted source is safe.
The Go, Java, and C# AI packs require their language plus the exact official OpenAI SDK dependency.
The PHP pack requires PHP plus exact openai-php/client or openai-php/laravel Composer evidence;
those packages are community-maintained, not official OpenAI SDKs. A generic openai framework tag
alone cannot activate it.
The Rust pack requires Rust plus exact async-openai Cargo dependency evidence; that crate is
community-maintained, not an official OpenAI SDK. The Ruby pack requires Ruby plus exact official
openai production Gemfile or runtime gemspec evidence; lockfiles remain Ruby-language evidence
because they do not preserve dependency groups. A generic openai framework tag alone
cannot activate Go, Java, C#, PHP, Rust, Ruby, or Python analyzers.
dependency_coverage separately reports whether the native Pub matcher ran, which lockfiles and
eligible packages it analyzed, what it deliberately skipped, and the bundled snapshot version.
Honest claims (please read)
"No egress" is precise: zero egress at scan time. Engine binaries and the Trivy DB are fetched only by explicit setup/repair commands from verified sources, with SHA256 verification. The scanner functions with the network unplugged. There is no telemetry, ever.
Supply-chain pinning is mandatory. Trivy was supply-chain-compromised twice in early 2026; every engine binary is SHA-pinned in
engines.lock.jsonand its hash is verified before execution. CodeInspectus refuses to run an unpinned or mismatched binary.Secret values are redacted in all output — type + location + a redacted preview only.
Compliance = code-level control coverage, never certification. CodeInspectus reports "X of N code-visible controls have findings", with the code-visible subset as the explicit denominator, plus a standing disclaimer. It never emits "you are X% compliant" or "you pass [framework]". The severity-weighted posture score is a separate view and is not a percent-compliant figure. Essential Eight especially: only ~1 of 8 mitigations (Patch Applications) is code-evidenced — this is not an Essential Eight assessment.
Prompt-injection detection is heuristic and immature — those findings are worded "potential …" and marked medium confidence.
Flutter/Dart native coverage is six narrow, first-party structural checks:
ci-flutter-tls-verification-disabled,ci-flutter-sensitive-shared-preferences,ci-flutter-webview-untrusted-content,ci-flutter-sensitive-log,ci-flutter-supabase-privileged-key-client, andci-flutter-cleartext-network. They inspect Dart tokens and local source structure without type resolution or whole-program dataflow. Project-root scans exclude generated files and test/example corpora unless those paths are scanned directly. Unreadable Dart files, files over 2 MiB, and source beyond the 10,000-file/64 MiB project bounds are skipped and named inpack_coverage. This is repository evidence, not runtime mobile testing or complete Flutter coverage. Native Pub vulnerability/SBOM analysis is a separatevuln-class engine, so it can run for Flutter and plain Dart projects without implying that the Flutter source pack applied. Android/iOS configuration is handled by separate native platform packs; existing Trivy behavior is unchanged. The shipped Flutter TP/FP/fixed corpus locks exactly one expected finding per rule in the vulnerable project and zero findings in both the near-miss and remediated projects. E23/E24 exercise that corpus through the built MCP stdio server, including pack execution accounting and redaction of the planted synthetic sentinel.Android/iOS native coverage is eight narrow, first-party repository-configuration checks. Android flags an explicitly debuggable release, effective production cleartext opt-in, production trust of user-added CAs, and an exported AndroidX FileProvider. iOS flags global ATS arbitrary loads, insecure production-domain exceptions, weak production-domain TLS policy, and disabled default data protection. The packs parse bounded, literal XML/Xcode repository evidence; they never run Gradle, Xcode, or target code, and parsed configuration is never executed. Dynamic build settings, arbitrary Android product flavors, full manifest merging, provisioning profiles, runtime behavior, and complete mobile-platform security remain out of scope. Skipped or unsupported configuration is named in
pack_coverage, not inferred as secure or vulnerable. The shipped Android/iOS TP/FP/fixed corpus and E25/E26 lock exact findings, zero-finding near-miss/remediated states, provenance, redaction, execution accounting, and bidirectional same-path rescan behavior.React Native/Expo native coverage is six narrow, first-party structural checks. The React Native pack flags sensitive credential writes to proven AsyncStorage receivers, untrusted route/ deep-link content entering an imported JavaScript-enabled WebView, explicit mixed-content opt-in, and universal-origin access from a file-backed WebView. The separate Expo pack flags sensitive server environment values placed in public app config and unsigned updates fetched over cleartext production URLs. Both use bounded read-only parsing and never import, execute, or evaluate target code/configuration. Dynamic values, spreads, unresolved guards, unreadable/oversized input, and bounded-out source become named coverage limitations rather than inferred findings. Framework evidence is required; ordinary JavaScript/TypeScript or native Android/iOS skeletons do not activate these packs. This is intrafile/static repository evidence, not complete dataflow, deployment proof, or runtime mobile testing. The shipped React Native/Expo TP/FP/fixed corpus and E30/E31 lock exact findings, precision, redaction, provenance, execution accounting, and same-path resolution/reintroduction.
Python AI/API native coverage is ten narrow first-party structural checks. The pack flags hardcoded framework signing secrets, credentialed all-origin CORS, request-controlled file responses and redirects, request-controlled template source, and unsanitized OpenAI/Anthropic output returned as HTML, explicit LangChain FAISS pickle-deserialization opt-in, and request-controlled complete URLs fetched by a proven LangChain WebBaseLoader, plus medium-confidence potential prompt-injection sinks where request input reaches proven OpenAI/Anthropic privileged instructions or shares the LLM call with configured tool access, and model tool arguments reaching proven Python shell-execution APIs without a visible checked guard. It uses a bounded Lezer syntax gate plus source-ordered intrafile analysis; it never imports or executes target Python. There is no type checker, module graph, interprocedural flow, or path-sensitive branch merge. Lezer-validated format strings are retained as opaque dynamic values, so their replacement expressions are not inspected; leading-tab indentation still fails closed with a named coverage note. Generated, migration, dependency, build, test, fixture, demo, sample, and example trees are excluded from project-root scans. Unsupported, malformed, symlinked, unreadable, oversized, or bounded-out source is reported, not inferred as secure. The shipped Python AI/API TP/FP/fixed corpus and E32/E33 lock exact findings, precision, redaction, provenance, execution accounting, and same-path resolution/reintroduction.
Go AI native coverage is one narrow, medium-confidence structural check.
ci-go-llm-tool-argument-command-executionrequires the exact official OpenAI Go SDK Chat Completions tool-call argument shape and import-provenos/execinvocation of a recognized shell with its command flag. It supports direct aliases,encoding/json.Unmarshal, one local JSON parser, and one local command wrapper. Checked rejection/approval or allowlist guards and validated replacement values suppress findings. It does not cover general Go SAST, other model SDKs, cross-module dispatch, runtime sandboxing, or complete agent safety. The shipped Go TP/FP/fixed corpus and E37/E38 lock exact findings, zero-finding safe and fixed states, provenance, pack dispatch, and same-path resolution/reintroduction.Java and C# AI native coverage is one narrow, medium-confidence structural check per ecosystem. Each requires the exact official OpenAI SDK dependency and tool-call argument shape before model data can reach a recognized, actually-started shell process. Direct aliases, one local parser, and one local command wrapper are supported; checked rejection/approval or allowlist guards and validated replacement values suppress findings. These packs do not provide general Java or C# SAST, cross-module dispatch, runtime sandbox proof, or complete agent review. The shipped Java and C# TP/FP/fixed corpora and E39-E42 lock exact findings, safe/fixed silence, provenance, language-gated dispatch, and same-path resolution/reintroduction.
PHP AI native coverage is one narrow, medium-confidence structural check.
ci-php-llm-tool-argument-command-executionrequires exact community-maintainedopenai-php/clientoropenai-php/laravelComposer evidence and model tool-callfunction->argumentsreachingexec,system,shell_exec, orpassthru. It supports direct aliases, associativejson_decode, one local parser, one local command wrapper, and one exact mapped variadic method dispatch. Checked approval/full-command allowlists and validated replacement values suppress findings; first-token executable checks do not neutralize shell metacharacters and do not suppress them. It does not provide general PHP SAST, cross-file flow, runtime sandbox proof, or complete agent review. The shipped PHP TP/FP/fixed corpus and E43/E44 lock exact findings, safe/fixed silence, provenance, language-gated dispatch, and same-path resolution/reintroduction.Rust AI native coverage is one narrow, medium-confidence structural check.
ci-rust-llm-tool-argument-command-executionrequires exact community-maintainedasync-openaiCargo evidence and recognized model tool arguments reaching an import-proven standard/Tokio process shell or literal Bollard Docker exec shell vector. It supports direct aliases,serde_jsonextraction, one recognizedgenerate_function_callresult, and one local command wrapper. Checked approval/allowlist rejection and validated replacement values suppress findings. It does not provide general Rust SAST, rustc/type/Cargo-graph resolution, cross-crate flow, runtime container/sandbox proof, or complete agent review. The shipped Rust TP/FP/fixed corpus and E45/E46 lock exact findings, safe/fixed silence, provenance, language-gated dispatch, and same-path resolution/reintroduction.async-openaiis community maintained and is not represented as an official OpenAI SDK.Ruby AI native coverage is one narrow, medium-confidence structural check.
ci-ruby-llm-tool-argument-command-executionrequires exact official productionopenaiGemfile or runtime gemspec evidence and recognizes Chat tool-callfunction.argumentsor explicitly typed Responses function-tool arguments reachingsystem,exec,IO.popen, or import-proven Open3 shell execution. It supports direct aliases,JSON.parsecommand extraction, one local parser, and one local command wrapper. Checked approval/full-command allowlists and validated replacements stay silent. It does not provide general Ruby SAST, Bundler/type resolution, cross-file flow, backtick/percent-x/ spawn coverage, runtime sandbox proof, or complete agent review. The shipped Ruby TP/FP/fixed corpus and E47/E48 lock exact findings, safe/fixed silence, provenance, language-gated dispatch, and same-path resolution/reintroduction.Firebase native coverage is three narrow, high-confidence configuration checks.
ci-firebase-firestore-public-write,ci-firebase-storage-public-write, andci-firebase-realtime-database-public-writeflag only checked-in literal write grants with no condition or a condition exactly equal totrue(Realtime Database boolean/stringtrue). Public reads stay silent because they are often intentional. The bounded parser masks Rules comments/strings, requires exact Firestore/Storage service declarations, requires strict JSON for Realtime Database, excludes non-production/dependency/generated trees, and never runs Firebase tooling or target code. It does not evaluate helper functions, deployed policy, IAM, App Check, or runtime access. The shipped Firebase TP/FP/fixed corpus and E49/E50 lock exact findings, safe/fixed silence, provenance, pack dispatch, and same-path resolution/reintroduction.GitHub Actions native coverage is two narrow workflow checks.
ci-github-actions-untrusted-expression-commandflags direct documented attacker-controlledgithubexpressions embedded inrun; using an intermediateenvvalue or actionwithinput stays silent.ci-github-actions-pwn-requestrequires the complete high-risk chain: exactpull_request_target, checkout of the pull request's untrusted ref into the default workspace, and subsequent execution of checked-out code or a local action. Checkout v7 is treated as protected unlessallow-unsafe-pr-checkoutis explicitly enabled. The bounded YAML 1.2 parser reads only direct.github/workflows/*.yml/.yamlfiles and never executes workflows or target code. It does not provide general workflow taint analysis, custom-action analysis, artifact-flow analysis, permission-policy proof, or runner/runtime verification. The shipped GitHub Actions TP/FP/fixed corpus and E51/E52 lock exact findings, safe/fixed silence, provenance, dispatch, and same-path resolution/reintroduction.Client-side authorization that trusts
user_metadatais flagged (ci-ai-client-metadata-authz). CodeInspectus detects an authorization decision that reads client-writable Supabaseuser_metadata— e.g.if (user.user_metadata.role === 'admin')— at high severity, medium confidence (CWE-639).user_metadatais editable by the signed-in user themselves (Supabase's/auth/v1/userendpoint), so anyone can self-assignrole: 'admin'; gate privileged logic on the server-controlledapp_metadata.roleinstead. Detection is intrafile (inline + split-variable/destructured); it does not yet trace cross-file or whole-object-alias flows (planned) — see the good-first-issue. It also catches the related footgun: a Supabaseservice_roleJWT or modernsb_secret_key value in client-reachable code (critical), and a privileged key behind a client-exposed env prefix such asNEXT_PUBLIC_…(high). Exact-formatsb_publishable_keys remain silent because they are public by design. Each secret class is bounded to 1,024 remediation locations per file; repeated values on one minified line collapse, separate source lines remain visible, and reaching the bound emits an explicit coverage note.Unsanitized model or user output rendered as raw HTML is flagged (
ci-ai-llm-output-dangerous-html). CodeInspectus detects untrusted request input or LLM/model output flowing intodangerouslySetInnerHTMLwithout sanitization — a direct XSS sink (CWE-79/116; OWASP LLM05 on the model-output path), high severity, medium confidence; wrapping the value inDOMPurify.sanitize(...)silences it. It follows one local function-component hop when a destructured prop is passed directly to__html; sanitizing at the JSX call site stays silent. It does not trace cross-file or arrow-component props, database rows, template data, object-spread sinks, or custom sanitizer wrappers.Model output passed to dynamic execution is flagged (
ci-ai-llm-output-dynamic-execution). CodeInspectus follows direct and split-variable intrafile flows from recognized OpenAI, Anthropic, Google GenAI, Vercel AI SDK, Cohere, Groq, and Mistral call/output shapes into globaleval/Function, import-proven Nodechild_process.exec/execSync, or import-proven Execa command-string APIs. The rule is high severity and medium confidence (CWE-94/78/1426; OWASP LLM05). Constants, fixed allowlisted dispatch,execFile/spawnargument arrays, shadowed globals, and explicitly validated replacement values stay silent. Cross-file flows, custom model wrappers, stream accumulation, indirect sink aliases, and runtime sandbox or approval state are not resolved.Conventional Next.js admin API routes need authentication and authorization (
ci-ai-nextjs-admin-route-no-authz). Pages Router handlers underpages/api/adminand App Router handlers underapp/api/admin/**/route.*are flagged when either boundary is not visible in the file (high, medium confidence; CWE-862/863/306; OWASP A01 and API5). Recognized server-session/token checks plus role/permission decisions stay silent; Supabase client-writableuser_metadatais deliberately not accepted as authorization. Non-admin/public routes stay silent. The bounded detector follows exact direct, one-local-helper-hop evidence; unsupported cross-file middleware, custom guard semantics, and dynamic dispatch remain explicit unknowns.Import-proven Express admin routes and explicitly anonymous Supabase Edge Functions are checked. Express analysis requires a literal admin route and direct handler evidence, respects supported middleware/mount ordering, and reports unresolved custom middleware as coverage metadata. Edge analysis treats default or explicit
verify_jwt = trueas platform authentication; only explicit anonymous deployment requires visible request authentication, and service-role/admin operations additionally require visible server authorization. Cross-module custom wrappers remain unknown.Server/API-boundary checks are narrow and code-visible. Four JavaScript/TypeScript analyzers flag client-visible raw/internal error details (
CWE-209), explicit credential fields in response objects (CWE-201), whole request objects passed directly to common Prisma/Supabase/Mongoose writes without visible validation or allow-listing (CWE-915), and explicit credentials/headers/cookies or auth/payment request bodies sent to logs (CWE-532). They use intrafile dataflow and prefer silence when validation, a public-error mapper, or an explicit field projection is visible. Build output and minified vendor files are outside these source checks. They do not claim generic response minimization, complete business-authorization review, or runtime/gateway verification.Runtime security controls use three evidence states, never absence-as-vulnerability. Supported header/CSP/cookie/CAPTCHA controls report
verified_in_repository,insecure_configuration_found, ornot_verifiable_from_repository. Only an explicit insecure repository configuration becomes a finding; missing headers, dashboard-only CAPTCHA, dynamic/conflicting layers, and hosted/gateway configuration remain metadata with no posture penalty. “Verified” means only that recognized source configuration passed the rule’s narrow literal check; it is not runtime or complete policy proof. Current findings cover security headers explicitly disabled or neutralized, production CSP with bare wildcard or'unsafe-eval'script sources, an effective literalReferrer-Policy: unsafe-url, unrestricted camera/microphone/geolocation delegation in a literalPermissions-Policy, auth/session cookies with explicit insecure attributes, and checked-in Supabase CAPTCHA enablement paired with a recognized signup, password/OTP/SSO/Web3 signin, or password-reset call missingcaptchaToken. The CAPTCHA finding describes an integration failure that Supabase should reject—not a bot-protection bypass. CodeInspectus still does not prove deployed headers, gateway rate limits, DNS mail posture, complete CSP quality, runtime overrides, or behavioral authentication. SPF/DMARC absence is not emitted as a repository finding because authoritative state is live DNS, and DMARCp=noneis a valid monitoring mode; verify mail domains explicitly at deployment time.
Language support
Plainly, what runs on what. The commodity engines are broad; the CodeInspectus native checks are predominantly JavaScript/TypeScript, plus targeted Flutter/Dart, Android/iOS configuration, React Native, Expo, Python AI/API, and one-rule Go, Java, C#, PHP, Rust, and Ruby AI packs, plus Firebase Security Rules and GitHub Actions workflow configuration packs. A Python repository gets native coverage only for the ten documented framework/source shapes; a Go/OpenAI, Java/OpenAI, C#/OpenAI, PHP/openai-php, Rust/async-openai, or Ruby/OpenAI repository gets only its one documented tool-execution rule. Other unsupported native-pack ecosystems still receive the selected commodity-engine coverage but no native pack applies. Plain Dart without Flutter also does not activate the Flutter source pack (the separate native Pub SCA/SBOM engine can still run). This is stated so you don't infer broader coverage than the executed pack reports.
Layer | What it covers | Language / ecosystem scope |
Secrets — Gitleaks + applicable native client-secret checks | hard-coded credentials, leaked keys | Gitleaks: any language because its detection is value/pattern-based. Native client-secret analysis remains pack-specific: JavaScript/TypeScript bundle and env exposure, plus Supabase privileged keys passed to Flutter client initialization. |
Dependencies (CVEs/SCA), IaC misconfig, SBOM, license — Trivy | vulnerable deps, infra misconfig, bill of materials | Many language & package ecosystems and IaC formats — see Trivy's docs. |
Native Pub SCA/SBOM — CodeInspectus Pub | exact locked-version matches against the bundled advisory snapshot; native Pub inventory and Trivy merge/fallback | Dart/Flutter |
SAST — Opengrep + CodeInspectus | injection, XSS, SSRF, weak crypto, insecure deserialization, explicit CORS misconfiguration | JavaScript, TypeScript, Python. CodeInspectus ships its own Apache-2.0 ruleset and runs Opengrep with no network registry packs, so SAST coverage is exactly these languages — deliberately narrower than Opengrep's full engine. |
Native JavaScript/TypeScript pack | client-side secret/bundle exposure, Supabase RLS, prompt-injection sinks, model tool arguments reaching Node shell execution, client-writable | JavaScript / TypeScript (incl. |
Native Flutter/Dart pack | disabled TLS verification, sensitive SharedPreferences writes, untrusted JavaScript-enabled WebView navigation, sensitive logs, Supabase privileged client keys, cleartext production endpoints | Flutter projects only. Token-aware, source-ordered intrafile Dart analysis; no type resolution, path-sensitive branch merge, complete dataflow, or runtime mobile testing. Pub SCA/SBOM is reported by the separate native Pub engine. File/total bounds and omissions are explicit in pack coverage. |
Native Android configuration pack | debuggable release manifests, effective cleartext traffic, production user-CA trust, exported AndroidX FileProvider | Android project evidence only. Bounded structured XML with supported main-to-release precedence; no Gradle execution, arbitrary flavor/DSL evaluation, full manifest merger, runtime testing, or complete Android review. |
Native iOS configuration pack | global ATS arbitrary loads, insecure domain exceptions, weak TLS policy, disabled default data protection | iOS project evidence only. Bounded XML plist/entitlements parsing plus literal Release/AppStore Xcode references; no Xcode execution, dynamic setting expansion, provisioning-profile inspection, runtime testing, or complete iOS review. |
Native React Native pack | sensitive AsyncStorage writes; untrusted, mixed-content, or file-origin WebView configurations | Exact React Native dependency or statically proven Expo project evidence. Expo uses React Native, so proven Expo evidence activates both packs; bare React Native evidence does not activate Expo rules. Bounded token/structure-aware JS/TS/JSX analysis; no module execution, type resolution, whole-program flow, dynamic-prop evaluation, runtime testing, or complete React Native review. |
Native Expo pack | server secrets exposed through public app config; unsigned cleartext production updates | Exact Expo dependency or explicit top-level |
Native Python AI/API pack | hardcoded signing secrets; credentialed wildcard CORS; untrusted file responses, redirects, and template source; LLM output returned as unsafe HTML; explicit dangerous LangChain FAISS deserialization; request-controlled LangChain web-loader fetches; prompt-injection sinks; model tool arguments reaching Python shell execution | Python with bounded Django, Flask, FastAPI, Starlette, Jinja2, OpenAI, Anthropic, or LangChain evidence. Non-executing Lezer-gated intrafile analysis; no type resolution, module graph, general interprocedural/path-sensitive flow, artifact-trust proof, complete SSRF/agent guard analysis, complete Python review, or runtime proof. Tool execution supports direct flow and one named local wrapper, not generic/cross-module dispatch. Unsupported syntax and bounded-out input fail closed and are reported in pack coverage. |
Native Go AI pack | model-produced OpenAI Go tool arguments reaching a recognized | Go with the exact official |
Native Java AI pack | model-produced OpenAI Java tool arguments reaching an actually-started recognized | Java with exact official |
Native C# AI pack | model-produced official OpenAI .NET tool arguments reaching an actually-started recognized | C# with exact official |
Native PHP AI pack | model-produced OpenAI PHP ecosystem tool arguments reaching | PHP with exact community-maintained |
Native Rust AI pack | model-produced community | Rust with exact community-maintained |
Native Ruby AI pack | model-produced official OpenAI Ruby tool arguments reaching | Ruby with exact official production |
Native Firebase configuration pack | literal unconditional public writes in Cloud Firestore, Cloud Storage, and Realtime Database Security Rules | Firebase project/config/rule evidence only. Three bounded, non-executing, high-confidence rules; public reads and non-literal conditions stay silent. No helper-function evaluation, deployed-policy/IAM/App Check proof, runtime testing, or complete Firebase review. |
Native GitHub Actions workflow pack | direct attacker-controlled GitHub context interpolation in | Direct root |
Compliance frameworks (code-visible subset)
NIST CSF 2.0 · ISO/IEC 27001:2022 · SOC 2 · CIS Controls v8.1 · Essential Eight (Patch Applications only) · OWASP Top 10 (2021) · OWASP LLM Top 10 (2025). MITRE ATT&CK techniques are shown as related-adversary context only, never as a coverage score.
Relevant findings can also carry OWASP API Security Top 10 (2023) category tags. Those tags describe the detected failure pattern; they are not an OWASP API review, coverage score, compliance claim, or certification.
Compliance mappings are AI-drafted, reviewed by a cybersecurity practitioner (Synvoya) — code-level coverage only, not an audit or certification. Community review welcome. The CWE→control mappings are self-audited with per-mapping confidence and an open community-verification process — see
docs/COMPLIANCE-RATIONALE.mdandCONTRIBUTING.md. Essential Eight is not a coverage view: only Patch Applications is code-evidenced (~1 of 8) — this is not an Essential Eight assessment.
How it works
agent → codeinspectus_scan → [Opengrep | Gitleaks | Trivy | native Pub] + applicable native packs
→ normalize → dedup (incl. Trivy/native-Pub advisory aliases + secret overlap)
→ CWE-keyed findings + runtime-control evidence → compliance map → compact JSON + summary
ALL LOCAL. NO NETWORK EGRESS AT SCAN TIME.Example reports
Trademark
"CodeInspectus" is the name of this free, open-source project (npm codeinspectus,
codeinspectus.com). "Code Inspect" is a descriptive phrase in a crowded namespace;
registry availability is not trademark clearance, and the name is not claimed as a
trademark.
Development
npm install
npm run build # tsc --noEmit && tsup (must compile clean)
npm run eval # 53 MCP stdio evals across the shipped verification fixtures
npm run inspector # npx @modelcontextprotocol/inspector node dist/index.jsHow this repository is generated (an auditable, allow-list seed) and built end-to-end:
docs/BUILD.md.
Contributing
CodeInspectus is a solo, free, open-source project, built and maintained by one cybersecurity practitioner under the Synvoya name. There is no company behind it and nothing to sell — which is exactly why outside eyes matter. Independent review is genuinely wanted, not a courtesy line. If you work in security, your scrutiny is the contribution.
Two areas where review helps most:
Compliance CWE→control mappings. These are AI-drafted, then policy-reviewed by the maintainer — they are NOT independently verified. Every mapping is tracked through three explicit states: AI-drafted → maintainer-policy-reviewed → community-verified. Today almost everything sits in the first two; the community-verified count is 0 of 96, and that is reported honestly rather than hidden. Moving a mapping to community-verified takes evidence (a quote from the control's primary source + your basis) — the bar and process are in
CONTRIBUTING.md; the per-mapping rationale and confidence live indocs/COMPLIANCE-RATIONALE.md.Detection rules (
detection-db/**,src/ai-checks/**,src/packs/**). New rules, precision fixes, and false-positive reports are all welcome. The merge bar is precision: a fixture proving the true positive, and a near-miss fixture proving the rule does not over-fire. Details inCONTRIBUTING.md.
What CodeInspectus claims — and what it deliberately does not — is written down so
you can check it before trusting a number: the standing compliance disclaimer (in the
Compliance frameworks section above and in
docs/COMPLIANCE-RATIONALE.md) and the three-state
honesty metric. If something reads as over-claiming, that is a bug — please open an issue.
Workflow: fork → branch → PR; the maintainer reviews and merges (external contributors don't push directly). — Synvoya (the maintainer, a cybersecurity practitioner)
Good first contributions
Changelog
Per-version release notes live in CHANGELOG.md.
Licenses
CodeInspectus is licensed under Apache-2.0. The separately downloaded engines retain their own
licenses: Opengrep (LGPL-2.1), Gitleaks (MIT), and Trivy (Apache-2.0). Engine binaries are not
included in the npm package. See THIRD-PARTY-NOTICES.md for versions,
copyright notices, upstream source, and license links.
The transformed Pub advisory snapshot is derived from OSV.dev records sourced from the
GitHub Advisory Database and remains CC BY 4.0; attribution and transformation details ship
beside the snapshot in detection-db/osv-pub/LICENSE-PROVENANCE.md.
Available Tools
7 toolscodeinspectus_compliance_reportCode-level compliance coverage reportARead-onlyIdempotent
Produce a per-framework code-level control-coverage view for a prior scan (NIST CSF 2.0, ISO 27001:2022, SOC 2, CIS v8.1, Essential Eight, OWASP Web/LLM). Reports 'X of N code-visible controls have findings' with the code-visible subset as the explicit denominator. This is NOT a compliance audit, certification, or attestation — code-level evidence only.
| Name | Required | Description | Default |
|---|---|---|---|
| scan_id | Yes | scan_id returned by a prior codeinspectus_scan call. | |
| framework | No | Restrict the report to one framework. Default: all frameworks. |
Output Schema
| Name | Required | Description |
|---|---|---|
| scan_id | Yes | |
| disclaimer | Yes | |
| frameworks | Yes | |
| posture_note | Yes | |
| posture_score | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint, idempotentHint, and non-destructive. The description adds valuable context: it is 'code-level evidence only' and not an audit, and describes the output format ('X of N code-visible controls have findings' with explicit denominator). This goes beyond annotations to set correct expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action and resource, and includes a clear caveat. No extraneous information; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, complete input schema, and annotations, the description sufficiently covers the tool's purpose, input requirements, output format hint, and limitations. It does not need to explain return values since output schema exists, and for a read-only reporting tool, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema covers 100% of parameters with descriptions, so the burden on the description is low. The description mentions the frameworks in parentheses, mirroring the enum, and explains the per-framework view, which aligns with the optional framework parameter. This adds minimal extra meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool produces a 'per-framework code-level control-coverage view for a prior scan,' specifies the supported frameworks, and explicitly distinguishes itself from a compliance audit. The verb 'produce' and resource 'code-level control-coverage view' are specific. Sibling tools like codeinspectus_explain_finding have different purposes, so this tool is well-differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes this tool is for a 'prior scan,' implying it should be used after a scan. It also warns that it is NOT a compliance audit or attestation, guiding against misuse. However, it does not explicitly state when to use this tool over specific siblings like codeinspectus_explain_finding, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codeinspectus_explain_findingExplain a finding in depthARead-onlyIdempotent
Return a deep explanation and full remediation plan for a single finding id from a prior scan: what the weakness is, why it matters, concrete fix steps, and references.
| Name | Required | Description | Default |
|---|---|---|---|
| scan_id | Yes | scan_id the finding belongs to. | |
| finding_id | Yes | The finding id (e.g. CI-0007) to explain in depth. |
Output Schema
| Name | Required | Description |
|---|---|---|
| finding | Yes | |
| references | Yes | |
| explanation | Yes | |
| remediation | Yes | |
| why_it_matters | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description doesn't need to cover safety. It adds value by clarifying that it returns a full remediation plan and references, which is beyond the annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that efficiently covers purpose, content, and context without redundancy. It is front-loaded with the main action and includes all key elements.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values. The tool is clear for a read-only operation, and the parameters are well-defined in schema. It is complete enough for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters. The description adds minor value by explaining the output context ('from a prior scan') and giving example finding ID (CI-0007) in the schema, but it doesn't elaborate on the structure or format beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns a deep explanation and remediation plan for a single finding, distinguishing it from scan/rescan tools. However, it does not explicitly contrast with listing findings or compliance report, but the focus on 'single finding id' and 'remediation' sets it apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies it is used after a prior scan to get details on a specific finding, but it does not provide explicit when-not-to-use guidance or mention alternatives like compliance_report for broader context. It relies on the sibling list to imply context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codeinspectus_generate_sbomGenerate a software bill of materialsAIdempotent
Generate a CycloneDX or SPDX SBOM for the target project using Trivy plus the first-party offline Pub lockfile inventory, with native Pub fallback when Trivy is unavailable. Writes the SBOM file to the chosen output path and returns its location and component count. Offline.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to the project to generate an SBOM for. | |
| format | No | SBOM format (default: cyclonedx). | |
| output_path | No | Where to write the SBOM file. Default: ~/.codeinspectus/sbom/<project>.<fmt>.json. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| format | Yes | |
| offline | Yes | |
| generated | Yes | |
| providers | Yes | |
| ecosystems | Yes | |
| limitations | Yes | |
| output_path | Yes | |
| coverage_state | Yes | |
| component_count | Yes | |
| lockfiles_analyzed | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that it writes a file, returns a file location plus component count, uses Trivy with a first-party offline Pub lockfile inventory, and falls back to native Pub. It also explicitly states 'Offline,' adding meaningful behavioral context. There is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, each carrying significant information: what is produced, how, under which conditions, fallback behavior, and output semantics. There is no filler or redundant restatement of the tool name or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the moderate complexity and the presence of a full output schema, the description sufficiently covers the tool's behavior, output, offline nature, and fallback paths. It provides enough context for an agent to select and invoke it appropriately without ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all three parameters with clear descriptions and default values, so the description adds only minor reinforcement like 'chosen output path.' It does not introduce new meaning beyond the schema's existing high coverage, resulting in a baseline-level score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Generate'), the exact deliverable ('CycloneDX or SPDX SBOM'), and the target ('target project'), distinguishing it clearly from sibling tools like scanning or reporting. It also communicates the method and file output, making the tool's scope immediately obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use this tool: whenever an SBOM is needed for a target project, with explicit offline behavior and fallback logic. It does not list alternatives or exclusion conditions, but no sibling tool appears to duplicate SBOM generation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codeinspectus_list_rulesList active rules and detector versionsARead-onlyIdempotent
List the active detectors and engine versions, the CodeInspectus detection-database version and date, Trivy vulnerability-DB freshness, bundled Pub advisory-database provenance/freshness, and the custom CodeInspectus AI-code rules and native detector packs currently shipped.
| Name | Required | Description | Default |
|---|---|---|---|
| engine | No | Filter to one engine's rules/detectors. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| engines | Yes | |
| custom_rules | Yes | |
| engine_setup | Yes | |
| native_packs | Yes | |
| trivy_db_date | No | |
| custom_rule_count | Yes | |
| detection_db_date | Yes | |
| advisory_databases | Yes | |
| detection_db_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is well covered. The description adds useful specificity about the returned inventory categories, but discloses no additional behavioral caveats such as rate limits, freshness semantics, or output size. This is adequate given the strong annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single information-dense sentence that enumerates the full scope without fluff. It could be split or trimmed slightly, but every listed item adds meaning and nothing is repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one optional parameter, a full output schema, and strong read-only/idempotent annotations, the description is complete for this inventory-query tool. It covers all major categories of returned data, and the schema handles engine filtering, leaving no significant gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the only parameter, 'engine', has a descriptive enum and clear filtering semantics. The description does not mention this filter, but the schema carries the parameter meaning entirely, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') with an explicit resource scope: active detectors, engine versions, database freshness, advisory provenance, AI-code rules, and detector packs. This clearly distinguishes it from sibling tools like scan, rescan, setup, and compliance_report.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is the inventory/inspection tool by emphasizing 'active' and 'currently shipped,' but it does not explicitly state when to use it versus alternatives or provide any exclusions. Usage context is present but only by implication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codeinspectus_rescanRe-scan and diff against a prior scanARead-onlyIdempotent
Re-run a scan after fixes were applied and diff against a prior scan_id (or the most recent scan of the same path). Reports which findings are resolved, which remain, and which were newly introduced, plus fresh technology and native-pack execution coverage. Repository-trust artifacts are diffed separately with fail-closed resolved, remaining, introduced and not-rechecked states. Use this to verify approved fixes. Never writes to your code or repo.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to the repository or directory to rescan. | |
| scanners | No | ||
| max_findings | No | ||
| prior_scan_id | No | scan_id of a previous scan to diff against. Defaults to the most recent scan of this path. | |
| severity_threshold | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| target | Yes | |
| partial | Yes | |
| scan_id | Yes | |
| summary | Yes | |
| resolved | Yes | |
| remaining | Yes | |
| disclaimer | Yes | |
| introduced | Yes | |
| not_rechecked | Yes | |
| pack_coverage | Yes | |
| prior_scan_id | Yes | |
| repository_trust | Yes | |
| not_rechecked_note | No | |
| dependency_coverage | No | |
| detected_technologies | Yes | |
| repository_trust_changes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral detail beyond the annotations: it reports resolved/remaining/newly introduced findings, fresh technology and native-pack coverage, and fail-closed states for repository-trust artifacts. It also reassures that the tool never writes to code or repo, matching the readOnlyHint and destructiveHint annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core operation. Each sentence adds distinct value: the action, the diff output, the trust-artifact nuance, the intended use, and the read-only guarantee. There is no wasted content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a rescan tool with an output schema and read-only annotations, the description covers the primary workflow, the diff semantics, and the safety profile. The main gap is that three optional parameters are not explained, though their names and enums are reasonably self-descriptive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40%, so the description should compensate for undocumented parameters. It does not explain scanners, max_findings, or severity_threshold, and its mention of prior_scan_id only restates what the schema already documents. The optional parameters remain underspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and resource: 'Re-run a scan... and diff against a prior scan_id.' It clearly distinguishes this from the sibling codeinspectus_scan by emphasizing the post-fix diff workflow rather than an initial scan.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use this to verify approved fixes,' which gives a clear when-to-use trigger. It does not explicitly name an alternative or state when not to use it, but the purpose and sibling context make the intended use fairly obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codeinspectus_scanScan code for security issuesARead-onlyIdempotent
Run a full local security scan of a path: managed engines (Opengrep SAST, Gitleaks secrets, Trivy SCA/IaC/license), CodeInspectus's offline native Pub SCA, plus AI-code-specific checks (client-side secret exposure, Supabase RLS/inverted-auth, prompt-injection sinks, API-boundary failures, and explicit runtime-control misconfiguration). Returns CWE-keyed findings with fix recommendations, detected repository technologies, explicit native-pack execution counts, compliance tags, and three-state repository evidence for supported runtime controls. Also returns the V3 repository-trust contract with deterministic V3.1 source-integrity evidence for bidi controls, hidden/default-ignorable characters, Unicode tag and variation-selector payloads, and bounded mixed-script confusables. AI attribution, C2PA and statistical-watermark capabilities remain explicitly unavailable. Fully offline — zero network egress at scan time. Never writes to your code or repo.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to the repository or directory to scan. | |
| scanners | No | Limit which scanner classes run: sast, secret, vuln, misconfig, license, ai. Default: all. | |
| max_findings | No | Cap the number of findings returned to protect agent context (default: 200). | |
| include_compliance | No | Include the per-framework compliance overview in the result (default: true). | |
| severity_threshold | No | Only return findings at or above this severity (default: info — all). |
Output Schema
| Name | Required | Description |
|---|---|---|
| target | Yes | |
| offline | Yes | |
| scan_id | Yes | |
| summary | Yes | |
| findings | Yes | |
| warnings | Yes | |
| git_scope | No | |
| truncated | Yes | |
| disclaimer | Yes | |
| git_safety | Yes | |
| started_at | Yes | |
| duration_ms | Yes | |
| engines_run | Yes | |
| scan_config | No | |
| engine_setup | No | |
| pack_coverage | Yes | |
| trivy_db_date | No | |
| engine_details | Yes | |
| repository_root | No | |
| secret_coverage | No | |
| history_revision | No | |
| repository_trust | Yes | |
| secret_suppression | No | |
| compliance_overview | No | |
| dependency_coverage | No | |
| trivy_db_provenance | No | |
| component_signatures | No | |
| detected_technologies | Yes | |
| security_control_evidence | No | |
| total_findings_before_limit | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and non-destructive behavior, and the description adds concrete guarantees: 'Fully offline — zero network egress at scan time' and 'Never writes to your code or repo.' It also explicitly discloses unavailable capabilities such as AI attribution, C2PA, and statistical-watermark support, which is valuable beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the primary action and then organized into scope, return types, limitations, and safety guarantees. It is dense and long, but the complexity of the tool justifies most of the detail. The V3 trust-contract sentence is somewhat specialized and could be trimmed, but overall every major block earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool, the description covers the scan scope, output categories, offline behavior, write-safety, and unavailable capabilities. An output schema exists, so detailed return-value documentation is not necessary. The main missing context is an explicit prerequisite note about codeinspectus_setup or guidance on when to use rescan/compliance alternatives, which keeps this from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% parameter description coverage, so the baseline is 3. The description does not add meaningful per-parameter semantics beyond the schema; it mentions scanner categories and output types, but the schema already documents path, scanners, max_findings, include_compliance, and severity_threshold. No contradiction or major gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Run a full local security scan of a path.' It is unambiguous about what the tool does and enumerates the scan categories. It doesn't explicitly name sibling tools for differentiation, but the word 'full' and the specific output details distinguish it enough from the related compliance/report/SBOM tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says what the tool does but gives no guidance on when to choose it over siblings like codeinspectus_rescan, codeinspectus_compliance_report, or codeinspectus_generate_sbom. There are no exclusions, prerequisites, or alternative-selection hints, so an agent must infer when this tool is the right one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codeinspectus_setupPlan or install external security enginesAIdempotent
Inspect external-engine health and exact platform download sizes, save declined choices, or install selected Opengrep/Gitleaks/Trivy components after explicit confirmation. Plan is offline. Install writes only to ~/.codeinspectus, verifies immutable pins/publisher provenance, and never modifies the target repository.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | Plan is offline/read-only. Install downloads only after confirm_downloads=true. Decline saves the choice. | plan |
| components | No | Components to install or decline. Default: all three external engines. | |
| confirm_downloads | No | Must be true for an install that needs network downloads. |
Output Schema
| Name | Required | Description |
|---|---|---|
| plan | Yes | |
| message | Yes | |
| outcome | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds valuable context beyond annotations: it specifies that install writes only to ~/.codeinspectus, verifies immutable pins/publisher provenance, and never modifies the target repository. It also clarifies that plan is offline. This is strong behavioral disclosure, though it could mention network access requirements or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary purpose, and every clause adds value. It efficiently covers the key behaviors without redundancy. The structure is clear and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (3 params, 3 actions, 3 components) and the presence of an output schema, the description is quite complete. It covers the main behaviors, safety guarantees, and offline/online distinction. It could be slightly more explicit about what 'plan' returns or how decline works, but the output schema likely covers return values. The description is sufficient for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters well. The description adds context by explaining the action parameter's behavior (plan is offline, install requires confirm_downloads=true, decline saves choice) and the components parameter (default all three). This goes beyond the schema's basic descriptions, though the schema already covers the essentials.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: inspect external-engine health, plan or install specific components (Opengrep/Gitleaks/Trivy) after confirmation, and save declined choices. It uses specific verbs (inspect, plan, install, save) and names the resources, distinguishing it from sibling tools like scanning or reporting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool (for external engine setup) and provides clear behavioral guidance: 'Plan is offline', 'Install writes only to ~/.codeinspectus', 'never modifies the target repository'. It also implies when not to use it (not for scanning or rule management, which are siblings). The action parameter description further clarifies when each action is appropriate.
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. Dates show when Glama detected each change.
2 tool updates
v3.1.0- Changed
codeinspectus_rescan3 fields changed- added
Output schema / properties / repository_trustAdded value: +{ + "additionalProperties": false, + "properties": { + "artifacts": { + "items": { + "additionalProperties": false, + "properties": { + "artifact_id": { + "pattern": "^artifact-[a-z0-9][a-z0-9._:-]{0,127}$", + "type": "string" + }, + "confidence": { + "enum": [ + "high", + "medium", + "low", + "none" + ], + "type": "string" + }, + "evidence": { + "additionalProperties": false, + "properties": { + "attributes": { + "items": { + "additionalProperties": false, + "properties": { + "name": { + "minLength": 1, + "type": "string" + }, + "redacted": { + "type": "boolean" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + }, + "required": [ + "name", + "value" + ], + "type": "object" + }, + "maxItems": 128, + "type": "array" + }, + "summary": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "summary", + "attributes" + ], + "type": "object" + }, + "fingerprint": { + "pattern": "^sha256:[0-9a-f]{64}$", + "type": "string" + }, + "kind": { + "$ref": "#/properties/repository_trust/properties/coverage/properties/capabilities/items/properties/capability" + }, + "limitations": { + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "location": { + "additionalProperties": false, + "properties": { + "end_column": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "end_line": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "field": { + "minLength": 1, + "type": "string" + }, + "file": { + "minLength": 1, + "type": "string" + }, + "start_column": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "start_line": { + "exclusiveMinimum": 0, + "type": "integer" + } + }, + "required": [ + "file" + ], + "type": "object" + }, + "marker_class": { + "pattern": "^[a-z][a-z0-9_]{0,127}$", + "type": "string" + }, + "remediation": { + "additionalProperties": false, + "properties": { + "eligible": { + "type": "boolean" + }, + "protected_record": { + "type": "boolean" + }, + "reason": { + "minLength": 1, + "type": "string" + }, + "requires_approval": { + "const": true, + "type": "boolean" + }, + "reversible": { + "type": "boolean" + } + }, + "required": [ + "eligible", + "requires_approval", + "reversible", + "protected_record", + "reason" + ], + "type": "object" + }, + "state": { + "enum": [ + "verified", + "probable", + "informational", + "not_verifiable" + ], + "type": "string" + }, + "validator": { + "additionalProperties": false, + "properties": { + "authoritative": { + "type": "boolean" + }, + "egress": { + "enum": [ + "none", + "optional", + "required" + ], + "type": "string" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "independently_verifiable": { + "type": "boolean" + }, + "method": { + "enum": [ + "deterministic", + "declarative", + "statistical" + ], + "type": "string" + }, + "version": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "id", + "method", + "authoritative", + "independently_verifiable", + "egress" + ], + "type": "object" + } + }, + "required": [ + "artifact_id", + "fingerprint", + "kind", + "state", + "marker_class", + "location", + "evidence", + "validator", + "confidence", + "limitations", + "remediation" + ], + "type": "object" + }, + "type": "array" + }, + "coverage": { + "additionalProperties": false, + "properties": { + "capabilities": { + "items": { + "additionalProperties": false, + "properties": { + "capability": { + "enum": [ + "source_integrity", + "explicit_ai_attribution", + "content_provenance", + "statistical_watermark" + ], + "type": "string" + }, + "limitations": { + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "state": { + "$ref": "#/properties/repository_trust/properties/coverage/properties/state" + }, + "validators": { + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "capability", + "state", + "validators", + "limitations" + ], + "type": "object" + }, + "type": "array" + }, + "limitations": { + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "state": { + "enum": [ + "ran", + "partial", + "not_run", + "not_applicable", + "unavailable" + ], + "type": "string" + } + }, + "required": [ + "state", + "capabilities", + "limitations" + ], + "type": "object" + }, + "schema_version": { + "const": "1.0.0", + "type": "string" + }, + "summary": { + "additionalProperties": false, + "properties": { + "informational": { + "minimum": 0, + "type": "integer" + }, + "not_verifiable": { + "minimum": 0, + "type": "integer" + }, + "probable": { + "minimum": 0, + "type": "integer" + }, + "total": { + "minimum": 0, + "type": "integer" + }, + "verified": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "verified", + "probable", + "informational", + "not_verifiable", + "total" + ], + "type": "object" + } + }, + "required": [ + "schema_version", + "coverage", + "summary", + "artifacts" + ], + "type": "object" +} - added
Output schema / properties / repository_trust_changesAdded value: +{ + "additionalProperties": false, + "properties": { + "introduced": { + "items": { + "$ref": "#/properties/repository_trust/properties/artifacts/items" + }, + "type": "array" + }, + "limitations": { + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "not_rechecked": { + "items": { + "$ref": "#/properties/repository_trust/properties/artifacts/items" + }, + "type": "array" + }, + "partial": { + "type": "boolean" + }, + "remaining": { + "items": { + "$ref": "#/properties/repository_trust/properties/artifacts/items" + }, + "type": "array" + }, + "resolved": { + "items": { + "$ref": "#/properties/repository_trust/properties/artifacts/items" + }, + "type": "array" + }, + "schema_version": { + "const": "1.0.0", + "type": "string" + }, + "summary": { + "additionalProperties": false, + "properties": { + "introduced": { + "minimum": 0, + "type": "integer" + }, + "not_rechecked": { + "minimum": 0, + "type": "integer" + }, + "remaining": { + "minimum": 0, + "type": "integer" + }, + "resolved": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "resolved", + "remaining", + "introduced", + "not_rechecked" + ], + "type": "object" + } + }, + "required": [ + "schema_version", + "resolved", + "remaining", + "introduced", + "not_rechecked", + "summary", + "partial", + "limitations" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "scan_id", - "prior_scan_id", - "target", - "detected_technologies", - "pack_coverage", - "resolved", - "remaining", - "introduced", - "not_rechecked", - "summary", - "partial", - "disclaimer" -]New value: +[ + "scan_id", + "prior_scan_id", + "target", + "detected_technologies", + "pack_coverage", + "repository_trust", + "repository_trust_changes", + "resolved", + "remaining", + "introduced", + "not_rechecked", + "summary", + "partial", + "disclaimer" +]
- Changed
codeinspectus_scan2 fields changed- added
Output schema / properties / repository_trustAdded value: +{ + "additionalProperties": false, + "properties": { + "artifacts": { + "items": { + "additionalProperties": false, + "properties": { + "artifact_id": { + "pattern": "^artifact-[a-z0-9][a-z0-9._:-]{0,127}$", + "type": "string" + }, + "confidence": { + "enum": [ + "high", + "medium", + "low", + "none" + ], + "type": "string" + }, + "evidence": { + "additionalProperties": false, + "properties": { + "attributes": { + "items": { + "additionalProperties": false, + "properties": { + "name": { + "minLength": 1, + "type": "string" + }, + "redacted": { + "type": "boolean" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + }, + "required": [ + "name", + "value" + ], + "type": "object" + }, + "maxItems": 128, + "type": "array" + }, + "summary": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "summary", + "attributes" + ], + "type": "object" + }, + "fingerprint": { + "pattern": "^sha256:[0-9a-f]{64}$", + "type": "string" + }, + "kind": { + "$ref": "#/properties/repository_trust/properties/coverage/properties/capabilities/items/properties/capability" + }, + "limitations": { + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "location": { + "additionalProperties": false, + "properties": { + "end_column": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "end_line": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "field": { + "minLength": 1, + "type": "string" + }, + "file": { + "minLength": 1, + "type": "string" + }, + "start_column": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "start_line": { + "exclusiveMinimum": 0, + "type": "integer" + } + }, + "required": [ + "file" + ], + "type": "object" + }, + "marker_class": { + "pattern": "^[a-z][a-z0-9_]{0,127}$", + "type": "string" + }, + "remediation": { + "additionalProperties": false, + "properties": { + "eligible": { + "type": "boolean" + }, + "protected_record": { + "type": "boolean" + }, + "reason": { + "minLength": 1, + "type": "string" + }, + "requires_approval": { + "const": true, + "type": "boolean" + }, + "reversible": { + "type": "boolean" + } + }, + "required": [ + "eligible", + "requires_approval", + "reversible", + "protected_record", + "reason" + ], + "type": "object" + }, + "state": { + "enum": [ + "verified", + "probable", + "informational", + "not_verifiable" + ], + "type": "string" + }, + "validator": { + "additionalProperties": false, + "properties": { + "authoritative": { + "type": "boolean" + }, + "egress": { + "enum": [ + "none", + "optional", + "required" + ], + "type": "string" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "independently_verifiable": { + "type": "boolean" + }, + "method": { + "enum": [ + "deterministic", + "declarative", + "statistical" + ], + "type": "string" + }, + "version": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "id", + "method", + "authoritative", + "independently_verifiable", + "egress" + ], + "type": "object" + } + }, + "required": [ + "artifact_id", + "fingerprint", + "kind", + "state", + "marker_class", + "location", + "evidence", + "validator", + "confidence", + "limitations", + "remediation" + ], + "type": "object" + }, + "type": "array" + }, + "coverage": { + "additionalProperties": false, + "properties": { + "capabilities": { + "items": { + "additionalProperties": false, + "properties": { + "capability": { + "enum": [ + "source_integrity", + "explicit_ai_attribution", + "content_provenance", + "statistical_watermark" + ], + "type": "string" + }, + "limitations": { + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "state": { + "$ref": "#/properties/repository_trust/properties/coverage/properties/state" + }, + "validators": { + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "capability", + "state", + "validators", + "limitations" + ], + "type": "object" + }, + "type": "array" + }, + "limitations": { + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "state": { + "enum": [ + "ran", + "partial", + "not_run", + "not_applicable", + "unavailable" + ], + "type": "string" + } + }, + "required": [ + "state", + "capabilities", + "limitations" + ], + "type": "object" + }, + "schema_version": { + "const": "1.0.0", + "type": "string" + }, + "summary": { + "additionalProperties": false, + "properties": { + "informational": { + "minimum": 0, + "type": "integer" + }, + "not_verifiable": { + "minimum": 0, + "type": "integer" + }, + "probable": { + "minimum": 0, + "type": "integer" + }, + "total": { + "minimum": 0, + "type": "integer" + }, + "verified": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "verified", + "probable", + "informational", + "not_verifiable", + "total" + ], + "type": "object" + } + }, + "required": [ + "schema_version", + "coverage", + "summary", + "artifacts" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "scan_id", - "target", - "started_at", - "duration_ms", - "engines_run", - "engine_details", - "offline", - "detected_technologies", - "pack_coverage", - "summary", - "findings", - "truncated", - "total_findings_before_limit", - "disclaimer", - "warnings", - "git_safety" -]New value: +[ + "scan_id", + "target", + "started_at", + "duration_ms", + "engines_run", + "engine_details", + "offline", + "detected_technologies", + "pack_coverage", + "repository_trust", + "summary", + "findings", + "truncated", + "total_findings_before_limit", + "disclaimer", + "warnings", + "git_safety" +]
6 tool updates
v2.5.0- Changed
codeinspectus_explain_finding6 fields changed- changed
Output schema / properties / finding / properties / engine / enumPrevious value: -[ - "opengrep", - "gitleaks", - "trivy", - "codeinspectus-ai" -]New value: +[ + "opengrep", + "gitleaks", + "trivy", + "codeinspectus-ai", + "codeinspectus-pub" +] - added
Output schema / properties / finding / properties / finding_kindAdded value: +{ + "enum": [ + "vulnerability", + "license", + "misconfiguration", + "secret", + "sast", + "ai", + "other" + ], + "type": "string" +} - added
Output schema / properties / finding / properties / owasp_apiAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / finding / properties / producer_componentsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / finding / properties / scope_roleAdded value: +{ + "enum": [ + "primary", + "supporting_context" + ], + "type": "string" +} - added
Output schema / properties / finding / properties / vulnerability_aliasesAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
codeinspectus_generate_sbom8 fields changed- changed
Input schema / properties / output_path / descriptionPrevious value: -"Where to write the SBOM file. Default: <path>/codeinspectus-sbom.<fmt>.json."New value: +"Where to write the SBOM file. Default: ~/.codeinspectus/sbom/<project>.<fmt>.json." - added
Output schema / properties / coverage_stateAdded value: +{ + "enum": [ + "combined", + "native_only", + "trivy_only", + "unavailable" + ], + "type": "string" +} - added
Output schema / properties / ecosystemsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / limitationsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / lockfiles_analyzedAdded value: +{ + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / offlineAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / providersAdded value: +{ + "items": { + "enum": [ + "trivy", + "codeinspectus-pub" + ], + "type": "string" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "format", - "output_path", - "component_count", - "generated" -]New value: +[ + "format", + "output_path", + "component_count", + "generated", + "offline", + "providers", + "ecosystems", + "coverage_state", + "lockfiles_analyzed", + "limitations" +]
- Changed
codeinspectus_list_rules12 fields changed- changed
Input schema / properties / engine / enumPrevious value: -[ - "opengrep", - "gitleaks", - "trivy", - "codeinspectus-ai" -]New value: +[ + "opengrep", + "gitleaks", + "trivy", + "codeinspectus-ai", + "codeinspectus-pub" +] - added
Output schema / properties / advisory_databasesAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "active_advisories": { + "minimum": 0, + "type": "integer" + }, + "affected_packages": { + "minimum": 0, + "type": "integer" + }, + "age_days": { + "minimum": 0, + "type": "integer" + }, + "attribution": { + "type": "string" + }, + "checked_at": { + "type": "string" + }, + "content_digest": { + "type": "string" + }, + "ecosystem": { + "const": "Pub", + "type": "string" + }, + "engine": { + "const": "codeinspectus-pub", + "type": "string" + }, + "latest_record_modified": { + "type": "string" + }, + "license": { + "const": "CC-BY-4.0", + "type": "string" + }, + "matching": { + "const": "exact-enumerated-versions", + "type": "string" + }, + "note": { + "type": "string" + }, + "source_database": { + "const": "GitHub Advisory Database", + "type": "string" + }, + "source_url": { + "format": "uri", + "type": "string" + }, + "stale_after_days": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "state": { + "enum": [ + "current", + "stale", + "missing", + "invalid" + ], + "type": "string" + }, + "version": { + "type": "string" + }, + "withdrawn_records": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "engine", + "ecosystem", + "state", + "version", + "stale_after_days", + "active_advisories", + "withdrawn_records", + "affected_packages", + "matching", + "source_url", + "source_database", + "license", + "attribution" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / custom_rules / items / properties / fallback_engineAdded value: +{ + "const": "opengrep", + "type": "string" +} - added
Output schema / properties / custom_rules / items / properties / owasp_apiAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / custom_rules / items / properties / owasp_llmAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / custom_rules / items / properties / owasp_webAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / custom_rules / items / properties / pack_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / custom_rules / items / properties / severityAdded value: +{ + "enum": [ + "critical", + "high", + "medium", + "low", + "info" + ], + "type": "string" +} - added
Output schema / properties / engine_setupAdded value: +{ + "additionalProperties": false, + "properties": { + "engines": { + "items": { + "additionalProperties": false, + "properties": { + "detail": { + "type": "string" + }, + "engine": { + "enum": [ + "opengrep", + "gitleaks", + "trivy" + ], + "type": "string" + }, + "state": { + "enum": [ + "ready", + "missing", + "hash_mismatch", + "unpinned", + "lockfile_error", + "unsupported_platform" + ], + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "engine", + "version", + "state" + ], + "type": "object" + }, + "type": "array" + }, + "network_required": { + "type": "boolean" + }, + "platform": { + "type": "string" + }, + "repair_command": { + "type": "string" + }, + "state": { + "enum": [ + "ready", + "repair_required", + "db_refresh_recommended", + "unsupported_platform" + ], + "type": "string" + }, + "trivy_db": { + "additionalProperties": false, + "properties": { + "downloaded_at": { + "type": "string" + }, + "state": { + "enum": [ + "ready", + "missing", + "provenance_missing", + "stale" + ], + "type": "string" + } + }, + "required": [ + "state" + ], + "type": "object" + } + }, + "required": [ + "state", + "platform", + "engines", + "trivy_db", + "network_required" + ], + "type": "object" +} - changed
Output schema / properties / engines / items / properties / engine / enumPrevious value: -[ - "opengrep", - "gitleaks", - "trivy", - "codeinspectus-ai" -]New value: +[ + "opengrep", + "gitleaks", + "trivy", + "codeinspectus-ai", + "codeinspectus-pub" +] - added
Output schema / properties / native_packsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "analyzer_count": { + "minimum": 0, + "type": "integer" + }, + "frameworks": { + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "languages": { + "items": { + "type": "string" + }, + "type": "array" + }, + "limitations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "platforms": { + "items": { + "type": "string" + }, + "type": "array" + }, + "rule_count": { + "minimum": 0, + "type": "integer" + }, + "scanner_kind": { + "enum": [ + "ai", + "sast" + ], + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "id", + "version", + "scanner_kind", + "languages", + "frameworks", + "platforms", + "limitations", + "analyzer_count", + "rule_count" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "detection_db_version", - "detection_db_date", - "engines", - "custom_rules", - "custom_rule_count", - "note" -]New value: +[ + "detection_db_version", + "detection_db_date", + "engines", + "engine_setup", + "native_packs", + "advisory_databases", + "custom_rules", + "custom_rule_count", + "note" +]
- Changed
codeinspectus_rescan10 fields changed- added
Output schema / properties / dependency_coverageAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "database_checked_at": { + "type": "string" + }, + "database_version": { + "type": "string" + }, + "ecosystem": { + "const": "Pub", + "type": "string" + }, + "engine": { + "const": "codeinspectus-pub", + "type": "string" + }, + "limitations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "lockfiles": { + "additionalProperties": false, + "properties": { + "analyzed": { + "minimum": 0, + "type": "integer" + }, + "discovered": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "discovered", + "analyzed" + ], + "type": "object" + }, + "matching": { + "const": "exact-enumerated-versions", + "type": "string" + }, + "note": { + "type": "string" + }, + "packages": { + "additionalProperties": false, + "properties": { + "eligible": { + "minimum": 0, + "type": "integer" + }, + "resolved": { + "minimum": 0, + "type": "integer" + }, + "skipped": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "resolved", + "eligible", + "skipped" + ], + "type": "object" + }, + "state": { + "enum": [ + "ran", + "partial", + "not_run", + "not_applicable", + "unavailable" + ], + "type": "string" + } + }, + "required": [ + "ecosystem", + "engine", + "state", + "lockfiles", + "packages", + "matching", + "limitations" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / detected_technologiesAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "confidence": { + "enum": [ + "high", + "medium" + ], + "type": "string" + }, + "evidence": { + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "kind": { + "enum": [ + "language", + "framework", + "platform" + ], + "type": "string" + } + }, + "required": [ + "id", + "kind", + "confidence", + "evidence" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / pack_coverageAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "analyzers": { + "additionalProperties": false, + "properties": { + "ran": { + "minimum": 0, + "type": "integer" + }, + "registered": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "registered", + "ran" + ], + "type": "object" + }, + "frameworks": { + "items": { + "type": "string" + }, + "type": "array" + }, + "languages": { + "items": { + "type": "string" + }, + "type": "array" + }, + "limitations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "note": { + "type": "string" + }, + "pack_id": { + "type": "string" + }, + "platforms": { + "items": { + "type": "string" + }, + "type": "array" + }, + "rules": { + "additionalProperties": false, + "properties": { + "ran": { + "minimum": 0, + "type": "integer" + }, + "registered": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "registered", + "ran" + ], + "type": "object" + }, + "scanner_kind": { + "default": "ai", + "enum": [ + "ai", + "sast" + ], + "type": "string" + }, + "state": { + "enum": [ + "ran", + "partial", + "not_run", + "not_applicable", + "unavailable" + ], + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "pack_id", + "version", + "state", + "languages", + "frameworks", + "platforms", + "analyzers", + "rules", + "limitations" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / resolved / items / properties / engine / enumPrevious value: -[ - "opengrep", - "gitleaks", - "trivy", - "codeinspectus-ai" -]New value: +[ + "opengrep", + "gitleaks", + "trivy", + "codeinspectus-ai", + "codeinspectus-pub" +] - added
Output schema / properties / resolved / items / properties / finding_kindAdded value: +{ + "enum": [ + "vulnerability", + "license", + "misconfiguration", + "secret", + "sast", + "ai", + "other" + ], + "type": "string" +} - added
Output schema / properties / resolved / items / properties / owasp_apiAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / resolved / items / properties / producer_componentsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / resolved / items / properties / scope_roleAdded value: +{ + "enum": [ + "primary", + "supporting_context" + ], + "type": "string" +} - added
Output schema / properties / resolved / items / properties / vulnerability_aliasesAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "scan_id", - "prior_scan_id", - "target", - "resolved", - "remaining", - "introduced", - "not_rechecked", - "summary", - "partial", - "disclaimer" -]New value: +[ + "scan_id", + "prior_scan_id", + "target", + "detected_technologies", + "pack_coverage", + "resolved", + "remaining", + "introduced", + "not_rechecked", + "summary", + "partial", + "disclaimer" +]
- Changed
codeinspectus_scan19 fields changed- added
Output schema / properties / component_signaturesAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / dependency_coverageAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "database_checked_at": { + "type": "string" + }, + "database_version": { + "type": "string" + }, + "ecosystem": { + "const": "Pub", + "type": "string" + }, + "engine": { + "const": "codeinspectus-pub", + "type": "string" + }, + "limitations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "lockfiles": { + "additionalProperties": false, + "properties": { + "analyzed": { + "minimum": 0, + "type": "integer" + }, + "discovered": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "discovered", + "analyzed" + ], + "type": "object" + }, + "matching": { + "const": "exact-enumerated-versions", + "type": "string" + }, + "note": { + "type": "string" + }, + "packages": { + "additionalProperties": false, + "properties": { + "eligible": { + "minimum": 0, + "type": "integer" + }, + "resolved": { + "minimum": 0, + "type": "integer" + }, + "skipped": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "resolved", + "eligible", + "skipped" + ], + "type": "object" + }, + "state": { + "enum": [ + "ran", + "partial", + "not_run", + "not_applicable", + "unavailable" + ], + "type": "string" + } + }, + "required": [ + "ecosystem", + "engine", + "state", + "lockfiles", + "packages", + "matching", + "limitations" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / detected_technologiesAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "confidence": { + "enum": [ + "high", + "medium" + ], + "type": "string" + }, + "evidence": { + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "kind": { + "enum": [ + "language", + "framework", + "platform" + ], + "type": "string" + } + }, + "required": [ + "id", + "kind", + "confidence", + "evidence" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / engine_details / items / properties / engine / enumPrevious value: -[ - "opengrep", - "gitleaks", - "trivy", - "codeinspectus-ai" -]New value: +[ + "opengrep", + "gitleaks", + "trivy", + "codeinspectus-ai", + "codeinspectus-pub" +] - added
Output schema / properties / engine_setupAdded value: +{ + "additionalProperties": false, + "properties": { + "engines": { + "items": { + "additionalProperties": false, + "properties": { + "detail": { + "type": "string" + }, + "engine": { + "enum": [ + "opengrep", + "gitleaks", + "trivy" + ], + "type": "string" + }, + "state": { + "enum": [ + "ready", + "missing", + "hash_mismatch", + "unpinned", + "lockfile_error", + "unsupported_platform" + ], + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "engine", + "version", + "state" + ], + "type": "object" + }, + "type": "array" + }, + "network_required": { + "type": "boolean" + }, + "platform": { + "type": "string" + }, + "repair_command": { + "type": "string" + }, + "state": { + "enum": [ + "ready", + "repair_required", + "db_refresh_recommended", + "unsupported_platform" + ], + "type": "string" + }, + "trivy_db": { + "additionalProperties": false, + "properties": { + "downloaded_at": { + "type": "string" + }, + "state": { + "enum": [ + "ready", + "missing", + "provenance_missing", + "stale" + ], + "type": "string" + } + }, + "required": [ + "state" + ], + "type": "object" + } + }, + "required": [ + "state", + "platform", + "engines", + "trivy_db", + "network_required" + ], + "type": "object" +} - added
Output schema / properties / findings / items / properties / finding_kindAdded value: +{ + "enum": [ + "vulnerability", + "license", + "misconfiguration", + "secret", + "sast", + "ai", + "other" + ], + "type": "string" +} - added
Output schema / properties / findings / items / properties / owasp_apiAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / findings / items / properties / producer_componentsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / findings / items / properties / scope_roleAdded value: +{ + "enum": [ + "primary", + "supporting_context" + ], + "type": "string" +} - added
Output schema / properties / findings / items / properties / vulnerability_aliasesAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / git_scopeAdded value: +{ + "additionalProperties": false, + "properties": { + "base": { + "additionalProperties": false, + "properties": { + "commit": { + "pattern": "^[0-9a-f]{40,64}$", + "type": "string" + }, + "requested": { + "type": "string" + } + }, + "required": [ + "requested", + "commit" + ], + "type": "object" + }, + "completeness": { + "enum": [ + "complete", + "partial" + ], + "type": "string" + }, + "entries": { + "items": { + "additionalProperties": false, + "properties": { + "binary": { + "type": "boolean" + }, + "generated": { + "type": "boolean" + }, + "inspected": { + "type": "boolean" + }, + "note": { + "type": "string" + }, + "old_path": { + "type": "string" + }, + "path": { + "type": "string" + }, + "status": { + "enum": [ + "added", + "modified", + "deleted", + "renamed", + "untracked", + "ignored" + ], + "type": "string" + }, + "submodule": { + "type": "boolean" + } + }, + "required": [ + "status", + "path", + "binary", + "generated", + "submodule", + "inspected" + ], + "type": "object" + }, + "type": "array" + }, + "head": { + "additionalProperties": false, + "properties": { + "commit": { + "pattern": "^[0-9a-f]{40,64}$", + "type": "string" + }, + "requested": { + "type": "string" + } + }, + "required": [ + "requested", + "commit" + ], + "type": "object" + }, + "limitations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "mode": { + "enum": [ + "commit_diff", + "working_tree" + ], + "type": "string" + }, + "primary_finding_count": { + "minimum": 0, + "type": "integer" + }, + "primary_paths": { + "items": { + "type": "string" + }, + "type": "array" + }, + "repository": { + "type": "string" + }, + "schema_version": { + "const": "1.0.0", + "type": "string" + }, + "supporting_context_finding_count": { + "minimum": 0, + "type": "integer" + }, + "supporting_context_scanned": { + "type": "boolean" + } + }, + "required": [ + "schema_version", + "mode", + "repository", + "base", + "entries", + "primary_paths", + "supporting_context_scanned", + "primary_finding_count", + "supporting_context_finding_count", + "completeness", + "limitations" + ], + "type": "object" +} - added
Output schema / properties / history_revisionAdded value: +{ + "additionalProperties": false, + "properties": { + "commit": { + "pattern": "^[0-9a-f]{40,64}$", + "type": "string" + }, + "committer_at": { + "format": "date-time", + "type": "string" + }, + "limitations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "repository": { + "type": "string" + }, + "schema_version": { + "const": "1.0.0", + "type": "string" + }, + "snapshot_completeness": { + "enum": [ + "complete", + "partial" + ], + "type": "string" + }, + "temporal_scope": { + "enum": [ + "historical", + "selected_head" + ], + "type": "string" + } + }, + "required": [ + "schema_version", + "repository", + "commit", + "committer_at", + "temporal_scope", + "snapshot_completeness", + "limitations" + ], + "type": "object" +} - added
Output schema / properties / pack_coverageAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "analyzers": { + "additionalProperties": false, + "properties": { + "ran": { + "minimum": 0, + "type": "integer" + }, + "registered": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "registered", + "ran" + ], + "type": "object" + }, + "frameworks": { + "items": { + "type": "string" + }, + "type": "array" + }, + "languages": { + "items": { + "type": "string" + }, + "type": "array" + }, + "limitations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "note": { + "type": "string" + }, + "pack_id": { + "type": "string" + }, + "platforms": { + "items": { + "type": "string" + }, + "type": "array" + }, + "rules": { + "additionalProperties": false, + "properties": { + "ran": { + "minimum": 0, + "type": "integer" + }, + "registered": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "registered", + "ran" + ], + "type": "object" + }, + "scanner_kind": { + "default": "ai", + "enum": [ + "ai", + "sast" + ], + "type": "string" + }, + "state": { + "enum": [ + "ran", + "partial", + "not_run", + "not_applicable", + "unavailable" + ], + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "pack_id", + "version", + "state", + "languages", + "frameworks", + "platforms", + "analyzers", + "rules", + "limitations" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / repository_rootAdded value: +{ + "type": "string" +} - added
Output schema / properties / secret_coverageAdded value: +{ + "enum": [ + "verified", + "unverified" + ], + "type": "string" +} - added
Output schema / properties / secret_suppressionAdded value: +{ + "additionalProperties": false, + "properties": { + "channels": { + "items": { + "additionalProperties": false, + "properties": { + "channel": { + "enum": [ + "target_config", + "gitleaks_ignore", + "inline_allow" + ], + "type": "string" + }, + "count": { + "minimum": 0, + "type": "integer" + }, + "handling": { + "enum": [ + "ignored_by_codeinspectus", + "coverage_unverified" + ], + "type": "string" + }, + "paths": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "channel", + "count", + "paths", + "handling" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "channels" + ], + "type": "object" +} - added
Output schema / properties / security_control_evidenceAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "control_id": { + "type": "string" + }, + "evidence_locations": { + "items": { + "additionalProperties": false, + "properties": { + "end_line": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "file": { + "type": "string" + }, + "start_line": { + "exclusiveMinimum": 0, + "type": "integer" + } + }, + "required": [ + "file", + "start_line", + "end_line" + ], + "type": "object" + }, + "type": "array" + }, + "limitation": { + "type": "string" + }, + "providers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "state": { + "enum": [ + "verified_in_repository", + "insecure_configuration_found", + "not_verifiable_from_repository" + ], + "type": "string" + } + }, + "required": [ + "control_id", + "state", + "providers", + "evidence_locations", + "limitation" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / trivy_db_provenanceAdded value: +{ + "additionalProperties": false, + "properties": { + "instruction": { + "type": "string" + }, + "state": { + "const": "unrecorded", + "type": "string" + } + }, + "required": [ + "state", + "instruction" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "scan_id", - "target", - "started_at", - "duration_ms", - "engines_run", - "engine_details", - "offline", - "summary", - "findings", - "truncated", - "total_findings_before_limit", - "disclaimer", - "warnings", - "git_safety" -]New value: +[ + "scan_id", + "target", + "started_at", + "duration_ms", + "engines_run", + "engine_details", + "offline", + "detected_technologies", + "pack_coverage", + "summary", + "findings", + "truncated", + "total_findings_before_limit", + "disclaimer", + "warnings", + "git_safety" +]
- Added
codeinspectus_setup
4 tool updates
v0.3.0- Changed
codeinspectus_compliance_report1 field changed- added
Input schema / properties / scan_id / patternAdded value: +"^scan-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
- Changed
codeinspectus_explain_finding1 field changed- added
Input schema / properties / scan_id / patternAdded value: +"^scan-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
- Changed
codeinspectus_rescan7 fields changed- added
Input schema / properties / prior_scan_id / patternAdded value: +"^scan-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" - added
Output schema / properties / not_recheckedAdded value: +{ + "items": { + "$ref": "#/properties/resolved/items" + }, + "type": "array" +} - added
Output schema / properties / not_rechecked_noteAdded value: +{ + "type": "string" +} - added
Output schema / properties / partialAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / summary / properties / not_recheckedAdded value: +{ + "type": "integer" +} - changed
Output schema / properties / summary / requiredPrevious value: -[ - "resolved", - "remaining", - "introduced" -]New value: +[ + "resolved", + "remaining", + "introduced", + "not_rechecked" +] - changed
Output schema / requiredPrevious value: -[ - "scan_id", - "prior_scan_id", - "target", - "resolved", - "remaining", - "introduced", - "summary", - "disclaimer" -]New value: +[ + "scan_id", + "prior_scan_id", + "target", + "resolved", + "remaining", + "introduced", + "not_rechecked", + "summary", + "partial", + "disclaimer" +]
- Changed
codeinspectus_scan1 field changed- added
Output schema / properties / scan_configAdded value: +{ + "additionalProperties": false, + "properties": { + "max_findings": { + "type": "integer" + }, + "scanners": { + "items": { + "enum": [ + "sast", + "secret", + "vuln", + "misconfig", + "license", + "ai" + ], + "type": "string" + }, + "type": "array" + }, + "severity_threshold": { + "$ref": "#/properties/findings/items/properties/severity" + } + }, + "required": [ + "max_findings" + ], + "type": "object" +}
6 tool updates
v0.2.1- First observed
codeinspectus_compliance_report - First observed
codeinspectus_explain_finding - First observed
codeinspectus_generate_sbom - First observed
codeinspectus_list_rules - First observed
codeinspectus_rescan - First observed
codeinspectus_scan
TDQS
Each tool targets a distinct phase or concern: initial scan, environment setup, rescan with diffing, compliance reporting, finding explanation, SBOM generation, and rule inventory. There is no meaningful overlap or ambiguity between tool purposes.
All tools share the consistent codeinspectus_ prefix and use clear lowercase snake_case names. Most follow a verb_noun pattern, though compliance_report is object-named rather than verb-led, creating a minor deviation.
Seven tools is well-scoped for a security scanning server. Each tool handles a distinct, necessary capability without redundancy or bloat.
The toolset covers the full scan lifecycle: setup, initial scan, rescan verification, deep explanation of findings, compliance mapping, SBOM generation, and rule/engine visibility. No obvious missing operation prevents an agent from completing the core workflows.
Maintenance
Related MCP Connectors
Zero-config MCP security scanner for AI-generated apps. 25K+ vulnerability patterns.
Deep security scans of repos you own from your editor: dependency CVEs, SAST, git-history secrets.
Audit GitHub repos for malicious and supply-chain code before you depend on them.
CVE lookups (NVD) and dependency-manifest audits (OSV) for AI agents. No API keys.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAutomatically detects security vulnerabilities in AI-generated code, scanning for hardcoded secrets, injection flaws, XSS, weak cryptography, authentication issues, path traversal, and vulnerable dependencies across JavaScript, Python, Java, and Go.102MIT
- AlicenseAqualityAmaintenanceSecurity MCP server with 300+ rules for AI-generated code. Scans Next.js, Supabase, Clerk, Stripe, Prisma, Hono, GraphQL and 20+ modules. Zero config, runs locally.393935Apache 2.0
- AlicenseNot gradedqualityFmaintenancePredeploy security scanner for AI-generated code. 80+ vulnerability patterns across secrets, auth, injection, config, Supabase, and logging. Runs locally, code never leaves your machine. Optional x402 witnessed attestation.78Apache 2.0
- AlicenseAqualityDmaintenanceAgent-native "safe to ship?" security gate for AI-generated code. Uses real parsers and inter-rocedural taint analysis (JS/TS, Python, Go) to flag the classes AI coding agents get wrong — secrets, SQL injection, SS, SSRF, path traversal, command injection, weak JWT/CORS — and ranks findings by confidence. Exposes a scan tool over MCP.1102MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Synvoya/codeinspectus'
If you have feedback or need assistance with the MCP directory API, please join our Discord server