Declarative API הופך רכיבי HTML <form> רגילים לכלי WebMCP באמצעות מאפיינים. הדפדפן יוצר סכימת JSON מהקלט של הטופס ומטפל באינטראקציות של הסוכן.
טופסי Angular Signal: אל תוסיפו toolname/tooldescription לטפסים שנוצרו באמצעות form() מ-@angular/forms/signals. במקום זאת, צריך להוסיף את provideExperimentalWebMcpForms() לספקי האפליקציה ולהעביר את האפשרות experimentalWebMcpTool: { name, description } אל form(). לאחר מכן, Angular רושם את הטופס דרך ה-API ההכרחי, בונה את הסכימה ממודל האותות ומקשר אותה לאימות ולשליחה. אם משתמשים בשתי השיטות, אותו טופס נרשם פעמיים.
מאפייני הטופס
-
toolname: שם ייחודי לכלי. -
tooldescription: מה הכלי עושה ומתי הסוכן צריך להשתמש בו. אל תפרטו את השדות, האפשרויות או המגבלות של הטופס: הדפדפן כבר כולל אותם בסכימה שהוא יוצר מהפקדים של הטופס. toolautosubmit: (אופציונלי) אם הוא קיים, הנציג יכול לשלוח את הטופס בלי לחכות לאינטראקציה של המשתמש.-
toolparamdescription: (אופציונלי) מאפשר להגדיר תיאור של מאפיין בסכימת ה-JSON. השתמשו בו כדי להסביר מה המשמעות של הערך (לדוגמה, עם ערכים לדוגמה), ולא כדי לחזור על האפשרויות או המגבלות של הפקד.- סדר הרזולוציה: הדפדפן משתמש ב-
toolparamdescriptionאם הוא קיים. אם אין תווית, המערכת משתמשת ב-textContentשל ה-<label>המשויך (תוך דילוג על צאצאים שניתן להוסיף להם תוויות). אם אין תווית, המערכת חוזרת אלaria-description. - קיבוץ (Fieldsets): כדי לצרף תיאור לקבוצה של רכיבים קשורים (כמו לחצני
<input type="radio">), צריך להציב אתtoolparamdescriptionברכיב ההורה<fieldset>הקרוב ביותר, כך שהוא יחול על קבוצת הפרמטרים כולה.
- סדר הרזולוציה: הדפדפן משתמש ב-
דוגמה
<form toolname="search-cars"
tooldescription="Perform a car make/model search"
toolautosubmit>
<label for="make">Vehicle Make</label>
<input type="text" id="make" name="make" required>
<label for="model">Vehicle Model</label>
<input type="text" id="model" name="model" toolparamdescription="e.g., 330i, F-150" required>
<button type="submit">Search</button>
</form>
טיפול בשליחת טפסים ב-JavaScript
כשנציג שולח את הטופס, ה-SubmitEvent כולל את agentInvoked (בוליאני) ואת respondWith(promise).
document.querySelector('form').addEventListener('submit', (event) => {
event.preventDefault();
// Validate the form
const formValidationErrors = myFormIsValid();
if (formValidationErrors.length > 0) {
if (event.agentInvoked) {
const errorString =
'Validation failed: ' +
formValidationErrors
.map((err) => `${err.field} (${err.message})`)
.join(', ');
event.respondWith(Promise.resolve(errorString));
}
return;
}
const resultPromise = performAsyncSearch(new FormData(event.target));
// Return the result directly to the agent without navigation
if (event.agentInvoked) {
event.respondWith(resultPromise);
}
});
אירועים במחזור החיים
document.modelContext פולט אירועים כשסוכנים מתחילים או מפסיקים אינטראקציה עם כלי: toolactivated מופעל כשהכלי מתחיל לפעול, ו-toolcancel מופעל כשהוא מבוטל.
// Starting in Chrome 156, these events are dispatched on `document.modelContext`.
// Older versions dispatch them on `window`. Feature-detect the event handler
// property to pick the right target for backward compatibility.
const targetFor = (type, listener, options) =>
(`on${type}` in (document.modelContext ?? {}) ? document.modelContext : window)
.addEventListener(type, listener, options);
targetFor('toolactivated', ({ toolName }) => {
console.log(`Tool "${toolName}" started execution.`);
});
targetFor('toolcancel', ({ toolName }) => {
console.log(`Tool "${toolName}" execution is cancelled.`);
});
משוב חזותי (CSS)
אפשר להשתמש במחלקות פסאודו כדי להדגיש טפסים כשנציג יוצר איתם אינטראקציה:
-
:tool-form-active: מוחל על הרכיב<form>שבו הנציג משתמש באופן פעיל. -
:tool-submit-active: מוחל על לחצן השליחה כשהדפדפן מושהה לצורך בדיקה של המשתמש (אם לא צויןtoolautosubmit).
form:tool-form-active {
outline: 2px dashed blue;
background-color: rgba(0, 0, 255, 0.05);
}
button:tool-submit-active {
outline: 2px dashed red;
animation: pulse 2s infinite;
}
מתי לא כדאי להשתמש בטפסים
ה-API ההצהרתי מתאים במיוחד לטפסים סטנדרטיים עצמאיים. הוא לא מתאים בתרחישים הבאים:
- שדות עם תלות גבוהה: טפסים שבהם קלט מסוים משנה את האפשרויות או את החשיפה של קלט אחר. הסכימה המסונתזת לא יכולה לבטא את יחסי התלות האלה בצורה טובה.
- רכיבים מותאמים אישית של ממשק המשתמש: טפסים שמסתמכים על קלט לא סטנדרטי (למשל, רכיבי canvas, עורכי טקסט עשיר) שלא מבצעים סריאליזציה אוטומטית של ערכים.
- אשפים עם כמה שלבים: תהליכי עבודה מורכבים שדורשים שליחה של כמה טפסים. במקרה כזה, עדיף להשתמש ב-Imperative API או באינטראקציה רגילה עם DOM.
מתי להשתמש ב-toolautosubmit
- פעולות ושאילתות לקריאה בלבד: חיפושים, סינונים, אחזור פרטים או בדיקת סטטוס (למשל, חיפוש דגם של רכב, חיפוש בספרייה, בדיקת זמינות במלאי).
- פעולות הפיכות בסיכון נמוך: פעולות בטפסים שהמשתמש יכול לבטל או לשנות בקלות באופן ידני (למשל, הוספת פריטים לעגלת הקניות, שימוש בקוד שובר, שמירת טיוטה או הגדרת אפשרויות פריסה זמניות).
מתי להשמיט את toolautosubmit
- פעולות הרסניות או בלתי הפיכות: מחיקת רשומות, איפוס הגדרות מערכת או ניקוי מסדי נתונים.
- פעולות פיננסיות ועסקאות: שליחת טופס תשלום, העברת כספים, אישור תשלומים על מינויים או ביצוע הזמנות סופיות.
- תקשורת עם משתמשים בעלת השפעה רבה: שליחת בקשה סופית למשרה, שליחת אימיילים או הודעות למשתמשים אמיתיים אחרים או פרסום תוכן שגלוי לכולם.
- הגדרות חשבון רגישות: שינוי סיסמאות, שינוי תפקידים או הרשאות של משתמשים, או עדכון פרטי הפרופיל או החיוב.
אסטרטגיות חלופיות
אפשר להשתמש ב-WebMCP Declarative API בבטחה בכל הדפדפנים. דפדפנים שלא תומכים ב-WebMCP יתעלמו מהמאפיינים של tool*, וה-<form> ימשיך לפעול כטופס HTML רגיל. לא נדרש זיהוי תכונות.