Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Power Portals Pro

NUGET · POWERPORTALSPRO.MCP

Component API, code samples and Dataverse metadata for building Power Portals Pro portals.

0 this week 80 Trust /100

Last scanned (6 hours ago)

Scores higher than 66% of NuGet servers

Category Cloud Infrastructure

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security100
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • No production dependencies, so there is no dependency health to assess. View diagnostics → Pass
Provenance & Transparency32
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Build provenance not yet verified. View diagnostics → Unverified
  • Licence could not be checked: the licence is shipped as a file inside the package, not declared as a standard (SPDX) licence identifier, so we cannot tell whether it is OSI-approved.Unverified
  • Actively maintained (last published 1 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability65
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 28490 tokens (~271/item across 105 items; 105 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management99
  • Stability check failed: the tool surface changed between 10.0.0 and 13.0.0: 0 tool removals, 1 breaking changes, 35 additions. See how to fix → Fail
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 13 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 106 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Nov 26 +15
    • Malware scan: unverified → pass ▲ security
  • 3 Nov 26 −15
    • Malware scan: pass → unverified ▼ security
    • Package version: 12.0.0 → 13.0.0 functional
  • 1 Nov 26 0
    • Schema quality: 23093 → 27552 ▼ functional
    • Package version: 11.4.0 → 12.0.0 functional
  • 31 Oct 26 0
    • Security disclosure: unverified → fail ▼ functional
  • 30 Oct 26 0
    • Security disclosure: fail → unverified ▼ functional
  • 26 Oct 26 0
    • Package version: 11.0.0 → 11.4.0 functional
  • 23 Oct 26 0
    • Package version: 11.3.0 → 11.4.0 functional
  • 22 Oct 26 0
    • Stability: fail → unverified ▼ security
    • Tool safety: pass → unverified ▼ security
    • Capabilities: pass → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • Package version: 11.2.0 → 11.3.0 functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Analysed nuget/PowerPortalsPro.Mcp@13.0.0

Provenance Inconclusive

We could not complete the check, so nothing is claimed either way. This is a gap on our side, not a finding about the package.

Result Inconclusive
Ecosystem nuget
Reason Signature present, unverified

Signer

Signed as Repository signature, names nuget.org
Subject CN=NuGet.org Repository by Microsoft,O=NuGet.org Repository by Microsoft,L=Redmond,ST=Washington,C=US
Issuer CN=DigiCert Trusted G4 Code Signing RSA4096 SHA384 2021 CA1,O=DigiCert\, Inc.,C=US
Valid from 23 Feb 2024
Valid until 18 May 2027
Service index https://api.nuget.org/v3/index.json
Owners PowerPortalsPro

Background: How many MCP packages publish verified provenance →

Dependencies 0 packages
Packages resolved 0
Tree resolution Complete

Background: SBOMs and build attestations, explained →

Registry declarations For information only

What the registry and the package's own manifest say about this version. The publisher or the registry writes these, nothing here is verified, and none of it affects the score.

Repository type git
Commit 0bb48589fecc335d2fd9892860d684eaa4307a0e
Project URL https://github.com/orgs/Power-Portals-Pro
MCP tools · 105 exposed · ~28,369 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
add_app_registration_certificate ~379

Create a certificate in Key Vault whose private key can never be exported, and add its public half to an existing app registration, so the app can sign in with no secret anywhere. The vault signs each sign-in instead, for whoever holds Key Vault Crypto User on it — connect an environment that way with `dnx PowerPortalsPro.Mcp login --client-id <id> --certificate <url>`. Also how to rotate: run it again with the same certificate name and a new version is created and added; the old one keeps working until removed with remove_app_registration_certificate. Creating needs Key Vault Certificates Officer on the vault; this tool grants no vault roles itself. NOT idempotent: every call creates a new version. The user is asked to confirm.

NameTypeReqDescription
certificateNamestring|null–The certificate's name in the vault — letters, digits and dashes. Omit to derive it from the registration's name. Pass the existing name to rotate.
clientIdstring|null–The registration's client id. Preferred over the display name, which is not unique.
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
displayNamestring|null–The registration's display name. Ignored when clientId is supplied.
keyVaultNamestring|null–The vault to create it in, by name. Omit to use the workspace's vault (create_key_vault). A vault kept for this certificate alone is safer: everyone with Crypto User on a vault can sign as every app…
validityMonthsinteger–Months until it expires. Defaults to 12. Ask the user before going past 12; at most 36.

No output schema declared.

No examples provided.

add_app_registration_federated_credential ~339

Make an app registration accept a user-assigned managed identity's token in place of a secret (a federated credential), so a portal hosted in one tenant can sign in to Dataverse in another as that registration with no secret at all. The registration and the identity must be in the same tenant, and the registration must be multi-tenant with consent in the customer's tenant. The issuer, subject and audience are read from the identity rather than typed, because Entra accepts wrong ones silently and only refuses the first sign-in. Reports the D365__ settings the App Service then needs. Safe to re-run: a credential that already trusts the identity is left alone. The user is asked to confirm.

NameTypeReqDescription
clientIdstring|null–The registration's client id. Preferred over the display name, which is not unique.
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
dataverseTenantIdstring|null–The Dataverse environment's tenant, for the D365__TenantId setting the result lists. Omit to use the workspace's primary environment's.
displayNamestring|null–The registration's display name. Ignored when clientId is supplied.
managedIdentitystringyesThe user-assigned managed identity: its name, or its full ARM resource id. A name is looked up in resourceGroup.
resourceGroupstring|null–The resource group the identity is in, when managedIdentity is a name. Defaults to the workspace's.

No output schema declared.

No examples provided.

add_app_registration_redirect_uri ~208

Add a reply URL to an existing app registration, keeping the ones already there. This is the step after a first deployment: the sign-in registration only knows the localhost URI until the production one is added, and sign-in fails with AADSTS50011 until it is. Pass the deployed URL and the callback path — for the templates' Microsoft sign-in that is /signin-microsoft. The user is asked to confirm.

NameTypeReqDescription
clientIdstring|null–The registration's client id. Preferred over the display name, which is not unique.
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
displayNamestring|null–The registration's display name. Ignored when clientId is supplied.
redirectUristring–The full redirect URI, e.g. "https://myportal.azurewebsites.net/signin-microsoft".

No output schema declared.

No examples provided.

add_app_registration_secret ~372

Add a new client secret to an existing app registration and write it to the project's user secrets or an App Service application setting. Use it to rotate before an expiry — client secrets last a year by default and the portal stops starting the day one lapses, with an error that does not mention Entra. Adding a secret does not revoke the old one, so the swap has no gap. The value is never returned. NOT idempotent: every call mints another secret. The user is asked to confirm.

NameTypeReqDescription
clientIdstring|null–The registration's client id. Preferred over the display name, which is not unique.
configurationKeystring–The configuration key to store it under, e.g. "D365:ClientSecret" or "Authentication:Microsoft:ClientSecret".
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
destinationstring–Where to put it: "user-secrets" (default), "app-service", "both", "key-vault" (the value goes into the workspace's Key Vault and only a reference is left in the app settings, so it needs a vault — se…
displayNamestring|null–The registration's display name. Ignored when clientId is supplied.
expiryMonthsinteger–Months until it expires. Defaults to 24 (2 years), the longest Entra's portal offers. Graph has no ceiling, so up to 120 (10 years) is allowed — ask the user how long they want before going past 24.

No output schema declared.

No examples provided.

add_powerbi_rls_role ~852

Add a row-level security role to a report's semantic model. In the portal's tokens USERNAME() is the viewer's contact id, and `filter` says what the role keeps them to: `contact` (the default) — rows whose column holds their contact id; `company` — rows whose column holds the company on their own contact row; `company-and-subsidiaries` — that company and every company under it, through the table's parent column (models that import their data only: Power BI refuses PATH in a DirectQuery role); `mapping` — the values a mapping table lists against their contact id, for a contact who may see several companies, say; `value` — rows whose column holds one of `values`, the same for everyone given the role, for a role an access row hands to a portal role; `customdata` — rows whose column holds the custom data the portal's IPowerBICustomDataProvider puts in the token (DAX CUSTOMDATA()), to filter on something the portal decides, such as an account number; `all` — every row, for staff. Written into the model in the service, as the folder's Power BI account. The same role should also go into the report's .pbix (Modeling > Manage roles) — republishing from Power BI Desktop replaces the model, role and all — so the answer gives the DAX to paste. Refuses to change an existing role of the name unless `replace` is true. list_powerbi_reports shows the tables and columns.

NameTypeReqDescription
columnstring|null–The column of `table` compared: the contact id for `contact`, the company id for the company filters, the value for `mapping`, `value` and `customdata`. Not needed for `all`.
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
contactCompanyColumnstring|null–For the company filters: the column of `contactTable` holding the contact's company id — e.g. accountid.
contactIdColumnstring–For the company filters: the contact id column of `contactTable`. Defaults to contactid.
contactTablestring–For the company filters: the table holding each contact's row. Defaults to Contact.
filterstring–What the role keeps a viewer to: contact, company, company-and-subsidiaries, mapping, value, customdata or all. Defaults to contact.
mappingContactColumnstring|null–For `mapping`: the contact id column of `mappingTable`.
mappingTablestring|null–For `mapping`: the table listing what each contact may see, a row per contact and value.
mappingValueColumnstring|null–For `mapping`: the column of `mappingTable` holding the value `column` is compared with.
parentColumnstring|null–For `company-and-subsidiaries`: the column of `table` holding each company's parent company id — e.g. parentaccountid.
replaceboolean–Replace a role of that name that already exists, instead of refusing.
reportstringyesThe report's name or id. Its semantic model gets the role.
roleNamestring|null–The role's name. Defaults to PortalContact for `contact`, PortalAccount for `company`, PortalAccountAndSubsidiaries for `company-and-subsidiaries` and AllRows for `all`; `mapping`, `value` and `custo…
tablestring|null–The table the role filters, as the model names it — the contact table for `contact`, the company table for the company filters. Not needed for `all`.
valuesarray|null–For `value`: the values the column may hold, as text — read as the column's type: numbers as numbers, true or false for a true/false column.
workspacestringyesThe workspace's name or id.

No output schema declared.

No examples provided.

add_powerbi_signin_permissions ~240

Let the portal's Microsoft sign-in connect viewers to Power BI, for items registered with `embedMode: "user"`: adds Power BI's delegated Report.Read.All and Dashboard.Read.All (read only), and Microsoft Graph's openid and offline_access that connecting also asks for, to the sign-in app registration — the one in this folder's Authentication:Microsoft:ClientId, or `clientId` — and a /signin-powerbi redirect URI for each site it has a /signin-microsoft one for, at the site's root. Every permission and redirect URI already there is kept. Viewers consent when they first connect, unless the tenant only lets administrators consent; the result gives the admin-consent link for that. Re-run it after adding a deployed portal's redirect URI. The user is asked to confirm.

NameTypeReqDescription
clientIdstring|null–The sign-in app registration's client id, when it isn't the one in this folder's settings.
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.

No output schema declared.

No examples provided.

add_table_privileges_to_role ~504

Grant a security role privileges on one table. This is the step after installing the managed solution: the role that ships with PowerPortalsProCore covers the framework's own tables only, and the application user needs access to the consumer's tables too. This holds under both security models: impersonation intersects privileges rather than delegating them, so this role caps what every portal user can do. Purely additive — a privilege already held at an equal or deeper scope is left exactly as it is, and nothing is ever revoked. Safe to re-run. Refuses a managed role, the one that ships in PowerPortalsProCore included: Dataverse permits it, but that role is our component and an upgrade can reapply it. Grant to a custom role instead — create_security_role makes one and assign_application_user_role gives it to the application user. The role is added to the solution recorded for the environment, so the grant is exported with it; with none recorded this refuses, and create_solution makes one. Needs System Administrator on the environment. The user is asked to confirm.

NameTypeReqDescription
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
depthstring–Basic, Local, Deep or Global. Defaults to Global, which is usually what an application user needs: it owns no records and belongs to no meaningful business unit, so the narrower depths grant it nothi…
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
privilegesstring–Comma-separated privileges: Create, Read, Write, Delete, Append, AppendTo, Assign, Share. "All" grants every privilege the table defines. Defaults to Read, which is the least that is ever useful — na…
securityRolestringyesThe security role's exact name. list_security_roles shows what exists.
tablestringyesThe table's logical name, e.g. "account". list_tables shows what exists.

No output schema declared.

No examples provided.

assign_application_user_column_profile ~314

Add a Dataverse application user to a column security profile — by default the 'Power Portals Pro Application User' profile the managed solution ships. Any application user on a role narrower than System Administrator needs it: a security role can never grant a secured column, and the portal creates contacts and handles password hashes through two of them. Without it, creating a portal user fails with 'does not have create permissions to a … secured field' and password sign-in cannot read the stored hash. Works for any application user by client id — the app registration's, and the managed identity's a deployed app connects as. Needs System Administrator on the environment. The user is asked to confirm.

NameTypeReqDescription
clientIdstringyesThe Entra application (client) id — of the app registration, or of the managed identity a deployed app connects as.
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
profileNamestring–The column security profile's exact name. Defaults to the one the managed solution ships.

No output schema declared.

No examples provided.

assign_application_user_role ~219

Give a Dataverse application user a security role. Use it when get_application_user shows the user exists but holds no role, or holds one too narrow for what the portal needs. Roles are additive — assigning one never takes another away. Needs System Administrator on the environment. The user is asked to confirm.

NameTypeReqDescription
clientIdstringyesThe Entra application (client) id.
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
securityRolestringyesThe security role's exact name. list_security_roles shows what exists.

No output schema declared.

No examples provided.

azure_status ~89

Show which Azure subscription this folder deploys to, where that came from, and whether the saved sign-in still works. Call it first whenever an Azure tool reports that nothing is configured, and before suggesting the user run any `az` command — this server does not use the Azure CLI and does not read its logged-in state, so `az account show` says nothing about what these tools will do.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

check_deployment ~484

Compare what this project's portal needs against what its App Service actually has, and report what is wrong. This is the first thing to reach for when a deployed portal misbehaves: it catches the configuration keys that only ever existed in the developer's user secrets (the app then never starts), ASPNETCORE_ENVIRONMENT left on Development (a React portal's deep links redirect to localhost), WebSockets off on a Blazor Server portal (the circuit silently degrades to long polling), session affinity set wrong for the stack, and a Portal Website record whose URL does not match the host (every data endpoint returns 402 while the pages render perfectly), and Key Vault references that cannot resolve — a secret missing from the vault, or an app identity with no role that reads it. It also asks the running site whether it can reach Dataverse (a portal that cannot still serves pages, full of raw localization keys), whether a failing API call reaches the browser as problem+json, and on a React portal whether the scripts and stylesheets its page loads are served (a blank page otherwise). Read-only: it needs nothing but Reader (plus permission to list the vault's secrets, to check they exist), and the requests it sends the site read nothing, so it is safe against production.

NameTypeReqDescription
environmentstring|null–Which of this folder's Dataverse environments the call is for: its name (e.g. "uat"), its position ("2") or its URL. The slot linked to that environment is the one acted on, so when the user is worki…
namestring|null–The web app name. Omit to use the one recorded in this workspace's binding.
resourceGroupstring|null–The resource group, when the name is ambiguous.
slotstring|null–Which deployment slot of the app: its name (e.g. "uat"), or "production" for the app itself. Omit it to use the slot linked to the environment — see `environment`. A folder that links no environment…

No output schema declared.

No examples provided.

check_email_sender ~215

Check whether the portal's sender address can actually deliver email, and say what to fix when it cannot — the question behind 'confirmation emails never arrive'. Finds every mailbox with the address, a queue's or a user's (teams have no mailbox, so a team cannot send), says which one the portal sends from — a user's is resolved before a queue's — and reports its approvals, delivery method, Test & Enable result and recent alerts. Defaults to the project's D365:EmailSenderEmailAddress. Changes nothing.

NameTypeReqDescription
emailAddressstring|null–The sender address to check. Omit to use the project's D365:EmailSenderEmailAddress.
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…

No output schema declared.

No examples provided.

check_maps ~189

Check that the portal can draw its maps: which provider its PowerPortalsPro:Maps settings choose and whether that provider's key is set (key names only, never values); for Azure Maps, that the account the client id names exists in the folder's subscription, that the portal's identity holds a role that reads it, and that its allowed origins cover the portal's local and deployed addresses; and then, signed in as the portal itself with the client secret in this folder, whether Azure Maps hands it a tile — one request. Changes nothing, so it is safe against production.

NameTypeReqDescription
portalClientIdstring|null–The client id of the identity the portal connects as, when it isn't the one in this folder's settings.
projectstring|null–The portal's web project folder, relative to this folder, when it holds more than one. Defaults to the one found.

No output schema declared.

No examples provided.

check_powerbi ~283

Check that the portal can embed its registered Power BI reports, dashboards and tiles, end to end: each registration and its access rows; the item and the models behind it in Power BI, and the role names against the models'; the portal identity's workspace membership; the capacity, or the trial allowance; and then, signed in as the portal itself with the client secret in this folder, whether Power BI lets it in and issues a token — which is how the tenant settings only a Fabric administrator can change are checked. Each run issues one embed token per registration. An item shown with each viewer's own access is checked for what that needs instead: its access rows, and the sign-in app registration's Power BI permissions and redirect URI.

NameTypeReqDescription
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
keystring|null–One registration key to check. Omit to check them all.
portalClientIdstring|null–The client id of the identity the portal connects as, when it isn't the one in this folder's settings.

No output schema declared.

No examples provided.

check_setup ~253

Check what this project folder still needs before the portal will run: whether a project exists, which configuration keys its startup code requires, which of those are actually set, whether the Dataverse connection works, whether the managed solution that provisions the framework's own tables is installed, whether every portal role name the code uses has an active Portal Role record, whether the application user's security roles allow what the table access registered in code needs, whether each operation registered with AddOperationAccess exists and is one the application user may run, and which environments the folder is bound to. Call this when a portal will not start, when every data endpoint returns 402, when a page fails with a Dataverse privilege error, when a registered operation is refused, or when an assigned portal role appears to do nothing. The Dataverse half checks the primary environment unless given another.

NameTypeReqDescription
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…

No output schema declared.

No examples provided.

configure_app_service ~337

Apply the recommended platform settings to an existing web app: Always On, HTTPS only, HTTP/2, TLS 1.2 minimum, and the WebSockets and session-affinity pair that this project's stack needs. Use it after check_deployment reports a platform finding, or on an app that was created outside this server. The user is asked to confirm; the change restarts the app. Changes nothing that is already correct.

NameTypeReqDescription
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
environmentstring|null–Which of this folder's Dataverse environments the call is for: its name (e.g. "uat"), its position ("2") or its URL. The slot linked to that environment is the one acted on, so when the user is worki…
namestring|null–The web app name. Omit to use the one recorded in this workspace's binding.
resourceGroupstring|null–The resource group, when the name is ambiguous.
slotstring|null–Which deployment slot of the app: its name (e.g. "uat"), or "production" for the app itself. Omit it to use the slot linked to the environment — see `environment`. A folder that links no environment…

No output schema declared.

No examples provided.

configure_solution ~204

Record an existing unmanaged solution in .ppp/mcp.json as the one an environment's customizations go into, or change whether export_solution and push_solution package it managed or unmanaged. Use it when the solution was made in the maker portal or by a teammate; create_solution makes a new one. Changes only the binding file, nothing in Dataverse.

NameTypeReqDescription
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
exportAsstring|null–"managed" or "unmanaged". Leave out to keep the current setting.
solutionstring|null–The unique name of an unmanaged solution in the environment. Leave out to keep the one recorded.

No output schema declared.

No examples provided.

create_app_service ~409

Create the Azure resources a portal runs on: the resource group, an App Service plan and the web app, with the platform settings this project's stack needs (WebSockets and session affinity for a Blazor Server or Auto portal, affinity off for React or WebAssembly) already applied. The user is asked to confirm and is shown the plan's real monthly cost from Azure's price list before they answer; the first call only returns what will change, to show them, and the second passes the code it names as `confirm`. Safe to re-run — anything that already exists is reused rather than duplicated. Defaults to the cheapest tier that can stay warm, for every environment including production.

NameTypeReqDescription
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
logRetentionDaysinteger–Days to keep the app's logs, in a Log Analytics workspace of its own ("<name>-logs") created alongside it. Default 60; between 30 and 730, or 0 for no logging.
namestringyesThe web app name. Becomes https://<name>.azurewebsites.net, so it must be globally unique.
regionstring|null–Azure region, e.g. "eastus". Defaults to the workspace binding's, then eastus.
resourceGroupstring|null–Resource group to create the resources in. Defaults to the workspace binding's, then "<name>-rg".
skustring|null–Plan tier. Defaults to B3 — the top of Basic, with Always On — for every environment. Pass B1 for a dev or test environment that does not need the headroom, or a Standard/Premium tier for deployment…
windowsboolean–Create a Windows plan instead of Linux. Linux is the default: markedly cheaper per tier and no IIS in the request path.

No output schema declared.

No examples provided.

create_azure_maps_account ~379

Create a Gen2 Azure Maps account in the folder's Azure subscription for the portal's maps, which sign in to it with the portal's own identity: its keys and SAS tokens are turned off, and the sites allowed to draw its maps are the portal's — its web project's local addresses and the bound App Service's host names, plus any in `origins`. Writes the account's client id to the web project's user secrets as PowerPortalsPro:Maps:AzureMaps:ClientId. No standing charge: Azure Maps bills per use after a free monthly allowance. The user is asked to confirm; the first call only returns the details, and the second passes the code it names as `confirm`. Then grant_azure_maps_access. Safe to re-run: an existing account is reported, not made again.

NameTypeReqDescription
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
locationstring|null–The Azure region: eastus, westus2, westcentralus, westeurope or northeurope, the only ones Azure Maps has. Defaults to the nearest to the folder's bound region; what the account serves is global wher…
namestringyesThe account's name: letters, numbers, periods, underscores and hyphens, starting with a letter or number.
originsarray|null–More sites to allow, as origins such as https://portal.contoso.com, beside the ones found.
projectstring|null–The portal's web project folder, relative to this folder, when it holds more than one. Defaults to the one found.
resourceGroupstring|null–The resource group. Defaults to the folder's bound one.

No output schema declared.

No examples provided.

create_dataverse_app_registration ~808

Create the Entra app registration the portal connects to Dataverse as, add a client secret, and write the client id and secret into the project's user secrets (or an App Service application setting) — into user secrets with the environment's URL as D365:Url too, unless one is already set. This is the backend identity for the client-credentials flow — no redirect URIs, no Graph permissions and no admin consent are needed or added, except that a multi-tenant one gets Graph User.Read and a reply URL, the least another tenant's admin consent will accept. The secret value is never returned; only where it was stored and when it expires. Safe to re-run: an existing registration with that name is reused. The user is asked to confirm first. IMPORTANT: this is only half the setup — Dataverse also needs an application user for the client id, and the tool output says how.

NameTypeReqDescription
clientIdstring|null–The client id of an app registration that already exists. Supply it to add a secret to that one and write its credentials out, instead of creating anything.
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
consentRedirectUristring|null–Multi-tenant only: where the customer's administrator lands after accepting admin consent, e.g. "https://myportal.azurewebsites.net/". Entra refuses consent to a registration with no reply URL. Defau…
destinationstring|null–Where to put the credentials: "user-secrets", "app-service", "both", "key-vault", or "return" to have the secret shown so you can paste it somewhere this server cannot reach. Left unset it picks the…
displayNamestring|null–The exact display name to give the registration. Overrides portalName when supplied, and is also how an existing registration is found by name.
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
expiryMonthsinteger–Months until the client secret expires. Defaults to 24 (2 years), the longest Entra's portal offers, because the failure this causes in practice is a lapsed secret rather than a stolen one. Graph its…
multiTenantboolean|null–Set true when the Dataverse environment is in a DIFFERENT Entra tenant from the Azure subscription the portal is deployed to - the hosted case. The registration is created as multi-tenant, so it stay…
portalNamestring–The portal's name, composed into the registration name as "<portalName> - Dataverse". Defaults to "Customer Portal"; a tenant with several portals should pass its own name so the two registrations re…

No output schema declared.

No examples provided.

create_dataverse_application_user ~457

Create the Dataverse application user for an Entra app registration and give it a security role, in one step. This is the other half of create_dataverse_app_registration and nothing works without it — a registration on its own gets a token and is then refused by every Dataverse call. The Entra service principal must exist first, which create_dataverse_app_registration ensures. Safe to re-run: an existing application user is reused and an existing role assignment is left alone. Needs System Administrator on the environment. The user is asked to confirm. When Power Portals Pro hosts the portal, the customer uses Power Portals Pro's own registration instead of creating one: pass its client id, 46c0b100-f468-4bfc-ba89-d128bceabe31, after an administrator in the customer's tenant has opened its admin-consent link — https://login.microsoftonline.com/organizations/adminconsent?client_id=46c0b100-f468-4bfc-ba89-d128bceabe31&redirect_uri=https%3A%2F%2Fpowerportalspro.com%2F — and accepted.

NameTypeReqDescription
clientIdstringyesThe Entra application (client) id to create the user for — 46c0b100-f468-4bfc-ba89-d128bceabe31 for a portal Power Portals Pro hosts.
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
securityRolestring|null–Security role to assign, e.g. "System Customizer". Use list_security_roles to see what exists. Omit to create the user with no role — it will be able to do nothing until one is assigned.

No output schema declared.

No examples provided.

create_deployment_slot ~381

Create a deployment slot of the App Service that runs against one of this folder's Dataverse environments — a "uat" slot for the UAT environment — and link the two, so deploy_to_app_service given that environment lands in the slot. The slot copies production's platform configuration, managed identities and application settings, then gets its own D365__Url (and sender address) pointing at the environment and its own PowerPortalsPro__PublicUrl, marked as deployment slot settings so a swap never carries one environment into another. Safe to re-run on an existing slot: it repoints it and repairs the sticky settings without copying anything over. Needs a Standard or Premium plan. The user is asked to confirm; the first call only returns what will change, to show them, and the second passes the code it names as `confirm`.

NameTypeReqDescription
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
emailSenderAddressstring|null–The address the portal sends account mail from in that environment (D365__EmailSenderEmailAddress). Omit to copy production's on a new slot, or keep the slot's own on an existing one.
environmentstringyesThe Dataverse environment the slot runs against: its name, position or URL.
namestring|null–The web app name. Omit to use the one recorded in this workspace's binding.
resourceGroupstring|null–The resource group, when the name is ambiguous.
slotstringyesThe slot name, e.g. "uat". Prefer dev, test, stage, uat or prod: the license covers the slot's own host name ({app}-{slot}.azurewebsites.net) only for those.

No output schema declared.

No examples provided.

create_email_queue ~414

Create a Dataverse queue to act as the portal's no-reply email sender, for the address in D365:EmailSenderEmailAddress. This is the recommended sender for account-confirmation and password-reset mail: the address belongs to the portal rather than to a person, so no employee's name appears on automated messages, replies do not land in anybody's inbox, and nothing breaks when somebody leaves. It approves the queue's mailbox and runs Test & Enable on it, and reports what is left: approving needs an Office 365 Global Administrator or Exchange Administrator, and the address needs a mailbox in Exchange Online — a shared mailbox, which needs no license. Safe to re-run, and the way to finish once either is fixed: an existing queue with that address is reused rather than duplicated, and the test runs again until it passes. The user is asked to confirm.

NameTypeReqDescription
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
descriptionstring|null–Optional description recorded on the queue.
emailAddressstringyesThe email address the portal will send from, e.g. "noreply@contoso.com". Must match D365:EmailSenderEmailAddress exactly.
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
namestring–The queue's name, which becomes the sender's display name on the email. Defaults to "Portal No-Reply".
outgoingDeliveryMethodinteger–Outgoing delivery method: 2 (server-side synchronization, the default and the only value that actually sends) or 0 (none).

No output schema declared.

No examples provided.

create_key_vault ~261

Create an Azure Key Vault for this portal's secrets, grant the App Service's managed identity read access to it, and grant the signed-in user write access so secrets can be put in. Afterwards, the secret tools accept destination:"key-vault", which sends a newly minted client secret straight into the vault and leaves only a reference in the app settings. IMPORTANT: a Key Vault name is reserved for 90 days after deletion unless explicitly purged, so the name is the one thing here that is not cheaply undoable. Costs a fraction of a cent per thousand operations. The user is asked to confirm.

NameTypeReqDescription
appServiceNamestring|null–The web app whose identity gets read access. Omit to use the workspace binding's.
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
regionstring|null–Azure region. Defaults to the workspace binding's.
resourceGroupstring|null–Resource group. Defaults to the workspace binding's.
vaultNamestringyesThe vault name. Globally unique across Azure, 3-24 characters, letters/digits/hyphens.

No output schema declared.

No examples provided.

create_managed_identity ~258

Create a user-assigned managed identity in Azure - an Entra identity that holds no secret and so has nothing to expire. It is a resource in its own right, which is the point: it survives the App Service being deleted and rebuilt, and is shared by every deployment slot, so the Dataverse application user and Key Vault grants built on it stay valid across a teardown. This only creates it; enable_managed_identity attaches it to an app. Free, and safe to re-run. Returns the identity's CLIENT id, which is what goes in D365:ManagedIdentityId and what a Dataverse application user must be created from - not the principal id, which is for Azure RBAC.

NameTypeReqDescription
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
identityNamestring|null–Name for the identity, e.g. "customer-portal-identity". Defaults to the bound app's name with "-identity" appended.
regionstring|null–Azure region. Defaults to the workspace binding's.
resourceGroupstring|null–Resource group. Defaults to the workspace binding's.

No output schema declared.

No examples provided.

create_portal_role ~284

Create a Portal Role record in Dataverse so an AddPortalRole registration has something to bind to. Give it the exact name used in code — the string is the only thing joining the two, and a mismatch produces a role that grants nothing with no error anywhere. Safe to re-run: a role of that name is reported back rather than duplicated, which matters because two roles of one name are indistinguishable to whoever assigns them. Creating the role does not give it to anybody — assign it to contacts in the model-driven app, or use create_portal_role_configuration to hand it to new users automatically. Administrators can also maintain roles, and the rules that hand them out, on the portal's Role Configuration page (/RoleConfigurationAdmin in both project templates).

NameTypeReqDescription
descriptionstring|null–Optional description, for whoever assigns the role in the model-driven app.
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
namestringyesThe role name, matching the AddPortalRole call exactly, e.g. "Credit Manager".

No output schema declared.

No examples provided.

create_portal_role_configuration ~317

Create a Portal Role Configuration row, which decides whether newly registered users are given a role as their account is created. Modes: "automatic" gives it to every new user; "criteria" gives it to those whose contact matches a FetchXML rule; "none" leaves the row dormant. Criteria FetchXML must be rooted in the contact table and must not be an aggregate — this tool checks that before writing, because the portal fails closed on bad criteria and a broken rule looks exactly like a rule that matched nobody. Safe to re-run: an existing row for that role is reported back rather than duplicated. The portal's Role Configuration page (/RoleConfigurationAdmin) edits the same rows, and in React builds the criteria visually and shows who it matches today.

NameTypeReqDescription
assignmentModestring|null–When to assign it: "automatic", "criteria" or "none". Defaults to "automatic".
criteriastring|null–FetchXML rooted in "contact" describing who qualifies. Required for "criteria" mode.
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
roleNamestringyesName of the Portal Role to configure. It must already exist — use create_portal_role first.

No output schema declared.

No examples provided.

create_portal_website ~213

Create a Power Portals Pro Website record so a portal served from that URL passes the license check. Without one, every data endpoint on that host returns 402. Safe to re-run: an existing record for the URL is reported back rather than duplicated, which matters because two records for one URL leave it undefined which answers the check.

NameTypeReqDescription
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
licenseKeystring|null–The license key for this website. It is stored and never read back by this server.
urlstringyesThe URL the portal is served from, e.g. "https://localhost:7273" or "https://portal.contoso.com".

No output schema declared.

No examples provided.

create_powerbi_capacity ~258

Create a Fabric capacity (an F SKU) in the folder's Azure subscription, for production embedding — a workspace on no capacity only gets trial tokens. Costs money for as long as it runs: the user is shown the live list price and asked to confirm; the first call only returns the details, and the second passes the code it names as `confirm`. The folder's Power BI account is made its administrator, so it can put workspaces on it (create_powerbi_workspace with `capacity`). F2 is the smallest. Safe to re-run.

NameTypeReqDescription
confirmstring|null–Leave out on the first call, which creates nothing and returns the details to show the user. On the second, the code that call names.
locationstring|null–The Azure region. Defaults to the folder's bound region.
namestringyesThe capacity's name: lowercase letters and numbers, starting with a letter, 3 to 63 characters.
resourceGroupstring|null–The resource group. Defaults to the folder's bound one.
skustring–The size: F2, F4, F8, F16, F32, F64 and up. Defaults to F2.

No output schema declared.

No examples provided.

create_powerbi_workspace ~174

Create a Power BI workspace for the portal's reports, as the folder's Power BI account, optionally putting it on a capacity. Safe to re-run: an existing workspace of that name is reported back. A workspace on no capacity can embed with Power BI's trial tokens, for development; production needs a capacity. Don't put the reports in a Premium Per User workspace — embedding for portal visitors isn't supported there.

NameTypeReqDescription
capacitystring|null–A capacity to put it on, by name or id. Omit for none.
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
descriptionstring|null–An optional description.
namestringyesThe workspace's name.

No output schema declared.

No examples provided.

create_security_role ~371

Create an empty custom security role in the root business unit, to hold the application user's privileges on the customer's own tables. The role that ships with PowerPortalsProCore covers the framework's tables only and is a managed component an upgrade can reapply, so add_table_privileges_to_role refuses it — this role is where those grants go instead, and the application user holds both. Next: assign_application_user_role to give it to the application user, then add_table_privileges_to_role once per table. The role is created in the solution recorded for the environment, so it is exported with it; with none recorded this refuses, and create_solution makes one. Safe to re-run: a role of that name already in the root business unit is left as it is, except that one outside the solution is offered to be added to it. Needs System Administrator on the environment. The user is asked to confirm.

NameTypeReqDescription
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
descriptionstring|null–What the role is for, shown in the maker portal. A sensible default is used when omitted.
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
securityRolestringyesThe new role's name, e.g. "Contoso Portal Application User". Name it for the portal, so it reads as the customer's own beside the shipped role.

No output schema declared.

No examples provided.

create_signin_app_registration ~741

Create the Entra app registration behind 'Sign in with Microsoft' on the portal's login page, with the /signin-microsoft redirect URI filled in from the project's launchSettings (the templates randomize the local port, so there is nothing to guess), add a client secret, and write both into the project's user secrets or an App Service setting. Its ID token is given the email-verification optional claims (email, xms_edov, verified_primary_email, verified_secondary_email) and the delegated Microsoft Graph email permission they need — on an existing registration too — so a work or school account whose address Entra vouches for signs in without a confirmation mail. Users can consent to that permission themselves, except in tenants that only let administrators consent. This is a SECOND, SEPARATE registration from the Dataverse one — sharing one means a single secret rotation takes down both sign-in and data access, and gives the sign-in app a Dataverse role it never needed. The secret value is never returned. The user is asked to confirm.

NameTypeReqDescription
clientIdstring|null–The client id of an app registration that already exists. Supply it to add a secret and reply URLs to that one instead of creating anything.
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
destinationstring–Where to put the credentials: "user-secrets" (default), "app-service", "both", "key-vault" (the value goes into the workspace's Key Vault and only a reference is left in the app settings, so it needs…
displayNamestring|null–The exact display name to give the registration. Overrides portalName when supplied, and is also how an existing registration is found by name.
expiryMonthsinteger–Months until the client secret expires. Defaults to 24 (2 years), the longest Entra's portal offers, because the failure this causes in practice is a lapsed secret rather than a stolen one. Graph its…
portalNamestring–The portal's name, composed into the registration name as "<portalName> - Sign-in". Defaults to "Customer Portal"; a tenant with several portals should pass its own name so the two registrations read…
redirectUrisarray|null–Extra redirect URIs, e.g. "https://myportal.azurewebsites.net/signin-microsoft". The local one from launchSettings is added automatically, and any already on an existing registration are kept.
signInAudiencestring–Who may sign in: "AzureADandPersonalMicrosoftAccount" (any work or school account plus personal Microsoft accounts — the default, and what a portal for external users needs), "AzureADMultipleOrgs" (a…

No output schema declared.

No examples provided.

create_solution ~504

Create a publisher and an unmanaged solution in a Dataverse environment, and record the solution in .ppp/mcp.json as the one that environment's customizations go into. Do this once, in the environment where the portal's Dataverse changes are made (usually dev): create_security_role, add_table_privileges_to_role and remove_table_privileges_from_role refuse to change an environment with no solution recorded, so everything they change lands here and is exported together — export_solution and push_solution take it to test and production. An existing publisher of that name is reused; an existing unmanaged solution of that name is recorded without being changed. Ask the user for the names and the prefix rather than inventing them: the prefix begins the schema name of everything the publisher creates and cannot be changed later. Needs System Customizer or System Administrator. The user is asked to confirm.

NameTypeReqDescription
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
displayNamestring|null–The solution's display name. Defaults to its unique name.
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
exportAsstring|null–How export_solution and push_solution package the solution: "unmanaged" (for environments that will be worked in too) or "managed" (for environments that only receive it, such as test and production)…
prefixstring|null–The publisher's customization prefix: two to eight letters or digits, starting with a letter, e.g. "contoso". Required for a new publisher; leave out to reuse an existing one's.
publisherstringyesThe publisher's unique name, e.g. "Contoso". An existing publisher of that name is reused.
publisherDisplayNamestring|null–The publisher's display name, for a new publisher. Defaults to its unique name.
solutionstringyesThe solution's unique name: letters, digits and underscores, e.g. "ContosoPortal".

No output schema declared.

No examples provided.

dataverse_status ~132

Report which Dataverse environments this project folder is bound to — each one's position, name and URL, which is the primary, which account it connects as, and whether that connection currently works. Every other Dataverse tool acts on the primary unless given an `environment` argument; this is where to find the names and positions to pass. Call it first if any other Dataverse tool reports it is not configured — it explains exactly what is missing and which command the user should run.

NameTypeReqDescription
environmentstring|null–Report only this environment — a name, position or URL. Omit to report all of them.

No output schema declared.

No examples provided.

delete_portal_role ~250

Permanently delete a Portal Role record, and with it every assignment of that role to a contact. Prefer update_portal_role with active:false — deactivating grants nothing and mints no claim either, but keeps the assignments so it can be reversed; deleting throws them away and nothing remembers who held it. The user is asked to confirm; the first call only returns what will change, to show them, and the second passes the code it names as `confirm`. Show the user what will be lost before calling, and never call this to tidy up on your own initiative.

NameTypeReqDescription
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
namestringyesName of the role to delete.

No output schema declared.

No examples provided.

delete_portal_role_configuration ~229

Permanently delete the Portal Role Configuration row for a role. The role itself and its existing assignments are untouched — this only stops the role being given to users who register from now on. Deactivating the row with update_portal_role_configuration has the same effect and is reversible. The user is asked to confirm; the first call only returns what will change, to show them, and the second passes the code it names as `confirm`.

NameTypeReqDescription
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
roleNamestringyesName of the Portal Role whose configuration row should be deleted.

No output schema declared.

No examples provided.

delete_portal_website ~252

Permanently delete a Power Portals Pro Website record. This takes the site's license with it: from the next request, every data endpoint on that URL returns 402. Prefer update_portal_website with active:false, which does the same thing reversibly — deletion is only right for a record that was wrong to begin with, such as a typo'd URL or a duplicate. The user is asked to confirm; the first call only returns what will change, to show them, and the second passes the code it names as `confirm`. Never call this on your own initiative.

NameTypeReqDescription
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
urlstringyesThe URL of the record to delete.

No output schema declared.

No examples provided.

delete_powerbi_report_registration ~219

Delete a Power BI report's registration and its access rows, so the portal stops showing it: every PowerBIReport naming the key shows that the report isn't available. The report itself, in Power BI, is not touched. The user is asked to confirm; the first call only returns what will change, to show them, and the second passes the code it names as `confirm`. Never call this on your own initiative.

NameTypeReqDescription
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
keystringyesThe report's registration key.

No output schema declared.

No examples provided.

delete_security_role ~253

Delete a custom security role that no user or team holds — one made for a test run, or replaced by another. Refuses a role anyone still holds, naming them, so taking access away is always a separate, visible step: remove_application_user_role first for an application user. Refuses a managed role, which belongs to the solution that installed it. Cannot be undone: the role and every privilege in it are gone, along with the copies Dataverse keeps in other business units. Needs System Administrator on the environment. The user is asked to confirm.

NameTypeReqDescription
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
securityRolestringyesThe security role's exact name. list_security_roles shows what exists.

No output schema declared.

No examples provided.

deploy_to_app_service ~438

Build this project with `dotnet publish` and push the result to its App Service. On a React portal the publish also runs the Vite build and stages the SPA, so Node must be installed. The user is asked to confirm first — this replaces what is currently serving traffic. Deployment itself costs nothing beyond the plan that is already running.

NameTypeReqDescription
cleanboolean–Empty the app's folder before unpacking the new build. Default true, so the site ends up holding exactly this build. Pass false only to keep files something else put there on purpose — without cleani…
configurationstring–Build configuration. Release unless you have a reason.
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
environmentstring|null–Which of this folder's Dataverse environments the call is for: its name (e.g. "uat"), its position ("2") or its URL. The slot linked to that environment is the one acted on, so when the user is worki…
namestring|null–The web app name. Omit to use the one recorded in this workspace's binding.
projectPathstring|null–Path to the web project (.csproj). Omit to find the single web project in the workspace.
resourceGroupstring|null–The resource group, when the name is ambiguous.
slotstring|null–Which deployment slot of the app: its name (e.g. "uat"), or "production" for the app itself. Omit it to use the slot linked to the environment — see `environment`. A folder that links no environment…

No output schema declared.

No examples provided.

describe_app_service ~170

Show one web app's platform configuration and the NAMES of its application settings. Values are never returned, except for a short list of documented non-secrets such as ASPNETCORE_ENVIRONMENT and D365__Url — a portal's settings hold the Dataverse client secret and every sign-in provider's secret, and those must not reach a transcript. Use check_deployment instead when the question is whether the app is correctly configured; this is for when you need the raw picture.

NameTypeReqDescription
namestringyesThe web app name.
resourceGroupstring|null–The resource group, when the name is ambiguous or the subscription is large.
slotstring|null–A deployment slot of the app to describe instead, e.g. "uat". Omit it for the app itself.

No output schema declared.

No examples provided.

describe_operation ~229

Describe a custom API, custom action or Dataverse message by name: how it is bound, its request parameters (type, whether optional, the table a record parameter is of) and its outputs, the privilege it asks of whoever runs it — through a portal, the application user — a starting AddOperationAccess registration that lets portal users run it, and the OperationButton markup that offers it on a page to the users it is for. Call this before writing a registration rather than guessing parameter names: a request carrying a parameter the registration doesn't accept, or one it gets wrong, is refused.

NameTypeReqDescription
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
namestringyesThe operation's unique name, e.g. "ppp_ApproveRequest" or "WinOpportunity".

No output schema declared.

No examples provided.

describe_role_table_privileges ~218

Show what a security role currently grants on one table, privilege by privilege, with the depth of each. Use it before add_table_privileges_to_role to see what is actually missing, and after a portal reports an empty grid or a failed save to find out whether the role is the reason. Depth matters as much as the privilege: an application user owns no records, so a privilege held at User depth grants it nothing at all.

NameTypeReqDescription
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
securityRolestringyesThe security role's exact name. list_security_roles shows what exists.
tablestringyesThe table's logical name, e.g. "account". list_tables shows what exists.

No output schema declared.

No examples provided.

describe_solution ~150

Show the solution recorded for an environment — its publisher and prefix, its version, whether it exports managed or unmanaged, and what it holds — or say that none is recorded and how to set one up. Use it before export_solution or push_solution to see what would move, and when a customization tool refuses for want of a solution.

NameTypeReqDescription
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…

No output schema declared.

No examples provided.

describe_table ~216

Describe a Dataverse table's columns, with the PowerPortalsPro editor each one maps to. Use this before writing a form or a grid: it gives you the exact column logical names and tells you whether a column needs a TextEdit, a LookupEdit, a ChoiceEdit and so on. Platform bookkeeping columns are hidden by default.

NameTypeReqDescription
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
filterstring|null–Only include columns whose logical or display name contains this text.
includeSystemboolean–Include audit and ownership columns that are normally hidden. Default false.
tablestringyesThe table's logical name, e.g. "contact". Use list_tables if you are unsure.

No output schema declared.

No examples provided.

enable_app_service_logging ~400

Send a web app's (or a deployment slot's) logs — every category it offers, its console output and HTTP requests among them — to the app's own Log Analytics workspace ("<app>-logs", in the app's resource group), kept for a set number of days. create_app_service already does this for a new app; use this for one created before, for a slot, or to change how long logs are kept. Safe to re-run: the workspace is reused and only its retention changed. The user is asked to confirm.

NameTypeReqDescription
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
environmentstring|null–Which of this folder's Dataverse environments the call is for: its name (e.g. "uat"), its position ("2") or its URL. The slot linked to that environment is the one acted on, so when the user is worki…
namestring|null–The web app. Omit to use the one recorded in this workspace's binding.
resourceGroupstring|null–The resource group, when the name is ambiguous.
retentionDaysinteger–Days to keep the logs, between 30 and 730. Default 60. Set on the app's workspace, so it applies to its slots too.
slotstring|null–Which deployment slot of the app: its name (e.g. "uat"), or "production" for the app itself. Omit it to use the slot linked to the environment — see `environment`. A folder that links no environment…

No output schema declared.

No examples provided.

enable_managed_identity ~342

Give the App Service a managed identity, so it can authenticate as itself with no secret. PREFER passing managedIdentityId with a user-assigned identity from create_managed_identity: a user-assigned identity is a resource of its own that survives the app being rebuilt and is shared across deployment slots. Omitting it turns on the app's SYSTEM-assigned identity instead, which is created and destroyed with the app and differs per slot - so rebuilding the app mints a new identity and orphans the Dataverse application user and Key Vault grants built on the old one. Free, safe to re-run, and the app restarts. The user is asked to confirm.

NameTypeReqDescription
confirmstring|null–Leave out on the first call, which changes nothing and returns the details to show the user. On the second, the code that call names.
managedIdentityIdstring|null–A user-assigned identity to attach: its name, or its full ARM resource id. Omit to turn on the app's own system-assigned identity, which is not recommended.
namestring|null–The web app. Omit to use the one recorded in this workspace's binding.
resourceGroupstring|null–The resource group, when the name is ambiguous.
useForKeyVaultboolean–Whether the app's Key Vault references should resolve as this identity, when they name none yet. Default true. Pass false for an identity shared between portals — the one a hosted portal signs in to…

No output schema declared.

No examples provided.

export_solution ~321

Export the solution recorded for an environment to a zip in the workspace's `solutions` folder, managed or unmanaged as `exportAs` says, or as recorded for the environment when it is left out (unmanaged unless the binding says otherwise). The solution's version goes up by one in its last part first — 1.0.0.3 becomes 1.0.0.4 — unless `version` sets it, so every export is told apart in the target's history. Waits up to ten minutes; a larger solution returns a job to finish with get_solution_export_status. push_solution exports and imports in one step. Changes made in the maker portal since the last publish are exported as last published, so run publish_customizations first if there are any.

NameTypeReqDescription
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…
exportAsstring|null–"managed" or "unmanaged", for this export only. Leave out to use the setting recorded for the environment, which is unmanaged unless create_solution or configure_solution set it to managed.
versionstring|null–The version to export as, e.g. "1.1.0.0". Leave out to add one to the last part.

No output schema declared.

No examples provided.

find_parity ~78

Check whether a component or feature exists on both the Blazor and React stacks, and what differs. Use it before assuming a Blazor parameter has a React equivalent, or vice versa — the two stacks are close but not identical.

NameTypeReqDescription
componentstringyesComponent or feature name, e.g. "MainGrid", "GridTemplateColumn".

No output schema declared.

No examples provided.

get_application_user ~210

Show the Dataverse application user for an Entra client id, the security roles it holds, and its column security profiles. Call it whenever the portal authenticates but every Dataverse call is refused — either there is no application user for the client id, or there is one and it holds no role, and both look identical from the portal's side — and whenever creating a portal user fails with 'does not have create permissions to a … secured field', which means it holds a role but no profile covering the secured contact columns.

NameTypeReqDescription
clientIdstringyesThe Entra application (client) id the portal connects with.
environmentstring|null–Which of this folder's Dataverse environments to use: its name (e.g. "test"), its position in the list ("2") or its URL. Omit it to use the primary environment, and only name another when the user as…

No output schema declared.

No examples provided.

Install

How do I install the Power Portals Pro MCP server?

Power Portals Pro runs locally as a NuGet package, launched with dnx PowerPortalsPro.Mcp@13.0.0 --yes. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

nuget · PowerPortalsPro.Mcp

# add to Claude Code
claude mcp add power-portals-pro-powerportalspro-mcp -- dnx PowerPortalsPro.Mcp@13.0.0 --yes
Common questions

What is the Power Portals Pro MCP server?

Power Portals Pro is an MCP server listed in the public MCP registry as io.github.Power-Portals-Pro/powerportalspro-mcp. Component API, code samples and Dataverse metadata for building Power Portals Pro portals. This page covers its NuGet package (PowerPortalsPro.Mcp).

Is the Power Portals Pro MCP server safe to use?

Power Portals Pro scores 80 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Power Portals Pro MCP server expose?

Power Portals Pro exposes 105 tools: add_app_registration_certificate, add_app_registration_federated_credential, add_app_registration_redirect_uri, add_app_registration_secret, add_powerbi_rls_role, and 100 more. Their descriptions and schemas cost roughly 28,369 tokens of context every time the server is loaded.

Is the Power Portals Pro MCP server still maintained?

Power Portals Pro is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.