@coofly/agent-browser-mcp 1.0.3 → 1.1.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/Dockerfile CHANGED
@@ -1,5 +1,5 @@
1
1
  # 构建阶段
2
- FROM node:20-alpine AS builder
2
+ FROM node:20-slim AS builder
3
3
 
4
4
  WORKDIR /app
5
5
 
@@ -17,7 +17,7 @@ COPY src/ ./src/
17
17
  RUN npm run build
18
18
 
19
19
  # 运行阶段
20
- FROM node:20-alpine
20
+ FROM node:20-slim
21
21
 
22
22
  WORKDIR /app
23
23
 
@@ -25,9 +25,16 @@ WORKDIR /app
25
25
  COPY package*.json ./
26
26
  RUN npm ci --omit=dev && npm cache clean --force
27
27
 
28
+ # 安装 agent-browser CLI(浏览器在启动时按需安装)
29
+ RUN npm install -g agent-browser
30
+
28
31
  # 从构建阶段复制编译产物
29
32
  COPY --from=builder /app/dist ./dist
30
33
 
34
+ # 复制启动脚本
35
+ COPY entrypoint.sh ./
36
+ RUN chmod +x entrypoint.sh
37
+
31
38
  # 环境变量
32
39
  ENV NODE_ENV=production
33
40
 
@@ -35,4 +42,4 @@ ENV NODE_ENV=production
35
42
  EXPOSE 9223
36
43
 
37
44
  # 启动命令
38
- CMD ["node", "dist/index.js"]
45
+ ENTRYPOINT ["./entrypoint.sh"]
package/README.md CHANGED
@@ -7,7 +7,8 @@ MCP (Model Context Protocol) server for [agent-browser](https://github.com/verce
7
7
  ## Features
8
8
 
9
9
  - **CDP Remote Connection**: Connect to remote Chrome/Edge browser via Chrome DevTools Protocol
10
- - **Multiple Transport Modes**: Support both stdio and SSE (Server-Sent Events) transport
10
+ - **Auto Transport Detection**: Automatically detects stdio (pipe) or HTTP mode based on terminal type
11
+ - **Streamable HTTP**: Uses modern MCP Streamable HTTP transport for better session management
11
12
  - **Environment Variables**: Simple configuration via environment variables
12
13
  - **Docker Support**: Ready-to-use Dockerfile for containerized deployment
13
14
 
@@ -15,17 +16,33 @@ MCP (Model Context Protocol) server for [agent-browser](https://github.com/verce
15
16
 
16
17
  ### Via npx (Recommended)
17
18
 
19
+ **Linux / macOS / Git Bash:**
20
+
18
21
  ```bash
19
- # Run directly without installation
22
+ # Run directly (auto-detects mode)
20
23
  npx @coofly/agent-browser-mcp
21
24
 
22
- # SSE mode
23
- MCP_TRANSPORT=sse MCP_PORT=9223 npx @coofly/agent-browser-mcp
24
-
25
- # With CDP endpoint
25
+ # With remote CDP browser
26
26
  CDP_ENDPOINT="http://localhost:9222" npx @coofly/agent-browser-mcp
27
27
  ```
28
28
 
29
+ **Windows (PowerShell):**
30
+
31
+ ```powershell
32
+ # Run directly (auto-detects mode)
33
+ npx @coofly/agent-browser-mcp
34
+
35
+ # With remote CDP browser
36
+ $env:CDP_ENDPOINT="http://localhost:9222"; npx @coofly/agent-browser-mcp
37
+ ```
38
+
39
+ **Windows (CMD):**
40
+
41
+ ```cmd
42
+ # With remote CDP browser
43
+ set CDP_ENDPOINT=http://localhost:9222 && npx @coofly/agent-browser-mcp
44
+ ```
45
+
29
46
  ### From Source
30
47
 
31
48
  ```bash
@@ -46,25 +63,33 @@ All configuration is done via environment variables:
46
63
 
47
64
  | Variable | Description | Default |
48
65
  |----------|-------------|---------|
49
- | `MCP_TRANSPORT` | Transport mode (`stdio` or `sse`) | `stdio` |
50
- | `MCP_PORT` | SSE server port | `9223` |
51
- | `MCP_HOST` | SSE server host | `0.0.0.0` |
66
+ | `MCP_PORT` | HTTP server port | `9223` |
67
+ | `MCP_HOST` | HTTP server host | `0.0.0.0` |
52
68
  | `CDP_ENDPOINT` | CDP remote endpoint URL | - |
53
69
  | `BROWSER_TIMEOUT` | Command timeout (ms) | `30000` |
54
70
 
71
+ **Transport Mode Auto-Detection:**
72
+ - **Interactive terminal (TTY)**: Starts HTTP server, listening on `/mcp` endpoint
73
+ - **Pipe input (non-TTY)**: Starts Stdio mode for Claude Desktop and other integrations
74
+
55
75
  ## Usage
56
76
 
57
- ### Stdio Mode (Default)
77
+ ### Auto Mode (Recommended)
58
78
 
59
79
  ```bash
80
+ # In terminal: starts HTTP server on port 9223
60
81
  npm start
82
+
83
+ # Via pipe: starts Stdio mode
84
+ echo '{}' | npm start
61
85
  ```
62
86
 
63
- ### SSE Mode
87
+ ### HTTP Mode Endpoints
64
88
 
65
- ```bash
66
- MCP_TRANSPORT=sse MCP_PORT=9223 npm start
67
- ```
89
+ When running in HTTP mode (interactive terminal):
90
+
91
+ - **MCP Endpoint**: `http://localhost:9223/mcp`
92
+ - **Health Check**: `http://localhost:9223/health`
68
93
 
69
94
  ### With CDP Remote Browser
70
95
 
@@ -114,23 +139,52 @@ With CDP endpoint:
114
139
 
115
140
  ## Docker
116
141
 
117
- ### Build Image
142
+ ### Using Docker Hub (Recommended)
118
143
 
119
144
  ```bash
120
- docker build -t agent-browser-mcp:latest .
145
+ # HTTP mode with built-in browser (browser installed on first start)
146
+ docker run -d -p 9223:9223 \
147
+ coofly/agent-browser-mcp:latest
148
+
149
+ # HTTP mode with remote CDP browser (faster startup)
150
+ docker run -d -p 9223:9223 \
151
+ -e CDP_ENDPOINT=http://host.docker.internal:9222 \
152
+ coofly/agent-browser-mcp:latest
153
+
154
+ # Stdio mode (for direct integration with MCP clients)
155
+ docker run -i --rm \
156
+ coofly/agent-browser-mcp:latest
157
+
158
+ # Custom timeout setting (default: 30000ms)
159
+ docker run -d -p 9223:9223 \
160
+ -e BROWSER_TIMEOUT=60000 \
161
+ coofly/agent-browser-mcp:latest
162
+ ```
163
+
164
+ ### Docker Compose
165
+
166
+ ```yaml
167
+ version: '3.8'
168
+ services:
169
+ agent-browser-mcp:
170
+ image: coofly/agent-browser-mcp:latest
171
+ ports:
172
+ - "9223:9223" # MCP HTTP server port
173
+ environment:
174
+ # - MCP_HOST=0.0.0.0 # HTTP server bind address (default: 0.0.0.0)
175
+ # - MCP_PORT=9223 # HTTP server port (default: 9223)
176
+ # - CDP_ENDPOINT=http://chrome:9222 # Remote browser CDP endpoint
177
+ # - BROWSER_TIMEOUT=30000 # Command timeout in ms
121
178
  ```
122
179
 
123
- ### Run Container
180
+ ### Build from Source
124
181
 
125
182
  ```bash
126
- # SSE mode
127
- docker run -p 9223:9223 -e MCP_TRANSPORT=sse agent-browser-mcp:latest
183
+ # Build image
184
+ docker build -t agent-browser-mcp:latest .
128
185
 
129
- # With CDP endpoint
130
- docker run -p 9223:9223 \
131
- -e MCP_TRANSPORT=sse \
132
- -e CDP_ENDPOINT=http://host.docker.internal:9222 \
133
- agent-browser-mcp:latest
186
+ # Run container (HTTP mode)
187
+ docker run -d -p 9223:9223 agent-browser-mcp:latest
134
188
  ```
135
189
 
136
190
  ## Available Tools
package/README_ZH.md CHANGED
@@ -7,7 +7,8 @@
7
7
  ## 功能特性
8
8
 
9
9
  - **CDP 远程连接**:通过 Chrome DevTools Protocol 连接远程 Chrome/Edge 浏览器
10
- - **多传输模式**:支持 stdio SSE (Server-Sent Events) 两种传输方式
10
+ - **自动传输检测**:根据终端类型自动检测 stdio(管道)或 HTTP 模式
11
+ - **Streamable HTTP**:使用现代 MCP Streamable HTTP 传输,提供更好的会话管理
11
12
  - **环境变量配置**:通过环境变量进行简单配置
12
13
  - **Docker 支持**:提供 Dockerfile,支持容器化部署
13
14
 
@@ -15,17 +16,33 @@
15
16
 
16
17
  ### 通过 npx(推荐)
17
18
 
19
+ **Linux / macOS / Git Bash:**
20
+
18
21
  ```bash
19
- # 直接运行(无需安装)
22
+ # 直接运行(自动检测模式)
20
23
  npx @coofly/agent-browser-mcp
21
24
 
22
- # SSE 模式
23
- MCP_TRANSPORT=sse MCP_PORT=9223 npx @coofly/agent-browser-mcp
24
-
25
- # 连接 CDP
25
+ # 连接远程 CDP 浏览器
26
26
  CDP_ENDPOINT="http://localhost:9222" npx @coofly/agent-browser-mcp
27
27
  ```
28
28
 
29
+ **Windows (PowerShell):**
30
+
31
+ ```powershell
32
+ # 直接运行(自动检测模式)
33
+ npx @coofly/agent-browser-mcp
34
+
35
+ # 连接远程 CDP 浏览器
36
+ $env:CDP_ENDPOINT="http://localhost:9222"; npx @coofly/agent-browser-mcp
37
+ ```
38
+
39
+ **Windows (CMD):**
40
+
41
+ ```cmd
42
+ # 连接远程 CDP 浏览器
43
+ set CDP_ENDPOINT=http://localhost:9222 && npx @coofly/agent-browser-mcp
44
+ ```
45
+
29
46
  ### 从源码安装
30
47
 
31
48
  ```bash
@@ -46,25 +63,33 @@ npm run build
46
63
 
47
64
  | 变量 | 描述 | 默认值 |
48
65
  |------|------|--------|
49
- | `MCP_TRANSPORT` | 传输模式 (`stdio` 或 `sse`) | `stdio` |
50
- | `MCP_PORT` | SSE 服务器端口 | `9223` |
51
- | `MCP_HOST` | SSE 服务器地址 | `0.0.0.0` |
66
+ | `MCP_PORT` | HTTP 服务器端口 | `9223` |
67
+ | `MCP_HOST` | HTTP 服务器地址 | `0.0.0.0` |
52
68
  | `CDP_ENDPOINT` | CDP 远程端点 URL | - |
53
69
  | `BROWSER_TIMEOUT` | 命令超时时间(毫秒) | `30000` |
54
70
 
71
+ **传输模式自动检测:**
72
+ - **交互式终端(TTY)**:启动 HTTP 服务器,监听 `/mcp` 端点
73
+ - **管道输入(非 TTY)**:启动 Stdio 模式,用于 Claude Desktop 等集成
74
+
55
75
  ## 使用方法
56
76
 
57
- ### Stdio 模式(默认)
77
+ ### 自动模式(推荐)
58
78
 
59
79
  ```bash
80
+ # 在终端中:启动 HTTP 服务器,端口 9223
60
81
  npm start
82
+
83
+ # 通过管道:启动 Stdio 模式
84
+ echo '{}' | npm start
61
85
  ```
62
86
 
63
- ### SSE 模式
87
+ ### HTTP 模式端点
64
88
 
65
- ```bash
66
- MCP_TRANSPORT=sse MCP_PORT=9223 npm start
67
- ```
89
+ 在 HTTP 模式下(交互式终端):
90
+
91
+ - **MCP 端点**: `http://localhost:9223/mcp`
92
+ - **健康检查**: `http://localhost:9223/health`
68
93
 
69
94
  ### 连接 CDP 远程浏览器
70
95
 
@@ -114,23 +139,52 @@ CDP_ENDPOINT="http://localhost:9222" npm start
114
139
 
115
140
  ## Docker
116
141
 
117
- ### 构建镜像
142
+ ### 使用 Docker Hub(推荐)
118
143
 
119
144
  ```bash
120
- docker build -t agent-browser-mcp:latest .
145
+ # HTTP 模式,使用内置浏览器(首次启动时安装浏览器)
146
+ docker run -d -p 9223:9223 \
147
+ coofly/agent-browser-mcp:latest
148
+
149
+ # HTTP 模式,连接远程 CDP 浏览器(启动更快)
150
+ docker run -d -p 9223:9223 \
151
+ -e CDP_ENDPOINT=http://host.docker.internal:9222 \
152
+ coofly/agent-browser-mcp:latest
153
+
154
+ # Stdio 模式(用于直接集成 MCP 客户端)
155
+ docker run -i --rm \
156
+ coofly/agent-browser-mcp:latest
157
+
158
+ # 自定义超时时间(默认:30000ms)
159
+ docker run -d -p 9223:9223 \
160
+ -e BROWSER_TIMEOUT=60000 \
161
+ coofly/agent-browser-mcp:latest
162
+ ```
163
+
164
+ ### Docker Compose
165
+
166
+ ```yaml
167
+ version: '3.8'
168
+ services:
169
+ agent-browser-mcp:
170
+ image: coofly/agent-browser-mcp:latest
171
+ ports:
172
+ - "9223:9223" # MCP HTTP 服务端口
173
+ environment:
174
+ # - MCP_HOST=0.0.0.0 # HTTP 服务绑定地址(默认:0.0.0.0)
175
+ # - MCP_PORT=9223 # HTTP 服务端口(默认:9223)
176
+ # - CDP_ENDPOINT=http://chrome:9222 # 远程浏览器 CDP 端点
177
+ # - BROWSER_TIMEOUT=30000 # 命令超时时间(毫秒)
121
178
  ```
122
179
 
123
- ### 运行容器
180
+ ### 从源码构建
124
181
 
125
182
  ```bash
126
- # SSE 模式
127
- docker run -p 9223:9223 -e MCP_TRANSPORT=sse agent-browser-mcp:latest
183
+ # 构建镜像
184
+ docker build -t agent-browser-mcp:latest .
128
185
 
129
- # 指定 CDP 端点
130
- docker run -p 9223:9223 \
131
- -e MCP_TRANSPORT=sse \
132
- -e CDP_ENDPOINT=http://host.docker.internal:9222 \
133
- agent-browser-mcp:latest
186
+ # 运行容器(HTTP 模式)
187
+ docker run -d -p 9223:9223 agent-browser-mcp:latest
134
188
  ```
135
189
 
136
190
  ## 可用工具
package/dist/config.d.ts CHANGED
@@ -14,11 +14,9 @@ export interface CdpConfig {
14
14
  * 服务器配置
15
15
  */
16
16
  export interface ServerConfig {
17
- /** 传输模式: stdio 或 sse */
18
- transport: 'stdio' | 'sse';
19
- /** SSE 模式下的端口号 */
17
+ /** HTTP 模式下的端口号 */
20
18
  port: number;
21
- /** SSE 模式下的监听地址 */
19
+ /** HTTP 模式下的监听地址 */
22
20
  host: string;
23
21
  }
24
22
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,oBAAoB;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,wBAAwB;IACxB,SAAS,EAAE,OAAO,GAAG,KAAK,CAAC;IAC3B,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,SAa3B,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,oBAAoB;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,SAY3B,CAAC"}
package/dist/config.js CHANGED
@@ -10,7 +10,6 @@ export const defaultConfig = {
10
10
  endpoint: '',
11
11
  },
12
12
  server: {
13
- transport: 'stdio',
14
13
  port: 9223,
15
14
  host: '0.0.0.0',
16
15
  },
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyCH;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAc;IACtC,GAAG,EAAE;QACH,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,EAAE;KACb;IACD,MAAM,EAAE;QACN,SAAS,EAAE,OAAO;QAClB,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,SAAS;KAChB;IACD,OAAO,EAAE;QACP,OAAO,EAAE,KAAK;KACf;CACF,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuCH;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAc;IACtC,GAAG,EAAE;QACH,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,EAAE;KACb;IACD,MAAM,EAAE;QACN,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,SAAS;KAChB;IACD,OAAO,EAAE;QACP,OAAO,EAAE,KAAK;KACf;CACF,CAAC"}
package/dist/index.js CHANGED
@@ -4,7 +4,6 @@ import { getConfig } from './utils/configLoader.js';
4
4
  // 加载配置并显示启动信息
5
5
  const config = getConfig();
6
6
  console.error('[agent-browser-mcp] 启动中...');
7
- console.error(`[配置] 传输模式: ${config.server.transport}`);
8
7
  if (config.cdp.enabled) {
9
8
  console.error(`[配置] CDP 端点: ${config.cdp.endpoint}`);
10
9
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,cAAc;AACd,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAC3B,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;AAC5C,OAAO,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;AACvD,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACvB,OAAO,CAAC,KAAK,CAAC,gBAAgB,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC5B,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,cAAc;AACd,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAC3B,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;AAC5C,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACvB,OAAO,CAAC,KAAK,CAAC,gBAAgB,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC5B,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAqPnE;;GAEG;AACH,wBAAsB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAqCjC;AAED;;GAEG;AACH,wBAAsB,WAAW,kBAgBhC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAsPnE;;GAEG;AACH,wBAAsB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAqCjC;AAED;;GAEG;AACH,wBAAsB,WAAW,kBAuBhC"}
package/dist/server.js CHANGED
@@ -1,8 +1,9 @@
1
1
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
2
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
- import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
3
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
4
4
  import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
5
5
  import { createServer as createHttpServer } from 'http';
6
+ import { randomUUID } from 'crypto';
6
7
  import { getConfig } from './utils/configLoader.js';
7
8
  import * as navigation from './tools/navigation.js';
8
9
  import * as interaction from './tools/interaction.js';
@@ -253,11 +254,18 @@ export async function startServer() {
253
254
  globalOptions.cdp = appConfig.cdp.endpoint;
254
255
  console.error(`[CDP] 已启用远程连接: ${appConfig.cdp.endpoint}`);
255
256
  }
256
- const server = await createServer();
257
- if (appConfig.server.transport === 'sse') {
258
- await startSseServer(server, appConfig);
257
+ // 检测是否为 TTY(交互式终端)
258
+ const isTTY = process.stdin.isTTY;
259
+ if (isTTY) {
260
+ // 交互式终端:只启动 HTTP 服务器
261
+ console.error('[服务器] 检测到交互式终端,启动 HTTP 模式');
262
+ const server = await createServer();
263
+ await startHttpServer(server, appConfig);
259
264
  }
260
265
  else {
266
+ // 非交互式(管道输入):启动 Stdio 模式
267
+ console.error('[服务器] 检测到管道输入,启动 Stdio 模式');
268
+ const server = await createServer();
261
269
  await startStdioServer(server);
262
270
  }
263
271
  }
@@ -270,73 +278,86 @@ async function startStdioServer(server) {
270
278
  await server.connect(transport);
271
279
  }
272
280
  /**
273
- * 启动 SSE 模式服务器
281
+ * 启动 HTTP 模式服务器(使用 StreamableHTTP)
274
282
  */
275
- async function startSseServer(server, config) {
283
+ async function startHttpServer(server, config) {
276
284
  const { port, host } = config.server;
277
- // 存储活跃的 SSE 传输连接
278
285
  const transports = new Map();
279
286
  const httpServer = createHttpServer(async (req, res) => {
280
287
  const url = new URL(req.url || '/', `http://${req.headers.host}`);
281
- // 设置 CORS 头
288
+ // CORS 头
282
289
  res.setHeader('Access-Control-Allow-Origin', '*');
283
- res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
284
- res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
290
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
291
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, mcp-session-id');
292
+ res.setHeader('Access-Control-Expose-Headers', 'mcp-session-id');
285
293
  if (req.method === 'OPTIONS') {
286
294
  res.writeHead(200);
287
295
  res.end();
288
296
  return;
289
297
  }
290
- // SSE 端点
291
- if (url.pathname === '/sse' && req.method === 'GET') {
292
- const transport = new SSEServerTransport('/messages', res);
293
- // 使用 transport 内部的 sessionId,确保与客户端收到的一致
294
- const sessionId = transport.sessionId;
295
- transports.set(sessionId, transport);
296
- console.error(`[SSE] 新连接: ${sessionId}`);
297
- res.on('close', () => {
298
- transports.delete(sessionId);
299
- console.error(`[SSE] 连接关闭: ${sessionId}`);
300
- });
301
- await server.connect(transport);
302
- return;
303
- }
304
- // 消息端点
305
- if (url.pathname === '/messages' && req.method === 'POST') {
306
- const sessionId = url.searchParams.get('sessionId');
307
- if (!sessionId) {
308
- res.writeHead(400, { 'Content-Type': 'application/json' });
309
- res.end(JSON.stringify({ error: '缺少 sessionId 参数' }));
310
- return;
311
- }
312
- const transport = transports.get(sessionId);
313
- if (!transport) {
314
- res.writeHead(404, { 'Content-Type': 'application/json' });
315
- res.end(JSON.stringify({ error: '会话不存在' }));
316
- return;
317
- }
318
- await transport.handlePostMessage(req, res);
319
- return;
320
- }
321
- // 健康检查端点
298
+ // 健康检查
322
299
  if (url.pathname === '/health') {
323
300
  res.writeHead(200, { 'Content-Type': 'application/json' });
324
301
  res.end(JSON.stringify({
325
302
  status: 'ok',
326
- transport: 'sse',
303
+ transport: 'streamable-http',
327
304
  connections: transports.size
328
305
  }));
329
306
  return;
330
307
  }
331
- // 404
308
+ // MCP 端点处理
309
+ if (url.pathname === '/mcp') {
310
+ await handleMcpRequest(req, res, server, transports);
311
+ return;
312
+ }
332
313
  res.writeHead(404, { 'Content-Type': 'application/json' });
333
314
  res.end(JSON.stringify({ error: 'Not Found' }));
334
315
  });
335
316
  httpServer.listen(port, host, () => {
336
- console.error(`[服务器] SSE 模式已启动`);
317
+ console.error(`[服务器] HTTP 模式已启动`);
337
318
  console.error(`[服务器] 监听地址: http://${host}:${port}`);
338
- console.error(`[服务器] SSE 端点: http://${host}:${port}/sse`);
319
+ console.error(`[服务器] MCP 端点: http://${host}:${port}/mcp`);
339
320
  console.error(`[服务器] 健康检查: http://${host}:${port}/health`);
340
321
  });
341
322
  }
323
+ /**
324
+ * 处理 MCP 请求
325
+ */
326
+ async function handleMcpRequest(req, res, server, transports) {
327
+ const sessionId = req.headers['mcp-session-id'];
328
+ let transport;
329
+ if (sessionId && transports.has(sessionId)) {
330
+ // 已有会话
331
+ transport = transports.get(sessionId);
332
+ }
333
+ else if (!sessionId && req.method === 'POST') {
334
+ // 新会话
335
+ transport = new StreamableHTTPServerTransport({
336
+ sessionIdGenerator: () => randomUUID(),
337
+ onsessioninitialized: (id) => {
338
+ transports.set(id, transport);
339
+ console.error(`[MCP] 新会话: ${id}`);
340
+ },
341
+ });
342
+ transport.onclose = () => {
343
+ const id = transport.sessionId;
344
+ if (id) {
345
+ transports.delete(id);
346
+ console.error(`[MCP] 会话关闭: ${id}`);
347
+ }
348
+ };
349
+ await server.connect(transport);
350
+ }
351
+ else if (sessionId && !transports.has(sessionId)) {
352
+ res.writeHead(404, { 'Content-Type': 'application/json' });
353
+ res.end(JSON.stringify({ error: '会话不存在' }));
354
+ return;
355
+ }
356
+ else {
357
+ res.writeHead(400, { 'Content-Type': 'application/json' });
358
+ res.end(JSON.stringify({ error: '缺少 mcp-session-id' }));
359
+ return;
360
+ }
361
+ await transport.handleRequest(req, res);
362
+ }
342
363
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"configLoader.d.ts","sourceRoot":"","sources":["../../src/utils/configLoader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAiB,MAAM,cAAc,CAAC;AAwCxD;;GAEG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAKrC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
1
+ {"version":3,"file":"configLoader.d.ts","sourceRoot":"","sources":["../../src/utils/configLoader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAiB,MAAM,cAAc,CAAC;AAoCxD;;GAEG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAKrC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
@@ -16,9 +16,6 @@ function loadEnvConfig() {
16
16
  };
17
17
  }
18
18
  // 服务器配置
19
- if (process.env.MCP_TRANSPORT === 'sse' || process.env.MCP_TRANSPORT === 'stdio') {
20
- config.server.transport = process.env.MCP_TRANSPORT;
21
- }
22
19
  if (process.env.MCP_PORT) {
23
20
  config.server.port = parseInt(process.env.MCP_PORT, 10);
24
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"configLoader.js","sourceRoot":"","sources":["../../src/utils/configLoader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAa,aAAa,EAAE,MAAM,cAAc,CAAC;AAExD;;GAEG;AACH,SAAS,aAAa;IACpB,MAAM,MAAM,GAAc,EAAE,GAAG,aAAa,EAAE,CAAC;IAE/C,SAAS;IACT,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,GAAG;YACX,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;SACnC,CAAC;IACJ,CAAC;IAED,QAAQ;IACR,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;QACjF,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACtD,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACzB,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACzB,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC5C,CAAC;IAED,QAAQ;IACR,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,aAAa;AACb,IAAI,YAAY,GAAqB,IAAI,CAAC;AAE1C;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,aAAa,EAAE,CAAC;IACjC,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"configLoader.js","sourceRoot":"","sources":["../../src/utils/configLoader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAa,aAAa,EAAE,MAAM,cAAc,CAAC;AAExD;;GAEG;AACH,SAAS,aAAa;IACpB,MAAM,MAAM,GAAc,EAAE,GAAG,aAAa,EAAE,CAAC;IAE/C,SAAS;IACT,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,GAAG;YACX,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;SACnC,CAAC;IACJ,CAAC;IAED,QAAQ;IACR,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACzB,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACzB,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC5C,CAAC;IAED,QAAQ;IACR,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,aAAa;AACb,IAAI,YAAY,GAAqB,IAAI,CAAC;AAE1C;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,aAAa,EAAE,CAAC;IACjC,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC"}
package/entrypoint.sh ADDED
@@ -0,0 +1,15 @@
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ # 如果未设置 CDP_ENDPOINT,则安装本地浏览器
5
+ if [ -z "$CDP_ENDPOINT" ]; then
6
+ echo "[entrypoint] CDP_ENDPOINT not set, installing browser..."
7
+ agent-browser install
8
+ agent-browser install --with-deps
9
+ echo "[entrypoint] Browser installed successfully"
10
+ else
11
+ echo "[entrypoint] CDP_ENDPOINT set, skipping browser installation"
12
+ fi
13
+
14
+ # 启动应用
15
+ exec node dist/index.js
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coofly/agent-browser-mcp",
3
- "version": "1.0.3",
3
+ "version": "1.1.0",
4
4
  "description": "MCP server for agent-browser - headless browser automation for AI agents",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
package/src/config.ts CHANGED
@@ -16,11 +16,9 @@ export interface CdpConfig {
16
16
  * 服务器配置
17
17
  */
18
18
  export interface ServerConfig {
19
- /** 传输模式: stdio 或 sse */
20
- transport: 'stdio' | 'sse';
21
- /** SSE 模式下的端口号 */
19
+ /** HTTP 模式下的端口号 */
22
20
  port: number;
23
- /** SSE 模式下的监听地址 */
21
+ /** HTTP 模式下的监听地址 */
24
22
  host: string;
25
23
  }
26
24
 
@@ -50,7 +48,6 @@ export const defaultConfig: AppConfig = {
50
48
  endpoint: '',
51
49
  },
52
50
  server: {
53
- transport: 'stdio',
54
51
  port: 9223,
55
52
  host: '0.0.0.0',
56
53
  },
package/src/index.ts CHANGED
@@ -5,7 +5,6 @@ import { getConfig } from './utils/configLoader.js';
5
5
  // 加载配置并显示启动信息
6
6
  const config = getConfig();
7
7
  console.error('[agent-browser-mcp] 启动中...');
8
- console.error(`[配置] 传输模式: ${config.server.transport}`);
9
8
  if (config.cdp.enabled) {
10
9
  console.error(`[配置] CDP 端点: ${config.cdp.endpoint}`);
11
10
  }
package/src/server.ts CHANGED
@@ -1,12 +1,13 @@
1
1
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
2
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
- import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
3
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
4
4
  import {
5
5
  CallToolRequestSchema,
6
6
  ListToolsRequestSchema,
7
7
  Tool,
8
8
  } from '@modelcontextprotocol/sdk/types.js';
9
- import { createServer as createHttpServer } from 'http';
9
+ import { createServer as createHttpServer, IncomingMessage, ServerResponse } from 'http';
10
+ import { randomUUID } from 'crypto';
10
11
  import { getConfig } from './utils/configLoader.js';
11
12
  import type { AppConfig } from './config.js';
12
13
 
@@ -297,11 +298,18 @@ export async function startServer() {
297
298
  console.error(`[CDP] 已启用远程连接: ${appConfig.cdp.endpoint}`);
298
299
  }
299
300
 
300
- const server = await createServer();
301
+ // 检测是否为 TTY(交互式终端)
302
+ const isTTY = process.stdin.isTTY;
301
303
 
302
- if (appConfig.server.transport === 'sse') {
303
- await startSseServer(server, appConfig);
304
+ if (isTTY) {
305
+ // 交互式终端:只启动 HTTP 服务器
306
+ console.error('[服务器] 检测到交互式终端,启动 HTTP 模式');
307
+ const server = await createServer();
308
+ await startHttpServer(server, appConfig);
304
309
  } else {
310
+ // 非交互式(管道输入):启动 Stdio 模式
311
+ console.error('[服务器] 检测到管道输入,启动 Stdio 模式');
312
+ const server = await createServer();
305
313
  await startStdioServer(server);
306
314
  }
307
315
  }
@@ -316,21 +324,20 @@ async function startStdioServer(server: Server) {
316
324
  }
317
325
 
318
326
  /**
319
- * 启动 SSE 模式服务器
327
+ * 启动 HTTP 模式服务器(使用 StreamableHTTP)
320
328
  */
321
- async function startSseServer(server: Server, config: AppConfig) {
329
+ async function startHttpServer(server: Server, config: AppConfig) {
322
330
  const { port, host } = config.server;
323
-
324
- // 存储活跃的 SSE 传输连接
325
- const transports = new Map<string, SSEServerTransport>();
331
+ const transports = new Map<string, StreamableHTTPServerTransport>();
326
332
 
327
333
  const httpServer = createHttpServer(async (req, res) => {
328
334
  const url = new URL(req.url || '/', `http://${req.headers.host}`);
329
335
 
330
- // 设置 CORS 头
336
+ // CORS 头
331
337
  res.setHeader('Access-Control-Allow-Origin', '*');
332
- res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
333
- res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
338
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
339
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, mcp-session-id');
340
+ res.setHeader('Access-Control-Expose-Headers', 'mcp-session-id');
334
341
 
335
342
  if (req.method === 'OPTIONS') {
336
343
  res.writeHead(200);
@@ -338,64 +345,76 @@ async function startSseServer(server: Server, config: AppConfig) {
338
345
  return;
339
346
  }
340
347
 
341
- // SSE 端点
342
- if (url.pathname === '/sse' && req.method === 'GET') {
343
- const transport = new SSEServerTransport('/messages', res);
344
- // 使用 transport 内部的 sessionId,确保与客户端收到的一致
345
- const sessionId = transport.sessionId;
346
- transports.set(sessionId, transport);
347
-
348
- console.error(`[SSE] 新连接: ${sessionId}`);
349
-
350
- res.on('close', () => {
351
- transports.delete(sessionId);
352
- console.error(`[SSE] 连接关闭: ${sessionId}`);
353
- });
354
-
355
- await server.connect(transport);
356
- return;
357
- }
358
-
359
- // 消息端点
360
- if (url.pathname === '/messages' && req.method === 'POST') {
361
- const sessionId = url.searchParams.get('sessionId');
362
- if (!sessionId) {
363
- res.writeHead(400, { 'Content-Type': 'application/json' });
364
- res.end(JSON.stringify({ error: '缺少 sessionId 参数' }));
365
- return;
366
- }
367
-
368
- const transport = transports.get(sessionId);
369
- if (!transport) {
370
- res.writeHead(404, { 'Content-Type': 'application/json' });
371
- res.end(JSON.stringify({ error: '会话不存在' }));
372
- return;
373
- }
374
-
375
- await transport.handlePostMessage(req, res);
376
- return;
377
- }
378
-
379
- // 健康检查端点
348
+ // 健康检查
380
349
  if (url.pathname === '/health') {
381
350
  res.writeHead(200, { 'Content-Type': 'application/json' });
382
351
  res.end(JSON.stringify({
383
352
  status: 'ok',
384
- transport: 'sse',
353
+ transport: 'streamable-http',
385
354
  connections: transports.size
386
355
  }));
387
356
  return;
388
357
  }
389
358
 
390
- // 404
359
+ // MCP 端点处理
360
+ if (url.pathname === '/mcp') {
361
+ await handleMcpRequest(req, res, server, transports);
362
+ return;
363
+ }
364
+
391
365
  res.writeHead(404, { 'Content-Type': 'application/json' });
392
366
  res.end(JSON.stringify({ error: 'Not Found' }));
393
367
  });
394
368
 
395
369
  httpServer.listen(port, host, () => {
396
- console.error(`[服务器] SSE 模式已启动`);
370
+ console.error(`[服务器] HTTP 模式已启动`);
397
371
  console.error(`[服务器] 监听地址: http://${host}:${port}`);
398
- console.error(`[服务器] SSE 端点: http://${host}:${port}/sse`);
372
+ console.error(`[服务器] MCP 端点: http://${host}:${port}/mcp`);
399
373
  console.error(`[服务器] 健康检查: http://${host}:${port}/health`);
400
374
  });
401
375
  }
376
+
377
+ /**
378
+ * 处理 MCP 请求
379
+ */
380
+ async function handleMcpRequest(
381
+ req: IncomingMessage,
382
+ res: ServerResponse,
383
+ server: Server,
384
+ transports: Map<string, StreamableHTTPServerTransport>
385
+ ) {
386
+ const sessionId = req.headers['mcp-session-id'] as string | undefined;
387
+ let transport: StreamableHTTPServerTransport;
388
+
389
+ if (sessionId && transports.has(sessionId)) {
390
+ // 已有会话
391
+ transport = transports.get(sessionId)!;
392
+ } else if (!sessionId && req.method === 'POST') {
393
+ // 新会话
394
+ transport = new StreamableHTTPServerTransport({
395
+ sessionIdGenerator: () => randomUUID(),
396
+ onsessioninitialized: (id) => {
397
+ transports.set(id, transport);
398
+ console.error(`[MCP] 新会话: ${id}`);
399
+ },
400
+ });
401
+ transport.onclose = () => {
402
+ const id = transport.sessionId;
403
+ if (id) {
404
+ transports.delete(id);
405
+ console.error(`[MCP] 会话关闭: ${id}`);
406
+ }
407
+ };
408
+ await server.connect(transport);
409
+ } else if (sessionId && !transports.has(sessionId)) {
410
+ res.writeHead(404, { 'Content-Type': 'application/json' });
411
+ res.end(JSON.stringify({ error: '会话不存在' }));
412
+ return;
413
+ } else {
414
+ res.writeHead(400, { 'Content-Type': 'application/json' });
415
+ res.end(JSON.stringify({ error: '缺少 mcp-session-id' }));
416
+ return;
417
+ }
418
+
419
+ await transport.handleRequest(req, res);
420
+ }
@@ -20,10 +20,6 @@ function loadEnvConfig(): AppConfig {
20
20
  }
21
21
 
22
22
  // 服务器配置
23
- if (process.env.MCP_TRANSPORT === 'sse' || process.env.MCP_TRANSPORT === 'stdio') {
24
- config.server.transport = process.env.MCP_TRANSPORT;
25
- }
26
-
27
23
  if (process.env.MCP_PORT) {
28
24
  config.server.port = parseInt(process.env.MCP_PORT, 10);
29
25
  }
package/CLAUDE.md DELETED
@@ -1,83 +0,0 @@
1
- # CLAUDE.md
2
-
3
- This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
-
5
- ## 项目概述
6
-
7
- agent-browser-mcp 是一个 MCP (Model Context Protocol) 服务器,为 AI Agent 提供无头浏览器自动化能力。基于 [vercel-labs/agent-browser](https://github.com/vercel-labs/agent-browser),通过封装其 CLI 工具,将浏览器操作暴露为 MCP 工具供 AI 调用。
8
-
9
- ## 常用命令
10
-
11
- ```bash
12
- # 安装依赖
13
- npm install
14
-
15
- # 构建项目
16
- npm run build
17
-
18
- # 开发模式(使用 tsx 直接运行 TypeScript)
19
- npm run dev
20
-
21
- # 生产模式运行
22
- npm start
23
-
24
- # 运行测试
25
- npm test
26
-
27
- # SSE 模式启动
28
- MCP_TRANSPORT=sse MCP_PORT=9223 npm start
29
-
30
- # 连接远程 CDP 浏览器
31
- CDP_ENDPOINT="http://localhost:9222" npm start
32
-
33
- # npx 执行方式(无需本地安装)
34
- npx @coofly/agent-browser-mcp
35
- MCP_TRANSPORT=sse MCP_PORT=9223 npx @coofly/agent-browser-mcp
36
- CDP_ENDPOINT="http://localhost:9222" npx @coofly/agent-browser-mcp
37
- ```
38
-
39
- ## 架构概览
40
-
41
- ```
42
- src/
43
- ├── index.ts # 入口,加载配置并启动服务器
44
- ├── server.ts # MCP 服务器核心,处理 stdio/SSE 传输
45
- ├── config.ts # 配置类型定义和默认值
46
- ├── utils/
47
- │ ├── configLoader.ts # 配置加载(从环境变量读取)
48
- │ └── executor.ts # agent-browser CLI 命令执行器
49
- └── tools/ # MCP 工具实现,按功能分类
50
- ├── navigation.ts # 导航:open, back, forward, reload
51
- ├── interaction.ts # 交互:click, type, fill, hover, press
52
- ├── information.ts # 信息:snapshot, getText, getHtml
53
- ├── storage.ts # 存储相关
54
- └── advanced.ts # 高级:screenshot, scroll
55
- ```
56
-
57
- ### 核心流程
58
-
59
- 1. **配置加载** (`configLoader.ts`): 从环境变量读取配置
60
- 2. **服务器启动** (`server.ts`): 根据配置选择 stdio 或 SSE 传输模式
61
- 3. **工具调用**: MCP 请求 → `handleToolCall` → 对应 tools 模块 → `executeCommand` → 调用 `agent-browser` CLI
62
-
63
- ### 关键依赖
64
-
65
- - `@modelcontextprotocol/sdk`: MCP 协议实现
66
- - 外部依赖: 需要系统安装 `agent-browser` CLI 工具
67
-
68
- ## 配置方式
69
-
70
- 通过环境变量配置:
71
-
72
- | 环境变量 | 说明 | 默认值 |
73
- |----------|------|--------|
74
- | `MCP_TRANSPORT` | 传输模式 (`stdio` 或 `sse`) | `stdio` |
75
- | `MCP_PORT` | SSE 模式端口号 | `9223` |
76
- | `MCP_HOST` | SSE 模式监听地址 | `0.0.0.0` |
77
- | `CDP_ENDPOINT` | CDP 远程端点地址 | - |
78
- | `BROWSER_TIMEOUT` | 命令执行超时时间(毫秒) | `30000` |
79
-
80
- ## 传输模式
81
-
82
- - **stdio**: 默认模式,用于 Claude Desktop 等本地集成
83
- - **SSE**: HTTP 模式,端点 `/sse`(连接)、`/messages`(消息)、`/health`(健康检查)