Skip to main content
Glama

Argus of MCP — MCP server & agent-skill supply-chain scanner

Formerly mcpscan. The npm package is now @kurtfrancisco/argus and the command is argus; the mcpscan command, the MCP tool names and mcpscan.policy.json keep working.

CI npm License: MIT MCP Registry

Supply-chain security scanner for MCP servers and agent skills (Claude, Cursor, VS Code, Windsurf).

Quickstart

Install (Node.js ≥ 18):

npm install -g @kurtfrancisco/argus   # or: npx @kurtfrancisco/argus scan

Claude Code

claude mcp add argus -- npx -y @kurtfrancisco/argus@0.2.0 mcp

Cursor — add to ~/.cursor/mcp.json (global) or .cursor/mcp.json (project). The same snippet works for Claude Desktop, VS Code and Windsurf:

{ "mcpServers": { "argus": { "command": "npx", "args": ["-y", "@kurtfrancisco/argus@0.2.0", "mcp"] } } }

Restart the client and the tools appear. Full details below.

Teams install third-party MCP servers and agent skills (Claude Code skills, plugin skills, Cursor skills) the same way they once installed random npm packages: copy a JSON snippet, run npx -y something, and trust it. Those components can be dead, over-privileged, or can hide prompt injection in a SKILL.md or a tool description.

argus is a zero-dependency Node.js CLI that finds every MCP config and skill folder on a machine (Windows, macOS, Linux), runs offline static checks, and writes text / JSON / SARIF / HTML reports with CI-friendly exit codes. It can also run as a read-only MCP server so an agent can audit its own environment.

Status: MVP. Static, pattern-based analysis. Read Limitations before relying on it.

Related MCP server: yotta-verify-mcp

What it finds

Rule

Default sev.

Check

MCP001

high

Prompt injection / hidden instructions ("ignore previous instructions", "do not tell the user", <IMPORTANT> tags, instructions inside HTML comments, "bypass safety") in SKILL.md, docs, and tool descriptions

MCP002

high / critical

Zero-width, bidi-override, and Unicode tag characters (tag text is decoded and shown)

MCP003

critical

Instructions to send data to an external endpoint or harvest credentials

MCP004

high / critical

Dangerous commands in scripts, SKILL.md code blocks, and server command lines: curl … | sh, iwr … | iex, rm -rf ~, Remove-Item -Recurse -Force, base64 -d | sh, reverse shells, persistence

MCP005

high

Credential paths: ~/.ssh/id_*, ~/.aws/credentials, .kube/config, browser Login Data, .netrc, %USERPROFILE%\.ssh\…

MCP006

medium

Large base64 blobs (possible obfuscated payloads)

MCP007

high / critical

Hardcoded secrets in env, headers, args, URLs, and skill files (GitHub, Anthropic, OpenAI-style, AWS, Slack, Stripe, GitLab, npm, xAI, JWT, DB URLs, private keys). Values are always masked (first 4 chars + length)

MCP008

low–high

Unpinned packages: npx -y pkg, pkg@latest, ranges like ^1.2.0, uvx pkg, docker image:latest (handles cmd /c npx.cmd … on Windows)

MCP009

high (info for localhost)

Plain http:// / ws:// remote transport, secrets in URL query strings

MCP010

medium / high

Excessive filesystem roots (/, C:\, ~, %USERPROFILE%, the whole home dir) and dangerous docker mounts (/, docker.sock)

MCP011 / MCP012

high / medium

Policy deny-list hit / not on allow list

MCP013–016

varies

--online only: npm deprecated, stale (no publish in 365 days), GitHub repo archived/missing, package missing from registry

MCP017

low

Config file could not be parsed

MCP018

info

SKILL.md missing name/description frontmatter

argus rules prints the catalog.

Where it looks

Client

Windows

macOS

Linux

Claude Desktop

%APPDATA%\Claude\claude_desktop_config.json

~/Library/Application Support/Claude/…

~/.config/Claude/…

Claude Code

%USERPROFILE%\.claude.json (user + per-project servers), %USERPROFILE%\.claude\settings.json

~/.claude.json, ~/.claude/settings.json

same

Cursor

%USERPROFILE%\.cursor\mcp.json

~/.cursor/mcp.json

same

VS Code (+ Insiders, VSCodium)

%APPDATA%\Code\User\mcp.json and settings.json (mcp.servers)

~/Library/Application Support/Code/User/…

~/.config/Code/User/…

Windsurf

%USERPROFILE%\.codeium\windsurf\mcp_config.json

~/.codeium/windsurf/mcp_config.json

same

Project

.mcp.json, .cursor\mcp.json, .vscode\mcp.json, .windsurf\mcp.json

same

same

Skills

%USERPROFILE%\.claude\skills, %USERPROFILE%\.claude\plugins\**\skills, %USERPROFILE%\.cursor\skills, project .claude\skills

~/.claude/...

same

Run argus paths to see the exact paths checked on your OS. JSONC (comments, trailing commas) is supported. Symlinks are never followed.

Install & use

Needs Node.js 18 or newer. No runtime dependencies, so you don't have to run npm install to use it.

Windows (PowerShell)

# from the folder you copied (e.g. C:\path\to\mcpscan)
cd $env:USERPROFILE\mcp-skill-scanner
node .\bin\mcpscan.js paths                       # where it will look
node .\bin\mcpscan.js scan                        # user configs + current folder
node .\bin\mcpscan.js scan -p C:\code\my-repo -f html -o "$env:TEMP\mcpscan.html"
Start-Process "$env:TEMP\mcpscan.html"
npm test                                          # run the test suite (offline)

# optional: put `argus` on PATH
npm link
argus scan --fail-on critical
$LASTEXITCODE                                     # 0 = clean, 1 = findings, 2 = error

If PowerShell blocks the mcpscan.ps1 shim that npm link creates, run Set-ExecutionPolicy -Scope CurrentUser RemoteSigned, or keep calling node .\bin\mcpscan.js.

macOS / Linux

node bin/mcpscan.js scan
node bin/mcpscan.js scan -p ~/code/app -f sarif -o mcpscan.sarif

Options

argus [scan] [-p dir]... [-c config.json]... [-s skillsDir]... [-t tools.json]...
        [-f text|json|sarif|html] [-o file] [--fail-on critical|high|medium|low|info|none]
        [--min-severity sev] [--policy file] [--online] [--root home] [--platform win32|darwin|linux]
        [--no-default-roots] [--no-color]
argus list | paths | rules | init-policy | mcp
  • Vet a skill before installing: argus scan --no-default-roots -s .\downloaded-skill

  • Vet tool descriptions: save a server's tools/list result to JSON, then argus scan --no-default-roots -t tools.json

  • Exit codes: 0 = nothing at or above --fail-on (default high, or failOn from the policy), 1 = findings, 2 = usage/runtime error.

CI (GitHub Actions + code scanning)

- run: node bin/mcpscan.js scan --no-default-roots -p . -f sarif -o mcpscan.sarif --fail-on high
- uses: github/codeql-action/upload-sarif@v3
  if: always()
  with: { sarif_file: mcpscan.sarif }

Policy file (mcpscan.policy.json)

Loaded from the current directory, or pass --policy path. argus init-policy writes a starter file.

{
  "version": 1,
  "failOn": "high",
  "requireAllowList": false,
  "allow": { "servers": [], "packages": ["@modelcontextprotocol/*"], "hosts": ["mcp.linear.app"], "skills": [] },
  "deny":  { "servers": [], "packages": ["*-mcp-free-*"], "hosts": ["*.ngrok-free.app"], "skills": [] },
  "ignore": [ { "rule": "MCP018" }, { "rule": "MCP008", "target": "internal-*" } ],
  "severityOverrides": { "MCP014": "low" }
}

* is a wildcard. When requireAllowList is true, any server or skill that isn't allow-listed raises MCP012.

MCP server mode (read-only)

argus mcp runs a stdio MCP server (JSON-RPC 2.0, protocol 2025-06-18) with four tools, each annotated readOnlyHint: true: scan_all, list_discovered, scan_skill, scan_text. None of them writes files or touches the network.

{ "mcpServers": { "mcpscan": { "command": "node", "args": ["C:\\path\\to\\mcpscan\\bin\\mcpscan.js", "mcp"] } } }

Claude Code: claude mcp add argus -- node /path/to/mcpscan/bin/mcpscan.js mcp

Claude Code skill

skills/mcpscan/ holds a ready-made skill (SKILL.md + reference.md). Copy the folder into %USERPROFILE%\.claude\skills\ (Windows) or ~/.claude/skills/ (macOS/Linux), or into a repo's .claude/skills/:

Copy-Item -Recurse .\skills\mcpscan "$env:USERPROFILE\.claude\skills\mcpscan"

Competitors and prior art

How Argus differs: it runs fully offline by default and sends no tool descriptions to a third party. It has zero dependencies, so it's easy to audit. It covers supply-chain hygiene (pinning, secrets, filesystem scope, transport, liveness) as well as injection. It produces native SARIF for CI, applies a simple policy file, and covers Windows paths explicitly. Its trade-off: no LLM-based semantic analysis, and it doesn't connect to live servers.

Limitations

  • Detection is regex/heuristic. Expect false positives. Skills that legitimately say "do not tell the user X" get flagged MCP001. Expect false negatives too: paraphrased or translated injections, payloads split across files, and obfuscation beyond base64 and hidden Unicode get through.

  • Tool descriptions are only checked when they appear in a config, or when you pass a tools/list dump with -t. Argus doesn't launch or connect to servers, so it can't detect rug pulls (description changes over time).

  • --online checks npm and GitHub only. PyPI and Docker Hub liveness aren't implemented, and unauthenticated GitHub API calls are rate-limited (60 requests/hour).

  • Config paths cover the clients' current documented defaults. Portable installs, custom CLAUDE_CONFIG_DIR, and enterprise-managed settings aren't discovered automatically; pass them with -c/-s.

  • Homoglyph and confusable-character detection isn't implemented.

  • The MCP server mode implements tools only (no resources or prompts) over stdio.

Development

npm run build   # syntax-check all files, load modules, validate policy JSON
npm test        # node:test, fully offline (fetch is stubbed to throw)
npm run demo    # scan the bundled malicious fixtures
node scripts/make-fixtures.js   # regenerate fixtures (all secrets are fake)

License

MIT © 2026 Kurt Francisco. See LICENSE.

Contributing

Issues and pull requests are welcome at https://github.com/fpavia111-creator/argus. See CONTRIBUTING.md.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Security scanner for third-party AI agent-skill files: SKILL.md manifests, hooks, and bundled scripts, exposed via an MCP tool.
    1
    10 npm
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides a deterministic pre-install security scan for Agent skills, plugins, and MCP servers via stdio, returning verdicts, audited badges, CI gates, and reports without executing code or making network calls.
    74 npm
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables agents and CI pipelines to audit MCP servers and agent tool-chains by statically scanning repositories, local checkouts, tools/list exports, or live endpoints for risks such as destructive actions without confirmation, mismatched safety annotations, injection surfaces, credential or PII exposure, and unguarded command, path, or URL sinks. All checks are read-only and never execute the scanned code or call tools/call.
    3
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Read-only MCP server that exposes the scan_text and scan_paths tools so AI coding agents can scan text, files, staged Git changes, local history and archives for secrets entirely offline, returning redacted findings with rules, positions and fingerprints and flagging incomplete scans. Results can be emitted as JSON, JSONL or SARIF without ever serializing raw secret values or source snippets.
    Apache 2.0