@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.
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 installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
An AI concierge that turns static forms into adaptive AI conversations. From any MCP client.
Create and wire up contact forms from your coding agent. Forms, snippets, and submissions.
Phone, SMS & email for AI agents — one remote MCP endpoint, OAuth login, zero install.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mustafadeel/universal-components-agents'
If you have feedback or need assistance with the MCP directory API, please join our Discord server