mcpField
R
Replit SSH

Replit SSH

本地服务
github.com/mindstone开发工具13今天更新

关于 Replit SSH

Replit SSH 是本地 MCP 服务,通过 SSH/SFTP 访问 Replit 项目文件,提供文件操作和 SSH 配置功能,并包含主机限制、原子写入校验及安全的 SSH 配置解析。

主要功能

  1. 01检查 SSH 和 SFTP 连接
  2. 02列出、读取和搜索项目文件
  3. 03查看文件元数据
  4. 04写入、移动和删除文件
  5. 05生成 SSH 密钥和配置块

适用场景

  1. 01检查项目文件和 package 脚本
  2. 02搜索源文件中的匹配文本
  3. 03更新或移动 Replit 项目文件
  4. 04配置本地 Replit SSH 访问

MCP 相关

向 MCP 主机提供九项工具,用于检查 SSH 连接、执行 SFTP 文件操作和配置 SSH。它从操作者的机器连接到 `*.replit.dev` 主机,并使用本地 SSH 密钥。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"mindstone-mcp-server-replit-ssh": {
"command": "npx",
"args": [
"-y",
"@mindstone/mcp-server-replit-ssh"
],
"env": {
"REPLIT_SSH_REQUEST_TIMEOUT_MS": "<REPLIT_SSH_REQUEST_TIMEOUT_MS>",
"MCP_REPLIT_SSH_STRICT_HOST_KEY": "<MCP_REPLIT_SSH_STRICT_HOST_KEY>",
"MCP_REPLIT_SSH_KNOWN_HOSTS_PATH": "<MCP_REPLIT_SSH_KNOWN_HOSTS_PATH>"
}
}
}
}
启动命令npx -y @mindstone/mcp-server-replit-ssh
需要配置的环境变量
REPLIT_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+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@mindstone/mcp-server-replit-ssh0.2.2

工具

9

收录的工具列表 · 更新于 2 周前

参数类型必填说明
hoststring是SSH 主机(例如:"<uuid>-00-<hash>.riker.replit.dev")
userstring是SSH 用户名——"Connect manually" SSH 命令中 @ 之前的值(UUID)
verboseboolean否启用详细诊断——捕获握手、身份验证尝试、密钥验证和计时信息。排查连接或身份验证失败时使用。

详细介绍

@mindstone/mcp-server-replit-ssh

npm version License: FSL-1.1-MIT

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 并告诉我定义了哪些脚本。”

宿主调用的工具:

  1. replit_check_connection — 验证 SSH 连接和 SFTP 支持情况,并返回延迟。
  2. replit_list_files — 列出 . 目录下的文件和目录。
  3. 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 生成。

一键安装

添加到 Cursor 添加到 VS Code 添加到 VS Code Insiders

点击按钮后,宿主将提示你填写: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 上设置 icacls ACL),并向 ~/.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:… 行和 OpenSSH ssh-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 许可证。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。