Power Automate MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Power Automate MCPlist my personal cloud flows"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Power Automate MCP
A local MCP server that lets an AI agent inspect and edit your personal Power Automate cloud flows — authenticated with your own Microsoft account, with no admin consent and no paid subscription.
It exists because the hosted alternatives charge a monthly fee to wrap an API that Microsoft already exposes to your account for free — and because the Power Automate portal is a poor interface when you would rather describe the change and let an agent apply it under guardrails. This repo is the reverse-engineering writeup of how that API actually works, packaged as a working tool.
Personal project, provided as-is. Read the reliability note and docs/SECURITY.md before depending on it.
Not affiliated with or endorsed by Microsoft.
The interesting part: how it authenticates without asking IT
Every "manage Power Automate from code" tutorial tells you to register an app in
Entra ID and get an admin to consent to Dynamics CRM user_impersonation or
Flows.Manage.All. In a locked-down corporate tenant that request is a
non-starter — it grants a standing service principal, and admins (rightly) say
no.
This project sidesteps that entirely by using a public first-party client ID that Microsoft ships for interactive tooling:
51f81489-12ee-4a9e-aaae-a2591f45987d ("Dynamics 365 Example Client", of XrmToolBox fame)Driven through the OAuth 2.0 device-code grant, this is a delegated login: the token carries your identity and your permissions, there is no service principal for anyone to approve, and no consent screen appears. You can talk to Power Automate from your laptop with exactly the rights you already have in the portal — nothing more, nothing less.
The token audience has one non-obvious quirk worth documenting:
https://service.flow.microsoft.com//user_impersonation
^^ two slashes, on purposeThe legacy resource URI ends in a slash and the v2 scope syntax appends
/user_impersonation, producing the double slash. Some tenants reject the
single-slash form. That one string is the difference between a working login and
an opaque AADSTS error.
Related MCP server: MCP Power Automate
The other interesting part: two APIs that see different flows
There are two REST backends and they are not interchangeable:
|
| |
Status | Undocumented, unsupported | Official, documented ( |
Sees personal flows | Yes | No — 404s without Dataverse |
Sees solution flows | Yes | Yes |
What we use it for | Everything (personal flows) | Wired in, dormant |
The lesson that cost the most research: the supported API cannot see personal flows at all. It requires the flow to live in a Dataverse solution. So any tool that manages the flows a normal user creates in the portal — including every paid MCP — has no choice but to ride the unsupported service API. This project makes that trade-off explicit rather than hiding it.
src/client/flow-api.ts keeps both base URLs behind one switch, so a flow that
later moves into a solution (or a future where the service API finally breaks)
is a one-constant change, not a rewrite.
Reliability note (read this)
api.flow.microsoft.com is undocumented and unsupported by Microsoft. It
can change shape or disappear without notice, and this tool will break when it
does. That risk is precisely what the paid services charge to absorb on your
behalf. For a personal tool where you fix things yourself, it is a fine trade.
For anything load-bearing, it is not. Choose accordingly.
Everything runs as you. If you lose access to the account, the tool stops working — there is no service identity behind it.
Install
Requirements: Node 18+ (for built-in fetch) and pnpm. A Microsoft
work/school account that can use Power Automate — nothing more.
git clone https://github.com/karenrebecag/PowerAutomate_MCP.git
cd PowerAutomate_MCP
pnpm install
pnpm buildCredentials — sign in once
There is no config file to edit and no secret to paste. Authentication is an interactive device-code login against your own Microsoft account:
pnpm loginIt prints a URL and a short code:
Power Automate MCP — sign in
1. Open: https://microsoft.com/devicelogin
2. Code: ABCD-EFGH
Waiting for you to finish signing in...Open the URL, enter the code, sign in with the account whose flows you want to
manage, and approve. On success a refresh token is written to .pa-token
(permissions 0600, gitignored). The server mints short-lived access tokens
from it automatically — you won't be asked again until it expires (~90 days of
inactivity). To switch accounts or recover from an expired token, just re-run
pnpm login.
Optional environment variables
Variable | Default | When to set it |
|
| Pin a specific tenant GUID if your account belongs to several. |
|
| Store the refresh token somewhere else. |
Verify (optional but recommended)
pnpm probe runs Phase 0 — it calls every read endpoint against your tenant
and dumps the real responses to scratch/ (gitignored). If a route 404s on your
environment you'll see it here rather than mid-use. Nothing it does writes.
pnpm probeRegister with your MCP client
Add the server to your client's config. For Claude Code that's ~/.mcp.json:
{
"mcpServers": {
"power-automate": {
"command": "node",
"args": ["/absolute/path/to/PowerAutomate_MCP/dist/index.js"]
}
}
}Use an absolute path to dist/index.js. The server finds .pa-token
relative to its own location, so no working directory or env needs to be set in
the client. Restart the client (or reconnect the server) and the seven tools
appear. A quick check from the terminal without a client:
printf '%s\n%s\n%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"c","version":"1"}}}' \
'{"jsonrpc":"2.0","method":"notifications/initialized"}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' \
| node dist/index.jsTools
Tool | Writes? | What it does |
| no | Every environment the account can see. Start here for the environment ID. |
| no | Cloud flows in an environment (summary fields). |
| no | Full editable definition + connection references. |
| no | Recent run history: status, code, timing. |
| no | Per-action breakdown of one run; follows inputs/outputs links for failed actions. The debugging view. |
| yes | Start / stop a flow. Previews unless you pass |
| yes | Create or edit a flow from a definition object. |
Typical agent workflow
Inspect / debug a failure
list_environments
list_flows(environmentId)
get_flow_runs(environmentId, flowId)
get_run_actions(environmentId, flowId, runName) → see which action failedChange a definition safely
get_flow(environmentId, flowId) → copy properties.definition
… edit the definition object …
create_or_update_flow(..., dryRun: true) → default; shows wouldSend
create_or_update_flow(..., dryRun: false) → only after explicit OKBoth write tools refuse to mutate anything until you opt in explicitly
(dryRun: false / confirm: true). Treat that as a feature, not a nuisance —
one bad definition can break a live automation.
Example conversation (what this is for)
You: Why did "Notify sales on new lead" fail this morning?
Agent: (list_environments → list_flows → get_flow_runs → get_run_actions) The run at 09:14 failed on action
HTTP_To_CRMwith 401. The token connection reference is still present on the flow; the downstream API rejected the call.You: Turn the flow off until we fix the connection.
Agent: (set_flow_state preview → confirm: true after you approve) Flow stopped.
You never open the Power Automate designer for that loop. The agent uses the same permissions you already have in the portal.
Project layout
src/
auth/ device-code login + silent refresh (the interesting bit)
client/ thin HTTP wrapper over the two REST backends
core/ shared MCP result helpers
tools/ one file per MCP tool (added after Phase 0 confirms shapes)
server.ts MCP server wiring
index.ts stdio transport entry point
scripts/
probe-endpoints.ts Phase 0 reconnaissance — run before trusting any tool
docs/
SECURITY.md tokens, disk artifacts, blast radius
DEVELOPMENT.md how to extend tools without guessing routesHow it was built (spec / probe-driven)
Phase 0 —
pnpm probehits read routes on a live tenant and saves real JSON underscratch/(gitignored).Tools are typed and implemented only against those shapes.
Routes that 404 or look wrong are dropped (e.g. standalone
list_connectionsis not in v1; refs still appear onget_flow).Writes ship with preview defaults so an agent cannot apply a definition on the first try by accident.
Details: docs/DEVELOPMENT.md.
Status
Working. Seven tools (five read, two write), each shaped against responses
captured by Phase 0 on a live tenant. pnpm verify (typecheck + lint + format +
tests) is the local gate.
Not in v1: delete flow, desktop flows, tenant admin APIs, standalone connection listing.
Documentation
Doc | Contents |
Token file, delegated blast radius, what not to commit | |
Probe-first workflow, scripts, adding tools | |
Hard rules for coding agents working in this repo |
License & intent
MIT. Personal, educational reverse-engineering project. Shared so others can learn how this API works and build their own personal tooling on top of it. Use within your own account and your organization's policies.
Not affiliated with or endorsed by Microsoft.
Available Tools
7 toolscreate_or_update_flowA
Create a new flow or update an existing one from a definition object. dryRun is the default — pass dryRun:false to actually write. Get the definition shape from get_flow.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Default true — preview only. Pass false to actually write. | |
| flowId | No | Flow ID to update. Omit to CREATE a new flow. | |
| definition | Yes | The workflow definition object (properties.definition from get_flow). | |
| displayName | No | Display name. Required when creating. | |
| environmentId | Yes | Environment ID. | |
| connectionReferences | No | Connection references map (properties.connectionReferences from get_flow). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false, so a write is expected, but the description adds a crucial behavioral detail—the write is skipped by default and only happens when dryRun:false is passed. It does not disclose overwrite semantics or potential side effects beyond those annotations, but the default behavior is important and clearly stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. The main operation is front-loaded, and the dryRun default and definition source reference are compactly included.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create-or-update tool with no output schema, the description covers the essential action, the write-default safety mechanism, and how to obtain the definition shape. It does not explicitly explain update-discovery behavior and id handling, but those are largely covered by parameter schema and the description as a whole is sufficient for basic usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description does not need to restate parameter meanings. It adds a light mention of dryRun default and references get_flow for the definition shape, both also reflected in the schema, so it provides marginal additional value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and object: 'Create a new flow or update an existing one from a definition object.' It clearly states both the operation and the resource and distinguishes this from get_flow pointing to a definition source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage guidance: dry-run is the default and passing dryRun:false performs the actual write, and it directs the user to get_flow for the definition shape. It does not explicitly enumerate alternatives or when not to use this tool, but the context is fairly unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_flowARead-only
Full flow definition (triggers, actions, parameters) and connection references.
| Name | Required | Description | Default |
|---|---|---|---|
| flowId | Yes | Flow ID (the `name` field from list_flows). | |
| environmentId | Yes | Environment ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the detail that connection references are included, which is useful, but it does not disclose behavioral details such as response shape, error cases, or whether the flow is executed. This is acceptable given the annotations but not exceptional.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, information-dense sentence that front-loads the core purpose and enumerates the key contents without filler. Every word contributes to the agent's understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-by-ID tool, the description adequately covers what the tool returns: full flow definition and connection references. There is no output schema, but the description mitigates this by naming the major response components. It does not mention error behavior or prerequisites, but those are not critical for this low-complexity operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both environmentId and flowId are fully documented in the input schema, including the note that flowId corresponds to the name field from list_flows. The description adds no additional parameter-level meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the exact resource and scope: a full flow definition including triggers, actions, parameters, and connection references. This clearly distinguishes the tool from siblings like get_flow_runs and get_run_actions, which focus on runs rather than definitions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'full flow definition' makes the intended use obvious: retrieve the complete definition of one flow rather than a list of flows or run-level data. It does not explicitly name alternatives or list exclusions, but the scope is clear enough for an agent to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_flow_runsBRead-only
Recent run history for a flow: status, code and timing per run.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Max runs (default 20). | |
| flowId | Yes | Flow ID. | |
| environmentId | Yes | Environment ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds the return fields but does not disclose ordering, freshness, pagination behavior, or any caveats about the returned history.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence states the resource and the key output dimensions without filler. Every word contributes to understanding what the tool does.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with fully documented parameters, the description is mostly complete. It mentions the key returned aspects, though it could have added ordering or recency behavior; 'Recent' plus the top parameter makes this workable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with flowId, environmentId, and top all individually documented. The description adds no parameter-level meaning beyond restating the general concept, so the schema carries the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific resource (flow run history) and the data it returns (status, code, timing per run). It is clear enough to distinguish from get_flow, though it does not explicitly contrast with the similar sibling get_run_actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus alternatives like get_flow or get_run_actions, and no mention of prerequisites or context. Usage is only implied by the tool name and the general description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_run_actionsARead-only
Per-action breakdown of one run — the debugging view. Follows inputs/outputs links for failed actions by default (or a named action, or all).
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | Run ID from get_flow_runs. | |
| flowId | Yes | Flow ID. | |
| includeIO | No | Follow inputs/outputs links for: failed actions (default), all, or none. | |
| actionName | No | Only this action; follows its I/O links. | |
| environmentId | Yes | Environment ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint=true and openWorldHint=true, lowering the burden on the description. The description adds genuinely useful context beyond annotations: the default behavior of following inputs/outputs links for failed actions, which an agent cannot infer from structured data. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences with zero waste. The primary purpose is front-loaded ('Per-action breakdown... debugging view') and the behavioral detail is delivered efficiently in the second sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a moderate 5-parameter surface with full schema coverage, read-only annotations, and no output schema required, the description explains the purpose and the key default behavior. Nothing essential an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter (runId, flowId, includeIO, actionName, environmentId) is already documented in the schema. The description's mention of 'failed actions by default (or a named action, or all)' mirrors the includeIO enum already present in the schema, adding little semantic value beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource ('per-action breakdown of one run') with an explicit framing ('the debugging view'). It clearly distinguishes itself from siblings like get_flow_runs (which returns the run list) and get_flow (single flow definition) — this tool drills to the action level of one run.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'debugging view' label implies when to use it, and the action-level scope contrasts with the run-level siblings. However, no alternative is named explicitly and there's no when-not-to-use guidance, so usage is only implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_environmentsARead-only
List every Power Platform environment the signed-in account can see.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds the 'every' and 'signed-in account' scope, which complements the openWorldHint by clarifying the visibility boundary, but does not go into details like pagination or environment properties.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single clear sentence with zero waste; the key scoping ('every', 'signed-in account') is front-loaded. Perfectly sized for a no-parameter list tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is sufficient for a simple list operation, but the lack of an output schema and absence of any mention of return format or filtering capabilities leaves minor gaps. However, given the simplicity, it is adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters; the schema is empty with 100% coverage, so there is nothing to document. The description adds no parameter meaning, but with no params, this is a baseline high score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool lists every Power Platform environment visible to the signed-in account—a specific verb (list) and resource (environments). It distinguishes from siblings like list_flows which target a different resource type, though it doesn't explicitly name the sibling for comparison.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description and 'signed-in account' context imply it's for browsing available environments, but there is no explicit when-to-use guidance or mention of alternatives among siblings. It's clear enough for obvious cases but lacks explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_flowsARead-only
List cloud flows in an environment (summary fields, not the full definition).
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Max flows to return. | |
| environmentId | Yes | Environment ID from list_environments. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true in annotations, the read-only nature is already declared; the description adds that the result contains summary fields rather than full flow definitions, which is a meaningful output-behavior disclosure. It does not detail pagination or default limits, but the schema's top parameter covers the limit behavior and no contradictions exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with a parenthetical carries the core purpose, scope, and an output caveat with no filler. The actionable verb is front-loaded and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, read-only list operation, the description plus schema covers the required environmentId and the optional max count, and the summary-fields caveat gives the agent enough to choose the tool and interpret the response at a high level. There is no output schema, and the description does not enumerate exactly which summary fields are returned or any paging behavior, so a small completeness gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline applies. The description adds no parameter-level detail beyond the schema, which already explains environmentId as coming from list_environments and top as the max number of flows to return.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a concrete resource ('cloud flows'), and a scope ('in an environment'), immediately distinguishing it from get_flow, which returns a single flow's full definition. The parenthetical clarifies that output is summary fields, not full definitions, removing ambiguity about its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates this is the tool to use when you need an inventory/summary of cloud flows within a specific environment, and the 'not the full definition' caveat implies when not to use it. It does not explicitly name a sibling like get_flow as the alternative, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_flow_stateA
Turn a flow on (start) or off (stop). Previews by default; pass confirm:true to apply.
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes | Turn the flow on (start) or off (stop). | |
| flowId | Yes | Flow ID. | |
| confirm | No | Must be true to actually apply. Omit to preview the intended change. | |
| environmentId | Yes | Environment ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly discloses the critical behavioral gate: it previews by default and only actually mutates state when confirm:true is passed. Given annotations readOnlyHint=false and openWorldHint=true, this adds the key safety-relevant context an agent needs before invoking the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler: the primary action is front-loaded, followed by the essential preview/confirm caveat. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is sufficient for a simple four-parameter tool: it states the operation, the states, and the confirmation mechanism. It does not describe what the preview output looks like, but since there is no output schema this is a partial gap rather than a serious omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all parameters, including the meaning of confirm and the start/stop enum. The description adds no new parameter-level information; it merely restates the behavior already captured in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the action ('Turn a flow on/off'), the resource (flow), and the two valid states (start/stop). This makes it clearly distinct from siblings such as list_flows, get_flow, and create_or_update_flow, which concern discovery, reading, or definition changes rather than operational state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage is implied: invoke this tool when you want to start or stop a flow, and the preview behavior supports a safe exploratory workflow. However, the description does not explicitly name alternatives such as create_or_update_flow for definition changes, nor does it mention when not to use this tool or what prerequisites must exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.1.0- First observed
create_or_update_flow - First observed
get_flow - First observed
get_flow_runs - First observed
get_run_actions - First observed
list_environments - First observed
list_flows - First observed
set_flow_state
TDQS
Scored across 7 tools
Each tool targets a distinct resource/action combination: environments, flow lists, full flow definitions, run history, per-action run details, flow state, and create/update. No two tools overlap in purpose; an agent can easily select the correct tool for a given task.
The naming follows a clear verb_noun pattern with verbs like list_, get_, set_, and create_or_update_. The only minor inconsistency is the use of both list_ and get_ for read operations, which could cause slight ambiguity (e.g., list_flows vs get_flow), but the distinction between summary and full definition is established in descriptions.
Seven tools is an appropriate, focused set for a Power Automate management server. The scope is clear, and each tool serves a necessary function without redundancy. This size is large enough to be useful yet small enough to avoid confusion.
The toolset covers the main lifecycle operations for flows: listing, retrieving, updating, setting state, and inspecting runs/actions. A notable missing operation is the ability to delete a flow, and there is no explicit way to list all runs across flows, but the core workflows of inspection and modification are well-covered.
Maintenance
Related MCP Connectors
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceDebug, build, and manage Microsoft Power Automate cloud flows with AI agents. Get action-level error details, build flows from natural language, trigger and resubmit runs, and operate across multiple tenants. Requires a Flow Studio MCP subscription — get an API key at https://mcp.flowstudio.app32MIT
- AlicenseBqualityFmaintenanceLocal-first MCP server and Chromium extension for AI-assisted Microsoft Power Automate work, enabling users to inspect, validate, edit, run, review, and revert cloud flows using a browser session.245724MIT
- AlicenseNot gradedqualityCmaintenanceA self-hosted MCP server that enables AI assistants to inspect and manage Microsoft Power Automate cloud flows and Dataverse records locally, using your own Azure identity.MIT
- AlicenseAqualityAmaintenanceAn MCP server that lets agents inspect, operate, and author Microsoft Power Automate cloud flows from a CLI/agent context.18302MIT