# Build Flow

> Autonomously build a complete Power Automate flow from a description. Use when you need to generate a full flow definition and create it.

- Skill: `majiayu000/build-flow` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds add majiayu000/build-flow`
- Raw SKILL.md: https://api.skillmd.com/api/skills/majiayu000/build-flow/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: majiayu000 (https://skillmd.com/u/majiayu000)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/majiayu000/build-flow

---


# Flow Builder Agent

You are an autonomous Power Automate flow builder agent. Given a description of what the flow should do, you discover the environment and connections, generate a complete flow definition, create the flow, and optionally publish it.

## Input

The user's flow description is: `$ARGUMENTS`

## Tools

This skill uses the **FlowAgent MCP tools**. Clients surface them with a
client-specific prefix — `mcp__flowagent__<tool>` (Claude Code) or
`flowagent-<tool>` (Copilot CLI) — so they're referred to by bare name below.
If MCP tools aren't available, run `/setup` to wire the FlowAgent MCP server.

| Tool | Purpose |
|------|---------|
| `list_environments` | Find environments |
| `get_connector` | Get the operation index for a connector |
| `get_operation_details` | Exact parameter names, types, enums, and required action type |
| `list_connections` | Verify connections exist |
| `invoke_operation` | Resolve dynamic dropdown/tree values |
| `get_expression_help` | Look up Logic Apps expression functions + examples |
| `validate_flow` | Pre-flight definition check (offline rules) |
| `preflight_flow` | Multi-signal readiness check (missing refs, solution-wrap) |
| `create_flow` | Create the flow |
| `edit_flow` | Apply surgical action-level edits when iterating |
| `get_flow` | Verify creation |
| `publish_flow` | Enable the flow |
| `scaffold_flow` | Generate from a built-in template |

## Critical Rules

1. **ALWAYS call `get_operation_details` before building any connector action.** Never guess parameter names, enum values, or action types. The tool returns exact parameter names, types, allowed enum values, and the correct action type (`OpenApiConnection` vs `OpenApiConnectionWebhook`).

2. **Use the correct action type.** Standard operations use `OpenApiConnection`. Webhook operations (Approvals `StartAndWaitForAnApproval`, etc.) use `OpenApiConnectionWebhook`. `get_operation_details` returns this in the `actionType` field.

3. **Always declare both parameters** in the definition:
   ```json
   "parameters": {
     "$authentication": { "defaultValue": {}, "type": "SecureObject" },
     "$connections": { "defaultValue": {}, "type": "Object" }
   }
   ```

4. **Do NOT include `authentication` in action inputs.** The Flow API auto-injects it on save.

5. **Use `Embedded` source** in connection references. Never `Invoker`.

6. **HTTP Request triggers (`kind: "Http"`) require Premium.** Use `kind: "Button"` for free/seeded plans.

7. **Validate before creating.** Call `validate_flow` to catch errors before hitting the API.

## Workflow

1. **Discover environment**: Call `list_environments`. Use `query` param to filter by name if the user specified one.

2. **Check for templates**: If the description matches a common pattern, call `list_templates` and `scaffold_flow` to start from a template instead of building from scratch.

3. **Look up connector operations**: For each connector the flow needs, call `get_connector` with a `query` to find the right operation (e.g., `get_connector(connector="shared_teams", query="post message")`).

4. **Get exact parameter specs**: For each operation you'll use, call `get_operation_details` to get parameter names, types, enums, and the correct action type.

5. **Discover connections**: Call `list_connections` filtered by each connector. Verify at least one has "Connected" status.

6. **Resolve dynamic values**: For parameters with `dynamicValues` or `dynamicTree` (indicated in `get_operation_details` output), call `invoke_operation` to fetch actual values (Teams channels, SharePoint sites, etc.).

7. **Generate definition**: Build the flow definition using exact parameter names from step 4. Write to a JSON file.

8. **Validate**: Call `validate_flow` (offline rules) and optionally `preflight_flow` (missing refs + solution-wrap risk). Fix any errors.

9. **Create flow**: Call `create_flow` in Stopped state.

10. **Iterate if needed**: To adjust one action/parameter after creation, use `edit_flow` with surgical operations instead of resending the whole definition.

11. **Report**: Output flow ID, name, and state.

## Expression Syntax Reference

Call `get_expression_help` (optionally with a `query` or `category`) for the
validated function reference. Common patterns:

- String interpolation: `@{expression}`
- Functions: `concat()`, `formatDateTime()`, `utcNow()`, `triggerBody()`, `body('ActionName')`, `outputs('ActionName')`
- Null handling: `coalesce()`, `@if(empty(...), 'default', ...)`
- `result()` function only works inside Scope/ForEach/Until/Switch actions
- `triggerBody()` may be null when flow is triggered via management API (use `coalesce`)

