ConstellationEditor Server

Overview

ConstellationEditor provides multi-device task coordination and dependency management for distributed workflows in UFO².

Server Type: Action
Deployment: Local (in-process)
Agent: GalaxyAgent
LLM-Selectable: ✅ Yes

Server Information

Property Value
Namespace ConstellationEditor
Server Name UFO Constellation Editor MCP Server
Platform Cross-platform
Tool Type action

Tools Summary

Category Tool Name Description
Task Management add_task Create new task
remove_task Delete task
update_task Modify task properties
Dependency Management add_dependency Create task dependency
remove_dependency Delete dependency
update_dependency Modify dependency description
Bulk Operations build_constellation Build complete constellation from config

Task Management Tools

add_task

Add a new task to the constellation.

Parameters

Parameter Type Required Default Description
task_id str ✅ Yes - Unique task identifier (e.g., "open_browser", "login_system")
name str ✅ Yes - Human-readable task name (e.g., "Open Browser")
description str ✅ Yes - Detailed task description with steps and expected outcomes
target_device_id str No None Device ID where task should execute (from Device Info List)
tips List[str] No None List of tips and best practices for task execution

Returns

str - JSON representation of complete TaskConstellation after adding task

Example

await computer.run_actions([
    MCPToolCall(
        tool_key="action::add_task",
        tool_name="add_task",
        parameters={
            "task_id": "extract_data",
            "name": "Extract Data from Excel",
            "description": "Open Excel file, extract data from Sheet1, save to CSV format",
            "target_device_id": "device_windows_001",
            "tips": [
                "Ensure Excel is installed",
                "Close Excel before running task",
                "Verify file path exists"
            ]
        }
    )
])

remove_task

Remove a task from the constellation (also removes all dependencies involving this task).

Parameters

Parameter Type Required Description
task_id str ✅ Yes Unique task identifier to remove

Returns

str - JSON representation of constellation after removal

Example

await computer.run_actions([
    MCPToolCall(
        tool_key="action::remove_task",
        tool_name="remove_task",
        parameters={"task_id": "extract_data"}
    )
])

update_task

Update specific fields of an existing task.

Parameters

Parameter Type Required Default Description
task_id str ✅ Yes - Task to update
name str No None New task name (leave empty to keep current)
description str No None New description
target_device_id str No None New target device
tips List[str] No None New tips list

Note: Only provided fields are updated; others remain unchanged.

Returns

str - JSON representation of constellation after update

Example

# Update only description and tips
await computer.run_actions([
    MCPToolCall(
        tool_key="action::update_task",
        tool_name="update_task",
        parameters={
            "task_id": "extract_data",
            "description": "Extract data from Excel Sheet1 and Sheet2, merge into single CSV",
            "tips": [
                "Ensure Excel is installed",
                "Handle merged cells properly",
                "Verify output CSV encoding"
            ]
        }
    )
])

Dependency Management Tools

add_dependency

Create a dependency relationship between two tasks (source task must complete before target task can start).

Parameters

Parameter Type Required Description
dependency_id str ✅ Yes MUST generate unique ID (e.g., "login->extract_data")
from_task_id str ✅ Yes Source/prerequisite task ID
to_task_id str ✅ Yes Target/dependent task ID
condition_description str No None

dependency_id Required

You MUST generate and provide a unique dependency_id. Do not omit this parameter!

Returns

str - JSON representation of constellation after adding dependency

Example

await computer.run_actions([
    MCPToolCall(
        tool_key="action::add_dependency",
        tool_name="add_dependency",
        parameters={
            "dependency_id": "login_system->extract_data",  # MUST provide
            "from_task_id": "login_system",
            "to_task_id": "extract_data",
            "condition_description": "Wait for successful user authentication before accessing user data"
        }
    )
])

remove_dependency

Remove a dependency relationship without affecting the tasks themselves.

Parameters

Parameter Type Required Description
dependency_id str ✅ Yes Dependency ID (line_id) to remove

Returns

str - JSON representation of constellation after removal

Example

await computer.run_actions([
    MCPToolCall(
        tool_key="action::remove_dependency",
        tool_name="remove_dependency",
        parameters={"dependency_id": "login_system->extract_data"}
    )
])

update_dependency

Update the condition description of an existing dependency.

Parameters

Parameter Type Required Description
dependency_id str ✅ Yes Dependency to update
condition_description str ✅ Yes New condition description

Returns

str - JSON representation of constellation after update

Example

await computer.run_actions([
    MCPToolCall(
        tool_key="action::update_dependency",
        tool_name="update_dependency",
        parameters={
            "dependency_id": "login_system->extract_data",
            "condition_description": "Wait for successful authentication and database connection before data extraction"
        }
    )
])

Bulk Operations

build_constellation

Build a complete constellation from configuration data (batch creation).

Parameters

Parameter Type Required Default Description
config TaskConstellationSchema ✅ Yes - Complete constellation configuration
clear_existing bool No True Clear existing tasks/dependencies before building

Configuration Schema

{
    "tasks": [
        {
            "task_id": "string (required)",
            "name": "string (optional)",
            "description": "string (required)",
            "target_device_id": "string (optional)",
            "priority": int (1-4, optional),
            "status": "string (optional)",
            "tips": ["string"] (optional)
        }
    ],
    "dependencies": [
        {
            "from_task_id": "string (required)",
            "to_task_id": "string (required)",
            "dependency_type": "string (optional)",
            "condition_description": "string (optional)"
        }
    ],
    "metadata": dict (optional)
}

Returns

str - JSON representation of built constellation

Example

config = {
    "tasks": [
        {
            "task_id": "open_browser",
            "name": "Open Browser",
            "description": "Launch Chrome and navigate to login page",
            "target_device_id": "device_001"
        },
        {
            "task_id": "login",
            "name": "User Login",
            "description": "Enter credentials and submit login form",
            "target_device_id": "device_001"
        },
        {
            "task_id": "extract_data",
            "name": "Extract Data",
            "description": "Navigate to data page and extract table",
            "target_device_id": "device_002"
        }
    ],
    "dependencies": [
        {
            "from_task_id": "open_browser",
            "to_task_id": "login",
            "condition_description": "Browser must be open before login"
        },
        {
            "from_task_id": "login",
            "to_task_id": "extract_data",
            "condition_description": "User must be authenticated before data access"
        }
    ]
}

await computer.run_actions([
    MCPToolCall(
        tool_key="action::build_constellation",
        tool_name="build_constellation",
        parameters={
            "config": config,
            "clear_existing": True
        }
    )
])

Configuration

GalaxyAgent:
  default:
    action:
      - namespace: ConstellationEditor
        type: local

Best Practices

1. Use Descriptive Task IDs

# ✅ Good: Clear task IDs
"task_id": "extract_sales_data_from_excel"
"task_id": "send_email_notification"
"task_id": "process_user_input"

# ❌ Bad: Unclear IDs
"task_id": "task1"
"task_id": "do_stuff"
"task_id": "process"

2. Always Provide dependency_id

# ✅ Good: Generate unique dependency_id
await computer.run_actions([
    MCPToolCall(
        tool_key="action::add_dependency",
        parameters={
            "dependency_id": f"{from_task}->{ to_task}",  # Generate ID
            "from_task_id": from_task,
            "to_task_id": to_task
        }
    )
])

# ❌ Bad: Omit dependency_id
await computer.run_actions([
    MCPToolCall(
        tool_key="action::add_dependency",
        parameters={
            # Missing dependency_id - will fail!
            "from_task_id": from_task,
            "to_task_id": to_task
        }
    )
])

3. Provide Detailed Descriptions

# ✅ Good: Detailed description
{
    "description": "Open Chrome browser, navigate to https://example.com/login, wait for page to fully load, then take a screenshot and save it to C:\\screenshots\\login_page.png"
}

# ❌ Bad: Vague description
{
    "description": "Open browser"
}

Use Cases

Multi-Device Workflow

# 1. Create tasks on different devices
await computer.run_actions([
    MCPToolCall(tool_key="action::add_task", parameters={
        "task_id": "windows_extract",
        "name": "Extract Data on Windows",
        "description": "Extract Excel data",
        "target_device_id": "device_windows_001"
    })
])

await computer.run_actions([
    MCPToolCall(tool_key="action::add_task", parameters={
        "task_id": "linux_process",
        "name": "Process Data on Linux",
        "description": "Run Python analysis script",
        "target_device_id": "device_linux_001"
    })
])

# 2. Create dependency
await computer.run_actions([
    MCPToolCall(tool_key="action::add_dependency", parameters={
        "dependency_id": "windows_extract->linux_process",
        "from_task_id": "windows_extract",
        "to_task_id": "linux_process",
        "condition_description": "Data must be extracted before processing"
    })
])