PowerPreFlight
Runs on your machine

Score the environment.
Then ask it why.

Before every flight, pilots run a preflight checklist — a systematic verification that everything is ready before committing to takeoff. PowerPreFlight runs one for Dynamics 365 and Power Platform, and ships the two MCP servers that came out of building it. One scores, the other explains. They are the same sign-in and the same Dataverse layer, so the environment you just scored is the one you can then ask questions of.

Deterministic

Score the environment

Reads DLP policy, connectors, pipelines and workload configuration to safely deploy a workload or roll out Copilot Studio, benchmarked against Microsoft’s Success by Design practices. Same environment, same version, same scorecard — no model in the path, which is what makes it evidence.

npx powerpreflight
How a run goes →
Generative

Then ask it anything

dataverse-local-mcp hands the same environment to Claude, VS Code, or any MCP client: explore the schema, chase a finding down to the rows behind it, and write with guardrails — every mutating tool previews by default and carries the ETag. The scanner registers it for you, in whichever config file your client wants.

npx powerpreflight mcp vscode <url>
Set it up →

Node.js 22 or later · nothing to install · no app registration · one work account, one machine

How a run goes

01

Sign in as yourself

A local listener on 127.0.0.1 opens your browser and authenticates through Microsoft’s pre-authorised first-party Dataverse client. No app registration, no consent prompt, no Global Administrator.

02

Pick an environment

Every environment your account can already reach is listed. The scan is read-only and carries exactly your access.

03

Work the checklist

Findings come back scored and ordered by what blocks go-live, each mapped to its Success by Design practice. Export the scorecard or the environment profile.

Why teams run it

  • Less tracked by hand. DLP, connector and pipeline steps that normally live in a spreadsheet come back enumerated.
  • The same review every time. Scored against Microsoft’s own framework rather than whichever checks the reviewer remembered.
  • Readiness in an afternoon. A Copilot Studio rollout or workload go-live gets its gap list on day one, not after the first failure.
  • Nothing to stand up. No service to host or maintain, and safe to run in a client tenant because it carries zero elevated privilege.

What it can touch

No app registration

The first-party Dataverse public client is pre-authorised in every tenant. Your client approves nothing.

Only your own access

You still need your own account and security role in the environment. Nothing is escalated.

Tokens stay on your machine

In memory behind a per-run session token, and never written to disk. Closing the tool is signing out.

No Dataverse data leaves

This origin serves the app, the steps and the solution library, and receives no environment data.

Where your data goes

  • Access tokens stay in memory on your machine and are never written to disk.
  • The local server binds 127.0.0.1 only, and every request carries a session token generated fresh for that run.

Run it

There is nothing to install permanently and nothing to configure to get started. npx fetches the current build each time you run it, so you are always on the latest version. The one prerequisite is Node.js 22 or later (winget install OpenJS.NodeJS.LTS, or brew install node, or nodejs.org).

Also in the box: two MCP servers

dataverse-local-mcp

The same local-only architecture, pointed at a model instead of a checklist. dataverse-local-mcp puts a Dataverse environment in front of Claude — or any MCP client — so you can explore the schema, run queries and saved views, and write with guardrails: every mutating tool previews by default and carries the ETag, so a stale write fails rather than overwriting someone. An annotation store accumulates what your team learns about the environment instead of each person rediscovering it.

Same sign-in as the scanner — your own work account through the pre-authorised first-party client, under the same limits on what it can touch. One difference worth knowing: an MCP client relaunches the server on every start, so this one keeps its token cache under ~/.dataverse-mcp/ instead of in memory. Deleting that file signs it out.

Add it to your MCP client

One command writes the right block to the right file. Both the file and its top-level key differ per client — which is the usual reason a hand-copied config silently does nothing at all:

npx powerpreflight mcp vscode https://yourorg.crm.dynamics.com --write

Swap vscode for claude-code or claude-desktop. Without --write it prints the exact change and touches nothing; it merges into an existing config rather than replacing it, and refuses rather than overwriting an entry that is already there. You need Node.js 22 or later and your environment URL — the one in the browser address bar when you use the app.

Or write it yourself

Claude Desktop — add this to claude_desktop_config.json and restart the app. That file is in ~/Library/Application Support/Claude/ on macOS, or %APPDATA%\Claude\ on Windows:

{
  "mcpServers": {
    "dataverse": {
      "command": "npx",
      "args": ["-y", "dataverse-local-mcp", "https://yourorg.crm.dynamics.com"]
    }
  }
}

VS Code — Copilot agent mode reads .vscode/mcp.json, and its top-level key is servers, not mcpServers, so the block above does not carry across unchanged:

{
  "servers": {
    "dataverse": {
      "command": "npx",
      "args": ["-y", "dataverse-local-mcp", "https://yourorg.crm.dynamics.com"]
    }
  }
}

For Claude Code, npx powerpreflight mcp claude-code writes a project-scoped .mcp.json that you can commit for the team; claude mcp add is the native alternative if you would rather keep a personal entry out of the repository. Any other MCP client takes the same command and argument in whatever shape it expects — it is an ordinary stdio MCP server. The first tool call opens a Microsoft sign-in in your browser — pick the work account for that environment, and an account picker is always shown so you can switch. The full tool reference is on npm.

powerpreflight-flows

The Power Automate half. Cloud flows are stored in Dataverse, and Microsoft documents the Dataverse Web API — not api.flow.microsoft.com, which it states is unsupported — as the way to work with them in code. So this needs no second sign-in and no extra consent: it is the same token, the same local-only architecture.

List and inspect flows, read their definitions, check run history, and author new ones. Every write previews first, and a definition is validated before it is sent — Dataverse will accept a flow that saves, opens the designer on an error, and cannot run, which looks like success and is worse than a refusal. New flows are always created switched off.

Migrating from Scribe Online? Point it at a map export and it converts each map to a cloud flow — queries, loops, conditions, lookups, upserts and field formulas — and reports whether each map should be a flow at all. That second half matters: a full-table refresh converts cleanly and still costs three Dataverse calls per source row, which the report puts a number on so the answer is arithmetic rather than opinion. Anything it cannot translate faithfully is marked in place rather than dropped.

Add it to your MCP client

Same command, with --server flows:

npx powerpreflight mcp vscode https://yourorg.crm.dynamics.com --server flows --write

It ships as a second command inside the same powerpreflight package rather than as its own download, so there is one version to track instead of two. Writing the block by hand needs the -p flag, because the command is not the package's default:

{
  "mcpServers": {
    "flows": {
      "command": "npx",
      "args": ["-y", "-p", "powerpreflight", "powerpreflight-flows", "https://yourorg.crm.dynamics.com"]
    }
  }
}

Both servers can be registered at once — they use different keys and do different jobs: one is the data plane, the other is Power Automate.

Configuration is optional

The content settings are editable inside the app. These environment variables exist for scripting a machine, not the normal path.

PREFLIGHT_CONTENT_URLOrigin publishing steps and solutions. Defaults to https://powerpreflight.app/api/content. off runs on bundled content alone.
PREFLIGHT_CONTENT_TOKENRead token for that content origin, if it needs one. Also settable in the app.
PREFLIGHT_CLIENT_IDYour own public-client registration, for tenants whose conditional access blocks first-party clients.
PREFLIGHT_REDIRECT_URIOverride the loopback redirect when a registration requires a specific one.
PREFLIGHT_OUTOutput directory for exported scorecards and profiles. Defaults to ./preflight-output.
npx powerpreflight