Vítejte dopisy pro čtyřicet nových zákazníků, certifikát pro každého účastníka, faktura k každé objednávce: stejný dokument, pokaždé jiný záznam. S GroupDocs.Assembly.Mcp běžícím lokálně (dnx GroupDocs.Assembly.Mcp --yes) Claude Desktop, Cursor nebo Copilot to zvládnou jedním voláním nástroje assemble_per_record, který vyplní váš Word šablonu jednou pro každý prvek pole JSON, uloží každý výsledek jako samostatné PDF pojmenované podle pole, které zvolíte, a nahlásí záznamy, které selhaly, místo aby zastavil při prvním selhání:

Vytvořte PDF dopis s uvítáním pro každého zákazníka v customers.json pomocí welcome-letter.docx a pojmenujte každý soubor podle zákazníka.

Postupná verze s konfigurací a řešením problémů je v dokumentaci: Jak vygenerovat jeden dokument na záznam (mail merge) s AI agentem.

Proč nenechat agenta provádět smyčku?

Může, a pro pět záznamů je to v pořádku. Ale smyčka čtyřiceti volání nástroje je čtyřicet šancí, že agent ztratí přehled, přeskočí záznam, když se kontext prodlouží, nebo „laskavě“ přetvoří jeden dopis. Nástroj na úrovni záznamu přesune smyčku na server: jedno volání, jedna šablona, jedno projití pole a zpráva, která přesně říká, kolik souborů bylo vytvořeno a které záznamy se nepodařilo zpracovat. Úkolem agenta je vybrat šablonu, datový soubor a pole pro pojmenování a poté vám přečíst zpět zprávu.

Co agent kontroluje jako první?

Dvě věci: jak vypadají data a co čte šablona. V našem testu pět zákazníků v customers.json a jednostránkový uvítací dopis:

-> get_document_info {"file":{"filePath":"customers.json"}}
<- { "dataKind": "json",
     "data": { "root": "array", "length": 5, "keys": null } }

-> get_template_fields {"template":{"filePath":"welcome-letter.docx"}}
<- { "dataSourceNames": [ "customer" ],
     "fields": [ "customer.Contact", "customer.Plan", "customer.Name",
                 "customer.Manager", "customer.FirstInvoice" ] }

Šablona volá jeden záznam customer; server to zjistí sám, takže agent nemusí předávat dataSourceName.

Jedno volání, pět záznamů, jedno selhání

-> assemble_per_record {"template":{"filePath":"welcome-letter.docx"},
     "data":{"filePath":"customers.json"},"fileNameField":"Name",
     "format":"pdf"}
<- Assembled 4 of 5 document(s) from 'welcome-letter.docx' with
   'customers.json', one per record (each record as 'customer'), as PDF.
   Saved to:
   .../Contoso Pharma.pdf
   .../Fabrikam Logistics.pdf
   .../Tailspin Toys.pdf
   .../Litware Labs.pdf
   1 record(s) failed:
   record 4: InvalidOperationException: ... Can not get the value of
   member 'FirstInvoice' on type 'System.Data.DataRow'. The template
   reads 'FirstInvoice', which the data does not have. ...

Záznam 4, Wingtip Travel, neměl v datech datum první faktury. Ostatní čtyři dopisy byly vytvořeny, každý pojmenovaný podle zákazníka, a selhání přišlo s číslem záznamu a chybějícím polem. Agent to nahlásí jako „čtyři dopisy hotové; Wingtip Travel nemá datum první faktury, chcete, abych ponechal řádek prázdný, nebo počkat na datum?“. To je konverzace, kterou chcete, místo čtyřiceti souborů bez informace, který je špatný.

Jak funguje rozvětvení

customers.json  [ {Name:"Contoso Pharma",...}, {Name:"Fabrikam ..."},
                  ... 5 records ]
        |
assemble_per_record {"template":{"filePath":"welcome-letter.docx"},
                     "data":{"filePath":"customers.json"},
                     "fileNameField":"Name","format":"pdf"}
        |
        +--> Contoso Pharma.pdf
        +--> Fabrikam Logistics.pdf     ... 2 more
        '--> "4 of 5 ... 1 record(s) failed: record 4 ..."

Tři parametry vykonávají práci. fileNameField pojmenovává každý výstup podle pole z záznamu, např. customer.Name nebo číslo faktury; bez něj soubory dostanou pořadové číslo. recordsPath ukazuje na pole, když je JSON objektem, který jej obsahuje, např. "customers" nebo "batch.items". A maxDocuments je brzda.

Co zastaví nekontrolovaný batch?

maxDocuments, který ve výchozím nastavení je 100 a může dosáhnout 1000. Před zápisem cokoliv server spočítá záznamy; pokud jich je více než limit, odmítne. Nastavili jsme ho na 3 proti našim pěti zákazníkům:

-> assemble_per_record {..., "maxDocuments":3}
<- Per-record assembly failed for 'welcome-letter.docx': there are 5
   records, more than maxDocuments=3. Raise 'maxDocuments' (up to 1000)
   or pass fewer records.

Nic nebylo zapsáno. Pro rozesílku, která míří na skutečné lidi, je to správná výchozí hodnota: dotaz, který omylem ukáže na celý export CRM, vrátí otázku, ne deset tisíc PDF.

Moje data jsou tabulka, ne JSON

Generování po záznamu čte jen JSON: pole objektů nebo objekt, který jej obsahuje. Když seznam žije v CSV nebo v tabulce, agent nejprve převede řádky na JSON, což agenti zvládají dobře, a zapíše soubor do složky úložiště. Pokud chcete jeden dokument, který vypíše každý řádek – ceník nebo rejstřík – použijte assemble_document s <<foreach>> v šabloně; ten čte CSV i tabulky přímo.

Upřímná omezení

  • Generování po záznamu čte jen JSON; CSV a tabulkové data je třeba nejprve převést.
  • Evaluační režim: každý vygenerovaný soubor začíná „Evaluation Only. Created with GroupDocs.Assembly 26.7…“ a e‑mailové šablony zachovávají jen čistý text těla. Licencujte server před skutečnou rozesílkou.
  • Chybějící pole způsobí selhání daného záznamu. allowMissingMembers: true zapíše řádek prázdný místo toho; rozhodněte se, co chcete.
  • Data: zapisujte je jako 2026-12-01T00:00:00 a formátujte v šabloně, jak náš dopis dělá pomocí <<[customer.FirstInvoice]:"d MMMM yyyy">>. Řetězec jen s datem se v našem testu na stroji UTC+2 posunul o den.
  • Server soubory zapisuje; neodesílá je. Doručení je samostatný krok.

Často kladené otázky

Mohu provést mail merge s Claude bez nahrávání seznamu zákazníků?
Ano. Server běží lokálně a čte customers.json z vaší složky úložiště; vygenerovaná PDF jsou také uložena tam.

Jak jsou pojmenovány výstupní soubory?
Podle pole záznamu, které předáte jako fileNameField, zde název zákazníka, takže Contoso Pharma.pdf. Bez něj se použije pořadové číslo.

Může být každý dokument e‑mail místo PDF?
Ano: použijte šablonu EML nebo MSG, nebo předávejte format: "eml". V evaluačním režimu je tělo HTML e‑mailu nahrazeno evaluačním řádkem, takže testujte výstup e‑mailu s licencí.

Jděte hlouběji