cvm-vnc 0.1.9__tar.gz

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.
cvm_vnc-0.1.9/PKG-INFO ADDED
@@ -0,0 +1,179 @@
1
+ Metadata-Version: 2.4
2
+ Name: cvm-vnc
3
+ Version: 0.1.9
4
+ Summary: Tencent Cloud CVM VNC browser control via agent-browser with MCP server support
5
+ Author: Curu
6
+ License: MIT
7
+ Classifier: Programming Language :: Python :: 3
8
+ Classifier: License :: OSI Approved :: MIT License
9
+ Classifier: Operating System :: OS Independent
10
+ Requires-Python: >=3.10
11
+ Description-Content-Type: text/markdown
12
+ Provides-Extra: dotenv
13
+ Requires-Dist: python-dotenv; extra == "dotenv"
14
+ Provides-Extra: mcp
15
+ Requires-Dist: mcp[cli]>=1.0.0; extra == "mcp"
16
+
17
+ # cvm-vnc
18
+
19
+ 通过 `agent-browser` 对 Web VNC 页面进行程序化控制的 Python 工具,支持屏幕截图、文本输入和页面状态检测,并提供 MCP (Model Context Protocol) Server 供 AI Agent 集成。
20
+
21
+ ## 功能特性
22
+
23
+ - **VNC 页面控制** — 打开并操作 Web VNC 界面
24
+ - **屏幕截图** — 将 VNC Canvas 捕获为 PNG 图片
25
+ - **智能文本输入** — 自动识别输入方式(远程命令对话框 / noVNC 键盘 / Canvas 直接输入等)
26
+ - **MCP Server** — 以 stdio 模式运行,供 AI Agent 调用
27
+ - **登录检测** — 自动识别 VNC 页面跳转至登录页的场景
28
+ - **终端网格估算** — 根据 Canvas 尺寸启发式推算终端行列数
29
+
30
+ ## 安装
31
+
32
+ ### 从源码安装(开发模式)
33
+
34
+ ```bash
35
+ git clone <repo-url>
36
+ cd cvm-vnc
37
+ pip install -e .
38
+ ```
39
+
40
+ `-e`(editable)模式会将当前源码目录链接为已安装包,修改代码后无需重新安装即可生效。
41
+
42
+ ### 从 PyPI 安装
43
+
44
+ ```bash
45
+ pip install cvm-vnc
46
+ ```
47
+
48
+ ### 可选依赖
49
+
50
+ ```bash
51
+ # dotenv 支持(从 .env 文件加载环境变量)
52
+ pip install -e '.[dotenv]'
53
+ ```
54
+
55
+ ### 前置依赖
56
+
57
+ 需要系统中安装 [agent-browser](https://www.npmjs.com/package/agent-browser)(Node.js CLI 工具):
58
+
59
+ ```bash
60
+ npm install -g agent-browser
61
+ ```
62
+
63
+ ## 使用方式
64
+
65
+ ### CLI 命令
66
+
67
+ ```bash
68
+ # 打开 VNC 页面
69
+ cvm-vnc open <url> [--wait-ms MS] [--session NAME] [--headed]
70
+
71
+ # 截取 VNC 屏幕
72
+ cvm-vnc capture [output] [--session NAME] [--headed]
73
+
74
+ # 发送文本输入
75
+ cvm-vnc type <text> [--enter] [--session NAME] [--headed]
76
+
77
+ # 批量顺序输入(避免 AI 思考间隙导致登录超时)
78
+ cvm-vnc type-sequence --steps-json '<JSON>' [--mode MODE] [--session NAME]
79
+
80
+ # 关闭浏览器会话
81
+ cvm-vnc close [--session NAME]
82
+
83
+ # 启动 MCP Server
84
+ cvm-vnc mcp [--session-default NAME] [--mode-default MODE] [--headed]
85
+ ```
86
+
87
+ 也可通过独立入口直接启动 MCP Server:
88
+
89
+ ```bash
90
+ cvm-vnc-mcp
91
+ ```
92
+
93
+ ### MCP Server Tools
94
+
95
+ MCP Server 对外暴露以下工具:
96
+
97
+ | 工具 | 说明 |
98
+ |------|------|
99
+ | `vnc_open(url, wait_ms, session)` | 打开 VNC 页面 |
100
+ | `vnc_status(session)` | 检查页面状态(Canvas 元数据、登录检测等) |
101
+ | `vnc_capture(output_path, session)` | 截取 Canvas 为 PNG |
102
+ | `vnc_type(text, press_enter, session, mode)` | 发送文本输入 |
103
+ | `vnc_type_sequence(steps, session, mode)` | 批量顺序输入(适合系统登录等需要连续输入的场景) |
104
+ | `vnc_close(session)` | 关闭浏览器会话,释放资源 |
105
+
106
+ ### 示例
107
+
108
+ ```bash
109
+ # 打开 VNC 并等待页面加载
110
+ cvm-vnc open https://vnc.example.com --wait-ms 3000
111
+
112
+ # 截图保存到文件
113
+ cvm-vnc capture /tmp/screen.png
114
+
115
+ # 执行命令
116
+ cvm-vnc type "ls -la" --enter
117
+
118
+ # 一次性完成系统登录(用户名 + 密码)
119
+ cvm-vnc type-sequence --steps-json '[{"text":"root","press_enter":true,"wait_ms":500},{"text":"password","press_enter":true}]'
120
+
121
+ # 关闭浏览器会话
122
+ cvm-vnc close
123
+ ```
124
+
125
+ ## 项目结构
126
+
127
+ ```
128
+ src/cvm_vnc/
129
+ ├── __init__.py # 版本信息
130
+ ├── __main__.py # CLI 入口
131
+ └── vnc_browser.py # 核心实现(浏览器控制、MCP Server、JS 注入脚本)
132
+ ```
133
+
134
+ ## MCP Server 配置
135
+
136
+ 安装完成后,可将 cvm-vnc 作为 MCP Server 接入 AI 客户端。
137
+
138
+ ### Claude Code
139
+
140
+ ```bash
141
+ claude mcp add cvm-vnc -- cvm-vnc-mcp
142
+ ```
143
+
144
+ 添加后可通过以下命令验证:
145
+
146
+ ```bash
147
+ claude mcp list
148
+ ```
149
+
150
+ ### Codebuddy
151
+
152
+ ```bash
153
+ codebuddy mcp add cvm-vnc -- cvm-vnc-mcp
154
+ ```
155
+
156
+ 或手动编辑 `~/.codebuddy/settings.json`:
157
+
158
+ ```json
159
+ {
160
+ "mcpServers": {
161
+ "cvm-vnc": {
162
+ "command": "cvm-vnc-mcp"
163
+ }
164
+ }
165
+ }
166
+ ```
167
+
168
+ > **提示**:如果 `cvm-vnc-mcp` 不在 PATH 中,需使用完整路径,例如 `/path/to/venv/bin/cvm-vnc-mcp`。
169
+
170
+ ## 配置
171
+
172
+ | 环境变量 | 说明 | 默认值 |
173
+ |----------|------|--------|
174
+ | `AGENT_BROWSER_BIN` | agent-browser 可执行文件路径 | 自动查找 |
175
+ | `LOCK_TIMEOUT` | 会话锁超时时间(秒) | 120 |
176
+
177
+ ## License
178
+
179
+ MIT
@@ -0,0 +1,163 @@
1
+ # cvm-vnc
2
+
3
+ 通过 `agent-browser` 对 Web VNC 页面进行程序化控制的 Python 工具,支持屏幕截图、文本输入和页面状态检测,并提供 MCP (Model Context Protocol) Server 供 AI Agent 集成。
4
+
5
+ ## 功能特性
6
+
7
+ - **VNC 页面控制** — 打开并操作 Web VNC 界面
8
+ - **屏幕截图** — 将 VNC Canvas 捕获为 PNG 图片
9
+ - **智能文本输入** — 自动识别输入方式(远程命令对话框 / noVNC 键盘 / Canvas 直接输入等)
10
+ - **MCP Server** — 以 stdio 模式运行,供 AI Agent 调用
11
+ - **登录检测** — 自动识别 VNC 页面跳转至登录页的场景
12
+ - **终端网格估算** — 根据 Canvas 尺寸启发式推算终端行列数
13
+
14
+ ## 安装
15
+
16
+ ### 从源码安装(开发模式)
17
+
18
+ ```bash
19
+ git clone <repo-url>
20
+ cd cvm-vnc
21
+ pip install -e .
22
+ ```
23
+
24
+ `-e`(editable)模式会将当前源码目录链接为已安装包,修改代码后无需重新安装即可生效。
25
+
26
+ ### 从 PyPI 安装
27
+
28
+ ```bash
29
+ pip install cvm-vnc
30
+ ```
31
+
32
+ ### 可选依赖
33
+
34
+ ```bash
35
+ # dotenv 支持(从 .env 文件加载环境变量)
36
+ pip install -e '.[dotenv]'
37
+ ```
38
+
39
+ ### 前置依赖
40
+
41
+ 需要系统中安装 [agent-browser](https://www.npmjs.com/package/agent-browser)(Node.js CLI 工具):
42
+
43
+ ```bash
44
+ npm install -g agent-browser
45
+ ```
46
+
47
+ ## 使用方式
48
+
49
+ ### CLI 命令
50
+
51
+ ```bash
52
+ # 打开 VNC 页面
53
+ cvm-vnc open <url> [--wait-ms MS] [--session NAME] [--headed]
54
+
55
+ # 截取 VNC 屏幕
56
+ cvm-vnc capture [output] [--session NAME] [--headed]
57
+
58
+ # 发送文本输入
59
+ cvm-vnc type <text> [--enter] [--session NAME] [--headed]
60
+
61
+ # 批量顺序输入(避免 AI 思考间隙导致登录超时)
62
+ cvm-vnc type-sequence --steps-json '<JSON>' [--mode MODE] [--session NAME]
63
+
64
+ # 关闭浏览器会话
65
+ cvm-vnc close [--session NAME]
66
+
67
+ # 启动 MCP Server
68
+ cvm-vnc mcp [--session-default NAME] [--mode-default MODE] [--headed]
69
+ ```
70
+
71
+ 也可通过独立入口直接启动 MCP Server:
72
+
73
+ ```bash
74
+ cvm-vnc-mcp
75
+ ```
76
+
77
+ ### MCP Server Tools
78
+
79
+ MCP Server 对外暴露以下工具:
80
+
81
+ | 工具 | 说明 |
82
+ |------|------|
83
+ | `vnc_open(url, wait_ms, session)` | 打开 VNC 页面 |
84
+ | `vnc_status(session)` | 检查页面状态(Canvas 元数据、登录检测等) |
85
+ | `vnc_capture(output_path, session)` | 截取 Canvas 为 PNG |
86
+ | `vnc_type(text, press_enter, session, mode)` | 发送文本输入 |
87
+ | `vnc_type_sequence(steps, session, mode)` | 批量顺序输入(适合系统登录等需要连续输入的场景) |
88
+ | `vnc_close(session)` | 关闭浏览器会话,释放资源 |
89
+
90
+ ### 示例
91
+
92
+ ```bash
93
+ # 打开 VNC 并等待页面加载
94
+ cvm-vnc open https://vnc.example.com --wait-ms 3000
95
+
96
+ # 截图保存到文件
97
+ cvm-vnc capture /tmp/screen.png
98
+
99
+ # 执行命令
100
+ cvm-vnc type "ls -la" --enter
101
+
102
+ # 一次性完成系统登录(用户名 + 密码)
103
+ cvm-vnc type-sequence --steps-json '[{"text":"root","press_enter":true,"wait_ms":500},{"text":"password","press_enter":true}]'
104
+
105
+ # 关闭浏览器会话
106
+ cvm-vnc close
107
+ ```
108
+
109
+ ## 项目结构
110
+
111
+ ```
112
+ src/cvm_vnc/
113
+ ├── __init__.py # 版本信息
114
+ ├── __main__.py # CLI 入口
115
+ └── vnc_browser.py # 核心实现(浏览器控制、MCP Server、JS 注入脚本)
116
+ ```
117
+
118
+ ## MCP Server 配置
119
+
120
+ 安装完成后,可将 cvm-vnc 作为 MCP Server 接入 AI 客户端。
121
+
122
+ ### Claude Code
123
+
124
+ ```bash
125
+ claude mcp add cvm-vnc -- cvm-vnc-mcp
126
+ ```
127
+
128
+ 添加后可通过以下命令验证:
129
+
130
+ ```bash
131
+ claude mcp list
132
+ ```
133
+
134
+ ### Codebuddy
135
+
136
+ ```bash
137
+ codebuddy mcp add cvm-vnc -- cvm-vnc-mcp
138
+ ```
139
+
140
+ 或手动编辑 `~/.codebuddy/settings.json`:
141
+
142
+ ```json
143
+ {
144
+ "mcpServers": {
145
+ "cvm-vnc": {
146
+ "command": "cvm-vnc-mcp"
147
+ }
148
+ }
149
+ }
150
+ ```
151
+
152
+ > **提示**:如果 `cvm-vnc-mcp` 不在 PATH 中,需使用完整路径,例如 `/path/to/venv/bin/cvm-vnc-mcp`。
153
+
154
+ ## 配置
155
+
156
+ | 环境变量 | 说明 | 默认值 |
157
+ |----------|------|--------|
158
+ | `AGENT_BROWSER_BIN` | agent-browser 可执行文件路径 | 自动查找 |
159
+ | `LOCK_TIMEOUT` | 会话锁超时时间(秒) | 120 |
160
+
161
+ ## License
162
+
163
+ MIT
@@ -0,0 +1,31 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68.0", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "cvm-vnc"
7
+ version = "0.1.9"
8
+ description = "Tencent Cloud CVM VNC browser control via agent-browser with MCP server support"
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ license = {text = "MIT"}
12
+ authors = [
13
+ {name = "Curu"},
14
+ ]
15
+ classifiers = [
16
+ "Programming Language :: Python :: 3",
17
+ "License :: OSI Approved :: MIT License",
18
+ "Operating System :: OS Independent",
19
+ ]
20
+ dependencies = []
21
+
22
+ [project.optional-dependencies]
23
+ dotenv = ["python-dotenv"]
24
+ mcp = ["mcp[cli]>=1.0.0"]
25
+
26
+ [project.scripts]
27
+ cvm-vnc = "cvm_vnc.__main__:cli"
28
+ cvm-vnc-mcp = "cvm_vnc.__main__:cli_mcp"
29
+
30
+ [tool.setuptools.packages.find]
31
+ where = ["src"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,7 @@
1
+ """CVM VNC package."""
2
+
3
+ __version__ = "0.1.9"
4
+
5
+ from cvm_vnc.vnc_browser import VncError
6
+
7
+ __all__ = ["__version__", "VncError"]
@@ -0,0 +1,57 @@
1
+ """Allow running as `python -m cvm_vnc`."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ import sys
7
+ from collections.abc import Sequence
8
+
9
+ from cvm_vnc.vnc_browser import MODE_PROFILES, load_dotenv_file, main, run_mcp_server
10
+
11
+
12
+ def _parse_mcp_alias_args(argv: Sequence[str]) -> argparse.Namespace:
13
+ parser = argparse.ArgumentParser(
14
+ prog=argv[0] if argv else "cvm-vnc-mcp",
15
+ description="Run a stdio MCP server for VNC browser control.",
16
+ )
17
+ parser.add_argument(
18
+ "--session",
19
+ help="agent-browser session name to reuse. Defaults to current agent-browser default session.",
20
+ )
21
+ parser.add_argument(
22
+ "--headed",
23
+ action="store_true",
24
+ help="run agent-browser in headed mode for commands that launch a browser",
25
+ )
26
+ parser.add_argument(
27
+ "--session-default",
28
+ default="vnc-mcp",
29
+ help="default agent-browser session name for MCP tools (default: vnc-mcp)",
30
+ )
31
+ parser.add_argument(
32
+ "--mode-default",
33
+ choices=tuple(MODE_PROFILES),
34
+ default="stable",
35
+ help="default timing profile for MCP tools (default: stable)",
36
+ )
37
+ return parser.parse_args(list(argv[1:]))
38
+
39
+
40
+ def cli() -> None:
41
+ try:
42
+ main()
43
+ except KeyboardInterrupt:
44
+ sys.exit(130)
45
+
46
+
47
+ def cli_mcp() -> None:
48
+ load_dotenv_file()
49
+ args = _parse_mcp_alias_args(sys.argv)
50
+ try:
51
+ run_mcp_server(args)
52
+ except KeyboardInterrupt:
53
+ sys.exit(130)
54
+
55
+
56
+ if __name__ == "__main__":
57
+ cli()