HardwareExecutor Server
Overview
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
Server Information
| Property | Value |
|---|---|
| Namespace | HardwareExecutor |
| Server Name | Echo Base MCP Server |
| Platform | Cross-platform (requires hardware) |
| Tool Type | action |
| Deployment | HTTP server (stateless) |
Tool Categories
1. Arduino HID Tools (Keyboard/Mouse Emulation)
2. Mouse Control Tools
3. BB-8 Test Fixture Tools
4. Robot Arm Tools
5. Screenshot Tool
Arduino HID Tools
arduino_hid_status
Get Arduino HID device status.
Returns: Dict[str, Any] with connected, status, device
arduino_hid_connect
Connect to Arduino HID device.
Returns: Dict[str, Any] with success message
arduino_hid_disconnect
Disconnect from Arduino HID device.
Returns: Dict[str, Any] with success message
type_text
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_key_sequence
Press a sequence of keys.
Parameters:
- keys (List[str]): List of key names
- interval (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_hotkey
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"]}
)
])
Mouse Control Tools
move_mouse
Move the mouse pointer.
Parameters:
- x (int): X coordinate
- y (int): Y coordinate
- absolute (bool): Absolute (True) or relative (False) positioning (default: False)
click_mouse
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_mouse_button
Press and hold mouse button.
Parameters:
- button (str): Mouse button (default: "left")
release_mouse_button
Release mouse button.
Parameters:
- button (str): Mouse button (default: "left")
scroll_mouse
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
Drag mouse from start to end position.
Parameters:
- start (Tuple[int, int]): Start (x, y) coordinates
- end (Tuple[int, int]): End (x, y) coordinates
- button (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
}
)
])
double_click_mouse
Perform double-click.
Parameters:
- button (str): Mouse button (default: "left")
right_click_mouse
Shortcut for right-click.
middle_click_mouse
Shortcut for middle-click.
BB-8 Test Fixture Tools
Test fixture for Surface device testing.
bb8_status
Get BB-8 test fixture status.
bb8_connect / bb8_disconnect
Connect/disconnect to BB-8.
bb8_usb_port_plug / bb8_usb_port_unplug
Plug/unplug USB device.
Parameters:
- port_name (str): USB port name
bb8_psu_charger_plug / bb8_psu_charger_unplug
Plug/unplug PSU charger.
bb8_blade_attach / bb8_blade_detach
Attach/detach blade.
bb8_lid_open / bb8_lid_close
Open/close lid.
bb8_button_press
Press a physical button.
Parameters:
- button_name (str): Button name
bb8_button_long_press
Long press a button.
Parameters:
- button_name (str): Button name
Robot Arm Tools
Physical robot arm for touchscreen interaction.
robot_arm_status
Get robot arm status (position, connection).
robot_arm_connect / robot_arm_disconnect
Connect/disconnect robot arm.
touch_screen
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
Draw on screen by following coordinate path.
Parameters:
- path (List[Tuple[int, int]]): List of (x, y) coordinates
tap_screen
Simulate tap(s) on screen.
Parameters:
- location (Tuple[int, int]): Tap location
- count (int): Number of taps (default: 1)
- interval (float): Interval between taps (default: 0.1)
swipe_screen
Simulate swipe gesture.
Parameters:
- start_location (Tuple[int, int]): Start position
- end_location (Tuple[int, int]): End position
- duration (float): Swipe duration (default: 0.5)
long_press_screen
Simulate long press.
Parameters:
- location (Tuple[int, int]): Press location
- duration (float): Press duration (default: 1.0)
double_tap_screen
Simulate double tap.
Parameters:
- location (Tuple[int, int]): Tap location
press_key
Simulate keyboard key press via robot arm.
Parameters:
- key (str): Key to press
- modifiers (List[str]): Modifier keys (e.g., ["ctrl", "shift"])
- duration (float): Press duration (default: 0.1)
tap_trackpad / swipe_trackpad
Simulate trackpad interactions.
Screenshot Tool
take_screenshot
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..."
Configuration
# Client configuration (Windows agent)
HostAgent:
default:
action:
- namespace: HardwareExecutor
type: http
host: "192.168.1.100" # Hardware server IP
port: 8006
path: "/mcp"
Deployment
Starting the Server
# 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
# ==================================================
Configuration
Default Values:
- Host: localhost
- Port: 8006
- Path: /mcp
Best Practices
1. Network Configuration
# Use IP address for remote hardware
action:
- namespace: HardwareExecutor
type: http
host: "192.168.1.100" # Hardware server
port: 8006
2. Error Handling
All 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')}")
3. Physical Hardware Requirements
- 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
Use Cases
Automated Testing
# 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={})
])
Related Documentation
- BashExecutor - Linux command execution
- Remote Servers - HTTP deployment guide
- Action Servers - Action server concepts