starmux@0.17.0
CAUTION· startup onlyPublisher claims: "An all-in-one self-hosted remote MCP server and gateway that lets AI clients access filesystem, terminal, background processes, and computer-use tools, and multiplex local stdio MCP servers over Streamable HTTP on Linux, Jetson, macOS, and Windows. It bundles revocable API keys, OAuth 2.0, and a read-only/coding safety switch so cloud and desktop assistants can safely drive remote machines." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Startup only; authenticated tool behavior not tested.- Tested
- server startup over stdio (initialize sent) · every file read, file written and host contacted by what ran
- Not tested
- the tool list (the server exited before answering) · what the tools do when called with real credentials
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
STARMUX_INTERNAL_SETUP_TOKENSTARMUX_TOKENor--token-authConfiguration, not credentials: GLAMA_VERSION, STARMUX_ACCESS_FILE, STARMUX_ALLOW_LAN, STARMUX_DC_ACCESS_MODE, STARMUX_DC_WRITE_SCOPE, STARMUX_DENY_FILE, STARMUX_DEV_COMMANDS, STARMUX_GIT_MODE, STARMUX_GRANTS_FILE, STARMUX_INSTANCE_ID, STARMUX_INSTANCE_NAME, STARMUX_INTERNAL_SETUP_OWNER_PID, STARMUX_INTERNAL_SETUP_RUN_ID, STARMUX_PERMISSION_MODE, STARMUX_PRIVATE_ACTIVITY_OBSERVER, STARMUX_PROJECT_PORT, STARMUX_PROJECT_ROOT, STARMUX_UPSTREAMS_FILE, STARMUX_WORKSPACE_MODE, STARMUX_WORKTREE_MODE- Where it talks to
- no vendor host named in the code
- What the honeypot saw
- no credential files read · no network
- What we could not test
- the tool list (the server exited before answering) · what the tools do when called with real credentials
Connect it with a scoped credential, under the guard. It asks for STARMUX_INTERNAL_SETUP_TOKEN, STARMUX_TOKEN and talks to its vendor. Give the credential to the guard, not the server: the value never enters the server's environment and only travels to the host you bind. What the tools do with a real credential was not observed.
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; startup only; authenticated tool behavior not tested) on 2026-11-09 and scored it 74/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: Access to sensitive file paths; 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 · 39 s · 2 scenarios · 0 deviationsStatic findings
".npmrc",".netrc",".env","secrets","credentials","keychains",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if(parts.some(x=>blocked.has(x.toLowerCase())||/^\.env(\.|$)/i.test(x)||Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return {...env,...additions};Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const deniedParts=new Set([".git",".env",".ssh",".aws",".config","node_modules",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…tate.port)try{const response=await fetch(`http://127.0.0.1:${state.port}/catalog.json`,{signal:AbortSignal.timeout(2000)});const catalog=await response.json() as {instanceId:string;tools:unknown[]};if(catalog.instanceId===i.id)tools=catalo…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why./^\.env(\.|$)/i.test(x)||/\.(pem|key|p12|pfx)$/i.test(x)))Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.remoteConfigMutation:"owner-only",Fix: Pin versions and sources; vendor anything fetched at install time.…e:false});return;}const result=await fetch(`http://127.0.0.1:${s.port}/dashboard.json`,{signal:AbortSignal.timeout(2000)});const snapshot=await result.json() as {instance?:{id:string}};if(snapshot.instance?.id!==i.id)throw Error('INSTANCE_…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…tp://127.0.0.1:${state.port}/mcp`;const data=a==='copy-url'?url:JSON.stringify({mcpServers:{starmux:{type:'streamable-http',url,...(access?.mode==='api-key'?{headers:{Authorization:'Bearer <YOUR_API_KEY…Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.return subprocess.run(cmd,check=True,capture_output=True,text=True,timeout=timeout)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.…r'].includes(kind))throw Error('INVALID_LOG');const file=path.join(p.logs,kind+'.log');if(!await store.exists(file)){send(200,{text:'',cursor:null});return;} // Verify identity before opening, and …Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.// 2. Write a clean, minimal package.json (no postinstall, no telemetry-contract)Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why."sync:upstream": "npm install --save-dev --save-exact @wonderwhy-er/desktop-commander@latest --ignore-scripts && npm run build"Fix: Pin the exact version (`[email protected]`, `==1.2.3`) so every install gets the bytes that were reviewed.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.
What would make this Verified
6 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim cookyecat: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- 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.
- Auto-update or dynamic fetch configuration≈ +4 on the totalPin versions and sources; vendor anything fetched at install time.
- File type combined with upload action≈ +2 on the totalRemove the call, or declare the host in frontmatter and explain in the README what is sent and why.
- MCP server using network transport (SSE/HTTP)≈ +2 on the totalNamespace tool names and keep tool descriptions literal; no instructions to the agent inside them.
- Python subprocess execution detected≈ +2 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.