privacyscrubber-mcp@2.5.0.post1
CAUTIONPublisher claims: "CISO-Approved Zero-Trust PII & Secrets Redaction MCP Server for Cursor, Windsurf, and Claude Desktop" Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Server started and answered tools/list.- Tested
- install scripts, with decoy credentials in place · second launch with the clock 45 days ahead · MCP initialize and tools/list · every tool description, for hidden instructions · every file read, file written and host contacted by what ran
- Not tested
- what the tools do when called with real credentials
Before you give it your token
- It will ask for
PRIVACYSCRUBBER_LICENSE_KEYPRIVACYSCRUBBER_MAX_SESSION_TOKENSor--access-token/--auth-token/--client-secretConfiguration, not credentials: CURSOR_WORKSPACE_PATH, DEBUG_PRIVACYSCRUBBER, INIT_CWD, PRIVACYSCRUBBER_COMPACT_RECEIPT, PRIVACYSCRUBBER_KEY, PRIVACYSCRUBBER_TEST_MODE, PRIVACYSCRUBBER_WORKSPACE, PROJECT_ROOT, VSCODE_CWD, WORKSPACE_FOLDER_PATHS- Where it talks to
- privacyscrubber.com (its own)Also ztds.ai — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · no network
- What we could not test
- what the tools do when called with real credentials
Connect it with a scoped credential, under the guard, and read the third-party hosts first. The code names ztds.ai as well as its own vendor. The guard injects PRIVACYSCRUBBER_LICENSE_KEY, PRIVACYSCRUBBER_MAX_SESSION_TOKENS only into requests to privacyscrubber.com (and its subdomains) and refuses the rest.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (3 scenarios) on 2026-11-15 and scored it 62/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Prompting user to enter sensitive credentials; Access to sensitive file paths; Access to sensitive file paths. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 28 s · 3 scenariosStatic findings
content: [{ type: "text", text: "Error: Missing required parameter 'token'. Provide the token to mark as false positive (e.g., '[NAME_1]')." }]Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.'1. Never read `.env`, `*secret*`, `*credentials*`, `*.pem`, `*.key`, or database dumps with native `read_file` / `cat`. Call `guard_read_file` or `sanitize_file`.',Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."description": "Zero-Trust Agentic Guard: Reads a sensitive local file (.env, config, source code) and sanitizes credentials and PII in volatile RAM."Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.description: "List of file extensions to scan (e.g. ['.env', '.log', '.js']). If empty, scans all text files."Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…de & Cursor v1.7+ if (isHookMode) { const SENSITIVE_FILE_RX = /(?:^|[\\/])(?:\.env(?:\.[a-zA-Z0-9_-]+)?|id_rsa|id_ed25519|id_ecdsa|.*\.pem|.*\.key|.*\.p12|.*\.pfx…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.description: "The shell command to execute (e.g. 'cat .env', 'git diff', 'docker logs web', 'env')."Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…RX = /(?:^|[;&|]\s*)(?:cat|head|tail|less|more|bat|sed|awk|grep)\s+[^\n|;&]*(?:\.env\b|id_rsa|\.pem\b|\.key\b|credentials\.json|\bsecrets?\.)|(?:^|[;&|]\s*)(?:print…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…c Guard: Preferred over native file read tools. Reads any sensitive local file (.env, config, credentials, source code, database dumps, .docx, .pdf, .xlsx, .eml, .r…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.console.log(" cat .env | npx ps-guard --profile dev --json");Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."1. FILE READS: Before reading .env, configs, logs, database dumps, or documents (DOCX/PDF/XLSX/CSV/JSON), call 'guard_read_file' (or 'sanitize_file') instead of native file read tools.",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…mands: When running commands whose output might contain credentials or PII (cat .env, docker logs, env, git diff, psql), use `guard_exec` to sanitize output in loca…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.… console.log('\x1b[36m💼 B2B 7-Day Free Trial (TEAMS $99/mo · SDK $299/mo): npx @privacyscrubber/mcp-server trial | https://privacyscrubber.com/pricing/?tier=teams&trial=true&utm_source…Fix: Pin versions and sources; vendor anything fetched at install time.console.log(" --diff Sanitize git diff output before committing or sending to AI");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.npx @privacyscrubber/mcp-server-install [options]Fix: Pin versions and sources; vendor anything fetched at install time.console.log("--> Sending 'initialize' request...");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.if (!text102.includes('[EMAIL_1]') || text102.includes('[email protected]') || text102.includes('sk_live_9876543210abcdef')) {Fix: Never read or enumerate credential locations; accept a documented environment variable instead.…b[36m💼 B2B 7-Day Free Trial (TEAMS $99/mo · SDK $299/mo): npx @privacyscrubber/mcp-server trial | https://privacyscrubber.com/pricing/?tier=teams&trial=true&utm_source=mcp_install\x1…Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.console.log(' npx @privacyscrubber/mcp-server trial Request 7-day B2B TEAMS/SDK evaluation key');Fix: Pin versions and sources; vendor anything fetched at install time.console.log(" npx ps-guard --wrap -- npx -y @modelcontextprotocol/server-postgres postgresql://localhost/mydb");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.const hookCmd = 'npx -y @privacyscrubber/mcp-server --hook';Fix: Pin versions and sources; vendor anything fetched at install time.tool_input: { file_path: '/workspace/.env.example' }Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.tool_input: { file_path: '/workspace/.env.production' }Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.console.log("Raw Input: ", text1);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log(" npx ps-guard --diff [--staged] [options]");Fix: Pin versions and sources; vendor anything fetched at install time.console.log(" npx ps-guard --restore --token-map <file|json> [options]");Fix: Pin versions and sources; vendor anything fetched at install time.…our PRO/TEAMS/SDK license key or start a 7-day B2B trial ('npx @privacyscrubber/mcp-server trial'): https://privacyscrubber.com/pricing?tier=teams&trial=true&profile=${safeProf}&utm_so…Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.RUN chown -R node:node /appFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.# 3. Fallback to zero-dependency Python ZTDS engine (strictly air-gapped, no remote npx fetch)Fix: Pin versions and sources; vendor anything fetched at install time.this.env = { ...process.env, ...env };Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.console.log("Raw Input: ", text1);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log("--> Sending 'tools/list' request...");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log(" cat <file> | npx ps-guard [options]");Fix: Pin versions and sources; vendor anything fetched at install time.console.log(" --json Output structured JSON (scrubbedText, tokenMap, count, telemetry)");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log(' npx @privacyscrubber/mcp-server --wrap <cmd> Transparent ZTDS proxy for any 3rd-party MCP server');Fix: Pin versions and sources; vendor anything fetched at install time.console.log("<-- Revealed Output:", revealedText);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log("\n[Test 7] Testing generate_procurement_memo output...");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.npx @privacyscrubber/mcp-server init [options]Fix: Pin versions and sources; vendor anything fetched at install time.console.log(' npx @privacyscrubber/mcp-server Start MCP stdio server');Fix: Pin versions and sources; vendor anything fetched at install time."1. FILE READS: Before reading .env, configs, logs, or sensitive files, call 'sanitize_file' instead of native file read tools.\n"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.throw new Error(`pii-masking-run Test 12a (Claude PreToolUse .env) failed. Code=${hookClaudeEnv.code}, Output=${hookClaudeEnv.stdout}`);Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.… may contain API keys, database connection strings, or customer PII (e.g. \`cat .env\`, \`docker logs\`, \`env\`, \`git diff\`), invoke the \`guard_exec\` tool inst…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…ntent: [{ type: 'text', text: 'Customer email is [email protected] and API key is sk_live_9876543210abcdef' }] } }) + '\\n');", " } else if (msg.method === 'tools/call' && msg.par…Fix: Never read or enumerate credential locations; accept a documented environment variable instead.throw new Error(`pii-masking-run Test 12c (Safe .env.example) should be allowed. Code=${hookSafeFile.code}, Output=${hookSafeFile.stdout}`);Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.console.log('\x1b[36m📋 Generate CISO Procurement Memo: npx @privacyscrubber/mcp-server memo\x1b[0m');Fix: Pin versions and sources; vendor anything fetched at install time.claude mcp add privacyscrubber -- npx -y @privacyscrubber/mcp-serverFix: Pin versions and sources; vendor anything fetched at install time.console.log(" npx ps-guard --wrap [options] [--] <mcp-server-cmd> [args...]");Fix: Pin versions and sources; vendor anything fetched at install time.console.log(' npx @privacyscrubber/mcp-server init Auto-configure Claude, Cursor, Windsurf, Cline');Fix: Pin versions and sources; vendor anything fetched at install time.console.log("Scrubbed: ", output1);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log("--> Sending 'prompts/list', 'resources/list', and 'resources/templates/list' requests...");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log("Scrubbed: ", output2);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.FORBIDDEN_PATH_SEGMENTS = ('/etc/shadow', '/etc/passwd', '/.ssh/', '/.aws/', '/.gnupg/', 'id_rsa', 'id_ed25519')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.mcp_server: "npx -y @privacyscrubber/mcp-server"Fix: Pin versions and sources; vendor anything fetched at install time.console.log(' npx @privacyscrubber/mcp-server uninstall Remove from IDE configurations');Fix: Pin versions and sources; vendor anything fetched at install time.console.log("\n[Test 6] Testing generate_compliance_report output (JSON & Markdown)...");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log("<-- Sanitized Output:", sanitizedText);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…psellNotice.includes('profile=medical') || !freeIndustry.upsellNotice.includes('npx @privacyscrubber/mcp-server trial')) { console.error("❌ Test 10 failed: truncateIfFree upsellNotice mis…Fix: Pin versions and sources; vendor anything fetched at install time.console.log(" npx ps-guard [options] -- <command> [args...]");Fix: Pin versions and sources; vendor anything fetched at install time.console.log("\n[Test 10] Testing Free Tier quota limits vs PRO throughput...");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
No advisories in OSV for privacyscrubber-mcp@2.5.0.post1 as of 35 min ago. This is the package itself, not its dependencies.
What would make this Verified
18 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Reads credential files≈ +27 on the totalThe sandbox saw reads under ~/.ssh, ~/.aws, ~/.npmrc, ~/.config or similar. Read only files inside the project, and only the ones the task needs. Seen: ~/.config/Claude/claude_desktop_config.json, ~/.config/Claude/claude_desktop_config.json.
- Prompting user to enter sensitive credentials≈ +9 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Unclaimed publisher≈ +8 on the totalClaim moxno: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Touches files outside the project≈ +7 on the totalKeep reads and writes inside the working directory, or declare the exact paths in `filesystem:` and explain why in the README.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Stripe-like API key pattern detected≈ +4 on the totalNever read or enumerate credential locations; accept a documented environment variable instead.