{"kind":"Skill","metadata":{"namespace":"community","name":"flowstudio-power-automate-mcp","version":"0.1.0"},"spec":{"description":"\u003e-","files":{"SKILL.md":"---\nname: flowstudio-power-automate-mcp\ndescription: \u003e-\n  Foundation skill for Power Automate via FlowStudio MCP — auth setup, the\n  reusable MCP helper (Python + Node.js), tool discovery via `list_skills` /\n  `tool_search`, and oversized-response handling. Load this skill first when\n  connecting an agent to Power Automate. For specialized workflows, load\n  `flowstudio-power-automate-build`, `flowstudio-power-automate-debug`, `flowstudio-power-automate-monitoring`\n  (Pro+), or `flowstudio-power-automate-governance` (Pro+) — each contains the workflow\n  narrative, this skill provides the plumbing they all rely on. Requires a\n  FlowStudio MCP subscription or compatible server — see https://mcp.flowstudio.app\n---\n\n# Power Automate via FlowStudio MCP — Foundation\n\nThis skill is the **plumbing layer**. It gives an AI agent a reliable way to\ntalk to a FlowStudio MCP server, discover what tools are available, and handle\nthe responses cleanly. The actual workflow narratives live in four specialized\nskills that all build on this one.\n\n\u003e **Real debugging examples**: [Expression error in child flow](https://github.com/ninihen1/power-automate-mcp-skills/blob/main/examples/fix-expression-error.md) |\n\u003e [Data entry, not a flow bug](https://github.com/ninihen1/power-automate-mcp-skills/blob/main/examples/data-not-flow.md) |\n\u003e [Null value crashes child flow](https://github.com/ninihen1/power-automate-mcp-skills/blob/main/examples/null-child-flow.md)\n\n\u003e **Requires:** A [FlowStudio](https://mcp.flowstudio.app) MCP subscription (or\n\u003e compatible Power Automate MCP server). You will need:\n\u003e - MCP endpoint: `https://mcp.flowstudio.app/mcp` (same for all subscribers)\n\u003e - API key / JWT token (`x-api-key` header — NOT Bearer)\n\u003e - Power Platform environment name (e.g. `Default-\u003ctenant-guid\u003e`)\n\n---\n\n## Which Skill to Use When\n\nSkills are organized by **use-case intent**, not by which tools they call.\nMultiple skills reuse the same underlying tools — pick by what the user is\ntrying to accomplish.\n\n| The user wants to… | Load this skill |\n|---|---|\n| Make or change a flow (build new, modify existing, fix a bug, deploy) | **`flowstudio-power-automate-build`** |\n| Diagnose why a flow failed (root cause analysis on a failing run) | **`flowstudio-power-automate-debug`** |\n| See tenant-wide flow health, failure rates, asset inventory | **`flowstudio-power-automate-monitoring`** *(Pro+)* |\n| Tag, audit, classify, score, or offboard flows | **`flowstudio-power-automate-governance`** *(Pro+)* |\n| Just connect, set up auth, write the helper, parse responses | this skill (foundation) |\n\n**Same tools, different lenses.** `flowstudio-power-automate-build` and `flowstudio-power-automate-debug`\nboth call `update_live_flow`, `get_live_flow`, and the run-error tools — they\ndiffer in *direction* (forward vs backward) and *intent* (compose vs diagnose).\n`flowstudio-power-automate-monitoring` and `flowstudio-power-automate-governance` both call the Store\ntools — they differ in *audience* (ops vs compliance) and *outcome* (read\nhealth vs write metadata). Don't try to memorize \"which tools belong to which\nskill\"; pick the skill by what the user is doing.\n\n---\n\n## Source of Truth\n\n| Priority | Source | Covers |\n|----------|--------|--------|\n| 1 | **Real API response** | Always trust what the server actually returns |\n| 2 | **`tool_search` / `list_skills`** | Authoritative tool schemas, parameter names, types, required flags |\n| 3 | **SKILL docs \u0026 reference files** | Workflow narrative, response shapes, non-obvious behaviors |\n\nIf documentation disagrees with a real API response, the API wins. Tool schemas\nin this skill (or any other) may lag the server — call `tool_search` to confirm\nthe current shape before invoking a tool you haven't used recently.\n\n---\n\n## How Agents Discover Tools\n\nThe FlowStudio MCP server (v1.1.5+) exposes two **non-billable** meta-tools that\nlet an agent load only the tools relevant to the current task. Use these in\npreference to `tools/list` (which loads all 30+ schemas at once) or guessing\ntool names.\n\n| Meta-tool | When to call |\n|---|---|\n| `list_skills` | Cold start — see the available bundles (`build-flow`, `create-flow`, `debug-flow`, `monitor-flow`, `discover`, `governance`) and pick one |\n| `tool_search` with `query: \"skill:\u003cname\u003e\"` | Load the full schema set for one bundle (e.g. `skill:debug-flow`) |\n| `tool_search` with `query: \"select:tool1,tool2\"` | Load specific tools by name (e.g. when chaining across bundles) |\n| `tool_search` with `query: \"\u003ckeywords\u003e\"` | Free-text search when the user request is ambiguous (e.g. `\"cancel run\"`) |\n\nThe server's `tool_search` bundles are intentionally **narrower than this\nskill family** — they're starter packs of the most-likely-needed tools per\nintent. A workflow skill (e.g. `flowstudio-power-automate-debug`) may pull a bundle and\nthen call `tool_search` again for additional tools as the workflow progresses.\n\n```python\n# Cold start — pick a bundle by intent\nskills = mcp(\"list_skills\", {})\n# [{\"name\": \"debug-flow\", \"description\": \"Investigate why a flow is failing...\",\n#   \"tools\": [\"get_live_flow_runs\", \"get_live_flow_run_error\", ...]}, ...]\n\n# Load schemas for the bundle\ndebug_tools = mcp(\"tool_search\", {\"query\": \"skill:debug-flow\"})\n```\n\nCurrent common bundles:\n\n| Bundle | Use when |\n|---|---|\n| `create-flow` | Creating a brand-new flow; includes environment/connection discovery, connector description, dynamic options, and `update_live_flow` |\n| `build-flow` | Reading or modifying an existing flow definition |\n| `debug-flow` | Investigating failed runs and action-level inputs/outputs |\n| `monitor-flow` | Starting/stopping, triggering, cancelling, or resubmitting runs |\n| `discover` | Enumerating environments, flows, and connections |\n| `governance` | Pro+ cached-store tagging, maker audit, and metadata updates |\n\n---\n\n## Recommended Language: Python or Node.js\n\nAll examples in this skill family use **Python with `urllib.request`**\n(stdlib — no `pip install` needed). **Node.js** is an equally valid choice:\n`fetch` is built-in from Node 18+, JSON handling is native, and async/await\nmaps cleanly onto the request-response pattern of MCP tool calls — making it\na natural fit for teams already working in a JavaScript/TypeScript stack.\n\n| Language | Verdict | Notes |\n|---|---|---|\n| **Python** | Recommended | Clean JSON handling, no escaping issues, all skill examples use it |\n| **Node.js (≥ 18)** | Recommended | Native `fetch` + `JSON.stringify`/`JSON.parse`; no extra packages |\n| PowerShell | Avoid for flow operations | `ConvertTo-Json -Depth` silently truncates nested definitions; quoting and escaping break complex payloads. Acceptable for a quick connectivity smoke-test but not for building or updating flows. |\n| cURL / Bash | Possible but fragile | Shell-escaping nested JSON is error-prone; no native JSON parser |\n\n\u003e **TL;DR — use the Core MCP Helper (Python or Node.js) below.** Both handle\n\u003e JSON-RPC framing, auth, and response parsing in a single reusable function.\n\n---\n\n## Core MCP Helper (Python)\n\nUse this helper throughout all subsequent operations:\n\n```python\nimport json, urllib.request\n\nTOKEN = \"\u003cYOUR_JWT_TOKEN\u003e\"\nMCP   = \"https://mcp.flowstudio.app/mcp\"\n\ndef mcp(tool, args, cid=1):\n    payload = {\"jsonrpc\": \"2.0\", \"method\": \"tools/call\", \"id\": cid,\n               \"params\": {\"name\": tool, \"arguments\": args}}\n    req = urllib.request.Request(MCP, data=json.dumps(payload).encode(),\n        headers={\"x-api-key\": TOKEN, \"Content-Type\": \"application/json\",\n                 \"User-Agent\": \"FlowStudio-MCP/1.0\"})\n    try:\n        resp = urllib.request.urlopen(req, timeout=120)\n    except urllib.error.HTTPError as e:\n        body = e.read().decode(\"utf-8\", errors=\"replace\")\n        raise RuntimeError(f\"MCP HTTP {e.code}: {body[:200]}\") from e\n    raw = json.loads(resp.read())\n    if \"error\" in raw:\n        raise RuntimeError(f\"MCP error: {json.dumps(raw['error'])}\")\n    text = raw[\"result\"][\"content\"][0][\"text\"]\n    return json.loads(text)\n```\n\n\u003e **Common auth errors:**\n\u003e - HTTP 401/403 → token is missing, expired, or malformed. Get a fresh JWT from [mcp.flowstudio.app](https://mcp.flowstudio.app).\n\u003e - HTTP 400 → malformed JSON-RPC payload. Check `Content-Type: application/json` and body structure.\n\u003e - `MCP error: {\"code\": -32602, ...}` → wrong or missing tool arguments. Call `tool_search` with `select:\u003ctoolname\u003e` to confirm the schema.\n\n---\n\n## Core MCP Helper (Node.js)\n\nEquivalent helper for Node.js 18+ (built-in `fetch` — no packages required):\n\n```js\nconst TOKEN = \"\u003cYOUR_JWT_TOKEN\u003e\";\nconst MCP   = \"https://mcp.flowstudio.app/mcp\";\n\nasync function mcp(tool, args, cid = 1) {\n  const payload = {\n    jsonrpc: \"2.0\",\n    method: \"tools/call\",\n    id: cid,\n    params: { name: tool, arguments: args },\n  };\n  const res = await fetch(MCP, {\n    method: \"POST\",\n    headers: {\n      \"x-api-key\": TOKEN,\n      \"Content-Type\": \"application/json\",\n      \"User-Agent\": \"FlowStudio-MCP/1.0\",\n    },\n    body: JSON.stringify(payload),\n  });\n  if (!res.ok) {\n    const body = await res.text();\n    throw new Error(`MCP HTTP ${res.status}: ${body.slice(0, 200)}`);\n  }\n  const raw = await res.json();\n  if (raw.error) throw new Error(`MCP error: ${JSON.stringify(raw.error)}`);\n  return JSON.parse(raw.result.content[0].text);\n}\n```\n\n\u003e Requires Node.js 18+. For older Node, replace `fetch` with `https.request`\n\u003e from the stdlib or install `node-fetch`.\n\n---\n\n## Verify the Connection\n\nA 3-line smoke test that confirms the token, endpoint, and helper all work:\n\n```python\nskills = mcp(\"list_skills\", {})\nprint(f\"Connected — {len(skills)} skill bundles available:\",\n      [s[\"name\"] for s in skills])\n```\n\nExpected output:\n\n```text\nConnected — 6 skill bundles available: ['build-flow', 'create-flow', 'debug-flow', 'monitor-flow', 'discover', 'governance']\n```\n\nIf this fails, see the **Common auth errors** note above. If it succeeds, hand\noff to the workflow skill matching the user's intent.\n\n---\n\n## Handling Oversized Responses\n\nSome MCP tool responses are large enough to overflow the agent's context window:\n\n| Tool | Typical size | Cause |\n|---|---|---|\n| `describe_live_connector` | 100-600 KB | Full Swagger spec for a connector |\n| `get_live_dynamic_properties` | 50-500 KB | Dynamic connector field schemas such as SharePoint list columns |\n| `get_live_flow_run_action_outputs` (no `actionName`) | 50 KB – several MB | Top-level action outputs; with an action in a foreach, every repetition can be returned |\n| `get_live_flow` (large flows) | 50-500 KB | Deeply nested branches |\n| `list_live_flows` (large tenants) | 50-200 KB | Hundreds of flow records |\n\n### When the harness spills to a file\n\nAgent harnesses (Claude Code, VS Code Copilot, etc.) save oversized responses\nto a temp file (e.g. `tool-results/mcp-flowstudio-describe_live_connector-NNNN.txt`)\nand return the path instead of the inline JSON. The file is **double-wrapped** —\nthe outer MCP envelope plus the inner JSON-escaped payload:\n\n```text\n[{\"type\":\"text\",\"text\":\"\u003cJSON-escaped payload\u003e\"}]\n```\n\nTwo parses to reach a usable object:\n\n```python\nimport json\nwith open(path) as f:\n    raw = json.loads(f.read())\npayload = json.loads(raw[0][\"text\"])\n```\n\n```powershell\n$payload = ((Get-Content $path -Raw | ConvertFrom-Json)[0].text) | ConvertFrom-Json\n```\n\n### Rules of thumb\n\n1. **Extract, don't echo.** Pull the specific field(s) you need (one `operationId`, one action's outputs) and discard the rest before reasoning about it.\n2. **Always pass `actionName` to `get_live_flow_run_action_outputs`.** Omitting it fetches all top-level actions. For actions inside a foreach, passing `actionName` without `iterationIndex` can return every repetition of that action.\n3. **Reuse the spill file within a session.** Refetching the same connector swagger costs 30+ seconds and produces another spill — cache the path.\n4. **Don't grep the spill file for JSON keys directly.** Strings are JSON-escaped inside the file (`\\\"OperationId\\\":`), so a plain grep for `\"OperationId\":` will not match. Parse first, then filter.\n5. **Summarize tool output to the user.** Echo `name + state + trigger` for flow lists and `actionName + status + code` for run errors — not raw JSON, unless asked.\n\n```python\n# Good — drill into one operation in a connector swagger\nconn = mcp(\"describe_live_connector\", {\"environmentName\": ENV, \"connectorName\": \"shared_sharepointonline\"})\nop = conn[\"properties\"][\"swagger\"][\"paths\"][\"/datasets/{dataset}/tables/{table}/items\"][\"get\"]\nprint(op[\"operationId\"], \"—\", op.get(\"summary\"))\n\n# Bad — keeping the whole 500 KB swagger in context\nprint(json.dumps(conn, indent=2))   # don't do this\n```\n\n---\n\n## Auth \u0026 Connection Notes\n\n| Field | Value |\n|---|---|\n| Auth header | `x-api-key: \u003cJWT\u003e` — **not** `Authorization: Bearer` |\n| Token format | Plain JWT — do not strip, alter, or prefix it |\n| Timeout | Use ≥ 120 s for `get_live_flow_run_action_outputs` (large outputs) |\n| Environment name | `Default-\u003ctenant-guid\u003e` (find it via `list_live_environments` or `list_live_flows` response) |\n\n---\n\n## Reference Files\n\n- [MCP-BOOTSTRAP.md](references/MCP-BOOTSTRAP.md) — endpoint, auth, request/response format (read this first)\n- [tool-reference.md](references/tool-reference.md) — response shapes and behavioral notes (parameters are in `tool_search`)\n- [action-types.md](references/action-types.md) — Power Automate action type patterns\n- [connection-references.md](references/connection-references.md) — connector reference guide\n","references/MCP-BOOTSTRAP.md":"# MCP Bootstrap — Quick Reference\n\nEverything an agent needs to start calling the FlowStudio MCP server.\n\n```\nEndpoint:  https://mcp.flowstudio.app/mcp\nProtocol:  JSON-RPC 2.0 over HTTP POST\nTransport: Streamable HTTP — single POST per request, no SSE, no WebSocket\nAuth:      x-api-key header with JWT token (NOT Bearer)\n```\n\n## Required Headers\n\n```\nContent-Type: application/json\nx-api-key: \u003ctoken\u003e\nUser-Agent: FlowStudio-MCP/1.0    ← required, or Cloudflare blocks you\n```\n\n## Step 1 — Discover Tool Bundles\n\nPreferred cold-start call:\n\n```json\nPOST {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\n      \"params\":{\"name\":\"list_skills\",\"arguments\":{}}}\n```\n\nReturns the current bundles (`build-flow`, `create-flow`, `debug-flow`,\n`monitor-flow`, `discover`, `governance`) and their member tool names. Free —\nnot counted against plan limits.\n\nThen load the relevant schemas:\n\n```json\nPOST {\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/call\",\n      \"params\":{\"name\":\"tool_search\",\"arguments\":{\"query\":\"skill:create-flow\"}}}\n```\n\nUse `query:\"select:tool1,tool2\"` to load exact tools and keyword search such as\n`query:\"send email\"` when the user intent is ambiguous.\n\nFallback for very low-level MCP clients:\n\n```json\nPOST {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\",\"params\":{}}\n```\n\n`tools/list` returns all tools with names, descriptions, and input schemas, but\nit is heavier and should not be the first choice for agents that know the\nFlowStudio meta-tools.\n\n## Step 2 — Call a Tool\n\n```json\nPOST {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\n      \"params\":{\"name\":\"\u003ctool_name\u003e\",\"arguments\":{...}}}\n```\n\n## Response Shape\n\n```\nSuccess → {\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"\u003cJSON string\u003e\"}]}}\nError   → {\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"{\\\"error\\\":{...}}\"}]}}\n```\n\nAlways parse `result.content[0].text` as JSON to get the actual data.\n\n## Key Tips\n\n- Tool results are JSON strings inside the text field — **double-parse needed**\n- `\"error\"` field in parsed body: `null` = success, object = failure\n- `environmentName` is required for most tools, but **not** for:\n  `list_live_environments`, `list_live_connections`, `list_store_flows`,\n  `list_store_environments`, `list_store_makers`, `get_store_maker`,\n  `list_store_power_apps`, `list_store_connections`\n- When in doubt, check the `required` array in each tool's schema from\n  `tool_search` (or `tools/list` as a fallback)\n","references/action-types.md":"# FlowStudio MCP — Action Types Reference\n\nCompact lookup for recognising action types returned by `get_live_flow`.\nUse this to **read and understand** existing flow definitions.\n\n\u003e For full copy-paste construction patterns, see the `flowstudio-power-automate-build` skill.\n\n---\n\n## How to Read a Flow Definition\n\nEvery action has `\"type\"`, `\"runAfter\"`, and `\"inputs\"`. The `runAfter` object\ndeclares dependencies: `{\"Previous\": [\"Succeeded\"]}`. Valid statuses:\n`Succeeded`, `Failed`, `Skipped`, `TimedOut`.\n\n---\n\n## Action Type Quick Reference\n\n| Type | Purpose | Key fields to inspect | Output reference |\n|---|---|---|---|\n| `Compose` | Store/transform a value | `inputs` (any expression) | `outputs('Name')` |\n| `InitializeVariable` | Declare a variable | `inputs.variables[].{name, type, value}` | `variables('name')` |\n| `SetVariable` | Update a variable | `inputs.{name, value}` | `variables('name')` |\n| `IncrementVariable` | Increment a numeric variable | `inputs.{name, value}` | `variables('name')` |\n| `AppendToArrayVariable` | Push to an array variable | `inputs.{name, value}` | `variables('name')` |\n| `If` | Conditional branch | `expression.and/or`, `actions`, `else.actions` | — |\n| `Switch` | Multi-way branch | `expression`, `cases.{case, actions}`, `default` | — |\n| `Foreach` | Loop over array | `foreach`, `actions`, `operationOptions` | `item()` / `items('Name')` |\n| `Until` | Loop until condition | `expression`, `limit.{count, timeout}`, `actions` | — |\n| `Wait` | Delay | `inputs.interval.{count, unit}` | — |\n| `Scope` | Group / try-catch | `actions` (nested action map) | `result('Name')` |\n| `Terminate` | End run | `inputs.{runStatus, runError}` | — |\n| `OpenApiConnection` | Connector call (SP, Outlook, Teams…) | `inputs.host.{apiId, connectionName, operationId}`, `inputs.parameters` | `outputs('Name')?['body/...']` |\n| `OpenApiConnectionWebhook` | Webhook wait (approvals, adaptive cards) | same as above | `body('Name')?['...']` |\n| `Http` | External HTTP call | `inputs.{method, uri, headers, body}` | `outputs('Name')?['body']` |\n| `Response` | Return to HTTP caller | `inputs.{statusCode, headers, body}` | — |\n| `Query` | Filter array | `inputs.{from, where}` | `body('Name')` (filtered array) |\n| `Select` | Reshape/project array | `inputs.{from, select}` | `body('Name')` (projected array) |\n| `Table` | Array → CSV/HTML string | `inputs.{from, format, columns}` | `body('Name')` (string) |\n| `ParseJson` | Parse JSON with schema | `inputs.{content, schema}` | `body('Name')?['field']` |\n| `Expression` | Built-in function (e.g. ConvertTimeZone) | `kind`, `inputs` | `body('Name')` |\n\n---\n\n## Connector Identification\n\nWhen you see `type: OpenApiConnection`, identify the connector from `host.apiId`:\n\n| apiId suffix | Connector |\n|---|---|\n| `shared_sharepointonline` | SharePoint |\n| `shared_office365` | Outlook / Office 365 |\n| `shared_teams` | Microsoft Teams |\n| `shared_approvals` | Approvals |\n| `shared_office365users` | Office 365 Users |\n| `shared_flowmanagement` | Flow Management |\n\nThe `operationId` tells you the specific operation (e.g. `GetItems`, `SendEmailV2`,\n`PostMessageToConversation`). The `connectionName` maps to a GUID in\n`properties.connectionReferences`.\n\n---\n\n## Common Expressions (Reading Cheat Sheet)\n\n| Expression | Meaning |\n|---|---|\n| `@outputs('X')?['body/value']` | Array result from connector action X |\n| `@body('X')` | Direct body of action X (Query, Select, ParseJson) |\n| `@item()?['Field']` | Current loop item's field |\n| `@triggerBody()?['Field']` | Trigger payload field |\n| `@variables('name')` | Variable value |\n| `@coalesce(a, b)` | First non-null of a, b |\n| `@first(array)` | First element (null if empty) |\n| `@length(array)` | Array count |\n| `@empty(value)` | True if null/empty string/empty array |\n| `@union(a, b)` | Merge arrays — **first wins** on duplicates |\n| `@result('Scope')` | Array of action outcomes inside a Scope |\n","references/connection-references.md":"# FlowStudio MCP — Connection References\n\nConnection references wire a flow's connector actions to real authenticated\nconnections in the Power Platform. They are required whenever you call\n`update_live_flow` with a definition that uses connector actions.\n\n---\n\n## Structure in a Flow Definition\n\n```json\n{\n  \"properties\": {\n    \"definition\": { ... },\n    \"connectionReferences\": {\n      \"shared_sharepointonline\": {\n        \"connectionName\": \"shared-sharepointonl-eeeeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee\",\n        \"id\": \"/providers/Microsoft.PowerApps/apis/shared_sharepointonline\",\n        \"displayName\": \"SharePoint\"\n      },\n      \"shared_office365\": {\n        \"connectionName\": \"shared-office365-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\n        \"id\": \"/providers/Microsoft.PowerApps/apis/shared_office365\",\n        \"displayName\": \"Office 365 Outlook\"\n      }\n    }\n  }\n}\n```\n\nKeys are **logical reference names** (e.g. `shared_sharepointonline`).\nThese match the `connectionName` field inside each action's `host` block.\n\n---\n\n## Finding Connection References\n\nPreferred method: call `list_live_connections` in the target environment. Use\n`search` to narrow results to the connector you need; newer MCP server versions\nreturn paste-ready templates.\n\n```python\nmatches = mcp(\"list_live_connections\",\n    environmentName=ENV,\n    search=\"shared_sharepointonline\")\n\nconn = next(c for c in matches[\"connections\"]\n            if c.get(\"overallStatus\") == \"Connected\"\n            or c.get(\"statuses\", [{}])[0].get(\"status\") == \"Connected\")\n\nconn_refs = {\n    \"shared_sharepointonline\": conn.get(\"connectionReferenceTemplate\") or {\n        \"connectionName\": conn[\"id\"],\n        \"id\": \"/providers/Microsoft.PowerApps/apis/shared_sharepointonline\",\n        \"source\": \"Invoker\"\n    }\n}\nhost = conn.get(\"hostTemplate\") or {\"connectionName\": \"shared_sharepointonline\"}\n```\n\nUse `host` as the action-side `inputs.host`. Use `conn_refs` as\n`update_live_flow(connectionReferences=conn_refs)`.\n\nFallback method: copy from an existing flow.\n\nCall `get_live_flow` on **any existing flow** that uses the same connection\nand copy the `connectionReferences` block. The GUID after the connector prefix is\nthe connection instance owned by the authenticating user.\n\n```python\nflow = mcp(\"get_live_flow\", environmentName=ENV, flowName=EXISTING_FLOW_ID)\nconn_refs = flow[\"properties\"][\"connectionReferences\"]\n# conn_refs[\"shared_sharepointonline\"][\"connectionName\"]\n# → \"shared-sharepointonl-eeeeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee\"\n```\n\n\u003e ⚠️ Connection references are **user-scoped**. If a connection is owned\n\u003e by another account, `update_live_flow` will return 403\n\u003e `ConnectionAuthorizationFailed`. You must use a connection belonging to\n\u003e the account whose token is in the `x-api-key` header.\n\n---\n\n## Passing `connectionReferences` to `update_live_flow`\n\n```python\nresult = mcp(\"update_live_flow\",\n    environmentName=ENV,\n    flowName=FLOW_ID,\n    definition=modified_definition,\n    connectionReferences={\n        \"shared_sharepointonline\": {\n            \"connectionName\": \"shared-sharepointonl-eeeeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee\",\n            \"id\": \"/providers/Microsoft.PowerApps/apis/shared_sharepointonline\"\n        }\n    }\n)\n```\n\nOnly include connections that the definition actually uses.\n\n---\n\n## Common Connector API IDs\n\n| Service | API ID |\n|---|---|\n| SharePoint Online | `/providers/Microsoft.PowerApps/apis/shared_sharepointonline` |\n| Office 365 Outlook | `/providers/Microsoft.PowerApps/apis/shared_office365` |\n| Microsoft Teams | `/providers/Microsoft.PowerApps/apis/shared_teams` |\n| OneDrive for Business | `/providers/Microsoft.PowerApps/apis/shared_onedriveforbusiness` |\n| Azure AD | `/providers/Microsoft.PowerApps/apis/shared_azuread` |\n| HTTP with Azure AD | `/providers/Microsoft.PowerApps/apis/shared_webcontents` |\n| SQL Server | `/providers/Microsoft.PowerApps/apis/shared_sql` |\n| Dataverse | `/providers/Microsoft.PowerApps/apis/shared_commondataserviceforapps` |\n| Azure Blob Storage | `/providers/Microsoft.PowerApps/apis/shared_azureblob` |\n| Approvals | `/providers/Microsoft.PowerApps/apis/shared_approvals` |\n| Office 365 Users | `/providers/Microsoft.PowerApps/apis/shared_office365users` |\n| Flow Management | `/providers/Microsoft.PowerApps/apis/shared_flowmanagement` |\n\n---\n\n## Teams Adaptive Card Dual-Connection Requirement\n\nFlows that send adaptive cards **and** post follow-up messages require two\nseparate Teams connections:\n\n```json\n\"connectionReferences\": {\n  \"shared_teams\": {\n    \"connectionName\": \"shared-teams-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\n    \"id\": \"/providers/Microsoft.PowerApps/apis/shared_teams\"\n  },\n  \"shared_teams_1\": {\n    \"connectionName\": \"shared-teams-yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy\",\n    \"id\": \"/providers/Microsoft.PowerApps/apis/shared_teams\"\n  }\n}\n```\n\nBoth can point to the **same underlying Teams account** but must be registered\nas two distinct connection references. The webhook (`OpenApiConnectionWebhook`)\nuses `shared_teams` and subsequent message actions use `shared_teams_1`.\n","references/tool-reference.md":"# FlowStudio MCP — Tool Response Catalog\n\nResponse shapes and behavioral notes for the FlowStudio Power Automate MCP server.\n\n\u003e **For tool names and parameters**: Prefer `list_skills` and `tool_search`.\n\u003e They return focused, up-to-date schemas without loading every MCP tool at once.\n\u003e Use `tools/list` only as a low-level fallback when the meta-tools are not available.\n\u003e This document covers what tool schemas do NOT tell you: **response shapes**\n\u003e and **non-obvious behaviors** discovered through real usage.\n\n---\n\n## Source of Truth\n\n| Priority | Source | Covers |\n|----------|--------|--------|\n| 1 | **Real API response** | Always trust what the server actually returns |\n| 2 | **`list_skills` / `tool_search`** | Tool names, parameter names, types, required flags |\n| 3 | **This document** | Response shapes, behavioral notes, gotchas |\n\n\u003e If this document disagrees with `tool_search`, `tools/list`, or real API\n\u003e behavior, the API wins. Update this document accordingly.\n\n---\n\n## Environment \u0026 Tenant Discovery\n\n### `list_live_environments`\n\nResponse: direct array of environments.\n```json\n[\n  {\n    \"id\": \"Default-26e65220-5561-46ef-9783-ce5f20489241\",\n    \"displayName\": \"FlowStudio (default)\",\n    \"sku\": \"Production\",\n    \"location\": \"australia\",\n    \"state\": \"Enabled\",\n    \"isDefault\": true,\n    \"isAdmin\": true,\n    \"isMember\": true,\n    \"createdTime\": \"2023-08-18T00:41:05Z\"\n  }\n]\n```\n\n\u003e Use the `id` value as `environmentName` in all other tools.\n\n### `list_store_environments`\n\nSame shape as `list_live_environments` but read from cache (faster).\n\n---\n\n## Connection Discovery\n\n### `list_live_connections`\n\nResponse: wrapper object with `connections` array.\n```json\n{\n  \"connections\": [\n    {\n      \"id\": \"shared-office365-9f9d2c8e-55f1-49c9-9f9c-1c45d1fbbdce\",\n      \"displayName\": \"user@contoso.com\",\n      \"connectorName\": \"shared_office365\",\n      \"environment\": \"Default-26e65220-...\",\n      \"createdBy\": \"User Name\",\n      \"authenticatedUser\": \"user@contoso.com\",\n      \"overallStatus\": \"Connected\",\n      \"statuses\": [{\"status\": \"Connected\"}],\n      \"createdTime\": \"2024-03-12T21:23:55.206815Z\",\n      \"connectionReferenceTemplate\": {\n        \"connectionName\": \"shared-office365-9f9d2c8e-55f1-49c9-9f9c-1c45d1fbbdce\",\n        \"source\": \"Invoker\",\n        \"id\": \"/providers/Microsoft.PowerApps/apis/shared_office365\"\n      },\n      \"hostTemplate\": {\n        \"connectionName\": \"shared_office365\"\n      }\n    }\n  ],\n  \"totalCount\": 56,\n  \"error\": null\n}\n```\n\n\u003e **Key field**: `id` is the `connectionName` value used in `connectionReferences`.\n\u003e\n\u003e **Key field**: `connectorName` maps to apiId:\n\u003e `\"/providers/Microsoft.PowerApps/apis/\" + connectorName`\n\u003e\n\u003e Filter by status: prefer `overallStatus == \"Connected\"` when present; otherwise\n\u003e check `statuses[0].status == \"Connected\"`.\n\u003e\n\u003e For build workflows, pass `environmentName` to avoid using a connection from\n\u003e the wrong environment. Omit it only when intentionally inventorying connections\n\u003e across all environments.\n\u003e\n\u003e Pass `search=\u003cconnector or account\u003e` to narrow output and receive\n\u003e `connectionReferenceTemplate` plus `hostTemplate` values that can be copied\n\u003e directly into `update_live_flow`.\n\n### `list_store_connections`\n\nSame connection data from cache.\n\n---\n\n## Flow Discovery \u0026 Listing\n\n### `list_live_flows`\n\nResponse: wrapper object with `flows` array.\n```json\n{\n  \"mode\": \"owner\",\n  \"flows\": [\n    {\n      \"id\": \"0757041a-8ef2-cf74-ef06-06881916f371\",\n      \"displayName\": \"My Flow\",\n      \"state\": \"Started\",\n      \"triggerType\": \"Request\",\n      \"triggerKind\": \"Http\",\n      \"createdTime\": \"2023-08-18T01:18:17Z\",\n      \"lastModifiedTime\": \"2023-08-18T12:47:42Z\",\n      \"owners\": \"\u003caad-object-id\u003e\",\n      \"definitionAvailable\": true\n    }\n  ],\n  \"totalCount\": 100,\n  \"nextLink\": null,\n  \"error\": null\n}\n```\n\n\u003e Access via `result[\"flows\"]`. `id` is a plain UUID --- use directly as `flowName`.\n\u003e\n\u003e `mode` indicates the access scope used (`\"owner\"` or `\"admin\"`).\n\u003e\n\u003e Parameters added in newer server versions:\n\u003e - `search`: filter by display name server-side.\n\u003e - `mode`: `owner` for flows owned by the MCP identity; `admin` for all flows\n\u003e   visible to an admin account.\n\u003e - `timeoutSeconds`: return partial results with `nextLink` instead of waiting\n\u003e   on very large environments.\n\u003e - `continuationUrl`: pass the previous `nextLink` to continue the same query.\n\n### `list_store_flows`\n\nResponse: **direct array** (no wrapper).\n```json\n[\n  {\n    \"id\": \"3991358a-f603-e49d-b1ed-a9e4f72e2dcb.0757041a-8ef2-cf74-ef06-06881916f371\",\n    \"displayName\": \"Admin | Sync Template v3 (Solutions)\",\n    \"state\": \"Started\",\n    \"triggerType\": \"OpenApiConnectionWebhook\",\n    \"environmentName\": \"3991358a-f603-e49d-b1ed-a9e4f72e2dcb\",\n    \"runPeriodTotal\": 100,\n    \"createdTime\": \"2023-08-18T01:18:17Z\",\n    \"lastModifiedTime\": \"2023-08-18T12:47:42Z\"\n  }\n]\n```\n\n\u003e **`id` format**: `\u003cenvironmentId\u003e.\u003cflowId\u003e` --- split on the first `.` to extract the flow UUID:\n\u003e `flow_id = item[\"id\"].split(\".\", 1)[1]`\n\n### `get_store_flow`\n\nResponse: single flow metadata from cache (selected fields).\n```json\n{\n  \"id\": \"\u003cenvironmentId\u003e.\u003cflowId\u003e\",\n  \"displayName\": \"My Flow\",\n  \"state\": \"Started\",\n  \"triggerType\": \"Recurrence\",\n  \"runPeriodTotal\": 100,\n  \"runPeriodFailRate\": 0.1,\n  \"runPeriodSuccessRate\": 0.9,\n  \"runPeriodFails\": 10,\n  \"runPeriodSuccess\": 90,\n  \"runPeriodDurationAverage\": 29410.8,\n  \"runPeriodDurationMax\": 158900.0,\n  \"runError\": \"{\\\"code\\\": \\\"EACCES\\\", ...}\",\n  \"description\": \"Flow description\",\n  \"tier\": \"Premium\",\n  \"complexity\": \"{...}\",\n  \"actions\": 42,\n  \"connections\": [\"sharepointonline\", \"office365\"],\n  \"owners\": [\"user@contoso.com\"],\n  \"createdBy\": \"user@contoso.com\"\n}\n```\n\n\u003e `runPeriodDurationAverage` / `runPeriodDurationMax` are in **milliseconds** (divide by 1000).\n\u003e `runError` is a **JSON string** --- parse with `json.loads()`.\n\n---\n\n## Flow Definition (Live API)\n\n### `get_live_flow`\n\nResponse: full flow definition from PA API.\n```json\n{\n  \"name\": \"\u003cflow-guid\u003e\",\n  \"properties\": {\n    \"displayName\": \"My Flow\",\n    \"state\": \"Started\",\n    \"definition\": {\n      \"triggers\": { \"...\" },\n      \"actions\": { \"...\" },\n      \"parameters\": { \"...\" }\n    },\n    \"connectionReferences\": { \"...\" }\n  }\n}\n```\n\n### `update_live_flow`\n\n**Create mode**: Omit `flowName` --- creates a new flow. `definition` and `displayName` required.\n\n**Update mode**: Provide `flowName` --- PATCHes existing flow.\n\nResponse:\n```json\n{\n  \"created\": false,\n  \"flowKey\": \"\u003cenvironmentId\u003e.\u003cflowId\u003e\",\n  \"updated\": [\"definition\", \"connectionReferences\"],\n  \"displayName\": \"My Flow\",\n  \"state\": \"Started\",\n  \"definition\": { \"...full definition...\" },\n  \"error\": null\n}\n```\n\n\u003e `error` is **always present** but may be `null`. Check `result.get(\"error\") is not None`.\n\u003e\n\u003e On create: `created` is the new flow GUID (string). On update: `created` is `false`.\n\u003e\n\u003e Required fields can vary by server version. Use `tool_search` with\n\u003e `select:update_live_flow` before creating or patching a flow; if a description\n\u003e is required, include either the new description or the existing one from\n\u003e `get_live_flow`.\n\u003e\n\u003e The flow description is part of the workflow definition (`definition.description`),\n\u003e not a top-level tool argument in current schemas.\n\n### `add_live_flow_to_solution`\n\nMigrates a non-solution flow into a solution. Returns error if already in a solution.\n\nUse this after creating a Copilot Studio Skills-triggered flow that must be\ndiscoverable as an agent tool. Pass `solutionId` for the target solution. If the\nserver supports omitting `solutionId`, it uses the environment's default solution;\nprefer an explicit unmanaged solution for production ALM.\n\nThis tool changes solution membership only. It does not validate the trigger\nschema, publish a Copilot Studio agent, or prove that the flow is callable by the\nagent.\n\n---\n\n## Connector Operation Discovery\n\n### `describe_live_connector`\n\nDescribes a connector/API and its operations. Use it before creating connector\nactions instead of guessing operation JSON.\n\nCommon modes:\n\n| Call shape | Use |\n|---|---|\n| `search=\"send email\"` without `connectorName` | Search operations across connectors |\n| `connectorName=\"shared_sharepointonline\"` | Compact operation catalog for one connector |\n| `operationId=\"GetItems\"` | Expanded schema for one operation |\n| `variant=\"flowbot_chat\"` | Authored example for one operation variant |\n\nThe operation detail can include:\n- `hint`: authored guidance from the connector hints table.\n- `exampleDefinition`: copy-ready action/trigger shape when available.\n- Dynamic metadata with `nextTool=get_live_dynamic_options` or\n  `nextTool=get_live_dynamic_properties`.\n\n### `get_live_dynamic_options`\n\nResolves live dropdown/list options for connector parameters. Use this for\nIDs selected from lists, such as SharePoint sites/lists, Teams teams/channels,\nor other `x-ms-dynamic-list` / `x-ms-dynamic-values` parameters.\n\nPass the `dynamicMetadata` object returned by `describe_live_connector`, the\nconnection id from `list_live_connections`, and any already-resolved dependent\nparameters.\n\n### `get_live_dynamic_properties`\n\nResolves live schema/field properties for connector parameters. Use this for\ndynamic field sets such as SharePoint list item columns after the site and list\nare known.\n\nUseful parameters:\n- `parameters`: dependent values, for example `{ \"dataset\": \"\u003csite-url\u003e\",\n  \"table\": \"\u003clist-id\u003e\" }`.\n- `propertyName`: request one field after inspecting the compact response.\n- `includeRaw`: include raw connector schema only when needed; it can be large.\n\n---\n\n## Run History \u0026 Monitoring\n\n### `get_live_flow_runs`\n\nResponse: direct array of runs (newest first).\n```json\n[{\n  \"name\": \"\u003crun-id\u003e\",\n  \"status\": \"Succeeded|Failed|Running|Cancelled\",\n  \"startTime\": \"2026-02-25T06:13:38Z\",\n  \"endTime\": \"2026-02-25T06:14:02Z\",\n  \"triggerName\": \"Recurrence\",\n  \"error\": null\n}]\n```\n\n\u003e `top` defaults to **30** and auto-paginates for higher values. Set `top: 300`\n\u003e for 24-hour coverage on flows running every 5 minutes.\n\u003e\n\u003e Run ID field is **`name`** (not `runName`). Use this value as the `runName`\n\u003e parameter in other tools.\n\n### `get_live_flow_run_error`\n\nResponse: structured error breakdown for a failed run.\n```json\n{\n  \"runName\": \"08584296068667933411438594643CU15\",\n  \"failedActions\": [\n    {\n      \"actionName\": \"Apply_to_each_prepare_workers\",\n      \"status\": \"Failed\",\n      \"error\": {\"code\": \"ActionFailed\", \"message\": \"An action failed.\"},\n      \"code\": \"ActionFailed\",\n      \"startTime\": \"2026-02-25T06:13:52Z\",\n      \"endTime\": \"2026-02-25T06:15:24Z\"\n    },\n    {\n      \"actionName\": \"HTTP_find_AD_User_by_Name\",\n      \"status\": \"Failed\",\n      \"code\": \"NotSpecified\",\n      \"startTime\": \"2026-02-25T06:14:01Z\",\n      \"endTime\": \"2026-02-25T06:14:05Z\"\n    }\n  ],\n  \"allActions\": [\n    {\"actionName\": \"Apply_to_each\", \"status\": \"Skipped\"},\n    {\"actionName\": \"Compose_WeekEnd\", \"status\": \"Succeeded\"},\n    {\"actionName\": \"HTTP_find_AD_User_by_Name\", \"status\": \"Failed\"}\n  ]\n}\n```\n\n\u003e `failedActions` is ordered outer-to-inner --- the **last entry is the root cause**.\n\u003e Use `failedActions[-1][\"actionName\"]` as the starting point for diagnosis.\n\n### `get_live_flow_run_action_outputs`\n\nResponse: array of action detail objects.\n```json\n[\n  {\n    \"actionName\": \"Compose_WeekEnd_now\",\n    \"status\": \"Succeeded\",\n    \"startTime\": \"2026-02-25T06:13:52Z\",\n    \"endTime\": \"2026-02-25T06:13:52Z\",\n    \"error\": null,\n    \"inputs\": \"Mon, 25 Feb 2026 06:13:52 GMT\",\n    \"outputs\": \"Mon, 25 Feb 2026 06:13:52 GMT\"\n  }\n]\n```\n\n\u003e **`actionName` is optional**: omit it to return top-level actions in the run.\n\u003e Provide it for a specific action. If that action runs inside a foreach, the\n\u003e tool can return every repetition of that action across iterations; pass\n\u003e `iterationIndex` to pin to one zero-based iteration.\n\u003e\n\u003e Outputs can be very large (50 MB+) for bulk-data actions. Use 120s+ timeout.\n\n---\n\n## Run Control\n\n### `resubmit_live_flow_run`\n\nResponse: `{ flowKey, resubmitted: true, runName, triggerName }`\n\n### `cancel_live_flow_run`\n\nCancels a `Running` flow run.\n\n\u003e Do NOT cancel runs waiting for an adaptive card response --- status `Running`\n\u003e is normal while a Teams card is awaiting user input.\n\n---\n\n## HTTP Trigger Tools\n\n### `get_live_flow_http_schema`\n\nDeprecated. Prefer `get_live_flow` and inspect the `Request` trigger's\n`inputs.schema` plus any `Response` actions directly from the definition.\n\nResponse keys:\n```\nflowKey            - Flow GUID\ndisplayName        - Flow display name\ntriggerName        - Trigger action name (e.g. \"manual\")\ntriggerType        - Trigger type (e.g. \"Request\")\ntriggerKind        - Trigger kind (e.g. \"Http\")\nrequestMethod      - HTTP method (e.g. \"POST\")\nrelativePath       - Relative path configured on the trigger (if any)\nrequestSchema      - JSON schema the trigger expects as POST body\nrequestHeaders     - Headers the trigger expects\nresponseSchemas    - Array of JSON schemas defined on Response action(s)\nresponseSchemaCount - Number of Response actions that define output schemas\n```\n\n\u003e The request body schema is in `requestSchema` (not `triggerSchema`).\n\n### `get_live_flow_trigger_url`\n\nDeprecated. Prefer `trigger_live_flow` when you need to invoke an HTTP-triggered\nflow; it fetches the current callback URL internally.\n\nReturns the signed callback URL for HTTP-triggered flows. Response includes\n`flowKey`, `triggerName`, `triggerType`, `triggerKind`, `triggerMethod`, `triggerUrl`.\n\n### `trigger_live_flow`\n\nResponse keys: `flowKey`, `triggerName`, `triggerUrl`, `requiresAadAuth`, `authType`,\n`responseStatus`, `responseBody`.\n\n\u003e **Only works for `Request` (HTTP) triggers.** Returns an error for Recurrence\n\u003e and other trigger types: `\"only HTTP Request triggers can be invoked via this tool\"`.\n\u003e `Button`-kind triggers return `ListCallbackUrlOperationBlocked`.\n\u003e\n\u003e `responseStatus` + `responseBody` contain the flow's Response action output.\n\u003e AAD-authenticated triggers are handled automatically.\n\u003e\n\u003e **Content-type note**: The body is sent as `application/octet-stream` (raw),\n\u003e not `application/json`. Flows with a trigger schema that has `required` fields\n\u003e will reject the request with `InvalidRequestContent` (400) because PA validates\n\u003e `Content-Type` before parsing against the schema. Flows without a schema, or\n\u003e flows designed to accept raw input (e.g. Baker-pattern flows that parse the body\n\u003e internally), will work fine. The flow receives the JSON as base64-encoded\n\u003e `$content` with `$content-type: application/octet-stream`.\n\n---\n\n## Flow State Management\n\n### `set_live_flow_state`\n\nStart or stop a Power Automate flow via the live PA API. Does **not** require\na Power Clarity workspace — works for any flow the impersonated account can access.\nReads the current state first and only issues the start/stop call if a change is\nactually needed.\n\nParameters: `environmentName`, `flowName`, `state` (`\"Started\"` | `\"Stopped\"`) — all required.\n\nResponse:\n```json\n{\n  \"flowName\": \"6321ab25-7eb0-42df-b977-e97d34bcb272\",\n  \"environmentName\": \"Default-26e65220-...\",\n  \"requestedState\": \"Started\",\n  \"actualState\": \"Started\"\n}\n```\n\n\u003e **Use this tool** — not `update_live_flow` — to start or stop a flow.\n\u003e `update_live_flow` only changes displayName/definition; the PA API ignores\n\u003e state passed through that endpoint.\n\n### `set_store_flow_state`\n\nStart or stop a flow via the live PA API **and** persist the updated state back\nto the Power Clarity cache. Same parameters as `set_live_flow_state` but requires\na Power Clarity workspace.\n\nResponse (different shape from `set_live_flow_state`):\n```json\n{\n  \"flowKey\": \"\u003cenvironmentId\u003e.\u003cflowId\u003e\",\n  \"requestedState\": \"Stopped\",\n  \"currentState\": \"Stopped\",\n  \"flow\": { /* full gFlows record, same shape as get_store_flow */ }\n}\n```\n\n\u003e Prefer `set_live_flow_state` when you only need to toggle state — it's\n\u003e simpler and has no subscription requirement.\n\u003e\n\u003e Use `set_store_flow_state` when you need the cache updated immediately\n\u003e (without waiting for the next daily scan) AND want the full updated\n\u003e governance record back in the same call — useful for workflows that\n\u003e stop a flow and immediately tag or inspect it.\n\n---\n\n## Store Tools --- FlowStudio for Teams Only\n\n### `get_store_flow_summary`\n\nResponse: aggregated run statistics.\n```json\n{\n  \"totalRuns\": 100,\n  \"failRuns\": 10,\n  \"failRate\": 0.1,\n  \"averageDurationSeconds\": 29.4,\n  \"maxDurationSeconds\": 158.9,\n  \"firstFailRunRemediation\": \"\u003chint or null\u003e\"\n}\n```\n\n### `get_store_flow_runs`\n\nCached run history for the last N days with duration and remediation hints.\n\n### `get_store_flow_errors`\n\nCached failed-only runs with failed action names and remediation hints.\n\n### `get_store_flow_trigger_url`\n\nTrigger URL from cache (instant, no PA API call).\n\n### `update_store_flow`\n\nUpdate governance metadata (description, tags, monitor flag, notification rules, business impact).\n\n### `list_store_makers` / `get_store_maker`\n\nMaker (citizen developer) discovery and detail.\n\n### `list_store_power_apps`\n\nList all Power Apps canvas apps from the cache.\n\n---\n\n## Behavioral Notes\n\nNon-obvious behaviors discovered through real API usage. These are things\ntool schemas cannot tell you.\n\n### `get_live_flow_run_action_outputs`\n- **`actionName` is optional**: omit to get top-level actions, provide to get one\n  action. For actions inside foreach loops, a named action may return multiple\n  repetitions; use `iterationIndex` to pin to one iteration.\n- Outputs can be 50 MB+ for bulk-data actions --- always use 120s+ timeout.\n\n### `update_live_flow`\n- Required fields can vary by server version; confirm with `tool_search`\n  (`select:update_live_flow`) before create/update. If `description` is required,\n  preserve the existing description when patching.\n- `error` key is **always present** in response --- `null` means success.\n  Do NOT check `if \"error\" in result`; check `result.get(\"error\") is not None`.\n- On create, `created` = new flow GUID (string). On update, `created` = `false`.\n- **Cannot change flow state.** Only updates displayName, definition, and\n  connectionReferences. Use `set_live_flow_state` to start/stop a flow.\n\n### `trigger_live_flow`\n- **Only works for HTTP Request triggers.** Returns error for Recurrence, connector,\n  and other trigger types.\n- AAD-authenticated triggers are handled automatically (impersonated Bearer token).\n\n### `get_live_flow_runs`\n- `top` defaults to **30** with automatic pagination for higher values.\n- Run ID field is `name`, not `runName`. Use this value as `runName` in other tools.\n- Runs are returned newest-first.\n\n### Teams `PostMessageToConversation` (via `update_live_flow`)\n- **\"Chat with Flow bot\"**: `body/recipient` = `\"user@domain.com;\"` (string with trailing semicolon).\n- **\"Channel\"**: `body/recipient` = `{\"groupId\": \"...\", \"channelId\": \"...\"}` (object).\n- `poster`: `\"Flow bot\"` for Workflows bot identity, `\"User\"` for user identity.\n\n### `list_live_connections`\n- For build workflows, pass `environmentName`; omitting it inventories\n  connections across environments.\n- Use `search=\u003cconnector/account\u003e` to get smaller output and paste-ready\n  `connectionReferenceTemplate` / `hostTemplate` values.\n- `id` is the value you need for `connectionName` in `connectionReferences`.\n- `connectorName` maps to apiId: `\"/providers/Microsoft.PowerApps/apis/\" + connectorName`.\n"},"import":{"commit_sha":"541b7819d8c3545c6df122491af4fa1eae415779","imported_at":"2026-05-18T20:05:35Z","license_text":"MIT License\n\nCopyright GitHub, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.","owner":"github","repo":"github/awesome-copilot","source_url":"https://github.com/github/awesome-copilot/tree/541b7819d8c3545c6df122491af4fa1eae415779/plugins/flowstudio-power-automate/skills/flowstudio-power-automate-mcp"}},"content_hash":[232,39,155,72,201,254,217,189,250,20,172,191,17,3,92,105,30,13,16,72,34,252,209,253,102,72,84,102,52,66,246,138],"trust_level":"unsigned","yanked":false}
