בקש מסוכן AI לכתוב את הסכם השירות עבור Contoso והוא יעשה זאת במילותיו שלו, עם כותרות משלו, ועם סכום שחישב במוחו. זהו חלוקת עבודה שגויה. כאשר GroupDocs.Assembly.Mcp פועל מקומית (dnx GroupDocs.Assembly.Mcp --yes), Claude Desktop, Cursor או Copilot שואלים את תבנית ה‑Word שלך אילו שדות נדרשים, ממלאים אותם מההערות שלך, והמנוע מייצר את החוזה, הטבלה והחישובים הכלולים, מבלי שהמודל ייגע בפריסה:

הכין את הסכם השירות עבור הזמנה זו באמצעות contract-template.docx ושמור אותו כ‑PDF: Contoso Pharma, Keizersgracht 210 Amsterdam, איש קשר Dr. Lena Brandt; 12 חודשים של אירוח מנוהל ב‑4,800 EUR, 12 חודשים של תמיכה ב‑1,200 EUR, סדנת קבלה אחת ב‑3,500 EUR; 5 אחוז הנחה.

הגרסה הצעדים‑אחר‑צעד עם תצורה ופתרון בעיות נמצאת בתיעוד: איך ליצור מסמכים מתבניות עם סוכני AI באמצעות MCP.

למה המודל לא צריך לכתוב את המסמך?

מפני שמסמך שנוצר נכשל בדרכים שקשה לראות. הפריסה מתרחקת מהפריסה האישורית המשפטית. סעיף מתפרפר לפרפרזה שנשמעת טוב ומשמעותו שונה. סכום נובע מניבוי הטוקן הבא במקום מכפלה. וכל ריצה שונה במקצת, ולכן הסקירה של החודש הקודם לא אומרת דבר על החוזה של החודש הנוכחי.

תבנית הופכת את המצב. המחלקה המשפטית מחזיקה ב‑contract-template.docx, עם הכותרות שלה, בלוק החתימה ותגי <<[customer.Name]>>. תפקיד המודל מצטמצם לחלק שבו הוא טוב: קריאת אימייל או סדרת הערות והפיכתם לערכים מובנים. המנוע עושה את השאר, באותה צורה בכל פעם.

איך הסוכן יודע מה למלא?

הוא שואל את התבנית. get_template_fields קורא את התגים מבלי להפעיל את המנוע ומחזיר את השמות שהתבנית משתמשת בהם, כל שדה שהיא קוראת, ושלד JSON למילוי. זה מה שהשרת החזיר עבור תבנית החוזה שלנו:

-> get_template_fields {"template":{"filePath":"contract-template.docx"}}
<- { "tagCount": 17,
     "dataSourceNames": [ "contract", "customer", "items" ],
     "dataSkeleton": {
       "contract": { "Number": "", "Date": "", "Discount": "" },
       "customer": { "Name": "", "Address": "", "Contact": "",
                     "Email": "" },
       "items": [ { "Title": "", "Quantity": 0, "UnitPrice": 0 } ] } }

השלד הזה הוא החוזה בין המודל למסמך. הסוכן ממלא אותו מטקסט ההזמנה ומחזיר אותו כ‑dataJson.

מה קורה כאשר הסוכן שוכח שדה?

הדבר מדווח במדויק. במבחן שלנו, הניסיון הראשון של הסוכן השאיר ללא כתובת האימייל של הלקוח. השרת דחה וציין את הפער:

-> assemble_document {"template":{...},"dataJson":"{... no Email ...}"}
<- Document assembly failed for 'contract-template.docx': ...
   Can not get the value of member 'Email' on type ''. The template
   reads 'Email', which the data does not have. Check the spelling
   (names are case-sensitive) with get_template_fields and add it to
   the data. ... pass allowMissingMembers=true to output nothing for
   missing members and empty lists.

מודל שכותב טקסט חופשי היה משאיר את השורה בשקט. כאן הסוכן יכול לבקש ממך את הכתובת, או להחליט יחד איתך שהשדה יישאר ריק.

כל ההחלפה

user            agent                       Assembly MCP server
 | "Make the contract for this order: ..."                      |
 |-------------->|                                              |
 |               |-- get_template_fields {"template":          |
 |               |     "contract-template.docx"} ------------->|
 |               |<- dataSkeleton: contract, customer, items --|
 |               |   (fills the skeleton from the order text)  |
 |               |-- assemble_document {"dataJson":"{...}",    |
 |               |     "format":"pdf"} ----------------------->|
 |               |<- Saved to: .../contract-template_          |
 |               |   assembled.pdf ----------------------------|
 |<- "Contract ready: 3 items, total 75500 EUR, 5% discount."  |
   layout, table and arithmetic come from the template

עם ה‑e‑mail שנוסף, הקריאה השנייה הצליחה:

-> assemble_document {"template":{"filePath":"contract-template.docx"},
     "dataJson":"{...}","format":"pdf"}
<- Assembled 'contract-template.docx' with inline JSON (JSON object)
   as PDF
   Saved to: .../contract-template_assembled.pdf

המסמך מכיל טבלת תשלום בת שלוש שורות שנבנתה באמצעות <<foreach>> בשורת הטבלה, סכומים המחושבים בתבנית (<<[item.Quantity * item.UnitPrice]>>), סכום של 75500 EUR מ‑items.Sum(...), והקוּץ “A discount of 5 percent applies.” שמופיע רק משום שתג <<if>> מצא הנחה בנתונים. המודל לא חישב דבר מהזה.

האם זה טוב יותר משירות תבניות מתארח?

זהו מסחר שונה. שירותי תבניות מתארחים לוקחים את התבנית והנתונים שלך דרך HTTPS, מייצרים בענן שלהם וגובים לפי מסמך או לפי קרדיט. כאן התבנית, הנתונים והפלט נשארים בתיקייה במחשב שלך; המנוע הוא GroupDocs.Assembly הפועל בתהליך, ואין שום דבר שמקשיב על פורט. מה שמועבר לספק המודל הוא טקסט ההזמנה שאתה מדביק והשלד שהסוכן ממלא, ולא החוזה המיוצר. הארכיטקטורה מתוארת בפוסט המשפחתי על עיבוד מסמכי AI במקומי.

מגבלות כנות

  • מצב הערכה: כל מסמך שנוצר מתחיל בשורה “Evaluation Only. Created with GroupDocs.Assembly 26.7…”, חוברות עבודה שנשמרות מקבלות גיליון נוסף, ותבניות אימייל משמרות רק את גוף הטקסט הפשוט. קובץ רישיון או מפתחות מדודים מסירים את שלושת המקרים.
  • תחביר התבנית הוא <<[name]>>. מצייני מיקום {{name}} נשארים כטקסט; get_template_fields מודיע על כך.
  • תבניות הן קלט מהימן: תגי תמונה ומסמך טוענים כל נתיב או URL שהביטוי שלהם מחזיר. יש לעגן תיקייה אחת לשרת.
  • תאריכים: כתבו אותם כ‑2026-11-12T00:00:00 ועצבו אותם בתבנית (<<[contract.Date]:"d MMMM yyyy">>). תאריך בלבד "2026-11-12" מודפס כ‑11 בנובמבר במכונה עם UTC+2 במבחן שלנו.
  • הסוכן הוא מקור הנתונים. בקשו ממנו לרשום את הערכים שהוא חילץ לפני שהוא מייצר, ובדקו אותם.

שאלות נפוצות

האם סוכן AI יכול למלא את תבנית ה‑Word שלי ללא העלאה?
כן. השרת פועל מקומית דרך stdio וקורא את התבנית מהתיקייה שאתה מגדיר; הפלט נכתב ליד הקובץ.

אילו פורמטים יכולים להיות לתבנית?
Word, Excel, PowerPoint, Markdown, HTML, טקסט ותבניות אימייל; כל אחד מהם ניתן לשמור בפורמט שלו או ל‑PDF ולפורמטים אחרים. get_supported_formats מציג אותם לפי תבנית.

מה אם התבנית מתוחזקת על ידי מישהו אחר?
זה בדיוק המטרה. מי שמחזיק בתבנית משנה סעיפים ופריסה; הסוכן ממשיך למלא את אותו שלד, ו‑get_template_fields מציג כל שדה חדש בפעם הבאה שהוא שואל.

להעמיק יותר