Refuted findings 13
Candidates the review stage examined and rejected, kept for transparency.
Credential access
criticalRefutedlow confidenceThe BrowserStack local-binary resource reads BROWSERSTACK_ACCESS_KEY from the environment and embeds the real key in resource text (setup commands) returned to the LLM/client, exposing the secret in agent context, while the resource description tells the agent it MUST follow these instructions.
const accessKey = process.env.BROWSERSTACK_ACCESS_KEY ?? '<BROWSERSTACK_ACCESS_KEY>';
Why it was refuted
The env key is for the wrapped BrowserStack service and is placed into that vendor's own tunnel setup commands. That falls under the env-API-key-for-the-wrapped-service carve-out, and nothing is sent to a third party.
Credential access
criticalRefutedlow confidenceThe Sauce Connect resource reads SAUCE_ACCESS_KEY from the environment and places the actual key into command lines returned in resource content to the model, leaking the secret into agent context (the key is for the wrapped service).
const accessKey = process.env.SAUCE_ACCESS_KEY ?? '<SAUCE_ACCESS_KEY>';
Why it was refuted
The Sauce key is the wrapped service's own env credential, used to build Sauce Connect setup commands. This is the wrapped-service env-key carve-out, with no third-party sink.
Credential access
criticalRefutedlow confidenceThe TestingBot tunnel resource reads TESTINGBOT_KEY/SECRET from the environment and embeds them in setup commands returned to the model, exposing the secrets in agent context (vendor-specific, plausibly honest convenience).
const key = process.env.TESTINGBOT_KEY ?? '<TESTINGBOT_KEY>';
Why it was refuted
The TestingBot key is the wrapped service's own env credential, used to build the vendor tunnel launch command. This is the env-key carve-out.
Credential access
criticalRefutedlow confidenceA resource whose description says it MUST be read and followed reads TESTINGBOT_KEY and TESTINGBOT_SECRET from the environment and embeds them in command lines returned to the agent, so the secrets enter the model context and any logs.
java -jar ${JAR_NAME} ${key} ${secret}Why it was refuted
The 'MUST be read' wording only orders tunnel startup before start_session. The key and secret belong to the wrapped TestingBot service and go into its own tunnel command, which is the env-key carve-out.
Credential access
criticalRefutedlow confidenceThe testmu-local-binary resource reads the TestMu access key from the environment and embeds it in plaintext in resource content and shell commands handed to the agent, which exposes the secret to the LLM context and transcript; this is undeclared and goes beyond what the tunnel instructions need.
const accessKey = process.env.TESTMU_ACCESS_KEY ?? '<TESTMU_ACCESS_KEY>';
Why it was refuted
The TestMu key is the wrapped service's own env credential, used in that vendor's tunnel setup commands. This is the env-key carve-out, with no third-party sink.
Credential access
criticalRefutedlow confidenceA resource whose description says it MUST be read and followed reads TESTMU_ACCESS_KEY from the environment and embeds it in daemon start commands returned to the agent, so the secret enters the model context and any logs.
4. Start daemon: ./${info.binaryName} --user ${username} --key ${accessKey}Why it was refuted
The 'MUST be read and followed' text only orders tunnel startup before start_session. The key is the wrapped TestMu service's own credential, used in its daemon command, which is the env-key carve-out.
Data exfiltration
criticalRefutedlow confidenceThe wdio-show-trace CLI reads a user-specified or latest trace zip and serves it on a localhost port, then opens the third-party player.vibium.dev viewer with the local URL; the third-party origin is granted CORS access to fetch the trace file contents (which may contain screenshots and session data).
const viewerUrl = `https://player.vibium.dev/?record=${encodeURIComponent(traceUrl)}`;Why it was refuted
This is a user-run trace-viewer CLI. Serving the trace on 127.0.0.1 and opening the Vibium player is the tool's purpose, so it is a declared core capability rather than a covert exfil channel.
Data exfiltration
criticalRefutedlow confidenceThe BrowserStack upload_app tool streams any agent-supplied path to BrowserStack with no .apk/.ipa validation, so it could upload arbitrary local files off-host; the tool does not declare this.
const stream = createReadStream(path);
Why it was refuted
Uploading a local file to BrowserStack App Automate is the tool's declared core function. The destination is the fixed vendor API using the user's own credentials, so it is not an exfil channel.
Data exfiltration
criticalRefutedlow confidenceThe cloud-provider upload_app tool reads any agent-supplied path into memory and uploads it to a third-party cloud with no extension or content check, even though the tool claims to upload only .apk/.ipa files.
const fileBuffer = readFileSync(path);
Why it was refuted
The upload_app tool declares that it uploads a local app file to a named cloud provider. The sink is the provider's fixed API with the user's own auth, which is the declared core capability and not covert exfiltration.
Code execution
criticalRefutedmedium confidenceexecute_electron_script runs agent-supplied JavaScript in the Electron main process via new Function. This is openly declared as privileged arbitrary execution, but it is a powerful capability.
new Function('electron', 'args', source)(electron, values)Why it was refuted
The tool openly declares arbitrary JavaScript execution in the Electron main process, marks it destructive, and warns to use trusted scripts only. This is its declared core capability.
Credential access
criticalRefutedmedium confidenceThe launch_chrome tool with copyProfileFiles=true copies the user's real Chrome profile (Local State and Default dir with cookies/logins) into a temp debug dir with remote debugging enabled; this is disclosed in the tool description and opt-in, but gives the agent access to logged-in sessions.
cpSync(join(srcDir, 'Default'), join(USER_DATA_DIR, 'Default'), { recursive: true })Why it was refuted
The profile copy is opt-in (default false), declared in the tool description, and goes to a local temp dir for attaching to a logged-in session. That is the declared core capability, with no outbound sink.
Supply chain
highRefutedlow confidenceThe docs tool fetches a mutable remote corpus from webdriver.io over the network, caches it in ~/.wdio-mcp, and serves excerpts to the agent as documentation, so a compromised upstream could inject instructions; this looks like an honest docs-search feature.
export const DOCS_URL = 'https://webdriver.io/llms-full.txt';
Why it was refuted
Fetching the official WebdriverIO docs corpus for a docs-search feature is the tool's core purpose. It is a validated fetch with a marker check, it is cached locally, and there is no instruction or execution path.
Supply chain
mediumRefutedlow confidencepackage.json declares an undeclared 'prepare: husky' lifecycle script that runs on install/pack in the dev repo; it is a standard git-hooks dev tool and not a consumer-facing install hook, so risk is low.
"prepare": "husky"
Why it was refuted
The husky prepare script is a standard git-hooks dev tool that runs only in the dev repo; the published package ships only lib and README, and it contains no payload.