The Microsoft Store Developer Command Line Interface is a cross-platform (Windows, MacOS, Linux) CLI that helps developers access the Microsoft Store APIs, for both managed (MSIX), as well as unmanaged (MSI/EXE) applications. It helps developers by creating required online resources (credentials), as well as later setting up their application projects (UWPs, Win32s, Flutter, PWAs, Electron, React-Native, as well as many other types of Windows applications) to be ready to ship to the Microsoft Store, going from the initial steps of configuring the application's manifest, as well as the actual publishing of an MSIX or MSI/EXE.
By default the CLI splits its output as follows:
submission get, apps get and submission rollout get, the package path printed by package, and --help text. This keeps msstore submission get ... | ConvertFrom-Json and $(msstore package ...) reliable.--output-stream stdout deliberately breaks that separation: it moves the human-readable half onto stdout, where it is interleaved with any payload.
Two things sit outside the option's scope on purpose, matching the behavior of other CLIs:
--help is always written to stdout, so that msstore --help | more works, and command line parse errors are always written to stderr, because they accompany a non-zero exit code.[!WARNING] Behavior change. The
apps list,flights listandinfotables, the interactive prompts and the browser confirmation used to go to stdout. They now go to stderr with everything else meant for a human. Scripts that piped or captured them, such asmsstore apps list | grep ...ormsstore info > file, will see nothing on stdout — with a zero exit code and no diagnostic.Either of these restores a working script:
2>&1, to merge the two streams, or--output-stream stdout, orMSSTORE_OUTPUT_STREAM=stdoutfor a whole job, which puts all human-readable output on stdout. Note that this is not the old routing: progress, status and verbose logging already went to stderr before this change, so a script will now also receive that text alongside the table it was after.Machine-readable payloads (
submission get,apps get,package) were already on stdout and are unaffected either way.
Azure DevOps reports every stderr line as ##[error], even when the command succeeded and even when the task sets failOnStderr: false. A successful msstore publish therefore shows up as a failed or partially failed stage.
To avoid this, move the human-readable output to stdout:
- script: msstore publish ./MyApp --output-stream stdout
displayName: Publish to the Microsoft Store
Or set it once for a whole job, so that every msstore call picks it up:
variables:
MSSTORE_OUTPUT_STREAM: stdout
[!IMPORTANT] Machine-readable payloads always go to stdout. When
MSSTORE_OUTPUT_STREAMis set for a whole job, the human-readable output is interleaved with the payload, which breaks capturing it. Pass--output-stream stderron those specific calls to opt back out — the option always overrides the environment variable:variables: MSSTORE_OUTPUT_STREAM: stdout steps: - script: msstore publish ./MyApp # human-readable output on stdout - script: msstore submission get $(AppId) --output-stream stderr # clean JSON on stdout
No change is needed. GitHub Actions fails a step based on its exit code alone and never turns stderr into an error annotation, so the default is already correct.
This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com.
When you submit a pull request, a CLA bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA.
This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact opencode@microsoft.com with any additional questions or comments.
This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow Microsoft's Trademark & Brand Guidelines. Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies.
The msstore.exe client is instrumented to collect usage and diagnostic (error) data and sends it to Microsoft to help improve the product.
If you build the client yourself the instrumentation will not be enabled and no data will be sent to Microsoft.
See the privacy statement for more details.
Telemetry collection is on by default. To opt out, please run msstore settings --enableTelemetry false to turn it off.
3,472 followers · starred Feb 2026
151 followers · starred Aug 2026
185 followers · starred Mar 2023
79 followers · starred Mar 2023
C#
100.0%
The Microsoft Store Developer Command Line Interface is a cross-platform (Windows, MacOS, Linux) CLI that helps developers access the Microsoft Store APIs, for both managed (MSIX), as well as unmanaged (MSI/EXE) applications. It helps developers by creating required online resources (credentials), as well as later setting up their application projects (UWPs, Win32s, Flutter, PWAs, Electron, React-Native, as well as many other types of Windows applications) to be ready to ship to the Microsoft Store, going from the initial steps of configuring the application's manifest, as well as the actual publishing of an MSIX or MSI/EXE.
By default the CLI splits its output as follows:
submission get, apps get and submission rollout get, the package path printed by package, and --help text. This keeps msstore submission get ... | ConvertFrom-Json and $(msstore package ...) reliable.--output-stream stdout deliberately breaks that separation: it moves the human-readable half onto stdout, where it is interleaved with any payload.
Two things sit outside the option's scope on purpose, matching the behavior of other CLIs:
--help is always written to stdout, so that msstore --help | more works, and command line parse errors are always written to stderr, because they accompany a non-zero exit code.[!WARNING] Behavior change. The
apps list,flights listandinfotables, the interactive prompts and the browser confirmation used to go to stdout. They now go to stderr with everything else meant for a human. Scripts that piped or captured them, such asmsstore apps list | grep ...ormsstore info > file, will see nothing on stdout — with a zero exit code and no diagnostic.Either of these restores a working script:
2>&1, to merge the two streams, or--output-stream stdout, orMSSTORE_OUTPUT_STREAM=stdoutfor a whole job, which puts all human-readable output on stdout. Note that this is not the old routing: progress, status and verbose logging already went to stderr before this change, so a script will now also receive that text alongside the table it was after.Machine-readable payloads (
submission get,apps get,package) were already on stdout and are unaffected either way.
Azure DevOps reports every stderr line as ##[error], even when the command succeeded and even when the task sets failOnStderr: false. A successful msstore publish therefore shows up as a failed or partially failed stage.
To avoid this, move the human-readable output to stdout:
- script: msstore publish ./MyApp --output-stream stdout
displayName: Publish to the Microsoft Store
Or set it once for a whole job, so that every msstore call picks it up:
variables:
MSSTORE_OUTPUT_STREAM: stdout
[!IMPORTANT] Machine-readable payloads always go to stdout. When
MSSTORE_OUTPUT_STREAMis set for a whole job, the human-readable output is interleaved with the payload, which breaks capturing it. Pass--output-stream stderron those specific calls to opt back out — the option always overrides the environment variable:variables: MSSTORE_OUTPUT_STREAM: stdout steps: - script: msstore publish ./MyApp # human-readable output on stdout - script: msstore submission get $(AppId) --output-stream stderr # clean JSON on stdout
No change is needed. GitHub Actions fails a step based on its exit code alone and never turns stderr into an error annotation, so the default is already correct.
This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com.
When you submit a pull request, a CLA bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA.
This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact opencode@microsoft.com with any additional questions or comments.
This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow Microsoft's Trademark & Brand Guidelines. Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies.
The msstore.exe client is instrumented to collect usage and diagnostic (error) data and sends it to Microsoft to help improve the product.
If you build the client yourself the instrumentation will not be enabled and no data will be sent to Microsoft.
See the privacy statement for more details.
Telemetry collection is on by default. To opt out, please run msstore settings --enableTelemetry false to turn it off.
3,472 followers · starred Feb 2026
151 followers · starred Aug 2026
185 followers · starred Mar 2023
79 followers · starred Mar 2023
C#
100.0%