clipsdk-mcp@0.1.0
VERIFIEDPublisher claims: "Enables coding agents to turn long videos into captioned short clips, upload local or linked media, monitor jobs, and save finished MP4s with titles, scores, and ready-to-post captions to disk." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Server started and answered tools/list.- Tested
- 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
- no credential variables read in the code
- Where it talks to
- clipsdk.com (its own)Also githubusercontent.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
- what the tools do when called with real credentials
Connect it under the guard; read the third-party hosts first. The code names githubusercontent.com as well as its own vendor. The guard pins the network to the hosts the honeypot saw.
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) on 2026-11-08 and scored it 81/100 (Verified). It did what it claims and nothing else we could detect: no undeclared network egress, no credential reads, no persistent instruction writes. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 20 s · 2 scenarios · 0 deviationsStatic findings
video: file("video.mp4").replace("http://", "http://user:hunter2@"),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.expect(done.json.folder).toBe(output("podcast"));Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…yIf??Ra,async()=>{let o=await fetch(n,{method:e.method,headers:this.#i(e),body:e.json===void 0?void 0:JSON.stringify(e.json),redirect:"manual",signal:YI(e.signal,e.timeoutMs)}),s=fp(o.headers.get("request-id")),a=await pw(o,this.#e.answerB…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.const planned = plannedFiles([clip(1, "Why Pricing Pages Fail!"), clip(2, "", { poster: null, srt: null, vtt: null }), clip(3, "../../etc/passwd")]);Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.expect(outcome.json.folder).toBe(output("podcast"));Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.for (const url of ["http://api.clipsdk.com", "http://localhost.attacker.com", "http://127.0.0.1.nip.io", "http://10.0.0.5"]) {Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.expect(done.json.clips?.map((clip) => clip.video)).toEqual([output("podcast", `${BEST}.mp4`), output("podcast", "02-moment-2.mp4")]);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.… hosted (https://mcp.clipsdk.com/mcp with the key as a Bearer header) or local (npx -y github:bitgate/clipsdk-mcp, Node 20+, CLIPSDK_KEY set). Without it, falls back …Fix: Pin versions and sources; vendor anything fetched at install time.await Promise.all([writeFile(path.join(dir, ".env"), MP4), writeFile(path.join(home, ".ssh", "key.mp4"), MP4), writeFile(path.join(home, "vault", "key.mp4"), MP4)]);Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.expect(hasHiddenSegment("/home/me/project/.env", "/home/me/project")).toBe(true);Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.npx -y ./clipsdk-mcp-*.tgz --versionFix: Pin versions and sources; vendor anything fetched at install time.["https://user:[email protected]/talk.mp4", "user name or password"],Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// Dot names (.ssh, .env, .aws) count below the project, and anywhere on a path outside itFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const server = createServer({ CLIPSDK_KEY: GOOD_KEY, CLIPSDK_BASE_URL: api.baseUrl, CLAUDE_PROJECT_DIR: dir, CLIPSDK_WAIT_S: "30", ...env });Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…:o}){let s=r.$comment;if(o.$comment===!0)t.code((0,A._)`${D.default.self}.logger.log(${s})`);else if(typeof o.$comment=="function"){let a=(0,A.str)`${n}/$comment`,c=t.scopeValue("root",{ref:e.root});t.code((0,A._)`${D.default.self}.opts.$c…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.for (const input of [".env", path.join(home, ".ssh", "key.mp4"), "~/.ssh/id_rsa", "innocent.mp4", ".secrets/key.mp4"]) {Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.expect(outcome.json.folder).toBe(output("talk"));Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.["https://media.example.com/v/.env%E2%80%AEgpj.mp4", "env_gpj"],Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.for (const name of ["../escape.mp4", "../created/escape.mp4", "/etc/passwd", path.join("captions", "..", "..", "escape.srt")]) {Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…isValid}i(ip,"validateAndWarnToolName");var Sa=class{static{i(this,"ExperimentalMcpServerTasks")}constructor(e){this._mcpServer=e}registerToolTask(e,r,n){let o={taskSupport:"required",...r.execution};if(o.taskSupport==="forbidden")throw ne…Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them."file:///etc/passwd",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.["https://user:[email protected]/v2/?debug=1#top", "https://api.example.com/v2"],Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.- No `build`, `prepare`, `prepack`, `install`, `preinstall` or `postinstall` scripts: npm would then run a full dev install whenever someone starts the server with `npx github:bitgate/clipsdk-mcp`.Fix: Pin versions and sources; vendor anything fetched at install time.["https://192.168.1.20/talk.mp4", "can't reach 192.168.1.20"],Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.for (const webhook_url of ["http://hooks.example.com/clips", "https://hooks.example.com:8443/clips", "https://user:[email protected]/clips", "hooks"]) {Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.for (const input of [".env", path.join(home, ".ssh", "key.mp4"), "~/.ssh/id_rsa", "innocent.mp4", ".secrets/key.mp4"]) {Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.expect(second.json.folder).toBe(output("talk-2"));Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.["https://media.example.com/%2e%2e%2f%2e%2e%2fescape.mp4", "escape"],Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.for (const url of ["http://example.com/in/a.mp4", "https://user:[email protected]/in/a.mp4", "not a url"]) {Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.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
Vulnerability advisories (OSV) cover npm and PyPI packages; this registry has no advisory database.