Debug, build, and manage Power Automate cloud flows with AI agents
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Flow Studio MCP API key (get one at https://mcp.flowstudio.app)
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Move a flow into a solution. Refuses if the flow is already in one. solutionId is optional — omit for the default solution.
Name (ID) of the flow to migrate into the solution.
Name of the Power Platform environment.
Target solution ID (Dataverse solutionid GUID). Omit for the default solution. Discover IDs via resolve_live_parameters on shared_commondataserviceforapps/ListRecords with entityName "solutions" (value-path solutionid, value-title friendlyname); needs a Dataverse connection in the env.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Move a flow into a solution. Refuses if the flow is already in one. solutionId is optional — omit for the default solution.
| Argument | Type | Description |
|---|---|---|
| flowName* | string | Name (ID) of the flow to migrate into the solution. |
| solutionId | string | Target solution ID (Dataverse solutionid GUID). Omit for the default solution. Discover IDs via resolve_live_parameters on shared_commondataserviceforapps/ListRecords with entityName "solutions" (value-path solutionid, value-title friendlyname); needs a Dataverse connection in the env. |
| environmentName* | string | Name of the Power Platform environment. |
{
"type": "object",
"required": [
"environmentName",
"flowName"
],
"properties": {
"flowName": {
"type": "string",
"description": "Name (ID) of the flow to migrate into the solution."
},
"solutionId": {
"type": "string",
"description": "Target solution ID (Dataverse solutionid GUID). Omit for the default solution. Discover IDs via resolve_live_parameters on shared_commondataserviceforapps/ListRecords with entityName \"solutions\" (value-path solutionid, value-title friendlyname); needs a Dataverse connection in the env."
},
"environmentName": {
"type": "string",
"description": "Name of the Power Platform environment."
}
}
}Cancel a currently running Power Automate flow run via the live PA API. Use after get_live_flow_runs to obtain the run name. Only runs with status "Running" can be cancelled.
| Argument | Type | Description |
|---|---|---|
| runName* | string | Run identifier (name field from get_live_flow_runs). |
| flowName* | string | Name (ID) of the flow. |
| environmentName* | string | Name of the Power Platform environment. |
{
"type": "object",
"required": [
"environmentName",
"flowName",
"runName"
],
"properties": {
"runName": {
"type": "string",
"description": "Run identifier (name field from get_live_flow_runs)."
},
"flowName": {
"type": "string",
"description": "Name (ID) of the flow."
},
"environmentName": {
"type": "string",
"description": "Name of the Power Platform environment."
}
}
}Create a connection, or sign an existing one in again (pass connectionName). Shows a sign-in card where the person signs in; you never sign in for them. Without the card, give the person signInLink to open. Connectors that use a key or account details instead of a sign-in are refused: create those in Power Automate.
| Argument | Type | Description |
|---|---|---|
| connectorName* | string | Connector name, e.g. shared_sharepointonline. |
| connectionName | string | An existing connection to sign in again, instead of creating one. |
| environmentName* | string | Name of the Power Platform environment. |
{
"type": "object",
"required": [
"environmentName",
"connectorName"
],
"properties": {
"connectorName": {
"type": "string",
"description": "Connector name, e.g. shared_sharepointonline."
},
"connectionName": {
"type": "string",
"description": "An existing connection to sign in again, instead of creating one."
},
"environmentName": {
"type": "string",
"description": "Name of the Power Platform environment."
}
}
}Describe a live Power Platform connector/API and its operations. Use mode=summary (default) to get a compact operation catalog. Use operationId to describe one operation, including inputs, outputs, dynamic parameter metadata, nextTool hints to call resolve_live_parameters, and an authored hint + canonical example shape (when one exists) to copy into update_live_flow. Use search without connectorName/apiName to search operations across connectors and get connection-aware suggestions. Use mode=full only when raw OpenAPI connector metadata is required.
| Argument | Type | Description |
|---|---|---|
| top | number | Max operations to return in connector summary mode, or max top search results to show in cross-connector search. Default 250 for summary, 10 for search display. |
| type | string | Operation usage to include in summary mode. Default Action. |
| depth | string | summary (default): compact operation catalog. full: raw OpenAPI metadata. |
| search | string | Optional operation search text. With connectorName, filters that connector summary. Without connectorName, searches operations across connectors. |
| apiName | string | Alias for connectorName. |
| variant | string | When an operation has multiple authored variants (e.g. shared_teams/PostMessageToConversation has channel/groupchat/flowbot_chat), pass a specific variantKey to get that variant's hint and exampleDefinition. Omit to receive a hint listing the available variants. |
Fetch the full native Power Automate flow JSON from the PA API, including the complete flow definition (triggers, actions, parameters, outputs). Returns the raw properties object exactly as the PA API returns it. Use this to inspect the full definition before calling update_live_flow with a modified definition.
| Argument | Type | Description |
|---|---|---|
| depth | string | full (default): the whole definition. summary: the action tree — name, type, operation, runAfter, nesting — with no inputs. Use summary on a large flow, then ask for the actions you need. |
| actions | array | Return only these actions, found at any nesting depth and each reported with the scopes it sits in, plus triggers. Combine with depth:"summary" to get the tree as well. |
| flowName* | string | Name (ID) of the flow. |
| environmentName* | string | Name of the Power Platform environment. |
| includeTriggerUrl | boolean | Also return the HTTP trigger URL. It is a credential: anyone holding it can run the flow. |
{
"type": "object",
"required": [
"environmentName",
"flowName"
],
"properties": {
"depth": {
"enum": [
"summary",
"full"
],
"type": "string",
"description": "full (default): the whole definition. summary: the action tree — name, type, operation, runAfter, nesting — with no inputs. Use summary on a large flow, then ask for the actions you need."
},
"actions": {
"type": "array",
"items": {
"type": "string"
},
"description": "Return only these actions, found at any nesting depth and each reported with the scopes it sits in, plus triggers. Combine with depth:\"summary\" to get the tree as well."
},
"flowName": {
"type": "string",
"description": "Name (ID) of the flow."
},
"environmentName": {
"type": "string",
"description": "Name of the Power Platform environment."
},
"includeTriggerUrl": {
"type": "boolean",
"description": "Also return the HTTP trigger URL. It is a credential: anyone holding it can run the flow."
}
}
}Read the recorded inputs and outputs of actions in one flow run. Without actionName: the top-level actions (optionally filtered by name). With actionName: every execution of that action across foreach iterations, each with repetitionIndexes, status, error, and resolved inputs/outputs. Use iterationIndex to pin one iteration; omit it for all. TRIGGER PAYLOADS: set trigger=true with a runName to get that run's trigger inputs and outputs. No Compose workaround is needed. TRIGGER CHECKS: pass checkId (from get_live_flow_runs -> triggerChecks.recent[].checkId) to read a trigger evaluation that never became a run — that is how you see WHY a trigger is failing. Do not supply runName with a checkId.
| Argument | Type | Description |
|---|---|---|
| top | number | Max actions or repetitions to return. Paginates automatically. Omit for all. |
| checkId | string | Trigger check id (checkId from get_live_flow_runs -> triggerChecks). Returns that check's inputs/outputs, including the failure reason. Not a run id — the two are different, which is why a check id returns WorkflowRunNotFound from the run tools. |
| runName | string | Run identifier (name field from get_live_flow_runs), or "latest" for the most recent run. Required unless checkId is given. |
| trigger | boolean | Return the RUN's trigger inputs/outputs instead of its actions. Requires runName. |
| flowName* | string | Name (ID) of the flow. |
Fetch error details for a specific flow run from the live Power Automate API. Lists every failed action with its error code and message to help diagnose what went wrong.
| Argument | Type | Description |
|---|---|---|
| top | number | Max actions to return. Paginates automatically. Omit for all. |
| runName* | string | Run identifier (name field from get_live_flow_runs), or "latest" for the most recent run. |
| flowName* | string | Name (ID) of the flow. |
| environmentName* | string | Name of the Power Platform environment. |
{
"type": "object",
"required": [
"environmentName",
"flowName",
"runName"
],
"properties": {
"top": {
"type": "number",
"description": "Max actions to return. Paginates automatically. Omit for all."
},
"runName": {
"type": "string",
"description": "Run identifier (name field from get_live_flow_runs), or \"latest\" for the most recent run."
},
"flowName": {
"type": "string",
"description": "Name (ID) of the flow."
},
"environmentName": {
"type": "string",
"description": "Name of the Power Platform environment."
}
}
}Fetch run history for a flow directly from Power Automate. Returns { runs, runCount, triggerChecks }: each run has name, status, startTime, endTime, trigger name/code, and any top-level error. IMPORTANT — no runs does NOT mean the flow is healthy. A trigger that fires and evaluates to nothing, or fails to evaluate, records a TRIGGER CHECK and never becomes a run. When there are no runs (or when includeTriggerChecks is set) this tool also reports the trigger check history, so "nothing ran" can be told apart from "the trigger has been failing". Read triggerChecks.byStatus before concluding a flow is fine.
| Argument | Type | Description |
|---|---|---|
| top | number | Max runs to return. Paginates automatically. Default 30. |
| status | string | Only runs with this status, e.g. Failed. |
| flowName* | string | Name (ID) of the flow. |
| startedAfter | string | ISO date-time. Only runs and checks that started at or after it. |
| startedBefore | string | ISO date-time. Only runs and checks that started before it. |
| environmentName* | string | Name of the Power Platform environment. |
| triggerCheckStatus |
[Requires Pro+ plan] Get full details for a single Power Automate flow from the Power Clarity cache. Includes trigger URL, owners, state, run statistics, and governance metadata. Data is from the stored snapshot — not live from the Power Automate API.
| Argument | Type | Description |
|---|---|---|
| flowName* | string | Name (ID) of the flow. |
| environmentName* | string | Name of the Power Platform environment. |
{
"type": "object",
"required": [
"environmentName",
"flowName"
],
"properties": {
"flowName": {
"type": "string",
"description": "Name (ID) of the flow."
},
"environmentName": {
"type": "string",
"description": "Name of the Power Platform environment."
}
}
}[Requires Pro+ plan] Get cached run history for a flow from the Power Clarity store. Defaults to the last 7 days. Returns startTime, endTime, status, duration (seconds), failedActions, and remediation hint per run. Data is from the stored snapshot — not live from the Power Automate API.
| Argument | Type | Description |
|---|---|---|
| top | number | Maximum number of run rows to return (default 5000). |
| status | array | Filter by status. Only the first value is used in the OData filter. |
| endTime | string | ISO 8601 end of the time window. |
| flowName* | string | Name (ID) of the flow. |
| startTime | string | ISO 8601 start of the time window (default: 7 days ago). |
| environmentName* | string | Name of the Power Platform environment. |
{
"type": "object",
"required": [
"environmentName",
"flowName"
],
"properties": {
"top": {
"type": "number",
"description": "Maximum number of run rows to return (default 5000)."
},
"status": {
"type": "array",
"items": {
"enum": [
"Running",
"Succeeded",
"Failed",
"Cancelled"
],
"type": "string"
},
"description": "Filter by status. Only the first value is used in the OData filter."
},
"endTime": {
"type": "string",
"description": "ISO 8601 end of the time window."
},
"flowName": {
"type": "string",
"description": "Name (ID) of the flow."
},
"startTime": {
"type": "string",
"description": "ISO 8601 start of the time window (default: 7 days ago)."
},
"environmentName": {
"type": "string",
"description": "Name of the Power Platform environment."
}
}
}[Requires Pro+ plan] Get aggregated run statistics for a flow from the Power Clarity cache: total runs, success count, failure count, success rate, fail rate, and average/max duration over a time window. Data is from the stored snapshot — not live from the Power Automate API.
| Argument | Type | Description |
|---|---|---|
| endTime | string | ISO 8601 end of the time window. |
| flowName* | string | Name (ID) of the flow. |
| startTime | string | ISO 8601 start of the time window (default: 7 days ago). |
| environmentName* | string | Name of the Power Platform environment. |
{
"type": "object",
"required": [
"environmentName",
"flowName"
],
"properties": {
"endTime": {
"type": "string",
"description": "ISO 8601 end of the time window."
},
"flowName": {
"type": "string",
"description": "Name (ID) of the flow."
},
"startTime": {
"type": "string",
"description": "ISO 8601 start of the time window (default: 7 days ago)."
},
"environmentName": {
"type": "string",
"description": "Name of the Power Platform environment."
}
}
}[Requires Pro+ plan] Get details for a single maker from the Power Clarity cache by their key (usually the AAD object ID). Includes flow/app counts and whether the account has been deleted.
| Argument | Type | Description |
|---|---|---|
| makerKey* | string | Maker RowKey (AAD object ID of the user). |
{
"type": "object",
"required": [
"makerKey"
],
"properties": {
"makerKey": {
"type": "string",
"description": "Maker RowKey (AAD object ID of the user)."
}
}
}List Power Platform connections in an environment directly from Power Automate. Returns id, displayName, connectorName, environment, createdBy (full object), authenticatedUser, statuses, overallStatus, createdTime, expirationTime, and connectionParameters for each connection. Pass search=<term> to narrow the list and receive a paste-ready connectionReferenceTemplate plus action-side hostTemplate per connection — drop these into update_live_flow's connectionReferences and inputs.host without further edits.
| Argument | Type | Description |
|---|---|---|
| top | number | Max connections to RETURN, applied after search. Paginates automatically. Omit for all. |
| search | string | Optional case-insensitive substring filter applied to id, displayName, connectorName, and accountName. Adds connectionReferenceTemplate + hostTemplate to each returned connection. |
| environmentName* | string | Required. Name of the Power Platform environment (a GUID, or a name like "Default-<tid>"). Call list_live_environments if you do not have one — the platform cannot list connections across environments. |
{
"type": "object",
"required": [
"environmentName"
],
"properties": {
"top": {
"type": "number",
"description": "Max connections to RETURN, applied after search. Paginates automatically. Omit for all."
},
"search": {
"type": "string",
"description": "Optional case-insensitive substring filter applied to id, displayName, connectorName, and accountName. Adds connectionReferenceTemplate + hostTemplate to each returned connection."
},
"environmentName": {
"type": "string",
"description": "Required. Name of the Power Platform environment (a GUID, or a name like \"Default-<tid>\"). Call list_live_environments if you do not have one — the platform cannot list connections across environments."
}
}
}List all Power Platform environments you belong to, directly from Power Automate. Returns id, displayName, sku, location, and state for each environment. mode=all (default) and mode=member: every environment you are a member of. mode=admin: only those you administer; errors rather than guessing if admin access cannot be determined. isAdmin means you hold the ListAnyFlow permission there — the capability list_live_flows mode=admin needs. It is null, never false, when the platform did not tell us. isMember is true for every environment returned.
| Argument | Type | Description |
|---|---|---|
| top | number | Max environments to return. Paginates automatically. Omit for all. |
| mode | string | all (default) and member: every environment you belong to. admin: only those where you hold ListAnyFlow; errors rather than returning a shorter list if admin access cannot be determined. |
{
"type": "object",
"properties": {
"top": {
"type": "number",
"description": "Max environments to return. Paginates automatically. Omit for all."
},
"mode": {
"enum": [
"all",
"member",
"admin"
],
"type": "string",
"description": "all (default) and member: every environment you belong to. admin: only those where you hold ListAnyFlow; errors rather than returning a shorter list if admin access cannot be determined."
}
}
}List Power Automate flows in an environment. Returns id, displayName, state, triggerType, and lastModifiedTime for each flow. mode=owner (default): flows you own plus flows shared with you (personal + team), with full definitions. mode=admin: all flows in the environment (requires an admin account). mode=admin with includeDeleted=true also returns soft-deleted flows (state=Deleted) — the only way to find a deleted flow. If search is provided, results are filtered to flows whose displayName contains the search text. For large environments pagination is time-bounded — if nextLink is returned, pass it as continuationUrl to retrieve the next batch.
| Argument | Type | Description |
|---|---|---|
| top | number | Max flows to return. Paginates automatically. Omit for all. |
| mode | string | owner (default): user-scoped — owned + shared-with-me flows (personal + team), with full definitions. admin: admin-scoped endpoint, all flows. |
| search | string | Optional case-insensitive filter applied to flow displayName. |
| includeDeleted | boolean | Include soft-deleted flows, which come back with state=Deleted and can be restored with restore_live_flow. Requires mode=admin — the user-scoped listing never returns deleted flows. Off by default. |
| timeoutSeconds | number | Stop collecting pages after this many seconds and return a nextLink for the next batch. Default 25. Max 55. |
Skill bundles: groups of the tools listed here that are used together for one task (diagnose-connection-references, build-flow, debug-flow, monitor-flow, discover, governance). Returns each bundle's name and one-line description. Use it when unsure which tools fit a request; tool_search "skill:<name>" returns the bundle's full guidance and definitions. Non-billable.
No arguments.
{
"type": "object",
"properties": {}
}[Requires Pro+ plan] List all Power Platform connections from the Power Clarity cache.
No arguments.
{
"type": "object",
"properties": {}
}[Requires Pro+ plan] List all Power Platform environments from the Power Clarity cache.
No arguments.
{
"type": "object",
"properties": {}
}[Requires Pro+ plan] List Power Automate flows from the Power Clarity cache. Optionally filter by governance flags (monitor, notification rules). Returns key fields including trigger URL, state, and run failure rate. Data is from the stored snapshot — not live from the Power Automate API.
| Argument | Type | Description |
|---|---|---|
| monitor | boolean | If set, only return flows where monitor equals this value. |
| rule_notify_onfail | boolean | If set, filter flows by whether on-fail notifications are enabled. |
| rule_notify_onmissingdays | boolean | If set, filter flows by whether missing-days notifications are enabled. |
{
"type": "object",
"properties": {
"monitor": {
"type": "boolean",
"description": "If set, only return flows where monitor equals this value."
},
"rule_notify_onfail": {
"type": "boolean",
"description": "If set, filter flows by whether on-fail notifications are enabled."
},
"rule_notify_onmissingdays": {
"type": "boolean",
"description": "If set, filter flows by whether missing-days notifications are enabled."
}
}
}[Requires Pro+ plan] List all makers (citizen developers / AAD users) from the Power Clarity cache.
No arguments.
{
"type": "object",
"properties": {}
}[Requires Pro+ plan] List all Power Apps canvas apps from the Power Clarity cache.
No arguments.
{
"type": "object",
"properties": {}
}Report a Flow Studio MCP bug or missing capability, append text evidence, or check your reports. Free and available even after quota is reached. Do not include passwords, access tokens, secrets, or full flow definitions unless necessary.
| Argument | Type | Description |
|---|---|---|
| chunk | integer | Optional. Omit to append the next chunk automatically. |
| action* | string | |
| notify | boolean | |
| ticket | string | |
| content | string | Text attachment body. Max 64 KB per call. |
| details | string | |
| summary | string | |
| category | string | |
| severity | string | |
| file_name | string | |
| flow_name | string |
Resolve a connector action's inputs the way the flow designer does: dropdown options, list and table columns, folder and file pickers — every input in one call, or one with parameterName. Reads only: it runs the lookups the designer runs, never an action. Pass values you have in parameters; pass a display name in match to get back the value to write into the flow. An input whose parent is not known yet has status "needs". Inputs inside an object are addressed by key (body/recipient/groupId). Omit connectionName and one is chosen.
| Argument | Type | Description |
|---|---|---|
| top | number | Max options per dropdown (default 200). A longer list is marked truncated. |
| skip | number | Options to skip, to page through a truncated list (use nextSkip). |
| match | object | Exact display name, or the value itself, per input, e.g. { "folderPath": "Inbox" }. Case-insensitive, never fuzzy. Folders also take /path. matchCount 0 answers status "nomatch". |
| browse | object | Open a folder: { "field": "<input>", "id": "<folder value>" }. |
| detail | string | Column detail. Default compact. |
| search | string | Narrow long option or column lists by name (a filter, not a pick). |
| apiName |
Resubmit a failed or cancelled Power Automate flow run via the live PA API, re-using the original trigger payload. Discovers the trigger name from the flow definition automatically — no trigger name parameter needed.
| Argument | Type | Description |
|---|---|---|
| runName* | string | Run identifier (name field from get_live_flow_runs), or "latest" for the most recent run. |
| flowName* | string | Name (ID) of the flow. |
| environmentName* | string | Name of the Power Platform environment. |
{
"type": "object",
"required": [
"environmentName",
"flowName",
"runName"
],
"properties": {
"runName": {
"type": "string",
"description": "Run identifier (name field from get_live_flow_runs), or \"latest\" for the most recent run."
},
"flowName": {
"type": "string",
"description": "Name (ID) of the flow."
},
"environmentName": {
"type": "string",
"description": "Name of the Power Platform environment."
}
}
}Start or stop the flow you name. Reads the current state first and only calls Power Automate if a change is actually needed.
| Argument | Type | Description |
|---|---|---|
| state* | string | Desired state for the flow. |
| flowName* | string | Name (ID) of the flow. |
| environmentName* | string | Name of the Power Platform environment. |
{
"type": "object",
"required": [
"environmentName",
"flowName",
"state"
],
"properties": {
"state": {
"enum": [
"Started",
"Stopped"
],
"type": "string",
"description": "Desired state for the flow."
},
"flowName": {
"type": "string",
"description": "Name (ID) of the flow."
},
"environmentName": {
"type": "string",
"description": "Name of the Power Platform environment."
}
}
}Test a connection, or run one operation on it. Without operationId it runs the connector's own connection test. With operationId it runs that operation and returns the raw reply: a GET operation, or a lookup the connector itself declares for a dropdown, list, schema or folder picker. Anything else is refused before a call is made. connectionName comes from list_live_connections; operation ids from describe_live_connector.
| Argument | Type | Description |
|---|---|---|
| parameters | object | The operation's inputs by name (path, query, header or body). |
| operationId | string | Omit to run the connector's own connection test. |
| connectorName* | string | Connector name, e.g. shared_sharepointonline. |
| connectionName* | string | The connection, from list_live_connections. |
| continuationUrl | string | The nextLink from the previous reply, to fetch the next page. |
| environmentName* | string | Name of the Power Platform environment. |
{
"type": "object",
"required": [
"environmentName",
"connectorName",
"connectionName"
],
"properties": {
"parameters": {
"type": "object",
"description": "The operation's inputs by name (path, query, header or body)."
},
"operationId": {
"type": "string",
"description": "Omit to run the connector's own connection test."
},
"connectorName": {
"type": "string",
"description": "Connector name, e.g. shared_sharepointonline."
},
"connectionName": {
"type": "string",
"description": "The connection, from list_live_connections."
},
"continuationUrl": {
"type": "string",
"description": "The nextLink from the previous reply, to fetch the next page."
},
"environmentName": {
"type": "string",
"description": "Name of the Power Platform environment."
}
}
}Find a tool listed here instead of guessing its name, and get its definition. Query forms: (1) "skill:<name>" — a whole bundle; call list_skills for the names; (2) "select:name1,name2" — exact tools; (3) free text like "cancel run" — ranked against name and description. Non-billable.
| Argument | Type | Description |
|---|---|---|
| query* | string | Search query. Forms: "select:name1,name2", "skill:<name>", or free-text keywords. |
| max_results | integer | Max tools to return for keyword queries (default 5). Ignored for select: and skill: queries. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"description": "Search query. Forms: \"select:name1,name2\", \"skill:<name>\", or free-text keywords."
},
"max_results": {
"type": "integer",
"default": 5,
"description": "Max tools to return for keyword queries (default 5). Ignored for select: and skill: queries."
}
}
}Run a flow on demand — the same as the maker portal's "Run flow" button. Works with Request triggers (HTTP request, manual Button, PowerApps) and with scheduled RECURRENCE flows, which run immediately; a scheduled flow takes no inputs, so passing `body` to one is refused. Pass trigger inputs as `body`. Automated connector triggers only fire from their source event.
| Argument | Type | Description |
|---|---|---|
| body | object | JSON body to POST to the trigger URL. Omit for flows that expect an empty body. |
| flowName* | string | Name (ID) of the flow. |
| connections | object | Only for a flow whose connections are provided by whoever runs it. Map of connection-reference name to the connection id to run it with, e.g. {"shared_office365users":"shared-office365user-…"}. Omit unless the result told you the connection picked was wrong; ids come from list_live_connections. |
| environmentName* | string | Name of the Power Platform environment. |
{
"type": "object",
"required": [
"environmentName",
"flowName"
],
"properties": {
"body": {
"type": "object",
"description": "JSON body to POST to the trigger URL. Omit for flows that expect an empty body."
},
"flowName": {
"type": "string",
"description": "Name (ID) of the flow."
},
"connections": {
"type": "object",
"description": "Only for a flow whose connections are provided by whoever runs it. Map of connection-reference name to the connection id to run it with, e.g. {\"shared_office365users\":\"shared-office365user-…\"}. Omit unless the result told you the connection picked was wrong; ids come from list_live_connections."
},
"environmentName": {
"type": "string",
"description": "Name of the Power Platform environment."
}
}
}Update or create a flow. Use `dryRun: true` to preview any change without writing. Omit flowName to create: definition and displayName are required. Give flowName to update: displayName and/or definition and/or connectionReferences. SURGICAL EDIT: pass `operations` — an ordered list of set/add/remove/merge ops on array-of-keys paths — to change one action or parameter without resending the whole definition. Provide EITHER operations OR definition; connectionReferences may accompany either and lands in the same save. WHOLE definition: call get_live_flow, mutate properties.definition, pass it here. RENAME: pass displayName alone. Power Automate rejects a PATCH carrying no flow content, so this re-saves the unchanged definition — the maker portal does the same. definition.description is required, and must be brief — we append " #flowstudio-mcp" to it.
| Argument | Type | Description |
|---|---|---|
| dryRun | boolean | Preview only, on BOTH paths: with flowName, apply the change to the live definition and return the result + what changed; without flowName, return the flow that WOULD be created. Nothing is written either way. |
| flowName | string | Name (ID) of the flow to update. Omit or leave blank to create a new flow. |
| definition | object | Full flow definition as a JSON object (triggers + actions + parameters + outputs + description). MUST be a JSON object — strings are rejected. Do not JSON.stringify the definition; pass the parsed object directly. Required when creating. For updates, obtain from get_live_flow (properties.definition), modify it, then pass the modified object here. definition.description is required (a short note about what changed); when updating, if you omit it we reuse the flow's existing description. |
[Requires Pro+ plan] Update governance/metadata fields on a flow record in the Power Clarity store (description, business impact, owner team, tags, monitor flag, notification settings, etc.). Only fields provided are updated (merge semantics). Writes to the cache — does not call the Power Automate API.
| Argument | Type | Description |
|---|---|---|
| tags | string | |
| tier | string | |
| monitor | boolean | Enable/disable monitoring for this flow. |
| critical | boolean | |
| flowName* | string | Name (ID) of the flow. |
| security | string | |
| ownerTeam | string | |
| description | string | |
| supportEmail | string | |
| supportGroup | string | |
| businessValue |
| operationId | string | Optional operation ID to describe with expanded inputs and outputs. |
| connectorName | string | Connector logical name, for example shared_teams. Either connectorName/apiName is required, unless search is provided for cross-connector operation search. |
| environmentName* | string | Name of the Power Platform environment. |
{
"type": "object",
"required": [
"environmentName"
],
"properties": {
"top": {
"type": "number",
"description": "Max operations to return in connector summary mode, or max top search results to show in cross-connector search. Default 250 for summary, 10 for search display."
},
"type": {
"enum": [
"Action",
"Trigger"
],
"type": "string",
"description": "Operation usage to include in summary mode. Default Action."
},
"depth": {
"enum": [
"summary",
"full"
],
"type": "string",
"description": "summary (default): compact operation catalog. full: raw OpenAPI metadata."
},
"search": {
"type": "string",
"description": "Optional operation search text. With connectorName, filters that connector summary. Without connectorName, searches operations across connectors."
},
"apiName": {
"type": "string",
"description": "Alias for connectorName."
},
"variant": {
"type": "string",
"description": "When an operation has multiple authored variants (e.g. shared_teams/PostMessageToConversation has channel/groupchat/flowbot_chat), pass a specific variantKey to get that variant's hint and exampleDefinition. Omit to receive a hint listing the available variants."
},
"operationId": {
"type": "string",
"description": "Optional operation ID to describe with expanded inputs and outputs."
},
"connectorName": {
"type": "string",
"description": "Connector logical name, for example shared_teams. Either connectorName/apiName is required, unless search is provided for cross-connector operation search."
},
"environmentName": {
"type": "string",
"description": "Name of the Power Platform environment."
}
}
}| actionName | string | Action name. Without iterationIndex: returns all repetitions of this action across every foreach iteration. With iterationIndex: returns the single repetition matching that iteration. Omit entirely for top-level action list. |
| iterationIndex | number | Zero-based foreach iteration index. Matched against the innermost repetitionIndexes[].itemIndex in the PA repetition record. Only meaningful when actionName is also set. |
| environmentName* | string | Name of the Power Platform environment. |
{
"type": "object",
"required": [
"environmentName",
"flowName"
],
"properties": {
"top": {
"type": "number",
"description": "Max actions or repetitions to return. Paginates automatically. Omit for all."
},
"checkId": {
"type": "string",
"description": "Trigger check id (checkId from get_live_flow_runs -> triggerChecks). Returns that check's inputs/outputs, including the failure reason. Not a run id — the two are different, which is why a check id returns WorkflowRunNotFound from the run tools."
},
"runName": {
"type": "string",
"description": "Run identifier (name field from get_live_flow_runs), or \"latest\" for the most recent run. Required unless checkId is given."
},
"trigger": {
"type": "boolean",
"description": "Return the RUN's trigger inputs/outputs instead of its actions. Requires runName."
},
"flowName": {
"type": "string",
"description": "Name (ID) of the flow."
},
"actionName": {
"type": "string",
"description": "Action name. Without iterationIndex: returns all repetitions of this action across every foreach iteration. With iterationIndex: returns the single repetition matching that iteration. Omit entirely for top-level action list."
},
"iterationIndex": {
"type": "number",
"description": "Zero-based foreach iteration index. Matched against the innermost repetitionIndexes[].itemIndex in the PA repetition record. Only meaningful when actionName is also set."
},
"environmentName": {
"type": "string",
"description": "Name of the Power Platform environment."
}
}
}| string |
| Only trigger checks with this status; reads the checks. |
| includeTriggerChecks | boolean | Also report trigger check history when runs DO exist. Checks are always reported when there are no runs. Costs two extra API calls. |
{
"type": "object",
"required": [
"environmentName",
"flowName"
],
"properties": {
"top": {
"type": "number",
"description": "Max runs to return. Paginates automatically. Default 30."
},
"status": {
"enum": [
"Succeeded",
"Failed",
"Cancelled",
"Running"
],
"type": "string",
"description": "Only runs with this status, e.g. Failed."
},
"flowName": {
"type": "string",
"description": "Name (ID) of the flow."
},
"startedAfter": {
"type": "string",
"description": "ISO date-time. Only runs and checks that started at or after it."
},
"startedBefore": {
"type": "string",
"description": "ISO date-time. Only runs and checks that started before it."
},
"environmentName": {
"type": "string",
"description": "Name of the Power Platform environment."
},
"triggerCheckStatus": {
"enum": [
"Succeeded",
"Failed",
"Skipped"
],
"type": "string",
"description": "Only trigger checks with this status; reads the checks."
},
"includeTriggerChecks": {
"type": "boolean",
"description": "Also report trigger check history when runs DO exist. Checks are always reported when there are no runs. Costs two extra API calls."
}
}
}| continuationUrl |
| string |
| nextLink value returned by a previous call. Pass to resume pagination from where the last call stopped. Must match the same mode as the original call. |
| environmentName* | string | Name of the Power Platform environment. |
{
"type": "object",
"required": [
"environmentName"
],
"properties": {
"top": {
"type": "number",
"description": "Max flows to return. Paginates automatically. Omit for all."
},
"mode": {
"enum": [
"owner",
"admin"
],
"type": "string",
"description": "owner (default): user-scoped — owned + shared-with-me flows (personal + team), with full definitions. admin: admin-scoped endpoint, all flows."
},
"search": {
"type": "string",
"description": "Optional case-insensitive filter applied to flow displayName."
},
"includeDeleted": {
"type": "boolean",
"description": "Include soft-deleted flows, which come back with state=Deleted and can be restored with restore_live_flow. Requires mode=admin — the user-scoped listing never returns deleted flows. Off by default."
},
"timeoutSeconds": {
"type": "number",
"description": "Stop collecting pages after this many seconds and return a nextLink for the next batch. Default 25. Max 55."
},
"continuationUrl": {
"type": "string",
"description": "nextLink value returned by a previous call. Pass to resume pagination from where the last call stopped. Must match the same mode as the original call."
},
"environmentName": {
"type": "string",
"description": "Name of the Power Platform environment."
}
}
}| tool_name | string |
| final_chunk | boolean |
| content_type | string | Media type of the attachment. text/plain (default), text/csv, text/markdown, application/json, application/har+json, application/xml, image/png, image/jpeg, image/gif, image/webp, application/pdf. |
| contact_email | string |
| content_base64 | string | Binary attachment body, base64-encoded. Max 256 KB decoded per call. Use for images/PDF; pass text through `content` instead. Do not send both. |
| environment_name | string |
| include_diagnostics | boolean |
{
"type": "object",
"required": [
"action"
],
"properties": {
"chunk": {
"type": "integer",
"minimum": 0,
"description": "Optional. Omit to append the next chunk automatically."
},
"action": {
"enum": [
"report",
"append",
"status",
"list"
],
"type": "string"
},
"notify": {
"type": "boolean",
"default": true
},
"ticket": {
"type": "string"
},
"content": {
"type": "string",
"description": "Text attachment body. Max 64 KB per call."
},
"details": {
"type": "string",
"maxLength": 100000
},
"summary": {
"type": "string",
"maxLength": 200
},
"category": {
"enum": [
"wrong-result",
"error",
"missing-capability",
"docs-or-hints",
"performance",
"other"
],
"type": "string",
"default": "other"
},
"severity": {
"enum": [
"blocker",
"major",
"minor"
],
"type": "string",
"default": "major"
},
"file_name": {
"type": "string"
},
"flow_name": {
"type": "string"
},
"tool_name": {
"type": "string"
},
"final_chunk": {
"type": "boolean"
},
"content_type": {
"type": "string",
"description": "Media type of the attachment. text/plain (default), text/csv, text/markdown, application/json, application/har+json, application/xml, image/png, image/jpeg, image/gif, image/webp, application/pdf."
},
"contact_email": {
"type": "string"
},
"content_base64": {
"type": "string",
"description": "Binary attachment body, base64-encoded. Max 256 KB decoded per call. Use for images/PDF; pass text through `content` instead. Do not send both."
},
"environment_name": {
"type": "string"
},
"include_diagnostics": {
"type": "boolean",
"default": true
}
}
}| string |
| Alias for connectorName. |
| include | array | Add "outputs" to get the fields this action returns. |
| flowName | string | With actionName: take the connector, operation and connection from this flow action. |
| actionName | string | Action (or trigger) name in flowName. |
| parameters | object | Values already chosen, e.g. { "dataset": "<site url>" }. |
| operationId | string | Operation ID, e.g. PostItem. Not needed with flowName + actionName. |
| connectorName | string | Connector name, e.g. shared_sharepointonline. |
| parameterName | string | Resolve only this input. Omit for every input. |
| connectionName | string | Connection to run as. Omit to have one chosen. |
| environmentName* | string | Name of the Power Platform environment. |
{
"type": "object",
"required": [
"environmentName"
],
"properties": {
"top": {
"type": "number",
"description": "Max options per dropdown (default 200). A longer list is marked truncated."
},
"skip": {
"type": "number",
"description": "Options to skip, to page through a truncated list (use nextSkip)."
},
"match": {
"type": "object",
"description": "Exact display name, or the value itself, per input, e.g. { \"folderPath\": \"Inbox\" }. Case-insensitive, never fuzzy. Folders also take /path. matchCount 0 answers status \"nomatch\"."
},
"browse": {
"type": "object",
"description": "Open a folder: { \"field\": \"<input>\", \"id\": \"<folder value>\" }."
},
"detail": {
"enum": [
"compact",
"full"
],
"type": "string",
"description": "Column detail. Default compact."
},
"search": {
"type": "string",
"description": "Narrow long option or column lists by name (a filter, not a pick)."
},
"apiName": {
"type": "string",
"description": "Alias for connectorName."
},
"include": {
"type": "array",
"items": {
"enum": [
"outputs"
],
"type": "string"
},
"description": "Add \"outputs\" to get the fields this action returns."
},
"flowName": {
"type": "string",
"description": "With actionName: take the connector, operation and connection from this flow action."
},
"actionName": {
"type": "string",
"description": "Action (or trigger) name in flowName."
},
"parameters": {
"type": "object",
"description": "Values already chosen, e.g. { \"dataset\": \"<site url>\" }."
},
"operationId": {
"type": "string",
"description": "Operation ID, e.g. PostItem. Not needed with flowName + actionName."
},
"connectorName": {
"type": "string",
"description": "Connector name, e.g. shared_sharepointonline."
},
"parameterName": {
"type": "string",
"description": "Resolve only this input. Omit for every input."
},
"connectionName": {
"type": "string",
"description": "Connection to run as. Omit to have one chosen."
},
"environmentName": {
"type": "string",
"description": "Name of the Power Platform environment."
}
}
}| operations |
| array |
| SURGICAL EDIT of an existing flow (requires flowName; do not combine with definition). An ordered list applied to the LIVE definition. Each item = { op, path, value? }. path is an ARRAY of literal keys, e.g. ["actions","Send_Email","inputs","parameters","subject"] (each element is one key; a "/" inside an element is literal, so it addresses SharePoint/Dataverse columns like ["actions","Update_Item","inputs","parameters","item/Title"]). ops: set (create/overwrite), add (new key — errors if it already exists), remove (delete key — no-op if absent), merge (deep-merge an object value, keeping sibling keys). |
| displayName | string | Display name for the flow. Required when creating. |
| environmentName* | string | Name of the Power Platform environment. |
| connectionReferences | object | Connection references map copied from get_live_flow. Direct-flow entries use { connectionName, id }. Solution-aware entries also include { connectionReferenceLogicalName, source } and must retain those fields exactly. A freshly migrated entry may instead be keyed by the physical connection name and carry no connectionName field at all — copy it back as-is. The action/trigger inputs.host.connectionName must match the map key; the physical connectionName stays inside the entry. Never invent a solution logical name. Adding a connectionReferenceLogicalName to an entry that lacks one does not always take: the save can return success without storing it, so re-read with get_live_flow to confirm. MAY BE PASSED ALONGSIDE operations: your entries are merged over the stored map and saved in the SAME request as the edit. That is how you add the first action for a connector the flow does not use yet — a reference saved on its own does not stick, because Power Automate prunes an entry no action references. Your entries win on a key collision. |
| expectedLastModifiedTime | string | With a whole definition: refuse if the flow changed since you read it. Pass get_live_flow's lastModifiedTime. |
{
"type": "object",
"required": [
"environmentName"
],
"properties": {
"dryRun": {
"type": "boolean",
"description": "Preview only, on BOTH paths: with flowName, apply the change to the live definition and return the result + what changed; without flowName, return the flow that WOULD be created. Nothing is written either way."
},
"flowName": {
"type": "string",
"description": "Name (ID) of the flow to update. Omit or leave blank to create a new flow."
},
"definition": {
"type": "object",
"description": "Full flow definition as a JSON object (triggers + actions + parameters + outputs + description). MUST be a JSON object — strings are rejected. Do not JSON.stringify the definition; pass the parsed object directly. Required when creating. For updates, obtain from get_live_flow (properties.definition), modify it, then pass the modified object here. definition.description is required (a short note about what changed); when updating, if you omit it we reuse the flow's existing description."
},
"operations": {
"type": "array",
"items": {
"type": "object",
"required": [
"op",
"path"
],
"properties": {
"op": {
"enum": [
"set",
"add",
"remove",
"merge"
],
"type": "string",
"description": "Edit verb."
},
"path": {
"type": "array",
"items": {
"type": "string"
},
"description": "Array of literal keys, one per level, e.g. [\"actions\",\"Compose\",\"inputs\"]. A \"/\" inside an element is a literal character, so SharePoint/Dataverse column params (flat keys like \"item/Title\") are addressable: [\"actions\",\"Update_Item\",\"inputs\",\"parameters\",\"item/Title\"]. Do NOT pass a slash-delimited string — it cannot distinguish a literal \"/\" from a separator."
},
"value": {
"description": "New value (required for set/add/merge; merge requires an object)."
}
}
},
"description": "SURGICAL EDIT of an existing flow (requires flowName; do not combine with definition). An ordered list applied to the LIVE definition. Each item = { op, path, value? }. path is an ARRAY of literal keys, e.g. [\"actions\",\"Send_Email\",\"inputs\",\"parameters\",\"subject\"] (each element is one key; a \"/\" inside an element is literal, so it addresses SharePoint/Dataverse columns like [\"actions\",\"Update_Item\",\"inputs\",\"parameters\",\"item/Title\"]). ops: set (create/overwrite), add (new key — errors if it already exists), remove (delete key — no-op if absent), merge (deep-merge an object value, keeping sibling keys)."
},
"displayName": {
"type": "string",
"description": "Display name for the flow. Required when creating."
},
"environmentName": {
"type": "string",
"description": "Name of the Power Platform environment."
},
"connectionReferences": {
"type": "object",
"description": "Connection references map copied from get_live_flow. Direct-flow entries use { connectionName, id }. Solution-aware entries also include { connectionReferenceLogicalName, source } and must retain those fields exactly. A freshly migrated entry may instead be keyed by the physical connection name and carry no connectionName field at all — copy it back as-is. The action/trigger inputs.host.connectionName must match the map key; the physical connectionName stays inside the entry. Never invent a solution logical name. Adding a connectionReferenceLogicalName to an entry that lacks one does not always take: the save can return success without storing it, so re-read with get_live_flow to confirm. MAY BE PASSED ALONGSIDE operations: your entries are merged over the stored map and saved in the SAME request as the edit. That is how you add the first action for a connector the flow does not use yet — a reference saved on its own does not stick, because Power Automate prunes an entry no action references. Your entries win on a key collision."
},
"expectedLastModifiedTime": {
"type": "string",
"description": "With a whole definition: refuse if the flow changed since you read it. Pass get_live_flow's lastModifiedTime."
}
}
}| string |
| businessImpact | string |
| environmentName* | string | Name of the Power Platform environment. |
| ownerBusinessUnit | string |
| rule_notify_email | string | Comma-separated email addresses for notifications. |
| rule_notify_onfail | boolean | Send notification when the flow fails. |
| businessJustification | string |
| rule_notify_onmissingdays | number | Send notification when flow has not run for this many days (0 = disabled). |
{
"type": "object",
"required": [
"environmentName",
"flowName"
],
"properties": {
"tags": {
"type": "string"
},
"tier": {
"type": "string"
},
"monitor": {
"type": "boolean",
"description": "Enable/disable monitoring for this flow."
},
"critical": {
"type": "boolean"
},
"flowName": {
"type": "string",
"description": "Name (ID) of the flow."
},
"security": {
"type": "string"
},
"ownerTeam": {
"type": "string"
},
"description": {
"type": "string"
},
"supportEmail": {
"type": "string"
},
"supportGroup": {
"type": "string"
},
"businessValue": {
"type": "string"
},
"businessImpact": {
"type": "string"
},
"environmentName": {
"type": "string",
"description": "Name of the Power Platform environment."
},
"ownerBusinessUnit": {
"type": "string"
},
"rule_notify_email": {
"type": "string",
"description": "Comma-separated email addresses for notifications."
},
"rule_notify_onfail": {
"type": "boolean",
"description": "Send notification when the flow fails."
},
"businessJustification": {
"type": "string"
},
"rule_notify_onmissingdays": {
"type": "number",
"description": "Send notification when flow has not run for this many days (0 = disabled)."
}
}
}