本文へスキップ
Computer Use

使い方

手元のパソコンや別のパソコンに Agent を接続

インストール用プロンプトから始めるか、下記の CLI、MCP、リモート接続それぞれの手順に従ってください。macOS と Windows は同じペアリングと安全機構を使います

接続方法を選ぶ

Skill は操作手順を伝え、CLI と MCP はローカルサービスを呼び出す手段を提供します

Skill は接続ではなく操作の手引き

Skill は App の検出やインストール、ペアリング、操作の手順を Agent に伝えます。Skill をインストールしても MCP は設定されません。App は操作したいウィンドウがあるパソコンで実行します

両プラットフォームで同じ 3 種類の接続を利用可能

macOS と Windows はどちらも CLI、stdio MCP、任意で有効にするループバック HTTP MCP を備えています。CLI はスクリーンショットをローカルファイルに保存し、Agent が開きます。MCP は画像を Agent に直接返します

モデルがクラウドで動いていても、コマンド実行ツールが手元のパソコンにあればローカル接続です。パソコンへのアクセス手段がないクラウド専用 Agent には、到達可能なリモート接続が必要です

Agent に合う手順を選ぶ

ローカルコマンドを実行できる Agent は、App のインストール用プロンプトと CLI から始めてください。動作する MCP 接続があればそのまま利用できます。別のパソコンへは SSH トンネル経由の HTTP MCP を使います

これは接続方法の推奨であり、自動選択の仕組みではありません。Computer Use が Agent の代わりに接続方法を選んだり、結果が不確かな操作を別の接続方法で再試行したりすることはありません

インストール用プロンプトで始める

手動設定や別のパソコンへの接続が必要でなければ、この手順から始めてください

1. App をインストールしてプロンプトをコピー

ダウンロードページで適切なパッケージをインストールし、Computer Use を開きます。「Connect」で「Copy Installation Prompt」を選び、Agent に貼り付けます。CLI の実行環境は App に含まれているため、グローバルな Node のインストールやリポジトリのクローンは不要です

Agent は自身が対応する Skill のインストール方式を使います。既存の Skill のカスタマイズを残し、全手順で同じ profile を使ってください。このガイドでは default を使います

2. 権限を付与して手元でペアリングを承認

macOS ではシステム設定で Computer Use にアクセシビリティと画面収録の権限を付与します。Windows ではログイン済みの対話型デスクトップで App を実行し、システムの起動警告を自分で確認してください。初回ペアリングのリクエストが表示されたら、そのパソコンの App でクライアントを承認します

承認済みの profile があれば再利用します。ペアリング、OS の権限、Agent 自身のツール承認はそれぞれ別の管理です。全アプリへのアクセスを許可済みなら、新しいウィンドウやアプリごとにペアリングし直す必要はありません

3. 実際に 1 枚の画像を取得して確認

機密情報のないテスト用ウィンドウを開き、下記の読み取り専用タスクを Agent にコピーしてください。接続確認、ウィンドウ一覧の取得、バックグラウンドセッションの開始、画像の表示、セッション終了を依頼し、クリック、入力、変更は行わないよう伝えます

成功とは、コマンドが正常終了するだけでなく Agent が実際に画像を開いて表示することです。スクリーンショットは選んだ Agent に送られるため、送信したくない情報を含むウィンドウは避けてください

安全な最初のタスク
computer-use を使って接続を確認し、許可されたウィンドウを一覧表示し、テスト用ウィンドウのセッションを開いてスクリーンショットを取得して内容を説明し、セッションを閉じてください。このタスクではクリックや入力をしないでください

ローカル CLI

Computer Use をインストールしたパソコンで実行します。CLI に MCP の設定は不要です

macOS:インストール済み CLI を確認

App のインストール用プロンプトに含まれるローカルパスのヒントを使うか、下記の例で標準のインストール先を探します。例では cu を設定します。複数見つかった場合は推測せず、使いたい完全なインストールを選んでください。以降も同じターミナルを使います

Agent との新しい会話を始めるたびに --help と instructions を読み、preflight --profile default を実行します。これらはペアリング不要で、サービスも起動しません。オフラインの認証情報が unverified なら、アクセスが有効だとは確認できていません

macOS · Terminal
cuApp=''
for candidate in '/Applications/Computer Use.app' "$HOME/Applications/Computer Use.app"; do
  if [ -d "$candidate" ]; then
    if [ -n "$cuApp" ]; then
      printf '%s\n' 'Multiple installations: choose the intended App path' >&2
      cuApp=''
      break
    fi
    cuApp="$candidate"
  fi
done
# For multiple or custom installations, set cuApp to the intended absolute path
cu() {
  [ -n "$cuApp" ] || { printf '%s\n' 'Set cuApp first' >&2; return 1; }
  cuResources="$cuApp/Contents/Resources"
  [ "$(/usr/bin/plutil -extract CFBundleIdentifier raw -o - "$cuApp/Contents/Info.plist")" = com.starroy.computeruse ] || return 1
  for file in "$cuApp/Contents/MacOS/ComputerUseHost" "$cuResources/bin/node" "$cuResources/bin/computer-use" "$cuResources/bin/cua-driver"; do
    [ -x "$file" ] || { printf 'Missing executable: %s\n' "$file" >&2; return 1; }
  done
  for file in runtime/cli.js runtime/host.js package.json build-receipt.json skills/computer-use/SKILL.md; do
    [ -f "$cuResources/$file" ] || { printf 'Missing file: %s\n' "$file" >&2; return 1; }
  done
  [ -d "$cuResources/node_modules" ] || return 1
  "$cuResources/bin/computer-use" "$@"
}
cu --help && cu instructions && cu preflight --profile default

Windows:同梱の実行環境を使う

デスクトップにログインしているユーザーで PowerShell を開きます。App のインストール用プロンプトに含まれるローカルパスのヒントを使うか、下記の例で現在のユーザー向けインストールを探してください。ポータブル版は完全に展開したディレクトリを使います。例では cuNode と cuCli を設定するため、この PowerShell を開いたままにします

--help と instructions を読み、preflight --profile default を確認します。パッケージから cli.js だけを取り出したり、グローバルにインストールした Node に置き換えたりしないでください

Windows · PowerShell
$ErrorActionPreference = 'Stop'
$cuRoot = Join-Path $env:LOCALAPPDATA 'Programs\Computer Use'
# For a portable/custom installation, replace cuRoot with its complete package directory
foreach ($file in @('ComputerUse.WindowsHost.exe', 'bin\node.exe', 'bin\cua-driver.exe', 'runtime\cli.js', 'runtime\host.js', 'package.json', 'build-receipt.json', 'skills\computer-use\SKILL.md')) {
  if (-not (Test-Path -LiteralPath (Join-Path $cuRoot $file) -PathType Leaf)) {
    throw "Incomplete package: $file"
  }
}
if (-not (Test-Path -LiteralPath (Join-Path $cuRoot 'node_modules') -PathType Container)) {
  throw 'Incomplete package: node_modules'
}
$cuNode = Join-Path $cuRoot 'bin\node.exe'
$cuCli = Join-Path $cuRoot 'runtime\cli.js'
& $cuNode $cuCli --help
if ($LASTEXITCODE -ne 0) { throw 'CLI help failed' }
& $cuNode $cuCli instructions
if ($LASTEXITCODE -ne 0) { throw 'Read the installed version compatibility instructions' }
& $cuNode $cuCli preflight --profile default

選んだ profile がない場合だけペアリング

preflight が missing を返し、既知の取り消しが原因でなければ初回ペアリングを要求し、手元の App で承認します。profile があれば再利用してください。invalid、unauthorized、オフラインの unverified は診断が必要な状態であり、認証情報を削除してペアリングし直す理由ではありません

例では既定の全デスクトップアプリへのアクセスを要求します。承認前に範囲を確認してください。分離ブラウザへの権限は別です。別の profile を使う場合は、すべての default を同じ名前に置き換えます

macOS · Terminal
# Only when preflight reports missing credentials and there is no known revocation
cu pair --profile default --name 'My Agent'
Windows · PowerShell
# Only when preflight reports missing credentials and there is no known revocation
& $cuNode $cuCli pair --profile default --name 'My Agent'

診断、ウィンドウ一覧、画像確認、終了

doctor と targets を実行し、返された一覧からテスト用ウィンドウのターゲット ID を選び、background モードで session_open を呼び出します。返されたセッション ID を observe と session_close に使い、すべての仮の値を実際の応答に置き換えてください

セッションを閉じる前に、observe が返すスクリーンショットファイルを Agent の画像表示ツールで開きます。この確認にクリックや文字入力は不要です。インストール済みバージョンの正確なメソッド引数は schema で確認できます

macOS · Terminal
# Run each command separately, inspect its result, then replace the next placeholder
cu doctor --profile default
cu targets --profile default
cu session_open --profile default --json '{"targetId":"TARGET_ID","mode":"background"}'
cu observe --profile default --json '{"sessionId":"SESSION_ID"}'
# Read the screenshot file returned by observe, then close this session
cu session_close --profile default --json '{"sessionId":"SESSION_ID"}'
Windows · PowerShell
# Run each step separately and inspect the result
& $cuNode $cuCli doctor --profile default
& $cuNode $cuCli targets --profile default

# File input avoids native-command JSON quoting differences in PowerShell 5.1 and 7
$cuRequest = Join-Path ([IO.Path]::GetTempPath()) ("cu-observe-" + [Guid]::NewGuid().ToString() + '.json')
$utf8 = New-Object Text.UTF8Encoding($false)
[IO.File]::WriteAllText($cuRequest, '{"targetId":"TARGET_ID","mode":"background"}', $utf8)
& $cuNode $cuCli session_open --profile default --input $cuRequest

# Replace SESSION_ID with the returned sessionId
[IO.File]::WriteAllText($cuRequest, '{"sessionId":"SESSION_ID"}', $utf8)
& $cuNode $cuCli observe --profile default --input $cuRequest
# Read the screenshot file returned by observe, then close this session
& $cuNode $cuCli session_close --profile default --input $cuRequest
Remove-Item -LiteralPath $cuRequest

ローカル stdio MCP

MCP に対応し、同じパソコンでプロセスを起動できる Agent 向けです

既存のペアリングを使って設定を生成

まず上記の CLI の検出と profile の確認を済ませます。App の「Connect」→「Advanced Connection」で同じ profile を選び、Agent 用の設定をコピーします。stdio MCP で HTTP を有効にする必要はありません

config stdio で汎用 JSON、config codex で Codex 用設定を生成することもできます。stdio 設定には起動用の絶対パスと profile 名が含まれ、ペアリング token は含まれません

macOS の設定コマンド

cu を設定したターミナルで実行します。Agent が対応する形式で生成済みのサーバー項目を追加し、他の項目は残してください

macOS · Terminal
cu config stdio --profile default
# For an Agent that uses Codex TOML, run this instead:
# cu config codex --profile default

Windows の設定コマンド

cuNode と cuCli を設定した PowerShell で実行します。生成された絶対パスと引数の区切りを保ってください。実行ファイルのパスを求める欄に、シェルコマンド全体を貼り付けないでください

Windows · PowerShell
& $cuNode $cuCli config stdio --profile default
# For an Agent that uses Codex TOML, run this instead:
# & $cuNode $cuCli config codex --profile default

Agent を再読み込みしてツールを確認

Agent の MCP 設定を再読み込みするか Agent を再起動し、サーバーのツールが使えることを確認します。テスト用ウィンドウに対して doctor → targets → session_open → observe → session_close を実行するよう依頼してください。MCP はスクリーンショットを画像として返します

preflight、instructions、recover は CLI の補助コマンドであり、MCP ツールではありません。MCP を使う Agent でも保守にはローカルコマンドの実行権限が必要な場合があります。MCP 専用クライアントではこれらを利用できると仮定しないでください

別のパソコン:SSH 経由の HTTP MCP

操作される側で App と対象ウィンドウを実行し、操作する側で Agent と SSH トンネルを実行します

操作対象のコンピューター

デスクトップにログインしてロックを解除し、Computer Use を起動して権限とペアリングを承認し、SSH と HTTP MCP を準備します

Agent を実行するコンピューター

SSH クライアントと鍵を準備し、接続先を確認してトンネルを開き、非公開の HTTP 設定を読み込んでスクリーンショットを確認します

両方のパソコン:前提条件を確認

同じ LAN、または SSH が到達できる既存の信頼済みネットワークを使います。このガイドでは公開ポート転送、トンネリングサービス、無人アクセスは設定しません。profile と非公開ファイルを一致させるため、接続先では SSH と App に同じアカウントを使ってください。そのアカウントで対話型デスクトップにログインしてロックを解除し、App を実行してシステム権限を承認しておきます

両プラットフォームに HTTP MCP がありますが、インターフェースの提供と実機検証は別です。記録済みの接続試験は Mac から Windows を操作するもので、Mac をリモート操作する同等のデスクトップ検証は未完了です

操作される Mac:対象ユーザーの SSH を有効化

「システム設定」→「一般」→「共有」→「リモートログイン」を開いて有効にし、利用するアカウントだけを許可します。表示されるログイン名とアドレスを控えてください。この設定でリモートユーザーへのフルディスクアクセスは不要です。SSH の権限は Computer Use のアクセスを許可しません

システム設定の表示が異なる場合は Apple のリモートログインの説明を参照してください

操作される Windows:OpenSSH Server を準備

管理者 PowerShell でオプション機能の OpenSSH Server を確認し、なければインストールして sshd を起動します。SSH の受信規則は重複して追加せず既存のものを確認し、送信元アドレスを操作する側または信頼するネットワークに限定してください。MCP のポートはファイアウォールで開放しません

サービスの自動起動は任意で、別途行う永続的な変更です。Microsoft の OpenSSH 設定手順を参照してください。2 つ目の例は選んだ場合だけ自動起動を有効にします

Windows · PowerShell
$ErrorActionPreference = 'Stop'
$cuSsh = Get-WindowsCapability -Online -Name 'OpenSSH.Server~~~~0.0.1.0'
if ($cuSsh.State -ne 'Installed') {
  Add-WindowsCapability -Online -Name 'OpenSSH.Server~~~~0.0.1.0'
  Set-Service -Name sshd -StartupType Manual
}
Start-Service sshd
Get-Service sshd
Get-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' |
  Select-Object Name, Enabled, Direction, Action, Profile
Get-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' | Get-NetFirewallPortFilter
Windows · PowerShell
Set-Service -Name sshd -StartupType Automatic

操作する側:SSH を確認して鍵を用意

macOS には SSH クライアントが含まれています。Windows では ssh -V を確認し、見つからなければ Windows の設定から OpenSSH Client のオプション機能を追加します。パスフレーズで保護した専用の鍵を生成するか、適切な既存の鍵を上書きせずに使ってください

信頼できる経路で操作される側へ送るのは .pub の公開鍵だけです。秘密鍵は操作する側に残します。例では専用の鍵パスを使います。すでに鍵があれば置き換えずにキャンセルしてください

macOS · Terminal
command -v ssh ssh-keygen sftp
cuKey="$HOME/.ssh/id_ed25519_computer_use"
if [ -e "$cuKey" ] || [ -e "$cuKey.pub" ]; then
  printf '%s\n' 'Key already exists: reuse the intended pair; do not overwrite it'
else
  install -d -m 700 "$HOME/.ssh"
  ssh-keygen -t ed25519 -f "$cuKey" -C 'computer-use'
fi
# Copy only this public key to the target computer
cat "$cuKey.pub"
Windows · PowerShell
$ErrorActionPreference = 'Stop'
Get-Command ssh.exe, ssh-keygen.exe, sftp.exe -ErrorAction Stop
$cuKey = Join-Path $env:USERPROFILE '.ssh\id_ed25519_computer_use'
if ((Test-Path -LiteralPath $cuKey) -or (Test-Path -LiteralPath "$cuKey.pub")) {
  Write-Output 'Key already exists: reuse the intended pair; do not overwrite it'
} else {
  New-Item -ItemType Directory -Path (Split-Path $cuKey) -Force | Out-Null
  ssh-keygen.exe -t ed25519 -f $cuKey -C computer-use
  if ($LASTEXITCODE -ne 0) { throw 'Key generation failed' }
}
# Copy only this public key to the target computer
Get-Content -LiteralPath "$cuKey.pub"

操作される Mac:公開鍵を許可

SSH 接続先のユーザーでその Mac に直接ログインします。既存の鍵を残したまま、操作する側の公開鍵を ~/.ssh/authorized_keys に新しい行として追加します。ディレクトリの所有者はそのユーザーとし、権限は 700、ファイルは 600 にします。秘密鍵を貼り付けないでください

macOS · Terminal
cuPublicKey='<PUBLIC_KEY_LINE>'
case "$cuPublicKey" in
  'ssh-ed25519 '*)
    install -d -m 700 "$HOME/.ssh"
    cuAuthorized="$HOME/.ssh/authorized_keys"
    if [ -L "$cuAuthorized" ]; then
      printf '%s\n' 'Review the existing authorized_keys symlink before continuing' >&2
    else
      (umask 077; touch "$cuAuthorized")
      grep -Fqx -- "$cuPublicKey" "$cuAuthorized" || printf '\n%s\n' "$cuPublicKey" >> "$cuAuthorized"
      chmod 600 "$cuAuthorized"
    fi
    ;;
  *) printf '%s\n' 'Replace PUBLIC_KEY_LINE with the complete public key' >&2 ;;
esac

操作される Windows:正しい鍵ファイルと ACL を使用

標準アカウントでは、そのユーザーの %USERPROFILE%\.ssh\authorized_keys に公開鍵を追加します。例ではファイルへのアクセスを本人、Administrators、SYSTEM に限定します。ディレクトリの所有者が本人で、他の標準アカウントが書き込めないことを確認してください。管理者アカウントでは既定の OpenSSH が %ProgramData%\ssh\administrators_authorized_keys を使うため、管理者 PowerShell で管理します

既存の鍵を置き換えずに追記してください。管理者用の鍵ファイルは管理者アカウント間で共有され、アクセスを Administrators と SYSTEM だけに限定します。鍵を特定の管理者 1 人だけに許可する場合は、サーバーの設定を別途確認して明示的に構成してください。共有ファイルをユーザーごとの許可とみなさないでください。該当する例と Microsoft の鍵管理の説明を参照してください。sshd_config を変更している場合は保存先が異なることがあります

Windows · PowerShell
$ErrorActionPreference = 'Stop'
$cuPublicKey = '<PUBLIC_KEY_LINE>'
if (-not $cuPublicKey.StartsWith('ssh-ed25519 ')) { throw 'Replace PUBLIC_KEY_LINE with the complete public key' }
$cuAuthorized = Join-Path $env:USERPROFILE '.ssh\authorized_keys'
New-Item -ItemType Directory -Path (Split-Path $cuAuthorized) -Force | Out-Null
if ((Test-Path -LiteralPath $cuAuthorized) -and ((Get-Item -LiteralPath $cuAuthorized).Attributes -band [IO.FileAttributes]::ReparsePoint)) {
  throw 'Review the existing authorized_keys link before continuing'
}
if (-not (Test-Path -LiteralPath $cuAuthorized) -or -not (Select-String -LiteralPath $cuAuthorized -Pattern $cuPublicKey -SimpleMatch -Quiet)) {
  Add-Content -LiteralPath $cuAuthorized -Value ("`r`n" + $cuPublicKey) -Encoding ascii
}
$cuSid = [Security.Principal.WindowsIdentity]::GetCurrent().User
$cuAcl = New-Object Security.AccessControl.FileSecurity
$cuAcl.SetOwner($cuSid)
$cuAcl.SetAccessRuleProtection($true, $false)
foreach ($sid in @($cuSid, [Security.Principal.SecurityIdentifier]'S-1-5-18', [Security.Principal.SecurityIdentifier]'S-1-5-32-544')) {
  $cuAcl.AddAccessRule((New-Object Security.AccessControl.FileSystemAccessRule($sid, 'FullControl', 'Allow')))
}
Set-Acl -LiteralPath $cuAuthorized -AclObject $cuAcl
Windows · PowerShell
$ErrorActionPreference = 'Stop'
$cuPublicKey = '<PUBLIC_KEY_LINE>'
if (-not $cuPublicKey.StartsWith('ssh-ed25519 ')) { throw 'Replace PUBLIC_KEY_LINE with the complete public key' }
$cuAuthorized = Join-Path $env:ProgramData 'ssh\administrators_authorized_keys'
if ((Test-Path -LiteralPath $cuAuthorized) -and ((Get-Item -LiteralPath $cuAuthorized).Attributes -band [IO.FileAttributes]::ReparsePoint)) {
  throw 'Review the existing administrators_authorized_keys link before continuing'
}
if (-not (Test-Path -LiteralPath $cuAuthorized) -or -not (Select-String -LiteralPath $cuAuthorized -Pattern $cuPublicKey -SimpleMatch -Quiet)) {
  Add-Content -LiteralPath $cuAuthorized -Value ("`r`n" + $cuPublicKey) -Encoding ascii
}
$cuAdmins = [Security.Principal.SecurityIdentifier]'S-1-5-32-544'
$cuAcl = New-Object Security.AccessControl.FileSecurity
$cuAcl.SetOwner($cuAdmins)
$cuAcl.SetAccessRuleProtection($true, $false)
foreach ($sid in @($cuAdmins, [Security.Principal.SecurityIdentifier]'S-1-5-18')) {
  $cuAcl.AddAccessRule((New-Object Security.AccessControl.FileSystemAccessRule($sid, 'FullControl', 'Allow')))
}
Set-Acl -LiteralPath $cuAuthorized -AclObject $cuAcl

操作される側:SSH ホストの指紋を手元で確認

接続先のパソコン自体でホスト鍵の指紋を読み、信頼できる経路で記録します。操作する側の初回 SSH 接続時に表示される指紋と照合し、一致した場合だけ受け入れてください。指紋が変わった場合は原因を調べ、ホスト鍵の検証を無効にしないでください

macOS · Terminal
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
Windows · PowerShell
ssh-keygen.exe -lf "$env:ProgramData\ssh\ssh_host_ed25519_key.pub"

操作する側:転送前に SSH ログインを確認

ユーザーとアドレスの仮の値を接続先の実際の情報に置き換えます。専用の鍵を使い、指紋を照合し、意図したアカウントに接続できたことを確認してください。リモートシェルを終了してからトンネルを開きます。SSH ログインの成功だけでは Computer Use は起動せず、ペアリングも承認されません

macOS · Terminal
ssh -i "$HOME/.ssh/id_ed25519_computer_use" -o IdentitiesOnly=yes -o HostKeyAlgorithms=ssh-ed25519 '<REMOTE_USER>@<REMOTE_HOST>'
# Compare the offered SHA256 fingerprint with the target computer before accepting
# After verifying the login, type exit to return to the Agent computer
Windows · PowerShell
ssh.exe -i "$env:USERPROFILE\.ssh\id_ed25519_computer_use" -o IdentitiesOnly=yes -o HostKeyAlgorithms=ssh-ed25519 '<REMOTE_USER>@<REMOTE_HOST>'
# Compare the offered SHA256 fingerprint with the target computer before accepting
# After verifying the login, type exit to return to the Agent computer

操作する側:SSH トンネルを開く

別のターミナルでこのコマンドを実行し続けます。127.0.0.1:47631 だけにバインドし、接続先の同じポートへ転送してください。Host はアドレスとポートを検証するため、ローカルポートだけを変更する回避方法には対応していません

ポートが使用中なら、自分の古いトンネルを特定して止めるか、操作する側のローカル HTTP MCP を無効にしてから再試行してください。無関係のプロセスの終了、-g の使用、0.0.0.0 へのバインド、MCP ポートの直接公開は行わないでください

macOS · Terminal
ssh -i "$HOME/.ssh/id_ed25519_computer_use" \
  -o IdentitiesOnly=yes -o StrictHostKeyChecking=yes \
  -o HostKeyAlgorithms=ssh-ed25519 -o ExitOnForwardFailure=yes \
  -o ServerAliveInterval=15 -o ServerAliveCountMax=3 -N \
  -L 127.0.0.1:47631:127.0.0.1:47631 '<REMOTE_USER>@<REMOTE_HOST>'
Windows · PowerShell
ssh.exe -i "$env:USERPROFILE\.ssh\id_ed25519_computer_use" `
  -o IdentitiesOnly=yes -o StrictHostKeyChecking=yes `
  -o HostKeyAlgorithms=ssh-ed25519 -o ExitOnForwardFailure=yes `
  -o ServerAliveInterval=15 -o ServerAliveCountMax=3 -N `
  -L 127.0.0.1:47631:127.0.0.1:47631 '<REMOTE_USER>@<REMOTE_HOST>'

操作される側:HTTP を有効にして秘密の設定を出力

接続先では CLI 検出時の変数と意図した既存の profile を再利用し、profile がなく取り消しも確認されていない場合だけ初回のローカルペアリングを行います。App の「Connect」→「Advanced Connection」でローカル HTTP MCP を有効にします。App またはサービスの再起動後は毎回オフになります

該当するコマンドで新しい HTTP 設定ファイルを出力します。stdio の設定とは異なり、この JSON には Bearer 認証情報が含まれます。Windows では App 専用の非公開データディレクトリが必要です。既存ファイルへの上書きは拒否されるため、内容を確認するか別のファイル名を選んでください

macOS · Terminal
install -d -m 700 "$HOME/.config/computer-use"
cu config http --profile default --out "$HOME/.config/computer-use/remote-http.json"
# The CLI refuses to overwrite an existing file; do not print its contents
Windows · PowerShell
& $cuNode $cuCli config http --profile default --out "$env:LOCALAPPDATA\Computer Use\remote-http.json"
# Export only into the Host private data directory; existing files are not overwritten
# Do not print the file contents

操作する側:ファイルを転送して Agent を接続

SSH/SFTP で出力済みの JSON を新しいローカルの非公開ディレクトリへ取得します。リモートパスの仮の値を出力コマンドが返す絶対パスに置き換えてください。接続先が Windows ならスラッシュを使い、リモート引数全体の引用符を保ちます。例では取得したファイルへのアクセスを自分のアカウントに限定します

HTTP MCP と非公開の認証情報保存に対応する Agent へ、URL と認証ヘッダーを取り込みます。URL は http://127.0.0.1:47631/mcp のままにしてください。トンネルが接続先に到達します。認証情報を Agent の会話、ウェブページ、リポジトリ、共有フォルダーに貼り付けないでください。この直接 HTTP 接続にグローバルな Node は不要です

Agent の MCP 接続を再読み込みします。必要な間は非公開の設定を保持してください。転送を確認した後は、必要に応じて接続先に出力した追加のコピーだけを削除できます。App のペアリング認証情報は削除しないでください

macOS · Terminal
cuRemoteDir="$(mktemp -d "$HOME/.computer-use-remote.XXXXXX")"
# Replace REMOTE_CONFIG_PATH with the absolute path returned by config http
# The exported filename is remote-http.json; keep the entire remote argument quoted
(
  umask 077
  cd "$cuRemoteDir" &&
  sftp -i "$HOME/.ssh/id_ed25519_computer_use" \
    -o IdentitiesOnly=yes -o StrictHostKeyChecking=yes \
    -o HostKeyAlgorithms=ssh-ed25519 \
    '<REMOTE_USER>@<REMOTE_HOST>:<REMOTE_CONFIG_PATH>' &&
  chmod 600 remote-http.json
)
printf 'Private configuration directory: %s\n' "$cuRemoteDir"
Windows · PowerShell
$ErrorActionPreference = 'Stop'
$cuRemoteDir = Join-Path $env:USERPROFILE ('.computer-use-remote-' + [Guid]::NewGuid().ToString())
New-Item -ItemType Directory -Path $cuRemoteDir | Out-Null
$cuSid = [Security.Principal.WindowsIdentity]::GetCurrent().User
$cuAcl = New-Object Security.AccessControl.DirectorySecurity
$cuAcl.SetOwner($cuSid)
$cuAcl.SetAccessRuleProtection($true, $false)
$cuAcl.AddAccessRule((New-Object Security.AccessControl.FileSystemAccessRule($cuSid, 'FullControl', 'ContainerInherit,ObjectInherit', 'None', 'Allow')))
Set-Acl -LiteralPath $cuRemoteDir -AclObject $cuAcl
# Replace REMOTE_CONFIG_PATH with the absolute exported path, using / separators
Push-Location -LiteralPath $cuRemoteDir
try {
  sftp.exe -i "$env:USERPROFILE\.ssh\id_ed25519_computer_use" `
    -o IdentitiesOnly=yes -o StrictHostKeyChecking=yes `
    -o HostKeyAlgorithms=ssh-ed25519 `
    '<REMOTE_USER>@<REMOTE_HOST>:<REMOTE_CONFIG_PATH>'
  if ($LASTEXITCODE -ne 0) { throw 'SFTP failed; do not use the partial file' }
} finally {
  Pop-Location
}
Write-Output "Private configuration directory: $cuRemoteDir"

操作する側:MCP で接続先を確認

同じ読み取り専用の順序で doctor → targets → session_open → observe → session_close を実行します。ウィンドウと画像が操作する側ではなく、接続先のパソコンのものだと確認してください

リモート HTTP は Host を起動できず、ローカルの recover も呼び出せません。サービスが使えない場合は接続先のユーザーが App と状態を確認します。別の App を起動して、一時停止、緊急停止、取り消された権限を回避しないでください

両方のパソコン:安全に再接続または終了

トンネルが切断されたら、操作の元の requestId を保持します。再接続後に action_status を照会して再度画像を確認し、結果が不確かな操作は再送しないでください。App またはサービスが再起動した場合、接続先のユーザーが HTTP を再び有効にする必要があります

終了時はセッションを閉じ、トンネルのターミナルで Ctrl+C を押し、接続先 App の HTTP を無効にします。SSH アクセスも止める場合は、macOS のリモートログインをオフにするか、Windows の sshd を停止します。自動起動を有効にした場合は明示的に無効にしてください。鍵の許可が不要になったら、その専用の公開鍵の行だけを削除します

Windows · PowerShell
Stop-Service sshd
Set-Service -Name sshd -StartupType Manual

問題の診断と復旧

正確なエラーと既存の profile を保持してください。接続方法を変えても権限は変わりません

CLI がない、または MCP の起動パスが無効

完全なインストールと App のインストール用プロンプトに含まれるローカルパスのヒントを確認します。stdio の設定は絶対パスを使うため、App やポータブル版のディレクトリを移動したら再生成してください。古い App に instructions や preflight がなければ、インストール済み Skill の互換性の説明を確認し、更新を検討します。コマンドがないことは、App が未インストールという意味ではありません

profile が拒否される、またはウィンドウが見つからない

CLI コマンド、MCP 設定、診断では同じ profile を使います。doctor.authorization、capabilities.authorization、オンライン時の preflight.profile.authorization を確認してください。フィールドがなければ範囲は不明です。targets はクライアントの権限外のウィンドウを表示しません

既存のデスクトップクライアントは、ユーザーが App の「Clients」→「Allow all apps…」を選び、その場で確認できます。token、profile、MCP 設定は保持され、分離ブラウザの権限は変わりません。ブラウザ専用クライアントは別途その場での確認が必要です。古い App にこの操作がなければ更新またはローカルでの確認を行い、自動で再ペアリングしないでください

ログイン済みデスクトップにアプリの表示可能なウィンドウがあるか、システム権限を付与済みかも確認します。全アプリへの権限があれば、新しいウィンドウごとの承認は不要です

SSH または HTTP に接続できない

SSH では接続先のアドレス、許可されたアカウント、SSH サービス、ファイアウォール規則、鍵ファイルの場所と ACL を確認します。ホストの指紋が変わった場合は、必ず接続先で確認してください。HTTP では接続先 App が動作し、HTTP が有効で、操作する側のポート 47631 をトンネルが使用していることを確認します

401 応答なら、選択した profile とクライアントの取り消し状況を確認します。システム権限の不足、ロック中または非対話型のデスクトップは接続先で対応が必要です。トンネルの問題を回避するために MCP をファイアウォール越しに公開しないでください

サービス障害は手元で 1 回だけ復旧を試す

先にインストール済みの instructions と preflight を読みます。Host の障害、または不確かなデスクトップ操作後の接続切断で、ユーザーによる停止がなければ、Agent は同じ完全なパッケージと既存の profile で recover を 1 回試せます。例はローカル CLI コマンドであり、リモート MCP ツールではありません

復旧では、一時停止や緊急停止の解除、取り消されたアクセスの復元、システム権限の付与、再ペアリングはできません。これらはユーザーが接続先で操作します。成功後は元の操作を照会し、新しいバックグラウンドセッションで画像を確認してください。古いセッション、スナップショット、要素は再利用しません。復旧に失敗したり次の操作で再び障害が起きたりしたら、繰り返さず原因を報告します

macOS · Terminal
cu preflight --profile default
# Only for a recoverable service fault; inspect preflight before running once
cu recover --profile default
# If an action is uncertain, preserve its original requestId and query it after recovery
cu action_status --profile default --json '{"requestId":"ORIGINAL_REQUEST_ID"}'
# Open a new session and observe; never replay the uncertain action
Windows · PowerShell
& $cuNode $cuCli preflight --profile default
# Only for a recoverable service fault; inspect preflight before running once
& $cuNode $cuCli recover --profile default
# If an action is uncertain, preserve its original requestId and query it after recovery
$cuStatusInput = Join-Path ([IO.Path]::GetTempPath()) ("cu-status-" + [Guid]::NewGuid().ToString() + '.json')
[IO.File]::WriteAllText($cuStatusInput, '{"requestId":"ORIGINAL_REQUEST_ID"}', (New-Object Text.UTF8Encoding($false)))
& $cuNode $cuCli action_status --profile default --input $cuStatusInput
Remove-Item -LiteralPath $cuStatusInput
# Open a new session and observe; never replay the uncertain action

不確かな結果の操作は絶対に再実行しない

unknown は入力が届いたかどうかが不明な状態です。元の requestId を保ち、action_status を照会し、再接続後の新しい画像を確認します。MCP の代わりに CLI で再試行したり、新しいリクエスト ID を使ったり、同等のクリックやキー入力を繰り返したりしないでください

executed でも効果が未確認なら、サービスの再起動ではなく画像の確認が必要です。画面が変わらないことは、入力が届かなかった証拠にはなりません。重大な結果を伴う操作の実行有無が分からない場合は、ユーザーに確認を求めてください