关于 Replit SSH
Replit SSH 是本地 MCP 服务,通过 SSH/SFTP 访问 Replit 项目文件,提供文件操作和 SSH 配置功能,并包含主机限制、原子写入校验及安全的 SSH 配置解析。
主要功能
- 01检查 SSH 和 SFTP 连接
- 02列出、读取和搜索项目文件
- 03查看文件元数据
- 04写入、移动和删除文件
- 05生成 SSH 密钥和配置块
适用场景
- 01检查项目文件和 package 脚本
- 02搜索源文件中的匹配文本
- 03更新或移动 Replit 项目文件
- 04配置本地 Replit SSH 访问
MCP 相关
向 MCP 主机提供九项工具,用于检查 SSH 连接、执行 SFTP 文件操作和配置 SSH。它从操作者的机器连接到 `*.replit.dev` 主机,并使用本地 SSH 密钥。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y @mindstone/mcp-server-replit-sshREPLIT_SSH_REQUEST_TIMEOUT_MSOptional per-request timeout in milliseconds (default 60000, max 600000).MCP_REPLIT_SSH_STRICT_HOST_KEY密钥Set to 1 to require pre-populated known-hosts entries. When unset (default), unknown hosts are recorded on first contact (OpenSSH `accept-new` behaviour); a fingerprint mismatch always fails closed.MCP_REPLIT_SSH_KNOWN_HOSTS_PATHExplicit path to the connector's SSH known-hosts file. Defaults to $MCP_WORKSPACE_PATH/.replit-ssh-known-hosts, then $HOME/.replit-mcp/known_hosts.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
9收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| host | string | 是 | SSH 主机(例如:"<uuid>-00-<hash>.riker.replit.dev") |
| user | string | 是 | SSH 用户名——"Connect manually" SSH 命令中 @ 之前的值(UUID) |
| verbose | boolean | 否 | 启用详细诊断——捕获握手、身份验证尝试、密钥验证和计时信息。排查连接或身份验证失败时使用。 |
详细介绍
@mindstone/mcp-server-replit-ssh
Replit SSH MCP 服务——通过 SSH/SFTP 在 Replit 项目上读取、写入、列出、搜索、查看状态、移动和删除文件,还可以一次性生成本地 SSH 密钥和 ~/.ssh/config 配置块。
本地 Replit SSH MCP。仅从操作者的机器连接到 *.replit.dev 主机,写入操作采用原子方式并通过 SHA-256 回读验证,且重写 ~/.ssh/config 时使用 AST 解析,而非通过 Match exec 执行 shell 命令。
状态
- 版本: 0.2.2 · npm
- 认证: 磁盘上的本地 SSH 密钥(默认位于
~/.ssh/rebel-replit;如果设置了~/.ssh/config中的IdentityFile,则使用该路径)。不使用环境变量提供机密信息。 - 工具: 9(连接、文件、ssh-setup)
- 接口: local-protocol
- 机器可读:
STATUS.json
为什么要开发它
Replit 提供托管的“Agent”体验,但没有为 Core 用户使用的 SSH/SFTP 接口发布 MCP 服务。我们开发此项目时,社区方案要么会调用系统的 ssh 二进制文件(因此连接失败只会显示通用的非零退出代码),要么会使用上游 [email protected] 包解析 ~/.ssh/config,而该包会通过 shell 执行 Match exec "<cmd>" 块——这会导致任何读取用户控制的配置文件的使用方遭受本地代码执行。我们自行开发了此服务,使宿主应用能够从操作者自己的机器读取、列出并以原子方式写入 Replit 项目中的文件,同时将主机白名单限定为 *.replit.dev,采用安全的纯 AST 配置解析器,每次写入后都进行 SHA-256 回读验证,并为每次工具错误提供结构化恢复约定。
交互示例
“列出我的 Replit 项目中的文件,然后读取
package.json并告诉我定义了哪些脚本。”
宿主调用的工具:
replit_check_connection— 验证 SSH 连接和 SFTP 支持情况,并返回延迟。replit_list_files— 列出.目录下的文件和目录。replit_read_file— 将项目根目录中的package.json作为 UTF-8 文本读取。
响应(节选):
{
"ok": true,
"files": [
{ "name": "package.json", "type": "file", "size": 612 },
{ "name": "src", "type": "directory" }
],
"package": {
"scripts": {
"dev": "node src/index.js",
"test": "vitest run"
}
}
}
要求
- Node.js 20+
- npm
- 拥有 SSH 访问权限的 Replit 账户(Replit Core 或更高版本)
- Replit 项目中可用的
*.replit.dev主机(打开项目,点击 SSH → Connect → Connect manually,复制主机名和用户名) - 已在 replit.com/account#ssh-keys 注册的 SSH 密钥。如果还没有密钥,可运行一次
replit_setup_ssh生成。
一键安装
点击按钮后,宿主将提示你填写:REPLIT_SSH_REQUEST_TIMEOUT_MS。
Claude Desktop / Claude Code / Goose / Continue.dev(Replit SSH)的手动配置
{
"mcpServers": {
"Replit SSH": {
"command": "npx",
"args": [
"-y",
"@mindstone/mcp-server-replit-ssh"
],
"env": {
"REPLIT_SSH_REQUEST_TIMEOUT_MS": "60000"
}
}
}
}
快速开始
安装并构建
cd <path-to-repo>/connectors/replit-ssh
npm install
npm run build
npx(发布后使用)
npx -y @mindstone/mcp-server-replit-ssh
本地
node dist/index.js
配置
此服务没有必需的环境变量。身份验证通过 ~/.ssh/config 中解析的本地 SSH 密钥进行。
可选环境变量
REPLIT_SSH_REQUEST_TIMEOUT_MS— 每个请求的超时时间,单位为毫秒(默认值:60000,最大值600000)。SFTP 操作的工具级超时时间;较低层的 TCP/SSH 握手使用单独的 30 秒时限。MCP_REPLIT_SSH_STRICT_HOST_KEY— 设置为1,要求已预先填充 known-hosts 条目。未设置时(默认),首次连接会记录未知主机(与 OpenSSH 的StrictHostKeyChecking=accept-new一致);后续连接时指纹不匹配则始终会拒绝连接,无论此标志的值为何。请参阅下方 安全说明 中的 SSH 主机密钥验证条目。MCP_REPLIT_SSH_KNOWN_HOSTS_PATH— 连接器 SSH known-hosts 文件的显式路径。默认为$MCP_WORKSPACE_PATH/.replit-ssh-known-hosts,若不存在则回退到$HOME/.replit-mcp/known_hosts。文件将以0o600权限创建,父目录则以0o700权限创建。
宿主配置示例
Claude Desktop / Cursor
{
"mcpServers": {
"ReplitSSH": {
"command": "npx",
"args": ["-y", "@mindstone/mcp-server-replit-ssh"]
}
}
}
本地开发(无需发布到 npm)
{
"mcpServers": {
"ReplitSSH": {
"command": "node",
"args": ["<path-to-repo>/connectors/replit-ssh/dist/index.js"]
}
}
}
宿主启动服务后,运行一次 replit_setup_ssh 以生成本地密钥,然后将打印出的公钥添加到 replit.com/account#ssh-keys。
工具(9)
读取
replit_check_connection— 验证 SSH 连通性、工作目录和 SFTP 支持。设置verbose=true可查看握手/身份验证诊断信息。replit_list_files— 列出指定路径下的文件和目录(相对于项目根目录)。默认路径为.。条目类型为file/directory/symlink(符号链接会报告为链接,不会跟随 — 与replit_stat一致)。replit_read_file— 读取文件(上限为 1 MiB;较大的文件会以FILE_TOO_LARGE报错,不会静默截断)。默认按 UTF-8 文本读取;二进制文件(通过空字节扫描检测)会以 base64 返回。replit_search_files— 递归搜索文件名子串和/或文本内容子串(不区分大小写),并设有结果上限(max_results,默认 50)和深度上限(max_depth,默认 4)。内容搜索会跳过二进制文件和超过 1 MB 的文件。返回匹配路径;对于内容匹配的文件,每个文件最多返回 5 行匹配内容及其行号(文件中还有更多匹配行时,lineMatchesTruncated: true)。replit_stat— 获取文件/目录元数据(类型、大小、权限、mtime/atime),而不读取内容。符号链接会报告为symlink类型(通过lstat),不会跟随。
写入
replit_write_file— 通过temp + ext_openssh_rename原子写入,并进行 SHA-256 回读验证。如果服务端不支持原子覆盖且目标已存在,则会安全失败(我们绝不会执行unlink + rename,以免造成数据丢失风险)。replit_move— 移动或重命名文件或目录。绝不覆盖:如果目标路径已被占用,则以DESTINATION_EXISTS报错。目标父目录必须已存在。replit_delete_file— 永久删除文件(仅限文件,不包括目录)。在 Replit 上,删除操作不可撤销 — 没有回收站 — 因此该工具带有destructiveHint: true,并依赖宿主的工具审批层作为拦截机制。replit_setup_ssh— 在~/.ssh/rebel-replit生成 Ed25519 密钥对,将公钥/私钥文件的权限设为0600(或在 Windows 上设置icaclsACL),并向~/.ssh/config追加*.replit.dev配置块。默认具有幂等性;传入force_regenerate=true可替换现有密钥(你需要向 Replit 重新注册新的公钥)。
安全说明
- 主机允许列表。 只接受
*.replit.dev主机,采用不区分大小写的后缀匹配。任何其他主机都会在打开 SSH 连接前被拒绝。 ~/.ssh/修改范围。replit_setup_ssh会写入操作者的主目录(~/.ssh/rebel-replit、~/.ssh/rebel-replit.pub、~/.ssh/config)。配置重写采用仅限 AST 的安全求值器,完全跳过Match exec块,而不是使用会通过 shell 执行这些块的上游ssh-config.compute()(通过spawnSync)。- 路径遍历。 拒绝绝对路径和任何
..路径段后,会对 SFTP 文件路径进行 POSIX 规范化——仅允许相对路径,不得逃出项目根目录。 - 原子写入不变量。
replit_write_file会写入随机临时文件名,通过 OpenSSH 的 POSIX rename 扩展(ext_openssh_rename)进行重命名,并根据预期哈希验证最终文件的 SHA-256。如果服务器不支持该扩展且目标文件已存在,则写入会失败,而不会回退到unlink + rename。 - 回读验证。 每次
replit_write_file都会重新读取最终文件,并在返回verified: true前确认 SHA-256 相同。 - SSH 主机密钥验证。 每个出站 SSH 连接都会向 ssh2 显式传入
hostVerifier,以便根据每用户的 known-hosts 文件(模式0o600)固定服务器指纹。默认行为与 OpenSSH 的StrictHostKeyChecking=accept-new一致:连接器首次连接到某主机时,会记录其 SHA-256 指纹并向 stderr 记录提示;后续连接若指纹不匹配,则会关闭连接并返回HOST_KEY_MISMATCH。固定项以稳定的代理后缀为键(去掉首个 DNS 标签,例如riker.replit.dev),因为 Replit 会在每次重启时轮换每个项目的主机名——轮换后的主机名若呈现与已记录后缀固定项不同的密钥,则会关闭连接。去标签操作最多进行到三级域名:三级域名主机以完整主机名作为固定项,且不会查询裸replit.dev条目作为固定项,因此不会有单个条目充当所有 Replit 主机的通用固定项。known-hosts 文件接受原生<host> SHA256:…行和 OpenSSHssh-keyscan输出(<host> <keytype> <base64-key>),并像 OpenSSH 一样将@revoked标记视为主动拒绝(HOST_KEY_REVOKED)——即使已将被撤销的密钥固定为有效密钥,也会关闭连接。需要在首次接触时即失败关闭的操作者,应设置MCP_REPLIT_SSH_STRICT_HOST_KEY=1,并通过带外方式预先填充 known-hosts 文件(例如,在可信网络中运行ssh-keyscan riker.replit.dev > "$MCP_WORKSPACE_PATH/.replit-ssh-known-hosts")。此功能在 0.1.2 中添加,用于解决审计发现replit-ssh-001。 - 不可信内容封装。 根据 AGENTS.md 不变量 #6,
replit_read_file的内容、replit_list_files的目录条目名称、replit_search_files的匹配路径和行,以及replit_check_connection中由对端编写的字段(服务器版本、工作目录和诊断事件详情,例如服务器横幅及键盘交互提示)都会封装在<untrusted-content source="…">…</untrusted-content>中。宿主在向模型呈现工具输出时必须保持封装完整。此功能在 0.1.2 中添加,用于解决审计发现replit-ssh-006;之后补充了连接检查覆盖范围。 - 删除不可撤销;审批由宿主负责。
replit_delete_file会执行不可撤销的删除操作(Replit 没有回收站)。该工具默认启用,并带有destructiveHint: true——是否需要审批应由宿主的工具审批层控制。绝不删除目录。 - 移动操作不会覆盖。
replit_move会预先检查目标位置;如果已有文件,则返回DESTINATION_EXISTS,而不是覆盖该文件。 - 算法允许列表。 出站 SSH 连接会将协商的 KEX/主机密钥/密码/HMAC 算法限制为 curve25519-sha256 + ssh-ed25519/rsa-sha2-* + ChaCha20-Poly1305/AES-GCM + ETM HMAC。如果代理配置错误,连接会阻止协商降级到更弱的套件。
许可
FSL-1.1-MIT — 功能源代码许可证(第 1.1 版),附带未来的 MIT 许可证。该软件将于 2030-04-08 转为 MIT 许可证。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。