ssh-tmux-mcp
使用现有SSH ControlMaster套接字提供以下功能的本地MCP服务器:
- 远程文件访问(列表/读/写/统计/mkdir/rm/重命名)
- 通过tmux共享终端访问(捕获/发送/cwd)
这将使身份验证站在您这边。MCP服务器仅在SSH时工作 控制插座存在。
需求
- Linux(NixOS/WSL很好)
ssh在本地机器上tmux在远程主机上- 远程主机上的Coreutils(
base64,find,stat,dd,mkdir,rm,mv)
启动会话
- 启动SSH ControlMaster和tmux会话:
./ai-ssh user@host- 配置Codex以启动MCP服务器(示例)。插座在下面
/run/user//ai-ssh/ssh-remote.sock 和 ai-ssh 写a .info 文件如此 服务器可以推断 host 和 tmux:
[mcp_servers.ssh_tmux]
command = "python3"
args = ["/home/mike/ai/ssh-tmux-mcp/mcp_server.py", "--socket", "/run/user/1000/ai-ssh/ssh-remote.sock"]- 重新启动Codex,使其启动MCP服务器,然后使用
ssh_tmux工具。
退出tmux会话时,ControlMaster会自动关闭。
帮手:
./tmux-capture-recent [lines]打印共享tmux会话的最后N行。
本地模式(仅限tmux)
如果您希望在本地使用相同的协作tmux工作流(无SSH),请运行服务器 和 --local。如果缺少,它将创建tmux会话并启用日志管道。
配置示例:
[mcp_servers.tmux_local]
command = "python3"
args = ["/home/mike/ai/ssh-tmux-mcp/mcp_server.py", "--local", "--tmux-session", "shared-ai"]工具
sftp_list{路径}sftp_read{path,offset?,length?}->base64内容sftp_write{路径,内容}(base64)sftp_patch{路径、补丁、备份?、backup_suffix?}sftp_stat{路径}sftp_mkdir{路径,父母?}sftp_rm{路径,递归?}sftp_rename{src,dst}tmux_capture{会话?,行?}tmux_capture_scrollback{会话?,max_lines?}tmux_send{session?,keys,enter?}--用于交互式使用;更喜欢tmux_run对于命令tmux_run{session?,command,timeout_ms?}->输出+退出代码(直到完成为止)tmux_stream_read{session?,max_bytes?,reset?}->上次读取后的新输出tmux_cwd{会话?}ssh_exec{command}->输出(非交互式,无tmux)
备注
sftp_*工具是通过SSH命令(coreutils)实现的,而不是SFTP子系统。sftp_read/sftp_write使用base64是二进制安全的。sftp_patch在本地应用统一的差异,然后写回;它不需要patch在遥控器上。- 如果你想限制访问,请通过
--root /path约束文件操作。 - Tmux日志输出上限为
--max-log-size字节;旧的输出被截断以保留最后N个字节。 tmux_run使用PS1提示标记来检测命令完成。第一次调用时,它会将自定义PS1导出到shell中。这--prompt-timeout-ms标志控制默认超时(30秒)。
工作流程建议
- 更喜欢
sftp_*用于文件编辑(读/修改/写)的工具,以避免shell引用问题。 - 使用
tmux_run对于命令,它会阻塞直到完成并返回退出代码。对于交互式命令(vim、sudo提示),请使用tmux_send+tmux_capture. - 使用
ssh_exec用于在不需要共享tmux可见性时执行快速、非交互式命令。
