* feat(flowstudio): align Power Automate skills with MCP server v1.1.6 Foundation skill (flowstudio-power-automate-mcp) rewritten to use the server's new tool_search and list_skills meta-tools (v1.1.5+) for discovery instead of cataloging every tool by hand. Cut from 519 to 295 lines. New "Which Skill to Use When" intent-keyed decision tree points at the four specialized skills. Build/debug/governance/monitoring updated for use-case framing. Tools that genuinely cross tiers (e.g. debug skill borrowing get_store_flow_summary) are correct when the workflow needs them — the split between skills is by use-case intent, not by tool partition. Build skill: new Step 3a Resolving Dynamic Connector Values covers get_live_dynamic_options outer-parameter auto-bridge (v1.1.6+) and the AadGraph user-picker fallback via shared_office365users.SearchUserV2 (replaces broken builtInOperation:AadGraph.GetUsers). Debug skill: Outlook user-picker failure note pointing at the fallback. Monitoring skill description disambiguates from the server's monitor-flow tool bundle (runtime control of a single flow) — this skill is tenant-wide health analytics over the cached store. All 5 skills validate via npm run skill:validate; line endings LF only; codespell clean; auto-regenerated docs/README.skills.md included. * fix(flowstudio): remove deprecated tool references The v1.1.5 MCP server release marked 5 tools [DEPRECATED] but the previous alignment commit missed them. Replacements per server source: - get_live_flow_http_schema → read trigger.inputs.schema from get_live_flow - get_live_flow_trigger_url → read trigger.metadata.callbackUrl from get_live_flow - get_store_flow_trigger_url → get_store_flow.triggerUrl field - get_store_flow_errors → get_store_flow_runs(status=["Failed"]) - set_store_flow_state → set_live_flow_state Touches build, debug, governance, monitoring SKILL.md and the foundation skill's tool-reference.md. Remaining mentions of the deprecated names are intentional — they live in deprecation notices naming the obsolete wrapper alongside its replacement. * Update FlowStudio Power Automate skills * Cover latest FlowStudio MCP actions * Trim FlowStudio Power Automate skills * Number FlowStudio build workflow steps
19 KiB
FlowStudio MCP — Tool Response Catalog
Response shapes and behavioral notes for the FlowStudio Power Automate MCP server.
For tool names and parameters: Prefer
list_skillsandtool_search. They return focused, up-to-date schemas without loading every MCP tool at once. Usetools/listonly as a low-level fallback when the meta-tools are not available. This document covers what tool schemas do NOT tell you: response shapes and non-obvious behaviors discovered through real usage.
Source of Truth
| Priority | Source | Covers |
|---|---|---|
| 1 | Real API response | Always trust what the server actually returns |
| 2 | list_skills / tool_search |
Tool names, parameter names, types, required flags |
| 3 | This document | Response shapes, behavioral notes, gotchas |
If this document disagrees with
tool_search,tools/list, or real API behavior, the API wins. Update this document accordingly.
Environment & Tenant Discovery
list_live_environments
Response: direct array of environments.
[
{
"id": "Default-26e65220-5561-46ef-9783-ce5f20489241",
"displayName": "FlowStudio (default)",
"sku": "Production",
"location": "australia",
"state": "Enabled",
"isDefault": true,
"isAdmin": true,
"isMember": true,
"createdTime": "2023-08-18T00:41:05Z"
}
]
Use the
idvalue asenvironmentNamein all other tools.
list_store_environments
Same shape as list_live_environments but read from cache (faster).
Connection Discovery
list_live_connections
Response: wrapper object with connections array.
{
"connections": [
{
"id": "shared-office365-9f9d2c8e-55f1-49c9-9f9c-1c45d1fbbdce",
"displayName": "user@contoso.com",
"connectorName": "shared_office365",
"environment": "Default-26e65220-...",
"createdBy": "User Name",
"authenticatedUser": "user@contoso.com",
"overallStatus": "Connected",
"statuses": [{"status": "Connected"}],
"createdTime": "2024-03-12T21:23:55.206815Z",
"connectionReferenceTemplate": {
"connectionName": "shared-office365-9f9d2c8e-55f1-49c9-9f9c-1c45d1fbbdce",
"source": "Invoker",
"id": "/providers/Microsoft.PowerApps/apis/shared_office365"
},
"hostTemplate": {
"connectionName": "shared_office365"
}
}
],
"totalCount": 56,
"error": null
}
Key field:
idis theconnectionNamevalue used inconnectionReferences.Key field:
connectorNamemaps to apiId:"/providers/Microsoft.PowerApps/apis/" + connectorNameFilter by status: prefer
overallStatus == "Connected"when present; otherwise checkstatuses[0].status == "Connected".For build workflows, pass
environmentNameto avoid using a connection from the wrong environment. Omit it only when intentionally inventorying connections across all environments.Pass
search=<connector or account>to narrow output and receiveconnectionReferenceTemplateplushostTemplatevalues that can be copied directly intoupdate_live_flow.
list_store_connections
Same connection data from cache.
Flow Discovery & Listing
list_live_flows
Response: wrapper object with flows array.
{
"mode": "owner",
"flows": [
{
"id": "0757041a-8ef2-cf74-ef06-06881916f371",
"displayName": "My Flow",
"state": "Started",
"triggerType": "Request",
"triggerKind": "Http",
"createdTime": "2023-08-18T01:18:17Z",
"lastModifiedTime": "2023-08-18T12:47:42Z",
"owners": "<aad-object-id>",
"definitionAvailable": true
}
],
"totalCount": 100,
"nextLink": null,
"error": null
}
Access via
result["flows"].idis a plain UUID --- use directly asflowName.
modeindicates the access scope used ("owner"or"admin").Parameters added in newer server versions:
search: filter by display name server-side.mode:ownerfor flows owned by the MCP identity;adminfor all flows visible to an admin account.timeoutSeconds: return partial results withnextLinkinstead of waiting on very large environments.continuationUrl: pass the previousnextLinkto continue the same query.
list_store_flows
Response: direct array (no wrapper).
[
{
"id": "3991358a-f603-e49d-b1ed-a9e4f72e2dcb.0757041a-8ef2-cf74-ef06-06881916f371",
"displayName": "Admin | Sync Template v3 (Solutions)",
"state": "Started",
"triggerType": "OpenApiConnectionWebhook",
"environmentName": "3991358a-f603-e49d-b1ed-a9e4f72e2dcb",
"runPeriodTotal": 100,
"createdTime": "2023-08-18T01:18:17Z",
"lastModifiedTime": "2023-08-18T12:47:42Z"
}
]
idformat:<environmentId>.<flowId>--- split on the first.to extract the flow UUID:flow_id = item["id"].split(".", 1)[1]
get_store_flow
Response: single flow metadata from cache (selected fields).
{
"id": "<environmentId>.<flowId>",
"displayName": "My Flow",
"state": "Started",
"triggerType": "Recurrence",
"runPeriodTotal": 100,
"runPeriodFailRate": 0.1,
"runPeriodSuccessRate": 0.9,
"runPeriodFails": 10,
"runPeriodSuccess": 90,
"runPeriodDurationAverage": 29410.8,
"runPeriodDurationMax": 158900.0,
"runError": "{\"code\": \"EACCES\", ...}",
"description": "Flow description",
"tier": "Premium",
"complexity": "{...}",
"actions": 42,
"connections": ["sharepointonline", "office365"],
"owners": ["user@contoso.com"],
"createdBy": "user@contoso.com"
}
runPeriodDurationAverage/runPeriodDurationMaxare in milliseconds (divide by 1000).runErroris a JSON string --- parse withjson.loads().
Flow Definition (Live API)
get_live_flow
Response: full flow definition from PA API.
{
"name": "<flow-guid>",
"properties": {
"displayName": "My Flow",
"state": "Started",
"definition": {
"triggers": { "..." },
"actions": { "..." },
"parameters": { "..." }
},
"connectionReferences": { "..." }
}
}
update_live_flow
Create mode: Omit flowName --- creates a new flow. definition and displayName required.
Update mode: Provide flowName --- PATCHes existing flow.
Response:
{
"created": false,
"flowKey": "<environmentId>.<flowId>",
"updated": ["definition", "connectionReferences"],
"displayName": "My Flow",
"state": "Started",
"definition": { "...full definition..." },
"error": null
}
erroris always present but may benull. Checkresult.get("error") is not None.On create:
createdis the new flow GUID (string). On update:createdisfalse.Required fields can vary by server version. Use
tool_searchwithselect:update_live_flowbefore creating or patching a flow; if a description is required, include either the new description or the existing one fromget_live_flow.The flow description is part of the workflow definition (
definition.description), not a top-level tool argument in current schemas.
add_live_flow_to_solution
Migrates a non-solution flow into a solution. Returns error if already in a solution.
Use this after creating a Copilot Studio Skills-triggered flow that must be
discoverable as an agent tool. Pass solutionId for the target solution. If the
server supports omitting solutionId, it uses the environment's default solution;
prefer an explicit unmanaged solution for production ALM.
This tool changes solution membership only. It does not validate the trigger schema, publish a Copilot Studio agent, or prove that the flow is callable by the agent.
Connector Operation Discovery
describe_live_connector
Describes a connector/API and its operations. Use it before creating connector actions instead of guessing operation JSON.
Common modes:
| Call shape | Use |
|---|---|
search="send email" without connectorName |
Search operations across connectors |
connectorName="shared_sharepointonline" |
Compact operation catalog for one connector |
operationId="GetItems" |
Expanded schema for one operation |
variant="flowbot_chat" |
Authored example for one operation variant |
The operation detail can include:
hint: authored guidance from the connector hints table.exampleDefinition: copy-ready action/trigger shape when available.- Dynamic metadata with
nextTool=get_live_dynamic_optionsornextTool=get_live_dynamic_properties.
get_live_dynamic_options
Resolves live dropdown/list options for connector parameters. Use this for
IDs selected from lists, such as SharePoint sites/lists, Teams teams/channels,
or other x-ms-dynamic-list / x-ms-dynamic-values parameters.
Pass the dynamicMetadata object returned by describe_live_connector, the
connection id from list_live_connections, and any already-resolved dependent
parameters.
get_live_dynamic_properties
Resolves live schema/field properties for connector parameters. Use this for dynamic field sets such as SharePoint list item columns after the site and list are known.
Useful parameters:
parameters: dependent values, for example{ "dataset": "<site-url>", "table": "<list-id>" }.propertyName: request one field after inspecting the compact response.includeRaw: include raw connector schema only when needed; it can be large.
Run History & Monitoring
get_live_flow_runs
Response: direct array of runs (newest first).
[{
"name": "<run-id>",
"status": "Succeeded|Failed|Running|Cancelled",
"startTime": "2026-02-25T06:13:38Z",
"endTime": "2026-02-25T06:14:02Z",
"triggerName": "Recurrence",
"error": null
}]
topdefaults to 30 and auto-paginates for higher values. Settop: 300for 24-hour coverage on flows running every 5 minutes.Run ID field is
name(notrunName). Use this value as therunNameparameter in other tools.
get_live_flow_run_error
Response: structured error breakdown for a failed run.
{
"runName": "08584296068667933411438594643CU15",
"failedActions": [
{
"actionName": "Apply_to_each_prepare_workers",
"status": "Failed",
"error": {"code": "ActionFailed", "message": "An action failed."},
"code": "ActionFailed",
"startTime": "2026-02-25T06:13:52Z",
"endTime": "2026-02-25T06:15:24Z"
},
{
"actionName": "HTTP_find_AD_User_by_Name",
"status": "Failed",
"code": "NotSpecified",
"startTime": "2026-02-25T06:14:01Z",
"endTime": "2026-02-25T06:14:05Z"
}
],
"allActions": [
{"actionName": "Apply_to_each", "status": "Skipped"},
{"actionName": "Compose_WeekEnd", "status": "Succeeded"},
{"actionName": "HTTP_find_AD_User_by_Name", "status": "Failed"}
]
}
failedActionsis ordered outer-to-inner --- the last entry is the root cause. UsefailedActions[-1]["actionName"]as the starting point for diagnosis.
get_live_flow_run_action_outputs
Response: array of action detail objects.
[
{
"actionName": "Compose_WeekEnd_now",
"status": "Succeeded",
"startTime": "2026-02-25T06:13:52Z",
"endTime": "2026-02-25T06:13:52Z",
"error": null,
"inputs": "Mon, 25 Feb 2026 06:13:52 GMT",
"outputs": "Mon, 25 Feb 2026 06:13:52 GMT"
}
]
actionNameis optional: omit it to return top-level actions in the run. Provide it for a specific action. If that action runs inside a foreach, the tool can return every repetition of that action across iterations; passiterationIndexto pin to one zero-based iteration.Outputs can be very large (50 MB+) for bulk-data actions. Use 120s+ timeout.
Run Control
resubmit_live_flow_run
Response: { flowKey, resubmitted: true, runName, triggerName }
cancel_live_flow_run
Cancels a Running flow run.
Do NOT cancel runs waiting for an adaptive card response --- status
Runningis normal while a Teams card is awaiting user input.
HTTP Trigger Tools
get_live_flow_http_schema
Deprecated. Prefer get_live_flow and inspect the Request trigger's
inputs.schema plus any Response actions directly from the definition.
Response keys:
flowKey - Flow GUID
displayName - Flow display name
triggerName - Trigger action name (e.g. "manual")
triggerType - Trigger type (e.g. "Request")
triggerKind - Trigger kind (e.g. "Http")
requestMethod - HTTP method (e.g. "POST")
relativePath - Relative path configured on the trigger (if any)
requestSchema - JSON schema the trigger expects as POST body
requestHeaders - Headers the trigger expects
responseSchemas - Array of JSON schemas defined on Response action(s)
responseSchemaCount - Number of Response actions that define output schemas
The request body schema is in
requestSchema(nottriggerSchema).
get_live_flow_trigger_url
Deprecated. Prefer trigger_live_flow when you need to invoke an HTTP-triggered
flow; it fetches the current callback URL internally.
Returns the signed callback URL for HTTP-triggered flows. Response includes
flowKey, triggerName, triggerType, triggerKind, triggerMethod, triggerUrl.
trigger_live_flow
Response keys: flowKey, triggerName, triggerUrl, requiresAadAuth, authType,
responseStatus, responseBody.
Only works for
Request(HTTP) triggers. Returns an error for Recurrence and other trigger types:"only HTTP Request triggers can be invoked via this tool".Button-kind triggers returnListCallbackUrlOperationBlocked.
responseStatus+responseBodycontain the flow's Response action output. AAD-authenticated triggers are handled automatically.Content-type note: The body is sent as
application/octet-stream(raw), notapplication/json. Flows with a trigger schema that hasrequiredfields will reject the request withInvalidRequestContent(400) because PA validatesContent-Typebefore parsing against the schema. Flows without a schema, or flows designed to accept raw input (e.g. Baker-pattern flows that parse the body internally), will work fine. The flow receives the JSON as base64-encoded$contentwith$content-type: application/octet-stream.
Flow State Management
set_live_flow_state
Start or stop a Power Automate flow via the live PA API. Does not require a Power Clarity workspace — works for any flow the impersonated account can access. Reads the current state first and only issues the start/stop call if a change is actually needed.
Parameters: environmentName, flowName, state ("Started" | "Stopped") — all required.
Response:
{
"flowName": "6321ab25-7eb0-42df-b977-e97d34bcb272",
"environmentName": "Default-26e65220-...",
"requestedState": "Started",
"actualState": "Started"
}
Use this tool — not
update_live_flow— to start or stop a flow.update_live_flowonly changes displayName/definition; the PA API ignores state passed through that endpoint.
set_store_flow_state
Start or stop a flow via the live PA API and persist the updated state back
to the Power Clarity cache. Same parameters as set_live_flow_state but requires
a Power Clarity workspace.
Response (different shape from set_live_flow_state):
{
"flowKey": "<environmentId>.<flowId>",
"requestedState": "Stopped",
"currentState": "Stopped",
"flow": { /* full gFlows record, same shape as get_store_flow */ }
}
Prefer
set_live_flow_statewhen you only need to toggle state — it's simpler and has no subscription requirement.Use
set_store_flow_statewhen you need the cache updated immediately (without waiting for the next daily scan) AND want the full updated governance record back in the same call — useful for workflows that stop a flow and immediately tag or inspect it.
Store Tools --- FlowStudio for Teams Only
get_store_flow_summary
Response: aggregated run statistics.
{
"totalRuns": 100,
"failRuns": 10,
"failRate": 0.1,
"averageDurationSeconds": 29.4,
"maxDurationSeconds": 158.9,
"firstFailRunRemediation": "<hint or null>"
}
get_store_flow_runs
Cached run history for the last N days with duration and remediation hints.
get_store_flow_errors
Cached failed-only runs with failed action names and remediation hints.
get_store_flow_trigger_url
Trigger URL from cache (instant, no PA API call).
update_store_flow
Update governance metadata (description, tags, monitor flag, notification rules, business impact).
list_store_makers / get_store_maker
Maker (citizen developer) discovery and detail.
list_store_power_apps
List all Power Apps canvas apps from the cache.
Behavioral Notes
Non-obvious behaviors discovered through real API usage. These are things tool schemas cannot tell you.
get_live_flow_run_action_outputs
actionNameis optional: omit to get top-level actions, provide to get one action. For actions inside foreach loops, a named action may return multiple repetitions; useiterationIndexto pin to one iteration.- Outputs can be 50 MB+ for bulk-data actions --- always use 120s+ timeout.
update_live_flow
- Required fields can vary by server version; confirm with
tool_search(select:update_live_flow) before create/update. Ifdescriptionis required, preserve the existing description when patching. errorkey is always present in response ---nullmeans success. Do NOT checkif "error" in result; checkresult.get("error") is not None.- On create,
created= new flow GUID (string). On update,created=false. - Cannot change flow state. Only updates displayName, definition, and
connectionReferences. Use
set_live_flow_stateto start/stop a flow.
trigger_live_flow
- Only works for HTTP Request triggers. Returns error for Recurrence, connector, and other trigger types.
- AAD-authenticated triggers are handled automatically (impersonated Bearer token).
get_live_flow_runs
topdefaults to 30 with automatic pagination for higher values.- Run ID field is
name, notrunName. Use this value asrunNamein other tools. - Runs are returned newest-first.
Teams PostMessageToConversation (via update_live_flow)
- "Chat with Flow bot":
body/recipient="user@domain.com;"(string with trailing semicolon). - "Channel":
body/recipient={"groupId": "...", "channelId": "..."}(object). poster:"Flow bot"for Workflows bot identity,"User"for user identity.
list_live_connections
- For build workflows, pass
environmentName; omitting it inventories connections across environments. - Use
search=<connector/account>to get smaller output and paste-readyconnectionReferenceTemplate/hostTemplatevalues. idis the value you need forconnectionNameinconnectionReferences.connectorNamemaps to apiId:"/providers/Microsoft.PowerApps/apis/" + connectorName.