MCP UI actions â hogyan vezĂ©rli a chat a kosĂĄr menetĂ©t
A Nortinia AI Chat egyik legtöbb fĂ©lreĂ©rtĂ©st okozĂł kĂ©pessĂ©ge az UI vezĂ©rlĂ©s. "A chat klikkel helyettem?" â igen, de nem Ășgy ahogy gondolod. A chat nem egy lĂĄthatatlan kurzort mozgat. A chat tool-okat hĂv meg, amelyeket a frontend regisztrĂĄl a useRegisterUIActions hook-on ĂĄt. Minden hĂvĂĄs preview-and-confirm.
A hat kosĂĄr-folyamati tool
A cart + checkout flow-ban hat MCP tool van regisztrĂĄlva per oldal-ĂĄllapot:
cart.removeItemâ egy tĂ©tel törlĂ©se a kosĂĄrbĂłl. ParamĂ©ter:lineId. Preview: "EltĂĄvolĂtom a kosĂĄrbĂłl: Pro license (1 db, 49âŹ). MegerĂ”sĂted?".cart.applyCouponâ kuponkĂłd alkalmazĂĄsa. ParamĂ©ter:code. Preview: "Alkalmazom a SUMMER25 kĂłdot (â25% a kosĂĄr teljes ĂĄrĂĄbĂłl). MegerĂ”sĂted?".cart.proceedToCheckoutâ ĂĄtvitel a checkout oldalra. ParamĂ©ter: nincs. Preview: "Ătviszlek a megrendelĂ©si oldalra. Folytatjuk?".checkout.fillFieldâ egy mezĂ” kitöltĂ©se. ParamĂ©ter:fieldId,value. Preview: "Kitöltöm az email mezĂ”t ezzel: anna@vasarlo.hu. MegerĂ”sĂted?".checkout.toggleConsentâ checkbox bekapcsolĂĄsa (ĂSZF, GDPR). ParamĂ©ter:consentId. Preview: "Bekapcsolom az ĂSZF-elfogadĂĄs jelölĂ”nĂ©gyzetet. MegerĂ”sĂted?". A consent kifejezetten csak explicit user megerĂ”sĂtĂ©s utĂĄn aktivĂĄlhatĂł, nem implicitbĂ”l.checkout.submitQuoteâ quote-only checkout esetĂ©n ajĂĄnlatkĂ©rĂ©s bekĂŒldĂ©se. ParamĂ©ter: nincs (a mezĂ”ket a felhasznĂĄlĂł töltötte ki). Preview: "BekĂŒldöm az ajĂĄnlatkĂ©rĂ©st. MegerĂ”sĂted?".
Minden tool a frontenden van regisztrĂĄlva. A chat backend csak hĂvja Ă”ket. A panel megjelenĂti a preview-t, Ă©s csak a felhasznĂĄlĂł kifejezett "igen" / OK kattintĂĄsa utĂĄn indul el az akciĂł.
Az XSS osztĂĄly, amit auditĂĄltunk
A tool-paramĂ©terek visszacsatolĂłdnak a UI-ba (preview-szövegben, dashboard-esemĂ©nyekben). Ez egy klasszikus XSS-vektor: ha a modell <script>alert(1)</script> Ă©rtĂ©ket ad, Ă©s a panel ezt naivan HTML-be teszi, megsĂ©rĂŒl a tenant biztonsĂĄga.
Két védelmi réteg fut:
- Schema-validĂĄciĂł â minden tool input Zod schema-n megy ĂĄt.
cart.applyCoupon.codepĂ©ldĂĄul:z.string().min(1).max(64).regex(/^[A-Z0-9_-]+$/). A<script>egyszerĂ»en nem ĂĄll össze. - Preview render-pipeline â a panel a tool-paramĂ©tereket plain text node-ban rendereli (
textContent, sohainnerHTML). MĂ©g ha valami ĂĄthĂșznĂĄ is a schema-szĂ»rĂ”t, a böngĂ©szĂ” nem Ă©rtelmezi HTML-kĂ©nt.
A pen-teszt kĂ©t kerek (2026 januĂĄr, mĂĄrcius) zĂ©rĂł talĂĄlt sebezhetĂ”sĂ©get hozott a chat-tool felĂŒleten. Ez a kĂ©t rĂ©teg megtartja.
A per-tenant tool registry
Nem minden tenant futtatja mind a hat tool-t. A cart.applyCoupon pĂ©ldĂĄul egy ajĂĄnlatkĂ©rĂ”s tenant-on (pl. nortinia.com /tanacsadas flow) Ă©rtelmetlen â ott nincs kupon. A registry tenant-szinten korlĂĄtozhatĂł:
// per-tenant tool registry példa
useRegisterUIActions([
cartRemoveItem,
cartProceedToCheckout,
checkoutFillField,
checkoutToggleConsent,
checkoutSubmitQuote,
// cartApplyCoupon szĂĄndĂ©kosan kihagyva â quote-only kosĂĄr
]);
A backend a tenant-konfigurĂĄciĂł alapjĂĄn hatĂĄrozza meg, hogy a model promptjĂĄba melyik tool-ok kerĂŒlnek bele. A modell nem tud olyan tool-t hĂvni, amit a frontend nem regisztrĂĄlt â duplĂĄn vĂ©dve a tenant logikĂĄjĂĄval.
Mit jelent ez gyakorlatban
Egy ĂĄtlagos kosĂĄr-folyamati session Ăgy nĂ©z ki:
- Felhasznåló: "Töröld a Starter-t, és tegyél hozzå kupont a kosårhoz."
- Chat: "EltĂĄvolĂtom a Starter license tĂ©telt (1 db, 19âŹ). MegerĂ”sĂted?"
- FelhasznĂĄlĂł: â
- Chat: "Van egy aktĂv SUMMER25 kupon (â25%). Alkalmazzam?"
- FelhasznĂĄlĂł: â
- Chat: "KĂ©sz. Az Ășj vĂ©gösszeg: 73.50âŹ. MegrendelĂ©si oldalra megyĂŒnk?"
- FelhasznĂĄlĂł: â
â
cart.proceedToCheckoutlefut.
NĂ©gy chat-ĂŒzenet, hĂĄrom kattintĂĄs, kosĂĄr-kasszĂĄs folyamat lefutott. HagyomĂĄnyosan ez 6-8 navigĂĄciĂł + form-mezĂ” klikkelĂ©s.
TanulsĂĄg
Az MCP UI actions nem egy varĂĄzs. Egy fegyelmezett kontrakt a chat Ă©s a frontend között, amit kĂłdba zĂĄrtunk, schema-val vĂ©dtĂŒnk, Ă©s tenant-szinten konfigurĂĄlhatĂł. A varĂĄzslat az, hogy ettĂ”l egyszerĂ»nek Ă©rzi a felhasznĂĄlĂł.