← All posts

How to provision Sendtry Computer and teach a reusable skill by demonstration

A practical guide to installing @sendtry/computer-mcp v0.1.0, starting an isolated Docker Linux computer, connecting Claude Code, Codex CLI, Cursor, or Gemini over stdio MCP, and turning a human noVNC demonstration into a reviewed SKILL.md.

Install the CLI and check prerequisites

Before you install the CLI, make sure your host runs Node.js 22.13+ and a local Linux Docker Engine 28+ with Docker Compose v2. On macOS and Windows, install and start Docker Desktop. Windows must use Linux containers.

To install @sendtry/computer-mcp globally and check your host, run:

Terminal · install and check prerequisites
npm install -g @sendtry/computer-mcp
computer-mcp --version
computer-mcp doctor

computer-mcp doctor prints a JSON report and changes nothing. Continue when result is ok. If it reports blocked, fix the listed prerequisite, for example by starting Docker Desktop, and run computer-mcp doctor again. On macOS and Windows the CLI uses the desktop-linux Docker context, and on Linux it uses default. Pass --context to choose another local context.

Provision and start a dedicated computer

Each computer has its own computerId UUID, workspaceId UUID, Docker Compose project, persistent volume, and loopback console port. Ports start at 17670. By default, computer-mcp init puts the computer on an offline internal Docker network.

To create an offline computer named my-pc and open its owner console in your browser, run:

Terminal · provision and start my-pc
computer-mcp init --name my-pc
computer-mcp start --name my-pc --open

If the guest needs internet access, create a separate computer with computer-mcp init --name web-pc --network internet. Internet mode also reaches LAN and host services, so it is not an outbound firewall.

On first start, the CLI builds the guest image, starts the container, and prints the computer UUID, the workspace UUID, and the console URL. The first computer uses http://127.0.0.1:17670. --open then opens the owner console with a single-use link. If that link expires, run computer-mcp open --name my-pc. The console shows the live 1280x800 guest desktop in Screen, with Tasks, Teach & skills, Files, Terminal, Connect agent, Activity, and Computers in the sidebar.

Connect Claude Code, Codex CLI, Cursor, or Gemini

New computers disable legacy shared access, so each MCP client needs its own named grant. Create a work grant (20 tools) or a read grant (9 tools) with computer-mcp connection create. The command stores a credential hash in the runtime and writes the secret to a private host file (0600) under <catalog>/connections/<computerId>/<connectionId>.json. It prints credential-free configuration to standard output and the private file path to standard error.

Choose the command that matches your MCP client:

Terminal · create one named grant per MCP client
# Claude Code, Cursor, or Antigravity (mcpServers JSON)
computer-mcp connection create claude-work --name my-pc --access work --client generic

# Codex CLI (mcp_servers TOML table)
computer-mcp connection create codex-work --name my-pc --access work --client codex

# VS Code (servers JSON with type stdio)
computer-mcp connection create vscode-work --name my-pc --access work --client vscode

# Custom harness or SDK client (plain command and args)
computer-mcp connection create custom-work --name my-pc --access work --client stdio

# Read-only reviewer (9 inspection tools, no lease)
computer-mcp connection create reviewer-read --name my-pc --access read --client generic

For example, the --client generic command prints a pinned JSON entry like this one:

Output · credential-free generic MCP config
{
  "mcpServers": {
    "computer-my-pc-3b1f0c2a9d4e": {
      "command": "/opt/homebrew/bin/node",
      "args": [
        "/opt/homebrew/lib/node_modules/@sendtry/computer-mcp/src/cli.js",
        "mcp",
        "--connection",
        "/Users/you/.computer-mcp/connections/9f4c2e10-6b8a-4d31-9a12-7c0e5f2d8a1b/3b1f0c2a-9d4e-4c7a-8f21-5e6d7c8b9a0f.json"
      ]
    }
  }
}

Merge the entry into your agent project and keep its generated computer- key. Claude Code reads .mcp.json. Codex reads the TOML table from .codex/config.toml. Antigravity reads .agents/mcp_config.json. Cursor reads .cursor/mcp.json and also needs "type": "stdio" inside the entry. Approve the server in your client, then reconnect its MCP session.

To confirm that a grant authenticates and exposes the expected tools before you open your agent client, run computer-mcp check with the private file path that connection create printed:

Terminal · check a named grant
computer-mcp check --connection "/Users/you/.computer-mcp/connections/<computerId>/<connectionId>.json"

The check prints a JSON report and takes no lease. Expect result: ready. A work grant reports access: work and 20 tools, and a read grant reports access: read and 9 tools. A work state of needs-assignment is normal until you assign a task.

Install the sendtry-computer operator skill

The repository ships a general operator skill (skills/sendtry-computer/SKILL.md). It teaches coding agents the operating rules: call computer_info first, wrap assigned work in task_start and task_finish, prefer the files_* tools and terminal_run over GUI clicks for file and shell work, and confirm the reviewed workflow revision before running a taught skill.

To install the skill into your agent project, run the command for your harness. Replace claude-code with codex or cursor as needed:

Terminal · install the sendtry-computer skill
npx --yes skills@1.7.4 add bujosa/computer-mcp --skill sendtry-computer --agent claude-code --copy

Claude Code loads the skill from .claude/skills/sendtry-computer/, and Codex and Cursor load it from .agents/skills/sendtry-computer/. For Antigravity, copy the skills/sendtry-computer/ folder into .agents/skills/ yourself. Installing the skill grants no access. Ask your agent to load sendtry-computer and confirm that it reads the skill and discovers the MCP tools.

Teach a reusable task by demonstration

Instead of hand-coding selectors for browser or desktop workflows, you demonstrate a task once in noVNC, and a connected vision-capable work agent drafts a parameterized skill for your review.

01 · DEMONSTRATEHuman in TeachRecord trace and WebM
Take control, perform the task once, and finish recording. Typed values stay out of the trace.
02 · CONSENT & SAMPLEOwner, agentworkflow_analyze
Grant analysis consent. Agent reads the trace plus up to three 640x400 PNG frames per call.
03 · PROPOSEWork agentworkflow_propose
Agent submits procedure, expectedResult, uncertainties, and up to 16 named parameters.
04 · REVIEW & EXPORTHuman ownerReview and export
Edit procedure, click Confirm review, and export SKILL.md pinned to computer, workspace, and revision.
05 · EXECUTE ATTEMPTWork agenttask_start → task_finish
Call task_start, confirm the reviewed revision with workflow_get, run the steps, and report the outcome.
06 · VERIFY OUTCOMEHuman ownerOwner verdict
Inspect guest browser, files, and Activity log independently. Agent reports never mark a task verified.
The six-stage Teach and verification workflow: demonstrate in noVNC, grant analysis consent, review the agent proposal, export a pinned SKILL.md, run a task with new inputs, and record independent owner verification.

1. Record a demonstration

  1. In the owner console, open Screen and choose Take control. The console gives your browser the exclusive control lease and the interactive noVNC stream.
  2. Choose Practice task to open the offline practice notes page in the guest Chromium browser.
  3. Open Teach & skills, name the task Save a project note, and set the goal to saving the supplied project and next step. Turn on the optional guest video if you want visual analysis. Each clip is capped at 5 minutes and 20 MiB. Choose Start recording.
  4. In Screen, fill Project name and Next step with sample values, then choose Save note.
  5. Choose Finish demonstration. The runtime saves the action trace without your typed values and stores the raw WebM video in /data/control/videos under UID 0.

2. Allow analysis of sampled frames

By default, MCP clients cannot read demonstration media. To let your work agent inspect the recording:

  1. In Teach & skills, select the Save a project note recording and choose Allow agent analysis. This lets every work grant on this computer sample frames from this workflow, and your model provider receives what the frames show.
  2. Choose Copy analysis request and paste the request into your connected work agent.
  3. The agent calls workflow_analyze with the workflow id. The runtime pipes the video through the UID 1001 frame sampler (frames.js) and returns the trace plus up to three 640x400 PNG frames per call, each capped at 512 KiB, under an 8-second deadline.

3. Review the agent's proposal

After it inspects the trace and frames, the agent calls workflow_propose with expectedRevision set to the sourceRevision that the analysis returned. Revisions are UUIDs. The proposal includes a procedure, an expectedResult, uncertainties, and up to 16 named parameters. Parameters carry only a name and a description, such as project_name and next_step, never stored values.

MCP tool call · workflow_propose arguments
{
  "id": "6f2d9c4e-1a7b-4e3f-9c8d-2b5a0e7f1c36",
  "expectedRevision": "c41e8a2f-7d3b-4f90-8a6e-1b2c3d4e5f60",
  "procedure": "1. Open the practice note page in the guest browser if it is not visible.\n2. Fill #project with project_name.\n3. Fill #note with next_step.\n4. Click #save-note once, reload the page, and confirm both values are still shown.",
  "expectedResult": "After a reload, the practice page shows the supplied project_name and next_step.",
  "uncertainties": "The last sampled frame precedes the final reload, so the frames alone do not prove the note persisted.",
  "parameters": [
    {
      "name": "project_name",
      "description": "Project title to write into the #project field."
    },
    {
      "name": "next_step",
      "description": "Status note to write into the #note field."
    }
  ]
}

When workflow_propose succeeds, the workflow holds a pending draft and reports reviewed: false. An agent cannot reuse it until you review it.

4. Confirm the review and export SKILL.md

An agent cannot run a proposed workflow as an approved skill until you review and confirm it:

  1. In Teach & skills, choose Review updated proposal to load the agent draft.
  2. Edit the procedure, parameter descriptions, and expected result so they match how the guest application behaves. The practice page stores only one current note, so saving a new note replaces the old one.
  3. Choose Confirm review. The runtime publishes the reviewed method under a new revision and reports reviewed: true.
  4. Choose Export SKILL.md to save a skill file pinned to your computerId, workspaceId, workflow UUID, and reviewed revision. Save it in the skill folder that the console names.

5. Run the skill with new inputs and verify it

When the workflow shows status: ready and reviewed: true, test it with fresh parameter values and check the result yourself:

  1. In Teach & skills, choose Try with new inputs and enter new values for project_name and next_step. Select Do the reviewed task, choose your named work connection (for example, claude-work), and save and copy the assignment.
  2. In Screen, choose Release so the agent can take the 90-second control lease.
  3. Paste the copied request into your connected work agent.
  4. The agent calls task_start, waits for workflow_get to confirm that status is ready, reviewed is true, and the revision matches, runs the browser steps under its lease, and calls task_finish with its outcome and a summary.
  5. Open Tasks. If the agent reported success, the attempt shows reported_success, and owner verification is still empty.
  6. Reload the practice page in Screen and review the tool calls in Activity. Under Your check, choose Mark checked if the saved note matches your new inputs, or Mark rejected and explain what differs.
Share this article
X / TwitterLinkedIn

Related writing

November 3, 202610 min readWhy AI agents need a dedicated computer instead of your host desktopWhy local AI agents need their own isolated Docker Linux desktop over stdio MCP instead of host accessibility permissions, and how UUID pins, named grants, 90-second control leases, and separate owner verification keep the human operator in charge.Read →July 13, 202611 min readTwo Shapes of Agent Orchestration: The Advisor and the Fan-OutTwo orchestration patterns cover nearly every multi-agent workflow I run: Executor + Advisor and Orchestrator + Workers. Here is where judgment belongs in each — and how to keep frontier models off grunt work.Read →July 8, 202611 min readRetooling an Engineering Practice Around AI, One Repo at a TimeA small consultancy moved from internal bots to paid ML pipelines and production agents in three waves. Its repository timeline shows the shift — and the learning required to keep pace.Read →