TunnelAdmin
Web-based SSH connection manager with an MCP server that enables AI agents to manage remote hosts via terminals, file transfers, and port forwarding, featuring human-in-the-loop approval for secure access.
README
TunnelAdmin
English | 简体中文
基于 Web 的 SSH 连接管理器 + MCP Server。浏览器里管理主机、开终端、传文件、建隧道;AI Agent 通过 MCP 协议(Streamable HTTP)直接操作你的服务器——agent 首次连接每台主机都需要你在网页上确认(human-in-the-loop 审批),批准后可选择「始终信任」免审批直连。
纯 Vibe Coding 项目:本项目全部代码由 AI 驱动开发(Oh My Pi + DeepSeek V4 Flash 模型), 人工仅提供需求描述与验收反馈。截至当前,累计开发花费 $2(明细见文末开发统计)。
功能
| 模块 | 能力 |
|---|---|
| Web 终端 | 多标签/分屏(VSCode 编辑器组模型)、拖拽停靠、断线自动重连(指数退避,不丢现场)、tmux 会话持久(刷新/断连恢复)、Ctrl+F 搜索、命令补全、多行粘贴确认、主题预设、会话录制回放、连接状态徽标 |
| 主机管理 | 分组/标签/备注、凭据 AES-256-GCM 加密落盘、每主机信任开关 |
| SFTP 文件管理 | 目录浏览、拖拽上传(目录递归/进度条)、下载(流式+进度)、双击文本编辑(Ctrl+S 保存)、复制/剪切/粘贴、打包下载(tar 流式)、权限修改、文本预览、传输管理器(进行中/已完成) |
| 端口转发 | 远程转发为主:把目标内网端口暴露到部署服务器端口 |
| MCP Server | 16 个工具:ssh_list_hosts / ssh_connect / ssh_exec(支持后台任务)/ ssh_read_file / ssh_write_file / ssh_list_dir / ssh_stat / ssh_session_info / ssh_disconnect / ssh_job_status / ssh_tail(流式跟踪)/ ssh_tail_poll / ssh_tail_stop / ssh_port_forward / ssh_list_forwards / ssh_stop_forward;会话保持 cwd,命令超时与输出截断 |
| 危险命令规则 | 可配置正则规则(拦截/审批),如 rm -rf /、mkfs 默认拦截 |
| 共享会话 | MCP 建立的连接实时出现在 Web 终端(🤖 标签),点击即可在同一连接上打开自己的终端同时操作;agent 每条命令与输出实时镜像到该视图 |
| 连接审批 | agent 连接/危险命令请求实时推送 Web 弹窗,批准/拒绝/记住信任,60s 超时自动拒绝 |
| 监控 | 状态栏实时指标(CPU/内存/磁盘/网络)、近 3 分钟趋势 sparkline、告警阈值配置 |
| 审计日志 | MCP 命令全量记录(命令/退出码/耗时),Web 终端记录会话级 |
| 桌面客户端 | Electron 打包(Windows NSIS 安装器/便携版),内嵌 server、免登录、数据目录隔离 |
技术栈
- 后端:Node.js 22+ / TypeScript / Fastify 5 / ssh2 / better-sqlite3 / @modelcontextprotocol/sdk
- 前端:React 19 / Vite / xterm.js (@xterm/xterm 6) / Tailwind 4 / zustand
- 桌面:Electron 33 / electron-builder(Windows / Linux)
- 安全:密码登录(httpOnly cookie,可免登录模式)、MCP Bearer token、AES-256-GCM 凭据加密、主密钥 0600 文件
快速开始
npm install
# 开发模式(server :8080 + web :5173 热更新)
npm run dev
# 生产构建并启动(server 托管 web/dist)
npm run build
npm start
首次启动会在 data/ 下生成:
master.key— AES 主密钥(0600)password.hash— Web 登录密码哈希;初始密码打印在启动日志中(可在设置页修改)
环境变量
| 变量 | 默认 | 说明 |
|---|---|---|
PORT |
8080 | 监听端口 |
HOST |
0.0.0.0 | 监听地址 |
TUNNELADMIN_PASSWORD |
自动生成 | Web 登录密码 |
TUNNELADMIN_AUTH |
password | none = 免登录(桌面客户端用) |
TUNNELADMIN_MASTER_KEY |
自动生成 | 64 位 hex 主密钥(覆盖密钥文件) |
TUNNELADMIN_DATA_DIR |
./data | 数据目录 |
TUNNELADMIN_APPROVAL_TIMEOUT |
60000 | 审批超时(ms) |
TUNNELADMIN_MCP_TIMEOUT |
30000 | MCP 命令默认超时(ms) |
TUNNELADMIN_MCP_OUTPUT_LIMIT |
65536 | MCP 命令输出截断(字节) |
桌面客户端(Windows)
# Windows 侧一键打包(建议管理员运行;自动下载便携 Node/代理探测)
scripts\build-win.ps1
# 或双击 scripts\build-win.bat
产物:release\TunnelAdmin-<version>-x64.exe(安装器)+ .zip(便携版)。
桌面版自动免登录(TUNNELADMIN_AUTH=none),数据存于 %APPDATA%\tunneladmin。
MCP 接入 AI Agent
- Web 界面 → 设置 → MCP → 新建 Token(或「📋 复制提示词」一键生成接入说明)
- Agent 配置示例(Claude Code / Cursor 的
.mcp.json):
{
"mcpServers": {
"tunneladmin": {
"type": "http",
"url": "https://你的服务器:8080/mcp",
"headers": { "Authorization": "Bearer ta_xxxxx" }
}
}
}
- Agent 调用
ssh_connect时,你的浏览器会弹出确认框;批准后返回sessionId,后续ssh_exec/ 文件操作复用该会话并保持工作目录。
安全说明
- 公网部署务必置于 HTTPS 反向代理后(如 Caddy:
caddy reverse-proxy --from your.domain --to :8080) - MCP endpoint 强制 Bearer token 认证
- 凭据全量加密落盘;主密钥文件权限 0600,建议备份
- 单用户设计;多用户/RBAC 不在当前范围
目录结构
server/src/
index.ts 入口:Fastify + WS + MCP + 静态托管
config.ts 配置加载 / 密码与 cookie 签名
crypto.ts AES-256-GCM
db.ts SQLite schema
approval.ts agent 连接审批服务
events.ts WebSocket 事件总线
ws.ts 终端桥(xterm ↔ ssh2 流,断连检测 + tmux 持久)
ssh/manager.ts 连接池(跳板机链、keepalive)
routes/ auth / hosts / tokens / misc / sftp / forward
mcp/ MCP server(Streamable HTTP 无状态模式)+ 工具集
web/src/
pages/ Terminals(外层 tab:主机/编辑器/设置/传输/审计)/ tabs / Login
components/ TerminalView (xterm) / SideBar / ReplayOverlay / ApprovalModal
store.ts zustand(布局树 / 工作区持久化 / 传输记录)
desktop/ Electron 主进程 + server 启动器
scripts/ Windows 打包脚本(build-win.ps1 / bat)
设计要点
- Web 与 MCP 共享连接核心:连接配置、凭据解密、跳板机逻辑只有一份
- MCP 无状态模式:每个请求新建 Server + transport(SDK Protocol 单实例只支持单 transport),会话状态存进程级共享 Map
- 审批链路:MCP 请求挂起 → WS 推送弹窗 → 用户批准 → 连接建立,超时自动拒绝
- 共享会话:同一 SSH 连接可开多 channel——MCP 的 exec 与用户在 Web 附加的交互 shell 并行(ssh2 多 channel),agent 活动经
exec:activity事件实时镜像;终端协议按streamId区分多视图 - 终端保活:外层/内层 tab 切换不卸载终端(CSS 隐藏保持挂载);SSH 断连自动重连(5s→30s 退避)且 tmux 现场不丢
- 远程转发为主:部署在服务器上时「本地转发」的端口开在服务器上浏览器够不着,故主推远程转发;本地转发仅服务端进程可用
开发统计(Vibe Coding 用量)
<!-- usage -->
| 会话 | 输入 | 输出 | 缓存读 | 成本 |
|---|---|---|---|---|
| 1 | 566,921 | 1,136,316 | 605,990,144 | $2.09 |
| 累计(1 个会话) | 566,921 | 1,136,316 | 605,990,144 | $2.09 |
| <!-- /usage --> |
本表由
node scripts/update-usage.cjs自动生成(提交前运行):统计~/.omp/agent/sessions/-sources-tunneladmin/*.jsonl,每个会话文件 = 一次会话;新会话自动累加进「累计」。
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。