HardwareExecutor provides hardware control capabilities including Arduino HID, BB-8 test fixture, robot arm, mouse control, and screenshot capture.
Server Type: Action
Deployment: HTTP (remote server)
Default Port: 8006
LLM-Selectable: ✅ Yes
| Property | Value |
|---|---|
| Namespace | HardwareExecutor |
| Server Name | Echo Base MCP Server |
| Platform | Cross-platform (requires hardware) |
| Tool Type | action |
| Deployment | HTTP server (stateless) |
Get Arduino HID device status.
Returns: Dict[str, Any] with connected, status, device
Connect to Arduino HID device.
Returns: Dict[str, Any] with success message
Disconnect from Arduino HID device.
Returns: Dict[str, Any] with success message
Type a string of text via Arduino HID.
Parameters:
text(str): Text to type
Returns: Success message
Example:
await computer.run_actions([
MCPToolCall(
tool_key="action::type_text",
tool_name="type_text",
parameters={"text": "Hello, World!"}
)
])Press a sequence of keys.
Parameters:
keys(List[str]): List of key namesinterval(float): Interval between key presses (default: 0.1)
Example:
await computer.run_actions([
MCPToolCall(
tool_key="action::press_key_sequence",
tool_name="press_key_sequence",
parameters={
"keys": ["a", "b", "c"],
"interval": 0.2
}
)
])Press multiple keys simultaneously (hotkey combination).
Parameters:
keys(List[str]): List of keys to press together
Example:
# Ctrl+C
await computer.run_actions([
MCPToolCall(
tool_key="action::press_hotkey",
tool_name="press_hotkey",
parameters={"keys": ["ctrl", "c"]}
)
])Move the mouse pointer.
Parameters:
x(int): X coordinatey(int): Y coordinateabsolute(bool): Absolute (True) or relative (False) positioning (default: False)
Click mouse button.
Parameters:
button(str):"left","right", or"middle"(default:"left")count(int): Number of clicks (default: 1)interval(float): Interval between clicks (default: 0.1)
Press and hold mouse button.
Parameters:
button(str): Mouse button (default:"left")
Release mouse button.
Parameters:
button(str): Mouse button (default:"left")
Scroll mouse wheel.
Parameters:
vertical(int): Vertical scroll amount (default: 0)horizontal(int): Horizontal scroll amount (default: 0)
Example:
# Scroll down
await computer.run_actions([
MCPToolCall(
tool_key="action::scroll_mouse",
tool_name="scroll_mouse",
parameters={"vertical": -5, "horizontal": 0}
)
])Drag mouse from start to end position.
Parameters:
start(Tuple[int, int]): Start (x, y) coordinatesend(Tuple[int, int]): End (x, y) coordinatesbutton(str): Mouse button (default:"left")duration(float): Drag duration in seconds (default: 0.5)
Example:
await computer.run_actions([
MCPToolCall(
tool_key="action::drag_mouse",
tool_name="drag_mouse",
parameters={
"start": [100, 100],
"end": [300, 300],
"duration": 1.0
}
)
])Perform double-click.
Parameters:
button(str): Mouse button (default:"left")
Shortcut for right-click.
Shortcut for middle-click.
Test fixture for Surface device testing.
Get BB-8 test fixture status.
Connect/disconnect to BB-8.
Plug/unplug USB device.
Parameters:
port_name(str): USB port name
Plug/unplug PSU charger.
Attach/detach blade.
Open/close lid.
Press a physical button.
Parameters:
button_name(str): Button name
Long press a button.
Parameters:
button_name(str): Button name
Physical robot arm for touchscreen interaction.
Get robot arm status (position, connection).
Connect/disconnect robot arm.
Simulate touch at specific screen location.
Parameters:
location(Tuple[int, int]): (x, y) coordinates
Example:
await computer.run_actions([
MCPToolCall(
tool_key="action::touch_screen",
tool_name="touch_screen",
parameters={"location": [500, 300]}
)
])Draw on screen by following coordinate path.
Parameters:
path(List[Tuple[int, int]]): List of (x, y) coordinates
Simulate tap(s) on screen.
Parameters:
location(Tuple[int, int]): Tap locationcount(int): Number of taps (default: 1)interval(float): Interval between taps (default: 0.1)
Simulate swipe gesture.
Parameters:
start_location(Tuple[int, int]): Start positionend_location(Tuple[int, int]): End positionduration(float): Swipe duration (default: 0.5)
Simulate long press.
Parameters:
location(Tuple[int, int]): Press locationduration(float): Press duration (default: 1.0)
Simulate double tap.
Parameters:
location(Tuple[int, int]): Tap location
Simulate keyboard key press via robot arm.
Parameters:
key(str): Key to pressmodifiers(List[str]): Modifier keys (e.g.,["ctrl", "shift"])duration(float): Press duration (default: 0.1)
Simulate trackpad interactions.
Capture a screenshot.
Returns: str - Base64-encoded image data
Example:
result = await computer.run_actions([
MCPToolCall(
tool_key="action::take_screenshot",
tool_name="take_screenshot",
parameters={}
)
])
# result[0].data = "iVBORw0KGgoAAAANSUhEUgAA..."# Client configuration (Windows agent)
HostAgent:
default:
action:
- namespace: HardwareExecutor
type: http
host: "192.168.1.100" # Hardware server IP
port: 8006
path: "/mcp"# Start hardware MCP server
python -m ufo.client.mcp.http_servers.hardware_mcp_server --host 0.0.0.0 --port 8006
# Output:
# ==================================================
# UFO Hardware MCP Server
# Hardware automation via Model Context Protocol
# Running on 0.0.0.0:8006
# ==================================================Default Values:
- Host:
localhost - Port:
8006 - Path:
/mcp
# Use IP address for remote hardware
action:
- namespace: HardwareExecutor
type: http
host: "192.168.1.100" # Hardware server
port: 8006All tools return dict with success key:
result = await computer.run_actions([
MCPToolCall(tool_key="action::touch_screen", parameters={"location": [100, 100]})
])
if not result[0].data.get("success"):
logger.error(f"Touch failed: {result[0].data.get('error')}")- Arduino HID: Requires Arduino board with HID firmware
- BB-8: Microsoft Surface test fixture
- Robot Arm: Physical robot arm setup
- Network: Stable network connection for HTTP communication
# 1. Connect to hardware
await computer.run_actions([
MCPToolCall(tool_key="action::robot_arm_connect", parameters={})
])
# 2. Touch screen at login button
await computer.run_actions([
MCPToolCall(tool_key="action::touch_screen", parameters={"location": [500, 700]})
])
# 3. Take screenshot to verify
screenshot = await computer.run_actions([
MCPToolCall(tool_key="action::take_screenshot", parameters={})
])- BashExecutor - Linux command execution
- Remote Servers - HTTP deployment guide
- Action Servers - Action server concepts