mirror of
https://github.com/github/awesome-copilot.git
synced 2026-09-07 16:25:47 +00:00
chore: publish from main
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
# FlowStudio Power Automate Plugin
|
# 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.
|
This plugin includes five skills covering the full lifecycle: connect, debug, build, monitor, and govern Power Automate cloud flows.
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ Requires a [FlowStudio MCP](https://mcp.flowstudio.app) subscription.
|
|||||||
| Flow health and failure rates | Nothing |
|
| Flow health and failure rates | Nothing |
|
||||||
| Who built a flow, what connectors it uses | Nothing |
|
| Who built a flow, what connectors it uses | Nothing |
|
||||||
|
|
||||||
Flow Studio MCP fills these gaps.
|
FlowStudio MCP fills these gaps.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
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
|
A brand-new **Recurrence** flow needs no workaround: deploy it, then run it
|
||||||
resubmit and no HTTP endpoint to call. This is the ONLY scenario where you
|
immediately with `trigger_live_flow` and no `body` — same as the portal's
|
||||||
need the temporary HTTP trigger approach below. **Deploy with a temporary
|
"Run flow" button. A body is refused; scheduled triggers take no inputs.
|
||||||
HTTP trigger first, test the actions, then swap to the production trigger.**
|
|
||||||
|
|
||||||
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
|
```python
|
||||||
production_trigger = definition["triggers"]
|
production_trigger = definition["triggers"]
|
||||||
definition["triggers"] = {
|
definition["triggers"] = {
|
||||||
"manual": {"type": "Request", "kind": "Http", "inputs": {"schema": {}}}
|
"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
|
flowName=FLOW_ID, # omit if creating new
|
||||||
definition=definition,
|
definition=definition, connectionReferences=connection_references,
|
||||||
connectionReferences=connection_references,
|
|
||||||
displayName="Overdue Invoice Notifications")
|
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,
|
mcp("trigger_live_flow", environmentName=ENV, flowName=FLOW_ID,
|
||||||
body={"sample": "payload"})
|
body={"sample": "payload"})
|
||||||
runs = mcp("get_live_flow_runs", environmentName=ENV, flowName=FLOW_ID, top=1)
|
runs = mcp("get_live_flow_runs", environmentName=ENV, flowName=FLOW_ID, top=1)
|
||||||
|
|
||||||
if runs[0]["status"] == "Failed":
|
if runs[0]["status"] == "Failed":
|
||||||
err = mcp("get_live_flow_run_error",
|
err = mcp("get_live_flow_run_error",
|
||||||
environmentName=ENV, flowName=FLOW_ID, runName=runs[0]["name"])
|
environmentName=ENV, flowName=FLOW_ID, runName=runs[0]["name"])
|
||||||
raise Exception(err["failedActions"][-1])
|
raise Exception(err["failedActions"][-1])
|
||||||
|
|
||||||
definition["triggers"] = production_trigger
|
definition["triggers"] = production_trigger
|
||||||
mcp("update_live_flow",
|
mcp("update_live_flow", environmentName=ENV, flowName=FLOW_ID,
|
||||||
environmentName=ENV,
|
definition=definition, connectionReferences=connection_references)
|
||||||
flowName=FLOW_ID,
|
|
||||||
definition=definition,
|
|
||||||
connectionReferences=connection_references)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
The trigger is only the entry point; testing through HTTP still exercises the
|
The trigger is only the entry point; testing through HTTP still exercises the
|
||||||
same actions. If actions use `triggerBody()` or `triggerOutputs()`, pass a
|
same actions. If actions use `triggerBody()` or `triggerOutputs()`, pass a
|
||||||
representative `trigger_live_flow.body` shaped like the production trigger
|
representative `body` shaped like the production trigger payload.
|
||||||
payload.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -409,10 +409,10 @@ print(new_runs[0]["status"]) # Succeeded = done
|
|||||||
| Scenario | Use | Why |
|
| 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 |
|
| **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 |
|
| 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 |
|
| 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
|
### Testing HTTP, Button, and PowerApps flows with custom payloads
|
||||||
|
|
||||||
@@ -445,8 +445,10 @@ if result.get("warning"):
|
|||||||
```
|
```
|
||||||
|
|
||||||
> `trigger_live_flow` handles AAD-authenticated triggers automatically.
|
> `trigger_live_flow` handles AAD-authenticated triggers automatically.
|
||||||
> Works for `Request` triggers only: HTTP request, Button, and PowerApps.
|
> Works for `Request` triggers (HTTP request, Button, PowerApps) and for
|
||||||
> Scheduled and connector triggers cannot be run this way.
|
> 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
|
> 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
|
> one out the run still starts, with that input null, and the result carries a
|
||||||
|
|||||||
+7
-7
@@ -64,18 +64,18 @@ If a deleted flow has `monitor=true`, suggest disabling monitoring
|
|||||||
|
|
||||||
## The Write Tool: `update_store_flow`
|
## 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
|
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
|
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.
|
notification rules.
|
||||||
|
|
||||||
This means:
|
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.
|
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.
|
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.
|
only. Power Automate has no equivalent fields.
|
||||||
|
|
||||||
Merge semantics — only fields you provide are updated. Returns the full
|
Merge semantics — only fields you provide are updated. Returns the full
|
||||||
@@ -218,7 +218,7 @@ store tags, so read/append/write. Avoid overriding computed `tier` unless asked.
|
|||||||
### 7. Maker Offboarding
|
### 7. Maker Offboarding
|
||||||
|
|
||||||
When an employee leaves, identify their flows and apps, and reassign
|
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>")
|
1. get_store_maker(makerKey="<departing-user-aad-oid>")
|
||||||
@@ -234,7 +234,7 @@ Flow Studio governance contacts and notification recipients.
|
|||||||
apps needing manual reassignment
|
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.
|
Apps ownership changes are manual/admin-center work.
|
||||||
|
|
||||||
### 8. Security Review
|
### 8. Security Review
|
||||||
|
|||||||
@@ -26,6 +26,9 @@ skills that all build on this one.
|
|||||||
> compatible Power Automate MCP server). You will need:
|
> compatible Power Automate MCP server). You will need:
|
||||||
> - MCP endpoint: `https://mcp.flowstudio.app/mcp` (same for all subscribers)
|
> - MCP endpoint: `https://mcp.flowstudio.app/mcp` (same for all subscribers)
|
||||||
> - API key / JWT token (`x-api-key` header — NOT Bearer)
|
> - 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>`)
|
> - Power Platform environment name (e.g. `Default-<tenant-guid>`)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
+14
-13
@@ -93,9 +93,9 @@ Response: wrapper object with `connections` array.
|
|||||||
> Filter by status: prefer `overallStatus == "Connected"` when present; otherwise
|
> Filter by status: prefer `overallStatus == "Connected"` when present; otherwise
|
||||||
> check `statuses[0].status == "Connected"`.
|
> check `statuses[0].status == "Connected"`.
|
||||||
>
|
>
|
||||||
> For build workflows, pass `environmentName` to avoid using a connection from
|
> `environmentName` is required — the platform cannot list connections across
|
||||||
> the wrong environment. Omit it only when intentionally inventorying connections
|
> environments (omitting it answers 400 MissingEnvironmentFilter). Get one from
|
||||||
> across all environments.
|
> `list_live_environments`.
|
||||||
>
|
>
|
||||||
> Pass `search=<connector or account>` to narrow output and receive
|
> Pass `search=<connector or account>` to narrow output and receive
|
||||||
> `connectionReferenceTemplate` plus `hostTemplate` values that can be copied
|
> `connectionReferenceTemplate` plus `hostTemplate` values that can be copied
|
||||||
@@ -448,9 +448,10 @@ Response keys: `flowKey`, `triggerName`, `triggerKind`, `invocation`, `triggerUr
|
|||||||
`requiresAadAuth`, `authType`, `responseStatus`, `responseBody`, `runName`, and
|
`requiresAadAuth`, `authType`, `responseStatus`, `responseBody`, `runName`, and
|
||||||
`warning` when a required trigger input was not supplied.
|
`warning` when a required trigger input was not supplied.
|
||||||
|
|
||||||
> **Works for `Request` triggers: HTTP request, Button, and PowerApps.** Returns an
|
> **Works for `Request` triggers (HTTP request, Button, PowerApps) and for
|
||||||
> error for Recurrence and connector triggers:
|
> scheduled (Recurrence) flows.** A scheduled flow runs immediately, like the
|
||||||
> `"only HTTP Request triggers can be invoked via this tool"`.
|
> 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`).
|
> HTTP triggers go through the signed callback URL (`invocation: callbackUrl`).
|
||||||
> Button and PowerApps triggers have no callback URL; with a `body` they run
|
> Button and PowerApps triggers have no callback URL; with a `body` they run
|
||||||
@@ -483,8 +484,7 @@ Response keys: `flowKey`, `triggerName`, `triggerKind`, `invocation`, `triggerUr
|
|||||||
|
|
||||||
### `set_live_flow_state`
|
### `set_live_flow_state`
|
||||||
|
|
||||||
Start or stop a Power Automate flow via the live PA API. Does **not** require
|
Start or stop a Power Automate flow in any environment you have access to.
|
||||||
a Power Clarity workspace — works for any flow the impersonated account can access.
|
|
||||||
Reads the current state first and only issues the start/stop call if a change is
|
Reads the current state first and only issues the start/stop call if a change is
|
||||||
actually needed.
|
actually needed.
|
||||||
|
|
||||||
@@ -594,11 +594,11 @@ tool schemas cannot tell you.
|
|||||||
connectionReferences. Use `set_live_flow_state` to start/stop a flow.
|
connectionReferences. Use `set_live_flow_state` to start/stop a flow.
|
||||||
|
|
||||||
### `trigger_live_flow`
|
### `trigger_live_flow`
|
||||||
- **Works for HTTP, Button, and PowerApps triggers.** Returns error for Recurrence,
|
- **Works for HTTP, Button, PowerApps, and scheduled (Recurrence) triggers.**
|
||||||
connector, and other trigger types.
|
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
|
- Pass trigger inputs as `body`. A `warning` in the result means a required input
|
||||||
was missing and the run started with it null.
|
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`
|
### `get_live_flow_runs`
|
||||||
- `top` defaults to **30** with automatic pagination for higher values.
|
- `top` defaults to **30** with automatic pagination for higher values.
|
||||||
@@ -611,8 +611,9 @@ tool schemas cannot tell you.
|
|||||||
- `poster`: `"Flow bot"` for Workflows bot identity, `"User"` for user identity.
|
- `poster`: `"Flow bot"` for Workflows bot identity, `"User"` for user identity.
|
||||||
|
|
||||||
### `list_live_connections`
|
### `list_live_connections`
|
||||||
- For build workflows, pass `environmentName`; omitting it inventories
|
- `environmentName` is required; the platform cannot list connections across
|
||||||
connections across environments.
|
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
|
- Use `search=<connector/account>` to get smaller output and paste-ready
|
||||||
`connectionReferenceTemplate` / `hostTemplate` values.
|
`connectionReferenceTemplate` / `hostTemplate` values.
|
||||||
- `id` is the value you need for `connectionName` in `connectionReferences`.
|
- `id` is the value you need for `connectionName` in `connectionReferences`.
|
||||||
|
|||||||
+2
-2
@@ -39,7 +39,7 @@ enriched with governance metadata and remediation hints.
|
|||||||
|
|
||||||
## How Monitoring Works
|
## 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:
|
the results. There are two levels:
|
||||||
|
|
||||||
- **All flows** get metadata scanned: definition, connections, owners, trigger
|
- **All flows** get metadata scanned: definition, connections, owners, trigger
|
||||||
@@ -54,7 +54,7 @@ the results. There are two levels:
|
|||||||
a flow was last scanned. If stale, the scanning pipeline may not be running.
|
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
|
**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)).
|
([how to select flows](https://learn.flowstudio.app/teams-monitoring)).
|
||||||
|
|
||||||
**Designating critical flows:** Use `update_store_flow` with `critical=true`
|
**Designating critical flows:** Use `update_store_flow` with `critical=true`
|
||||||
|
|||||||
@@ -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
|
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
|
A brand-new **Recurrence** flow needs no workaround: deploy it, then run it
|
||||||
resubmit and no HTTP endpoint to call. This is the ONLY scenario where you
|
immediately with `trigger_live_flow` and no `body` — same as the portal's
|
||||||
need the temporary HTTP trigger approach below. **Deploy with a temporary
|
"Run flow" button. A body is refused; scheduled triggers take no inputs.
|
||||||
HTTP trigger first, test the actions, then swap to the production trigger.**
|
|
||||||
|
|
||||||
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
|
```python
|
||||||
production_trigger = definition["triggers"]
|
production_trigger = definition["triggers"]
|
||||||
definition["triggers"] = {
|
definition["triggers"] = {
|
||||||
"manual": {"type": "Request", "kind": "Http", "inputs": {"schema": {}}}
|
"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
|
flowName=FLOW_ID, # omit if creating new
|
||||||
definition=definition,
|
definition=definition, connectionReferences=connection_references,
|
||||||
connectionReferences=connection_references,
|
|
||||||
displayName="Overdue Invoice Notifications")
|
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,
|
mcp("trigger_live_flow", environmentName=ENV, flowName=FLOW_ID,
|
||||||
body={"sample": "payload"})
|
body={"sample": "payload"})
|
||||||
runs = mcp("get_live_flow_runs", environmentName=ENV, flowName=FLOW_ID, top=1)
|
runs = mcp("get_live_flow_runs", environmentName=ENV, flowName=FLOW_ID, top=1)
|
||||||
|
|
||||||
if runs[0]["status"] == "Failed":
|
if runs[0]["status"] == "Failed":
|
||||||
err = mcp("get_live_flow_run_error",
|
err = mcp("get_live_flow_run_error",
|
||||||
environmentName=ENV, flowName=FLOW_ID, runName=runs[0]["name"])
|
environmentName=ENV, flowName=FLOW_ID, runName=runs[0]["name"])
|
||||||
raise Exception(err["failedActions"][-1])
|
raise Exception(err["failedActions"][-1])
|
||||||
|
|
||||||
definition["triggers"] = production_trigger
|
definition["triggers"] = production_trigger
|
||||||
mcp("update_live_flow",
|
mcp("update_live_flow", environmentName=ENV, flowName=FLOW_ID,
|
||||||
environmentName=ENV,
|
definition=definition, connectionReferences=connection_references)
|
||||||
flowName=FLOW_ID,
|
|
||||||
definition=definition,
|
|
||||||
connectionReferences=connection_references)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
The trigger is only the entry point; testing through HTTP still exercises the
|
The trigger is only the entry point; testing through HTTP still exercises the
|
||||||
same actions. If actions use `triggerBody()` or `triggerOutputs()`, pass a
|
same actions. If actions use `triggerBody()` or `triggerOutputs()`, pass a
|
||||||
representative `trigger_live_flow.body` shaped like the production trigger
|
representative `body` shaped like the production trigger payload.
|
||||||
payload.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -409,10 +409,10 @@ print(new_runs[0]["status"]) # Succeeded = done
|
|||||||
| Scenario | Use | Why |
|
| 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 |
|
| **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 |
|
| 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 |
|
| 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
|
### Testing HTTP, Button, and PowerApps flows with custom payloads
|
||||||
|
|
||||||
@@ -445,8 +445,10 @@ if result.get("warning"):
|
|||||||
```
|
```
|
||||||
|
|
||||||
> `trigger_live_flow` handles AAD-authenticated triggers automatically.
|
> `trigger_live_flow` handles AAD-authenticated triggers automatically.
|
||||||
> Works for `Request` triggers only: HTTP request, Button, and PowerApps.
|
> Works for `Request` triggers (HTTP request, Button, PowerApps) and for
|
||||||
> Scheduled and connector triggers cannot be run this way.
|
> 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
|
> 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
|
> one out the run still starts, with that input null, and the result carries a
|
||||||
|
|||||||
@@ -64,18 +64,18 @@ If a deleted flow has `monitor=true`, suggest disabling monitoring
|
|||||||
|
|
||||||
## The Write Tool: `update_store_flow`
|
## 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
|
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
|
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.
|
notification rules.
|
||||||
|
|
||||||
This means:
|
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.
|
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.
|
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.
|
only. Power Automate has no equivalent fields.
|
||||||
|
|
||||||
Merge semantics — only fields you provide are updated. Returns the full
|
Merge semantics — only fields you provide are updated. Returns the full
|
||||||
@@ -218,7 +218,7 @@ store tags, so read/append/write. Avoid overriding computed `tier` unless asked.
|
|||||||
### 7. Maker Offboarding
|
### 7. Maker Offboarding
|
||||||
|
|
||||||
When an employee leaves, identify their flows and apps, and reassign
|
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>")
|
1. get_store_maker(makerKey="<departing-user-aad-oid>")
|
||||||
@@ -234,7 +234,7 @@ Flow Studio governance contacts and notification recipients.
|
|||||||
apps needing manual reassignment
|
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.
|
Apps ownership changes are manual/admin-center work.
|
||||||
|
|
||||||
### 8. Security Review
|
### 8. Security Review
|
||||||
|
|||||||
@@ -26,6 +26,9 @@ skills that all build on this one.
|
|||||||
> compatible Power Automate MCP server). You will need:
|
> compatible Power Automate MCP server). You will need:
|
||||||
> - MCP endpoint: `https://mcp.flowstudio.app/mcp` (same for all subscribers)
|
> - MCP endpoint: `https://mcp.flowstudio.app/mcp` (same for all subscribers)
|
||||||
> - API key / JWT token (`x-api-key` header — NOT Bearer)
|
> - 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>`)
|
> - Power Platform environment name (e.g. `Default-<tenant-guid>`)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -93,9 +93,9 @@ Response: wrapper object with `connections` array.
|
|||||||
> Filter by status: prefer `overallStatus == "Connected"` when present; otherwise
|
> Filter by status: prefer `overallStatus == "Connected"` when present; otherwise
|
||||||
> check `statuses[0].status == "Connected"`.
|
> check `statuses[0].status == "Connected"`.
|
||||||
>
|
>
|
||||||
> For build workflows, pass `environmentName` to avoid using a connection from
|
> `environmentName` is required — the platform cannot list connections across
|
||||||
> the wrong environment. Omit it only when intentionally inventorying connections
|
> environments (omitting it answers 400 MissingEnvironmentFilter). Get one from
|
||||||
> across all environments.
|
> `list_live_environments`.
|
||||||
>
|
>
|
||||||
> Pass `search=<connector or account>` to narrow output and receive
|
> Pass `search=<connector or account>` to narrow output and receive
|
||||||
> `connectionReferenceTemplate` plus `hostTemplate` values that can be copied
|
> `connectionReferenceTemplate` plus `hostTemplate` values that can be copied
|
||||||
@@ -448,9 +448,10 @@ Response keys: `flowKey`, `triggerName`, `triggerKind`, `invocation`, `triggerUr
|
|||||||
`requiresAadAuth`, `authType`, `responseStatus`, `responseBody`, `runName`, and
|
`requiresAadAuth`, `authType`, `responseStatus`, `responseBody`, `runName`, and
|
||||||
`warning` when a required trigger input was not supplied.
|
`warning` when a required trigger input was not supplied.
|
||||||
|
|
||||||
> **Works for `Request` triggers: HTTP request, Button, and PowerApps.** Returns an
|
> **Works for `Request` triggers (HTTP request, Button, PowerApps) and for
|
||||||
> error for Recurrence and connector triggers:
|
> scheduled (Recurrence) flows.** A scheduled flow runs immediately, like the
|
||||||
> `"only HTTP Request triggers can be invoked via this tool"`.
|
> 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`).
|
> HTTP triggers go through the signed callback URL (`invocation: callbackUrl`).
|
||||||
> Button and PowerApps triggers have no callback URL; with a `body` they run
|
> Button and PowerApps triggers have no callback URL; with a `body` they run
|
||||||
@@ -483,8 +484,7 @@ Response keys: `flowKey`, `triggerName`, `triggerKind`, `invocation`, `triggerUr
|
|||||||
|
|
||||||
### `set_live_flow_state`
|
### `set_live_flow_state`
|
||||||
|
|
||||||
Start or stop a Power Automate flow via the live PA API. Does **not** require
|
Start or stop a Power Automate flow in any environment you have access to.
|
||||||
a Power Clarity workspace — works for any flow the impersonated account can access.
|
|
||||||
Reads the current state first and only issues the start/stop call if a change is
|
Reads the current state first and only issues the start/stop call if a change is
|
||||||
actually needed.
|
actually needed.
|
||||||
|
|
||||||
@@ -594,11 +594,11 @@ tool schemas cannot tell you.
|
|||||||
connectionReferences. Use `set_live_flow_state` to start/stop a flow.
|
connectionReferences. Use `set_live_flow_state` to start/stop a flow.
|
||||||
|
|
||||||
### `trigger_live_flow`
|
### `trigger_live_flow`
|
||||||
- **Works for HTTP, Button, and PowerApps triggers.** Returns error for Recurrence,
|
- **Works for HTTP, Button, PowerApps, and scheduled (Recurrence) triggers.**
|
||||||
connector, and other trigger types.
|
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
|
- Pass trigger inputs as `body`. A `warning` in the result means a required input
|
||||||
was missing and the run started with it null.
|
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`
|
### `get_live_flow_runs`
|
||||||
- `top` defaults to **30** with automatic pagination for higher values.
|
- `top` defaults to **30** with automatic pagination for higher values.
|
||||||
@@ -611,8 +611,9 @@ tool schemas cannot tell you.
|
|||||||
- `poster`: `"Flow bot"` for Workflows bot identity, `"User"` for user identity.
|
- `poster`: `"Flow bot"` for Workflows bot identity, `"User"` for user identity.
|
||||||
|
|
||||||
### `list_live_connections`
|
### `list_live_connections`
|
||||||
- For build workflows, pass `environmentName`; omitting it inventories
|
- `environmentName` is required; the platform cannot list connections across
|
||||||
connections across environments.
|
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
|
- Use `search=<connector/account>` to get smaller output and paste-ready
|
||||||
`connectionReferenceTemplate` / `hostTemplate` values.
|
`connectionReferenceTemplate` / `hostTemplate` values.
|
||||||
- `id` is the value you need for `connectionName` in `connectionReferences`.
|
- `id` is the value you need for `connectionName` in `connectionReferences`.
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ enriched with governance metadata and remediation hints.
|
|||||||
|
|
||||||
## How Monitoring Works
|
## 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:
|
the results. There are two levels:
|
||||||
|
|
||||||
- **All flows** get metadata scanned: definition, connections, owners, trigger
|
- **All flows** get metadata scanned: definition, connections, owners, trigger
|
||||||
@@ -54,7 +54,7 @@ the results. There are two levels:
|
|||||||
a flow was last scanned. If stale, the scanning pipeline may not be running.
|
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
|
**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)).
|
([how to select flows](https://learn.flowstudio.app/teams-monitoring)).
|
||||||
|
|
||||||
**Designating critical flows:** Use `update_store_flow` with `critical=true`
|
**Designating critical flows:** Use `update_store_flow` with `critical=true`
|
||||||
|
|||||||
Reference in New Issue
Block a user