[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F4NFHDGYMB5HJZCEGZJ9TG":3,"skill-same:01M6F4NFHDGYMB5HJZCEGZJ9TG":77},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":54,"commitSha":55,"skillDirectory":56,"forksCount":57,"repositoryHtmlUrl":58,"repositoryHomepageUrl":59,"ownerHtmlUrl":60,"ownerBlogUrl":6,"ownerDescription":61,"updatedAt":62,"install":63,"resources":76},"01M6F4NFHDGYMB5HJZCEGZJ9TG","flowstudio-power-automate-mcp",null,"Connect to and operate Power Automate cloud flows via a FlowStudio MCP server. Use when asked to: list flows, read a flow definition, check run history, inspect action outputs, resubmit a run, cancel a running flow, view connections, get a trigger URL, validate a definition, monitor flow health, or any task that requires talking to the Power Automate API through an MCP tool. Also use for Power Platform environment discovery and connection management. Requires a FlowStudio MCP subscription or compatible server — see https:\u002F\u002Fmcp.flowstudio.app","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fgithub\u002Fawesome-copilot\u002Fflowstudio-power-automate-mcp\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"flowstudio power automate mcp","automate","power","MCP","read","operate","URL","flows","app","platform","get","view","list","history","api","flow","server","run","connect","mcp server","2026-11-10 10:12:30",false,"---\nname: flowstudio-power-automate-mcp\ndescription: >-\n  Connect to and operate Power Automate cloud flows via a FlowStudio MCP server.\n  Use when asked to: list flows, read a flow definition, check run history, inspect\n  action outputs, resubmit a run, cancel a running flow, view connections, get a\n  trigger URL, validate a definition, monitor flow health, or any task that requires\n  talking to the Power Automate API through an MCP tool. Also use for Power Platform\n  environment discovery and connection management. Requires a FlowStudio MCP\n  subscription or compatible server — see https:\u002F\u002Fmcp.flowstudio.app\n---\n\n# Power Automate via FlowStudio MCP\n\nThis skill lets AI agents read, monitor, and operate Microsoft Power Automate\ncloud flows programmatically through a **FlowStudio MCP server** — no browser,\nno UI, no manual steps.\n\n> **Requires:** A [FlowStudio](https:\u002F\u002Fmcp.flowstudio.app) MCP subscription (or\n> compatible Power Automate MCP server). You will need:\n> - MCP endpoint: `https:\u002F\u002Fmcp.flowstudio.app\u002Fmcp` (same for all subscribers)\n> - API key \u002F JWT token (`x-api-key` header — NOT Bearer)\n> - Power Platform environment name (e.g. `Default-\u003Ctenant-guid>`)\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 | **`tools\u002Flist`** | Tool names, parameter names, types, required flags |\n| 3 | **SKILL docs & reference files** | Response shapes, behavioral notes, workflow recipes |\n\n> **Start every new session with `tools\u002Flist`.**\n> It returns the authoritative, up-to-date schema for every tool — parameter names,\n> types, and required flags. The SKILL docs cover what `tools\u002Flist` cannot tell you:\n> response shapes, non-obvious behaviors, and end-to-end workflow patterns.\n>\n> If any documentation disagrees with `tools\u002Flist` or a real API response,\n> the API wins.\n\n---\n\n## Recommended Language: Python or Node.js\n\nAll examples in this skill and the companion build \u002F debug skills use **Python\nwith `urllib.request`** (stdlib — no `pip install` needed). **Node.js** is an\nequally valid choice: `fetch` is built-in from Node 18+, JSON handling is\nnative, and the async\u002Fawait model maps cleanly onto the request-response pattern\nof MCP tool calls — making it a natural fit for teams already working in a\nJavaScript\u002FTypeScript 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`\u002F`JSON.parse`; async\u002Fawait fits MCP call patterns well; no extra packages needed |\n| PowerShell | ⚠️ Avoid for flow operations | `ConvertTo-Json -Depth` silently truncates nested definitions; quoting and escaping break complex payloads. Acceptable for a quick `tools\u002Flist` discovery call but not for building or updating flows. |\n| cURL \u002F Bash | ⚠️ Possible but fragile | Shell-escaping nested JSON is error-prone; no native JSON parser |\n\n> **TL;DR — use the Core MCP Helper (Python or Node.js) below.** Both handle\n> JSON-RPC framing, auth, and response parsing in a single reusable function.\n\n---\n\n## What You Can Do\n\nFlowStudio MCP has two access tiers. **FlowStudio for Teams** subscribers get\nboth the fast Azure-table store (cached snapshot data + governance metadata) and\nfull live Power Automate API access. **MCP-only subscribers** get the live tools —\nmore than enough to build, debug, and operate flows.\n\n### Live Tools — Available to All MCP Subscribers\n\n| Tool | What it does |\n|---|---|\n| `list_live_flows` | List flows in an environment directly from the PA API (always current) |\n| `list_live_environments` | List all Power Platform environments visible to the service account |\n| `list_live_connections` | List all connections in an environment from the PA API |\n| `get_live_flow` | Fetch the complete flow definition (triggers, actions, parameters) |\n| `get_live_flow_http_schema` | Inspect the JSON body schema and response schemas of an HTTP-triggered flow |\n| `get_live_flow_trigger_url` | Get the current signed callback URL for an HTTP-triggered flow |\n| `trigger_live_flow` | POST to an HTTP-triggered flow's callback URL (AAD auth handled automatically) |\n| `update_live_flow` | Create a new flow or patch an existing definition in one call |\n| `add_live_flow_to_solution` | Migrate a non-solution flow into a solution |\n| `get_live_flow_runs` | List recent run history with status, start\u002Fend times, and errors |\n| `get_live_flow_run_error` | Get structured error details (per-action) for a failed run |\n| `get_live_flow_run_action_outputs` | Inspect inputs\u002Foutputs of any action (or every foreach iteration) in a run |\n| `resubmit_live_flow_run` | Re-run a failed or cancelled run using its original trigger payload |\n| `cancel_live_flow_run` | Cancel a currently running flow execution |\n\n### Store Tools — FlowStudio for Teams Subscribers Only\n\nThese tools read from (and write to) the FlowStudio Azure table — a monitored\nsnapshot of your tenant's flows enriched with governance metadata and run statistics.\n\n| Tool | What it does |\n|---|---|\n| `list_store_flows` | Search flows from the cache with governance flags, run failure rates, and owner metadata |\n| `get_store_flow` | Get full cached details for a single flow including run stats and governance fields |\n| `get_store_flow_trigger_url` | Get the trigger URL from the cache (instant, no PA API call) |\n| `get_store_flow_runs` | Cached run history for the last N days with duration and remediation hints |\n| `get_store_flow_errors` | Cached failed-only runs with failed action names and remediation hints |\n| `get_store_flow_summary` | Aggregated stats: success rate, failure count, avg\u002Fmax duration |\n| `set_store_flow_state` | Start or stop a flow via the PA API and sync the result back to the store |\n| `update_store_flow` | Update governance metadata (description, tags, monitor flag, notification rules, business impact) |\n| `list_store_environments` | List all environments from the cache |\n| `list_store_makers` | List all makers (citizen developers) from the cache |\n| `get_store_maker` | Get a maker's flow\u002Fapp counts and account status |\n| `list_store_power_apps` | List all Power Apps canvas apps from the cache |\n| `list_store_connections` | List all Power Platform connections from the cache |\n\n---\n\n## Which Tool Tier to Call First\n\n| Task | Tool | Notes |\n|---|---|---|\n| List flows | `list_live_flows` | Always current — calls PA API directly |\n| Read a definition | `get_live_flow` | Always fetched live — not cached |\n| Debug a failure | `get_live_flow_runs` → `get_live_flow_run_error` | Use live run data |\n\n> ⚠️ **`list_live_flows` returns a wrapper object** with a `flows` array — access via `result[\"flows\"]`.\n\n> Store tools (`list_store_flows`, `get_store_flow`, etc.) are available to **FlowStudio for Teams** subscribers and provide cached governance metadata. Use live tools when in doubt — they work for all subscription tiers.\n\n---\n\n## Step 0 — Discover Available Tools\n\nAlways start by calling `tools\u002Flist` to confirm the server is reachable and see\nexactly which tool names are available (names may vary by server version):\n\n```python\nimport json, urllib.request\n\nTOKEN = \"\u003CYOUR_JWT_TOKEN>\"\nMCP   = \"https:\u002F\u002Fmcp.flowstudio.app\u002Fmcp\"\n\ndef mcp_raw(method, params=None, cid=1):\n    payload = {\"jsonrpc\": \"2.0\", \"method\": method, \"id\": cid}\n    if params:\n        payload[\"params\"] = params\n    req = urllib.request.Request(MCP, data=json.dumps(payload).encode(),\n        headers={\"x-api-key\": TOKEN, \"Content-Type\": \"application\u002Fjson\",\n                 \"User-Agent\": \"FlowStudio-MCP\u002F1.0\"})\n    try:\n        resp = urllib.request.urlopen(req, timeout=30)\n    except urllib.error.HTTPError as e:\n        raise RuntimeError(f\"MCP HTTP {e.code} — check token and endpoint\") from e\n    return json.loads(resp.read())\n\nraw = mcp_raw(\"tools\u002Flist\")\nif \"error\" in raw:\n    print(\"ERROR:\", raw[\"error\"]); raise SystemExit(1)\nfor t in raw[\"result\"][\"tools\"]:\n    print(t[\"name\"], \"—\", t[\"description\"][:60])\n```\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>\"\nMCP   = \"https:\u002F\u002Fmcp.flowstudio.app\u002Fmcp\"\n\ndef mcp(tool, args, cid=1):\n    payload = {\"jsonrpc\": \"2.0\", \"method\": \"tools\u002Fcall\", \"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\u002Fjson\",\n                 \"User-Agent\": \"FlowStudio-MCP\u002F1.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> **Common auth errors:**\n> - HTTP 401\u002F403 → token is missing, expired, or malformed. Get a fresh JWT from [mcp.flowstudio.app](https:\u002F\u002Fmcp.flowstudio.app).\n> - HTTP 400 → malformed JSON-RPC payload. Check `Content-Type: application\u002Fjson` and body structure.\n> - `MCP error: {\"code\": -32602, ...}` → wrong or missing tool arguments.\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>\";\nconst MCP   = \"https:\u002F\u002Fmcp.flowstudio.app\u002Fmcp\";\n\nasync function mcp(tool, args, cid = 1) {\n  const payload = {\n    jsonrpc: \"2.0\",\n    method: \"tools\u002Fcall\",\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\u002Fjson\",\n      \"User-Agent\": \"FlowStudio-MCP\u002F1.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> Requires Node.js 18+. For older Node, replace `fetch` with `https.request`\n> from the stdlib or install `node-fetch`.\n\n---\n\n## List Flows\n\n```python\nENV = \"Default-\u003Ctenant-guid>\"\n\nresult = mcp(\"list_live_flows\", {\"environmentName\": ENV})\n# Returns wrapper object:\n# {\"mode\": \"owner\", \"flows\": [{\"id\": \"0757041a-...\", \"displayName\": \"My Flow\",\n#   \"state\": \"Started\", \"triggerType\": \"Request\", ...}], \"totalCount\": 42, \"error\": null}\nfor f in result[\"flows\"]:\n    FLOW_ID = f[\"id\"]   # plain UUID — use directly as flowName\n    print(FLOW_ID, \"|\", f[\"displayName\"], \"|\", f[\"state\"])\n```\n\n---\n\n## Read a Flow Definition\n\n```python\nFLOW = \"\u003Cflow-uuid>\"\n\nflow = mcp(\"get_live_flow\", {\"environmentName\": ENV, \"flowName\": FLOW})\n\n# Display name and state\nprint(flow[\"properties\"][\"displayName\"])\nprint(flow[\"properties\"][\"state\"])\n\n# List all action names\nactions = flow[\"properties\"][\"definition\"][\"actions\"]\nprint(\"Actions:\", list(actions.keys()))\n\n# Inspect one action's expression\nprint(actions[\"Compose_Filter\"][\"inputs\"])\n```\n\n---\n\n## Check Run History\n\n```python\n# Most recent runs (newest first)\nruns = mcp(\"get_live_flow_runs\", {\"environmentName\": ENV, \"flowName\": FLOW, \"top\": 5})\n# Returns direct array:\n# [{\"name\": \"08584296068667933411438594643CU15\",\n#   \"status\": \"Failed\",\n#   \"startTime\": \"2026-02-25T06:13:38.6910688Z\",\n#   \"endTime\": \"2026-02-25T06:15:24.1995008Z\",\n#   \"triggerName\": \"manual\",\n#   \"error\": {\"code\": \"ActionFailed\", \"message\": \"An action failed...\"}},\n#  {\"name\": \"08584296028664130474944675379CU26\",\n#   \"status\": \"Succeeded\", \"error\": null, ...}]\n\nfor r in runs:\n    print(r[\"name\"], r[\"status\"])\n\n# Get the name of the first failed run\nrun_id = next((r[\"name\"] for r in runs if r[\"status\"] == \"Failed\"), None)\n```\n\n---\n\n## Inspect an Action's Output\n\n```python\nrun_id = runs[0][\"name\"]\n\nout = mcp(\"get_live_flow_run_action_outputs\", {\n    \"environmentName\": ENV,\n    \"flowName\": FLOW,\n    \"runName\": run_id,\n    \"actionName\": \"Get_Customer_Record\"   # exact action name from the definition\n})\nprint(json.dumps(out, indent=2))\n```\n\n---\n\n## Get a Run's Error\n\n```python\nerr = mcp(\"get_live_flow_run_error\", {\n    \"environmentName\": ENV,\n    \"flowName\": FLOW,\n    \"runName\": run_id\n})\n# Returns:\n# {\"runName\": \"08584296068...\",\n#  \"failedActions\": [\n#    {\"actionName\": \"HTTP_find_AD_User_by_Name\", \"status\": \"Failed\",\n#     \"code\": \"NotSpecified\", \"startTime\": \"...\", \"endTime\": \"...\"},\n#    {\"actionName\": \"Scope_prepare_workers\", \"status\": \"Failed\",\n#     \"error\": {\"code\": \"ActionFailed\", \"message\": \"An action failed...\"}}\n#  ],\n#  \"allActions\": [\n#    {\"actionName\": \"Apply_to_each\", \"status\": \"Skipped\"},\n#    {\"actionName\": \"Compose_WeekEnd\", \"status\": \"Succeeded\"},\n#    ...\n#  ]}\n\n# The ROOT cause is usually the deepest entry in failedActions:\nroot = err[\"failedActions\"][-1]\nprint(f\"Root failure: {root['actionName']} → {root['code']}\")\n```\n\n---\n\n## Resubmit a Run\n\n```python\nresult = mcp(\"resubmit_live_flow_run\", {\n    \"environmentName\": ENV,\n    \"flowName\": FLOW,\n    \"runName\": run_id\n})\nprint(result)   # {\"resubmitted\": true, \"triggerName\": \"...\"}\n```\n\n---\n\n## Cancel a Running Run\n\n```python\nmcp(\"cancel_live_flow_run\", {\n    \"environmentName\": ENV,\n    \"flowName\": FLOW,\n    \"runName\": run_id\n})\n```\n\n> ⚠️ **Do NOT cancel a run that shows `Running` because it is waiting for an\n> adaptive card response.** That status is normal — the flow is paused waiting\n> for a human to respond in Teams. Cancelling it will discard the pending card.\n\n---\n\n## Full Round-Trip Example — Debug and Fix a Failing Flow\n\n```python\n# ── 1. Find the flow ─────────────────────────────────────────────────────\nresult = mcp(\"list_live_flows\", {\"environmentName\": ENV})\ntarget = next(f for f in result[\"flows\"] if \"My Flow Name\" in f[\"displayName\"])\nFLOW_ID = target[\"id\"]\n\n# ── 2. Get the most recent failed run ────────────────────────────────────\nruns = mcp(\"get_live_flow_runs\", {\"environmentName\": ENV, \"flowName\": FLOW_ID, \"top\": 5})\n# [{\"name\": \"08584296068...\", \"status\": \"Failed\", ...}, ...]\nRUN_ID = next(r[\"name\"] for r in runs if r[\"status\"] == \"Failed\")\n\n# ── 3. Get per-action failure breakdown ──────────────────────────────────\nerr = mcp(\"get_live_flow_run_error\", {\"environmentName\": ENV, \"flowName\": FLOW_ID, \"runName\": RUN_ID})\n# {\"failedActions\": [{\"actionName\": \"HTTP_find_AD_User_by_Name\", \"code\": \"NotSpecified\",...}], ...}\nroot_action = err[\"failedActions\"][-1][\"actionName\"]\nprint(f\"Root failure: {root_action}\")\n\n# ── 4. Read the definition and inspect the failing action's expression ───\ndefn = mcp(\"get_live_flow\", {\"environmentName\": ENV, \"flowName\": FLOW_ID})\nacts = defn[\"properties\"][\"definition\"][\"actions\"]\nprint(\"Failing action inputs:\", acts[root_action][\"inputs\"])\n\n# ── 5. Inspect the prior action's output to find the null ────────────────\nout = mcp(\"get_live_flow_run_action_outputs\", {\n    \"environmentName\": ENV, \"flowName\": FLOW_ID,\n    \"runName\": RUN_ID, \"actionName\": \"Compose_Names\"\n})\nnulls = [x for x in out.get(\"body\", []) if x.get(\"Name\") is None]\nprint(f\"{len(nulls)} records with null Name\")\n\n# ── 6. Apply the fix ─────────────────────────────────────────────────────\nacts[root_action][\"inputs\"][\"parameters\"][\"searchName\"] = \\\n    \"@coalesce(item()?['Name'], '')\"\n\nconn_refs = defn[\"properties\"][\"connectionReferences\"]\nresult = mcp(\"update_live_flow\", {\n    \"environmentName\": ENV, \"flowName\": FLOW_ID,\n    \"definition\": defn[\"properties\"][\"definition\"],\n    \"connectionReferences\": conn_refs\n})\nassert result.get(\"error\") is None, f\"Deploy failed: {result['error']}\"\n# ⚠️ error key is always present — only fail if it is NOT None\n\n# ── 7. Resubmit and verify ───────────────────────────────────────────────\nmcp(\"resubmit_live_flow_run\", {\"environmentName\": ENV, \"flowName\": FLOW_ID, \"runName\": RUN_ID})\n\nimport time; time.sleep(30)\nnew_runs = mcp(\"get_live_flow_runs\", {\"environmentName\": ENV, \"flowName\": FLOW_ID, \"top\": 1})\nprint(new_runs[0][\"status\"])   # Succeeded = done\n```\n\n---\n\n## Auth & Connection Notes\n\n| Field | Value |\n|---|---|\n| Auth header | `x-api-key: \u003CJWT>` — **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>` (find it via `list_live_environments` or `list_live_flows` response) |\n\n---\n\n## Reference Files\n\n- [MCP-BOOTSTRAP.md](references\u002FMCP-BOOTSTRAP.md) — endpoint, auth, request\u002Fresponse format (read this first)\n- [tool-reference.md](references\u002Ftool-reference.md) — response shapes and behavioral notes (parameters are in `tools\u002Flist`)\n- [action-types.md](references\u002Faction-types.md) — Power Automate action type patterns\n- [connection-references.md](references\u002Fconnection-references.md) — connector reference guide\n\n---\n\n## More Capabilities\n\nFor **diagnosing failing flows** end-to-end → load the `power-automate-debug` skill.\n\nFor **building and deploying new flows** → load the `power-automate-build` skill.\n\n","# Power Automate via FlowStudio MCP\n\nThis skill lets AI agents read, monitor, and operate Microsoft Power Automate\ncloud flows programmatically through a **FlowStudio MCP server** — no browser,\nno UI, no manual steps.\n\n> **Requires:** A [FlowStudio](https:\u002F\u002Fmcp.flowstudio.app) MCP subscription (or\n> compatible Power Automate MCP server). You will need:\n> - MCP endpoint: `https:\u002F\u002Fmcp.flowstudio.app\u002Fmcp` (same for all subscribers)\n> - API key \u002F JWT token (`x-api-key` header — NOT Bearer)\n> - Power Platform environment name (e.g. `Default-\u003Ctenant-guid>`)\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 | **`tools\u002Flist`** | Tool names, parameter names, types, required flags |\n| 3 | **SKILL docs & reference files** | Response shapes, behavioral notes, workflow recipes |\n\n> **Start every new session with `tools\u002Flist`.**\n> It returns the authoritative, up-to-date schema for every tool — parameter names,\n> types, and required flags. The SKILL docs cover what `tools\u002Flist` cannot tell you:\n> response shapes, non-obvious behaviors, and end-to-end workflow patterns.\n>\n> If any documentation disagrees with `tools\u002Flist` or a real API response,\n> the API wins.\n\n---\n\n## Recommended Language: Python or Node.js\n\nAll examples in this skill and the companion build \u002F debug skills use **Python\nwith `urllib.request`** (stdlib — no `pip install` needed). **Node.js** is an\nequally valid choice: `fetch` is built-in from Node 18+, JSON handling is\nnative, and the async\u002Fawait model maps cleanly onto the request-response pattern\nof MCP tool calls — making it a natural fit for teams already working in a\nJavaScript\u002FTypeScript 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`\u002F`JSON.parse`; async\u002Fawait fits MCP call patterns well; no extra packages needed |\n| PowerShell | ⚠️ Avoid for flow operations | `ConvertTo-Json -Depth` silently truncates nested definitions; quoting and escaping break complex payloads. Acceptable for a quick `tools\u002Flist` discovery call but not for building or updating flows. |\n| cURL \u002F Bash | ⚠️ Possible but fragile | Shell-escaping nested JSON is error-prone; no native JSON parser |\n\n> **TL;DR — use the Core MCP Helper (Python or Node.js) below.** Both handle\n> JSON-RPC framing, auth, and response parsing in a single reusable function.\n\n---\n\n## What You Can Do\n\nFlowStudio MCP has two access tiers. **FlowStudio for Teams** subscribers get\nboth the fast Azure-table store (cached snapshot data + governance metadata) and\nfull live Power Automate API access. **MCP-only subscribers** get the live tools —\nmore than enough to build, debug, and operate flows.\n\n### Live Tools — Available to All MCP Subscribers\n\n| Tool | What it does |\n|---|---|\n| `list_live_flows` | List flows in an environment directly from the PA API (always current) |\n| `list_live_environments` | List all Power Platform environments visible to the service account |\n| `list_live_connections` | List all connections in an environment from the PA API |\n| `get_live_flow` | Fetch the complete flow definition (triggers, actions, parameters) |\n| `get_live_flow_http_schema` | Inspect the JSON body schema and response schemas of an HTTP-triggered flow |\n| `get_live_flow_trigger_url` | Get the current signed callback URL for an HTTP-triggered flow |\n| `trigger_live_flow` | POST to an HTTP-triggered flow's callback URL (AAD auth handled automatically) |\n| `update_live_flow` | Create a new flow or patch an existing definition in one call |\n| `add_live_flow_to_solution` | Migrate a non-solution flow into a solution |\n| `get_live_flow_runs` | List recent run history with status, start\u002Fend times, and errors |\n| `get_live_flow_run_error` | Get structured error details (per-action) for a failed run |\n| `get_live_flow_run_action_outputs` | Inspect inputs\u002Foutputs of any action (or every foreach iteration) in a run |\n| `resubmit_live_flow_run` | Re-run a failed or cancelled run using its original trigger payload |\n| `cancel_live_flow_run` | Cancel a currently running flow execution |\n\n### Store Tools — FlowStudio for Teams Subscribers Only\n\nThese tools read from (and write to) the FlowStudio Azure table — a monitored\nsnapshot of your tenant's flows enriched with governance metadata and run statistics.\n\n| Tool | What it does |\n|---|---|\n| `list_store_flows` | Search flows from the cache with governance flags, run failure rates, and owner metadata |\n| `get_store_flow` | Get full cached details for a single flow including run stats and governance fields |\n| `get_store_flow_trigger_url` | Get the trigger URL from the cache (instant, no PA API call) |\n| `get_store_flow_runs` | Cached run history for the last N days with duration and remediation hints |\n| `get_store_flow_errors` | Cached failed-only runs with failed action names and remediation hints |\n| `get_store_flow_summary` | Aggregated stats: success rate, failure count, avg\u002Fmax duration |\n| `set_store_flow_state` | Start or stop a flow via the PA API and sync the result back to the store |\n| `update_store_flow` | Update governance metadata (description, tags, monitor flag, notification rules, business impact) |\n| `list_store_environments` | List all environments from the cache |\n| `list_store_makers` | List all makers (citizen developers) from the cache |\n| `get_store_maker` | Get a maker's flow\u002Fapp counts and account status |\n| `list_store_power_apps` | List all Power Apps canvas apps from the cache |\n| `list_store_connections` | List all Power Platform connections from the cache |\n\n---\n\n## Which Tool Tier to Call First\n\n| Task | Tool | Notes |\n|---|---|---|\n| List flows | `list_live_flows` | Always current — calls PA API directly |\n| Read a definition | `get_live_flow` | Always fetched live — not cached |\n| Debug a failure | `get_live_flow_runs` → `get_live_flow_run_error` | Use live run data |\n\n> ⚠️ **`list_live_flows` returns a wrapper object** with a `flows` array — access via `result[\"flows\"]`.\n\n> Store tools (`list_store_flows`, `get_store_flow`, etc.) are available to **FlowStudio for Teams** subscribers and provide cached governance metadata. Use live tools when in doubt — they work for all subscription tiers.\n\n---\n\n## Step 0 — Discover Available Tools\n\nAlways start by calling `tools\u002Flist` to confirm the server is reachable and see\nexactly which tool names are available (names may vary by server version):\n\n```python\nimport json, urllib.request\n\nTOKEN = \"\u003CYOUR_JWT_TOKEN>\"\nMCP   = \"https:\u002F\u002Fmcp.flowstudio.app\u002Fmcp\"\n\ndef mcp_raw(method, params=None, cid=1):\n    payload = {\"jsonrpc\": \"2.0\", \"method\": method, \"id\": cid}\n    if params:\n        payload[\"params\"] = params\n    req = urllib.request.Request(MCP, data=json.dumps(payload).encode(),\n        headers={\"x-api-key\": TOKEN, \"Content-Type\": \"application\u002Fjson\",\n                 \"User-Agent\": \"FlowStudio-MCP\u002F1.0\"})\n    try:\n        resp = urllib.request.urlopen(req, timeout=30)\n    except urllib.error.HTTPError as e:\n        raise RuntimeError(f\"MCP HTTP {e.code} — check token and endpoint\") from e\n    return json.loads(resp.read())\n\nraw = mcp_raw(\"tools\u002Flist\")\nif \"error\" in raw:\n    print(\"ERROR:\", raw[\"error\"]); raise SystemExit(1)\nfor t in raw[\"result\"][\"tools\"]:\n    print(t[\"name\"], \"—\", t[\"description\"][:60])\n```\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>\"\nMCP   = \"https:\u002F\u002Fmcp.flowstudio.app\u002Fmcp\"\n\ndef mcp(tool, args, cid=1):\n    payload = {\"jsonrpc\": \"2.0\", \"method\": \"tools\u002Fcall\", \"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\u002Fjson\",\n                 \"User-Agent\": \"FlowStudio-MCP\u002F1.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> **Common auth errors:**\n> - HTTP 401\u002F403 → token is missing, expired, or malformed. Get a fresh JWT from [mcp.flowstudio.app](https:\u002F\u002Fmcp.flowstudio.app).\n> - HTTP 400 → malformed JSON-RPC payload. Check `Content-Type: application\u002Fjson` and body structure.\n> - `MCP error: {\"code\": -32602, ...}` → wrong or missing tool arguments.\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>\";\nconst MCP   = \"https:\u002F\u002Fmcp.flowstudio.app\u002Fmcp\";\n\nasync function mcp(tool, args, cid = 1) {\n  const payload = {\n    jsonrpc: \"2.0\",\n    method: \"tools\u002Fcall\",\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\u002Fjson\",\n      \"User-Agent\": \"FlowStudio-MCP\u002F1.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> Requires Node.js 18+. For older Node, replace `fetch` with `https.request`\n> from the stdlib or install `node-fetch`.\n\n---\n\n## List Flows\n\n```python\nENV = \"Default-\u003Ctenant-guid>\"\n\nresult = mcp(\"list_live_flows\", {\"environmentName\": ENV})\n# Returns wrapper object:\n# {\"mode\": \"owner\", \"flows\": [{\"id\": \"0757041a-...\", \"displayName\": \"My Flow\",\n#   \"state\": \"Started\", \"triggerType\": \"Request\", ...}], \"totalCount\": 42, \"error\": null}\nfor f in result[\"flows\"]:\n    FLOW_ID = f[\"id\"]   # plain UUID — use directly as flowName\n    print(FLOW_ID, \"|\", f[\"displayName\"], \"|\", f[\"state\"])\n```\n\n---\n\n## Read a Flow Definition\n\n```python\nFLOW = \"\u003Cflow-uuid>\"\n\nflow = mcp(\"get_live_flow\", {\"environmentName\": ENV, \"flowName\": FLOW})\n\n# Display name and state\nprint(flow[\"properties\"][\"displayName\"])\nprint(flow[\"properties\"][\"state\"])\n\n# List all action names\nactions = flow[\"properties\"][\"definition\"][\"actions\"]\nprint(\"Actions:\", list(actions.keys()))\n\n# Inspect one action's expression\nprint(actions[\"Compose_Filter\"][\"inputs\"])\n```\n\n---\n\n## Check Run History\n\n```python\n# Most recent runs (newest first)\nruns = mcp(\"get_live_flow_runs\", {\"environmentName\": ENV, \"flowName\": FLOW, \"top\": 5})\n# Returns direct array:\n# [{\"name\": \"08584296068667933411438594643CU15\",\n#   \"status\": \"Failed\",\n#   \"startTime\": \"2026-02-25T06:13:38.6910688Z\",\n#   \"endTime\": \"2026-02-25T06:15:24.1995008Z\",\n#   \"triggerName\": \"manual\",\n#   \"error\": {\"code\": \"ActionFailed\", \"message\": \"An action failed...\"}},\n#  {\"name\": \"08584296028664130474944675379CU26\",\n#   \"status\": \"Succeeded\", \"error\": null, ...}]\n\nfor r in runs:\n    print(r[\"name\"], r[\"status\"])\n\n# Get the name of the first failed run\nrun_id = next((r[\"name\"] for r in runs if r[\"status\"] == \"Failed\"), None)\n```\n\n---\n\n## Inspect an Action's Output\n\n```python\nrun_id = runs[0][\"name\"]\n\nout = mcp(\"get_live_flow_run_action_outputs\", {\n    \"environmentName\": ENV,\n    \"flowName\": FLOW,\n    \"runName\": run_id,\n    \"actionName\": \"Get_Customer_Record\"   # exact action name from the definition\n})\nprint(json.dumps(out, indent=2))\n```\n\n---\n\n## Get a Run's Error\n\n```python\nerr = mcp(\"get_live_flow_run_error\", {\n    \"environmentName\": ENV,\n    \"flowName\": FLOW,\n    \"runName\": run_id\n})\n# Returns:\n# {\"runName\": \"08584296068...\",\n#  \"failedActions\": [\n#    {\"actionName\": \"HTTP_find_AD_User_by_Name\", \"status\": \"Failed\",\n#     \"code\": \"NotSpecified\", \"startTime\": \"...\", \"endTime\": \"...\"},\n#    {\"actionName\": \"Scope_prepare_workers\", \"status\": \"Failed\",\n#     \"error\": {\"code\": \"ActionFailed\", \"message\": \"An action failed...\"}}\n#  ],\n#  \"allActions\": [\n#    {\"actionName\": \"Apply_to_each\", \"status\": \"Skipped\"},\n#    {\"actionName\": \"Compose_WeekEnd\", \"status\": \"Succeeded\"},\n#    ...\n#  ]}\n\n# The ROOT cause is usually the deepest entry in failedActions:\nroot = err[\"failedActions\"][-1]\nprint(f\"Root failure: {root['actionName']} → {root['code']}\")\n```\n\n---\n\n## Resubmit a Run\n\n```python\nresult = mcp(\"resubmit_live_flow_run\", {\n    \"environmentName\": ENV,\n    \"flowName\": FLOW,\n    \"runName\": run_id\n})\nprint(result)   # {\"resubmitted\": true, \"triggerName\": \"...\"}\n```\n\n---\n\n## Cancel a Running Run\n\n```python\nmcp(\"cancel_live_flow_run\", {\n    \"environmentName\": ENV,\n    \"flowName\": FLOW,\n    \"runName\": run_id\n})\n```\n\n> ⚠️ **Do NOT cancel a run that shows `Running` because it is waiting for an\n> adaptive card response.** That status is normal — the flow is paused waiting\n> for a human to respond in Teams. Cancelling it will discard the pending card.\n\n---\n\n## Full Round-Trip Example — Debug and Fix a Failing Flow\n\n```python\n# ── 1. Find the flow ─────────────────────────────────────────────────────\nresult = mcp(\"list_live_flows\", {\"environmentName\": ENV})\ntarget = next(f for f in result[\"flows\"] if \"My Flow Name\" in f[\"displayName\"])\nFLOW_ID = target[\"id\"]\n\n# ── 2. Get the most recent failed run ────────────────────────────────────\nruns = mcp(\"get_live_flow_runs\", {\"environmentName\": ENV, \"flowName\": FLOW_ID, \"top\": 5})\n# [{\"name\": \"08584296068...\", \"status\": \"Failed\", ...}, ...]\nRUN_ID = next(r[\"name\"] for r in runs if r[\"status\"] == \"Failed\")\n\n# ── 3. Get per-action failure breakdown ──────────────────────────────────\nerr = mcp(\"get_live_flow_run_error\", {\"environmentName\": ENV, \"flowName\": FLOW_ID, \"runName\": RUN_ID})\n# {\"failedActions\": [{\"actionName\": \"HTTP_find_AD_User_by_Name\", \"code\": \"NotSpecified\",...}], ...}\nroot_action = err[\"failedActions\"][-1][\"actionName\"]\nprint(f\"Root failure: {root_action}\")\n\n# ── 4. Read the definition and inspect the failing action's expression ───\ndefn = mcp(\"get_live_flow\", {\"environmentName\": ENV, \"flowName\": FLOW_ID})\nacts = defn[\"properties\"][\"definition\"][\"actions\"]\nprint(\"Failing action inputs:\", acts[root_action][\"inputs\"])\n\n# ── 5. Inspect the prior action's output to find the null ────────────────\nout = mcp(\"get_live_flow_run_action_outputs\", {\n    \"environmentName\": ENV, \"flowName\": FLOW_ID,\n    \"runName\": RUN_ID, \"actionName\": \"Compose_Names\"\n})\nnulls = [x for x in out.get(\"body\", []) if x.get(\"Name\") is None]\nprint(f\"{len(nulls)} records with null Name\")\n\n# ── 6. Apply the fix ─────────────────────────────────────────────────────\nacts[root_action][\"inputs\"][\"parameters\"][\"searchName\"] = \\\n    \"@coalesce(item()?['Name'], '')\"\n\nconn_refs = defn[\"properties\"][\"connectionReferences\"]\nresult = mcp(\"update_live_flow\", {\n    \"environmentName\": ENV, \"flowName\": FLOW_ID,\n    \"definition\": defn[\"properties\"][\"definition\"],\n    \"connectionReferences\": conn_refs\n})\nassert result.get(\"error\") is None, f\"Deploy failed: {result['error']}\"\n# ⚠️ error key is always present — only fail if it is NOT None\n\n# ── 7. Resubmit and verify ───────────────────────────────────────────────\nmcp(\"resubmit_live_flow_run\", {\"environmentName\": ENV, \"flowName\": FLOW_ID, \"runName\": RUN_ID})\n\nimport time; time.sleep(30)\nnew_runs = mcp(\"get_live_flow_runs\", {\"environmentName\": ENV, \"flowName\": FLOW_ID, \"top\": 1})\nprint(new_runs[0][\"status\"])   # Succeeded = done\n```\n\n---\n\n## Auth & Connection Notes\n\n| Field | Value |\n|---|---|\n| Auth header | `x-api-key: \u003CJWT>` — **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>` (find it via `list_live_environments` or `list_live_flows` response) |\n\n---\n\n## Reference Files\n\n- [MCP-BOOTSTRAP.md](references\u002FMCP-BOOTSTRAP.md) — endpoint, auth, request\u002Fresponse format (read this first)\n- [tool-reference.md](references\u002Ftool-reference.md) — response shapes and behavioral notes (parameters are in `tools\u002Flist`)\n- [action-types.md](references\u002Faction-types.md) — Power Automate action type patterns\n- [connection-references.md](references\u002Fconnection-references.md) — connector reference guide\n\n---\n\n## More Capabilities\n\nFor **diagnosing failing flows** end-to-end → load the `power-automate-debug` skill.\n\nFor **building and deploying new flows** → load the `power-automate-build` skill.\n\n",{"name":5,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fgithub\u002Fawesome-copilot\u002Fflowstudio-power-automate-mcp",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":64,"prompt":74,"zipAvailable":75},[65,68,71],{"tool":66,"command":67},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill flowstudio-power-automate-mcp",{"tool":69,"command":70},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill flowstudio-power-automate-mcp",{"tool":72,"command":73},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill flowstudio-power-automate-mcp","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fgithub\u002Fawesome-copilot\u002Fflowstudio-power-automate-mcp\u002FSKILL.md",true,[],[78,88,97,106,112,119],{"skillNo":79,"name":80,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":84,"publishedAt":49},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[83],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[85,86,87],"model","model hierarchy","model hierarchy skill",{"skillNo":89,"name":90,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":94,"publishedAt":49},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[93],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[32,95,96],"zoom","zoom mcp",{"skillNo":98,"name":99,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":100,"categories":101,"keywords":102,"publishedAt":49},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[103,104,105,95],"sdk","zoom apps sdk","apps",{"skillNo":107,"name":108,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":109,"categories":110,"keywords":111,"publishedAt":49},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[108],{"skillNo":113,"name":114,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":118,"publishedAt":49},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[117],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[114],{"skillNo":120,"name":121,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":124,"publishedAt":49},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[121]]