@pyrokine/mcp-chrome 1.0.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 (100) hide show
  1. package/README.md +333 -0
  2. package/dist/anti-detection/behavior.d.ts +58 -0
  3. package/dist/anti-detection/behavior.d.ts.map +1 -0
  4. package/dist/anti-detection/behavior.js +113 -0
  5. package/dist/anti-detection/behavior.js.map +1 -0
  6. package/dist/anti-detection/index.d.ts +6 -0
  7. package/dist/anti-detection/index.d.ts.map +1 -0
  8. package/dist/anti-detection/index.js +6 -0
  9. package/dist/anti-detection/index.js.map +1 -0
  10. package/dist/anti-detection/injection.d.ts +19 -0
  11. package/dist/anti-detection/injection.d.ts.map +1 -0
  12. package/dist/anti-detection/injection.js +270 -0
  13. package/dist/anti-detection/injection.js.map +1 -0
  14. package/dist/cdp/client.d.ts +73 -0
  15. package/dist/cdp/client.d.ts.map +1 -0
  16. package/dist/cdp/client.js +275 -0
  17. package/dist/cdp/client.js.map +1 -0
  18. package/dist/cdp/index.d.ts +6 -0
  19. package/dist/cdp/index.d.ts.map +1 -0
  20. package/dist/cdp/index.js +6 -0
  21. package/dist/cdp/index.js.map +1 -0
  22. package/dist/cdp/launcher.d.ts +42 -0
  23. package/dist/cdp/launcher.d.ts.map +1 -0
  24. package/dist/cdp/launcher.js +181 -0
  25. package/dist/cdp/launcher.js.map +1 -0
  26. package/dist/core/auto-wait.d.ts +71 -0
  27. package/dist/core/auto-wait.d.ts.map +1 -0
  28. package/dist/core/auto-wait.js +165 -0
  29. package/dist/core/auto-wait.js.map +1 -0
  30. package/dist/core/errors.d.ts +123 -0
  31. package/dist/core/errors.d.ts.map +1 -0
  32. package/dist/core/errors.js +226 -0
  33. package/dist/core/errors.js.map +1 -0
  34. package/dist/core/index.d.ts +10 -0
  35. package/dist/core/index.d.ts.map +1 -0
  36. package/dist/core/index.js +10 -0
  37. package/dist/core/index.js.map +1 -0
  38. package/dist/core/locator.d.ts +130 -0
  39. package/dist/core/locator.d.ts.map +1 -0
  40. package/dist/core/locator.js +402 -0
  41. package/dist/core/locator.js.map +1 -0
  42. package/dist/core/retry.d.ts +27 -0
  43. package/dist/core/retry.d.ts.map +1 -0
  44. package/dist/core/retry.js +51 -0
  45. package/dist/core/retry.js.map +1 -0
  46. package/dist/core/session.d.ts +254 -0
  47. package/dist/core/session.d.ts.map +1 -0
  48. package/dist/core/session.js +893 -0
  49. package/dist/core/session.js.map +1 -0
  50. package/dist/core/types.d.ts +263 -0
  51. package/dist/core/types.d.ts.map +1 -0
  52. package/dist/core/types.js +90 -0
  53. package/dist/core/types.js.map +1 -0
  54. package/dist/index.d.ts +14 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +121 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/tools/browse.d.ts +92 -0
  59. package/dist/tools/browse.d.ts.map +1 -0
  60. package/dist/tools/browse.js +368 -0
  61. package/dist/tools/browse.js.map +1 -0
  62. package/dist/tools/cookies.d.ts +75 -0
  63. package/dist/tools/cookies.d.ts.map +1 -0
  64. package/dist/tools/cookies.js +230 -0
  65. package/dist/tools/cookies.js.map +1 -0
  66. package/dist/tools/evaluate.d.ts +45 -0
  67. package/dist/tools/evaluate.d.ts.map +1 -0
  68. package/dist/tools/evaluate.js +85 -0
  69. package/dist/tools/evaluate.js.map +1 -0
  70. package/dist/tools/extract.d.ts +213 -0
  71. package/dist/tools/extract.d.ts.map +1 -0
  72. package/dist/tools/extract.js +304 -0
  73. package/dist/tools/extract.js.map +1 -0
  74. package/dist/tools/index.d.ts +13 -0
  75. package/dist/tools/index.d.ts.map +1 -0
  76. package/dist/tools/index.js +13 -0
  77. package/dist/tools/index.js.map +1 -0
  78. package/dist/tools/input.d.ts +241 -0
  79. package/dist/tools/input.d.ts.map +1 -0
  80. package/dist/tools/input.js +325 -0
  81. package/dist/tools/input.js.map +1 -0
  82. package/dist/tools/logs.d.ts +57 -0
  83. package/dist/tools/logs.d.ts.map +1 -0
  84. package/dist/tools/logs.js +165 -0
  85. package/dist/tools/logs.js.map +1 -0
  86. package/dist/tools/manage.d.ts +65 -0
  87. package/dist/tools/manage.d.ts.map +1 -0
  88. package/dist/tools/manage.js +270 -0
  89. package/dist/tools/manage.js.map +1 -0
  90. package/dist/tools/schema.d.ts +261 -0
  91. package/dist/tools/schema.d.ts.map +1 -0
  92. package/dist/tools/schema.js +151 -0
  93. package/dist/tools/schema.js.map +1 -0
  94. package/dist/tools/wait.d.ts +203 -0
  95. package/dist/tools/wait.d.ts.map +1 -0
  96. package/dist/tools/wait.js +254 -0
  97. package/dist/tools/wait.js.map +1 -0
  98. package/package.json +43 -0
  99. package/scripts/start-chrome-headless.sh +37 -0
  100. package/scripts/start-chrome.sh +41 -0
@@ -0,0 +1,226 @@
1
+ /**
2
+ * mcp-chrome 错误类型定义
3
+ *
4
+ * 设计原则:
5
+ * - 每个错误都有明确的 code(便于程序处理)
6
+ * - 每个错误都有 suggestion(便于用户理解如何修复)
7
+ * - 每个错误都有 context(便于调试)
8
+ * - 参考《代码整洁之道》§7.4:给出异常发生的环境说明
9
+ */
10
+ /**
11
+ * 浏览器错误基类
12
+ */
13
+ export class BrowserError extends Error {
14
+ context = {};
15
+ constructor(message) {
16
+ super(message);
17
+ this.name = this.constructor.name;
18
+ }
19
+ /**
20
+ * 转换为 JSON 格式,用于 MCP 响应
21
+ */
22
+ toJSON() {
23
+ const result = {
24
+ error: {
25
+ code: this.code,
26
+ message: this.message,
27
+ suggestion: this.suggestion,
28
+ },
29
+ };
30
+ if (Object.keys(this.context).length > 0) {
31
+ result.error.context = this.context;
32
+ }
33
+ return result;
34
+ }
35
+ }
36
+ /**
37
+ * 连接被拒绝错误
38
+ */
39
+ export class ConnectionRefusedError extends BrowserError {
40
+ code = 'CONNECTION_REFUSED';
41
+ suggestion;
42
+ context;
43
+ constructor(host, port) {
44
+ super(`无法连接到 ${host}:${port}`);
45
+ this.suggestion = `请确保浏览器已启动并开放了调试端口:
46
+ google-chrome --remote-debugging-port=${port}
47
+
48
+ 或者使用 browse(action="launch") 让 mcp-chrome 自动启动浏览器。`;
49
+ this.context = { host, port };
50
+ }
51
+ }
52
+ /**
53
+ * 浏览器未找到错误
54
+ */
55
+ export class BrowserNotFoundError extends BrowserError {
56
+ code = 'BROWSER_NOT_FOUND';
57
+ suggestion = `未找到 Chrome 浏览器。请指定 executablePath 参数:
58
+ browse(action="launch", executablePath="/path/to/chrome")`;
59
+ constructor() {
60
+ super('未找到 Chrome 浏览器');
61
+ }
62
+ }
63
+ /**
64
+ * 会话不存在错误
65
+ */
66
+ export class SessionNotFoundError extends BrowserError {
67
+ code = 'SESSION_NOT_FOUND';
68
+ suggestion = '请先使用 browse(action="launch") 或 browse(action="connect") 连接浏览器';
69
+ constructor() {
70
+ super('浏览器会话不存在');
71
+ }
72
+ }
73
+ /**
74
+ * 页面/Target 不存在错误
75
+ */
76
+ export class TargetNotFoundError extends BrowserError {
77
+ code = 'TARGET_NOT_FOUND';
78
+ suggestion = '请使用 browse(action="list") 查看可用页面';
79
+ context;
80
+ constructor(targetId) {
81
+ super(`页面不存在: ${targetId}`);
82
+ this.context = { targetId };
83
+ }
84
+ }
85
+ /**
86
+ * 元素未找到错误
87
+ */
88
+ export class ElementNotFoundError extends BrowserError {
89
+ code = 'ELEMENT_NOT_FOUND';
90
+ suggestion;
91
+ logs;
92
+ context;
93
+ constructor(target, timeout, logs = [], url) {
94
+ super(`元素未找到: ${JSON.stringify(target)}`);
95
+ this.suggestion = `请检查 target 是否正确,或增加 timeout(当前: ${timeout}ms)`;
96
+ this.logs = logs;
97
+ this.context = { target, timeout };
98
+ if (url) {
99
+ this.context.url = url;
100
+ }
101
+ }
102
+ toJSON() {
103
+ return {
104
+ error: {
105
+ code: this.code,
106
+ message: this.message,
107
+ suggestion: this.suggestion,
108
+ context: this.context,
109
+ logs: this.logs,
110
+ },
111
+ };
112
+ }
113
+ }
114
+ /**
115
+ * 导航超时错误
116
+ */
117
+ export class NavigationTimeoutError extends BrowserError {
118
+ code = 'NAVIGATION_TIMEOUT';
119
+ suggestion = '请检查网络连接,或增加超时时间';
120
+ context;
121
+ constructor(url, timeout) {
122
+ super(`导航超时: ${url} (${timeout}ms)`);
123
+ this.context = { url, timeout };
124
+ }
125
+ }
126
+ /**
127
+ * 操作超时错误
128
+ */
129
+ export class TimeoutError extends BrowserError {
130
+ code = 'TIMEOUT';
131
+ suggestion = '请增加超时时间,或检查操作条件是否能满足';
132
+ constructor(message) {
133
+ super(message);
134
+ }
135
+ }
136
+ /**
137
+ * 无效参数错误
138
+ */
139
+ export class InvalidArgumentError extends BrowserError {
140
+ code = 'INVALID_ARGUMENT';
141
+ suggestion;
142
+ constructor(message, suggestion) {
143
+ super(message);
144
+ this.suggestion = suggestion ?? '请检查参数是否正确';
145
+ }
146
+ }
147
+ /**
148
+ * CDP 协议错误
149
+ */
150
+ export class CDPError extends BrowserError {
151
+ code = 'CDP_ERROR';
152
+ suggestion = '这是一个 CDP 协议错误,请检查操作是否正确';
153
+ constructor(message) {
154
+ super(message);
155
+ }
156
+ }
157
+ /**
158
+ * 格式化日志记录(参考 Playwright Waiter)
159
+ */
160
+ export function formatLogRecording(logs) {
161
+ if (logs.length === 0) {
162
+ return '';
163
+ }
164
+ const header = ' logs ';
165
+ const width = 60;
166
+ const leftPad = '='.repeat(Math.floor((width - header.length) / 2));
167
+ const rightPad = '='.repeat(width - header.length - leftPad.length);
168
+ return `\n${leftPad}${header}${rightPad}\n${logs.join('\n')}\n${'='.repeat(width)}`;
169
+ }
170
+ /**
171
+ * ZodError 类型检测
172
+ */
173
+ function isZodError(error) {
174
+ return (error !== null &&
175
+ typeof error === 'object' &&
176
+ 'name' in error &&
177
+ error.name === 'ZodError' &&
178
+ 'issues' in error &&
179
+ Array.isArray(error.issues));
180
+ }
181
+ /**
182
+ * 格式化错误为 MCP 工具响应
183
+ * 特别处理 ZodError,转换为结构化的 INVALID_ARGUMENT 错误
184
+ */
185
+ export function formatErrorResponse(error) {
186
+ // 处理 ZodError
187
+ if (isZodError(error)) {
188
+ const fieldErrors = error.issues.map((issue) => ({
189
+ path: issue.path.join('.'),
190
+ message: issue.message,
191
+ code: issue.code,
192
+ }));
193
+ return {
194
+ content: [
195
+ {
196
+ type: 'text',
197
+ text: JSON.stringify({
198
+ error: {
199
+ code: 'INVALID_ARGUMENT',
200
+ message: '参数验证失败',
201
+ fields: fieldErrors,
202
+ },
203
+ }, null, 2),
204
+ },
205
+ ],
206
+ isError: true,
207
+ };
208
+ }
209
+ // 处理 BrowserError(带 toJSON 方法)
210
+ const err = error;
211
+ return {
212
+ content: [
213
+ {
214
+ type: 'text',
215
+ text: JSON.stringify(err.toJSON?.() ?? {
216
+ error: {
217
+ code: 'UNKNOWN_ERROR',
218
+ message: err.message ?? String(error),
219
+ },
220
+ }, null, 2),
221
+ },
222
+ ],
223
+ isError: true,
224
+ };
225
+ }
226
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 核心模块导出
3
+ */
4
+ export * from './types.js';
5
+ export * from './errors.js';
6
+ export { Locator, type LocatorOptions } from './locator.js';
7
+ export { getSession } from './session.js';
8
+ export { withRetry, type RetryOptions } from './retry.js';
9
+ export { AutoWait, type AutoWaitOptions } from './auto-wait.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,OAAO,EAAC,OAAO,EAAE,KAAK,cAAc,EAAC,MAAM,cAAc,CAAA;AACzD,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAA;AACvC,OAAO,EAAC,SAAS,EAAE,KAAK,YAAY,EAAC,MAAM,YAAY,CAAA;AACvD,OAAO,EAAC,QAAQ,EAAE,KAAK,eAAe,EAAC,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 核心模块导出
3
+ */
4
+ export * from './types.js';
5
+ export * from './errors.js';
6
+ export { Locator } from './locator.js';
7
+ export { getSession } from './session.js';
8
+ export { withRetry } from './retry.js';
9
+ export { AutoWait } from './auto-wait.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,OAAO,EAAC,OAAO,EAAsB,MAAM,cAAc,CAAA;AACzD,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAA;AACvC,OAAO,EAAC,SAAS,EAAoB,MAAM,YAAY,CAAA;AACvD,OAAO,EAAC,QAAQ,EAAuB,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * 元素定位器
3
+ *
4
+ * 统一的元素定位逻辑,支持多种定位方式:
5
+ * - 可访问性树(role/name)
6
+ * - 文本内容
7
+ * - CSS 选择器
8
+ * - XPath
9
+ * - 坐标
10
+ *
11
+ * 设计原则:
12
+ * - 封装:隐藏定位细节,暴露简洁接口
13
+ * - 以对象取代基本类型:Target 对象而非字符串
14
+ */
15
+ import type { CDPClient } from '../cdp/client.js';
16
+ import { type Box, type Point, type Target } from './types.js';
17
+ /**
18
+ * CDP DOM 节点 ID
19
+ */
20
+ type NodeId = number;
21
+ /**
22
+ * Locator 选项
23
+ */
24
+ export interface LocatorOptions {
25
+ /** 超时时间(毫秒),默认 30000 */
26
+ timeout?: number;
27
+ /** 获取当前 URL 的回调(用于错误上下文) */
28
+ getUrl?: () => string | undefined;
29
+ }
30
+ /**
31
+ * 元素定位器
32
+ */
33
+ export declare class Locator {
34
+ private cdp;
35
+ private target;
36
+ private sessionId?;
37
+ private logs;
38
+ private timeout;
39
+ private getUrl?;
40
+ constructor(cdp: CDPClient, target: Target, sessionId?: string | undefined, options?: LocatorOptions);
41
+ /**
42
+ * 查找元素,返回节点 ID(带重试)
43
+ */
44
+ find(): Promise<NodeId>;
45
+ /**
46
+ * 获取元素中心坐标(用于点击)
47
+ */
48
+ getClickablePoint(): Promise<Point>;
49
+ /**
50
+ * 获取元素边界框
51
+ */
52
+ getBoundingBox(): Promise<Box>;
53
+ /**
54
+ * 在找到的元素上执行函数
55
+ *
56
+ * @param fn 要执行的函数字符串,元素作为第一个参数
57
+ * @returns 函数返回值
58
+ */
59
+ evaluateOn<T>(fn: string): Promise<T>;
60
+ /**
61
+ * 获取定位日志
62
+ */
63
+ getLogs(): string[];
64
+ /**
65
+ * 查找元素的内部实现(单次尝试)
66
+ */
67
+ private findInternal;
68
+ /**
69
+ * 通过可访问性树定位
70
+ */
71
+ private findByAccessibility;
72
+ /**
73
+ * 通过文本内容定位
74
+ */
75
+ private findByText;
76
+ /**
77
+ * 通过 label 定位
78
+ */
79
+ private findByLabel;
80
+ /**
81
+ * 通过 placeholder 定位
82
+ */
83
+ private findByPlaceholder;
84
+ /**
85
+ * 通过 title 属性定位
86
+ */
87
+ private findByTitle;
88
+ /**
89
+ * 通过 alt 属性定位
90
+ */
91
+ private findByAlt;
92
+ /**
93
+ * 通过 data-testid 定位
94
+ */
95
+ private findByTestId;
96
+ /**
97
+ * 通过 CSS 选择器定位
98
+ */
99
+ private findByCSS;
100
+ /**
101
+ * 通过 XPath 定位
102
+ */
103
+ private findByXPath;
104
+ /**
105
+ * CSS 选择器定位内部实现
106
+ */
107
+ private findByCSSInternal;
108
+ /**
109
+ * XPath 定位内部实现
110
+ */
111
+ private findByXPathInternal;
112
+ /**
113
+ * 将 RemoteObject ID 转换为 NodeId
114
+ */
115
+ private objectIdToNodeId;
116
+ /**
117
+ * 获取元素边界框
118
+ */
119
+ private getBoxModel;
120
+ /**
121
+ * 发送 CDP 命令
122
+ */
123
+ private send;
124
+ /**
125
+ * 记录日志
126
+ */
127
+ private log;
128
+ }
129
+ export {};
130
+ //# sourceMappingURL=locator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locator.d.ts","sourceRoot":"","sources":["../../src/core/locator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAA;AAG/C,OAAO,EACH,KAAK,GAAG,EAWR,KAAK,KAAK,EACV,KAAK,MAAM,EACd,MAAM,YAAY,CAAA;AAEnB;;GAEG;AACH,KAAK,MAAM,GAAG,MAAM,CAAC;AAOrB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CACrC;AA2DD;;GAEG;AACH,qBAAa,OAAO;IAMZ,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,SAAS,CAAC;IAPtB,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,MAAM,CAAC,CAA0B;gBAG7B,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,YAAA,EAC1B,OAAO,GAAE,cAAmB;IAMhC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAY7B;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC;IAczC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC;IASpC;;;;;OAKG;IACG,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IA6B3C;;OAEG;IACH,OAAO,IAAI,MAAM,EAAE;IAInB;;OAEG;YACW,YAAY;IAgC1B;;OAEG;YACW,mBAAmB;IAwCjC;;OAEG;YACW,UAAU;IAgBxB;;OAEG;YACW,WAAW;IA4CzB;;OAEG;YACW,iBAAiB;IAe/B;;OAEG;YACW,WAAW;IAazB;;OAEG;YACW,SAAS;IAavB;;OAEG;YACW,YAAY;IAQ1B;;OAEG;YACW,SAAS;IAOvB;;OAEG;YACW,WAAW;IAOzB;;OAEG;YACW,iBAAiB;IAoB/B;;OAEG;YACW,mBAAmB;IAkBjC;;OAEG;YACW,gBAAgB;IAa9B;;OAEG;YACW,WAAW;IAgBzB;;OAEG;IACH,OAAO,CAAC,IAAI;IAIZ;;OAEG;IACH,OAAO,CAAC,GAAG;CAGd"}