@_nazmiforreal/agent-browser-mcp 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/.mcp.json +12 -0
  2. package/AGENTS.md +100 -0
  3. package/README.md +502 -0
  4. package/dist/browsers/discover.d.ts +13 -0
  5. package/dist/browsers/discover.d.ts.map +1 -0
  6. package/dist/browsers/discover.js +54 -0
  7. package/dist/browsers/discover.js.map +1 -0
  8. package/dist/browsers/env.d.ts +10 -0
  9. package/dist/browsers/env.d.ts.map +1 -0
  10. package/dist/browsers/env.js +72 -0
  11. package/dist/browsers/env.js.map +1 -0
  12. package/dist/browsers/index.d.ts +5 -0
  13. package/dist/browsers/index.d.ts.map +1 -0
  14. package/dist/browsers/index.js +5 -0
  15. package/dist/browsers/index.js.map +1 -0
  16. package/dist/browsers/installer.d.ts +13 -0
  17. package/dist/browsers/installer.d.ts.map +1 -0
  18. package/dist/browsers/installer.js +59 -0
  19. package/dist/browsers/installer.js.map +1 -0
  20. package/dist/browsers/registry.d.ts +14 -0
  21. package/dist/browsers/registry.d.ts.map +1 -0
  22. package/dist/browsers/registry.js +119 -0
  23. package/dist/browsers/registry.js.map +1 -0
  24. package/dist/cli.d.ts +3 -0
  25. package/dist/cli.d.ts.map +1 -0
  26. package/dist/cli.js +153 -0
  27. package/dist/cli.js.map +1 -0
  28. package/dist/index.d.ts +3 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +25 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/tools/browser.d.ts +3 -0
  33. package/dist/tools/browser.d.ts.map +1 -0
  34. package/dist/tools/browser.js +885 -0
  35. package/dist/tools/browser.js.map +1 -0
  36. package/dist/tools/executor.d.ts +9 -0
  37. package/dist/tools/executor.d.ts.map +1 -0
  38. package/dist/tools/executor.js +1067 -0
  39. package/dist/tools/executor.js.map +1 -0
  40. package/dist/tools/index.d.ts +3 -0
  41. package/dist/tools/index.d.ts.map +1 -0
  42. package/dist/tools/index.js +3 -0
  43. package/dist/tools/index.js.map +1 -0
  44. package/package.json +60 -0
  45. package/tests/browser-tools.test.ts +329 -0
  46. package/tests/executor.test.ts +356 -0
  47. package/tests/integration.test.ts +467 -0
  48. package/tests/server.test.ts +224 -0
  49. package/vitest.config.ts +15 -0
@@ -0,0 +1,54 @@
1
+ import { BROWSERS, resolveBinaryPath } from "./registry.js";
2
+ import { getActiveBrowser, getBrowserPath, setActiveBrowser, setBrowserPath } from "./env.js";
3
+ export function discoverBrowsers() {
4
+ const results = [];
5
+ for (const browser of BROWSERS) {
6
+ const envPath = getBrowserPath(browser.envKey);
7
+ if (envPath) {
8
+ results.push({ name: browser.name, path: envPath, source: "env" });
9
+ continue;
10
+ }
11
+ const autoPath = resolveBinaryPath(browser);
12
+ if (autoPath) {
13
+ results.push({ name: browser.name, path: autoPath, source: "auto" });
14
+ }
15
+ }
16
+ return results;
17
+ }
18
+ export function discoverActiveBrowser() {
19
+ const activeName = getActiveBrowser();
20
+ if (activeName) {
21
+ const browser = BROWSERS.find((b) => b.name === activeName);
22
+ if (browser) {
23
+ const envPath = getBrowserPath(browser.envKey);
24
+ if (envPath) {
25
+ return { name: browser.name, path: envPath, source: "env" };
26
+ }
27
+ const autoPath = resolveBinaryPath(browser);
28
+ if (autoPath) {
29
+ return { name: browser.name, path: autoPath, source: "auto" };
30
+ }
31
+ }
32
+ }
33
+ const discovered = discoverBrowsers();
34
+ return discovered.length > 0 ? discovered[0] : null;
35
+ }
36
+ export function selectBrowser(name) {
37
+ const browser = BROWSERS.find((b) => b.name === name);
38
+ if (!browser) {
39
+ return { success: false, error: `Unknown browser: ${name}. Available: ${BROWSERS.map((b) => b.name).join(", ")}` };
40
+ }
41
+ const envPath = getBrowserPath(browser.envKey);
42
+ if (envPath) {
43
+ setActiveBrowser(name);
44
+ return { success: true, path: envPath };
45
+ }
46
+ const autoPath = resolveBinaryPath(browser);
47
+ if (autoPath) {
48
+ setBrowserPath(browser.envKey, autoPath);
49
+ setActiveBrowser(name);
50
+ return { success: true, path: autoPath };
51
+ }
52
+ return { success: false, error: `Browser "${name}" is not installed. Run: agent-browser-mcp -i ${name}` };
53
+ }
54
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/browsers/discover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare function getEnvPath(): string;
2
+ export declare function ensureEnvFile(): void;
3
+ export declare function loadEnv(): Record<string, string>;
4
+ export declare function getEnvValue(key: string): string | undefined;
5
+ export declare function setEnvValue(key: string, value: string): void;
6
+ export declare function getActiveBrowser(): string | undefined;
7
+ export declare function setActiveBrowser(name: string): void;
8
+ export declare function getBrowserPath(envKey: string): string | undefined;
9
+ export declare function setBrowserPath(envKey: string, path: string): void;
10
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/browsers/env.ts"],"names":[],"mappings":"AAOA,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAQpC;AAED,wBAAgB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBhD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG3D;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAiB5D;AAED,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAErD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEnD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEjE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAEjE"}
@@ -0,0 +1,72 @@
1
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
2
+ import { join } from "path";
3
+ import { homedir } from "os";
4
+ const ENV_FILE = join(homedir(), ".agent-browser-mcp", ".env");
5
+ const ACTIVE_BROWSER_KEY = "ACTIVE_BROWSER";
6
+ export function getEnvPath() {
7
+ return ENV_FILE;
8
+ }
9
+ export function ensureEnvFile() {
10
+ const dir = join(homedir(), ".agent-browser-mcp");
11
+ if (!existsSync(dir)) {
12
+ mkdirSync(dir, { recursive: true });
13
+ }
14
+ if (!existsSync(ENV_FILE)) {
15
+ writeFileSync(ENV_FILE, "# agent-browser-mcp browser configuration\n");
16
+ }
17
+ }
18
+ export function loadEnv() {
19
+ ensureEnvFile();
20
+ const result = {};
21
+ try {
22
+ const content = readFileSync(ENV_FILE, "utf-8");
23
+ for (const line of content.split("\n")) {
24
+ const trimmed = line.trim();
25
+ if (!trimmed || trimmed.startsWith("#"))
26
+ continue;
27
+ const eqIdx = trimmed.indexOf("=");
28
+ if (eqIdx === -1)
29
+ continue;
30
+ const key = trimmed.slice(0, eqIdx).trim();
31
+ const value = trimmed.slice(eqIdx + 1).trim();
32
+ result[key] = value;
33
+ }
34
+ }
35
+ catch { }
36
+ return result;
37
+ }
38
+ export function getEnvValue(key) {
39
+ const env = loadEnv();
40
+ return env[key] || process.env[key];
41
+ }
42
+ export function setEnvValue(key, value) {
43
+ ensureEnvFile();
44
+ const content = readFileSync(ENV_FILE, "utf-8");
45
+ const lines = content.split("\n");
46
+ let found = false;
47
+ for (let i = 0; i < lines.length; i++) {
48
+ const trimmed = lines[i].trim();
49
+ if (trimmed.startsWith(key + "=")) {
50
+ lines[i] = `${key}=${value}`;
51
+ found = true;
52
+ break;
53
+ }
54
+ }
55
+ if (!found) {
56
+ lines.push(`${key}=${value}`);
57
+ }
58
+ writeFileSync(ENV_FILE, lines.join("\n"));
59
+ }
60
+ export function getActiveBrowser() {
61
+ return getEnvValue(ACTIVE_BROWSER_KEY);
62
+ }
63
+ export function setActiveBrowser(name) {
64
+ setEnvValue(ACTIVE_BROWSER_KEY, name);
65
+ }
66
+ export function getBrowserPath(envKey) {
67
+ return getEnvValue(envKey);
68
+ }
69
+ export function setBrowserPath(envKey, path) {
70
+ setEnvValue(envKey, path);
71
+ }
72
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/browsers/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAkB,SAAS,EAAE,MAAM,IAAI,CAAC;AACxF,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,oBAAoB,EAAE,MAAM,CAAC,CAAC;AAC/D,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAE5C,MAAM,UAAU,UAAU;IACxB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,aAAa,CAAC,QAAQ,EAAE,6CAA6C,CAAC,CAAC;IACzE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,aAAa,EAAE,CAAC;IAChB,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAClD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,KAAK,KAAK,CAAC,CAAC;gBAAE,SAAS;YAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,KAAa;IACpD,aAAa,EAAE,CAAC;IAChB,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;YAC7B,KAAK,GAAG,IAAI,CAAC;YACb,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;IAChC,CAAC;IACD,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,WAAW,CAAC,kBAAkB,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,WAAW,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,IAAY;IACzD,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { BROWSERS, BrowserDef, getBrowserByName, getBrowserNames, resolveBinaryPath } from "./registry.js";
2
+ export { discoverBrowsers, discoverActiveBrowser, selectBrowser, DiscoveredBrowser } from "./discover.js";
3
+ export { installBrowser, listBrowsers, InstallResult } from "./installer.js";
4
+ export { loadEnv, getEnvValue, setEnvValue, getActiveBrowser, setActiveBrowser, getBrowserPath, setBrowserPath, getEnvPath, ensureEnvFile } from "./env.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browsers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC3G,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC1G,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { BROWSERS, getBrowserByName, getBrowserNames, resolveBinaryPath } from "./registry.js";
2
+ export { discoverBrowsers, discoverActiveBrowser, selectBrowser } from "./discover.js";
3
+ export { installBrowser, listBrowsers } from "./installer.js";
4
+ export { loadEnv, getEnvValue, setEnvValue, getActiveBrowser, setActiveBrowser, getBrowserPath, setBrowserPath, getEnvPath, ensureEnvFile } from "./env.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browsers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAc,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC3G,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,aAAa,EAAqB,MAAM,eAAe,CAAC;AAC1G,OAAO,EAAE,cAAc,EAAE,YAAY,EAAiB,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface InstallResult {
2
+ success: boolean;
3
+ path?: string;
4
+ error?: string;
5
+ }
6
+ export declare function installBrowser(name: string): InstallResult;
7
+ export declare function listBrowsers(): Array<{
8
+ name: string;
9
+ description: string;
10
+ installed: boolean;
11
+ path?: string;
12
+ }>;
13
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/browsers/installer.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CA6C1D;AAED,wBAAgB,YAAY,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAU9G"}
@@ -0,0 +1,59 @@
1
+ import { execSync } from "child_process";
2
+ import { BROWSERS, resolveBinaryPath } from "./registry.js";
3
+ import { setBrowserPath, setActiveBrowser } from "./env.js";
4
+ export function installBrowser(name) {
5
+ const browser = BROWSERS.find((b) => b.name === name);
6
+ if (!browser) {
7
+ return { success: false, error: `Unknown browser: ${name}. Available: ${BROWSERS.map((b) => b.name).join(", ")}` };
8
+ }
9
+ const existing = resolveBinaryPath(browser);
10
+ if (existing) {
11
+ setBrowserPath(browser.envKey, existing);
12
+ setActiveBrowser(name);
13
+ return { success: true, path: existing };
14
+ }
15
+ console.error(`Installing ${browser.name}...`);
16
+ console.error(`Command: ${browser.installCmd}`);
17
+ try {
18
+ execSync(browser.installCmd, {
19
+ stdio: "inherit",
20
+ timeout: 300000,
21
+ });
22
+ }
23
+ catch (err) {
24
+ if (browser.installCmdAlt) {
25
+ console.error(`Retrying with alternate command...`);
26
+ try {
27
+ execSync(browser.installCmdAlt, {
28
+ stdio: "inherit",
29
+ timeout: 300000,
30
+ });
31
+ }
32
+ catch (err2) {
33
+ return { success: false, error: `Install failed: ${err2.message}` };
34
+ }
35
+ }
36
+ else {
37
+ return { success: false, error: `Install failed: ${err.message}` };
38
+ }
39
+ }
40
+ const binaryPath = resolveBinaryPath(browser);
41
+ if (binaryPath) {
42
+ setBrowserPath(browser.envKey, binaryPath);
43
+ setActiveBrowser(name);
44
+ return { success: true, path: binaryPath };
45
+ }
46
+ return { success: false, error: `Install succeeded but binary not found at expected paths: ${browser.binaryPaths.join(", ")}` };
47
+ }
48
+ export function listBrowsers() {
49
+ return BROWSERS.map((b) => {
50
+ const path = resolveBinaryPath(b);
51
+ return {
52
+ name: b.name,
53
+ description: b.description,
54
+ installed: !!path,
55
+ path: path || undefined,
56
+ };
57
+ });
58
+ }
59
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/browsers/installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface BrowserDef {
2
+ name: string;
3
+ description: string;
4
+ installCmd: string;
5
+ installCmdAlt?: string;
6
+ binaryPaths: string[];
7
+ envKey: string;
8
+ }
9
+ export declare const BROWSERS: BrowserDef[];
10
+ export declare function getBrowserByName(name: string): BrowserDef | undefined;
11
+ export declare function getBrowserNames(): string[];
12
+ export declare function isVersionedPath(p: string): boolean;
13
+ export declare function resolveBinaryPath(browser: BrowserDef): string | null;
14
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/browsers/registry.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AA6BD,eAAO,MAAM,QAAQ,EAAE,UAAU,EAiEhC,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAErE;AAED,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAWpE"}
@@ -0,0 +1,119 @@
1
+ import { existsSync, readdirSync } from "fs";
2
+ import { homedir } from "os";
3
+ import { join } from "path";
4
+ function expandHome(p) {
5
+ return p.replace(/^~/, homedir());
6
+ }
7
+ function findVersionedBinary(pattern) {
8
+ const parts = pattern.split("*");
9
+ const prefix = expandHome(parts[0]);
10
+ const suffix = parts[1] || "";
11
+ const lastSlash = prefix.lastIndexOf("/");
12
+ const dir = prefix.substring(0, lastSlash);
13
+ const prefixGlob = prefix.substring(lastSlash + 1);
14
+ if (!existsSync(dir))
15
+ return null;
16
+ try {
17
+ const entries = readdirSync(dir);
18
+ for (const e of entries) {
19
+ if (e.startsWith(prefixGlob)) {
20
+ const full = join(dir, e, suffix.replace(/^\//, ""));
21
+ if (existsSync(full))
22
+ return full;
23
+ }
24
+ }
25
+ }
26
+ catch { }
27
+ return null;
28
+ }
29
+ export const BROWSERS = [
30
+ {
31
+ name: "chromium",
32
+ description: "Open-source Chromium from xtradeb PPA (apt)",
33
+ installCmd: "sudo add-apt-repository -y ppa:xtradeb/apps && sudo apt-get update && sudo apt-get install -y chromium",
34
+ installCmdAlt: "sudo apt-get install -y chromium",
35
+ binaryPaths: [
36
+ "/usr/bin/chromium",
37
+ "/usr/bin/chromium-browser",
38
+ "/snap/bin/chromium",
39
+ ],
40
+ envKey: "BROWSER_PATH_CHROMIUM",
41
+ },
42
+ {
43
+ name: "cloakbrowser",
44
+ description: "Stealth Chromium with 58 C++ fingerprint patches (npm)",
45
+ installCmd: "npm install -g cloakbrowser && cloakbrowser install",
46
+ binaryPaths: [
47
+ "~/.cloakbrowser/chromium-*/chrome",
48
+ ],
49
+ envKey: "BROWSER_PATH_CLOAKBROWSER",
50
+ },
51
+ {
52
+ name: "chrome",
53
+ description: "Google Chrome (agent-browser install)",
54
+ installCmd: "agent-browser install",
55
+ binaryPaths: [
56
+ "~/.agent-browser/browsers/chrome-*/chrome",
57
+ "/usr/bin/google-chrome",
58
+ "/usr/bin/google-chrome-stable",
59
+ "/opt/google/chrome/chrome",
60
+ ],
61
+ envKey: "BROWSER_PATH_CHROME",
62
+ },
63
+ {
64
+ name: "firefox",
65
+ description: "Mozilla Firefox (apt)",
66
+ installCmd: "sudo apt-get install -y firefox",
67
+ binaryPaths: [
68
+ "/usr/bin/firefox",
69
+ "/usr/bin/firefox-esr",
70
+ "/snap/bin/firefox",
71
+ ],
72
+ envKey: "BROWSER_PATH_FIREFOX",
73
+ },
74
+ {
75
+ name: "brave",
76
+ description: "Brave Browser (apt)",
77
+ installCmd: "sudo apt-get install -y brave-browser",
78
+ binaryPaths: [
79
+ "/usr/bin/brave-browser",
80
+ "/usr/bin/brave-browser-stable",
81
+ ],
82
+ envKey: "BROWSER_PATH_BRAVE",
83
+ },
84
+ {
85
+ name: "edge",
86
+ description: "Microsoft Edge (apt)",
87
+ installCmd: "curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /usr/share/keyrings/microsoft-edge.gpg && echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/microsoft-edge.gpg] https://packages.microsoft.com/repos/edge stable main' | sudo tee /etc/apt/sources.list.d/microsoft-edge.list && sudo apt-get update && sudo apt-get install -y microsoft-edge-stable",
88
+ binaryPaths: [
89
+ "/usr/bin/microsoft-edge",
90
+ "/usr/bin/microsoft-edge-stable",
91
+ ],
92
+ envKey: "BROWSER_PATH_EDGE",
93
+ },
94
+ ];
95
+ export function getBrowserByName(name) {
96
+ return BROWSERS.find((b) => b.name === name);
97
+ }
98
+ export function getBrowserNames() {
99
+ return BROWSERS.map((b) => b.name);
100
+ }
101
+ export function isVersionedPath(p) {
102
+ return p.includes("*");
103
+ }
104
+ export function resolveBinaryPath(browser) {
105
+ for (const p of browser.binaryPaths) {
106
+ if (isVersionedPath(p)) {
107
+ const found = findVersionedBinary(p);
108
+ if (found)
109
+ return found;
110
+ }
111
+ else {
112
+ const expanded = expandHome(p);
113
+ if (existsSync(expanded))
114
+ return expanded;
115
+ }
116
+ }
117
+ return null;
118
+ }
119
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/browsers/registry.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env node
2
+ import { installBrowser, listBrowsers } from "./browsers/installer.js";
3
+ import { discoverActiveBrowser, discoverBrowsers, selectBrowser } from "./browsers/discover.js";
4
+ import { getEnvPath } from "./browsers/env.js";
5
+ import { BROWSERS } from "./browsers/registry.js";
6
+ const args = process.argv.slice(2);
7
+ function printUsage() {
8
+ console.log(`
9
+ agent-browser-mcp - MCP server with browser management
10
+
11
+ Usage:
12
+ agent-browser-mcp Start MCP server with active browser
13
+ agent-browser-mcp -i <browser> Install a browser
14
+ agent-browser-mcp --list List all browsers and their status
15
+ agent-browser-mcp --select <browser> Select active browser
16
+ agent-browser-mcp --discover Show auto-discovered browsers
17
+ agent-browser-mcp --env Show .env file path
18
+ agent-browser-mcp --help Show this help
19
+
20
+ Options:
21
+ -i, --install <browser> Install a browser by name
22
+ -l, --list List all browsers (installed or not)
23
+ -s, --select <browser> Select the active browser
24
+ -d, --discover Show discovered browsers
25
+ -e, --env Show .env config path
26
+ -h, --help Show help
27
+
28
+ Available browsers:
29
+ ${BROWSERS.map((b) => ` ${b.name.padEnd(16)} ${b.description}`).join("\n")}
30
+
31
+ Examples:
32
+ agent-browser-mcp -i chromium Install Chromium from xtradeb PPA
33
+ agent-browser-mcp -i cloakbrowser Install stealth CloakBrowser
34
+ agent-browser-mcp --select cloakbrowser Set CloakBrowser as active
35
+ agent-browser-mcp --list Show all browsers
36
+ `);
37
+ }
38
+ function handleInstall(browserName) {
39
+ console.error(`Installing ${browserName}...`);
40
+ const result = installBrowser(browserName);
41
+ if (result.success) {
42
+ console.log(`✓ ${browserName} installed successfully`);
43
+ console.log(` Binary: ${result.path}`);
44
+ console.log(` Config: ${getEnvPath()}`);
45
+ }
46
+ else {
47
+ console.error(`✗ Failed to install ${browserName}: ${result.error}`);
48
+ process.exit(1);
49
+ }
50
+ }
51
+ function handleList() {
52
+ const browsers = listBrowsers();
53
+ const active = discoverActiveBrowser();
54
+ console.log("\nAvailable browsers:\n");
55
+ for (const b of browsers) {
56
+ const isActive = active?.name === b.name;
57
+ const status = b.installed ? "✓ installed" : "✗ not installed";
58
+ const marker = isActive ? " [ACTIVE]" : "";
59
+ const pathInfo = b.path ? ` → ${b.path}` : "";
60
+ console.log(` ${b.name.padEnd(16)} ${status}${marker}${pathInfo}`);
61
+ }
62
+ console.log(`\nConfig: ${getEnvPath()}\n`);
63
+ }
64
+ function handleSelect(browserName) {
65
+ const result = selectBrowser(browserName);
66
+ if (result.success) {
67
+ console.log(`✓ Active browser set to: ${browserName}`);
68
+ console.log(` Binary: ${result.path}`);
69
+ }
70
+ else {
71
+ console.error(`✗ ${result.error}`);
72
+ process.exit(1);
73
+ }
74
+ }
75
+ function handleDiscover() {
76
+ const browsers = discoverBrowsers();
77
+ const active = discoverActiveBrowser();
78
+ console.log("\nDiscovered browsers:\n");
79
+ if (browsers.length === 0) {
80
+ console.log(" No browsers found. Install one with: agent-browser-mcp -i <browser>");
81
+ }
82
+ else {
83
+ for (const b of browsers) {
84
+ const isActive = active?.name === b.name;
85
+ const marker = isActive ? " [ACTIVE]" : "";
86
+ const source = b.source === "env" ? "(from .env)" : "(auto-detected)";
87
+ console.log(` ${b.name.padEnd(16)} ${b.path} ${source}${marker}`);
88
+ }
89
+ }
90
+ console.log("");
91
+ }
92
+ async function startMcpServer() {
93
+ const active = discoverActiveBrowser();
94
+ if (active) {
95
+ process.env.AGENT_BROWSER_EXECUTABLE_PATH = active.path;
96
+ console.error(`[browser-manager] Active: ${active.name} → ${active.path}`);
97
+ }
98
+ else {
99
+ console.error("[browser-manager] No browser detected. Using agent-browser default.");
100
+ }
101
+ const { main } = await import("./index.js");
102
+ await main();
103
+ }
104
+ // Parse arguments
105
+ if (args.includes("--help") || args.includes("-h")) {
106
+ printUsage();
107
+ process.exit(0);
108
+ }
109
+ if (args.length === 0) {
110
+ // No args: start MCP server
111
+ startMcpServer().catch((error) => {
112
+ console.error("Fatal error:", error);
113
+ process.exit(1);
114
+ });
115
+ }
116
+ else if (args.includes("-i") || args.includes("--install")) {
117
+ const idx = args.indexOf("-i") !== -1 ? args.indexOf("-i") : args.indexOf("--install");
118
+ const browserName = args[idx + 1];
119
+ if (!browserName) {
120
+ console.error("Error: -i requires a browser name");
121
+ process.exit(1);
122
+ }
123
+ handleInstall(browserName);
124
+ process.exit(0);
125
+ }
126
+ if (args.includes("-l") || args.includes("--list")) {
127
+ handleList();
128
+ process.exit(0);
129
+ }
130
+ if (args.includes("-s") || args.includes("--select")) {
131
+ const idx = args.indexOf("-s") !== -1 ? args.indexOf("-s") : args.indexOf("--select");
132
+ const browserName = args[idx + 1];
133
+ if (!browserName) {
134
+ console.error("Error: --select requires a browser name");
135
+ process.exit(1);
136
+ }
137
+ handleSelect(browserName);
138
+ process.exit(0);
139
+ }
140
+ if (args.includes("-d") || args.includes("--discover")) {
141
+ handleDiscover();
142
+ process.exit(0);
143
+ }
144
+ if (args.includes("-e") || args.includes("--env")) {
145
+ console.log(getEnvPath());
146
+ process.exit(0);
147
+ }
148
+ // Default: start MCP server
149
+ startMcpServer().catch((error) => {
150
+ console.error("Fatal error:", error);
151
+ process.exit(1);
152
+ });
153
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export declare function main(): Promise<void>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAaA,wBAAsB,IAAI,kBAIzB"}
package/dist/index.js ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { registerBrowserTools } from "./tools/browser.js";
5
+ const server = new McpServer({
6
+ name: "agent-browser-mcp",
7
+ version: "0.2.0",
8
+ });
9
+ registerBrowserTools(server);
10
+ export async function main() {
11
+ const transport = new StdioServerTransport();
12
+ await server.connect(transport);
13
+ console.error("Agent Browser MCP server running on stdio");
14
+ }
15
+ const isMainModule = process.argv[1] && (process.argv[1].endsWith("/index.js") ||
16
+ process.argv[1].endsWith("\\index.js") ||
17
+ process.argv[1].endsWith("/cli.js") ||
18
+ process.argv[1].endsWith("\\cli.js"));
19
+ if (isMainModule) {
20
+ main().catch((error) => {
21
+ console.error("Fatal error:", error);
22
+ process.exit(1);
23
+ });
24
+ }
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,mBAAmB;IACzB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CACrC,CAAC;AAEF,IAAI,YAAY,EAAE,CAAC;IACjB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerBrowserTools(server: McpServer): void;
3
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/tools/browser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAywC5D"}