power-automate
Deploys solution-aware Power Automate flows via Dataverse API.
Install
mkdir -p .claude/skills/power-automate && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/17909" && unzip -o skill.zip -d .claude/skills/power-automate && rm skill.zipInstalls to .claude/skills/power-automate
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Power Automate クラウドフローを Dataverse Web API(workflow テーブル)でソリューション対応で作成・デプロイする。接続参照パターンで API 有効化を100%成功させる。Key capabilities
- →Create and deploy solution-aware cloud flows
- →Ensure 100% API activation success using connection references
- →Handle different authentication scopes for Flow, PowerApps, Graph, and Dataverse APIs
- →Implement idempotent deployment patterns for flows
How it works
The skill deploys Power Automate cloud flows using Dataverse Web API and connection references, ensuring reliable activation by addressing known API limitations.
Inputs & outputs
When to use power-automate
- →Deploy cloud flows
- →Activate flow with connection references
- →Manage automation workflows
About this skill
Power Automate クラウドフロー構築スキル
クラウドフロー開発は Flow agent MCP SERVER(FlowAgent)を第一選択とする。 MCP が利用できない環境では Dataverse Web API(workflow テーブル)経由のフォールバックを使う。
推奨: Flow agent MCP SERVER を使う(第一選択)
FlowAgent MCP SERVER を使うと、VS Code の GitHub Copilot Chat(エージェントモード)からフローを自然言語で構築・編集・デバッグできる。
| 比較項目 | Flow agent MCP(推奨) | Dataverse Web API(フォールバック) |
|---|---|---|
| フロー作成 | 自然言語で指示するだけ | Python スクリプトを手書き |
| 編集 | アクション単位のサージカル編集 | 定義 JSON を全置換 |
| デバッグ | 失敗ランを自律診断 | ログを手動確認 |
| 接続解決 | 自動検索・自動紐づけ | PowerApps API + 手動確認 |
| セットアップ | スクリプト 1 本で完結 | Python 環境 + 複数スコープのトークン |
★ FlowAgent MCP サーバー本体(
server/mcp.mjs)は Claude Code / GitHub Copilot CLI 用の プラグインマーケットプレイス(microsoft/power-platform-skills)で配布されているが、 VS Code の GitHub Copilot Chat は/plugin marketplace addコマンドや Claude 形式の.mcp.json(mcpServersキー)を解釈できない。VS Code は独自の MCP クライアントを持ち、 ワークスペース直下の.vscode/mcp.json(serversキー +type: "stdio")を読む。 そのため本スキルではmicrosoft/power-platform-skillsリポジトリを git スパースチェックアウトで 直接取得し、VS Code 形式で登録する(プラグインマーケットプレイスは経由しない)。
1. 前提
- Node.js 20+(FlowAgent v3.0.0 以降は MCP SDK v2 のため Node.js 18 では起動できない)
- git(
microsoft/power-platform-skillsのplugins/power-automateを取得するために使用) - Azure CLI(
az login— MCP サーバー自身の認証に必要。auth_helper.pyとは別の資格情報ストア)
2. 認証 + .vscode/mcp.json 生成(auth_helper を使用)
.env に DATAVERSE_URL / SOLUTION_NAME を設定してからスクリプトを実行する。
スクリプトが行うこと:
| 処理 | 内容 |
|---|---|
| Node.js 確認 | 20+ でなければ中断 |
| az login 確認 | az account list で対象テナントの既存キャッシュを確認 → あれば az account set のみ(対話不要)。無い場合のみ案内を表示 |
| auth_helper 認証 | Dataverse / Flow API トークンを取得・キャッシュ(Python スクリプト用) |
| プラグイン取得 | microsoft/power-platform-skills を git スパースチェックアウトで ~/.power-platform-skills に取得(マシン全体で共有・自動更新) |
| .vscode/mcp.json 生成 | 既存エントリを保持しつつ FlowAgent を追記(VS Code 形式) |
python .github/skills/power-automate/scripts/setup_flow_mcp.py
内容確認だけしたい場合:
python .github/skills/power-automate/scripts/setup_flow_mcp.py --dry-run
.vscode/mcp.jsonは環境依存パスを含むためコミットしない(.vscode/*は標準.gitignoreで除外済み)。
3. VS Code に認識させる
- コマンドパレット →
MCP: List ServersでFlowAgentが表示されるか確認(表示されない場合はウィンドウをリロード) FlowAgentを Start- GitHub Copilot Chat(エージェントモード)で自然言語で指示する
4. フローを開発する
| 指示例 | 動作 |
|---|---|
| 「承認フローを作って。申請レコード作成時に承認者へメール送信」 | build-flow スキルがフローを自律生成・デプロイ |
| 「先ほどのフローが失敗した原因を教えて」 | diagnose-flow スキルが失敗ランを深掘り診断 |
| 「このフローのメール本文を変更して」 | edit-flow スキルがアクション単位で編集 |
5. ソリューションへの追加・有効化
MCP で作成したフローをソリューションに追加するには manage-flows スキルで
solutionUniqueName を指定するか、以下のスクリプトで補完する。
第 1 引数にフロー ID を直接渡す(--workflow-id のようなオプション形式ではない)。
python .github/skills/power-automate/scripts/add_flow_to_solution.py <flow-id>
ソリューションに追加した直後の publish_flow(有効化)が
CannotStartUnpublishedSolutionFlow で失敗することがある。この場合の原因切り分けと
解消手順、および run_flow によるテスト実行時の制約は
references/flow-agent-mcp.md の該当節を参照。
詳細な設定・トラブルシュートは references/flow-agent-mcp.md を参照。
コネクター接続は 接続作成標準 に従う。 Power Apps API で Connected 接続を先に検索し、存在しない場合だけ VS Code 統合ブラウザで 接続パラメーターを自動入力する。ユーザー操作は OAuth のアカウント選択・同意に限定し、 Connected 確認後の接続参照・フロー作成・有効化・テストは API で行う。 OAuth 完了後は子ページを自動で閉じる。自動クローズできない場合は Connected を API で確認してから、 その画面を閉じてよいことをユーザーへ明示する。
HTTP with Microsoft Entra ID の内部 API、要求本文、権限の実測値は
非公開接続 API の実測結果 を参照する。
API アプローチ(Flow agent MCP が使えない場合)
以下は MCP サーバーが利用できない環境向けの フォールバック手順。 Python スクリプトで Dataverse Web API を直接操作する。
定義を送信する前に scripts/validate_flow_definition.py の
assert_base64_content_contract() を必ず実行する。JSON の contentBase64 に実行時の本文を渡す場合は
@base64(...) で明示的にエンコードし、コネクタ出力型の違いによる実行時失敗をデプロイ前に止める。
Dataverse アクションを含む場合は、参照列をメタデータ API で取得し、
assert_required_dataverse_columns() で列の存在を確認してから既存フローを変更する。
Lookup を @odata.bind で書き込む場合は ManyToOneRelationships から
ReferencingEntityNavigationPropertyName を取得し、require_navigation_property() で検証する。
Lookup属性の論理名や表示名からナビゲーションプロパティ名を推測しない。
核心原則: 接続参照(Connection Reference)が有効化成功の鍵
重要な既知制約(2026-05 検証済み)
フロー有効化で AzureResourceManagerRequestFailed が出る根本原因:
→ 接続参照なしで接続 ID を直接埋め込んだ場合、authenticatedUserObjectId が不足する
解決策: 接続参照テーブルに正しい接続を紐づけてから、フロー定義で参照する
→ 100% API 有効化に成功する
❌ 旧パターン(接続 ID 直接指定 → 有効化失敗のリスクあり):
"connectionReferences": {
"shared_commondataserviceforapps": {
"connectionName": "some-connection-id",
"source": "Embedded",
...
}
}
✅ 新パターン(接続参照経由 → 100% 有効化成功):
"connectionReferences": {
"shared_commondataserviceforapps": {
"runtimeSource": "embedded",
"connection": {
"connectionReferenceLogicalName": "prefix_connref_logical_name"
},
"api": {"name": "shared_commondataserviceforapps"}
}
}
前提: 設計フェーズ完了後にデプロイに入る(必須)
フローをデプロイする前に、フロー設計をユーザーに提示し承認を得ていること。
設計提示時に含める内容:
| 項目 | 内容 |
|---|---|
| フロー名 | フローの名前と目的 |
| トリガー | 何をきっかけに実行するか(レコード変更時 / スケジュール / 手動等) |
| アクション一覧 | 条件分岐・メール送信・Teams 通知・データ更新等 |
| 必要な接続 | 使用するコネクタ(Dataverse, Office 365 Outlook, Teams 等) |
| 通知先・本文 | メールの宛先・件名・本文の概要 |
フロー: 設計提示 → ユーザー承認 → デプロイスクリプト実行
大前提: 一つのソリューション内に開発
Dataverse テーブル・Code Apps・Power Automate フロー・Copilot Studio エージェントは すべて同一のソリューション内 に含める。
SOLUTION_NAME=ProjectName ← .env で定義。全フェーズで同じ値を使用
PUBLISHER_PREFIX=prefix ← ソリューション発行者の prefix
- フロー作成時は
MSCRM.SolutionUniqueNameヘッダー必須 - 接続参照もソリューション内に作成(
MSCRM.SolutionUniqueNameヘッダー)
認証: Python スクリプトの認証は
standardスキルのauth_helper.pyを使用。from auth_helper import get_token, get_session, api_get, api_post, api_patch, api_delete, retry_metadata, DATAVERSE_URLで利用する。
- ソリューション外のフローは「マイフロー」に入り、ALM 管理できない
必須要件
認証スコープが異なる【必須】
Flow API: https://service.flow.microsoft.com/.default ← 環境 ID 解決・/start
PowerApps API: https://service.powerapps.com/.default ← 接続検索用
Graph API: https://graph.microsoft.com/.default ← ユーザー情報用
Dataverse API: https://{org}.crm7.dynamics.com/.default ← workflow テーブル操作・接続参照作成
接続は Connected 状態で環境内に必要
1. Power Apps API で Connected 接続を自動検索する
2. 見つからない場合だけ、VS Code 統合ブラウザで接続を仮作成する
3. ユーザーは OAuth のアカウント選択・同意だけを行う
4. Connected を API で検証し、接続 ID を接続参照へ設定する
auth_helper の既定クライアントには Connectivity.Connections.Write がないため、
新規接続の仮作成はメーカーポータル自身の認証済み API 呼び出しを利用する。
Microsoft Dataverse も OAuth 接続では同意フローを使用する。詳細は
接続作成標準 を参照する。
f-string と式の二重ブレース問題
# ❌ f-string 内の Power Automate 式({} エスケープが複雑でバグの原因)
body = f"@{{triggerOutputs()?['body/{PREFIX}_name']}}"
# ✅ f-string を使わない部分は通常文字列で構築
body_template = "@{triggerOutputs()?['body/{prefix}_name']}"
body = body_template.replace("{prefix}", PREFIX)
# ✅ または変数だけ f-string で、式部分は連結
body = f"<td>@{{triggerOutputs()?['body/{PREFIX}_name']}}</td>"
# ↑ 正しく動くが読みにくい。1箇所だけならOK、複数箇所は避ける
べき等デプロイパターン
# 既存フロー検索 → 無効化 → 削除 → 再作成
existing = api_get(f"workflows?$filter=name eq '{FLOW_NAME}' and category eq 5&$select=workflowid,statecode")
for f in existing.get("value", []):
wf_id = f["workflowid"]
if f["statecode"] == 1: # Active → Draft
api_patch(f"workflows({wf_id})", {"statecode": 0, "statuscode": 1})
time.sleep(2)
api_delete(f"workflows({wf_id})")
time.sleep(3)
# → 新規作成へ進む
Dataverse Webhook トリガーのフローは /start 必須(★ 検証済み教訓)
❌ statecode=1 だけで終わる
→ Dataverse Create/Update トリガー(webhook 型)で webhook 登録が完了せず発火しない
✅ statecode=1 + statuscode=2 の後に /start を明示的に呼ぶ:
POST .../providers/Microsoft.ProcessSimple/environments/{env-id}/flows/{workflow-id}/start?api-version=2016-11-01
(Flow API スコープ: https://service.flow.microsoft.com/.default)
GrantAccess / RevokeAccess は PerformUnboundAction で呼ぶ(★ 検証済み教訓)
❌ PerformBoundAction + GrantAccess / RevokeAccess
→ "Bound action 'GrantAccess' is not found" (BadRequest)
✅ PerformUnboundAction + actionName + Target パラメータ
→ Draft 作成・有効化に成功(2026-05-02 検証済み)
補足:
- @odata.type をそのまま書くと式として解釈されるため @@odata.type でエスケープが必要
- connectionReferences は runtimeSource: "embedded" + connectionReferenceLogicalName で渡す
- payload(Target / PrincipalAccess / Revokee)は Compose アクションに分離すると
Power Automate UI での編集性が上がる
AI Builder アクションは API で Draft 作成・有効化ともに可能
検証結果(operationId: aibuilderpredict_customprompt):
✅ フロー作成(Draft) — AI Builder アクション含む定義の POST は成功
✅ フロー有効化(Activate) — statecode=1 の PATCH も成功
推奨パターン:
✅ aibuilderpredict_customprompt を使用(PerformBoundAction は不可)
✅ connectionReferences に AI Builder 用 Dataverse 接続参照を別キーで登録
CN_DV_AI = "shared_commondataserviceforapps_1"
✅ runtimeSource: "embedded" + connectionReferenceLogicalName でソリューション対応
✅ parameters: recordId(AI Model ID), item/requestv2/... で入力を渡す
✅ AI 出力パス: body/responsev2/predictionOutput/text
NG パターン:
❌ PerformBoundAction / PerformUnboundAction + msdyn_PredictByReference
→ InvalidOpenApiFlow で作成自体が失敗する
Teams PostMessageToConversation の注意
★ チャネル投稿(Channel):
❌ body/subject パラメータを指定しない
→ PostMessageToConversation の operationSchema に body/subject は存在しない
→ 指定するとフロー有効化時に InvalidOpenApiFlow (0x80060467) が発生
→ エラーメッセージに具体的なパラメータ名が出ないため原因特定が困難
✅ 使用可能なパラメータ:
poster, location, body/recipient/groupId, body/recipient/channelId, body/messageBody
★ 1:1 チャット(Chat with Flow bot):
✅ location は "Chat with Flow bot"
✅ body/recipient にメールアドレス(文字列)を指定
✅ host.connection キーを使用(connectionName ではない)
❌ body/recipient/to は存在しない → ExtraParameter で InvalidOpenApiFlow
❌ Dataverse workflows テーブルへの直接 INSERT → 接続認証不良で Runtime エラー
✅ デプロイは Flow API 経由を推奨
詳細は trigger-action-patterns.md の
「Teams 1:1 チャット投稿 — Chat with Flow bot」セクション参照
Powe
Content truncated.
When not to use it
- →When the flow design has not been approved by the user
- →When attempting to automatically create connections via API
- →When using f-strings for Power Automate expressions with complex escaping
Limitations
- →API for automatic connection creation is not possible
- →Flow API, PowerApps API, Graph API, and Dataverse API have different authentication scopes
- →Dataverse Webhook trigger flows require an explicit /start call for webhook registration
How it compares
This skill focuses on a connection reference pattern for flow activation, which guarantees 100% API activation success, unlike direct connection ID embedding.
Compared to similar skills
power-automate side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| power-automate (this skill) | 0 | 2mo | Caution | Advanced |
| customerio-deploy-pipeline | 1 | 1mo | Caution | Intermediate |
| agent-release-manager | 0 | 7mo | Review | Intermediate |
| stacks-buddy | 0 | 5mo | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by geekfujiwara
View all by geekfujiwara →You might also like
customerio-deploy-pipeline
jeremylongshore
Deploy Customer.io integrations to production. Use when deploying to cloud platforms, setting up production infrastructure, or automating deployments. Trigger with phrases like "deploy customer.io", "customer.io production", "customer.io cloud run", "customer.io kubernetes".
agent-release-manager
ruvnet
Agent skill for release-manager - invoke with $agent-release-manager
stacks-buddy
stacksjs
Use when working with the Stacks CLI (buddy/bud/stacks/stx) — understanding all 50+ commands with their flags and options, adding custom commands, the make:* scaffolding commands, development server commands, build commands, deployment commands, email/mail commands, environment management, or domain
fencang-release
Aiweline
>-
agent-workflow-automation
ruvnet
Agent skill for workflow-automation - invoke with $agent-workflow-automation
project-os
Peiiii
AI project OS for autonomous loop, automated orchestration, and rule-driven execution.