@auth0/agent-components
@auth0/agent-components — Auth0 Universal Components for Agents
Verwandeln Sie ein Auth0 Form in eine MCP App — eine interaktive UI, die ein Model Context Protocol-Server einem MCP-Client bereitstellt und in einem Sandbox-iframe rendert. Das ist Auth0 Universal Components for Agents: Jedes Auth0 Form wird zu einer direkt einsetzbaren, agentenaufrufbaren UI, ganz ohne Auth0 Action.
Status: Proof of Concept. Funktioniert Ende-zu-Ende mit der offiziellen MCP Apps-Fähigkeit (SEP-1865), dem MCP Inspector und CopilotKit (siehe
examples/copilotkit-poc).
Warum
Auth0 Forms werden normalerweise nur innerhalb einer Auth0 Action während des Universal Login gerendert. Das dx-flows-sdk hat das entkoppelt: Ein Formular kann über das Browser-Bundle außerhalb einer Login-Weiterleitung eingebettet werden. MCP Apps erlauben einem Server, einem Client interaktives HTML zum Rendern in einem Sandbox-iframe zu übergeben. Beides zusammen ergibt: Ein Agent kann ein echtes, voll funktionsfähiges Auth0 Form — Sign-up, Consent, Profil, Zahlung — als eines seiner Tools verfügbar machen.
Related MCP server: Homespun
So funktioniert es
MCP host (e.g. MCP Inspector, CopilotKit)
└─ sandboxed iframe ← our ui:// HTML resource (text/html;profile=mcp-app)
├─ <script src="https://<tenant>/forms/sdk/forms.js">
├─ Auth0Forms.embed(formId, "#root", { fields: { session_token } })
│ └─ form submits to its OWN Auth0 backend (/forms/api/...) ← we never see the data
└─ bridge: on af-submitForm-success → app.updateModelContext({ status: "completed" })
→ app.requestTeardown() (close the app view)
on af-redirect → app.openLink(url) (never navigates the iframe)Das Formular besitzt seine Daten. Das Auth0 Form übermittelt nativ an sein Auth0-Backend. Die MCP-Schicht liest oder überträgt niemals Feldwerte — sie meldet nur einen Abschlussstatus (completed / cancelled / errored plus optional ein Weiterleitungsziel), damit der Agent weiß, dass der Benutzer fertig ist.
Pakete
Paket | Was es ist |
| |
| |
Ausführbarer MCP-Server-POC; steuern Sie ihn über den MCP Inspector. Enthält | |
CopilotKit als MCP-Client — echter Auth0-Login ( |
Verwendung
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { registerAuth0Forms } from "@auth0/agent-components";
const server = new McpServer({ name: "my-server", version: "1.0.0" });
await registerAuth0Forms(
server,
[
{
formId: "your-form-id",
tenantOrigin: "https://your-tenant.us.auth0.com",
// inputMode: "prefill", // expose form fields as optional agent inputs
// ui: { csp: { frameDomains: ["https://js.stripe.com"] } }, // for payment/social steps
onComplete: (r) => console.log(r.formId, r.status), // status only — no field data
},
],
{ assumeUiSupport: true }, // register before connect; see "Registration timing"
);
// ...connect your transport (StreamableHTTP / stdio / SSE)Jedes Formular registriert:
ein Tool
open_form_<slug>, dessen_meta.ui.resourceUriauf … zeigteine Ressource
ui://agent-components/<formId>, die das Formular-App-HTML plus einen CSP-Block zurückgibt.
CSP
Der Host rendert die Ressource unter einer strikten Standard-Richtlinie (default-src 'none'). @auth0/agent-components nimmt Ihre tenantOrigin automatisch in beide Zulassungslisten auf:
csp.resourceDomains— damitforms.js, Styles, Schriften und Bilder geladen werden, undcsp.connectDomains— damit derfetchdes Bundles zu/forms/api/...funktioniert.
Wenn ein Formularschritt ein iframe einer anderen Origin einbettet (Stripe, ein Social-Provider, ein Captcha), deklarieren Sie es:
ui: { csp: { frameDomains: ["https://js.stripe.com", "https://hooks.stripe.com"] } }Beobachten Sie beim ersten Rendern eines neuen Formulars die Browser-Konsole: Jede CSP-Verletzung verrät Ihnen genau, welche Origin Sie hinzufügen müssen.
Sitzungsgestützte Formulare (Flow-/Router-Formulare)
Formulare mit einem FLOW/ROUTER-Knoten benötigen eine authentifizierte Sitzung — andernfalls schlägt der Schritt nach dem Router mit ERR_INVALID_FORM_SESSION fehl. Der Mechanismus (mit dem Forms-Team bestätigt, Ende-zu-Ende verifiziert):
Deklarieren Sie ein verstecktes Feld im Formular (z. B.
session_token).Der Flow des Formulars liest es — z. B. eine
Update User-Aktion mituser_id: {{fields.session_token}}.Der MCP-Server, der als OAuth-Ressourcenserver fungiert, verifiziert das Auth0-Token des Aufrufers, ermittelt die
subdes Benutzers, erstellt ein kurzlebiges, vertrauenswürdiges JWT für diesesub(signiert mit einem gemeinsamen Geheimnis, dem das Forms-Backend vertraut) und injiziert es pro Anfrage in das versteckte Feld.
Markieren Sie das Formular als sitzungsbewusst:
{
formId: "ap_...",
session: { field: "session_token" }, // must match the form's hidden field
}…und initialisieren Sie den Client mit der serverbezogenen Vertrauenskonfiguration plus einem Resolver, der die verifizierte Identität ausliest (verifier und subFromExtra stammen aus dem /auth-Unterpfad, unterstützt von @auth0/auth0-api-js):
import { createAgentComponents } from "@auth0/agent-components";
import { subFromExtra } from "@auth0/agent-components/auth";
const agentComponents = createAgentComponents({
tenantOrigin: "https://your-tenant.auth0.com",
assumeUiSupport: true,
sessionTrust: { secret: process.env.FORMS_TRUST_SECRET! }, // shared with the Forms backend
resolveUserSub: subFromExtra, // returns the caller's `sub`, or undefined
});
await agentComponents.register(server, forms);Der POC-Server (examples/poc-server) implementiert den vollständigen Ablauf: createAuth0Verifier (→ @auth0/auth0-api-js), einen ProtectedResourceMetadataBuilder-Metadata-Endpunkt und requireBearerAuth — so ermöglicht eine 401 + WWW-Authenticate-Herausforderung dem Client, den Auth0-OAuth-Ablauf auszuführen. Token, sub und erstelltes JWT gelangen nie in den MCP-Modellkontext — das erstellte Token reist über embed().fields ausschließlich an das Auth0-Forms-Backend.
Hinweis: Ein abgeschlossener Auth0-Forms-Journey ist derzeit nur einmal verwendbar (das erneute Senden eines verbrauchten Journeys gibt
ERR_INVALID_FORM_SESSIONzurück). Universal Portals EPIC 7 fügt erneut abschließbare Journeys hinzu. Die MCP App schließt einmal ab und meldet den Status, sodass ein neuer Tool-Aufruf einen neuen Journey erhält — erneutes Senden ist nicht Teil des Ablaufs.
Zeitpunkt der Registrierung
Das MCP SDK verbietet, eine Fähigkeit nach server.connect(transport) hinzuzufügen. Zwei unterstützte Muster:
Vor dem Connect registrieren (am einfachsten) mit
assumeUiSupport: true. Richtig für UI-fähige Clients (MCP Inspector, Claude). Genau das macht der POC.Dynamische Steuerung pro Client (
assumeUiSupport: "auto", der Standard): Rufen SieregisterAuth0Formsausserver.server.oninitializedauf, damit die Fähigkeiten des Clients bekannt sind — und konstruieren Sie den Server mit{ capabilities: { tools: {}, resources: {} } }, oder registrieren Sie vor dem Connect ein Tool + eine Ressource, damit die Registrierung nach dem Connect nicht versucht, eine neue Fähigkeit hinzuzufügen.
Entwicklung
npm install
npm run build # builds all packages (agent-components builds its bridge first)
npm test # unit tests (form→tool, ui-template CSP, bridge status-only contract)Lizenz
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
Renders dashboards, forms and tables inline in the chat as Angular Material components (MCP App).
112An AI concierge that turns static forms into adaptive AI conversations. From any MCP client.
Connect any AI agent to 1,000+ apps and 27,000+ actions through one remote MCP server (OAuth).
Agent-Native form builder - create, edit, and manage forms
Related MCP Servers
- AlicenseAqualityAmaintenanceHand a human a rich interactive UI by URL from any MCP client and get structured data back — forms, approvals, surveys, pickers, editable lists. Round-trip human-in-the-loop for agents.262 npm7MIT
- AlicenseAqualityBmaintenanceHand a human a rich interactive UI by URL from any MCP client and get structured data back: forms, approvals, surveys, pickers, editable lists. Round-trip human-in-the-loop for agents.201MIT
- FlicenseNot gradedqualityCmaintenanceEnables authenticated MCP apps to expose and interact with Auth0 Forms, submitting form data directly to Auth0 while only completion status is returned to the agent.-
- AlicenseNot gradedqualityAmaintenanceEnables agents to ask users questions through rich, browser-rendered HTML forms and receive structured answers, supporting approvals, choices, free-text, and form inputs.11 npmMIT