mcpscore@1.32.0
CAUTION· not startedPublisher claims: "Audit an MCP server and get a scored, actionable quality report in seconds." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Not started: dependency install failed; the server itself was not observed.- Tested
- the dependency install step · every file read, file written and host contacted by what ran
- Not tested
- server startup · the tool list · tool behavior
What this means for the label: Caution here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
- It will ask for
MCPSCORE_TOKENor--oauthConfiguration, not credentials: SSL_CERT_DIR, SSL_CERT_FILE- Where it talks to
- mcpscore.dev, mcpscore.invalid (its own)Also jsonrpc.org, deepwiki.com, your-server.example, server.com, schemastore.org — 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
- server startup · the tool list · tool behavior
Connect it with a scoped credential, under the guard, and read the third-party hosts first. The code names jsonrpc.org, deepwiki.com, your-server.example, server.com, schemastore.org as well as its own vendor. The guard injects MCPSCORE_TOKEN only into requests to mcpscore.dev (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 (2 scenarios; not started: dependency install failed; the server itself was not observed) on 2026-11-11 and scored it 68/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: URL with embedded credentials; Hex-encoded URL; URL with embedded credentials. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 2 scenarios · 0 deviationsStatic findings
auditor.audit_data.protocol_version = "HTTPS://user:[email protected]/?token=Token123"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."npm:../../etc/passwd", # path traversalFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.internal = "http://169.254.169.254/latest"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose._redirect(303, "/mcp/?token=s3cret#frag", url="https://user:[email protected]/mcp")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.auditable from the CLI (``mcpscore --stdio npx -y <pkg>``) but not from a publicFix: Pin versions and sources; vendor anything fetched at install time.assert await _discovery_url_refusal("http://169.254.169.254/prm", "https://gone.example/mcp") == "private"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.("backslash_confusion", "http://127.0.0.1:{denied}\\@127.0.0.1:{allowed}/v/backslash_confusion"),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.with_credentials = unfollowed_redirect(_redirect(303, "https://u:[email protected]/mcp/"))Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.("hex_ipv4", "http://0x7f000001:{denied}/v/hex_ipv4"),Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.assert await _discovery_url_refusal("http://169.254.169.254/prm", "https://server.example/mcp") == "private"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.internal = "http://169.254.169.254/latest/meta-data"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert unfollowed_redirect(_redirect(307, "https://user:[email protected]/mcp")) == RefusedRedirect(Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."nested": {"url": "HTTPS://user:[email protected]/mcp?scope=read&token=Token123#section"},Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.("userinfo_confusion", "http://127.0.0.1:{allowed}@127.0.0.1:{denied}/v/userinfo_confusion"),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.("fragment_confusion", "http://127.0.0.1:{denied}/v/fragment_confusion#@127.0.0.1:{allowed}"),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.data.probes[rule.probe_id].details[key] = ["HTTPS://user:Secret123@host/path?token=Token123", "工具🔎" * 50]Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.refusal = await _discovery_url_refusal("http://169.254.169.254/latest/meta-data", "https://server.example/mcp")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.("https://alice:can'[email protected]/a/SKILL.md", "https://skills.example/a/SKILL.md"),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.``curl … | sh``. See the design doc for why the CLI's arbitrary-commandFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.endpoint = "https://user:[email protected]/mcp"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.f"Permission denied launching '{command}'. Make it executable (chmod +x) "Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.assert policy_refusal(_redirect(308, "https://user:[email protected]/mcp/", url=endpoint)) is NoneFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.``curl … | sh``. See the design doc for why the CLI's arbitrary-commandFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.("see 'https://u:[email protected]/x' here", "see 'https://host.example/x' here"),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.odd["frontmatter"]["allowed-tools"] = f"Fetch(https://user:{secret}@api.example/)"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.body = "[a](<assets/b c.png>) [b](assets/b%20c.png) [c](数据/表.md) [d](%E6%95%B0%E6%8D%AE/%E8%A1%A8.md)\n"Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.("https://user:[email protected]/mcp?sig=abc", "mcp.example.com/mcp"),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert key("npx -y @a/server") == key("npx -y @b/server")Fix: Pin versions and sources; vendor anything fetched at install time.odd["resources"].append({"uri": f"https://user:{secret}@skills.example/a/scripts/run.py", "size": 1})Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.result = rule.check(_leak_audit("upstream error: api_key=sk-live-1a2B3c4D5e6F7g8H"))Fix: Never read or enumerate credential locations; accept a documented environment variable instead.odd["uri"] = f"https://user:{secret}@skills.example/a/SKILL.md"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.unknown = f"https://user:{password}@skills.example/acme/mcpscore-no-such-skill/SKILL.md"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.("references/指南.md", "references/%e6%8c%87%e5%8d%97.md", True),Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.target = "https://user:[email protected]:8443/mcp?sig=abc123#frag"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.entry = skill("code-review", {"SKILL.md": skill_md("code-review", body="```\nrm -rf\n```\n")})Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.assert key("npx -y @a/server") != key("uvx a-server")Fix: Pin versions and sources; vendor anything fetched at install time.("skill://acme/%E6%95%B0%E6%8D%AE/SKILL.md", "skill://acme/%E6%95%B0%E6%8D%AE", "数据"),Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.("skills_hidden_unicode", data(skill("code-review", description="Reviewweiver")),Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls."https://user:[email protected]:8443",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.entry["uri"] = "skill://acme/%E6%95%B0%E6%8D%AE/SKILL.md"Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.assert fixture.url(template) == f"http://127.0.0.1:{fixture.allowed_port}@127.0.0.1:{fixture.denied_port}/"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.("npx -y @modelcontextprotocol/server-everything", "npx"),Fix: Pin versions and sources; vendor anything fetched at install time.partial_reason="gated at https://user:[email protected]/x?sig=1",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."❌ The challenge's resource_metadata 'https://user:[email protected]/.well-known/x?sig=abc123#f' "Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.await _fetch_auth_server_metadata(client, "http://10.0.0.5", URL, details)Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.body = "```bash\nls\n```\n"Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls."frontmatter": {"name": "code-review", "description": "Review"},Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.("skill://a/指南 x", "skill://a/%E6%8C%87%E5%8D%97%20x"),Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.assert fixture.display(template) == "http://127.0.0.1:<allowed-port>@127.0.0.1:<denied-port>/"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.secret_root = f"https://user:{password}@skills.example/acme/code-review"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.template = "http://127.0.0.1:{allowed}@127.0.0.1:{denied}/"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.("https://user:[email protected]:8443/mcp?sig=abc123#frag", "https://mcp.example.com:8443/mcp"),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.later = {**b, "frontmatter": {**b["frontmatter"], "description": "Review code."}}Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.command = "npx --token hunter2 @scope/server --root /tmp/hunter2"Fix: Pin versions and sources; vendor anything fetched at install time.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 mcpscore@1.32.0 as of 3d ago. This is the package itself, not its dependencies.
What would make this Verified
12 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Pipe-to-shell pattern≈ +9 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
- Unclaimed publisher≈ +8 on the totalClaim mcp-box: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Hex-encoded URL≈ +4 on the totalPut hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.
- URL with embedded credentials≈ +2 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Access to sensitive file paths≈ +2 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- URL to the cloud instance metadata address≈ +2 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.