Skip to main content
Glama
aloneio

Remote Coding Runtime

by aloneio

リモートコーディングランタイム

モデル中立、クライアント中立のリモートコーディングランタイムで、安定したCloudflareコントロールプレーンとアウトバウンドのみのローカルランナーを備えています。

ChatGPT / Claude / Cursor / any MCP client
          │ HTTPS stateless MCP
          ▼
Cloudflare Worker
  Admin UI · RegistryDO · RunnerDO
          │ authenticated outbound WebSocket RPC
          ▼
Local Runner
  filesystem · transactional patch · Git · process · persistent jobs

Cloudflareはコードを実行したり、AIモデルを呼び出したりしません。MCPクライアントが推論を行い、Runnerがファイルシステム、Git、プロセスの作業を行います。ブラウザ、チャット、MCPリクエスト、Runner WebSocketを閉じても、すでに開始されたジョブは停止しません。

アーキテクチャ

  • Worker: 唯一の公開MCP/コントロールプレーンエンドポイント。MCPクライアントURLを認証し、小さな管理UIを提供し、制限されたRPCメッセージをルーティングします。

  • RegistryDO: Runner、ワークスペース、履歴ジョブ、管理者パスワード/セッション状態、MCPクライアント資格情報のSQLiteメタデータ。

  • RunnerDO: Runnerごとに1つのハイバネート可能なDurable Object。現在のアウトバウンドRunner WebSocketと相関するRPCブリッジを所有します。コーディング作業を実行することはありません。

  • Runner: 信頼されたワークスペースマッピング、パス制限、パッチ/Gitサービス、ローカルサブプロセス、永続的なログ/ジョブメタデータを備えたアウトバウンド専用のNodeプロセス。

  • Protocol: packages/protocolは厳密なTypeScriptスキーマと、将来のGo/Rust Runner向けに生成された言語中立なJSON Schemaを提供します。

Cloudflareコアは、WorkersとSQLiteバックアップのDurable Objectsのみを使用します。OAuth、KV、D1、Queues、R2、Sandbox、Containers、Dynamic Workers、トンネル、インバウンドSSH、GitHub Actionsランタイム、AIモデルAPIは使用しません。

Related MCP server: cloud-to-local

デプロイ

要件: Node.js 20+、npm、Git、Wrangler、およびSQLiteバックアップのDurable Objectsが有効なCloudflareアカウント。

git clone https://github.com/aloneio/remote-coding-runtime.git
cd remote-coding-runtime
npm install
npm test
npm run typecheck
npm run build
npm run validate:worker

Runner管理と内部制御チャネルで使用される3つの本番シークレットを設定します:

cd apps/worker
npx wrangler secret put ADMIN_TOKEN
npx wrangler secret put RUNNER_TOKEN_PEPPER
npx wrangler secret put INTERNAL_CONTROL_SECRET

準備ができたらデプロイします:

npx wrangler deploy --config wrangler.jsonc

npm run validate:workerはWranglerを--dry-runで実行します。出力に--dry-run: exiting nowが含まれていることを確認してください。これはデプロイされたアカウントのクォータや本番ネットワークの動作を証明するものではありません。

初期設定

デプロイされたルートURLを開きます。例:

https://mcp.aloneio.com/

新しいRegistryDOには次のように表示されます:

Welcome to Remote Coding Runtime
Create administrator password

最初の有効なセットアップリクエストが原子的に勝ちます。ブートストラップパスワードは不要です。デプロイ後すぐにパスワードを設定してください。未初期化の公開インスタンスが他の誰かに取得された場合は、Cloudflareの状態を削除/リセットして再デプロイしてください。

パスワードは平文で保存されません。Registryはランダムなソルト付きのバージョン管理されたPBKDF2-HMAC-SHA-256検証子を保存します。ログインはランダムな7日間の不透明セッションを作成します。ブラウザはSecure、HttpOnly、SameSite=Strict、Path=/のCookieを受け取り、RegistryDOはそのSHA-256ハッシュのみを保存します。パスワード変更は既存のすべてのセッションを無効にします。

管理者の状態変更リクエストは、セッションにバインドされたCSRFトークンと同一オリジンチェックを使用します。セットアップとログインも短命の事前認証CSRF Cookieを使用します。

Runnerを追加

Runner認証は管理者ログインやMCPクライアント資格情報から独立しています。ADMIN_TOKENで保護されたAPIを介してRunnerを登録またはローテーションします:

curl -sS -X POST https://mcp.aloneio.com/admin/runners \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"runner_id":"home-pc"}'

平文のRunnerトークンは、登録/ローテーションが成功した場合にのみ返されます。安全に保管し、Runnerを起動します:

CODING_RUNNER_TOKEN='returned-runner-token' \
  npx tsx apps/runner/src/cli.ts start \
  --server wss://mcp.aloneio.com \
  --runner-id home-pc \
  --workspace zero=/home/me/code/zero\;writable\;noshell

ワークスペース構文:

--workspace id=path[;readonly|writable][;shell|noshell]

デフォルトはreadonly;noshellです。本番ではwss://が必要です。平文のws://は--insecure-localと一緒のループバックのみ許可されます。

Runnerはアウトバウンドのインターネットアクセスのみを必要とします。HTTP、MCP、OAuth、SSH、インバウンドポートを公開しません。

MCPクライアントを作成

/でログインし、/adminダッシュボードを使用します:

  1. ChatGPT Web、Claude、Cursor Desktopなどの名前を入力します。

  2. Read、Write、Executeのスコープを選択します。

  3. 作成を押します。

  4. 生成されたURLをすぐにコピーします。一度だけ表示されます。

例:

https://mcp.aloneio.com/fJ3...43-character-base64url-secret...x92/mcp

MCPクライアントにはそのURLのみを設定します。OAuthフロー、コールバック、追加のBearerヘッダーは不要です。各クライアントには独自のURLが必要です:

ChatGPT → secret A
Claude  → secret B
Cursor  → secret C

ダッシュボードは以下をサポートします:

  • 作成

  • 名前変更

  • ローテーション

  • 失効

  • クライアントごとのcoding:read、coding:write、coding:execスコープ

  • 作成日時/最終使用日時/ステータス/キープレフィックスの表示

ローテーションは古いURLを即座に無効にし、置き換えを一度だけ表示します。失効により、URLは未知のシークレットに使用されるのと同じ404 Not Foundを返します。

シークレットURLのセキュリティモデル

/<secret>/mcpはAPI資格情報です。完全なURLをパスワードのように扱ってください:

  • 公開しないでください;

  • スクリーンショットに含めないでください;

  • Gitにコミットしないでください;

  • ログ、イシュー、分析に貼り付けないでください;

  • MCPクライアント/デバイスごとに異なるURLを作成してください;

  • 漏洩が疑われる場合はすぐにローテーションしてください。

アプリケーションは受信URL/パスをログに記録せず、SHA-256検証子と短い表示プレフィックスのみを保存します。MCP/管理者応答はCache-Control: no-storeを使用します。HTMLはReferrer-Policy: no-referrer、制限的なCSP、nosniff、フレームブロッキングも使用します。アプリケーション外のインフラストラクチャがリクエストパスを記録する可能性があるため、Cloudflareのログ編集を設定し、回復にはローテーション/失効に依存してください。

ツールカタログ

ランタイム

runner_list
runner_info
workspace_list
env_info

ファイルシステム

fs_read
fs_list
fs_search
fs_apply_patch

実行と永続ジョブ

exec_start
exec_run
job_list
job_get
job_logs
job_cancel
job_input

Git

git_status
git_diff

coding:readはランタイム/ファイルシステムの読み取り、job_list/job_get/ログ、Gitの検査を許可します。coding:writeはパッチ適用を許可します。coding:execはプロセスの開始/実行/キャンセル/入力を許可します。ジョブは単一管理者インスタンス内で共有され、1つのMCPクライアントが所有するわけではありません。Claudeは、必要なスコープがあれば、ChatGPTが以前に作成したジョブを発見して読み取ることができます。

永続ジョブ

exec_startはjob_idをすぐに返します。Runnerはローカルの権威ある状態を以下に永続化します:

~/.remote-coding-runner/state/
├── runner.json
└── jobs/<job_id>/
    ├── meta.json
    ├── stdout.log
    └── stderr.log

Workerは制限されたメタデータのみを保存します。job_listはRegistryDOスナップショットを読み取るため、Runnerがオフラインでも機能します。完全なstdout/stderrはRunnerに残り、Runnerがオンラインになるとページングされたjob_logsを介して読み取られます。

Runner同期は、制限されたスナップショットから省略されたという理由だけで古い履歴を削除せずに、現在/最近のジョブをアップサートします。Registryはアクティブ/非終了ジョブと、Runnerごとに最大1,000件の終了ジョブを保持します。ジョブは監査のためにcreated_by_client_idを記録できますが、このフィールドはクロスクライアントアクセスを制限しません。

Runner再起動後、保存されたPID/フィンガープリントにまだ一致するプロセスはunknownになります。job_get、job_list、同期中の遅延調整により、生存中はunknownのままになり、実際の終了結果が不明なため、消滅後はinterruptedに変更されます。回復されたキャンセルは、このRunnerが終了リクエストを配信したことを永続的な証拠が証明した場合にのみcancelledになります。終了コードは発明されません。

ディスク上のログファイルはデフォルトで完全かつ無制限のままです。Runnerのディスク使用量を監視してください。

ファイルシステムとパッチの安全性

MCPリクエストはrunner_id、workspace_id、ワークスペース相対パスのみを提供します。Runnerは以下を拒否します:

  • POSIX絶対パス;

  • Windowsドライブ、UNC、デバイスパス;

  • NULバイトと..トラバーサル;

  • 不明なワークスペースID;

  • シンボリックリンク/ジャンクションの祖先とエスケープ;

  • 書き込み透過シンボリックリンク;

  • 読み取り専用ワークスペースへの書き込み。

fs_readとjob_logsはUTF-8セーフなバイトカーソルを使用します。中国語、絵文字、アクセント文字を含む小さなページは、置換文字なしで正確に連結できます。

fs_apply_patchはAdd/Update/Delete/Move操作、期待されるSHA-256ベースライン、正確なハンクマッチング、同一ディレクトリのステージング/バックアップ、ロールバック、BOM/改行/モードの保持、制限された構造化結果をサポートします。invalid_patch、missing_file、target_exists、baseline_changed、ハンクエラー、patch_install_failed、patch_rollback_failedなどの安定した安全なエラーは、ホストの絶対パスを公開せずにMCPに到達します。

これはワークスペース/パス認可境界であり、敵対的なオペレーティングシステムサンドボックスではありません。信頼できないリポジトリやコマンドは、制限されたマウント、シークレット、ネットワークアクセスを持つ外部VM/コンテナ内で実行してください。

タイムアウトと環境検出

共有プロトコル定数により、期限が整合します:

normal Runner operation maximum: 8,000 ms
Worker → Runner bridge timeout: 12,000 ms

これにより、4秒のトランスポート/応答マージンが残ります。exec_runとGitは共有ローカル制限を使用します。より長い作業にはexec_startを使用する必要があります。

env_infoは、プラットフォーム、アーキテクチャ、ホスト名、シェル、Node、npm、pnpm、Python、Git、Go、rustc、Cargo、Dockerの制限された並列プローブをキャッシュします。欠落またはタイムアウトしたツールは、リクエストを失敗させる代わりに{ "available": false }を返します。

テスト

npm test
npm run typecheck
npm run build
npm run validate:worker

スイートには、プロトコルテスト、Runnerのファイルシステム/プロセス/パッチ/Git/リカバリテスト、Worker Durable Objectと管理者/クライアント認証テスト、実際のローカルWrangler +実際のRunner E2Eが含まれます。カバレッジには以下が含まれます:

  • 原子的なワンタイムセットアップ;

  • PBKDF2パスワード/セッション動作、有効期限、ログアウト、パスワード無効化、CSRF;

  • クライアントごとのシークレットURLの作成/ローテーション/失効/404/スコープ強制;

  • 実際のMCP → Worker → Runner fs_read;

  • UTF-8ファイル/ログのページング;

  • MCPリクエストが閉じた後の永続的な実行;

  • Runnerトランスポートの切断、ローカル継続、再接続、同期;

  • クライアントAがジョブを開始し、クライアントBがオフライン中にjob_listでそれを発見する;

  • トラバーサル、シンボリックリンク、読み取り専用、パッチ、Git、タイムアウト、出力、並行性の境界。

ローカルテストは、特定のCloudflareアカウントのクォータ、本番エッジログの編集、インターネットクライアントの互換性、デプロイされた再起動/ハイバネーションイベントを証明するものではありません。デプロイはオペレーターが所有する受け入れステップのままです。

意図的に除外されたスコープ

MVPには、MCP Tasks、PTY/Webターミナル、マルチユーザーアカウント、組織、チーム、課金、AIエージェント、RAG、ブラウザ自動化、GitHub Actionsランタイム、Cloudflare Sandbox、Cloudflare Containersは含まれません。

謝辞とライセンス

これは独立したApache-2.0実装です。設計調査では以下を検討しました:

要求されたdavidlosasgonzalez/codeagent-mcpリポジトリは、調査中に公開URLで利用できなかったため、そのコードやライセンスは使用されていません。

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables remote MCP clients to access local filesystem and shell commands by deploying a Cloudflare Worker relay and a local daemon, providing tools like read/write files, exec commands, git status, etc.
    320 npm
    1
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables a standard authenticated MCP client to dispatch three controlled operations — command execution and scoped file reads/writes — to a remote lightweight agent through Vercel, with encrypted relaying, atomic writes, and Redis-backed audit logging.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Connects ChatGPT and MCP clients to authorized local development environments, enabling secure file access, shell execution, persistent tasks, browser/desktop control, and remote management of projects.
    19
    MIT