UgrĂĄs a tartalomhoz
← Vissza a blogra

MCP UI actions — hogyan vezĂ©rli a chat a kosĂĄr menetĂ©t

Hat MCP tool a kosår-checkout flow-ban (remove/coupon/proceed/fill/consent/submit). Mindegyik preview-and-confirm. XSS-védelem: Zod schema + textContent rendering.

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:

  1. 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?".
  2. 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?".
  3. cart.proceedToCheckout — ĂĄtvitel a checkout oldalra. ParamĂ©ter: nincs. Preview: "Átviszlek a megrendelĂ©si oldalra. Folytatjuk?".
  4. 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?".
  5. 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.
  6. 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:

  1. Schema-validĂĄciĂł — minden tool input Zod schema-n megy ĂĄt. cart.applyCoupon.code pĂ©ldĂĄul: z.string().min(1).max(64).regex(/^[A-Z0-9_-]+$/). A <script> egyszerĂ»en nem ĂĄll össze.
  2. Preview render-pipeline — a panel a tool-paramĂ©tereket plain text node-ban rendereli (textContent, soha innerHTML). 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:

  1. Felhasznåló: "Töröld a Starter-t, és tegyél hozzå kupont a kosårhoz."
  2. Chat: "EltĂĄvolĂ­tom a Starter license tĂ©telt (1 db, 19€). MegerĂ”sĂ­ted?"
  3. Felhasználó: ✅
  4. Chat: "Van egy aktív SUMMER25 kupon (–25%). Alkalmazzam?"
  5. Felhasználó: ✅
  6. Chat: "KĂ©sz. Az Ășj vĂ©gösszeg: 73.50€. MegrendelĂ©si oldalra megyĂŒnk?"
  7. Felhasználó: ✅ → cart.proceedToCheckout lefut.

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Ăł.

BeszĂ©ljĂŒnk a projektedrƑl

Mondd el, mit Ă©pĂ­tesz — meglĂĄtjuk, hogyan segĂ­thetĂŒnk.

MCP UI actions — hogyan vezĂ©rli a chat a kosĂĄr menetĂ©t — Nortinia Blog | Nortinia