Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions plugins/flowstudio-power-automate/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# FlowStudio Power Automate Plugin

Give your AI agent the same visibility you have in the Power Automate portal. The Graph API only returns top-level run status — agents can't see action inputs, loop iterations, nested failures, or who owns a flow. Flow Studio MCP exposes all of it.
Give your AI agent the same visibility you have in the Power Automate portal. The Graph API only returns top-level run status — agents can't see action inputs, loop iterations, nested failures, or who owns a flow. FlowStudio MCP exposes all of it.

This plugin includes five skills covering the full lifecycle: connect, debug, build, monitor, and govern Power Automate cloud flows.

Expand All @@ -16,7 +16,7 @@ Requires a [FlowStudio MCP](https://mcp.flowstudio.app) subscription.
| Flow health and failure rates | Nothing |
| Who built a flow, what connectors it uses | Nothing |

Flow Studio MCP fills these gaps.
FlowStudio MCP fills these gaps.

## Installation

Expand Down
37 changes: 15 additions & 22 deletions skills/flowstudio-power-automate-build/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -411,50 +411,43 @@ print(f"Status: {result['responseStatus']}, via: {result['invocation']}")
print(result.get("warning")) # set when a required input was missing: the run still ran, with null
```

### Brand-new non-HTTP flows (Recurrence, connector triggers, etc.)
### Brand-new non-HTTP flows

A brand-new Recurrence or connector-triggered flow has **no prior runs** to
resubmit and no HTTP endpoint to call. This is the ONLY scenario where you
need the temporary HTTP trigger approach below. **Deploy with a temporary
HTTP trigger first, test the actions, then swap to the production trigger.**
A brand-new **Recurrence** flow needs no workaround: deploy it, then run it
immediately with `trigger_live_flow` and no `body` — same as the portal's
"Run flow" button. A body is refused; scheduled triggers take no inputs.

Compact recipe:
A brand-new **connector-triggered** flow (SharePoint, webhooks) has no prior
runs and cannot fire without a real source event. Deploy with a temporary
HTTP trigger, test the actions, then swap to the production trigger:

```python
production_trigger = definition["triggers"]
definition["triggers"] = {
"manual": {"type": "Request", "kind": "Http", "inputs": {"schema": {}}}
}

result = mcp("update_live_flow",
environmentName=ENV,
result = mcp("update_live_flow", environmentName=ENV,
flowName=FLOW_ID, # omit if creating new
definition=definition,
connectionReferences=connection_references,
definition=definition, connectionReferences=connection_references,
displayName="Overdue Invoice Notifications")
FLOW_ID = FLOW_ID or result["created"]
FLOW_ID = FLOW_ID or result["flowName"]

test = mcp("trigger_live_flow", environmentName=ENV, flowName=FLOW_ID,
body={"sample": "payload"})
mcp("trigger_live_flow", environmentName=ENV, flowName=FLOW_ID,
body={"sample": "payload"})
runs = mcp("get_live_flow_runs", environmentName=ENV, flowName=FLOW_ID, top=1)

if runs[0]["status"] == "Failed":
err = mcp("get_live_flow_run_error",
environmentName=ENV, flowName=FLOW_ID, runName=runs[0]["name"])
raise Exception(err["failedActions"][-1])

definition["triggers"] = production_trigger
mcp("update_live_flow",
environmentName=ENV,
flowName=FLOW_ID,
definition=definition,
connectionReferences=connection_references)
mcp("update_live_flow", environmentName=ENV, flowName=FLOW_ID,
definition=definition, connectionReferences=connection_references)
```

The trigger is only the entry point; testing through HTTP still exercises the
same actions. If actions use `triggerBody()` or `triggerOutputs()`, pass a
representative `trigger_live_flow.body` shaped like the production trigger
payload.
representative `body` shaped like the production trigger payload.

---

Expand Down
10 changes: 6 additions & 4 deletions skills/flowstudio-power-automate-debug/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -409,10 +409,10 @@ print(new_runs[0]["status"]) # Succeeded = done
| Scenario | Use | Why |
|---|---|---|
| **Testing a fix** on any flow | `resubmit_live_flow_run` | Replays the exact trigger payload that caused the failure — best way to verify |
| Recurrence / scheduled flow | `resubmit_live_flow_run` | Cannot be triggered on demand any other way |
| Recurrence / scheduled flow | `trigger_live_flow` (no `body`) | Runs it now, like the portal's "Run flow" button; resubmit replays a past run's data |
| SharePoint / connector trigger | `resubmit_live_flow_run` | Cannot be triggered without creating a real SP item |
| HTTP, Button, or PowerApps trigger with **custom** test payload | `trigger_live_flow` | When you need to send different data than the original run |
| Brand-new flow, never run | `trigger_live_flow` (HTTP, Button, PowerApps) | No prior run exists to resubmit |
| Brand-new flow, never run | `trigger_live_flow` | No prior run exists to resubmit |

### Testing HTTP, Button, and PowerApps flows with custom payloads

Expand Down Expand Up @@ -445,8 +445,10 @@ if result.get("warning"):
```

> `trigger_live_flow` handles AAD-authenticated triggers automatically.
> Works for `Request` triggers only: HTTP request, Button, and PowerApps.
> Scheduled and connector triggers cannot be run this way.
> Works for `Request` triggers (HTTP request, Button, PowerApps) and for
> scheduled (Recurrence) flows, which it runs immediately — with no `body`,
> since a scheduled trigger takes no inputs (a body is refused). Automated
> connector triggers only fire from their source event.
>
> Power Automate does not enforce a trigger's `required` inputs. If you leave
> one out the run still starts, with that input null, and the result carries a
Expand Down
14 changes: 7 additions & 7 deletions skills/flowstudio-power-automate-governance/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,18 +64,18 @@ If a deleted flow has `monitor=true`, suggest disabling monitoring

## The Write Tool: `update_store_flow`

`update_store_flow` writes governance metadata to the **Flow Studio cache
`update_store_flow` writes governance metadata to the **FlowStudio cache
only** — it does NOT modify the flow in Power Automate. These fields are
not visible via `get_live_flow` or the PA portal. They exist only in the
Flow Studio store and are used by Flow Studio's scanning pipeline and
FlowStudio store and are used by FlowStudio's scanning pipeline and
notification rules.

This means:
- `ownerTeam` / `supportEmail` — sets who Flow Studio considers the
- `ownerTeam` / `supportEmail` — sets who FlowStudio considers the
governance contact. Does NOT change the actual PA flow owner.
- `rule_notify_email` — sets who receives Flow Studio failure/missing-run
- `rule_notify_email` — sets who receives FlowStudio failure/missing-run
notifications. Does NOT change Microsoft's built-in flow failure alerts.
- `monitor` / `critical` / `businessImpact` — Flow Studio classification
- `monitor` / `critical` / `businessImpact` — FlowStudio classification
only. Power Automate has no equivalent fields.

Merge semantics — only fields you provide are updated. Returns the full
Expand Down Expand Up @@ -218,7 +218,7 @@ store tags, so read/append/write. Avoid overriding computed `tier` unless asked.
### 7. Maker Offboarding

When an employee leaves, identify their flows and apps, and reassign
Flow Studio governance contacts and notification recipients.
FlowStudio governance contacts and notification recipients.

```
1. get_store_maker(makerKey="<departing-user-aad-oid>")
Expand All @@ -234,7 +234,7 @@ Flow Studio governance contacts and notification recipients.
apps needing manual reassignment
```

This changes Flow Studio governance contacts, not actual PA ownership. Power
This changes FlowStudio governance contacts, not actual PA ownership. Power
Apps ownership changes are manual/admin-center work.

### 8. Security Review
Expand Down
3 changes: 3 additions & 0 deletions skills/flowstudio-power-automate-mcp/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ skills that all build on this one.
> compatible Power Automate MCP server). You will need:
> - MCP endpoint: `https://mcp.flowstudio.app/mcp` (same for all subscribers)
> - API key / JWT token (`x-api-key` header — NOT Bearer)
> - In ChatGPT or claude.ai there is no key: add `https://mcp.flowstudio.app/mcp/oauth`
> as a connector and sign in with Microsoft — see the
> [ChatGPT walkthrough](https://learn.flowstudio.app/chatgpt-power-automate)
> - Power Platform environment name (e.g. `Default-<tenant-guid>`)

---
Expand Down
27 changes: 14 additions & 13 deletions skills/flowstudio-power-automate-mcp/references/tool-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,9 @@ Response: wrapper object with `connections` array.
> Filter by status: prefer `overallStatus == "Connected"` when present; otherwise
> check `statuses[0].status == "Connected"`.
>
> For build workflows, pass `environmentName` to avoid using a connection from
> the wrong environment. Omit it only when intentionally inventorying connections
> across all environments.
> `environmentName` is required — the platform cannot list connections across
> environments (omitting it answers 400 MissingEnvironmentFilter). Get one from
> `list_live_environments`.
>
> Pass `search=<connector or account>` to narrow output and receive
> `connectionReferenceTemplate` plus `hostTemplate` values that can be copied
Expand Down Expand Up @@ -448,9 +448,10 @@ Response keys: `flowKey`, `triggerName`, `triggerKind`, `invocation`, `triggerUr
`requiresAadAuth`, `authType`, `responseStatus`, `responseBody`, `runName`, and
`warning` when a required trigger input was not supplied.

> **Works for `Request` triggers: HTTP request, Button, and PowerApps.** Returns an
> error for Recurrence and connector triggers:
> `"only HTTP Request triggers can be invoked via this tool"`.
> **Works for `Request` triggers (HTTP request, Button, PowerApps) and for
> scheduled (Recurrence) flows.** A scheduled flow runs immediately, like the
> portal's "Run flow" button, and takes no `body` — one is refused. Automated
> connector triggers only fire from their source event and return an error.
>
> HTTP triggers go through the signed callback URL (`invocation: callbackUrl`).
> Button and PowerApps triggers have no callback URL; with a `body` they run
Expand Down Expand Up @@ -483,8 +484,7 @@ Response keys: `flowKey`, `triggerName`, `triggerKind`, `invocation`, `triggerUr

### `set_live_flow_state`

Start or stop a Power Automate flow via the live PA API. Does **not** require
a Power Clarity workspace — works for any flow the impersonated account can access.
Start or stop a Power Automate flow in any environment you have access to.
Reads the current state first and only issues the start/stop call if a change is
actually needed.

Expand Down Expand Up @@ -594,11 +594,11 @@ tool schemas cannot tell you.
connectionReferences. Use `set_live_flow_state` to start/stop a flow.

### `trigger_live_flow`
- **Works for HTTP, Button, and PowerApps triggers.** Returns error for Recurrence,
connector, and other trigger types.
- **Works for HTTP, Button, PowerApps, and scheduled (Recurrence) triggers.**
A scheduled flow runs with no `body`. Automated connector triggers error.
- Pass trigger inputs as `body`. A `warning` in the result means a required input
was missing and the run started with it null.
- AAD-authenticated triggers are handled automatically (impersonated Bearer token).
- AAD-authenticated triggers are handled automatically (Bearer token attached).

### `get_live_flow_runs`
- `top` defaults to **30** with automatic pagination for higher values.
Expand All @@ -611,8 +611,9 @@ tool schemas cannot tell you.
- `poster`: `"Flow bot"` for Workflows bot identity, `"User"` for user identity.

### `list_live_connections`
- For build workflows, pass `environmentName`; omitting it inventories
connections across environments.
- `environmentName` is required; the platform cannot list connections across
environments. `top` is applied after `search` and the result carries
`truncated` + `matchedCount` when the cap drops matches.
- Use `search=<connector/account>` to get smaller output and paste-ready
`connectionReferenceTemplate` / `hostTemplate` values.
- `id` is the value you need for `connectionName` in `connectionReferences`.
Expand Down
4 changes: 2 additions & 2 deletions skills/flowstudio-power-automate-monitoring/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ enriched with governance metadata and remediation hints.

## How Monitoring Works

Flow Studio scans the Power Automate API daily for each subscriber and caches
FlowStudio scans the Power Automate API daily for each subscriber and caches
the results. There are two levels:

- **All flows** get metadata scanned: definition, connections, owners, trigger
Expand All @@ -54,7 +54,7 @@ the results. There are two levels:
a flow was last scanned. If stale, the scanning pipeline may not be running.

**Enabling monitoring:** Set `monitor: true` via `update_store_flow` or the
Flow Studio for Teams app
FlowStudio for Teams app
([how to select flows](https://learn.flowstudio.app/teams-monitoring)).

**Designating critical flows:** Use `update_store_flow` with `critical=true`
Expand Down
Loading