MCP-Server
Der Power Portals Pro MCP-Server gibt KI-Programmierassistenten beim Bau direktes Wissen über dieses Framework. Es handelt sich um einen Model Context Protocol-Server , der mit dem Framework ausgeliefert wird, und es gibt keinen Lizenzschlüssel und nichts, wofür man sich anmelden müsste.
Warum es existiert
Zwei Dinge, die ein Agent allein aus der Dokumentation nicht bekommen kann, und beide verursachen fehlerhaften Code:
- Die API-Oberfläche ist zu groß, um sie sich merken zu können. Mehrere hundert Komponenten über beide Stacks verteilt, jeder mit Dutzenden von Parametern. Ein Agent, der sich einen Parameternamen halb merkt, schreibt etwas Plausibles, das nicht kompiliert wird – oder schlimmer noch, kompiliert und nichts tut.
- Dein Dataverse befindet sich in keinem Dokument. Tabellen- und Spalten-logische Namen, Beziehungsschemanamen, Optionsset-Werte und – vor allem – gespeicherte View-GUIDs existieren nur in deiner Umgebung. Jedes Codebeispiel auf dieser Seite schreibt eine View-ID als Ellipse, weil es sonst nichts anderes schreiben könnte.
Was es beantwortet
- Das Framework – die vollständige Parameter- und Prop-Referenz für jede Komponente auf beiden Stacks mit Typen, Standardwerten und erlaubten Werten; vollständige Arbeitsproben, wortwörtlich von dieser Seite entnommen; die Guides; die Konventionen aus
AGENTS.md; und die Blazor-to-React-Paritätsmatrix. Sie ist versionsangepasst an die von Ihnen installierten Pakete. - Ihre Umgebung, schreibgeschützt – die Tabellen und Spalten, die Sie tatsächlich haben, welchen Editor jede Spalte zugeordnet ist, Beziehungsnamen, Optionsset-Werte und Ihre gespeicherten Ansichten mit ihren echten GUIDs.
Anmerkung
Jedes Dataverse-Tool liest Metadaten. Keines von ihnen liest, schreibt oder löscht einen Datensatz, daher ermöglicht es einem Agenten, einen Agenten auf eine Produktionsumgebung zu zeigen, die Form Ihrer Daten zu erkennen, ohne sie berühren zu können.
Hinzufügen zu einem Projekt
Zwei Orte, an denen es leben kann
Hier gibt es ein Henne-Ei-Problem, das es wert ist, explizit zu sein. Die Vorlagen schreiben die Konfiguration in das von ihnen erstellte Projekt ein – aber der Server ist am nützlichsten, bevor dieses Projekt existiert, wenn man eine Vorlage und ihre Optionen auswählt. Installiere sie also einmal für dich selbst und lass die jeweilige Projektdatei übernehmen.
Einmal pro Maschine, für jeden Ordner
Dadurch ist der Server überall verfügbar, auch in einem leeren Ordner, in den du gleich einbauen willst. Er kann dann antworten, welche Vorlage verwendet werden soll, welche Optionen es bedeuten und was danach konfiguriert werden soll. Absichtlich entpinnt, damit er die neueste Version verfolgt:
claude mcp add --scope user powerportalspro -- dnx PowerPortalsPro.Mcp --yes
Visual Studio liest eine Benutzerebene .mcp.json aus deinem Profilordner, Cursor verwendet ~/.cursor/mcp.json, und VS Code hat in seinen Einstellungen eine benutzerdefinierte MCP-Konfiguration. Jeder nimmt denselben servers Block.
Pro Projekt, an seine Version angepinnt
Projekte, die aus den Power Portals Pro-Vorlagen erstellt wurden, sind bereits verkabelt: Die Vorlage schreibt eine .mcp.json an der Lösungswurzel, die an die passende Serverversion gepinnt ist. Es gibt nichts zu tun.
Um es zu einem bestehenden Projekt hinzuzufügen, führe das im Projektordner aus – es schreibt dasselbe .mcp.json für dich:
claude mcp add --scope project powerportalspro -- dnx PowerPortalsPro.Mcp --yes
Beachte, was das nicht bewirkt: Der Server bleibt ungebunden, sodass der Ordner den neuesten veröffentlichten Server bekommt, anstatt den, der mit den Paketen übereinstimmt, auf PowerPortalsPro.* die dein Projekt verweist. Das ist der richtige Standard für ein Projekt, das die aktuelle Version verfolgt, und der falsche für ein Projekt, das absichtlich auf einer älteren Version gespeichert wird – pinne ihn, indem du die Version anhängst, so wie es die Vorlagen tun:
claude mcp add --scope project powerportalspro -- dnx PowerPortalsPro.Mcp@8.0.0 --yes
Oder schreibe die Datei selbst, am Kern deiner Lösung:
{
"servers": {
"powerportalspro": {
"type": "stdio",
"command": "dnx",
"args": [ "PowerPortalsPro.Mcp", "--yes" ]
}
}
}
Welche Datei dein Redakteur liest
Visual Studio 2022 17.14+ und Visual Studio 2026 lesen
.mcp.jsonaus dem Solution-Ordner, ebenso wie Claude Code. VS Code liest.vscode/mcp.jsonund Cursor liest.cursor/mcp.json– beide verwenden denselbenserversBlock, also kopieren Sie ihn quer.
dnx Wird mit dem .NET 10 SDK ausgeliefert, das Sie bereits besitzen: Jedes Power Portals Pro-Projekt wird von ASP.NET Core gehostet, inklusive React SPAs. Der erste Durchlauf lädt das Paket herunter und cacht.
Beide Einträge sind die vorgesehene Einrichtung. Die beiden Einträge verwenden denselben Servernamen, sodass ein Client, der beide Scopes versteht, die des Projekts verwendet – das heißt, du bekommst die versionsabgestimmten Antworten innerhalb eines Projekts und die neuesten überall sonst.
Der ppp-mcp-Befehl, falls du ihn möchtest
Die Terminalbefehle auf dieser Seite — login, status, und logout der Rest — laufen ohne Installation durch: dnx dnx PowerPortalsPro.Mcp login. Wenn Sie lieber tippen ppp-mcp loginmöchten, installieren Sie das Paket als globales .NET-Tool:
dotnet tool install --global PowerPortalsPro.Mcp
Das setzt auf dein PATH: Das .NET SDK fügt normalerweise seinen globalen Tools-Ordner – %USERPROFILE%\.dotnet\tools unter Windows, ~/.dotnet/tools macOS und Linux – hinzu. Wenn der Befehl nicht gefunden wird, öffne ein neues Terminal; falls nicht, füge diesen Ordner dir selbst hinzuPATH.ppp-mcp
Ein globales Tool bleibt auf der von dir installierten Version erhalten, wo dnx die neueste Version abgerufen wird, also aktualisiere es wie unten beschrieben. Dein MCP-Client kann den Server dnx in beide Richtungen starten: Beide lesen dieselben Ordnerbelegungen und dieselben gespeicherten Anmeldungen.
Ich prüfe, ob es funktioniert
Frag deinen Assistenten etwas, das nur der Server beantworten kann – zum Beispiel: "Benutze get_component_api, um mir alle Parameter auf MainGrid zu zeigen". Wenn das Tool nicht verfügbar ist, hat der Client die Konfigurationsdatei nicht übernommen; die meisten benötigen einen Neustart, nachdem sie hinzugefügt wurde.
Aktualisierung
Wie du aktualisierst, hängt davon ab, wie du es installiert hast.
- Installiert mit
dnx, unpinned – der maschinenweite Eintrag oben – muss nichts ausgeführt werden.dnxlöst jedes Mal die neueste Version aus deinen NuGet-Feeds auf, wenn dein Client den Server startet, sodass beim nächsten Neustart des Clients eine neue Version erscheint. - Gepinnt in ein Projekt.
.mcp.jsonDie Vorlagen schreibenPowerPortalsPro.Mcp@<version>, abgestimmt mit den Framework-Paketen, die das Projekt verwendet. Ändere diese Version, wenn du die Pakete aufrüstest, damit die Antworten weiterhin das Framework beschreiben, das das Projekt tatsächlich ausführt.
Installiert als globales Tool (dotnet tool install --global PowerPortalsPro.Mcp, was ppp-mcp auf deinem PATH):
dotnet tool update --global PowerPortalsPro.Mcp
Wichtig
Schließen Sie zuerst Ihren MCP-Client. Ein laufender Server hält seine eigenen Dateien offen, und das Update scheitert mit Zugriff auf den Pfad ... wird verweigert , bis sie nicht mehr verwendet werden. Starten Sie den Client danach erneut, um die neue Version zu laden.
Verbindung zu Dataverse
Die Dokumentationstools benötigen überhaupt keine Konfiguration. Die Metadaten-Tools benötigen eine Verbindung zu deiner Umgebung, und diese Verbindung gehört zum Ordner, nicht zur Maschine. Führe dies einmal im Projekt aus:
dnx PowerPortalsPro.Mcp login
Umgebungen gehören zum Ordner
Das bindet diesen Ordner an eine Umgebung. Wenn Sie über mehrere Kunden hinweg arbeiten, bleibt jedes Projekt in seinen eigenen Umgebungen angemeldet und Agenten in verschiedenen Ordnern überschneiden sich nie. Das ist das Einzige pac auth select , was man nicht kann – es wechselt ein einziges maschinenweites Profil, sodass ein Kundenwechsel an einem Ort das überall verändert.
Die Anmeldung verwendet standardmäßig den Gerätecode-Flow, also funktioniert es über SSH, innerhalb eines Containers und in WSL, und du kannst es auf einem Handy beenden. Lehn ab, --browser wenn du lieber einen öffnen möchtest.
Mehrere Umgebungen in einem Ordner
Ein Ordner kann gleichzeitig in mehrere Umgebungen angemeldet werden – zum Beispiel in den Entwicklungs-, Test- und Produktionsumgebungen eines Kunden. Jede login mit einer weiteren Umgebung fügt ihn der Liste des Ordners hinzu und --name gibt ihm den Namen, mit dem du ihn ansprechen wirst:
dnx PowerPortalsPro.Mcp login --environment https://contoso-dev.crm.dynamics.com --name dev
dnx PowerPortalsPro.Mcp login --environment https://contoso-test.crm.dynamics.com --name test
dnx PowerPortalsPro.Mcp login --environment https://contoso.crm.dynamics.com --name prod
Die erste Umgebung ist die primäre, und jedes Werkzeug wirkt darauf, es sei denn, du fragst nach einem anderen: "Liste die Ansichten zum Kontakt im Test auf" wird von testbeantwortet, und die nächste Frage geht zurück zur primären. Übergebe zulogin, --make-primary um stattdessen eine Umgebung als primäre Umgebung hinzuzufügen, oder bitte deinen Assistenten, sie neu zu ordnen.
Jede Antwort, die Dataverse berührt, beginnt damit, die Umgebung zu benennen, aus der sie stammt – Name, Position und URL – sodass eine in der Produktion vorgenommene Änderung nie genauso liest wie eine in der Entwicklung vorgenommene.
Wo Dinge gelagert werden
- Die Bindung –
.ppp/mcp.jsonim Ordner. Sie listet die Umgebungen in der Reihenfolge auf, mit Namen und Account für jede, birgt keine Geheimnisse und ist sicher zu committieren: Ein Teamkollege, der das Repository klont, wird auf die richtigen Umgebungen verwiesen, ohne dass es ihm mitgeteilt wird. - Ihr Token — wird in Ihrem Benutzerprofil gespeichert und vom Betriebssystem-Keystore verschlüsselt (DPAPI unter Windows, Keychain auf macOS, libsecret unter Linux). Es wird niemals in das Repository geschrieben. Wenn kein Keystore verfügbar ist, weigert sich die Anmeldung, anstatt ein Aktualisierungstoken auf der Festplatte frei zu lassen.
Der Token-Cache wird nach Umgebung verschlüsselt, sodass ein zweiter Klon desselben Kunden-Repositorys Sie nicht erneut auffordert, sich erneut anzumelden, während ein anderer Kunde das immer tut – und das gilt auch für jede Umgebung, die Sie einem Ordner hinzufügen.
Kommandos
Führe sie aus als dnx PowerPortalsPro.Mcp <command>, oder als ppp-mcp <command> ob du das globale Tool installiert hast. Alle diese funktionieren im aktuellen Ordner, es sei denn, du gibst --workspace.
login— melden Sie sich an und binden Sie eine Umgebung an diesen Ordner, nach einem bereits gebundenen Ordner. Optionen: , , , , ,--username <upn>--tenant <id>, .--browserNennen Sie eine Umgebung, die bereits gebunden ist —--environment test— um sich erneut anzumelden.--pac-profile <name>--make-primary--name <name>--environment <url>status– welche Umgebungen dieser Ordner verwendet und welche die primäre ist, woher jede Umgebungen stammt, welches Konto zwischengespeichert ist und ob jede Verbindung funktioniert.logout— Entfernen Sie eine Umgebung aus diesem Ordner:--environment <name>Zum einen--allfür jeden. Fügen Sie--forgetauch das gespeicherte Anmeldeformular hinzu.environments— listen Sie die Power Platform CLI-Profile auf, die gespiegelt werden können.azure—azure login, ,statusundlogoutsubscriptions: bindet diesen Ordner an ein Azure-Abonnement für die Bereitstellungstools.
Weitere Verbindungsmöglichkeiten
Die Umgebung und die Zugangsdaten werden in dieser Reihenfolge aufgelöst, sodass die expliziteste Absichtserklärung gewinnt:
- Umgebungsvariablen —
PPP_D365_URL,PPP_D365_CLIENT_IDundPPP_D365_CLIENT_SECRETim Serverblockenv. Ein Service Principal, und der Weg, dies in CI oder einem gemeinsamen Container zu verdrahten.PPP_D365_URLwird zur primären Umgebung, bevor der Ordner gebunden ist, und der Service Principal wird nur für die primäre verwendet. - Die Anmeldung des Ordners – geschrieben von
login. Der normale Pfad. - Die eigenen Einstellungen des Projekts – dieselben
D365:Url,D365:ClientIdundD365:ClientSecret(oderD365:Secret) das Portal selbst liest aus Benutzergeheimnissen undappsettings. Ein konfiguriertes Power Portals Pro-Projekt benötigt daher oft gar keine Anmeldung.
Power Platform CLI-Profile
Wenn du bereits Umgebungen in pacbehältst, kannst du von einer beginnen, anstatt nach einer URL zu suchen:
dnx PowerPortalsPro.Mcp environments
dnx PowerPortalsPro.Mcp login --pac-profile "Acme Dev"
Die CLI hat keinen Befehl, der ein Zugriffstoken ausgibt, und speichert Zugangsdaten in ihrem eigenen Store, sodass ihre Sitzung nicht direkt wiederverwendet werden kann. Was --pac-profile das tut, ist, die Umgebung und das Konto aus einem Profil zu nehmen und sich als dieses Konto anzumelden – meist ohne Aufforderung, weil du bereits eine Sitzung hast.
Anmerkung
Das eigene aktive Profil der CLI wird nie geändert.
pac auth selectwird absichtlich nicht verwendet: Es würde jedes Projekt gleichzeitig verschieben.
Die Werkzeuge
Man muss selten ein Werkzeug benennen – die Assistenten wählen es aus den Beschreibungen – aber es hilft zu wissen, was dort ist.
Dokumentation, immer verfügbar
find_parity Whether a component exists on the other stack
get_component_api Every parameter or prop, with types, defaults and permitted values
get_conventions The golden rules from AGENTS.md
get_doc One documentation section in full
get_example A complete working sample, verbatim
get_page_recipe Guide, both stacks' samples and API links for one topic
list_components Browse what the framework ships
search_docs Open questions across the guides, API reference and samples
whats_new Release notes
Deine Umgebung, einmal verbunden
describe_table Columns, and the editor each one maps to
list_choices Option-set values and labels
list_relationships Schema names for SubGrid and ManyToManyLookupEdit
list_tables Find a table's logical name
list_views Saved views with their real GUIDs
Wahl zwischen Umgebungen
Jedes Werkzeug, das Dataverse erreicht, nimmt einen optionalen environment Namen – einen Namen wie test, eine Position wie 2, oder die URL – und verwendet den primären ohne URL. Ein Name, der zu nichts passt, wird mit der Liste der vorhandenen Umgebungen abgelehnt und nie mit der nächstgelegenen abgeglichen.
dataverse_status Every environment this folder has, which is the primary, and whether each connects
remove_environment Stop this folder reaching an environment
link_environment_slot Tie an environment to an App Service deployment slot
rename_environment Call an environment what you call it: dev, test, prod
set_environment_index Reorder the environments; position 1 is the primary
Das Hinzufügen einer Umgebung erfordert eine Anmeldung, also login nur das. Den Rest kann dein Assistent erledigen, wenn du darum bittest. Das Verschieben einer Umgebung auf Position 1 ändert standardmäßig jede spätere Schreibfunktion, fragt set_environment_index dich zuerst, wann die Hauptumgebung geändert wird, und remove_environment fragt immer.
Die Platten selbst
Metadaten sagen, was die Form ist; diese sagen, was tatsächlich darin ist – welcher Optionsset-Wert eine Zeile wirklich trägt, ob eine Abfrage angezeigt wird, ob die Zeile, die dein Code gerade geschrieben hat, richtig war. Ein Agent, der nicht schauen kann, wird stattdessen raten.
get_record One row by id, a column per line so a wide record stays readable
read_records A page of any table, or anything FetchXML can express
Das Lesen liest sich wie Sie – der Service-Principal oder der angemeldete Benutzer, niemals als Portal-Nutzer. Keine der Tabellen-, Spalten- oder Zeilen-Berechtigungen des Portals gilt, sodass dies zeigt, was sich in der Umgebung befindet und nicht, was ein bestimmter Portal-Nutzer angezeigt hätte. Das FetchXML einer gespeicherten Ansicht läuft wortwörtlich.
Ein neues Projekt zum Laufen bringen
check_setup What this folder still needs before the portal will start
get_setup_plan The steps to a running portal, and what each one needs
get_setup_script A reviewable script that performs them, with your values filled in
get_upgrade_plan Moving to a newer release: what breaks, and which files name a version
get_upgrade_plan ist derjenige, der aufgerufen werden muss, bevor eine Versionszeichenkette geändert wird. Es liest die Version, auf die dieses Projekt verweist, berechnet heraus, welche Freigaben zwischen dieser und dem Ziel liegen, und gibt jede fehlerhafte Änderung darin mit seinen Migrationsanweisungen zurück – zusammen mit den Dateien, die eine Version benennen, einschließlich des Server-Pins .mcp.json , den sonst nichts fangen würde. Das Bumpen der Pakete ohne diese führt zu Build-Fehlern, deren Ursache mehrere Releases zurückliegt.
Die verwaltete Lösung
Das Framework muss installiert werden PowerPortalsProCore , bevor ein Portal läuft, und PowerPortalsProLocalization wenn du lokalisierst. Diese rufen eine Veröffentlichung ab und importieren sie ohne Power Platform CLI, sodass die Umgebung, die sie erreichen, diejenige ist, an die dieser Ordner gebunden ist, und nicht die, auf die pac gerade verwiesen wird.
get_solution_import_status How an import started by install_solution is going
install_solution Download a managed solution and import it
list_solutions What is installed, and which releases are available
publish_customizations Make pending maker-portal changes live
Ein Import ist langwierig, startet install_solution ihn daher und gibt eine Job-ID zurück; get_solution_import_status berichtet Fortschritt und Ergebnis mit der eigenen Nachricht von Dataverse, wenn er fehlschlägt.
Anmerkung
publish_customizationsist dieselbe Aktion wie Alle Anpassungen im Maker-Portal veröffentlichen , sodass alles , was in der Umgebung aussteht, nicht nur Ihre eigenen Änderungen veröffentlicht werden – sondern in einer gemeinsamen Entwicklungsumgebung, die die halbfertige Arbeit eines Kollegen live machen kann. Sie ist nicht mehr erforderlichinstall_solution: Das Importieren einer verwalteten Lösung veröffentlicht, was sie bringt.
Deine eigene Lösung
Änderungen, die der Server an einer Umgebung vornimmt – eine erstellte Sicherheitsrolle, ein gewährtes oder zurückgenommenes Privileg – gehen in eine eigene Lösung ein, die für diese Umgebung in aufgezeichnet wird.ppp/mcp.jsoncreate_solution. Richtet den Publisher und die Lösung einmal in der von dir erstellten Umgebung ein; bis eine aufgezeichnet ist, weigern sich die Tools, die Dataverse anpassen, weil eine außerhalb einer Lösung vorgenommene Änderung in der Standardlösung feststeckt, wo sie nichts exportieren kann.
configure_solution Record an existing solution, or change how it exports
create_solution A publisher and an unmanaged solution, recorded for the environment
describe_solution The recorded solution, its version and what it holds
export_solution Save it under solutions/, managed or unmanaged as recorded
get_solution_export_status Finish an export that took longer than the tool waits
push_solution Export it and import it into another of the folder's environments
Die Bindung zeichnet außerdem auf, ob die Lösung unmanaged reist (standardmäßig für Umgebungen, in denen auch gearbeitet wird ) oder verwaltet (für Umgebungen, die sie nur erhalten). export_solution Sie hebt den letzten Teil der Version hoch, speichert die ZIP im Arbeitsbereich, exportiert push_solution sie und importiert sie in eine andere Umgebung, die an denselben Ordner gebunden ist – Build in Dev, Push to Test und Production. Eine Lösung, die von Power Portals Pro abhängt, kann nicht importieren, bis das Ziel diese ebenfalls hat.
Portalrollen
Eine Portal-Rolle besteht zur Hälfte aus Code, zur Hälfte aus Daten. Der Entwickler entscheidet, was der Name "Dealer" verleiht; ein Administrator entscheidet, wer sie hält; nichts verbindet die beiden außer dem String. Diese halten das Dataverse zur Hälfte vom selben Ort aufrecht, an dem der AddPortalRole Aufruf geschrieben ist.
create_portal_role A role for an AddPortalRole registration to bind to
create_portal_role_configuration Decide which new users are given a role
delete_portal_role Remove a role, and every assignment of it
delete_portal_role_configuration Stop giving a role to new users, leaving the role in place
list_portal_roles The roles, and which of them new users start with
update_portal_role Rename, describe, or activate/deactivate a role
update_portal_role_configuration Change which new users are given a role
Die Zeichenkette ist der gesamte Join. Ein Tippfehler zwischen der Registrierung und dem Datensatz erzeugt eine Rolle, die registriert, zuweisend ist und nichts gewährt – ohne Fehler. Wenn der Agent, der gerade die Registrierung geschrieben hat, den passenden Datensatz erstellen lässt, schließt das diese Lücke und check_setup erkennt die bereits vorhandenen Fehlanpassungen: Es vergleicht jeden im Projekt geschriebenen Rollennamen mit den Datensätzen und meldet alle fehlenden oder inaktiven Personen.
Eine Portal-Rollenkonfigurationszeile entscheidet, welche neu registrierten Benutzer eine Rolle erhalten: jeden einzelnen oder solche, die den FetchXML-Kriterien entsprechen. Kriterien werden vor der Erstellung der Zeile mit den Regeln des Portals überprüft, weil das Portal bei schlechten Kriterien nicht geschlossen wird und eine defekte Regel genau wie eine Regel aussieht, die korrekt zu niemandem passt. Administratoren bearbeiten dieselben Zeilen auf der Rollenkonfigurationsseite des Portals.
Anmerkung
Das Löschen einer Rolle wirft jede Zuweisung weg und nichts erinnert sich, wer sie hatte. Deaktivierung gewährt nichts und macht auch keinen Anspruch, behält aber die Zuweisungen, sodass es der rückgängige Weg ist, eine Rolle auszuschalten. Beide Löschwerkzeuge bitten dich zuerst um eine Bestätigung.
Lizenzierte Webseiten
Ein Power Portals Pro Website-Eintrag lizenziert ein Portal, das von einer bestimmten URL aus bereitgestellt wird. Diese listen sie auf, fügen sie hinzu und pflegen sie – typischerweise einmal pro Umgebung und erneut, wenn ein Portal zu seinem Produktionshost wechselt.
create_portal_website Licence a new URL
delete_portal_website Remove the record, and the licence with it
list_portal_websites The URLs licensed here, and whether each has a key
update_portal_website Correct a URL, set a new key, or deactivate one
Das ist das Erste, was überprüft werden sollte, wenn jeder Endpunkt 402 zurückgibt. Ohne einen passenden aktiven Datensatz lehnt jeder Datenendpunkt auf diesem Host die Anfrage ab. Das Löschen eines Datensatzes nimmt die Lizenz ab der nächsten Anfrage mit, daher deaktiviere lieber während der Untersuchung; die Löschung bittet dich zur Bestätigung.
Azure-deployment
Die meisten dieser Tools lesen nur. Diese brauchen im Abonnement nichts anderes als Reader und beantworten die Fragen, die die Leute Tage kosten. check_deployment Ist das, was man kennen sollte: Es vergleicht, was das Projekt braucht, mit dem, was der App Service tatsächlich hat, und nennt den Fehler – eine erforderliche Einstellung, die nur in Ihren Benutzergeheimnissen existierte, in der Umgebung, die auf Development verbleibt, WebSockets auf einem Blazor-Portal, einen Portal-Website-Eintrag, der den bereitgestellten Host nicht abdeckt, ein Portal, das keinen Zugang zu Dataverse hat.
azure_status Which subscription this folder deploys to, and whether it connects
check_deployment What the project needs vs. what is actually deployed
configure_app_service Apply the recommended platform settings to an existing app
create_app_service Resource group, plan and web app, configured for your stack
create_deployment_slot A slot that runs against one of your environments, linked to it
deploy_to_app_service Build with dotnet publish and push the result
describe_app_service One app's platform configuration and setting names
enable_app_service_logging Send an app's logs to a workspace of its own, kept 60 days
get_deployment_plan The steps, and every plan tier with its current price
list_app_services The web apps in the subscription
list_deployment_slots The slots, the environment each runs against, and the links
restart_app_service Restart the web app, after confirming
set_app_service_settings Merge application settings
swap_slots Promote a slot's build, each slot keeping its own environment
Sieben Tools ändern den App Service: create_app_service, , , deploy_to_app_serviceset_app_service_settings, , restart_app_service, und create_deployment_slot swap_slots. Jedes von ihnen bittet dich zu bestätigen und teilt dir mit, was es kosten wird, bevor du antwortest – die tatsächliche monatliche Zahl für deine Region, abgelesen aus der öffentlichen Preisliste von Azure, mit dem Hinweis, dass die Einzelhandelsliste jegliche Enterprise Agreement oder Reservierungen ignoriert, die du hältst. Neue Ressourcen setzen standardmäßig auf die günstigste Stufe, die für jede Umgebung einschließlich der Produktion warm bleibt, in der Annahme, dass spätere Skalierung eine Minute dauert und Überprovisionierung ein Gesetz ist, das niemand wieder aufnimmtconfigure_app_service.
Bei einem Standard- oder Premium-Tarif kann ein Portal Deployment-Slots haben, von denen jeder gegen seine eigene Dataverse-Umgebung läuft – einen uat Slot gegen UAT, während die Produktion gegen die Produktion läuft. create_deployment_slot Erstellt einen und verknüpft ihn mit der Umgebung, sodass beim Arbeiten in UAT und eine Deploy-Anfrage der Build an den UAT-Slot statt in die Produktion geht. Die Einstellungen, die eine Umgebung benennen, sind so markiert, dass sie bei ihrem Slot bleiben, sodass swap_slots der getestete Build in die Produktion gebracht werden kann und er startet mit den Produktionsdaten. Ein Swap wird abgelehnt, wenn das eine Umgebung in eine andere übertragen würde.
Anmerkung
Diese verwenden nicht die Azure-CLI und lesen oder ändern niemals den angemeldeten Zustand. Laufen
ppp-mcp azure loginSie im Ordner: Wie bei der Dataverse-Bindung gehört das Abonnement ausschließlich zu diesem Ordner, sodass mehrere Projekte gleichzeitig verschiedene Kunden ansprechen können.az account showSagt Ihnen nichts darüber, was diese Tools bewirken.
Entra-App-Registrierungen
Die beiden Registrierungen, die ein Portal benötigt, und die darauf folgenden Jobs. Das sind die Schritte, die die meisten Setups blockieren: Es sind zwei separate Registrierungen statt einer, die Anmelde-App benötigt eine Antwort-URL mit einem Port, der die Vorlage zufällig generiert hat, und ein Client-Geheimnis verliert ein Jahr später und stoppt das Portal mit einem Fehler, der Entra nie erwähnt.
add_app_registration_certificate Sign in as an app with a Key Vault certificate, no secret
add_app_registration_federated_credential Let a managed identity be an app's credential, no secret
add_app_registration_redirect_uri Add the production reply URL after a deployment
add_app_registration_secret Rotate a secret before it lapses
add_table_privileges_to_role Give your own role access to a table (never a managed one)
assign_application_user_column_profile Grant the secured contact columns a role cannot
assign_application_user_role Grant the application user a security role
create_dataverse_app_registration The backend identity the portal reads Dataverse as
create_dataverse_application_user The Dataverse half, with its security role
create_security_role An empty role of your own, for your tables' privileges
create_signin_app_registration The app behind "Sign in with Microsoft"
delete_security_role Delete a role of your own that nobody holds any more
describe_role_table_privileges What a role grants on one table, and at what depth
get_application_user Does Dataverse know this client id, and what may it do?
list_app_registrations Client ids, reply URLs and secret expiry dates
list_security_roles What roles the environment offers
remove_app_registration_certificate Retire an old certificate after a rotation
remove_application_user_column_profile Take back the secured contact columns
remove_application_user_role Take back a security role
remove_table_privileges_from_role Take a table's privileges back from a role, or lower them
Die Werkzeuge haben keine eigenen Rechte. Jeder Aufruf läuft über ein delegiertes Token für das Konto, mit dem du dich angemeldet hast, das an einen öffentlichen Client ausgegeben wird, der kein Geheimnis enthält – jede Operation ist also genau dann erfolgreich, wenn du sie manuell im Portal hättest ausführen können, und wird mit einem 403-Formular abgelehnt, das die Verzeichnisrolle nennt, die du brauchst, obwohl du es nicht könntest. Melde dich als Account Inhaber von Application Developer oder höher an, und diese funktionieren; melde dich als jeder andere an, und sie können keinen Schaden anrichten. Es werden keine API-Berechtigungen angefordert und keine Admin-Zustimmung erteilt, da keine der Registrierungen eine benötigt.
Beide Hälften, weil keine allein funktioniert. Eine App-Registrierung erhält ein Token; ein Nutzer der Dataverse-Anwendung entscheidet, was dieses Token bewirken darf. Eine Registrierung ohne solche authentifiziert sich perfekt und wird dann von jedem Aufruf abgelehnt, was als unterbrochene Verbindung und nicht als fehlendes Objekt gelesen wird – und ein Anwendungsbenutzer ohne Sicherheitsrolle wird erstellt, sichtbar, scheinbar in Ordnung und darf nichts tun. create_dataverse_application_user Macht die zweite Hälfte und weist die Rolle im selben Schritt zu. Dies ist der einzige Ort, an dem der Server außerhalb seiner eigenen drei Tabellen schreibt, zugegeben, weil ein Anwendungsbenutzer Infrastruktur und nicht Kundendaten ist; kein Tool erstellt, ändert oder löscht einen Geschäftseintrag.
Sie arbeiten an bereits existierenden Registrierungen. Jedes create_*_registration Tool akzeptiert ein clientId, und mit einem übernimmt es diese Registrierung, anstatt eine zu erstellen – fügt ein Geheimnis hinzu, fügt neue Antwort-URLs zusammen, schreibt die Zugangsdaten an der gewünschten Stelle. Die Bestätigung sagt dann, man soll der bestehenden Registrierung ein Geheimnis hinzufügen , anstatt es zu erstellen, sodass man nie eine Operation genehmigt und eine andere bekommt. Die Tools, die eine bestehende Registrierung ändern, add_app_registration_redirect_uri und add_app_registration_secret, nehmen ebenfalls eine Client-ID und bevorzugen sie: Anzeigenamen sind nicht eindeutig, und ein Tenant mit drei Registrierungen namens "Portal" ist normal.
Ein erstelltes Client-Geheimnis wird standardmäßig nicht zurückgegeben. Es geht direkt von der Graph-Antwort in die Benutzergeheimnisse des Projekts, eine App-Service-Anwendungseinstellung oder beides, und das Tool berichtet, wohin es gegangen ist und wann es abläuft, anstatt das, was es war. Wenn ein Geheimnis an einen Ort gelangen muss, den der Server nicht schreiben kann – die Maschine eines Kollegen, ein CI-Geheimspeicher, ein Tresor in einem anderen Abonnement – fragen Sie nach destination: "return" und der Wert wird Ihnen zum Kopieren angezeigt. Die Bestätigung sagt das, bevor Sie zustimmen, und das Ergebnis enthält die Warnung, die sie verdient: Das Geheimnis befindet sich dann im Transkript, also behandeln Sie es als offen, wenn dieses Transkript gespeichert ist, und rotieren Sie es bei Zweifeln. Geheimnisse werden standardmäßig für 24 Monate geprägt – das längste, das Entra-Portal bietet – weil der Ausfall dieses Frameworks tatsächlich ein verfallenes Geheimnis und kein gestohlenes ist: Das Portal beginnt an einem Datum, das niemand erwähnt hat, mit einem Fehler, der Entra nie erwähnt. Diese Obergrenze gehört der Benutzeroberfläche des Portals, nicht der API, sodass expiryMonths alles bis zu 120 (10 Jahre) akzeptiert wird, obwohl man lieber alle fünf Jahre rotieren würde, als ein Ausfall zu riskieren. Es ist nicht der Standard, denn ein Zugangsdaten, den kein Administrator von Hand erstellt haben könnte, ist überraschend – also sagt die Bestätigung, wie viele Jahre man angefordert hat und dass das Portal es nicht liefern konnte.
Eine App kann sich mit einem Zertifikat statt mit einem Geheimnis anmelden.add_app_registration_certificate erstellt ein Zertifikat in Key Vault, dessen privater Schlüssel niemals exportiert werden kann, und fügt seine öffentliche Hälfte zur Registrierung hinzu. Binde eine Umgebung an diese App mit ppp-mcp login --environment <url> --client-id <id> --certificate <url> und der Vault signiert jede Anmeldung für denjenigen, der Key Vault Crypto User darauf hält, sodass kein Geheimnis auf einer Maschine liegt. Um zu rotieren, führe dasselbe Tool erneut aus;remove_app_registration_certificate das alte Zertifikat wird zurückgezogen, sobald es niemand mehr nutzt.
Anmerkung
Zwei Dinge fehlen absichtlich. Das Löschen einer Registrierung kann die Anmeldung für jede Anwendung in einem Tenant deaktivieren und kann nur innerhalb eines 30-Tage-Fensters wiederhergestellt werden. Das Erteilen der Administrator-Zustimmung ist die Operation, die eine enge delegierte Handlung in eine dauerhafte tenantweite Berechtigung verwandelt. Beides ist nicht nötig, um ein Portal zum Laufen zu bringen, daher wird keines angeboten. Das Erstellen des Dataverse-Anwendungsbenutzers für die neue Client-ID ist ebenfalls ein separater Schritt – die Toolausgabe gibt Ihnen den Befehl.
Das Geheimnis entfernen, das abläuft
Ein Client-Geheimnis ist der Teil eines bereitgestellten Portals, der an einem Datum aufhört zu funktionieren, das niemand aufgeschrieben hat. Diese entfernen es oder verschieben den Rest an einen Ort, an dem es ohne Neu-Deploying rotiert werden kann.
create_key_vault A vault the managed identity can read, for the secrets that remain
create_managed_identity A user-assigned identity, independent of any one app
enable_managed_identity Attach a managed identity to the App Service
list_user_secret_keys The keys in the project's user secrets — names, never values
push_secrets_to_key_vault Copy the user secrets you approve into the vault, and point the app at them
Setze D365__ManagedIdentityId auf die Client-ID der Identität – nicht auf die Objekt- oder Haupt-ID, die das Azure-Portal zuerst zeigt – und gib dieser Client-ID einen eigenen Dataverse-Anwendungsnutzer, wie create_dataverse_application_user bei jedem anderen Portal. Das Portal verbindet sich dann ohne jegliches Geheimnis.
Der E-Mail-Absender
Das Portal sendet Bestätigungs- und Passwort-Zurücksetzungs-Mails von einer Adresse, die zu einer Warteschlange oder einem aktivierten Benutzer in Dataverse aufgelöst werden muss. create_email_queue Erstellt die Warteschlange, genehmigt ihr Postfach und führt Test & Enable aus, wobei das Ergebnis gemeldet wird; check_email_sender erklärt, warum ein Absender nicht zustellt. Eine Warteschlange ist der richtige Absender für eine No-Response-Adresse, statt des Briefkastens einer Person.
check_email_sender Why mail from the sender address is not arriving, and what to fix
create_email_queue A queue for the portal's outbound mail, approved and tested
list_email_queues The queues in the environment, and the addresses they send from
Wichtig
Zwei Dinge, die es für Sie nicht tun kann. Die Adresse benötigt ein Postfach in Exchange Online – ein gemeinsames Postfach, das keine Lizenz benötigt – und nur ein Office-365-Globaladministrator oder Exchange-Administrator kann es genehmigen. Wenn eines eines fehlt, sagt das Tool an, welches, und das erneute Ausführen, sobald es behoben ist, ist der Auftrag abgeschlossen. Bis Test & Enable bestanden ist, akzeptiert Dataverse die E-Mail des Portals und liefert nichts – vom Erfolg des Portals nicht zu unterscheiden, weshalb das Tool es testet, anstatt einen sauberen Abschluss zu melden.
Arbeit in anderen Sprachen
Das Wissen, das der Server zurückgibt, ist Englisch, und das ist absichtlich. Dein Assistent liest es – du siehst nie direkt eine Antwort des Tools – also übersetzt es für dich: Frag in deiner eigenen Sprache, und es antwortet in deiner eigenen Sprache. Was es nicht übersetzen darf, ist der Code. Komponenten-, Parameter- und Spaltennamen sind in jedem Projekt auf Englisch, egal in welcher Sprache das Gespräch stattfindet, daher verhindert das Beibehalten des Referenzenglischen dafür, dass ein Assistent einen übersetzten Parameternamen erfindet, der nicht existiert.
Anmerkung
Fragen, die etwas benennen —
“MainGrid Ansichten konfigurieren”— funktionieren bereits in jeder Sprache, weil Komponentennamen überall gleich sind. Die Tools sagen Ihrem Assistenten auch, er soll auf Englisch suchen, daher funktionieren auch Fragen, die nichts benennen.
Fehlerbehebung
- "Keine Dataverse-Umgebung ist an diesen Projektordner gebunden" – führe
loginin diesem Ordner aus. Überprüfe, dass du dich in dem Ordner befindest, von dem du glaubst, dass du dich befindest:statusDruckt die Wurzel des Arbeitsbereichs, es wurde gelöst. - "Die gespeicherte Anmeldung ist nicht mehr gültig" – das Aktualisierungstoken ist abgelaufen oder wurde widerrufen, oder der Tenant benötigt nun eine neue Interaktion. Führen Sie erneut aus
login. - "Der Betriebssystem-Schlüsselspeicher ist nicht verfügbar" – üblich auf einer headless Linux-Box ohne libsecret-Daemon. Verwenden Sie dort stattdessen einen Service Principal über die
PPP_D365_*Umgebungsvariablen. - Eingeloggt, aber die Umgebung lehnt die Verbindung ab – das Konto hat sich authentifiziert, hat aber keinen Zugriff auf diese Umgebung. Überprüfen Sie die URL oder melden Sie sich als anderer Benutzer mit
--usernamean.
