@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 +10 -3
- package/README.md +78 -24
- package/README_ZH.md +78 -24
- package/dist/config.d.ts +2 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -1
- package/dist/config.js.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +67 -46
- package/dist/server.js.map +1 -1
- package/dist/utils/configLoader.d.ts.map +1 -1
- package/dist/utils/configLoader.js +0 -3
- package/dist/utils/configLoader.js.map +1 -1
- package/entrypoint.sh +15 -0
- package/package.json +1 -1
- package/src/config.ts +2 -5
- package/src/index.ts +0 -1
- package/src/server.ts +75 -56
- package/src/utils/configLoader.ts +0 -4
- package/CLAUDE.md +0 -83
package/Dockerfile
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# 构建阶段
|
|
2
|
-
FROM node:20-
|
|
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-
|
|
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
|
-
|
|
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
|
-
- **
|
|
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
|
|
22
|
+
# Run directly (auto-detects mode)
|
|
20
23
|
npx @coofly/agent-browser-mcp
|
|
21
24
|
|
|
22
|
-
#
|
|
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
|
-
| `
|
|
50
|
-
| `
|
|
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
|
-
###
|
|
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
|
-
###
|
|
87
|
+
### HTTP Mode Endpoints
|
|
64
88
|
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
###
|
|
142
|
+
### Using Docker Hub (Recommended)
|
|
118
143
|
|
|
119
144
|
```bash
|
|
120
|
-
|
|
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
|
-
###
|
|
180
|
+
### Build from Source
|
|
124
181
|
|
|
125
182
|
```bash
|
|
126
|
-
#
|
|
127
|
-
docker
|
|
183
|
+
# Build image
|
|
184
|
+
docker build -t agent-browser-mcp:latest .
|
|
128
185
|
|
|
129
|
-
#
|
|
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
|
-
-
|
|
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
|
-
#
|
|
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
|
-
| `
|
|
50
|
-
| `
|
|
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
|
-
###
|
|
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
|
-
###
|
|
87
|
+
### HTTP 模式端点
|
|
64
88
|
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
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
|
-
#
|
|
127
|
-
docker
|
|
183
|
+
# 构建镜像
|
|
184
|
+
docker build -t agent-browser-mcp:latest .
|
|
128
185
|
|
|
129
|
-
#
|
|
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
|
-
/**
|
|
18
|
-
transport: 'stdio' | 'sse';
|
|
19
|
-
/** SSE 模式下的端口号 */
|
|
17
|
+
/** HTTP 模式下的端口号 */
|
|
20
18
|
port: number;
|
|
21
|
-
/**
|
|
19
|
+
/** HTTP 模式下的监听地址 */
|
|
22
20
|
host: string;
|
|
23
21
|
}
|
|
24
22
|
/**
|
package/dist/config.d.ts.map
CHANGED
|
@@ -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,
|
|
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
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
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,
|
|
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"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;
|
|
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 {
|
|
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
|
-
|
|
257
|
-
|
|
258
|
-
|
|
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
|
-
* 启动
|
|
281
|
+
* 启动 HTTP 模式服务器(使用 StreamableHTTP)
|
|
274
282
|
*/
|
|
275
|
-
async function
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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: '
|
|
303
|
+
transport: 'streamable-http',
|
|
327
304
|
connections: transports.size
|
|
328
305
|
}));
|
|
329
306
|
return;
|
|
330
307
|
}
|
|
331
|
-
//
|
|
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(`[服务器]
|
|
317
|
+
console.error(`[服务器] HTTP 模式已启动`);
|
|
337
318
|
console.error(`[服务器] 监听地址: http://${host}:${port}`);
|
|
338
|
-
console.error(`[服务器]
|
|
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
|
package/dist/server.js.map
CHANGED
|
@@ -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;
|
|
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,
|
|
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
package/src/config.ts
CHANGED
|
@@ -16,11 +16,9 @@ export interface CdpConfig {
|
|
|
16
16
|
* 服务器配置
|
|
17
17
|
*/
|
|
18
18
|
export interface ServerConfig {
|
|
19
|
-
/**
|
|
20
|
-
transport: 'stdio' | 'sse';
|
|
21
|
-
/** SSE 模式下的端口号 */
|
|
19
|
+
/** HTTP 模式下的端口号 */
|
|
22
20
|
port: number;
|
|
23
|
-
/**
|
|
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 {
|
|
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
|
-
|
|
301
|
+
// 检测是否为 TTY(交互式终端)
|
|
302
|
+
const isTTY = process.stdin.isTTY;
|
|
301
303
|
|
|
302
|
-
if (
|
|
303
|
-
|
|
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
|
-
* 启动
|
|
327
|
+
* 启动 HTTP 模式服务器(使用 StreamableHTTP)
|
|
320
328
|
*/
|
|
321
|
-
async function
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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: '
|
|
353
|
+
transport: 'streamable-http',
|
|
385
354
|
connections: transports.size
|
|
386
355
|
}));
|
|
387
356
|
return;
|
|
388
357
|
}
|
|
389
358
|
|
|
390
|
-
//
|
|
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(`[服务器]
|
|
370
|
+
console.error(`[服务器] HTTP 模式已启动`);
|
|
397
371
|
console.error(`[服务器] 监听地址: http://${host}:${port}`);
|
|
398
|
-
console.error(`[服务器]
|
|
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`(健康检查)
|