MCP Phone Control Advanced: Custom Workflows & API Integration

Learning the basic MCP tools is just the beginning—real power comes from custom workflows and batch scheduling. This guide teaches developers how to import their own templates, configure parameter mapping, and receive webhook result pushes.

MCP Phone Control · 8 min read
On this page
  1. Import your own workflow
  2. Call it with parameters
  3. Send to several devices at once
  4. Push the result with a webhook when it finishes

Last month a team wanted to wire phone operations into their own system. The three beginner MCP tools could not cover it: list_devices, create_task, and get_task. They needed their own workflows, and they needed to send work to several devices at once.

Import your own workflow

iEasyRun workflows are defined in JSON, with this structure:

{
  "workflow_id": "my_custom_flow",
  "name": "My Custom Flow",
  "slots": [
    {"name": "platform", "type": "string", "required": true},
    {"name": "content", "type": "string", "required": true}
  ],
  "steps": [
    {"op": "launch_app", "app": "com.example.app"},
    {"op": "input", "selector": "#input-box", "value": "${content}"},
    {"op": "tap", "selector": "#submit-btn"}
  ]
}

Import goes through the farm REST API, POST /api/workflow/import, with the JSON string. You can also edit it by hand in the console, get a trial run working, and then export it for reuse.

Call it with parameters

MCP provides run_workflow(workflow_id, device_id, params):

import httpx

def run_my_flow(device_id: str, platform: str, content: str):
    response = client.call_tool(
        "run_workflow",
        {
            "workflow_id": "my_custom_flow",
            "device_id": device_id,
            "params": {"platform": platform, "content": content}
        }
    )
    return response.task_id

${variable_name} in slots.schema is replaced at runtime with the parameters you pass in. The same template can run different tasks.

Send to several devices at once

When you dispatch different tasks to several devices at once, you can call them in parallel:

# Pseudocode: 5 devices run the same workflow at once
devices = list_devices().result  # all online devices
for d in devices[:5]:
    run_workflow(
        workflow_id="batch_post",
        device_id=d.id,
        params={"platform": d.platform, "content": post_templates[d.index]}
    )

A dedicated batch task scheduling API will be added in the P1 phase, to simplify this kind of call.

Push the result with a webhook when it finishes

If you do not want to poll get_task, include a webhook address when you create the task. When the task finishes, the system pushes the result:

# Pass callback_url when creating the task
task_id = client.create_task(
    workflow_id="my_custom_flow",
    device_id="dev_001",
    params={"content": "Hello World"},
    callback_url="https://your-server.com/webhook/mcp-result"
)

Webhook payload format:

{
  "task_id": "abc123",
  "status": "succeeded",  // or "failed"
  "started_at": "2026-09-01T14:30:00Z",
  "finished_at": "2026-09-01T14:30:45Z",
  "error_message": null,
  "logs": [{"step": 1, "op": "launch_app", "ok": true}]  // summary

A custom workflow plus a webhook can connect phone operations to CI/CD, an operations console, or your own platform. The architecture is in how it works.

Deep Integration

Want To Embed Phone Control Into Your Systems?

MCP integration is free; configuration docs available after download.