| name | remote-mcp |
| description | Control remote machines via MCP using terminator CLI. Auto-activates when user says "remote MCP", "connect to machine", "execute on remote", or wants to run commands on remote VMs. |
| allowed-tools | Bash, Read, Write |
Remote MCP Control Skill
Control remote MCP-enabled machines using the terminator CLI.
Prerequisites
- Terminator CLI installed:
cargo install terminator-cli or npx @mediar-ai/cli
- MCP endpoint URL from target machine (e.g.,
http://<IP>:8080/mcp)
- Auth token (if required): Set via
MCP_AUTH_TOKEN env var
Basic Usage
export MCP_AUTH_TOKEN="your-token-here"
terminator mcp exec --url "http://<IP>:8080/mcp" run_command '{
"run": "node -e \"console.log(JSON.stringify({cwd: process.cwd()}))\"",
"timeout_seconds": 10
}'
Common Commands
1. Run Shell Command
terminator mcp exec --url "http://<IP>:8080/mcp" run_command '{
"run": "tasklist /FI \"IMAGENAME eq chrome.exe\" /FO TABLE",
"timeout_seconds": 10
}'
2. Run JavaScript
terminator mcp exec --url "http://<IP>:8080/mcp" run_command '{
"run": "console.log(JSON.stringify({user: process.env.USERNAME, cwd: process.cwd()}))",
"engine": "javascript",
"timeout_seconds": 10
}'
3. Check File Exists
terminator mcp exec --url "http://<IP>:8080/mcp" run_command '{
"run": "dir \"C:\\Users\\vmuser\\Desktop\"",
"timeout_seconds": 5
}'
4. Get Desktop UI Tree
terminator mcp exec --url "http://<IP>:8080/mcp" get_desktop_elements '{
"depth": 1
}'
5. Get Process-Specific UI Tree
terminator mcp exec --url "http://<IP>:8080/mcp" get_desktop_elements '{
"selector": "process:chrome",
"depth": 3
}'
6. Take Screenshot
terminator mcp exec --url "http://<IP>:8080/mcp" take_screenshot '{}'
7. Run PowerShell Script
terminator mcp exec --url "http://<IP>:8080/mcp" run_command '{
"run": "powershell -Command \"Get-Process | Select-Object ProcessName, Id | ConvertTo-Json\"",
"timeout_seconds": 15
}'
MCP Tool Reference
| Tool | Description | Args |
|---|
run_command | Execute shell/JS/Python | {"run": "...", "engine": "javascript", "timeout_seconds": N} |
get_desktop_elements | Get UI tree | {"selector": "...", "depth": N} |
take_screenshot | Capture screen | {"selector": "..."} (optional) |
click_element | Click UI element | {"selector": "process:App >> role:Button && name:OK"} |
type_text | Type into element | {"selector": "...", "text": "..."} |
press_key | Press keyboard key | {"key": "enter"} or {"key": "ctrl+a"} |
wait_for_element | Wait for element | {"selector": "...", "timeout_seconds": N} |
open_application | Launch app | {"path": "C:\\path\\to\\app.exe"} |
run_command Args
| Arg | Description |
|---|
run | Command/code to execute (required unless script_file used) |
script_file | Path to script file to execute |
engine | Script engine: javascript, typescript, python, node, bun |
shell | Shell to use: bash, sh, cmd, powershell, pwsh |
env | Environment variables as JSON object |
timeout_seconds | Execution timeout |
Selector Syntax
Operators:
>> - Chain/descendant (scope into process, then find element)
&& - AND (element must match ALL conditions)
|| - OR (element matches ANY condition)
! - NOT (element must NOT match)
() - Grouping
Examples:
# Scope to process, then find button with specific name
process:chrome >> role:Button && name:Submit
# Window matching both role AND name
role:Window && name:Settings
# Multiple conditions
process:notepad >> role:Edit && visible:true
# OR conditions
role:Button && (name:OK || name:Cancel)
# Complex chain
process:explorer >> role:Window && name:Downloads >> role:ListItem
Selector Types:
process:NAME - Target specific application (use as chain start)
role:TYPE - UI Automation role (Button, Edit, Window, Text, ListItem)
name:TEXT - Element name (supports wildcards: name:*partial*)
nativeid:ID - Native automation ID
classname:CLASS - Window class name
visible:true/false - Filter by visibility
nth:N - Select nth match (0-indexed)
CRITICAL: For actions (click, type), always scope with process: first!
Troubleshooting
"401 Unauthorized"
- Set
MCP_AUTH_TOKEN environment variable
- Verify token matches server configuration
"Element not found"
- Element not visible on screen
- Wrong process name (case-sensitive!)
- Take screenshot to see current state
"Connection refused"
- MCP server not running on VM
- Check health:
curl http://<IP>:8080/health
Example Session
export MCP_AUTH_TOKEN="your-token"
export MCP_URL="http://<IP>:8080/mcp"
terminator mcp exec --url "$MCP_URL" run_command '{"run": "tasklist", "timeout_seconds": 5}'
terminator mcp exec --url "$MCP_URL" get_desktop_elements '{"depth": 1}'
terminator mcp exec --url "$MCP_URL" take_screenshot '{}'
terminator mcp exec --url "$MCP_URL" open_application '{"path": "notepad.exe"}'
terminator mcp exec --url "$MCP_URL" wait_for_element '{"selector": "process:notepad >> role:Window", "timeout_seconds": 10}'
terminator mcp exec --url "$MCP_URL" type_text '{"selector": "process:notepad >> role:Edit", "text": "Hello from remote!"}'
terminator mcp exec --url "$MCP_URL" click_element '{"selector": "process:notepad >> role:MenuItem && name:File"}'