sphior-code-mcp
SPHIOR CODE
Deterministic security scanning for source code — hard-coded secrets, insecure patterns mapped to CWE, and data-flow (taint) analysis — in your terminal, CI, VS Code, JetBrains IDEs and AI coding assistants. It runs entirely on your machine.
No AI in detection. No source upload. No telemetry. No account. The same code always produces the same findings.
Contents
Agent skills — Claude Code, Codex, Cursor, GitHub Copilot, claude.ai
Related MCP server: opzyai
Try it in 10 seconds
No install, no account, no config. Requires Node.js 18+.
npx @sphior/scan run .In a terminal you get a table sorted by severity:
critical app.js:4 Stripe Live Secret Key (CWE-798)
critical app.js:6 SQL injection (untrusted input → query) (CWE-89)
critical app.js:9 Command injection (untrusted input → shell) (CWE-78)
high app.js:12 XSS (untrusted input → HTML sink) (CWE-79)
high util.py:3 Unsafe pickle deserialization (CWE-502)
high util.py:5 TLS verification disabled (verify=False) (CWE-295)
medium util.py:2 Weak hash algorithm (CWE-327)
SPHIOR CODE: 9 findings (critical=3 high=5 medium=1 low=0) 3 files scanned engine=0.1.0 ruleset=2026.10.23-24Piped, the same command prints SARIF instead, so npx @sphior/scan run . | jq works.
Then hand the findings to the AI assistant you already use:
claude mcp add sphior-code -- npx -y sphior-code-mcpand ask it: "Scan this project and fix the critical issues."
Where you can use it
One detection engine, several ways in. Everything in this table runs locally and needs no account.
Surface | Package | What you get |
Command line | Scan a directory. Table, SARIF, JSON or AI fix context. Fails the build by severity. | |
CI |
| SARIF for GitHub code scanning and most CI dashboards. |
VS Code (and Cursor, Windsurf, VSCodium) | Findings as you type. A quick fix that hands the finding to your AI. | |
JetBrains IDEs | The same in IntelliJ IDEA, PyCharm, WebStorm, GoLand, Rider, PhpStorm, RubyMine, CLion and others. | |
AI coding assistants | An MCP server. Your assistant scans the workspace and receives the location and the remediation for each finding. | |
Agent skills | Four skills — fix, triage, set up CI, pre-release gate — for Claude Code, Codex, Cursor, GitHub Copilot and claude.ai. | |
Claude Code | The MCP server and all four skills in one install. | |
Cursor | The same plugin for Cursor's agent: the MCP server and all four skills. |
What it detects
Ruleset 2026.10.23-24, the version shipped in @sphior/scan 0.1.7 and later, sphior-code-mcp 1.1.9 and later, and the VS Code extension 0.1.3 and later.
1. Hard-coded secrets — 36 rules
Provider-specific signatures plus one generic high-entropy rule.
Providers | AWS · Anthropic · OpenAI · GitHub · GitLab · Google · Stripe (live and test) · Slack · Twilio · SendGrid · Mailchimp · Shopify · Square · DigitalOcean · Discord · Databricks · Linear · Postman · HashiCorp Vault · Grafana · Sentry · npm · PyPI · Doppler · Terraform Cloud · New Relic · SonarQube · Figma · Telegram · JWT · PEM private keys |
Generic rule | A quoted value of 16+ characters assigned to a name such as |
Noise control | Published documentation examples, placeholders ( |
What is kept | Never the value. A masked preview ( |
Mapping | CWE-798 · OWASP A07:2021 |
Secrets are searched in every text file, not only source files. .env*, .github/ and
*.example files are deliberately scanned, because real keys end up there.
2. Insecure code patterns — 84 rules
Rules for constructs that are dangerous on their own, each mapped to a CWE and an OWASP Top 10 (2021) category.
Language | Rules | Language | Rules |
Python | 19 | Ruby | 6 |
Java | 12 | Go | 5 |
JavaScript / TypeScript | 12 | C# | 4 |
PHP | 8 | Kotlin | 4 |
C / C++ | 3 | Rust | 3 |
SQL | 3 | Swift | 3 |
Scala | 2 |
Covered weaknesses include OS command injection (CWE-78), SQL injection (CWE-89), code injection
and eval (CWE-94/95), XSS sinks (CWE-79), path traversal (CWE-22), SSRF (CWE-918), unsafe
deserialization (CWE-502), disabled TLS verification (CWE-295), weak hashes and ciphers (CWE-327),
insecure randomness (CWE-330), cookies without Secure (CWE-614), XXE (CWE-611), LDAP / XPath /
NoSQL injection (CWE-90 / 643 / 943), file inclusion (CWE-98), open redirect (CWE-601), header
injection (CWE-113), prototype pollution (CWE-1321), format strings (CWE-134) and buffer overflows
(CWE-120).
3. Data-flow (taint) analysis — 69 rules across 13 languages
Tracks untrusted input from where it enters to where it is used, so
db.query("… " + req.query.id) is reported as SQL injection, not as a generic string
concatenation. Flows are followed through local variables and across functions in the same
file, including calls more than one level deep.
Language | Parser | Sinks |
JavaScript / TypeScript | Babel AST | command · code ( |
Python | tree-sitter | code · command · SQL · SSRF · template injection · XSS · deserialization · NoSQL · XXE · XPath · LDAP · path traversal |
PHP | tree-sitter | command · code · SQL · file inclusion · path traversal · XSS |
Ruby | tree-sitter | command · code · SQL · SSRF · path traversal · XSS |
C# | tree-sitter | command · SQL · SSRF · path traversal · XSS |
Go · Java · Kotlin · Scala | tree-sitter | command · SQL · SSRF · path traversal |
C · C++ | tree-sitter | command · path traversal · format string · buffer overflow |
Rust · Swift | tree-sitter | command · path traversal · SSRF |
Typical sources: req.query / req.body / req.params / req.headers / req.cookies,
location.*, document.cookie, URLSearchParams.get and FormData.get in JavaScript;
request.args / request.form / request.GET in Python; $_GET / $_POST in PHP; params in
Ruby; getParameter in Java; FormValue / URL.Query() in Go; argv / getenv in C.
Taint findings are reported with confidence likely. A pattern rule and a taint rule can fire on
the same line; the AI fix context groups them into one place to fix.
Languages and parsing
Languages | |
Parsed with a real grammar | JavaScript, TypeScript, JSX, TSX ( |
Pattern rules only | SQL files |
Grammars are bundled as WebAssembly, so nothing is downloaded at run time. If a file cannot be parsed, the scan falls back to the pattern rules for that file instead of skipping it.
Detection is regression-gated against a fixed corpus: a rule change that loses a detection, or that starts firing on a known-safe variant, fails the build rather than shipping.
What a finding looks like
--json out.json writes an array of findings. Keys are sorted and the order is stable
(path → line → column → kind → rule), so two runs on the same code produce byte-identical files.
{
"rule_id": "secret.stripe.live",
"kind": "sast_secret",
"title": "Stripe Live Secret Key",
"severity": "critical",
"confidence": "confirmed",
"cwe": "CWE-798",
"owasp": "A07:2021",
"provider": "Stripe",
"masked": "sk_…Pq",
"location": { "path": "app.js", "start_line": 4, "start_col": 21, "end_line": 4, "end_col": 73 },
"message": "Stripe secret detected in source. Rotate it and move to a secrets manager / environment variable.",
"remediation": "Revoke/rotate the exposed credential immediately, remove it from source (and Git history), and load it from a secrets manager or environment variable at runtime.",
"references": ["https://cwe.mitre.org/data/definitions/798.html"],
"fingerprint": "4b8f19ea…6e89",
"snippet_hash": "fab5c9c9…96c7",
"schema_version": 1
}Field | Values |
|
|
|
|
|
|
| SHA-256. Stable across runs and machines, used to track the same finding over time. |
Command line
npx @sphior/scan run <dir> [options]
# or install it
npm install -g @sphior/scan
sphior-scan run <dir> [options]Option | What it does |
| Write SARIF 2.1.0. Accepted by GitHub code scanning and most CI dashboards. |
| Write the findings as JSON. |
| Write one entry per place to fix, with remediation steps and instructions for an AI agent. Source code is not included. |
| Write the findings you accepted through |
| Exit 1 if any finding is at or above |
| Ignore |
Options accept --option value and --option=value; --fail-on is case-insensitive. From 0.1.8 a
mistyped option or threshold stops the run with exit 2 and says why, so a typo in CI can never
quietly turn the gate off.
Output. With none of --sarif, --json or --fix-context, results go to standard output:
a table when it is a terminal, SARIF when it is piped or redirected. A one-line summary with the
engine and ruleset versions is always written to standard error.
Exit codes.
Code | Meaning |
| Scan completed, and nothing reached the |
| At least one finding at or above |
| Nothing was scanned: the directory does not exist, or an option is unknown or has an invalid value. Never reported as a clean result. |
A directory with no scannable files is reported as such, with a warning, instead of as "0 findings".
What is read. Text files up to 512 KB. Files with a NUL byte in the first 8 KB are treated as
binary and skipped. Build output and fetched dependencies are skipped by directory name:
node_modules, dist, build, out, coverage, .next, .nuxt, .svelte-kit, .vercel,
.venv, venv, __pycache__, target, .gradle, vendor, Pods, .terraform, .git and
similar. .gitignore is not read.
CI and GitHub code scanning
# .github/workflows/sphior-code.yml
name: SPHIOR CODE
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
permissions:
contents: read
security-events: write # only needed for the upload step
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npx -y @sphior/scan@0.1.8 run . --sarif sphior.sarif --fail-on high
- uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: sphior.sarifPin the version (
@sphior/scan@0.1.8) so a ruleset update never changes results without a commit on your side.Each SARIF rule carries
security-severity(9.5 / 8.0 / 5.5 / 3.0 / 1.0 for critical → info) and CWE / OWASP tags, and each result asphiorFingerprint, so GitHub ranks alerts and tracks them across commits.Accepted findings are not written to SARIF, because GitHub code scanning ignores SARIF suppressions and would show them as open alerts. Use
--suppressedto keep that record.Uploading SARIF to a private repository requires GitHub Advanced Security. Without it, keep the
--fail-onstep and drop the upload.
Any other CI works the same way: run the command, read the exit code, archive the SARIF or JSON.
Excluding paths and accepting findings
Two different things, kept apart on purpose:
Exclude — do not read the file at all (generated code, vendored code). No findings are produced; the summary reports how many files were excluded.
Accept — the file is scanned and the finding is produced, then recorded as accepted with a reason (test vectors, fixtures, a deliberate fixed input). Accepted findings move out of the results and into
--suppressed.
.sphiorignore
Put it at the root of the scanned directory. One entry per line:
<glob> [rule_id] [# reason].
# exclude: no rule id
generated/**
third_party/
# accept one rule (or a family, with a trailing *) in a path, with a reason
test/fixtures/** secret.* # fake keys used by the test suite
docs/examples.py pattern.py.weak_hash # shown as a bad example on purpose**matches across directories,*and?within one. A glob without wildcards also matches everything below it.Lines it cannot interpret are reported as warnings, never silently dropped.
Inline comments
Works with any line-comment syntax (//, #, --, ;). The marker must end the line, apart
from an optional : reason.
eval(template); // sphior-ignore: input is a constant from build time
// sphior-ignore-next-line secret.private_key: header string used in documentation
const header = "-----BEGIN RSA PRIVATE KEY-----";A rule id is optional (without one, every finding on that line is accepted). Accepting without a reason is allowed, but the CLI counts and reports those so they can be reviewed.
VS Code
Install SPHIOR CODE from the Visual Studio Marketplace or Open VSX (for Cursor, Windsurf, VSCodium). Requires VS Code 1.85 or later. Node.js does not need to be installed separately.
Findings appear in the editor and the Problems panel as you open and edit a file, with the source
SPHIOR, the rule id as the code, and a link to the CWE.Severity maps to the editor's levels: critical and high → Error, medium → Warning, low → Information.
Each finding offers a quick fix, SPHIOR: Fix "…" with your AI. It copies a ready-to-paste prompt (finding, location, why it matters, remediation steps) to the clipboard and writes it to the SPHIOR CODE output channel.
Because the diagnostic message already contains the remediation, the "Fix with AI" action in Copilot or Cursor works on it directly.
Setting:
sphior.enable(defaulttrue). Reload the window after changing it.
The extension analyses the files you open. To scan the whole repository, use the
command line or the MCP server.
AI-AUTOFIX.md has rules you can give Cursor, Copilot or
Claude Code so they fix SPHIOR findings without being asked.
JetBrains IDEs
Install SPHIOR CODE from the JetBrains Marketplace. It works in every JetBrains IDE from 2024.2, because files are matched by name rather than through a language plugin.
Requires Node.js. The plugin looks for
nodeinSPHIOR_NODE_PATH, then onPATH, then in common install locations (Homebrew,/usr/local/bin, nvm, fnm, Volta,Program Files\nodejs). If none is found, it shows a notification with a download link.Requires LSP4IJ. The Marketplace installs it automatically.
Findings appear in the editor with the same messages, severities and quick fix as in VS Code.
AI coding assistants (MCP)
sphior-code-mcp is a Model Context Protocol server. It lets the assistant you already use —
Claude Code, Cursor, GitHub Copilot, Windsurf, Cline, Continue, Zed, JetBrains AI Assistant —
scan your workspace and fix what it finds. SPHIOR finds; your assistant writes the fix.
Set it up
# Claude Code
claude mcp add sphior-code -- npx -y sphior-code-mcp// Cursor (~/.cursor/mcp.json), Windsurf, Cline, Claude Desktop and others
{
"mcpServers": {
"sphior-code": { "command": "npx", "args": ["-y", "sphior-code-mcp"] }
}
}// GitHub Copilot in VS Code (.vscode/mcp.json)
{
"servers": {
"sphior-code": { "type": "stdio", "command": "npx", "args": ["-y", "sphior-code-mcp"] }
}
}It is also listed in the MCP Registry as io.github.Toraastrta/sphior-code-mcp.
What the assistant can do with no account
Tool | What it does |
| Scans the workspace (or |
| Reports the mode, the version and which tools need an account. |
Each entry in get_fix_context contains:
location— file and line. The code itself is not included; the assistant opens the file in your workspace.whyandremediation_steps— deterministic guidance, written per finding.also— other findings on the same line, so one edit clears all of them.masked_preview,cwe,owasp,references.agent_instructions— tells the assistant not to dismiss the finding, never to print or commit a secret value, and that a human reviews the change before merge.
Environment variables
Variable | Default | Purpose |
| the directory the client started in | Directory to scan |
|
| Scan or request timeout in ms (1000–300000) |
| off | Verbose logs to standard error |
| — | Optional. Connects to your SPHIOR account (below). |
|
| Override the account API endpoint |
With a SPHIOR account
Setting SPHIOR_API_KEY (create one under Settings → API at
sphior.com/app) adds tools that read the repositories you
connected on GitHub:
Tool | What it does |
| Open or resolved findings, filtered by severity, up to 100 at a time |
| One finding in full |
| Open findings by severity, last scan, repositories monitored |
| Mark a finding as fixed, with a reason |
| Mark a finding as a false positive, with a reason |
| Verify the scan-record chain of a repository, optionally with a downloadable evidence pack |
Keys start with sk_live_; any other value stops the server at start-up with the reason, rather
than failing later. Without a key these tools return a message explaining what they need, rather
than failing silently. The local scan never contacts SPHIOR's servers in either mode.
Agent skills
Four skills teach a coding agent how to work with SPHIOR CODE — not just how to run it, but what
to do with the result. They use the open SKILL.md format, so the same files work in Claude
Code, Codex, Cursor, GitHub Copilot and claude.ai. They live in
plugin/skills/.
Skill | Starts when you say | What the agent does |
"scan this project", "fix the security issues", "any hard-coded keys?" | Scans, opens each location, applies the remediation (one edit for everything in | |
"these are false positives", "this is test data", "too many findings" | Reads each finding in context and sorts it into real / test data / false positive / not our code. Fixes the real ones; records the others in the narrowest form, always with a rule id and a reason; re-scans to prove nothing else disappeared; gives you a table to review | |
"add security scanning to CI", "block merges with secrets" | Measures the current state, agrees a | |
"is this ready to ship?", "check before release" | Runs one scan against fixed criteria — no exposed secrets, no open critical or high — and reports Ready or Not ready with the evidence and the versions used |
What every skill is told: never make a finding disappear without fixing it or recording a reason, never print or commit a secret, never present a clean scan as more than it is, and leave the final decision to a human before merge.
The skills get findings from the MCP server when it is installed, otherwise from the command line. Neither needs an account.
Claude Code
This repository is a Claude Code plugin marketplace. One install adds the MCP server (pinned to
sphior-code-mcp@1.1.12, so it does not change under you) and all four skills:
/plugin marketplace add Toraastrta/sphior-code
/plugin install sphior-code@sphiorCursor
This repository is also a Cursor plugin. It adds the same MCP server (pinned to
sphior-code-mcp@1.1.12) and all four skills to Cursor's agent. To install it from a clone:
git clone --depth 1 https://github.com/Toraastrta/sphior-code.git ~/.sphior-code
mkdir -p ~/.cursor/plugins/local
ln -s ~/.sphior-code/plugin ~/.cursor/plugins/local/sphior-codeThen run Developer: Reload Window. The skills appear under the plugin, and Cursor asks you to
approve the MCP server plugin-sphior-code-sphior-code the first time it starts. Neither needs an
account. To update, run git -C ~/.sphior-code pull and reload.
If you only want the skills, copy them as described in the next section.
Codex, Cursor, GitHub Copilot
Copy the skill folders into the directory your agent reads:
Agent | In one repository | For all your projects |
Codex |
|
|
Cursor |
|
|
GitHub Copilot (VS Code agent mode, Copilot CLI) |
| — |
All three read .agents/skills/, so one copy in the repository covers them all:
git clone --depth 1 https://github.com/Toraastrta/sphior-code.git /tmp/sphior-code
mkdir -p .agents/skills
cp -R /tmp/sphior-code/plugin/skills/* .agents/skills/Restart the agent if a skill does not appear. In Codex you can also call one explicitly, for
example $pre-release-security-check. For the MCP server, see
Set it up; without it, the skills run the command line through npx.
claude.ai and Claude Desktop
Download the skill ZIPs from the latest release.
In Settings → Capabilities, make sure code execution is on, then under Skills choose Upload skill and upload each ZIP.
claude.ai cannot see your local files, so attach the scan output instead: run
npx @sphior/scan run . --fix-context sphior-fix.json (or --json) on your machine and add the
file to the conversation. The skill works from it.
Evidence records
packages/sphior-scan/src/engine/evidence is the
tamper-evident side of the engine, published in the open so that anyone can check a record without
trusting whoever produced it:
| Canonical JSON (RFC 8785) so the same data always hashes the same |
| One scan as one record: repository, branch, commit, engine and ruleset versions, time, finding counts, scan scope, the Merkle root of the findings, and the hash of the previous record |
| What a scan covered and what it did not: files considered and analysed, files left out by reason, languages, and the limits applied. Recorded inside the hashed record, so the gaps are as verifiable as the findings |
| Merkle root over finding fingerprints, in sorted order |
| Recompute each record hash and check the link to the previous record |
| Evidence pack: per-file SHA-256 and a manifest hash, and the check that verifies it |
| Verify a chain from stored rows and rebuild the pack |
These are library functions exported from the engine. The CLI does not write records on its own;
the hosted service writes one per scan, and verify_evidence checks them.
Privacy and data boundary
The scanner makes no network requests. No source upload, no telemetry, no analytics, no update check. It works with networking disabled.
Verify it yourself.
git grep 'fetch('inpackages/sphior-scan/srcdoes return hits. All of them are either detection rules that look forfetch/axiosas an SSRF sink in your code, or builders for reference links that are printed, never requested. The same holds for the bundledserver.cjsin the published extensions.Secret values are never stored or transmitted. Findings carry a masked preview and a hash.
AI fix context contains no source code. Only the location, the rule, and the remediation.
The MCP server's local scan never contacts SPHIOR. With
SPHIOR_API_KEYset, the account tools send finding identifiers and your reasons for resolving them — not source code.
What it does not do
Stated plainly, so a clean result is not read as more than it is:
Data flow stays within one file. Untrusted input that crosses files, or passes through closures and callbacks, is not followed. The engine stays silent rather than guessing.
It does not scan dependencies. The CLI reads source files, not lockfiles. Known-vulnerable dependencies are checked by SPHIOR CODE on GitHub.
It is not a penetration test, and it does not see your runtime: vulnerabilities in the language runtime or in a server you deploy are invisible to a source scanner.
It does not judge compliance. It records what it found; it does not decide whether you pass an audit.
The editors scan open files, and the editor integrations do not read
.sphiorignore(inline comments do work there).
SPHIOR CODE on GitHub
Everything above is free, unlimited and local. The hosted service adds what a laptop cannot keep: continuous scanning of your repositories and a history that outlasts any single run.
Install the SPHIOR CODE GitHub App and it:
scans every pull request and every push to the default branch, with no configuration;
reports in a Check Run with line annotations, and fails it when there is a Critical or High finding;
checks dependencies in 8 ecosystems (npm, PyPI, Go, RubyGems, Packagist and others) against OSV advisory data, with the version to upgrade to;
keeps a monthly ledger of dependency versions, re-checks it daily against new advisories, and alerts you when a dependency you already ship becomes vulnerable;
marks findings resolved automatically when a later scan no longer sees them, and records the fixing commit;
writes a chained, verifiable record of every scan (the evidence records above), which
verify_evidenceand the API can check independently;shows findings, dependencies and settings in the SPHIOR console, with links that open the fix in Claude Code, Cursor or Codex.
Source is read in memory during the scan and is not stored. On the hosted service, data-flow analysis currently covers JavaScript and TypeScript, and other languages are checked with the pattern rules; for the full multi-language data-flow analysis described above, also run the CLI in your CI.
The free plan includes dependency scanning. Code scanning is part of the paid plans — see sphior.com/code for current plans.
AI governance MCP server
packages/ai-governance-mcp (sphior-ai-governance-mcp, Apache-2.0)
is a separate MCP server for recording what AI agents did — actor, model, provider, policy
decision, tokens (optionally split into input, output and cache), cost, latency, trace id — as
tamper-evident evidence for ISO/IEC 42001,
the EU AI Act and SOC 2 reviews. Only hashes and metadata are kept, never prompts or outputs.
Tools:
record_ai_execution(one event) andrecord_ai_executions(up to 200 events).Requires
SPHIOR_AIGOV_TOKEN, created under Settings at sphior.com/app. Without it the server still starts and explains how to get one.It records facts. It does not decide whether you comply.
See its README for setup.
Versions
Package | Version | Ruleset bundled |
| 0.1.9 |
|
| 1.1.12 |
|
Claude Code plugin | 0.2.1 | pins |
VS Code extension, Visual Studio Marketplace | 0.1.5 |
|
VS Code extension, Open VSX | 0.1.5 |
|
JetBrains plugin | 0.1.1 |
|
| 0.2.4 | — |
All surfaces run the same engine code, but each is released on its own schedule, so a surface can bundle an earlier ruleset than the CLI for a while. Every run prints its engine and ruleset versions, and every SARIF file records them, so a result can always be traced to the exact rules that produced it.
Repository layout and building from source
.claude-plugin/ Claude Code marketplace manifest
plugin/ Claude Code plugin (MCP server pin + fix-security-findings skill)
packages/
├── sphior-scan/ Detection engine + language server + CLI (@sphior/scan)
│ ├── src/engine/ rules, taint analysis, suppression, SARIF, evidence records
│ ├── src/*-ast.ts tree-sitter backends, registered at start-up per language
│ ├── src/interproc.ts cross-function data-flow shared by the tree-sitter backends
│ └── src/lsp/ Language Server Protocol implementation
├── sphior-vscode/ VS Code extension (bundles the language server)
├── sphior-jetbrains/ JetBrains plugin (LSP4IJ + the same language server)
├── code-mcp/ MCP server (sphior-code-mcp)
└── ai-governance-mcp/ AI governance MCP (sphior-ai-governance-mcp)Requires Node.js 18+.
# 1. engine + language server + CLI
cd packages/sphior-scan && npm install && npm run build
node dist/cli.js run ../../your-project
# 2a. VS Code extension (bundles the server built in step 1)
cd ../sphior-vscode && npm install && npm run build
# 2b. JetBrains plugin (JDK 21)
cd ../sphior-jetbrains && ./gradlew buildPlugin
# 3. MCP server
cd ../code-mcp && npm install && npm run buildThe Gradle build copies the language server from step 1 before packaging and fails rather than bundling a stale one.
Related
@sphior/scan— engine, CLI, language serversphior-code-mcp— MCP serverSPHIOR CODE — the GitHub App and hosted history
License
MIT — see LICENSE. packages/ai-governance-mcp is Apache-2.0.
Available Tools
8 toolsget_findingA
Fetch full details of a single security finding by ID — includes CVSS score, CWE classification, exact file path and line number, vulnerability message, and fix hint. Use when the user wants to investigate a specific issue from list_findings.
Inputs: findingId (required).
get_fix_contextA
Scan for security problems and get deterministic remediation guidance so YOU (the AI agent) can fix them. Works with no account: without SPHIOR_API_KEY it scans the local workspace with the bundled engine. SPHIOR does not generate code or transmit source — open the referenced file in your workspace, read the code yourself, and apply the fix. Returns why-it-matters, remediation steps, exact location, and references. Findings at the same line are merged into one entry; also lists the others and one fix must satisfy all. A human must review before merge.
Inputs: path, repo, severity, findingId.
get_security_summaryA
Get the user's overall security posture: counts by severity, last scan time, and number of monitored repos. Use this when the user wants a high-level overview of their security health.
Inputs: no named parameters.
health_checkA
Report the server's mode and reachability. Works with no account: without SPHIOR_API_KEY it confirms local mode and lists which tools are usable. With a key it also returns the current security summary. Use this to debug connection issues.
Inputs: no named parameters.
list_findingsA
List security vulnerabilities (SAST + SCA) detected by SPHIOR CODE across the user's GitHub repositories. Use this when the user asks about security issues, vulnerabilities, or CVEs in their code. Returns up to 100 findings ordered by detection date (newest first).
Inputs: limit, status, severity.
mark_false_positiveA
Mark a finding as a false positive (the reported vulnerability is not actually exploitable). Use this when the AI's detection is incorrect for a specific code context.
Inputs: findingId (required), reason.
resolve_findingA
Mark a finding as resolved (e.g., after applying a fix). Use only when the vulnerability has actually been remediated. For false positives, use mark_false_positive instead.
Inputs: findingId (required), reason.
verify_evidenceA
Independently verify SPHIOR's tamper-evident code evidence chain (Merkle root + hash-chain + commit anchor). Confirms the deterministic scan records were not altered — for auditors. No source code is returned.
Inputs: repo, includePack.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 8 tools
The tools mostly target distinct actions: listing findings, fetching one finding, summarizing posture, changing status, health checking, getting fix context, and verifying evidence. The main overlap is between list_findings and get_fix_context, both of which surface vulnerabilities, though the descriptions differentiate read-only listing from scan-and-remediate guidance.
Most names follow a consistent snake_case verb_noun pattern: list_findings, get_finding, resolve_finding, mark_false_positive, get_fix_context, verify_evidence. The exception is health_check, which is a noun phrase rather than a verb-led tool name, but the overall convention is still predictable.
Eight tools is well-scoped for a security findings server. Each tool maps to a meaningful operation across listing, investigation, remediation, triage, auditing, and diagnostics, without obvious filler.
The server covers the core vulnerability lifecycle: listing, detail inspection, summary posture, resolution and false-positive triage, remediation context, evidence verification, and health diagnostics. Minor gaps remain, such as no explicit tool to trigger or manage remote scans, no repo/monitored-repository listing beyond summary counts, and no reopening or status-history operation.
Maintenance
Related MCP Connectors
Deep security scans of repos you own from your editor: dependency CVEs, SAST, git-history secrets.
Checks AI-written code for leaked keys and made-up packages, on your machine. Never uploads code.
Security scanner for AI-written code: SAST, secrets, dependencies, IaC, containers and DAST.
Security reviews, threat models over a repo or website, and remediation tracking, in your editor.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceEnables security scanning of code projects to identify common vulnerabilities like XSS, injections, SSRF, and path traversal issues. Provides local, offline scanning with severity-grouped results and actionable fix suggestions for improving code security.38 npm-
- AlicenseNot gradedqualityDmaintenanceLocal-first security check for AI coding agents — finds hardcoded secrets, exposed .env files, git-history leaks and vulnerable dependencies (OSV), entirely on your machine. Ask your agent "is this safe to ship?" and get a Launch Readiness score with a fix for every finding.MIT
- AlicenseAqualityBmaintenanceLocal-first, zero-egress security scanner for AI-generated / "vibe-coded" JS/TS. Bundles Opengrep, Gitleaks & Trivy behind one CWE-keyed schema and adds AI-code-specific checks (client-side secret exposure, Supabase RLS, prompt-injection & LLM-output XSS sinks). No account, no telemetry.10183 npm51Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables AI coding tools to scan projects for security vulnerabilities, hardcoded secrets, injection flaws, and privacy violations with 699 rules and 76 MCP tools, all running locally with zero telemetry.24 npm7MIT