@mearl/mcp-server 2.1.0 → 2.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.
package/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  - 📝 **browser_get_logs**: 获取控制台日志
10
10
  - 🎭 **browser_set_mock**: 动态设置 Mock 数据
11
11
  - 🌐 **browser_list**: 统一列出普通浏览器和托管浏览器,返回默认目标、类型及连接状态
12
- - 📴 **browser_release**: 释放 debugger/CDP 控制并保留浏览器与全部标签页
12
+ - 📴 **browser_release**: 按用户明确要求释放 debugger/CDP 控制和会话级临时效果,并保留浏览器与全部标签页
13
13
  - 🚀 **browser_launch / browser_close**: 启动或关闭独立 Profile 的托管 Chrome
14
14
  - 🌐 **browser_page_snapshot**: 首次获取页面结构和可交互元素
15
15
  - ⚡ **browser_page_click/type/hover/scroll/press/upload**: 执行页面动作,默认内置观察,返回通知、可交互控件和焦点等高置信度信号
package/dist/index.js CHANGED
@@ -26,6 +26,47 @@ import { createRequire } from 'module';
26
26
  import { RESPONSE_SIZE_SMALL, RESPONSE_SIZE_MEDIUM, RESPONSE_SIZE_LARGE, RESPONSE_SIZE_MAX, } from './constants.js';
27
27
  const require = createRequire(import.meta.url);
28
28
  const MCP_SERVER_VERSION = require('../package.json').version;
29
+ const MCP_TOOL_ACTIONS = {
30
+ browser_get_requests: 'get_requests',
31
+ browser_get_events: 'get_events',
32
+ browser_get_logs: 'get_logs',
33
+ browser_set_mock: 'set_mock',
34
+ browser_get_mocks: 'get_mocks',
35
+ browser_get_api_schema: 'get_api_schema',
36
+ browser_send_request: 'send_request',
37
+ browser_send_mtop_request: 'send_mtop_request',
38
+ browser_set_rule: 'set_rule',
39
+ browser_get_rules: 'get_rules',
40
+ browser_page_screenshot: 'page_screenshot',
41
+ browser_page_selected_element: 'page_selected_element',
42
+ get_user_info: 'get_user_info',
43
+ tdbank_account: 'tdbank_account',
44
+ browser_launch: 'browser_launch',
45
+ browser_close: 'browser_close',
46
+ browser_release: 'browser_release',
47
+ browser_tab_open: 'tab_open',
48
+ browser_tab_close: 'tab_close',
49
+ browser_tab_list: 'tab_list',
50
+ browser_page_click: 'page_click',
51
+ browser_page_type: 'page_type',
52
+ browser_page_scroll: 'page_scroll',
53
+ browser_page_hover: 'page_hover',
54
+ browser_page_eval: 'page_eval',
55
+ browser_page_snapshot: 'page_snapshot',
56
+ browser_page_press: 'page_press',
57
+ browser_page_wait: 'page_wait',
58
+ browser_page_navigate: 'page_navigate',
59
+ browser_page_upload: 'page_upload',
60
+ browser_page_frames: 'page_frames',
61
+ browser_set_device_emulation: 'set_device_emulation',
62
+ browser_set_timezone: 'set_timezone',
63
+ browser_run_actions: 'run_actions',
64
+ browser_list: 'browser_list',
65
+ browser_select_browser: 'browser_select_browser',
66
+ };
67
+ function defineMcpTools(tools) {
68
+ return tools;
69
+ }
29
70
  // 日志输出到 stderr(不影响 stdio 通信)
30
71
  const LOG_FILE = join(tmpdir(), 'mearl-mcp-server.log');
31
72
  const log = (...args) => {
@@ -360,7 +401,7 @@ async function main() {
360
401
  },
361
402
  };
362
403
  // 定义工具列表
363
- const tools = [
404
+ const tools = defineMcpTools([
364
405
  {
365
406
  name: 'browser_get_requests',
366
407
  description: '获取浏览器中最近的 API 请求历史记录,包含完整的请求和响应信息。适用于分析性能、排查问题、查看数据流等场景。无需等待用户操作,立即返回已有数据。',
@@ -978,7 +1019,7 @@ async function main() {
978
1019
  },
979
1020
  {
980
1021
  name: 'browser_release',
981
- description: '释放 Agent 对当前目标浏览器的 debugger/CDP 控制,停止持续采集和会话级临时效果,但保留浏览器与全部标签页。后续浏览器操作仍可自动重新建立控制。',
1022
+ description: '仅当用户明确要求结束调试、退出接管或清理会话资源时,释放当前目标浏览器的 debugger/CDP 控制;不要作为普通任务收尾。它会停止持续采集,并立即清除设备/时区模拟、会话级 Mock 和录制,但保留浏览器与全部标签页。后续浏览器操作仍可自动重新建立控制。',
982
1023
  inputSchema: {
983
1024
  type: 'object',
984
1025
  properties: {},
@@ -1455,7 +1496,7 @@ async function main() {
1455
1496
  },
1456
1497
  {
1457
1498
  name: 'browser_set_device_emulation',
1458
- description: '把目标标签页切换为移动端模拟态:视口尺寸 / DPR / UA / 触摸事件全部按指定设备生效,等价于 Chrome DevTools 设备工具栏,作用域仅限该 tab,会话结束自动还原。适用于:调试 H5 移动页面、让 page_click 在 swiper/fastclick 等只听 touchstart 的页面生效、让服务端按移动 UA 返回数据。启用后默认 reload 一次让页面以移动模式重新初始化。enabled=false 清除模拟。',
1499
+ description: '把目标标签页切换为移动端模拟态:视口尺寸 / DPR / UA / 触摸事件全部按指定设备生效,等价于 Chrome DevTools 设备工具栏,作用域仅限该 tab,释放 debugger/CDP 控制会自动还原。适用于:调试 H5 移动页面、让 page_click 在 swiper/fastclick 等只听 touchstart 的页面生效、让服务端按移动 UA 返回数据。启用后默认 reload 一次让页面以移动模式重新初始化;成功响应中的实际配置可直接验证设置结果,无需固定追加快照。enabled=false 清除模拟。',
1459
1500
  inputSchema: {
1460
1501
  type: 'object',
1461
1502
  properties: {
@@ -1569,7 +1610,7 @@ async function main() {
1569
1610
  required: ['browser'],
1570
1611
  },
1571
1612
  },
1572
- ];
1613
+ ]);
1573
1614
  // 处理工具列表请求
1574
1615
  server.setRequestHandler(ListToolsRequestSchema, async () => {
1575
1616
  return { tools };
@@ -1578,8 +1619,11 @@ async function main() {
1578
1619
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
1579
1620
  const { name, arguments: args } = request.params;
1580
1621
  try {
1622
+ if (!(name in MCP_TOOL_ACTIONS))
1623
+ throw new Error(`Unknown tool: ${name}`);
1624
+ const toolName = name;
1581
1625
  let result;
1582
- switch (name) {
1626
+ switch (toolName) {
1583
1627
  case 'browser_get_requests': {
1584
1628
  const { tabId, count = 10, filter, since, includeBody = true, includeHeaders = false, maxBodySize = 50000, fields, keysOnly = false, source, } = args;
1585
1629
  result = await client.getRequests({
@@ -1906,8 +1950,10 @@ async function main() {
1906
1950
  result = await client.selectBrowser(args);
1907
1951
  break;
1908
1952
  }
1909
- default:
1910
- throw new Error(`Unknown tool: ${name}`);
1953
+ default: {
1954
+ const unhandledTool = toolName;
1955
+ throw new Error(`Unknown tool: ${unhandledTool}`);
1956
+ }
1911
1957
  }
1912
1958
  // 使用智能格式化返回结果
1913
1959
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mearl/mcp-server",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
4
4
  "description": "MCP Server for Mearl - enables AI to interact with Chrome browser requests and logs",
5
5
  "mcpName": "io.github.F-loat/mearl",
6
6
  "type": "module",
@@ -30,8 +30,8 @@
30
30
  "dependencies": {
31
31
  "@modelcontextprotocol/sdk": "^1.0.4",
32
32
  "prompts": "^2.4.2",
33
- "@mearl/client": "2.1.0",
34
- "@mearl/native-host": "2.1.0"
33
+ "@mearl/client": "2.2.0",
34
+ "@mearl/native-host": "2.2.0"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/node": "^24.9.1",
package/dist/types.d.ts DELETED
@@ -1,120 +0,0 @@
1
- export interface MtopRequest {
2
- id: number;
3
- timestamp: string;
4
- timestampMs: number;
5
- method: string;
6
- url: string;
7
- apiName: string;
8
- status: number;
9
- statusText: string;
10
- headers: Array<{
11
- name: string;
12
- value: string;
13
- }>;
14
- responseHeaders: Array<{
15
- name: string;
16
- value: string;
17
- }>;
18
- queryString: Record<string, string>;
19
- postData: Record<string, any> | null;
20
- responseBody: any;
21
- duration?: number;
22
- proxyData?: any;
23
- }
24
- export interface ConsoleLog {
25
- level: 'log' | 'warn' | 'error' | 'info';
26
- message: string;
27
- timestamp: number;
28
- /** 来源文件和行号,格式 "filename.js:42",仅在可获取时存在 */
29
- source?: string;
30
- args: any[];
31
- }
32
- export interface WaitForRequestParams {
33
- pattern: string;
34
- timeout?: number;
35
- includeExisting?: boolean;
36
- }
37
- export interface GetRequestsParams {
38
- count?: number;
39
- filter?: string;
40
- since?: number;
41
- }
42
- export interface GetLogsParams {
43
- level?: 'log' | 'warn' | 'error' | 'info' | 'all';
44
- since?: number;
45
- limit?: number;
46
- filter?: string;
47
- }
48
- export interface SetMockParams {
49
- apiName: string;
50
- mockData: any;
51
- enabled?: boolean;
52
- duration?: number;
53
- conditions?: Record<string, any>;
54
- }
55
- export interface GetApiSchemaParams {
56
- api: string;
57
- version?: string;
58
- }
59
- export interface GetSelectedElementParams {
60
- includeOuterHTML?: boolean;
61
- includeScreenshot?: boolean;
62
- }
63
- export interface RequestsResponse {
64
- meta: {
65
- /** 实际返回的请求数量 */
66
- count: number;
67
- /** 缓冲区中符合过滤条件的总请求数 */
68
- totalMatched: number;
69
- /** 缓冲区中的总请求数(未过滤) */
70
- totalInBuffer: number;
71
- /** 应用的过滤器(如果有) */
72
- filter?: string;
73
- /** 时间过滤器(秒) */
74
- since?: number;
75
- /** 是否包含请求/响应体 */
76
- includeBody: boolean;
77
- /** 是否包含请求/响应头 */
78
- includeHeaders: boolean;
79
- /** 提取的字段(如果有) */
80
- fields?: string[];
81
- /** 是否只返回键结构 */
82
- keysOnly: boolean;
83
- };
84
- /** 请求数据列表 */
85
- requests: MtopRequest[];
86
- }
87
- export interface LogsResponse {
88
- meta: {
89
- /** 实际返回的日志数量 */
90
- count: number;
91
- /** 符合过滤条件的总日志数 */
92
- totalMatched: number;
93
- /** 应用的日志级别过滤 */
94
- level: string;
95
- /** 时间过滤器(秒) */
96
- since?: number;
97
- /** 应用的过滤模式 */
98
- filter?: string;
99
- };
100
- /** 日志数据列表 */
101
- logs: ConsoleLog[];
102
- }
103
- export interface ScreenshotResponse {
104
- meta: {
105
- /** 截图格式 */
106
- format: 'png' | 'jpeg';
107
- /** 截图宽度 */
108
- width: number;
109
- /** 截图高度 */
110
- height: number;
111
- /** 截图数据大小(字节) */
112
- size: number;
113
- /** 截图的页面 URL */
114
- url: string;
115
- /** 截图的页面标题 */
116
- title: string;
117
- };
118
- /** Base64 编码的截图数据 */
119
- data: string;
120
- }
package/dist/types.js DELETED
@@ -1,2 +0,0 @@
1
- // 消息类型定义
2
- export {};