Files
awesome-copilot/skills/flowstudio-power-automate-debug/references/common-errors.md
Catherine Han 0a16fe4285 feat: add flowstudio-power-automate-debug and flowstudio-power-automate-build skills (#899)
* feat: add flowstudio-power-automate-debug and flowstudio-power-automate-build skills

Two companion skills for the FlowStudio Power Automate MCP server:

- flowstudio-power-automate-debug: Debug workflow for failed Power Automate cloud flow runs
- flowstudio-power-automate-build: Build & deploy flows from natural language descriptions

Both require a FlowStudio MCP subscription: https://flowstudio.app
These complement the existing flowstudio-power-automate-mcp skill (merged in PR #896).

* fix: address all review comments — README, cross-refs, response shapes, step numbering

- Add skills to docs/README.skills.md (fixes validate-readme CI check)
- Update cross-skill references to use flowstudio- prefix (#1, #4, #7, #9)
- Fix get_live_flow_run_action_outputs: returns array, index [0] (#2, #3)
- Renumber Step 6→5, Step 7→6 — remove gap in build workflow (#8)
- Fix connectionName note: it's the key, not the GUID (#10)
- Remove invalid arrow function from Filter array expression (#11)

* feat: add flowstudio-power-automate plugin bundling all 3 skills

Plugin bundles:
- flowstudio-power-automate-mcp (core connection & CRUD)
- flowstudio-power-automate-debug (debug failed runs)
- flowstudio-power-automate-build (build & deploy flows)

Install: copilot plugin install flowstudio-power-automate@awesome-copilot

Per @aaronpowell's suggestion in review.
2026-03-09 09:58:31 +11:00

5.7 KiB

FlowStudio MCP — Common Power Automate Errors

Reference for error codes, likely causes, and recommended fixes when debugging Power Automate flows via the FlowStudio MCP server.


Expression / Template Errors

InvalidTemplate — Function Applied to Null

Full message pattern: "Unable to process template language expressions... function 'split' expects its first argument 'text' to be of type string"

Root cause: An expression like @split(item()?['Name'], ' ') received a null value.

Diagnosis:

  1. Note the action name in the error message
  2. Call get_live_flow_run_action_outputs on the action that produces the array
  3. Find items where Name (or the referenced field) is null

Fixes:

Before: @split(item()?['Name'], ' ')
After:  @split(coalesce(item()?['Name'], ''), ' ')

Or guard the whole foreach body with a condition:
  expression: "@not(empty(item()?['Name']))"

InvalidTemplate — Wrong Expression Path

Full message pattern: "Unable to process template language expressions... 'triggerBody()?['FieldName']' is of type 'Null'"

Root cause: The field name in the expression doesn't match the actual payload schema.

Diagnosis:

# Check trigger output shape
mcp("get_live_flow_run_action_outputs",
    environmentName=ENV, flowName=FLOW_ID, runName=RUN_ID,
    actionName="<trigger-name>")
# Compare actual keys vs expression

Fix: Update expression to use the correct key name. Common mismatches:

  • triggerBody()?['body'] vs triggerBody()?['Body'] (case-sensitive)
  • triggerBody()?['Subject'] vs triggerOutputs()?['body/Subject']

InvalidTemplate — Type Mismatch

Full message pattern: "... expected type 'Array' but got type 'Object'"

Root cause: Passing an object where the expression expects an array (e.g. a single item HTTP response vs a list response).

Fix:

Before: @outputs('HTTP')?['body']
After:  @outputs('HTTP')?['body/value']    ← for OData list responses
        @createArray(outputs('HTTP')?['body'])  ← wrap single object in array

Connection / Auth Errors

ConnectionAuthorizationFailed

Full message: "The API connection ... is not authorized."

Root cause: The connection referenced in the flow is owned by a different user/service account than the one whose JWT is being used.

Diagnosis: Check properties.connectionReferences — the connectionName GUID identifies the owner. Cannot be fixed via API.

Fix options:

  1. Open flow in Power Automate designer → re-authenticate the connection
  2. Use a connection owned by the service account whose token you hold
  3. Share the connection with the service account in PA admin

InvalidConnectionCredentials

Root cause: The underlying OAuth token for the connection has expired or the user's credentials changed.

Fix: Owner must sign in to Power Automate and refresh the connection.


HTTP Action Errors

ActionFailed — HTTP 4xx/5xx

Full message pattern: "An HTTP request to... failed with status code '400'"

Diagnosis:

actions_out = mcp("get_live_flow_run_action_outputs", ..., actionName="HTTP_My_Call")
item = actions_out[0]   # first entry in the returned array
print(item["outputs"]["statusCode"])   # 400, 401, 403, 500...
print(item["outputs"]["body"])         # error details from target API

Common causes:

  • 401 — missing or expired auth header
  • 403 — permission denied on target resource
  • 404 — wrong URL / resource deleted
  • 400 — malformed JSON body (check expression that builds the body)

ActionFailed — HTTP Timeout

Root cause: Target endpoint did not respond within the connector's timeout (default 90 s for HTTP action).

Fix: Add retry policy to the HTTP action, or split the payload into smaller batches to reduce per-request processing time.


Control Flow Errors

ActionSkipped Instead of Running

Root cause: The runAfter condition wasn't met. E.g. an action set to runAfter: { "Prev": ["Succeeded"] } won't run if Prev failed or was skipped.

Diagnosis: Check the preceding action's status. Deliberately skipped (e.g. inside a false branch) is intentional — unexpected skip is a logic gap.

Fix: Add "Failed" or "Skipped" to the runAfter status array if the action should run on those outcomes too.


Foreach Runs in Wrong Order / Race Condition

Root cause: Foreach without operationOptions: "Sequential" runs iterations in parallel, causing write conflicts or undefined ordering.

Fix: Add "operationOptions": "Sequential" to the Foreach action.


Update / Deploy Errors

update_live_flow Returns No-Op

Symptom: result["updated"] is empty list or result["created"] is empty.

Likely cause: Passing wrong parameter name. The required key is definition (object), not flowDefinition or body.


update_live_flow"Supply connectionReferences"

Root cause: The definition contains OpenApiConnection or OpenApiConnectionWebhook actions but connectionReferences was not passed.

Fix: Fetch the existing connection references with get_live_flow and pass them as the connectionReferences argument.


Data Logic Errors

union() Overriding Correct Records with Nulls

Symptom: After merging two arrays, some records have null fields that existed in one of the source arrays.

Root cause: union(old_data, new_data)union() first-wins, so old_data values override new_data for matching records.

Fix: Swap argument order: union(new_data, old_data)

Before: @sort(union(outputs('Old_Array'), body('New_Array')), 'Date')
After:  @sort(union(body('New_Array'), outputs('Old_Array')), 'Date')