peek-mcp@0.5.17
VERIFIED· not startedPublisher claims: "Let AI agents see your UI — point at elements, annotate, and get instant visual context for AI-powered code editing." 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: Verified 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
- no credential variables read in the code
- Where it talks to
- no vendor host named in the codeAlso evil.com — 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 under the guard. Not started: dependency install failed; the server itself was not observed. The code names no credential variable; the guard pins the network to what the honeypot saw and logs every call.
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-14 and scored it 85/100 (Verified). In what ran, nothing we could detect went wrong: no undeclared network egress, no credential reads, no persistent instruction writes. What it does with a real credential was not observed; the static findings and the publisher carry the rest of the score. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 2 scenarios · 0 deviationsStatic findings
result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.// would kill our own button click handlers before they run.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."http://0x7f000001:8080", # hex IP for 127.0.0.1 (SSRF bypass)Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.Either your dev server isn't running, or the agent guessed the wrong port. Add the `CLAUDE.md` snippet above so the agent knows your real port; start your dev server before asking for a screenshot.Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct."http://10.0.0.1:8080", # LAN IPFix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.assert "AKIAIOSFODNN7EXAMPLE" not in outFix: Never read or enumerate credential locations; accept a documented environment variable instead.assert validate_url("http://192.168.1.5:3000") == "http://192.168.1.5:3000"Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.text = "Found AWS key AKIAIOSFODNN7EXAMPLE in env"Fix: Never read or enumerate credential locations; accept a documented environment variable instead.Each <img> uses loading="lazy" pointing at a tiny inline-data SVG that NEVER fires `load` until the browser decides to fetch it (i.e. when the user scrolls closFix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.print(" Recommended: add this to your project's CLAUDE.md so the agent")Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.validate_url("http://8.8.8.8")Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.text = "Auth: ghp_abcdefghijklmnopqrstuvwxyz1234567890ABC"Fix: Never read or enumerate credential locations; accept a documented environment variable instead.<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600&family=Newsreader:ital,wght@0,400;1,400&display=swap" rel="stylesheet">Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."outerHTML": '<div>Token: ghp_realgithubtoken1234567890abcdefghij1234567890</div>',Fix: Never read or enumerate credential locations; accept a documented environment variable instead."http://192.168.1.5:3000", # LAN IPFix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.validate_url("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 validate_url("http://10.0.0.1:8080") == "http://10.0.0.1:8080"Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.resp = client.get("/captures//etc/passwd")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."http://172.16.0.1:3000", # LAN IPFix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.b"\x00\x00\x00\x01\x08\x02\x00\x00\x00\x90wS\xde\x00"Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.…r(),e.defaultComputedStyles.clear(),e.sandbox){try{e.sandbox.remove()}catch(t){e.log.warn("Failed to destroyContext",t)}e.sandbox=void 0}e.workers=[],e.fontFamilies.clear(),e.fontCssTexts.clear(),e.requests.clear(),e.tasks=[],e.shadowRoots…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why."""GET /captures//etc/passwd should not serve system files."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.b"\x00\x00\x00\x01\x08\x02\x00\x00\x00\x90wS\xde\x00"Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.Add this to your project's `CLAUDE.md` (or `.cursorrules`, etc.):Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.b"\x00\x00\x0cIDATx\x9cc\xf8\x0f\x00\x00\x01\x01\x00"Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.…ageInterval:a}=t;r.time("image to canvas");const s=yield L(e,{timeout:n,onWarn:t.log.warn}),{canvas:o,context2d:c}=bt(e.ownerDocument,t),u=()=>{try{c==null||c.drawImage(s,0,0,o.width,o.height)}catch(l){t.log.warn("Failed to drawImage",l)}}…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.b"\x00\x00\x0cIDATx\x9cc\xf8\x0f\x00\x00\x01\x01\x00"Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own."http://169.254.169.254", # AWS metadata (link-local)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.validate_url("http://0x7f000001:8080")Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.validate_url("http://8.8.8.8")Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.Add this to your project's `CLAUDE.md` (or `.cursorrules`, etc.):Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.validate_url("file:///etc/passwd")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.Either your dev server isn't running, or the agent guessed the wrong port. Add the `CLAUDE.md` snippet above so the agent knows your real port; start your dev server before asking for a screenshot.Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.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 peek-mcp@0.5.17 as of 47 min ago. This is the package itself, not its dependencies.