Skip to main content
Glama

@reachpad/mcp

reachpad 让 Claude、Codex 和其他编码代理在持久化工作区中构建全栈应用,并通过链接分享,无需单独部署。工作区是一台由代理自行操作的云端开发计算机:一个仓库、一个文件系统、已安装的依赖和构建状态,这些在多次调用之间都得以保留,而不是一个会遗忘的临时沙箱。进程是例外;见下文。

这是 MCP 服务器。它让 Claude、ChatGPT、Cursor、OpenCode 或你自己的代理创建环境、在其中运行命令、分叉它,并在之后返回,无需开发者为其保持笔记本电脑开启。

  • 它是持久的。 暂停后磁盘会被密封;下一次调用从该密封状态启动,文件、安装和 git 状态完好,而不是重新构建。进程是例外:启动总是冷启动。

  • 它可以分叉。 从一个准备好的状态进行二十次尝试,每次只花费一个增量,而不是二十次重建——因为环境是快照链,而不是一台机器。

  • 它可以开箱即用地保守秘密。 代理凭证在边界处代表你被调用,其值永远不会进入环境、日志或存储。相反,写入环境的凭证在那里是可读的,这是设计使然。

  • 它与代理无关。 REST API 是规范的;此服务器、SDK 和 CLI 都是它的翻译。带上你自己的代理。

API 是产品边界,而不是 Web UI:reachpad.dev

安装

npx -y @reachpad/mcp          # stdio, for a local client

在 Claude Code 中:

claude mcp add reachpad -e REACHPAD_IDENTITY_CREDENTIAL=… -- npx -y @reachpad/mcp

Related MCP server: Nolane Habitat

两种传输,一种实现

npx @reachpad/mcp                                  # stdio
REACHPAD_MCP_HTTP_PORT=8722 npx @reachpad/mcp      # streamable http

stdio 是本地客户端与之通信的方式;Streamable HTTP 是远程连接器与之通信的方式。相同的工具,相同的行为——是添加而不是分叉,因为一个表面的两种实现正是它们漂移的方式。

HTTP 端对 GET 返回 405:这里的每个工具都是请求/响应,规范允许拒绝服务器发起的流,而不是为永远不会到来的流量保持连接打开。没有会话——没有任何跨调用保留的东西是重启无法重建的。而且它不携带自己的凭证:任何授权 HTTP 请求的东西就是授权 reachpad 的东西。

配置

变量

含义

REACHPAD_ENDPOINT

你的 reachpad 主机。对除回环以外的任何地址使用明文 http:// 会在套接字打开之前被拒绝。

REACHPAD_IDENTITY_CREDENTIAL

你的每用户凭证。它命名一个账户,不能代表其他账户——服务器从凭证自身的记录中获取身份,而不是从请求中获取。

REACHPAD_API_KEY

可选,按环境范围限定且可撤销。设置后,run_command 使用它,无需身份交换。

REACHPAD_MCP_HTTP_PORT

提供 HTTP 而不是 stdio。

REACHPAD_MCP_HTTP_HOST

默认 127.0.0.1。此进程桥接到带有你凭证的控制平面,因此将其绑定到外部世界是一个有意的决定,需要位于终止 TLS 的代理之后。

REACHPAD_MCP_HTTP_TOKEN

不记名令牌,以恒定时间比较。如果缺失,任何能到达该端口的调用者都被授权,服务器会在 stderr 上说明这一点。

REACHPAD_MCP_ALLOWED_ORIGINS

逗号分隔。携带未列出 Origin 的请求会被拒绝——浏览器无法伪造它,这关闭了 DNS 重绑定。完全没有 Origin 的是非浏览器客户端,被允许。

如果设置了多个凭证,最窄的生效,被拒绝的凭证绝不会在更宽的凭证下重试——回退将是没有人选择执行的权限提升。

工具

工具

作用

get_credit_balance()

剩余计算积分。一个积分运行一个标准环境一分钟。

create_environment(repo?, ref?, name?)

一个新环境,可选地将仓库克隆到 $HOME/work。省略时 reachpad 生成其显示名称。

list_environments()

你的环境以及每个环境有多少个分叉

get_environment(environment)

它从什么启动:其头部快照、日志位置和分叉树

run_command(environment, argv, cwd?, env?, timeout_ms?)

一个命令、其退出代码和输出。暂停的环境会恢复以服务它。

checkpoint_environment(environment, name?)

从最后一个密封快照分叉;原始环境不受影响

expose_port(environment, port, check?)

将端口开放到 Web 并获取到达它的链接。每个端口幂等。

list_ports(environment)

此环境已打开的端口,最旧的在前,及其链接

revoke_port(environment, port)

关闭一个端口。稍后重新打开会生成一个不同的链接。

delete_environment(environment)

将其归档并释放计划槽位。不会删除任何内容——快照和历史记录都会保留。

这里故意没有: 在环境内启动代理。它在 reachpad 的路线图中,但尚未在集群中——一个总是失败的工具会浪费模型的一轮,并让它不信任其余部分,所以此服务器不宣传任何它无法提供的东西。

端口链接是什么,不是什么

在把链接交给别人之前值得一读,因为其中没有一项可以从 URL 中发现:

  • 任何登录 Reachpad 并拥有链接的人都可以打开它。 它不是私有 URL,也不是安全 URL。把它当作预览部署。

  • 链接是地址,不是副本。 在同一端口上重启应用,同一链接会提供新版本。

  • 运行中的进程不会在暂停后存活。 环境冷启动时文件完好,但没有任何运行,因此暂停后链接会返回错误,直到有东西再次监听该端口。访问者的请求会唤醒暂停的环境;它不会重启其中的任何东西。

  • expose_port 之后会拨号该端口,并告诉你是否有响应,因为指向没有服务的端口的链接看起来和正常工作的链接完全一样。传递 check: false 以跳过它——拨号会恢复暂停的环境。

  • 只有 REACHPAD_API_KEY 时,密钥必须是 --role owner collaborator 密钥会被拒绝:列出会交回实时令牌,而令牌是一种能力。

它构建所依据的规则

这些是流式执行 API 的幼稚客户端误导模型的方式,以及这个服务器如何替代。

  • 未终止的流是 UNKNOWN,绝不是成功。 如果响应在没有终止事件的情况下结束,工具会以这些词说明。它不是零退出,代理绝不能凭此重试非幂等命令。

  • 它的截止时间比服务器的更宽松,因此服务器端的答案总是赢得竞争。先放弃的客户端会把“你的构建完成了”变成“未知”,数字是从服务器镜像的,而不是猜测的。

  • 拒绝携带补救措施,而不是代码。 在计划限制时,你会得到限制、当前计数以及该做什么——数字来自服务器,因为硬编码在客户端中的限制在你计划改变的那一刻就是谎言。

  • 结果是句柄,而不是负载。 输出被尾部截断,并标明丢弃的字节数。构建日志可能有数兆字节,而如此大小的 MCP 结果会摧毁调用者的上下文窗口。

  • 拒绝是结果,而不是传输错误,因此模型可以读取并采取行动。只有未知的工具才是协议错误。

测试

node --test 'test/*.test.mjs'

无需网络和凭证。协议套件将随附的服务器作为子进程启动,并通过其 stdio 与真实套接字上的桩控制平面进行真实的 JSON-RPC 通信,因此测试中的任何内容都不是内部导入。一个测试针对真实的 reachpad 运行相同的流程,并在未配置端点时跳过。

仓库

此仓库是源代码。它故意与 reachpad 后端分离:此代码是公开的,发布到 npm,其发布工作流持有发布权——这些都不应属于与控制平面相同的仓库。这里没有任何内容可以读取后端的源代码,后端中也没有任何作业将文件复制到这里。

两个服务器常量在 src/client.js 中镜像——执行宽限期和默认执行超时。镜像常量通常会腐烂;这个不会,因为后端自己的 CI 会获取这个已发布的包,并在它们不一致时失败。检查位于数字可能改变的地方。

Related MCP Connectors

Related MCP Servers

View all related MCP servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Reachpad/reachpad-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server