Skip to main content
Glama

@reachpad/mcp

reachpad ermöglicht Claude, Codex und anderen Coding-Agenten, Full-Stack-Apps in persistenten Workspaces zu entwickeln und per Link zu teilen – ohne separate Bereitstellung. Ein Workspace ist ein Cloud-Entwicklungsrechner, den ein Agent selbst bedient: ein Repository, ein Dateisystem, installierte Abhängigkeiten und Build-Zustand, die alle zwischen Aufrufen überleben – keine ephemere Sandbox, die vergisst. Prozesse sind die Ausnahme; siehe unten.

Dies ist der MCP-Server. Er ermöglicht Claude, ChatGPT, Cursor, OpenCode oder deinem eigenen Agenten, eine Umgebung zu erstellen, Befehle darin auszuführen, sie zu forken und später darauf zurückzukommen – ohne dass ein Entwickler dafür einen Laptop offen halten muss.

  • Er ist persistent. Pausiere ihn und die Festplatte wird versiegelt; der nächste Aufruf bootet aus diesem Siegel mit Dateien, Installationen und Git-Zustand intakt, statt neu aufzubauen. Prozesse sind die Ausnahme: Ein Start ist immer ein Kaltstart.

  • Er forkt. Zwanzig Versuche von einem vorbereiteten Zustand kosten jeweils ein Delta, nicht zwanzig Neubauten – denn die Umgebung ist eine Snapshot-Kette, keine Maschine.

  • Er kann Geheimnisse aus der Box heraushalten. Eine vermittelte Anmeldeinformation wird an der Grenze in deinem Namen aufgerufen, und ihr Wert gelangt nie in die Umgebung, das Protokoll oder den Speicher. Eine Anmeldeinformation, die stattdessen in die Umgebung geschrieben wird, ist dort – wie vorgesehen – lesbar.

  • Er ist agentenunabhängig. Die REST-API ist kanonisch; dieser Server, das SDK und die CLI sind Übersetzungen davon. Bring deinen eigenen Agenten mit.

Die API ist die Produktgrenze, keine Web-UI: reachpad.dev.

Installation

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

In Claude Code:

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

Related MCP server: Nolane Habitat

Zwei Transports, eine Implementierung

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

stdio ist das, womit ein lokaler Client spricht; Streamable HTTP ist das, womit ein Remote-Connector spricht. Gleiche Tools, gleiches Verhalten – hinzugefügt statt abgespalten, denn zwei Implementierungen einer Oberfläche sind der Weg, auf dem sie auseinanderdriften.

Die HTTP-Seite antwortet mit 405 auf GET: Jedes Tool hier ist Request/Response, und die Spezifikation erlaubt es, den serverinitiierten Stream abzulehnen, statt eine Verbindung für Verkehr offen zu halten, der nie kommt. Es gibt keine Sitzungen – nichts wird über Aufrufe hinweg gehalten, das ein Neustart nicht neu aufbauen könnte. Und sie trägt keine eigene Anmeldeinformation: Was auch immer die HTTP-Anfrage autorisiert, autorisiert reachpad.

Konfiguration

Variable

Bedeutung

REACHPAD_ENDPOINT

dein reachpad-Host. Klartext-http:// zu allem außer Loopback wird abgelehnt, bevor ein Socket geöffnet wird.

REACHPAD_IDENTITY_CREDENTIAL

deine benutzerspezifische Anmeldeinformation. Sie benennt ein Konto und kann für kein anderes handeln – der Server nimmt die Identität aus dem eigenen Datensatz der Anmeldeinformation, nie aus der Anfrage.

REACHPAD_API_KEY

optional, pro Umgebung begrenzt und widerrufbar. Wenn gesetzt, verwendet run_command sie und benötigt keinen Identitätsaustausch.

REACHPAD_MCP_HTTP_PORT

HTTP statt stdio bereitstellen.

REACHPAD_MCP_HTTP_HOST

Standard 127.0.0.1. Dieser Prozess überbrückt zu einer Kontrollebene mit deinen Anmeldeinformationen, daher ist das Binden an die Welt eine bewusste Entscheidung, hinter einem Proxy, der TLS beendet.

REACHPAD_MCP_HTTP_TOKEN

Bearer-Token, in konstanter Zeit verglichen. Fehlt er, ist jeder Aufrufer, der den Port erreichen kann, autorisiert, und der Server sagt das auf stderr.

REACHPAD_MCP_ALLOWED_ORIGINS

durch Kommas getrennt. Eine Anfrage mit einem nicht gelisteten Origin wird abgelehnt – ein Browser kann ihn nicht fälschen, was DNS-Rebinding schließt. Kein Origin ist ein Nicht-Browser-Client und erlaubt.

Wenn mehrere Anmeldeinformationen gesetzt sind, gewinnt die engste, und eine abgelehnte Anmeldeinformation wird nie unter einer breiteren erneut versucht – ein Fallback wäre eine Privilegieneskalation, die niemand durchführen wollte.

Tools

Tool

Was es tut

get_credit_balance()

verbleibende Rechenguthaben. Ein Guthaben läuft eine Standardumgebung für eine Minute.

create_environment(repo?, ref?, name?)

eine neue Umgebung, optional mit einem Repository, das in $HOME/work geklont wird. Reachpad generiert den Anzeigenamen, wenn er weggelassen wird.

list_environments()

deine Umgebungen und wie viele Forks jede hat

get_environment(environment)

wovon sie bootet: ihr Kopf-Snapshot, ihre Protokollposition und ihr Fork-Baum

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

ein Befehl, sein Exit-Code und seine Ausgabe. Eine pausierte Umgebung wird fortgesetzt, um ihn zu bedienen.

checkpoint_environment(environment, name?)

Fork vom letzten versiegelten Snapshot; das Original bleibt unberührt

expose_port(environment, port, check?)

öffne einen Port für das Web und erhalte den Link, der ihn erreicht. Idempotent pro Port.

list_ports(environment)

die Ports, die diese Umgebung offen hat, älteste zuerst, mit ihren Links

revoke_port(environment, port)

schließe einen Port. Das spätere Wiederöffnen prägt einen anderen Link.

delete_environment(environment)

archiviere sie und gib den Planslot frei. Nichts wird gelöscht – Snapshots und Verlauf überleben.

Bewusst nicht hier: das Starten eines Agenten innerhalb der Umgebung. Es steht auf der Roadmap von reachpad und ist noch nicht in der Flotte – ein Tool, das immer fehlschlägt, kostet ein Modell einen Zug und lehrt es, dem Rest zu misstrauen, also bewirbt dieser Server nichts, was er nicht bedienen kann.

Lesenswert, bevor du einen an jemanden weitergibst, denn nichts davon ist aus der URL ersichtlich:

  • Jeder, der bei Reachpad angemeldet ist und den Link hat, kann ihn öffnen. Es ist keine private URL und keine sichere. Behandle ihn wie eine Vorschau-Bereitstellung.

  • Der Link ist eine Adresse, keine Kopie. Starte die App auf demselben Port neu, und derselbe Link bedient die neue Version.

  • Ein laufender Prozess überlebt eine Pause nicht. Die Umgebung kaltbootet mit intakten Dateien und nichts Läuft, also antwortet der Link nach einer Pause mit einem Fehler, bis wieder etwas auf diesem Port lauscht. Die Anfrage eines Besuchers weckt eine pausierte Umgebung; sie startet nichts darin neu.

  • expose_port wählt den Port danach an und sagt dir, ob nichts geantwortet hat, denn ein Link zu einem Port, den nichts bedient, sieht genauso aus wie ein funktionierender Link. Übergib check: false, um das zu überspringen – das Anwählen setzt eine pausierte Umgebung fort.

  • Mit nur REACHPAD_API_KEY muss der Schlüssel --role owner sein. Ein collaborator-Schlüssel wird abgelehnt: Auflisten gibt Live-Tokens zurück, und ein Token ist eine Fähigkeit.

Die Regeln, nach denen es gebaut ist

Das sind die Arten, wie ein naiver Client einer Streaming-Exec-API ein Modell in die Irre führt, und was dieser stattdessen tut.

  • Ein nicht abgeschlossener Stream ist UNBEKANNT, nie Erfolg. Wenn die Antwort ohne ein terminales Ereignis endet, sagt das Tool das in genau diesen Worten. Es ist kein Null-Exit, und ein Agent darf einen nicht-idempotenten Befehl nicht aufgrund dessen erneut versuchen.

  • Seine Frist ist lockerer als die des Servers, sodass eine serverseitige Antwort immer das Rennen gewinnt. Ein Client, der zuerst aufgibt, verwandelt „dein Build ist fertig" in „unbekannt", und die Zahlen werden vom Server gespiegelt statt geraten.

  • Ablehnungen tragen Abhilfen, keine Codes. An deinem Planlimit erhältst du das Limit, deine aktuelle Anzahl und was zu tun ist – die Zahlen kommen vom Server, denn ein im Client hartcodiertes Limit ist eine Lüge, sobald sich dein Plan ändert.

  • Ergebnisse sind Handles, keine Nutzlasten. Ausgabe wird mit der genannten Anzahl verworfener Bytes abgeschnitten. Build-Protokolle können Megabytes groß sein, und ein MCP-Ergebnis dieser Größe zerstört den Kontextfenster des Aufrufers.

  • Eine Ablehnung ist ein Ergebnis, kein Transportfehler, damit das Modell sie lesen und handeln kann. Nur ein unbekanntes Tool ist ein Protokollfehler.

Test

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

Kein Netzwerk und keine Anmeldeinformationen. Die Protokollsuite startet den ausgelieferten Server als Kindprozess und spricht echtes JSON-RPC über sein stdio gegen eine Stub-Kontrollebene auf einem echten Socket, sodass nichts unter Test ein interner Import ist. Ein Test führt denselben Ablauf gegen ein echtes reachpad aus und überspringt, wenn kein Endpunkt konfiguriert ist.

Repository

Dieses Repository ist die Quelle. Es ist bewusst getrennt vom reachpad-Backend: Dieser Code ist öffentlich, er wird auf npm veröffentlicht, und sein Release-Workflow hält Veröffentlichungsrechte – nichts davon gehört in dasselbe Repository wie die Kontrollebene. Nichts hier kann den Quellcode des Backends lesen, und kein Job im Backend kopiert Dateien hierher.

Zwei Serverkonstanten sind in src/client.js gespiegelt – die Exec-Gnadenfrist und das Standard-Exec-Timeout. Eine gespiegelte Konstante verrottet normalerweise; diese tut es nicht, weil die eigene CI des Backends dieses veröffentlichte Paket abruft und fehlschlägt, wenn sie nicht übereinstimmen. Die Prüfung lebt dort, wo sich die Zahl ändern würde.

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