You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Wire develop-mcp publish to provision the A365 proxy Entra app (confidential app + secret) and forward its credentials to the platform, so custom (non-Dataverse) MCP servers actually get a Power Platform connector created at publish time.
Previously publish created only the PublicClients app, so the platform's connector-creation step logged A365ProxyConnectorCreation=SkippedNoCredentials and skipped. The register flow already provisions this proxy app; this mirrors it in publish.
CreateEntraAppsAsync now creates {server}-A365Proxy (confidential, with secret) first, failing the publish if it can't be created; CreateProxyAppAsync self-cleans its own orphan on partial failure.
After publish, the proxy app's redirect URIs are set from A365ProxyRedirectUri (tc/non-tc list), mirroring register; warns if absent.
The McpServer required-resource-access grant is added onto both the A365 proxy app and the PublicClients app. The platform wires the connector with the proxy app as its OAuth client and McpServerAppId as the resource, so the proxy app must hold this grant or Entra rejects the connector token request with AADSTS650057.
a365ProxyClientSecret is added to RedactSecretFields so the new secret is masked as ***REDACTED*** in verbose request-payload logging (alongside the other client secrets).
RollbackEntraAppsAsync now deletes both apps.
Paired MCP-Platform change (connector create at publish, tenant-publish at approve) is already merged.
Tests: new PublishCommandExecutorEntraAppTests (incl. grant-on-both-apps assertion), RedactSecretsFromPayload_RedactsA365ProxyClientSecret; updated regression + dry-run tests. Full suite green (2019 passed).
Publish now creates the confidential A365 proxy Entra app (app + secret) alongside the PublicClients app and forwards its credentials to the platform, so custom (non-Dataverse) MCP servers get a Power Platform connector created at publish time instead of the platform logging A365ProxyConnectorCreation=SkippedNoCredentials. Mirrors the register flow: proxy app created first (fatal on failure, with self-cleanup), request carries the proxy clientId/secret, proxy redirect URIs are updated post-publish, and rollback deletes both apps.
Co-authored-by: Copilot App <[email protected]>
The platform wires the A365 proxy connector with the proxy app as its OAuth client and McpServerAppId as the resource, so the proxy app must hold the McpServerScope required-resource-access grant or Entra rejects the connector's token request with AADSTS650057. ConfigureEntraAppsAsync previously granted this only on the PublicClients app; now it grants on both the proxy app and the PublicClients app, mirroring register.
Co-authored-by: Copilot App <[email protected]>
The publish request now carries the newly created A365 proxy Entra app secret as a365ProxyClientSecret. RedactSecretFields only masked clientApp1Secret/clientApp2Secret/clientSecret, so verbose request-payload logging wrote the live client secret in plaintext. Add a365ProxyClientSecret to the redaction key set with a regression test.
Co-authored-by: Copilot App <[email protected]>
The real publish path now also grants the MCP server permission to both apps and, when returned, writes the proxy redirect URIs, but this dry-run output still says it only back-fills the PPMI scope. That makes --dry-run under-report the changes users are previewing; update this message and its assertion to describe the new proxy configuration as well.
Roll back proxy app when public client creation fails
The proxy app is now created before CreatePublicClientsAppAsync, but an exception from that call can escape CreateEntraAppsAsync: its Graph app-creation call is outside the provisioner's catch, and ExecuteAsync has no rollback around app creation. A transient Graph/network failure here therefore leaves the newly created A365 proxy registration and secret orphaned. Catch this failure (while preserving cancellation), delete the proxy app, and return a failed publish; add a regression test for this partial-creation path.
The reason will be displayed to describe this comment to others. Learn more.
Requesting changes. The main concern is credential hygiene: publish now mints a confidential app with a secret on every run, and it can be left behind on partial failure. Details inline.
The reason will be displayed to describe this comment to others. Learn more.
The proxy app and secret are created unconditionally, but the comment says they're only required for custom (non-Dataverse) servers. For Dataverse / first-party servers this mints a credential nobody uses. Please gate it on server type.
Also, the secret gets Graph's default lifetime and publish has no --secret-lifetime-months like register does, so tenants with stricter app management policies can now fail publish where it used to succeed. Please add/pass that option.
The reason will be displayed to describe this comment to others. Learn more.
serviceTreeId: null is hard-coded, so this will fail with ServiceTreeValueMissing in tenants that enforce ServiceTree (same issue as #496). Please expose --service-tree-id on publish and pass it through here and to the public clients app.
The reason will be displayed to describe this comment to others. Learn more.
If this throws (Graph error, throttling, cancellation), the proxy app and its secret created above are left in the tenant; RollbackEntraAppsAsync only runs when the platform call fails. Please catch here, delete the proxy app, return failure, and add a test for this path.
The reason will be displayed to describe this comment to others. Learn more.
This warning fires on every non-custom publish, since only custom servers get a redirect URI back, so valid Dataverse / first-party publishes will look degraded. Please only warn when a redirect URI was expected.
_logger.LogInformation("[DRY RUN] Would create Entra app '{PublicClients}' in tenant", $"{input.ServerName}-PublicClients");
_logger.LogInformation("[DRY RUN] Would create Entra apps '{PublicClients}' and '{A365Proxy}' in tenant", $"{input.ServerName}-PublicClients", $"{input.ServerName}-A365Proxy");
_logger.LogInformation("[DRY RUN] Would call publish endpoint and back-fill PPMI scope on the created app");
**Option B — CLI** (`a365 setup admin`) has been removed in this release. Use Option A above, or copy the PowerShell instructions printed in the `a365 setup all` summary output.
### Added
- `develop-mcp publish` now creates the A365 proxy Entra app and sends its credentials to the platform, so custom (non-Dataverse) MCP servers get a Power Platform connector created at publish time.
The reason will be displayed to describe this comment to others. Learn more.
Missing the (#499) reference.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Wire
develop-mcp publishto provision the A365 proxy Entra app (confidential app + secret) and forward its credentials to the platform, so custom (non-Dataverse) MCP servers actually get a Power Platform connector created at publish time.Previously publish created only the PublicClients app, so the platform's connector-creation step logged
A365ProxyConnectorCreation=SkippedNoCredentialsand skipped. The register flow already provisions this proxy app; this mirrors it in publish.CreateEntraAppsAsyncnow creates{server}-A365Proxy(confidential, with secret) first, failing the publish if it can't be created;CreateProxyAppAsyncself-cleans its own orphan on partial failure.PublishMcpServerRequestcarriesa365ProxyClientId/a365ProxyClientSecret;PublishMcpServerResponsereadsA365ProxyRedirectUri(+A365ProxyConnectorId).A365ProxyRedirectUri(tc/non-tc list), mirroring register; warns if absent.McpServerAppIdas the resource, so the proxy app must hold this grant or Entra rejects the connector token request with AADSTS650057.a365ProxyClientSecretis added toRedactSecretFieldsso the new secret is masked as***REDACTED***in verbose request-payload logging (alongside the other client secrets).RollbackEntraAppsAsyncnow deletes both apps.Paired MCP-Platform change (connector create at publish, tenant-publish at approve) is already merged.
Tests: new
PublishCommandExecutorEntraAppTests(incl. grant-on-both-apps assertion),RedactSecretsFromPayload_RedactsA365ProxyClientSecret; updated regression + dry-run tests. Full suite green (2019 passed).