MCP-first browser primitives for AI agents — real eyes and hands on the web. Local-first. Vendor-agnostic.
Drift inferred · capture-to-capture
- HIGH code analysis flagged committed secret, dynamic code execution in xcodethink/pixelcheck
- HIGH code analysis flagged committed secret in xcodethink/pixelcheck
- HIGH code analysis flagged committed secret in xcodethink/pixelcheck
- HIGH code analysis flagged committed secret in xcodethink/pixelcheck
transport stdio · http
verified
reported
listed in the official MCP registry counts 0 tools · 0 res
· 0 prompts
permission surface via code analysis
No tools enumerated yet for this server.
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 2a35c25 · analyzer v33 · 20h ago
danger signals7
- dynamic code execution new Function() xcodethink-pixelcheck-2a35c25/tests/html-escape.test.ts :34
const factory = new Function( - suspicious endpoint api.telegram.org xcodethink-pixelcheck-2a35c25/src/core/notify.ts :64
await fetch(`https://api.telegram.org/bot${token}/sendMessage`, { - suspicious endpoint 169.254.169.254 (cloud metadata) xcodethink-pixelcheck-2a35c25/tests/mcp-tools-ssrf.test.ts :40
"http://169.254.169.254/latest/meta-data/", // AWS IMDS (link-local) - suspicious endpoint api.telegram.org xcodethink-pixelcheck-2a35c25/tests/notify.test.ts :121
expect(url).toBe("https://api.telegram.org/botBOT_T/sendMessage"); - committed secret Anthropic key xcodethink-pixelcheck-2a35c25/src/cli.ts :1490
sk-ant…(31 chars, redacted) - committed secret Anthropic key xcodethink-pixelcheck-2a35c25/tests/doctor.test.ts :327
sk-ant…(33 chars, redacted) - credential in logs credential in log xcodethink-pixelcheck-2a35c25/tests/logger.test.ts :200
log.info({ apiKey: "sk-ant-secret-12345" }, "calling API");
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 291
filesystem 134
- fs xcodethink-pixelcheck-2a35c25/scenarios/handlers/install-extension.js :34
import * as fs from "node:fs"; - fs (weak) xcodethink-pixelcheck-2a35c25/scripts/check-english-only.ts :26
import * as fs from "node:fs"; - fs (weak) xcodethink-pixelcheck-2a35c25/scripts/check-no-console.ts :23
import * as fs from "node:fs"; - fs (weak) xcodethink-pixelcheck-2a35c25/scripts/check-no-internal-refs.ts :50
import * as fs from "node:fs"; - fs (weak) xcodethink-pixelcheck-2a35c25/scripts/check-perf.ts :21
import * as fs from "node:fs"; - fs (weak) xcodethink-pixelcheck-2a35c25/scripts/check-report-a11y.ts :36
import * as fs from "node:fs"; - fs (weak) xcodethink-pixelcheck-2a35c25/scripts/check-vendor-drift.ts :33
import * as fs from "node:fs"; - fs (weak) xcodethink-pixelcheck-2a35c25/scripts/check-vendor-integrity.ts :37
import * as fs from "node:fs"; - fs (weak) xcodethink-pixelcheck-2a35c25/scripts/chmod-bins.mjs :23
import * as fs from "node:fs"; - fs (weak) xcodethink-pixelcheck-2a35c25/scripts/export-result-schemas.ts :16
import * as fs from "node:fs"; - fs (weak) xcodethink-pixelcheck-2a35c25/scripts/gen-diff-fixture.ts :17
import * as fs from "node:fs"; - fs (weak) xcodethink-pixelcheck-2a35c25/scripts/gen-history-fixture.ts :18
import * as fs from "node:fs";
show 28 more
- fs (weak) xcodethink-pixelcheck-2a35c25/scripts/gen-sarif-fixture.ts :21
import * as fs from "node:fs"; - fs (weak) xcodethink-pixelcheck-2a35c25/scripts/measure-injection-asr.ts :30
import * as fs from "node:fs"; - fs (weak) xcodethink-pixelcheck-2a35c25/scripts/measure-memory.ts :27
import * as fs from "node:fs"; - fs (weak) xcodethink-pixelcheck-2a35c25/src/benchmark/executor.ts :10
import * as fs from "node:fs"; - fs (weak) xcodethink-pixelcheck-2a35c25/src/benchmark/loader.ts :10
import * as fs from "node:fs"; - fs (weak) xcodethink-pixelcheck-2a35c25/src/benchmark/runner.ts :11
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/calibration/runner.ts :19
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/cli.ts :6
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/commands/doctor.ts :23
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/commands/explain.ts :19
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/commands/init-interactive.ts :25
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/core/artifacts-prune.ts :43
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/core/browser-install.ts :24
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/core/checkpoint.ts :15
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/core/ci-reporters.ts :29
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/core/config.ts :1
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/core/consent.ts :35
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/core/cost-guard.ts :48
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/core/db-migrate.ts :41
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/core/debug-log.ts :21
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/core/file-lock.ts :39
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/core/history.ts :16
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/core/min-repro.ts :9
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/core/persona.ts :1
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/core/plugin.ts :23
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/core/primitives/act.ts :34
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/core/primitives/compare.ts :29
import * as fs from "node:fs"; - fs xcodethink-pixelcheck-2a35c25/src/core/primitives/diagnose.ts :42
import * as fs from "node:fs";
94 more not shown — this panel samples each group; the count above is the real total.
shell / exec 8
- shell (weak) xcodethink-pixelcheck-2a35c25/scripts/check-english-only.ts :25
import { execFileSync } from "node:child_process"; - shell (weak) xcodethink-pixelcheck-2a35c25/scripts/check-no-internal-refs.ts :49
import { execFileSync } from "node:child_process"; - shell xcodethink-pixelcheck-2a35c25/src/core/browser-install.ts :28
import { execFileSync } from "node:child_process"; - shell (weak) xcodethink-pixelcheck-2a35c25/tests/cost-guard-concurrency.test.ts :5
import { spawn } from "node:child_process"; - shell (weak) xcodethink-pixelcheck-2a35c25/tests/integration/file-lock-race.test.ts :31
import { spawnSync } from "node:child_process"; - shell (weak) xcodethink-pixelcheck-2a35c25/tests/mcp-concurrency-e2e.test.ts :22
import { spawn } from "node:child_process"; - shell (weak) xcodethink-pixelcheck-2a35c25/tests/memory.test.ts :132
const { spawn } = await import("node:child_process"); - shell (weak) xcodethink-pixelcheck-2a35c25/tests/perf.bench.ts :7
* validation / i18n lookup. NOT covered: real Chromium spawn (would
network 14
- net xcodethink-pixelcheck-2a35c25/src/commands/doctor.ts :26
import { request } from "node:https"; - net xcodethink-pixelcheck-2a35c25/src/core/browser-install.ts :27
import * as https from "node:https"; - net xcodethink-pixelcheck-2a35c25/src/core/email.ts :45
const res = await fetch(`${BASE}${path}`, { - net xcodethink-pixelcheck-2a35c25/src/core/llm-provider.ts :303
response = await fetch(url, { - net xcodethink-pixelcheck-2a35c25/src/core/notify.ts :29
await fetch(webhook, { - net xcodethink-pixelcheck-2a35c25/src/core/stagehand-wrapper.ts :3
import * as net from "node:net"; - net xcodethink-pixelcheck-2a35c25/src/core/url-preflight.ts :101
const res = await fetch(target.url, { - net xcodethink-pixelcheck-2a35c25/src/observer/dashboard.ts :576
fetch(auth('/api/timeline')), - net xcodethink-pixelcheck-2a35c25/src/observer/grid-dashboard.ts :159
const res = await fetch(auth('/api/grid')); - net xcodethink-pixelcheck-2a35c25/src/observer/server.ts :8
import { createServer, type Server, type IncomingMessage, type ServerResponse } from "node:http"; - net (weak) xcodethink-pixelcheck-2a35c25/tests/fixtures/test-site/server.ts :13
import * as http from "node:http"; - net (weak) xcodethink-pixelcheck-2a35c25/tests/observer-auth.test.ts :2
import type { Server } from "node:http";
show 2 more
- net (weak) xcodethink-pixelcheck-2a35c25/tests/observer-server.test.ts :3
import type { Server } from "node:http"; - net (weak) xcodethink-pixelcheck-2a35c25/tests/url-preflight.test.ts :3
* Mocks global fetch (test-scoped) so no real network is touched.
secrets 22
- secrets (weak) xcodethink-pixelcheck-2a35c25/scripts/compare-critic-models.ts :77
if (!process.env.ANTHROPIC_API_KEY) { - secrets (weak) xcodethink-pixelcheck-2a35c25/scripts/measure-injection-asr.ts :99
if (!process.env.ANTHROPIC_API_KEY) { - secrets xcodethink-pixelcheck-2a35c25/src/cli.ts :1489
if (!process.env.ANTHROPIC_API_KEY) { - secrets xcodethink-pixelcheck-2a35c25/src/commands/doctor.ts :141
const key = process.env.ANTHROPIC_API_KEY; - secrets xcodethink-pixelcheck-2a35c25/src/commands/init-interactive.ts :131
if (!process.env.ANTHROPIC_API_KEY) { - secrets xcodethink-pixelcheck-2a35c25/src/core/llm.ts :21
const key = process.env.ANTHROPIC_API_KEY; - secrets xcodethink-pixelcheck-2a35c25/src/core/notify.ts :46
const token = process.env.TELEGRAM_BOT_TOKEN; - secrets xcodethink-pixelcheck-2a35c25/src/core/primitives/act.ts :756
apiKey: process.env.ANTHROPIC_API_KEY, - secrets xcodethink-pixelcheck-2a35c25/src/core/primitives/extract.ts :919
apiKey: process.env.ANTHROPIC_API_KEY, - secrets xcodethink-pixelcheck-2a35c25/src/core/runner.ts :402
apiKey: process.env.ANTHROPIC_API_KEY, - secrets (weak) xcodethink-pixelcheck-2a35c25/tests/computer-use.test.ts :125
process.env.ANTHROPIC_API_KEY = "sk-ant-test-key"; - secrets (weak) xcodethink-pixelcheck-2a35c25/tests/doctor.test.ts :27
delete process.env.ANTHROPIC_API_KEY;
show 10 more
- secrets (weak) xcodethink-pixelcheck-2a35c25/tests/instruction-mutator-extended.test.ts :84
process.env.ANTHROPIC_API_KEY = "sk-test-x"; - secrets (weak) xcodethink-pixelcheck-2a35c25/tests/integration/llm-cassettes.test.ts :73
if (MODE === "replay" && !process.env.ANTHROPIC_API_KEY) { - secrets (weak) xcodethink-pixelcheck-2a35c25/tests/integration/playwright/stagehand-smoke.test.ts :49
const SHOULD_RUN = Boolean(process.env.ANTHROPIC_API_KEY); - secrets (weak) xcodethink-pixelcheck-2a35c25/tests/integration/prompt-injection-live.test.ts :32
const SHOULD_RUN = Boolean(process.env.ANTHROPIC_API_KEY); - secrets (weak) xcodethink-pixelcheck-2a35c25/tests/list-capabilities.test.ts :206
const prev = process.env.ANTHROPIC_API_KEY; - secrets (weak) xcodethink-pixelcheck-2a35c25/tests/llm-provider.test.ts :74
process.env.ANTHROPIC_API_KEY = "sk-test-provider"; - secrets (weak) xcodethink-pixelcheck-2a35c25/tests/llm.test.ts :97
delete process.env.ANTHROPIC_API_KEY; - secrets (weak) xcodethink-pixelcheck-2a35c25/tests/notify.test.ts :40
delete process.env.TELEGRAM_BOT_TOKEN; - secrets (weak) xcodethink-pixelcheck-2a35c25/tests/persona.test.ts :224
process.env.TEST_USER_PASSWORD = "swordfish"; - secrets (weak) xcodethink-pixelcheck-2a35c25/tests/secrets.test.ts :112
delete process.env.ANTHROPIC_API_KEY;
database 7
- db xcodethink-pixelcheck-2a35c25/src/agent/memory.ts :22
import type Database from "better-sqlite3"; - db xcodethink-pixelcheck-2a35c25/src/agent/plan-cache.ts :27
import type Database from "better-sqlite3"; - db xcodethink-pixelcheck-2a35c25/src/core/db-migrate.ts :43
import Database from "better-sqlite3"; - db xcodethink-pixelcheck-2a35c25/src/core/history.ts :17
import type Database from "better-sqlite3"; - db xcodethink-pixelcheck-2a35c25/src/core/result-cache.ts :59
import type Database from "better-sqlite3"; - db (weak) xcodethink-pixelcheck-2a35c25/tests/db-migrate.test.ts :5
import Database from "better-sqlite3"; - db (weak) xcodethink-pixelcheck-2a35c25/tests/result-cache.test.ts :223
const Database = require("better-sqlite3");
install hooks 2
- postinstall xcodethink-pixelcheck-2a35c25/package.json :52
node scripts/postinstall.mjs - prepublishOnly xcodethink-pixelcheck-2a35c25/package.json :53
npm run build && npm test
declared dependencies 37
- @modelcontextprotocol/sdk@^1.29.0
- @anthropic-ai/sdk@^0.94.0
- @browserbasehq/stagehand@^3.3.0
- axe-core@^4.11.4
- better-sqlite3@~12.11.1
- chalk@^5.3.0
- commander@^14.0.3
- dotenv@^17.4.2
- odiff-bin@^4.3.8
- ora@^9.4.0
- p-limit@^7.3.0
- pino@^10.3.1
show 25 more
- pino-pretty@^13.1.3
- playwright@^1.49.0
- playwright-core@^1.49.0
- sharp@^0.35.3
- ws@^8.20.0
- yaml@^2.6.0
- zod@^3.25.76
- @cyclonedx/cyclonedx-npm@^6.0.0
- @eslint/js@^10.0.1
- @playwright/test@^1.59.1
- @types/better-sqlite3@^7.6.13
- @types/node@^22.19.17
- @types/ws@^8.18.1
- @vitest/coverage-v8@^4.1.5
- ajv@^8.20.0
- ajv-formats@^3.0.1
- eslint@^10.3.0
- license-checker@^25.0.1
- nock@^14.0.14
- tsx@^4.19.0
- typedoc@^0.28.19
- typescript@^6.0.3
- typescript-eslint@^8.59.2
- vitest@^4.1.4
- zod-to-json-schema@^3.25.2
obfuscation 3
- dynamic require()/import() xcodethink-pixelcheck-2a35c25/tests/cost-guard-concurrency.test.ts :193
const { CostGuard } = require(${JSON.stringify( - dynamic require()/import() xcodethink-pixelcheck-2a35c25/tests/integration/file-lock-race.test.ts :62
const { withFileLockSync } = require(${JSON.stringify( - dynamic require()/import() xcodethink-pixelcheck-2a35c25/tests/memory.test.ts :136
const { AgentMemory } = require(${JSON.stringify(
perm:untrusted 1
- untrusted (weak) xcodethink-pixelcheck-2a35c25/tests/observer-auth.test.ts :102
const body = await (await fetch(`${base}/api/session/leaky-session`)).text();