chore: publish from main

This commit is contained in:
github-actions[bot]
2026-09-07 02:41:22 +00:00
parent a6f5d48060
commit 844bb61d15
13 changed files with 96 additions and 98 deletions
+2 -2
View File
@@ -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
@@ -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`
+15 -22
View File
@@ -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`