远程触控服务器

一个用于通过SSH远程控制Linux设备触摸屏的服务器,支持点击、滑动、长按、双击和键盘事件注入。

  • by signal-slot
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 signal-slot/mcp-remotetouch

使用说明

mcp遥控触摸

一种MCP服务器,用于通过SSH远程控制任何Linux设备上的触摸屏。

将轻击、滑动、长按、双击和键盘事件直接注入设备。守护程序会自动检测触摸屏和屏幕分辨率。键盘输入是通过创建的虚拟键盘设备注入的 /dev/uinput. 无需在远程设备上安装 --Python守护进程通过SSH通过stdin发送,仅使用Python的标准库。

建筑

标准模式(默认)

Dev Machine                              Remote Linux Device
┌──────────────────┐    SSH (persistent)  ┌──────────────────┐
│ MCP Server (TS)  │ ──────────────────> │ Python daemon    │
│ stdio transport   │    JSON-line proto  │ (stdlib only)     │
│                   │ <────────────────── │                  │
│ touch_tap         │                     │ Auto-detect      │
│ touch_swipe       │                     │ touchscreen      │
│ touch_long_press  │                     │   ↓              │
│ touch_double_tap  │                     │ /dev/input/eventN│
│ key_press         │                     │   ↓              │
│ key_type          │                     │ /dev/uinput (kbd)│
│ touch_disconnect  │                     │   ↓              │
│                   │                     │ Linux Input      │
└──────────────────┘                     └──────────────────┘

守护进程扫描 /proc/bus/input/devices 找到物理触摸屏(通过检查 INPUT_PROP_DIRECT 和 ABS_MT_POSITION_X),然后将事件直接注入其中。这在容器化合成器(例如,Torizon与Qt EGLFS)中可靠地工作,在这些合成器中可能无法检测到虚拟uinput设备。

HTTP服务器模式(--server)

AI Agent (remote) ──HTTP/SSE──> Express + StreamableHTTPServerTransport
                                         │
                                   McpServer (per MCP session)
                                         │
                                SshTouchSessionManager (shared)
                                         │
                                   SSH ──> Linux Device

先决条件

Dev机器

  • Node.js 18+
  • SSH客户端

远程设备

  • 任何带有触摸屏的Linux设备(Raspberry Pi、SBC、嵌入式系统等)
  • Python 3
  • 读/写访问 /dev/input/eventN (触摸屏设备)
  • 写入访问权限 /dev/uinput (用于键盘输入——可选,无需触摸即可工作)

将用户添加到 input 远程设备上的组:

sudo usermod -aG input $USER

重新登录以使更改生效。或者,使用 useSudo 选项。

安装

npm install -g mcp-remotetouch

或者直接与 npx:

npx mcp-remotetouch

用法

添加到您的MCP客户端配置中(例如Claude Desktop的 claude_desktop_config.json):

{
  "mcpServers": {
    "remotetouch": {
      "command": "npx",
      "args": ["mcp-remotetouch"],
      "env": {}
    }
  }
}

设备会自动检测屏幕分辨率。您可以用以下命令覆盖它 REMOTETOUCH_SCREEN_WIDTH 和 REMOTETOUCH_SCREEN_HEIGHT 如果需要的话。

环境变量

变量 默认值 描述
REMOTETOUCH_SSH_HOST (无) 远程设备的SSH主机
REMOTETOUCH_SSH_USER pi SSH用户名
REMOTETOUCH_SSH_PORT 22 SSH端口
REMOTETOUCH_SSH_KEY (无) SSH私钥路径
REMOTETOUCH_SCREEN_WIDTH 自动检测 屏幕宽度(像素)
REMOTETOUCH_SCREEN_HEIGHT 自动检测 屏幕高度(像素)
REMOTETOUCH_USE_SUDO false 使用sudo运行守护进程

工具

touch_connect

通过SSH连接到远程Linux设备并启动触摸守护进程。返回会话ID。

参数 类型 说明
host 弦? SSH主机
user 弦? SSH用户名
port 号码? SSH端口
sshKey 弦?SSH私钥的路径
screenWidth 号码? 屏幕宽度(如果省略,则自动检测)
screenHeight 号码? 屏幕高度(如果省略,则自动检测)
useSudo 布尔值? 使用sudo运行

touch_tap

点击给定的坐标。

参数 类型 说明
sessionId string 会话ID
x 数字 X坐标
y 数字 Y坐标
duration_ms 号码? 点击持续时间(默认值:50ms)

touch_swipe

从(x1,y1)滑动到(x2,y2)。

参数 类型 说明
sessionId string 会话ID
x1 number 起始X坐标
y1 number 起始Y坐标
x2 number 结束X坐标
y2 number 结束Y坐标
duration_ms 号码? 滑动持续时间(默认值:300ms)
steps 号码? 插值步数

touch_long_press

在给定坐标处长按。

参数 类型 说明
sessionId string 会话ID
x 数字 X坐标
y 数字 Y坐标
duration_ms 号码? 按压持续时间(默认值:800ms)

touch_double_tap

在给定坐标处双击。

参数 类型 说明
sessionId string 会话ID
x 数字 X坐标
y 数字 Y坐标

key_press

按带有可选修改键的键。需要 /dev/uinput 远程设备上的访问。

参数 类型 说明
sessionId string 会话ID
key string 键名(例如。 enter, a, tab, f1, up, space)
modifiers string[]? 要按住的修改键(例如。 ["ctrl"], ["ctrl", "shift"])

key_type

通过模拟单个按键来键入文本字符串。需要 /dev/uinput 远程设备上的访问。

参数 类型 说明
sessionId string 会话ID
text string 要键入的文本(例如。 Hello, World!)

touch_disconnect

断开会话连接并清理远程守护进程。

参数 类型 说明
sessionId string 会话ID

touch_list_sessions

列出所有活动会话。没有参数。

HTTP服务器模式

您可以运行以下命令,而不是作为stdio MCP服务器运行 mcp-remotetouch 作为AI代理可以通过HTTP远程连接的HTTP服务器。

启动服务器

# Default: listen on 0.0.0.0:3000
npx mcp-remotetouch --server

# Custom port and host
npx mcp-remotetouch --server --port 8080 --host 127.0.0.1

CLI参数

参数 默认值 描述
--server (关闭) 启用HTTP服务器模式
--port <N> 3000 (或 REMOTETOUCH_PORT env) HTTP侦听端口
--host <addr> 0.0.0.0 绑定地址

没有 --server,进程在stdio模式下运行(默认的向后兼容行为)。

工作流程

Claude Desktop的典型会话:

  1. touch_connect --连接到远程设备
  2. touch_tap / touch_swipe / touch_long_press / touch_double_tap --与屏幕交互
  3. key_press / key_type --发送键盘输入
  4. touch_disconnect --结束会话

故障排除

权限不足

远程设备上的用户需要访问 /dev/input/eventN。要么:

  • 将用户添加到 input 组: sudo usermod -aG input $USER (需要重新登录)
  • 或设置 REMOTETOUCH_USE_SUDO=true

未找到物理触摸屏设备

守护进程在中找不到触摸屏 /proc/bus/input/devices.验证:

  • 该设备连接了触摸屏,并加载了驱动程序
  • 设备显示 INPUT_PROP_DIRECT 并且已经 ABS_MT_POSITION_X 能力

键盘输入不可用

这 key_press 和 key_type 工具需要写入权限 /dev/uinput。如果报告键盘不可用:

  • 添加udev规则以授予访问权限:
    echo 'KERNEL=="uinput", GROUP="input", MODE="0660"' | sudo tee /etc/udev/rules.d/99-uinput.rules
    sudo udevadm control --reload-rules && sudo udevadm trigger
    
  • 确保用户在 input 组: sudo usermod -aG input $USER (需要重新登录)
  • 或设置 REMOTETOUCH_USE_SUDO=true

即使在以下情况下,触摸工具仍能继续工作 /dev/uinput 无法访问。

SSH连接失败

  • 确保为远程设备配置了SSH公钥身份验证(不支持密码身份验证,因为连接使用 BatchMode=yes)
  • 验证主机名和端口是否正确

许可证

麻省理工学院