Install the "add-cloud-flow" agent skill from https://github.com/microsoft/power-platform-skills/tree/main/plugins/power-pages/skills/add-cloud-flow into .claude/skills/add-cloud-flow/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-cloud-flow", then confirm the skill loads.
Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Type this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
skills CLI
$ npx skills add microsoft/power-platform-skills --skill add-cloud-flow -a codex
Project install goes to .agents/skills/; add -g for ~/.codex/skills/.
Install the "add-cloud-flow" agent skill from https://github.com/microsoft/power-platform-skills/tree/main/plugins/power-pages/skills/add-cloud-flow into .agents/skills/add-cloud-flow/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-cloud-flow", then confirm the skill loads.
Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
skills CLI
$ npx skills add microsoft/power-platform-skills --skill add-cloud-flow -a cursor
Project install goes to .agents/skills/; add -g for ~/.cursor/skills/.
Install the "add-cloud-flow" agent skill from https://github.com/microsoft/power-platform-skills/tree/main/plugins/power-pages/skills/add-cloud-flow into .cursor/skills/add-cloud-flow/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-cloud-flow", then confirm the skill loads.
Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
skills CLI
$ npx skills add microsoft/power-platform-skills --skill add-cloud-flow -a gemini-cli
Project install goes to .agents/skills/; add -g for ~/.gemini/skills/.
Install the "add-cloud-flow" agent skill from https://github.com/microsoft/power-platform-skills/tree/main/plugins/power-pages/skills/add-cloud-flow into .gemini/skills/add-cloud-flow/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-cloud-flow", then confirm the skill loads.
Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Installs for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
skills CLI
$ npx skills add microsoft/power-platform-skills --skill add-cloud-flow -a github-copilot
Project install goes to .agents/skills/; add -g for ~/.copilot/skills/.
Install the "add-cloud-flow" agent skill from https://github.com/microsoft/power-platform-skills/tree/main/plugins/power-pages/skills/add-cloud-flow into .github/skills/add-cloud-flow/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-cloud-flow", then confirm the skill loads.
GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
skills CLI
$ npx skills add microsoft/power-platform-skills --skill add-cloud-flow -a opencode
OpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
Install the "add-cloud-flow" agent skill from https://github.com/microsoft/power-platform-skills/tree/main/plugins/power-pages/skills/add-cloud-flow into .opencode/skills/add-cloud-flow/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-cloud-flow", then confirm the skill loads.
OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Facts
Skill name
add-cloud-flow
GitHub stars
967
Token cost
~8.8k tokens
SKILL.md length
3,946 words
Files
5 (incl. scripts, assets)
Skills in repo
87
Repo updated
First seen
Licence
MIT
At a glance
Integrates Power Automate cloud flows into a Power Pages site.
Works in 8 steps: Verify Prerequisites → List Available Flows → Select Flows & Understand Scenarios → …
The user wants to add
SKILL.md covers Core Principles, Workflow, Phase 1: Verify Prerequisites and Phase 2: List Available Flows, plus 4 more sections
Runs JavaScript scripts from its folder; calls node and az
What it does
Add Cloud Flow is an agent skill from microsoft/power-platform-skills, published by the product's own GitHub organization. Integrates Power Automate cloud flows into a Power Pages site. Lists available flows, suggests relevant ones based on intent, identifies scenarios and web roles, creates metadata files, and generates client-side code to call flows. Handles both new flow registration and adding already-registered flows to additional pages without re-creating metadata. Use when the user wants to add, connect, register, or link a Power Automate cloud flow to their site.
Its SKILL.md is about 8.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files, including scripts and assets (for example `scripts/create-cloud-flow-metadata.js`, `scripts/list-cloud-flows.js` and `scripts/validate-cloudflow.js`).
It sits in AI & LLM Engineering. It works with Power Automate, Microsoft Azure and TypeScript. The repository describes itself as: A plugin marketplace for GitHub Copilot and other AI agents that provides Power Platform development plugins, including reusable skills, agents, and commands for building and… The licence is MIT.
When your agent uses it
The user wants to add
Link a Power Automate cloud flow to their site
Example prompts
“Use the add-cloud-flow skill to integrate Power Automate cloud flows into a Power Pages site”
Read from SKILL.md and the folder at commit 5ef4e4f. It shows what the files ask for, not the result of running them.
Tool permissions
Pre-approves these tools, so the agent can use them without asking each time:
Read
Write
Edit
Bash
Grep
Glob
AskUserQuestion
Skill
Task
TaskCreate
…and 2 more on the same allowed-tools line.
From allowed-tools in the SKILL.md frontmatter.
Runs code
Ships 3 files in scripts/ (JavaScript), which the agent can run.
Shell commands in SKILL.md call:
node
az
From the folder's file list and the shell code blocks in SKILL.md.
Network
Links to these hosts (documentation or services it may open):
make.powerautomate.com
From URLs in SKILL.md, links to its own repository left out.
Credentials
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Context cost
Add Cloud Flow loads about 8.8k tokens when it runs. Until then it costs about 117 tokens; SKILL.md has 3,946 words of instructions outside code blocks.
Always· name and description, kept in context so the agent knows when to use it
~117
When it runs· the whole SKILL.md, loaded when a task matches
~8.8k
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
Safety
Auto-check: notes
The automated check noted patterns worth knowing about, such as sudo or a known installer.
NotePre-approves every shell command (allowed-tools: Bash)SKILL.md
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
Download SKILL.mdSave it as .claude/skills/add-cloud-flow/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.
name
add-cloud-flow
description
Integrates Power Automate cloud flows into a Power Pages site. Lists available flows, suggests relevant ones based on intent, identifies scenarios and web roles, creates metadata files, and generates client-side code to call flows. Handles both new flow registration and adding already-registered flows to additional pages without re-creating metadata. Use when the user wants to add, connect, register, or link a Power Automate cloud flow to their site.
Plugin check: Run node "${PLUGIN_ROOT}/scripts/check-version.js" — if it outputs a message, show it to the user before proceeding.
Add Cloud Flow
Connect one or more Power Automate cloud flows to a Power Pages code site, or wire already-registered flows into additional pages/components. For new flows this skill:
Creates the adx_cloudflowconsumer metadata YAML in .powerpages-site/cloud-flow-consumer/
Assigns web roles based on the flow's scenario and target audience
Generates client-side TypeScript/JavaScript service code to trigger the flow with CSRF authentication
For already-registered flows, the skill skips metadata and role creation and goes straight to client-side integration — wiring the existing flow into new UI locations.
Core Principles
Multiple flows in one run: The user can add several flows at once. All flows are planned together and implemented together before asking for deployment.
Ask before acting: Present a full HTML plan (all flows, roles, reasoning) before creating any files.
Web roles drive access: Every flow must have at least one web role. Anonymous Users role is valid but must be confirmed.
Scenario determines roles: Understand what each flow does and who triggers it before picking roles.
Use TaskCreate/TaskUpdate: Track all phases upfront before starting any work.
Prerequisites:
An existing Power Pages code site with .powerpages-site deployed
PAC CLI authenticated (pac auth who must succeed)
Azure CLI authenticated (az login --allow-no-subscriptions works whether or not your account has an Azure subscription — Dataverse and Power Platform tokens are AAD-scoped)
Initial request: $ARGUMENTS
Workflow
Verify Prerequisites — Locate the project, confirm .powerpages-site exists, inventory web roles and existing flows
List Available Flows — Fetch flows from the Power Automate Flow RP API
Select Flows & Understand Scenarios — User picks one or more flows; determine scenario and audience for each
Determine Web Roles — Propose minimum roles per flow with reasoning
Review Plan — Render HTML plan for all flows; get user approval
Create Metadata — Write .cloudflowconsumer.yml for each flow; create missing web roles first
Client-Side Integration — Generate typed service code to call each flow from the frontend
Verify & Summarize — Validate all YAMLs, record skill usage, offer deployment
Phase 1: Verify Prerequisites
Goal: Locate the Power Pages project and confirm all prerequisites are met
🚦 Gate (plan · add-cloud-flow:1.3.deploy-first):.powerpages-site missing — cloud flow YAML lives inside it. Deploy first or stop.
Trigger: Phase 1.3 found no .powerpages-site directory.
Why we ask: Cloud flow YAML written to a non-existent path will never deploy.
Cancel leaves: Nothing — no YAML files written.
Use AskUserQuestion:
Question
Options
.powerpages-site is required to add cloud flows. Would you like to deploy the site now?
Yes, deploy now (Required), Cancel
If "Yes, deploy now": Invoke /deploy-site first, then continue to Phase 2.
If "Cancel": Stop.
1.4 Read Existing Web Roles
Read all .webrole.yml files from .powerpages-site/web-roles/ to inventory available roles. Note each role's id, name, adx_anonymoususersrole, and adx_authenticatedusersrole.
1.5 Check Existing Cloud Flows
Check .powerpages-site/cloud-flow-consumer/ for existing .cloudflowconsumer.yml files. For each file, read:
processid — the flow's workflowEntityId
name — the flow's display name
adx_CloudFlowConsumer_adx_webrole — assigned web role UUIDs
Store these as the already-registered flows list. These flows already have metadata and web roles configured but may need additional frontend integration on other pages or components.
1.6 Detect Frontend Framework
Read package.json to detect the framework (React, Vue, Angular, Astro). Note the framework and its conventions for Phase 7. See ${PLUGIN_ROOT}/references/framework-conventions.md for the detection mapping.
Output: Project root, site name, framework, available web roles, already-registered flows (with processid, name, and web roles)
Phase 2: List Available Flows
Goal: Fetch all Power Automate cloud flows that have a PowerPages trigger
Actions:
Run the list-cloud-flows script (reads environment from pac auth who internally):
This calls the Power Automate Flow RP API with the filter properties/definitionSummary/triggers/any(t: t/kind eq 'powerpages'). Results include:
Field
Source
Used for
id
properties.workflowEntityId
processid in YAML; URL in client-side API call
flowRpName
flow.name
Flow RP identifier
displayName
properties.displayName
Shown to user; written as name in YAML
description
properties.description
Shown to user
state
properties.state
Shown to user (Active/Draft)
Separate into two lists:
Unregistered flows: Flows whose id does NOT match any processid from Phase 1.5 — these need full setup (metadata + roles + client-side)
Already-registered flows: Flows whose id matches a processid from Phase 1.5 — these already have metadata and roles but can be integrated into additional pages/components
Handle errors:
Exit code 1 with auth message → prompt the user to run az login --allow-no-subscriptions
Zero flows from API (no flows with a PowerPages trigger exist at all) → tell the user that no Power Automate flows with a PowerPages trigger were found in this environment. Guide them to create a flow first:
"No Power Automate cloud flows with a PowerPages trigger were found in this environment. To use this skill, you first need to create a flow in Power Automate with the "When a Power Pages flow step is run" trigger, then run this skill again to connect it to your site."
Stop the workflow — do not continue to Phase 3.
Zero unregistered flows but already-registered flows exist → do not stop. Continue to Phase 3 with only the already-registered flows available (for additional frontend integration).
Output: List of unregistered flows and list of already-registered flows
Phase 3: Select Flows & Understand Scenarios
Goal: Understand the user's intent, suggest the most relevant flows (including already-registered ones for additional integration), let the user confirm or adjust, and determine the scenario for each selected flow
Actions:
3.1 Analyze User Intent & Suggest Flows
Before showing the full list, analyze the user's initial request ($ARGUMENTS) against both the unregistered flows and the already-registered flows. Match the user's described need to specific flows using display name, description, and scenario inference.
When matching intent, check already-registered flows first — the user may be asking to wire an existing flow into a new page or component, not register a new one.
If the user described a specific need (e.g., "add automation for the contact form", "connect the email notification flow"): Identify flows whose name or description closely match the request and present them as recommended picks, explaining why each is a good match. Also show the remaining flows as additional options in case the suggestion is wrong.
Based on your request, I recommend:
⭐ 1. Contact Form Submission — Sends an email when a contact form is submitted (Active)
→ Matches your request to add automation for the contact form
Other available flows:
2. Support Ticket Handler — Creates a case record from user input (Active)
3. Newsletter Signup — Adds the user's email to a mailing list (Draft)
If the user's request is generic (e.g., "add a cloud flow", "connect some flows"): Fall back to presenting the full list without recommendations.
Available flows:
1. Contact Form Submission — Sends an email when a contact form is submitted (Active)
2. Support Ticket Handler — Creates a case record from user input (Active)
3. Newsletter Signup — Adds the user's email to a mailing list (Draft)
Present both categories clearly when both exist:
New flows (not yet registered):
1. Newsletter Signup — Adds the user's email to a mailing list (Active)
Already registered (available for additional frontend integration):
2. Contact Form Submission — Already connected, can be wired into more pages
3. Support Ticket Handler — Already connected, can be wired into more pages
🚦 Gate (plan · add-cloud-flow:3.1.select-flows): Multi-select over discovered + already-registered flows. Drives the rest of Phases 4–7.
Trigger: Phase 2 list-cloud-flows returned at least one flow.
Why we ask: Wrong flows get registered (new .cloudflowconsumer.yml files written) or wrong existing flows get re-wired into the frontend.
Cancel leaves: Nothing — no YAML or client code written yet.
Use AskUserQuestion:
Question
Options
Which flows would you like to add or integrate? You can select from both new and already-registered flows.
(list or multi-select of flow names, with recommended flows pre-highlighted if applicable)
If more than 10 flows are available, ask the user to type names or numbers (comma-separated for multiple).
3.2 Tag Selected Flows
For each selected flow, tag it based on its source:
For each selected flow, identify its scenario from the name and description:
Scenario type
Examples
Who triggers it
Form submission
Contact form, feedback, survey
Authenticated or anonymous visitors
User self-service
Profile update, request, leave application
Authenticated users only
Admin action
Bulk processing, content approval, data export
Admins / specific roles only
Background / system
Scheduled sync, enrichment
Not triggered by portal users directly
<!-- not-a-gate: per-flow scenario clarification — data-gathering for Phase 4 role assignment; no destructive action -->
If a flow's scenario is unclear, use AskUserQuestion per flow:
Question
Context
What does "[flow name]" do on your site? Who triggers it?
Needed for role assignment
For integration-only flows, the scenario is still needed to guide where and how the flow is wired into the frontend (Phase 7).
3.4 Determine Client-Side Function Name Per Flow
For each flow, derive a camelCase function name for the client-side service:
Strip special characters and connector words from the display name
Example: "PowerPages -> Send an email notification (V3)" → sendEmailNotification
Example: "Contact Form Submission" → submitContactForm
For integration-only flows, check whether a trigger function already exists in the codebase (from a previous run of this skill). If it does, reuse that function name — do not create a duplicate. Only create a new function if one doesn't exist yet.
Output: Selected flows list, each with tag (new or integration-only), scenario, target audience, and client-side function name
Phase 4: Determine Web Roles
Goal: Propose the minimum set of web roles for each new flow based on its scenario
Skip for integration-only flows — these already have web roles assigned in their .cloudflowconsumer.yml. Do not re-propose or modify roles for them.
Actions:
4.1 Analyze Role Requirements Per Flow (New Flows Only)
Scenario
Recommended roles
Any visitor (including unauthenticated)
Anonymous Users (confirm — security implication)
Only logged-in users
Authenticated Users
Only specific groups
Custom role(s) matching the group
Do NOT assign all roles by default. Use the minimum set per flow. Different flows in the same batch can have different role sets.
4.2 Match Against Existing Roles
For each proposed role across all flows, check whether it exists in .powerpages-site/web-roles/. Mark roles as existing or proposed/new.
4.3 Compose Per-Role Reasoning
For each role assigned to each flow, write one sentence explaining why:
Authenticated Users on a profile form: "Only logged-in users can update their profile."
Anonymous Users on a contact form: "Unauthenticated visitors must be able to submit a contact request."
Blog Authors on an email flow: "Blog Authors are the primary actors who submit posts triggering this notification."
4.4 Flag Anonymous Roles
If any flow has Anonymous Users assigned, note this — the HTML plan renders a warning banner and the confirm step must explicitly surface it.
Output: Per-flow role sets with reasoning, list of roles that need creating
Phase 5: Review Plan
Goal: Render the HTML plan for all flows and get user approval before writing any files
Actions:
5.1 Build Plan Data
Assemble the plan JSON (kept in memory — not written to disk). Include all selected flows in CLOUD_FLOWS_DATA, distinguishing new from integration-only:
json
{
"SITE_NAME": "<site name>",
"PLAN_TITLE": "Cloud Flow Integration Plan",
"SUMMARY": "<N new flows + M integration-only flows, scenarios, key role assignments>",
"WEB_ROLES_DATA": [
{
"id": "<uuid or temp-id>",
"name": "<role name>",
"desc": "<description>",
"builtin": false,
"isNew": true,
"isAnonymous": false,
"color": "#0078d4"
}
],
"CLOUD_FLOWS_DATA": [
{
"flowId": "<workflowEntityId>",
"name": "<flow display name>",
"displayName": "<flow display name>",
"description": "<flow description>",
"state": "Active",
"tag": "new | integration-only",
"scenario": "<scenario type>",
"rationale": "<why this flow is being added or where it will be additionally integrated>",
"webRoles": [
{ "id": "<role-uuid>", "reasoning": "<why this role>" }
]
}
],
"RATIONALE_DATA": [
{ "icon": "⚡", "title": "<title>", "desc": "<reasoning>" }
]
}
For integration-only flows, webRoles should reflect the existing roles from the .cloudflowconsumer.yml (read-only — not being changed). The rationale should describe where the flow will be additionally integrated (e.g., "Wiring existing Contact Form flow into the support page").
The render script refuses to overwrite existing files. Before calling it, check if the default output path (<PROJECT_ROOT>/docs/cloud-flow-plan.html) already exists. If it does, choose a new descriptive filename based on context — e.g., cloud-flow-plan-contact-form.html, cloud-flow-plan-apr-2026.html. Pass the chosen name via --output.
Open the rendered file in the default browser (open on macOS, start on Windows, xdg-open on Linux).
5.3 Confirm with User
Give a brief CLI summary: number of flows, scenarios, role count, any anonymous-role warnings.
🚦 Gate (plan · add-cloud-flow:5.3.plan-approval): Final sign-off on the rendered HTML plan before any web role / .cloudflowconsumer.yml / client code is written.
Trigger: Phase 5.2 rendered the HTML plan.
Why we ask: Wrong web role assignments committed (especially Anonymous Users on auth-protected flows); orphaned YAML files in .powerpages-site/cloud-flow-consumer/.
Cancel leaves: Nothing — no YAML or frontend changes yet.
Use AskUserQuestion:
Question
Options
Review the cloud flow plan in the browser. Does it look correct?
Approve and implement (Recommended), Request changes, Cancel
If "Request changes": Ask what to change, update, re-render, and present again.
If "Cancel": Stop.
Output: User-approved plan for all flows
Phase 6: Create Metadata
Goal: Create web roles (if any are new) then write a .cloudflowconsumer.yml for every new flow in the approved plan
Skip for integration-only flows — these already have .cloudflowconsumer.yml and web roles. Do not recreate or modify their metadata. They will be handled in Phase 7 (client-side integration only).
If the approved plan contains onlyintegration-only flows (no new flows), skip this entire phase and proceed to Phase 7.
Actions:
6.1 Create Missing Web Roles
If the approved plan includes roles that do not yet exist (for new flows), invoke /create-webroles now.
After it completes, re-read .powerpages-site/web-roles/ to collect id values for all new roles.
6.2 Process Each New Flow
Repeat steps 6.3–6.4 for every new flow in the approved plan.
--fileSlug: lowercase display name, special characters replaced with hyphens, max 50 chars.
--flowName: display name written as-is into the name YAML field.
The generated YAML (PAC CLI code-site git format):
statecode/statuscode defaults omitted; empty strings written as ''
Fields alphabetically sorted
6.5 Git Commit
After all YAML files (and any new web roles) are created, do a single git commit. Include the HTML plan file (use the actual output path from the render script's JSON response).
Output: One .cloudflowconsumer.yml per new flow, committed (skipped for integration-only flows)
Phase 7: Client-Side Integration
Goal: Generate typed service code that calls each registered flow from the site's frontend
Cloud flows are invoked via an authenticated POST to /_api/cloudflow/v1.0/trigger/<workflowEntityId>. The request must include a CSRF token fetched from /_layout/tokenhtml, and the payload must be wrapped in an eventData key as a JSON-stringified string.
Actions:
7.1 Discover Existing Frontend Patterns
Use the Explore agent to scan the site:
"Check the Power Pages site frontend for existing patterns. Look for:
Any existing API service files in src/shared/, src/services/, src/api/, or similar
The framework (React / Vue / Angular / Astro) and its conventions (hooks, composables, services)
Any existing cloud flow calls (/_api/cloudflow/) already in the codebase — note which flows are already called and from which pages/components
Report all findings."
For integration-only flows, the Explore agent's findings in point 4 are critical — they reveal where the flow is already wired in, so the new integration targets a different page/component without duplicating existing call sites.
Show full SKILL.md (1,587 more words)Show less
7.2 Create or Update the Cloud Flow Service
Do not use the site's existing OData fetch wrapper for cloud flow triggers.
If the site has a centralized API client (e.g. powerPagesFetch) that targets the Dataverse Web API, do not use it here. Cloud flow trigger URLs (/_api/cloudflow/v1.0/trigger/...) are a different endpoint that does not accept OData-specific request headers. Using an OData wrapper will cause the request to fail.
Use direct fetch or an equivalent low-level HTTP client (for example, Angular's HttpClient) for cloud flow calls. Do not use any OData-specific wrappers or helpers that automatically add Dataverse Web API headers. You may reuse the site's existing CSRF token helper if one is exported — but perform the HTTP request via fetch or the chosen low-level client directly.
Based on the framework and existing patterns:
If the site already has an API service layer: add the new flow functions to it.
If no service layer exists: create src/services/cloudFlowService.{ts,js} (or framework equivalent).
For integration-only flows: if a trigger function already exists in the service file, do not create a duplicate — reuse it. Only add a new trigger function if the flow has no existing function in the codebase.
Service structure
REQUIRED for every flow trigger call — without these headers the request returns a 500 error:
__RequestVerificationToken: CSRF token fetched from /_layout/tokenhtml
X-Requested-With: XMLHttpRequest
The payload must be wrapped in eventData as a JSON-stringified string — this is the shape the Power Pages cloud flow endpoint expects:
The service file must contain a getCsrfToken helper and one trigger function per flow. If a getCsrfToken helper already exists in the codebase, reuse it; otherwise create it. Either way, every trigger function must call it and include both headers shown above.
CSRF helper (reuse existing or create):
typescript
async function getCsrfToken(): Promise<string> {
const res = await fetch('/_layout/tokenhtml');
const html = await res.text();
const match = html.match(/value="([^"]+)"/);
if (!match) throw new Error('CSRF token not found');
return match[1];
}
Per-flow trigger function (one per registered flow):
Custom hook useCloudFlow<Name>() wrapping the service function with loading/error state
src/hooks/useCloudFlow.ts
Vue
Composable useCloudFlow<Name>() with ref for loading/error
src/composables/useCloudFlow.ts
Angular
Injectable CloudFlowService that wraps the same raw fetch trigger function shown above (do not switch to HttpClient unless you preserve the exact headers and eventData payload shape)
src/app/services/cloud-flow.service.ts
Astro
Plain async utility functions (no framework wrapper needed)
src/utils/cloudFlow.ts
Group all flow functions together in one file. Do not create a separate file per flow.
7.3 Wire into UI
Read the relevant pages/components, add call sites, loading states, success/error feedback. Replace any placeholder or mock handlers that are meant to be backed by the flows.
For integration-only flows, this is the primary deliverable of the entire skill run. Identify the new target page or component where the flow should be integrated (based on the user's request and the scenario from Phase 3.3), import the existing trigger function, and wire it in with proper loading/error handling. Do not modify existing call sites that already work.
🚦 Gate (plan · add-cloud-flow:8.4.test): Post-deploy validation prompt — invokes /test-site to confirm the flow trigger endpoint returns 202/200.
Trigger: Deploy from the previous gate succeeded.
Why we ask: Skipping is harmless (manual test still possible); auto-invoking /test-site adds runtime and Playwright traffic.
Cancel leaves: Nothing — deploy has already completed.
If "Yes": Invoke /deploy-site. After it succeeds, use AskUserQuestion:
Question
Options
Would you like to run /test-site to verify the cloud flow integration end-to-end?
Yes, run tests, No, I'll test manually
If "Yes, run tests": Invoke /test-site with context: test the scenario where the flow API is triggered — perform the action on the site (e.g. submit the form, click the button) that calls /_api/cloudflow/v1.0/trigger/<workflowEntityId>, confirm the request returns 202 Accepted or 200 OK, and check Power Automate run history to confirm the flow executed.
If "No": Remind the user that flows and client-side calls won't work until deployed, and suggest running /test-site later to validate the flow trigger works correctly in the deployed environment.
8.5 Post-Deploy Notes
Flow trigger URL: Populated automatically by the portal runtime after deploy. Check Power Pages design studio to confirm.
Testing: Use /test-site to verify the integration. Sign in as a user with the assigned role, trigger the flow action, confirm /_api/cloudflow/v1.0/trigger/<id> returns 202/200, and check Power Automate run history.
Anonymous flows: Test in an incognito window.
Role changes: Edit adx_CloudFlowConsumer_adx_webrole in the YAML, then redeploy.
Adding more flows later: Run this skill again — new flows are available for full setup, and already-registered flows are available for additional frontend integration on other pages.
Important Notes
Throughout All Phases
Multiple flows: Process all flows in the approved plan before committing or moving to Phase 7
Minimum roles: Never assign all roles by default; use only what the scenario requires
Anonymous Users: Always surface explicitly in plan and confirm step
Trigger URL blank at creation: Expected — set by the portal runtime at deploy time
fileSlug vs flowName: --fileSlug is the filename only; --flowName is the name YAML field
Client service file: Group all flows into one service file, not one file per flow; always wire into the UI without asking
CSRF headers are mandatory: Every flow trigger function must call getCsrfToken() and send both __RequestVerificationToken and X-Requested-With: XMLHttpRequest — omitting either causes a 500 error
Payload shape: The request body must be JSON.stringify({ eventData: JSON.stringify(payload) }) — the cloud flow endpoint expects the payload nested under an eventData key as a double-stringified JSON string
Integration-only flows: Already-registered flows skip Phases 4–6 (roles and metadata). Their primary deliverable is new frontend call sites in Phase 7. Do not modify existing .cloudflowconsumer.yml files or web role assignments for these flows. Reuse existing trigger functions when they already exist in the service file — only add new UI call sites.
No flows available: When no flows with a PowerPages trigger exist in the environment (zero results from API), stop the workflow and direct the user to create a flow in Power Automate with the "When a Power Pages flow step is run" trigger first.
Key Decision Points (Wait for User)
Phase 1.3: Deploy now or cancel (if .powerpages-site missing)
Phase 3.1: Which flows to add or integrate (new and/or already-registered)
Phase 3.3: Clarify scenario / audience per flow (if unclear)
Phase 5.3: Approve HTML plan before writing any files
Phase 8.4: Deploy now or later
Progress Tracking
Before starting Phase 1, create a task list with all phases using TaskCreate:
Task subject
activeForm
Description
Verify prerequisites
Verifying prerequisites
Locate project, confirm .powerpages-site, read web roles and existing flows, detect framework
List available flows
Fetching cloud flows
Call Flow RP API to get flows with PowerPages trigger
Select flows and understand scenarios
Gathering scenario details
User picks one or more flows; determine scenario and function names
Determine web roles
Analyzing role requirements
Propose minimum roles per flow with per-role reasoning
Review plan
Reviewing plan with user
Render HTML plan for all flows and get approval
Create metadata
Writing cloud flow metadata
Create missing web roles then write YAML for each flow
Client-side integration
Generating client-side code
Create typed service functions and wire into UI
Verify and summarize
Validating and summarizing
Validate YAMLs, record skill usage, present summary, offer deployment
Mark each task in_progress when starting and completed when done via TaskUpdate.
Add Cloud Flow next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
Add Cloud Flow compared with similar skills
Skill
Stars
Used in
Tokens
Auto-check
Licence
Repo updated
Add Cloud Flow this skillmicrosoft/power-platform-skills
Query official Microsoft documentation to find concepts, tutorials, and code examples across Azure, .NET, Agent Framework, Aspire, VS Code, GitHub, and more.
Kysy virallista Microsoftin dokumentaatiota löytääksesi käsitteitä, opetusohjelmia ja koodiesimerkkejä Azureen, .NET:iin, Agent Frameworkiin, Aspireen, VS Codeen, GitHubiin ja muihin liittyen.
Inspects and configures the security headers a Power Pages site sends to browsers — Content Security Policy, frame and clickjacking protection, cross-origin sharing, cookie behavior, and related…
Integrates Power Automate cloud flows into a Power Pages site. Add Cloud Flow is an agent skill from microsoft/power-platform-skills, published by the product's own GitHub organization. Integrates Power Automate cloud flows into a Power Pages site.
When should I use Add Cloud Flow?
Add Cloud Flow fits situations like: the user wants to add; link a Power Automate cloud flow to their site.
How do I install Add Cloud Flow in Claude Code?
Run `npx skills add microsoft/power-platform-skills --skill add-cloud-flow -a claude-code`. Or copy the skill folder (plugins/power-pages/skills/add-cloud-flow in microsoft/power-platform-skills) into .claude/skills/add-cloud-flow in your project. Claude Code loads it when a task matches its description.
How do I install Add Cloud Flow in Codex?
Run `npx skills add microsoft/power-platform-skills --skill add-cloud-flow -a codex`. Or copy the skill folder (plugins/power-pages/skills/add-cloud-flow in microsoft/power-platform-skills) into .agents/skills/add-cloud-flow in your project. Codex loads it when a task matches its description.
Can I use Add Cloud Flow in Cursor, Gemini CLI or GitHub Copilot?
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add microsoft/power-platform-skills --skill add-cloud-flow -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/add-cloud-flow, .gemini/skills/add-cloud-flow, .github/skills/add-cloud-flow and .opencode/skills/add-cloud-flow in your project.
What does Add Cloud Flow need to run?
Going by SKILL.md and its folder, Add Cloud Flow needs JavaScript for the scripts in its folder and the command-line tools its instructions call (node and az). Our summary lists: Node.js. Its frontmatter pre-approves these tools: Read, Write, Edit, Bash, Grep, Glob, AskUserQuestion, Skill, Task, TaskCreate, TaskUpdate, TaskList.
Does Add Cloud Flow access the network?
SKILL.md names 1 domain. As links in the text: make.powerautomate.com. This is read from the text; nothing was executed.
Is Add Cloud Flow safe to install?
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
What licence does Add Cloud Flow use?
Add Cloud Flow is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
How many tokens does Add Cloud Flow use?
About 8.8k tokens (SKILL.md is roughly 35k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
What are the alternatives to Add Cloud Flow?
Skills that share tags, products or a category with Add Cloud Flow: Azure Openai To Responses (microsoft/ai-agents-for-beginners, 77k stars), Azure Openai To Responses (microsoft/ai-agents-for-beginners, 77k stars), Microsoft Docs (microsoft/ai-agents-for-beginners, 77k stars) and Azure Openai To Responses (microsoft/ai-agents-for-beginners, 77k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Who maintains Add Cloud Flow?
microsoft (a GitHub organization, an official publisher) maintains it in microsoft/power-platform-skills, which has 967 GitHub stars. The repository holds 87 skills in this directory. The repository was last updated on October 6, 2026.