מודול 6 · 80 דקות
WebMCP אימפרטיבי
טופס לא מכסה חיפוש דינמי, קריאת סל, או כלי שמופיע רק כשיש פריטים. בשביל זה registerTool.
const ctx = document.modelContext || navigator.modelContext;
const ac = new AbortController();
await ctx.registerTool({
name: "search_menu",
description: "Search the restaurant menu by dish or ingredient.",
inputSchema: {
type: "object",
properties: {
query: { type: "string" },
maxPrice: { type: "number" }
},
required: ["query"]
},
annotations: { readOnlyHint: true },
execute: async ({ query, maxPrice }) => { /* string */ }
}, { signal: ac.signal });
// ביטול רישום
ac.abort();
הכלים בדמו
search_menu— קריאהget_dish— קריאהadd_to_cart— כתיבהget_cart— קריאה
כולם ב־site/js/webmcp.js. הם קוראים לפונקציות מ־app.js — אל תשכפלו לוגיקה.
כללים
- Feature detection לפני כל רישום.
executeמחזיר מחרוזת קצרה.- להעביר
signalל־fetch. readOnlyHintלכל כלי שלא משנה מצב.- רישום לפי דף/מצב,
abortביציאה. - שמות כלים:
snake_caseבאנגלית. תיאורים יכולים להיות דו־לשוניים.
בדיקה בקונסול
const tools = await document.modelContext.getTools();
const t = tools.find(x => x.name === "search_menu");
await document.modelContext.executeTool(t, JSON.stringify({query:"טלה"}));
הארגומנט השני הוא מחרוזת JSON, לא אובייקט.
מעבדה
- הוסיפו כלי
list_coursesשמחזיר את המנות לפי מנה ראשונה / עיקרית / קינוח. - רשמו
add_to_cartרק בדף התפריט, לא בבית. - הגבילו את פלט החיפוש ל־8 שורות.