@n8n/mcp-browser 0.1.0-rc1

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 (73) hide show
  1. package/LICENSE.md +88 -0
  2. package/README.md +175 -0
  3. package/dist/adapters/playwright.d.ts +72 -0
  4. package/dist/adapters/playwright.js +684 -0
  5. package/dist/adapters/playwright.js.map +1 -0
  6. package/dist/browser-discovery.d.ts +12 -0
  7. package/dist/browser-discovery.js +219 -0
  8. package/dist/browser-discovery.js.map +1 -0
  9. package/dist/build.tsbuildinfo +1 -0
  10. package/dist/cdp-relay-protocol.d.ts +81 -0
  11. package/dist/cdp-relay-protocol.js +5 -0
  12. package/dist/cdp-relay-protocol.js.map +1 -0
  13. package/dist/cdp-relay.d.ts +52 -0
  14. package/dist/cdp-relay.js +508 -0
  15. package/dist/cdp-relay.js.map +1 -0
  16. package/dist/connection.d.ts +15 -0
  17. package/dist/connection.js +137 -0
  18. package/dist/connection.js.map +1 -0
  19. package/dist/errors.d.ts +40 -0
  20. package/dist/errors.js +83 -0
  21. package/dist/errors.js.map +1 -0
  22. package/dist/index.d.ts +7 -0
  23. package/dist/index.js +12 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/logger.d.ts +10 -0
  26. package/dist/logger.js +88 -0
  27. package/dist/logger.js.map +1 -0
  28. package/dist/server-config.d.ts +7 -0
  29. package/dist/server-config.js +45 -0
  30. package/dist/server-config.js.map +1 -0
  31. package/dist/server.d.ts +2 -0
  32. package/dist/server.js +93 -0
  33. package/dist/server.js.map +1 -0
  34. package/dist/tools/helpers.d.ts +15 -0
  35. package/dist/tools/helpers.js +77 -0
  36. package/dist/tools/helpers.js.map +1 -0
  37. package/dist/tools/index.d.ts +2 -0
  38. package/dist/tools/index.js +25 -0
  39. package/dist/tools/index.js.map +1 -0
  40. package/dist/tools/inspection.d.ts +3 -0
  41. package/dist/tools/inspection.js +205 -0
  42. package/dist/tools/inspection.js.map +1 -0
  43. package/dist/tools/interaction.d.ts +3 -0
  44. package/dist/tools/interaction.js +211 -0
  45. package/dist/tools/interaction.js.map +1 -0
  46. package/dist/tools/navigation.d.ts +3 -0
  47. package/dist/tools/navigation.js +75 -0
  48. package/dist/tools/navigation.js.map +1 -0
  49. package/dist/tools/response-envelope.d.ts +13 -0
  50. package/dist/tools/response-envelope.js +92 -0
  51. package/dist/tools/response-envelope.js.map +1 -0
  52. package/dist/tools/schemas.d.ts +236 -0
  53. package/dist/tools/schemas.js +46 -0
  54. package/dist/tools/schemas.js.map +1 -0
  55. package/dist/tools/session.d.ts +3 -0
  56. package/dist/tools/session.js +81 -0
  57. package/dist/tools/session.js.map +1 -0
  58. package/dist/tools/state.d.ts +3 -0
  59. package/dist/tools/state.js +108 -0
  60. package/dist/tools/state.js.map +1 -0
  61. package/dist/tools/tabs.d.ts +3 -0
  62. package/dist/tools/tabs.js +121 -0
  63. package/dist/tools/tabs.js.map +1 -0
  64. package/dist/tools/wait.d.ts +3 -0
  65. package/dist/tools/wait.js +39 -0
  66. package/dist/tools/wait.js.map +1 -0
  67. package/dist/types.d.ts +170 -0
  68. package/dist/types.js +15 -0
  69. package/dist/types.js.map +1 -0
  70. package/dist/utils.d.ts +8 -0
  71. package/dist/utils.js +54 -0
  72. package/dist/utils.js.map +1 -0
  73. package/package.json +48 -0
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createStateTools = createStateTools;
4
+ const zod_1 = require("zod");
5
+ const utils_1 = require("../utils");
6
+ const helpers_1 = require("./helpers");
7
+ function createStateTools(connection) {
8
+ return [browserCookies(connection), browserStorage(connection)];
9
+ }
10
+ const cookieSchema = zod_1.z.object({
11
+ name: zod_1.z.string(),
12
+ value: zod_1.z.string(),
13
+ domain: zod_1.z.string().optional(),
14
+ path: zod_1.z.string().optional(),
15
+ expires: zod_1.z.number().optional(),
16
+ httpOnly: zod_1.z.boolean().optional(),
17
+ secure: zod_1.z.boolean().optional(),
18
+ sameSite: zod_1.z.enum(['Strict', 'Lax', 'None']).optional(),
19
+ });
20
+ const cookiesGetSchema = zod_1.z.object({
21
+ action: zod_1.z.literal('get'),
22
+ url: zod_1.z.string().optional().describe('Filter cookies by URL'),
23
+ pageId: helpers_1.pageIdField,
24
+ });
25
+ const cookiesSetSchema = zod_1.z.object({
26
+ action: zod_1.z.literal('set'),
27
+ cookies: zod_1.z.array(cookieSchema).describe('Cookies to set'),
28
+ pageId: helpers_1.pageIdField,
29
+ });
30
+ const cookiesClearSchema = zod_1.z.object({
31
+ action: zod_1.z.literal('clear'),
32
+ pageId: helpers_1.pageIdField,
33
+ });
34
+ const browserCookiesSchema = zod_1.z.discriminatedUnion('action', [
35
+ cookiesGetSchema,
36
+ cookiesSetSchema,
37
+ cookiesClearSchema,
38
+ ]);
39
+ const browserCookiesOutputSchema = zod_1.z.object({
40
+ cookies: zod_1.z.array(zod_1.z.record(zod_1.z.unknown())).optional(),
41
+ set: zod_1.z.boolean().optional(),
42
+ count: zod_1.z.number().optional(),
43
+ cleared: zod_1.z.boolean().optional(),
44
+ });
45
+ function browserCookies(connection) {
46
+ return (0, helpers_1.createConnectedTool)(connection, 'browser_cookies', 'Get, set, or clear cookies.', browserCookiesSchema, async (state, input, pageId) => {
47
+ switch (input.action) {
48
+ case 'get': {
49
+ const cookies = await state.adapter.getCookies(pageId, input.url);
50
+ return (0, utils_1.formatCallToolResult)({ cookies });
51
+ }
52
+ case 'set': {
53
+ await state.adapter.setCookies(pageId, input.cookies);
54
+ return (0, utils_1.formatCallToolResult)({ set: true, count: input.cookies.length });
55
+ }
56
+ case 'clear': {
57
+ await state.adapter.clearCookies(pageId);
58
+ return (0, utils_1.formatCallToolResult)({ cleared: true });
59
+ }
60
+ }
61
+ }, browserCookiesOutputSchema);
62
+ }
63
+ const storageKindField = zod_1.z.enum(['local', 'session']).describe('Storage type');
64
+ const storageGetSchema = zod_1.z.object({
65
+ kind: storageKindField,
66
+ action: zod_1.z.literal('get'),
67
+ pageId: helpers_1.pageIdField,
68
+ });
69
+ const storageSetSchema = zod_1.z.object({
70
+ kind: storageKindField,
71
+ action: zod_1.z.literal('set'),
72
+ data: zod_1.z.record(zod_1.z.string(), zod_1.z.string()).describe('Key-value pairs to set'),
73
+ pageId: helpers_1.pageIdField,
74
+ });
75
+ const storageClearSchema = zod_1.z.object({
76
+ kind: storageKindField,
77
+ action: zod_1.z.literal('clear'),
78
+ pageId: helpers_1.pageIdField,
79
+ });
80
+ const browserStorageSchema = zod_1.z.discriminatedUnion('action', [
81
+ storageGetSchema,
82
+ storageSetSchema,
83
+ storageClearSchema,
84
+ ]);
85
+ const browserStorageOutputSchema = zod_1.z.object({
86
+ data: zod_1.z.record(zod_1.z.unknown()).optional(),
87
+ set: zod_1.z.boolean().optional(),
88
+ cleared: zod_1.z.boolean().optional(),
89
+ });
90
+ function browserStorage(connection) {
91
+ return (0, helpers_1.createConnectedTool)(connection, 'browser_storage', 'Get, set, or clear localStorage or sessionStorage.', browserStorageSchema, async (state, input, pageId) => {
92
+ switch (input.action) {
93
+ case 'get': {
94
+ const data = await state.adapter.getStorage(pageId, input.kind);
95
+ return (0, utils_1.formatCallToolResult)({ data });
96
+ }
97
+ case 'set': {
98
+ await state.adapter.setStorage(pageId, input.kind, input.data);
99
+ return (0, utils_1.formatCallToolResult)({ set: true });
100
+ }
101
+ case 'clear': {
102
+ await state.adapter.clearStorage(pageId, input.kind);
103
+ return (0, utils_1.formatCallToolResult)({ cleared: true });
104
+ }
105
+ }
106
+ }, browserStorageOutputSchema);
107
+ }
108
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/tools/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { BrowserConnection } from '../connection';
2
+ import type { ToolDefinition } from '../types';
3
+ export declare function createTabTools(connection: BrowserConnection): ToolDefinition[];
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createTabTools = createTabTools;
37
+ const zod_1 = require("zod");
38
+ const utils_1 = require("../utils");
39
+ const helpers_1 = require("./helpers");
40
+ function createTabTools(connection) {
41
+ return [tabOpen(connection), tabList(connection), tabFocus(connection), tabClose(connection)];
42
+ }
43
+ const tabOpenSchema = zod_1.z.object({
44
+ url: zod_1.z.string().optional().describe('URL to navigate to (default: about:blank)'),
45
+ });
46
+ const tabOpenOutputSchema = (0, helpers_1.withSnapshotEnvelope)({
47
+ pageId: zod_1.z.string(),
48
+ title: zod_1.z.string(),
49
+ url: zod_1.z.string(),
50
+ });
51
+ function tabOpen(connection) {
52
+ return (0, helpers_1.createConnectedTool)(connection, 'browser_tab_open', 'Open a new tab. Optionally navigate to a URL.', tabOpenSchema, async (state, input) => {
53
+ const pageInfo = await state.adapter.newPage(input.url);
54
+ state.pages.set(pageInfo.id, pageInfo);
55
+ state.activePageId = pageInfo.id;
56
+ return (0, utils_1.formatCallToolResult)({
57
+ pageId: pageInfo.id,
58
+ title: pageInfo.title,
59
+ url: pageInfo.url,
60
+ });
61
+ }, tabOpenOutputSchema, { autoSnapshot: true, waitForCompletion: true }, (args) => (args.url ? (0, helpers_1.extractDomain)(args.url) : 'browser'));
62
+ }
63
+ const tabListSchema = zod_1.z.object({});
64
+ const tabListOutputSchema = zod_1.z.object({
65
+ pages: zod_1.z.array(zod_1.z.object({
66
+ id: zod_1.z.string(),
67
+ title: zod_1.z.string(),
68
+ url: zod_1.z.string(),
69
+ active: zod_1.z.boolean(),
70
+ })),
71
+ });
72
+ function tabList(connection) {
73
+ return (0, helpers_1.createConnectedTool)(connection, 'browser_tab_list', 'List all browser tabs currently controlled.', tabListSchema, async (state) => {
74
+ const pages = await state.adapter.listTabs();
75
+ return (0, utils_1.formatCallToolResult)({
76
+ pages: pages.map((p) => ({
77
+ ...p,
78
+ active: p.id === state.activePageId,
79
+ })),
80
+ });
81
+ }, tabListOutputSchema);
82
+ }
83
+ const tabFocusSchema = zod_1.z.object({
84
+ pageId: zod_1.z.string().describe('Page ID to make active'),
85
+ });
86
+ const tabFocusOutputSchema = zod_1.z.object({
87
+ activePageId: zod_1.z.string(),
88
+ });
89
+ function tabFocus(connection) {
90
+ return (0, helpers_1.createConnectedTool)(connection, 'browser_tab_focus', 'Switch the active tab. Note: focusing is not required to interact with a tab — you can interact with any tab regardless of focus.', tabFocusSchema, async (state, input) => {
91
+ const pages = await state.adapter.listTabs();
92
+ const target = pages.find((p) => p.id === input.pageId);
93
+ if (!target) {
94
+ const { PageNotFoundError } = await Promise.resolve().then(() => __importStar(require('../errors')));
95
+ throw new PageNotFoundError(input.pageId);
96
+ }
97
+ await state.adapter.focusPage(input.pageId);
98
+ state.activePageId = input.pageId;
99
+ return (0, utils_1.formatCallToolResult)({ activePageId: input.pageId });
100
+ }, tabFocusOutputSchema);
101
+ }
102
+ const tabCloseSchema = zod_1.z.object({
103
+ pageId: zod_1.z.string().describe('Page ID to close'),
104
+ });
105
+ const tabCloseOutputSchema = zod_1.z.object({
106
+ closed: zod_1.z.boolean(),
107
+ pageId: zod_1.z.string(),
108
+ });
109
+ function tabClose(connection) {
110
+ return (0, helpers_1.createConnectedTool)(connection, 'browser_tab_close', 'Close a tab.', tabCloseSchema, async (state, input) => {
111
+ await state.adapter.closePage(input.pageId);
112
+ state.pages.delete(input.pageId);
113
+ if (state.activePageId === input.pageId) {
114
+ const remainingTabs = await state.adapter.listTabs();
115
+ state.activePageId =
116
+ remainingTabs.length > 0 ? remainingTabs[remainingTabs.length - 1].id : '';
117
+ }
118
+ return (0, utils_1.formatCallToolResult)({ closed: true, pageId: input.pageId });
119
+ }, tabCloseOutputSchema, { skipEnrichment: true });
120
+ }
121
+ //# sourceMappingURL=tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/tools/tabs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { BrowserConnection } from '../connection';
2
+ import type { ToolDefinition } from '../types';
3
+ export declare function createWaitTools(connection: BrowserConnection): ToolDefinition[];
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createWaitTools = createWaitTools;
4
+ const zod_1 = require("zod");
5
+ const utils_1 = require("../utils");
6
+ const helpers_1 = require("./helpers");
7
+ function createWaitTools(connection) {
8
+ return [browserWait(connection)];
9
+ }
10
+ const browserWaitSchema = zod_1.z.object({
11
+ selector: zod_1.z.string().optional().describe('CSS/text/role selector to wait for'),
12
+ url: zod_1.z.string().optional().describe('URL pattern (glob) to wait for'),
13
+ loadState: zod_1.z
14
+ .enum(['load', 'domcontentloaded', 'networkidle'])
15
+ .optional()
16
+ .describe('Wait for load state'),
17
+ predicate: zod_1.z.string().optional().describe('JavaScript expression that must return truthy'),
18
+ text: zod_1.z.string().optional().describe('Text content to wait for on the page'),
19
+ timeoutMs: zod_1.z.number().optional().describe('Timeout in ms (default: 30000)'),
20
+ pageId: helpers_1.pageIdField,
21
+ });
22
+ const browserWaitOutputSchema = (0, helpers_1.withSnapshotEnvelope)({
23
+ waited: zod_1.z.boolean(),
24
+ elapsedMs: zod_1.z.number(),
25
+ });
26
+ function browserWait(connection) {
27
+ return (0, helpers_1.createConnectedTool)(connection, 'browser_wait', 'Wait for one or more conditions. Conditions can be combined — all must be satisfied.', browserWaitSchema, async (state, input, pageId) => {
28
+ const elapsedMs = await state.adapter.wait(pageId, {
29
+ selector: input.selector,
30
+ url: input.url,
31
+ loadState: input.loadState,
32
+ predicate: input.predicate,
33
+ text: input.text,
34
+ timeoutMs: input.timeoutMs,
35
+ });
36
+ return (0, utils_1.formatCallToolResult)({ waited: true, elapsedMs });
37
+ }, browserWaitOutputSchema, { autoSnapshot: true });
38
+ }
39
+ //# sourceMappingURL=wait.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/tools/wait.ts"],"names":[],"mappings":";;AAOA,0CAEC;AATD,6BAAwB;AAIxB,oCAAgD;AAChD,uCAAmF;AAEnF,SAAgB,eAAe,CAAC,UAA6B;IAC5D,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;IAClC,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IAC9E,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IACrE,SAAS,EAAE,OAAC;SACV,IAAI,CAAC,CAAC,MAAM,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;SACjD,QAAQ,EAAE;SACV,QAAQ,CAAC,qBAAqB,CAAC;IACjC,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;IAC1F,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IAC5E,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IAC3E,MAAM,EAAE,qBAAW;CACnB,CAAC,CAAC;AAEH,MAAM,uBAAuB,GAAG,IAAA,8BAAoB,EAAC;IACpD,MAAM,EAAE,OAAC,CAAC,OAAO,EAAE;IACnB,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAC;AAEH,SAAS,WAAW,CAAC,UAA6B;IACjD,OAAO,IAAA,6BAAmB,EACzB,UAAU,EACV,cAAc,EACd,sFAAsF,EACtF,iBAAiB,EACjB,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC9B,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE;YAClD,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC1B,CAAC,CAAC;QACH,OAAO,IAAA,4BAAoB,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1D,CAAC,EACD,uBAAuB,EACvB,EAAE,YAAY,EAAE,IAAI,EAAE,CACtB,CAAC;AACH,CAAC"}
@@ -0,0 +1,170 @@
1
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
+ import { z } from 'zod';
3
+ declare const chromiumBrowsers: readonly ["chromium", "chrome", "brave", "edge"];
4
+ export type BrowserName = (typeof chromiumBrowsers)[number];
5
+ export declare const browserNameSchema: z.ZodEnum<["chromium", "chrome", "brave", "edge"]>;
6
+ export declare const configSchema: z.ZodObject<{
7
+ defaultBrowser: z.ZodDefault<z.ZodEnum<["chromium", "chrome", "brave", "edge"]>>;
8
+ browsers: z.ZodDefault<z.ZodRecord<z.ZodEnum<["chromium", "chrome", "brave", "edge"]>, z.ZodObject<{
9
+ executablePath: z.ZodOptional<z.ZodString>;
10
+ profilePath: z.ZodOptional<z.ZodString>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ executablePath?: string | undefined;
13
+ profilePath?: string | undefined;
14
+ }, {
15
+ executablePath?: string | undefined;
16
+ profilePath?: string | undefined;
17
+ }>>>;
18
+ }, "strip", z.ZodTypeAny, {
19
+ defaultBrowser: "chromium" | "chrome" | "brave" | "edge";
20
+ browsers: Partial<Record<"chromium" | "chrome" | "brave" | "edge", {
21
+ executablePath?: string | undefined;
22
+ profilePath?: string | undefined;
23
+ }>>;
24
+ }, {
25
+ defaultBrowser?: "chromium" | "chrome" | "brave" | "edge" | undefined;
26
+ browsers?: Partial<Record<"chromium" | "chrome" | "brave" | "edge", {
27
+ executablePath?: string | undefined;
28
+ profilePath?: string | undefined;
29
+ }>> | undefined;
30
+ }>;
31
+ export type Config = z.input<typeof configSchema>;
32
+ export interface ResolvedBrowserInfo {
33
+ executablePath: string;
34
+ profilePath?: string;
35
+ available: boolean;
36
+ }
37
+ export interface ResolvedConfig {
38
+ defaultBrowser: BrowserName;
39
+ browsers: Map<BrowserName, ResolvedBrowserInfo>;
40
+ }
41
+ export interface ConnectConfig {
42
+ browser: BrowserName;
43
+ }
44
+ export interface PageInfo {
45
+ id: string;
46
+ title: string;
47
+ url: string;
48
+ }
49
+ export interface ConnectionState {
50
+ adapter: PlaywrightAdapter;
51
+ pages: Map<string, PageInfo>;
52
+ activePageId: string;
53
+ }
54
+ export interface ConnectResult {
55
+ browser: string;
56
+ pages: PageInfo[];
57
+ }
58
+ export type ElementTarget = {
59
+ ref: string;
60
+ } | {
61
+ selector: string;
62
+ };
63
+ export interface ModalState {
64
+ type: 'dialog' | 'filechooser';
65
+ description: string;
66
+ clearedBy: string;
67
+ dialogType?: 'alert' | 'confirm' | 'prompt' | 'beforeunload';
68
+ message?: string;
69
+ }
70
+ export interface NavigateResult {
71
+ title: string;
72
+ url: string;
73
+ status: number;
74
+ }
75
+ export interface SnapshotResult {
76
+ tree: string;
77
+ refCount: number;
78
+ }
79
+ export interface ConsoleEntry {
80
+ level: string;
81
+ text: string;
82
+ timestamp: number;
83
+ }
84
+ export interface ErrorEntry {
85
+ message: string;
86
+ stack?: string;
87
+ timestamp: number;
88
+ }
89
+ export interface NetworkEntry {
90
+ url: string;
91
+ method: string;
92
+ status: number;
93
+ contentType?: string;
94
+ timestamp: number;
95
+ }
96
+ export interface Cookie {
97
+ name: string;
98
+ value: string;
99
+ domain?: string;
100
+ path?: string;
101
+ expires?: number;
102
+ httpOnly?: boolean;
103
+ secure?: boolean;
104
+ sameSite?: 'Strict' | 'Lax' | 'None';
105
+ }
106
+ export interface ClickOptions {
107
+ button?: 'left' | 'right' | 'middle';
108
+ clickCount?: number;
109
+ modifiers?: string[];
110
+ }
111
+ export interface TypeOptions {
112
+ clear?: boolean;
113
+ submit?: boolean;
114
+ delay?: number;
115
+ }
116
+ export interface ScrollOptions {
117
+ direction?: 'up' | 'down';
118
+ amount?: number;
119
+ }
120
+ export interface ScreenshotOptions {
121
+ fullPage?: boolean;
122
+ }
123
+ export interface WaitOptions {
124
+ selector?: string;
125
+ url?: string;
126
+ loadState?: 'load' | 'domcontentloaded' | 'networkidle';
127
+ predicate?: string;
128
+ text?: string;
129
+ timeoutMs?: number;
130
+ }
131
+ export type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
132
+ export interface ToolContext {
133
+ dir: string;
134
+ }
135
+ export interface ToolDefinition<TSchema extends z.ZodType = z.ZodType> {
136
+ name: string;
137
+ description: string;
138
+ inputSchema: TSchema;
139
+ outputSchema?: z.ZodObject<z.ZodRawShape>;
140
+ execute(args: z.infer<TSchema>, context: ToolContext): CallToolResult | Promise<CallToolResult>;
141
+ getAffectedResources(args: z.infer<TSchema>, context: ToolContext): AffectedResource[] | Promise<AffectedResource[]>;
142
+ }
143
+ export interface AffectedResource {
144
+ toolGroup: 'browser';
145
+ resource: string;
146
+ description: string;
147
+ }
148
+ export interface BrowserToolkit {
149
+ tools: ToolDefinition[];
150
+ connection: BrowserConnection;
151
+ }
152
+ import type { PlaywrightAdapter as PlaywrightAdapterType } from './adapters/playwright';
153
+ import type { BrowserConnection as BrowserConnectionType } from './connection';
154
+ type BrowserConnection = BrowserConnectionType;
155
+ type PlaywrightAdapter = PlaywrightAdapterType;
156
+ export interface BrowserInfo {
157
+ executablePath: string;
158
+ profilePath?: string;
159
+ }
160
+ export interface DiscoveredBrowsers {
161
+ chrome?: BrowserInfo;
162
+ brave?: BrowserInfo;
163
+ edge?: BrowserInfo;
164
+ chromium?: BrowserInfo;
165
+ }
166
+ export interface DiscoveryReport {
167
+ platform: string;
168
+ found: DiscoveredBrowsers;
169
+ searchedPaths: Partial<Record<BrowserName, string[]>>;
170
+ }
package/dist/types.js ADDED
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configSchema = exports.browserNameSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const chromiumBrowsers = ['chromium', 'chrome', 'brave', 'edge'];
6
+ exports.browserNameSchema = zod_1.z.enum(chromiumBrowsers);
7
+ const browserOverrideSchema = zod_1.z.object({
8
+ executablePath: zod_1.z.string().optional(),
9
+ profilePath: zod_1.z.string().optional(),
10
+ });
11
+ exports.configSchema = zod_1.z.object({
12
+ defaultBrowser: exports.browserNameSchema.default('chrome'),
13
+ browsers: zod_1.z.record(exports.browserNameSchema, browserOverrideSchema).default({}),
14
+ });
15
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AACA,6BAAwB;AAMxB,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAU,CAAC;AAI7D,QAAA,iBAAiB,GAAG,OAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAM1D,MAAM,qBAAqB,GAAG,OAAC,CAAC,MAAM,CAAC;IACtC,cAAc,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAEU,QAAA,YAAY,GAAG,OAAC,CAAC,MAAM,CAAC;IACpC,cAAc,EAAE,yBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC;IACnD,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC,yBAAiB,EAAE,qBAAqB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACxE,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { McpBrowserError } from './errors';
2
+ import type { CallToolResult } from './types';
3
+ export declare function expandHome(p: string): string;
4
+ export declare function generateId(prefix: string): string;
5
+ export declare function formatCallToolResult(data: Record<string, unknown>): CallToolResult;
6
+ export declare function formatImageResponse(base64Data: string, metadata?: Record<string, unknown>): CallToolResult;
7
+ export declare function toError(value: unknown): Error;
8
+ export declare function formatErrorResponse(error: McpBrowserError): CallToolResult;
package/dist/utils.js ADDED
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.expandHome = expandHome;
7
+ exports.generateId = generateId;
8
+ exports.formatCallToolResult = formatCallToolResult;
9
+ exports.formatImageResponse = formatImageResponse;
10
+ exports.toError = toError;
11
+ exports.formatErrorResponse = formatErrorResponse;
12
+ const nanoid_1 = require("nanoid");
13
+ const node_os_1 = __importDefault(require("node:os"));
14
+ const node_path_1 = __importDefault(require("node:path"));
15
+ function expandHome(p) {
16
+ if (p.startsWith('~')) {
17
+ return node_path_1.default.join(node_os_1.default.homedir(), p.slice(1));
18
+ }
19
+ return p;
20
+ }
21
+ function generateId(prefix) {
22
+ return `${prefix}_${(0, nanoid_1.nanoid)(12)}`;
23
+ }
24
+ function formatCallToolResult(data) {
25
+ return {
26
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
27
+ structuredContent: data,
28
+ };
29
+ }
30
+ function formatImageResponse(base64Data, metadata) {
31
+ const content = [
32
+ { type: 'image', data: base64Data, mimeType: 'image/png' },
33
+ ];
34
+ if (metadata) {
35
+ content.push({ type: 'text', text: JSON.stringify(metadata, null, 2) });
36
+ }
37
+ return { content };
38
+ }
39
+ function toError(value) {
40
+ if (value instanceof Error)
41
+ return value;
42
+ return new Error(String(value));
43
+ }
44
+ function formatErrorResponse(error) {
45
+ const data = { error: error.message };
46
+ if (error.hint)
47
+ data.hint = error.hint;
48
+ return {
49
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
50
+ structuredContent: data,
51
+ isError: true,
52
+ };
53
+ }
54
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;;;AAWA,gCAKC;AAGD,gCAEC;AAGD,oDAKC;AAGD,kDAWC;AAGD,0BAGC;AAGD,kDAQC;AA5DD,mCAAgC;AAChC,sDAAyB;AACzB,0DAA6B;AAS7B,SAAgB,UAAU,CAAC,CAAS;IACnC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,CAAC,CAAC;AACV,CAAC;AAGD,SAAgB,UAAU,CAAC,MAAc;IACxC,OAAO,GAAG,MAAM,IAAI,IAAA,eAAM,EAAC,EAAE,CAAC,EAAE,CAAC;AAClC,CAAC;AAGD,SAAgB,oBAAoB,CAAC,IAA6B;IACjE,OAAO;QACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAChE,iBAAiB,EAAE,IAAI;KACvB,CAAC;AACH,CAAC;AAGD,SAAgB,mBAAmB,CAClC,UAAkB,EAClB,QAAkC;IAElC,MAAM,OAAO,GAA8B;QAC1C,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE;KAC1D,CAAC;IACF,IAAI,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC;AACpB,CAAC;AAGD,SAAgB,OAAO,CAAC,KAAc;IACrC,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC;IACzC,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACjC,CAAC;AAGD,SAAgB,mBAAmB,CAAC,KAAsB;IACzD,MAAM,IAAI,GAA2B,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IAC9D,IAAI,KAAK,CAAC,IAAI;QAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACvC,OAAO;QACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAChE,iBAAiB,EAAE,IAAI;QACvB,OAAO,EAAE,IAAI;KACb,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@n8n/mcp-browser",
3
+ "version": "0.1.0-rc1",
4
+ "description": "Browser automation MCP tools built on Playwright, WebDriver BiDi, and safaridriver",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "mcp-browser": "dist/server.js"
9
+ },
10
+ "files": [
11
+ "dist/**/*"
12
+ ],
13
+ "dependencies": {
14
+ "@joplin/turndown-plugin-gfm": "1.0.64",
15
+ "@modelcontextprotocol/sdk": "1.26.0",
16
+ "@mozilla/readability": "^0.6.0",
17
+ "jsdom": "^23.0.1",
18
+ "nanoid": "3.3.8",
19
+ "playwright-core": "1.58.0",
20
+ "selenium-webdriver": "4.39.0",
21
+ "turndown": "^7.2.0",
22
+ "ws": "8.17.1",
23
+ "picocolors": "1.0.1",
24
+ "yargs-parser": "21.1.1",
25
+ "zod": "3.25.67"
26
+ },
27
+ "devDependencies": {
28
+ "@types/turndown": "^5.0.6",
29
+ "@types/ws": "^8.18.1",
30
+ "@types/yargs-parser": "21.0.0",
31
+ "@n8n/typescript-config": "1.3.0"
32
+ },
33
+ "scripts": {
34
+ "clean": "rimraf dist .turbo",
35
+ "start": "node dist/server.js",
36
+ "dev": "tsx watch src/server.ts",
37
+ "typecheck": "tsc --noEmit",
38
+ "build": "tsc -p tsconfig.build.json",
39
+ "format": "biome format --write src",
40
+ "format:check": "biome ci src",
41
+ "lint": "eslint . --quiet",
42
+ "lint:fix": "eslint . --fix",
43
+ "watch": "tsc -p tsconfig.build.json --watch",
44
+ "test": "jest",
45
+ "test:unit": "jest",
46
+ "test:dev": "jest --watch"
47
+ }
48
+ }