Skip to main content

CLI Reference

The mpdev executable has a small, predictable command surface.

mpdev [command] [args] [options]

Run mpdev help (or mpdev /?, -?, /h, -h, --help) for built-in help.


Commands

CommandPurpose
activateActivates an MPDEV license. Run this once per user (or per machine).
buildBuilds an MSI / MSIX from a package JSON file.
version (or --version)Prints the installed MPDEV version.
help, /?, -?, /h, -h, --helpPrints help.

mpdev activate

mpdev activate <license-key> [--all-users]
ArgumentRequiredDescription
license-keyyesThe license key string.
OptionRequiredDescription
--all-usersnoStores the license file next to mpdev.exe (writeable to that location, usually requires admin). All users on the machine inherit the license. Useful for CI / build agents.

Example

mpdev activate "<your-license-key>" --all-users

mpdev build

mpdev build <path-to-package-json> [--working-dir <DIR>] [--properties <$.name=value …>]
ArgumentRequiredDescription
path-to-package-jsonyesPath to the MPDEV package JSON file. Relative or absolute.
OptionRequiredDescription
--working-dir <DIR>noOverride the working directory used to resolve relative source paths. By default this is the directory where mpdev is invoked.
--properties <$.name=value …>noInject or override JSON properties. Each pair is $.path=value, separated by whitespace. Quote values that contain spaces.

--properties semantics

  • Each property name must start with $. (the JSON-pointer root).
  • Multiple $.name=value pairs are separated by whitespace.
  • A value containing whitespace must be enclosed in double quotes.
  • A property that already exists in the JSON is overridden.
  • A property that does not exist is created as if it were defined in the JSON. Useful for parameterizing builds: define a placeholder value in the JSON and override per build.

Examples

Simple build from current directory

mpdev build package.json

Build with overridden version and platform

mpdev build package.json --properties $.version=1.2.3 $.platform=x64

Build from a different working directory (CI scenario)

mpdev build C:\repo\installer\package.json --working-dir C:\repo\bin\Release

CI/CD example with env-driven version, output, and digital signature

set AZURE_TENANT_ID=...
set AZURE_CLIENT_ID=...
set AZURE_CLIENT_SECRET=...
set BUILD_NUMBER=42

mpdev build package.json ^
--properties $.version=1.0.%BUILD_NUMBER% $.outputDirectory="C:\artifacts\out"

The JSON can reference any of these values:

"version": "%BUILD_VERSION%",
"outputFileName": "%PRODUCT%_%BUILD_NUMBER%_$.platform"

Global options

These work with every command.

OptionDefaultDescription
--verboseoffVerbose logging. Useful when diagnosing builds.
--use-msbuild-message-format <true|false>true for activate and buildOutput validation/error messages in MSBuild diagnostic format so Visual Studio's Error List / GitHub Actions / Azure Pipelines parse them. See Microsoft's MSBuild diagnostic format for tasks.
mpdev build package.json --verbose
mpdev build package.json --use-msbuild-message-format false

Environment variables consumed by MPDEV

These are read before mpdev is invoked – set them in your shell, CI environment, or .env file.

VariableUsed byPurpose
AZURE_TENANT_IDdigitalSignature (Azure Trusted Signing)Azure tenant for EnvironmentCredential.
AZURE_CLIENT_IDsameApp registration / service principal client ID.
AZURE_CLIENT_SECRETsameApp registration / service principal secret.
Any custom env varThe whole package JSONExpanded as %MY_VAR% anywhere in string values.

For Trusted Signing, other Azure credential methods consume their own env vars (e.g., federated tokens for WorkloadIdentityCredential). See Microsoft's DefaultAzureCredential docs.


MSI install-time properties (set on msiexec, not mpdev)

The MSI engine accepts properties on the install command line. These are used by features documented in MSI features and Digital signature.

Property on msiexecEffect
MP_SKIPDEPCHECK=1Skip the packageDependencies check (useful in offline environments).
UPDATE_SCHEDULING_ENABLED=0|1Override the auto-updater's scheduling.enabled value.
UPDATE_SCHEDULING_STARTUP_DELAY=<ms>Override scheduling.initialDelay.
UPDATE_SCHEDULING_INTERVAL=<ms>Override scheduling.interval.
UPDATE_SCHEDULING_RETRY_INTERVAL=<ms>Override scheduling.retryInterval.
UPDATE_NOTIFICATIONS_ENABLED=0|1Override notifications.enabled.
UPDATE_LOGGING_INSTALLER_LOGS_RETENTION_DAYS=<int>Override logging.installerLogsRetentionDays.
Any property declared in msi.propertiesOverrides the JSON value.

Example silent install with property overrides

msiexec /i My Application.msi /qn ^
TELEMETRY_ENABLED=0 ^
UPDATE_NOTIFICATIONS_ENABLED=0 ^
MP_SKIPDEPCHECK=1

Common workflows

Local dev loop

mpdev build package.json

CI pipeline (GitHub Actions)

- name: Activate MPDEV (one-time setup step)
run: mpdev activate "${{ secrets.MPDEV_LICENSE }}" --all-users

- name: Build installer
env:
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
run: |
mpdev build installer/package.json `
--properties $.version=${{ github.run_number }} `
--use-msbuild-message-format true

Visual Studio integration

When MPDEV runs from a Visual Studio post-build event with the default message format, validation messages show up in the Error List panel – click them to open the JSON file at the offending line.