Setiap repositori mengumpulkan data terstruktur yang pada akhirnya dibutuhkan seseorang sebagai dokumen: perubahan dalam sebuah rilis, kontributor tahun ini, inventaris API, daftar risiko terbuka. Data tersebut sudah dalam format JSON; langkah yang hilang adalah PDF atau file Word yang diformat yang akan dibuka oleh pelanggan, auditor, atau manajer. Dengan GroupDocs.Assembly.Mcp yang berjalan secara lokal di samping Claude Code (claude mcp add dengan dnx GroupDocs.Assembly.Mcp --yes), agen mengisi template Word yang disimpan di repo dari file JSON di repo, dan menulis PDF, tanpa ada yang memformat tabel:

Hasilkan PDF catatan rilis untuk 4.2.0 dari data/release-4.2.0.json dengan templates/release-notes.docx, dan sertifikat kontribusi untuk setiap kontributor di data/contributors-2026.json.

Versi langkah demi langkah dengan konfigurasi dan pemecahan masalah ada di dokumentasi: Cara menghasilkan PDF atau laporan Word dari data JSON dalam repositori dengan Claude Code.

Mengapa tidak membiarkan agen pemrograman menulis dokumen?

Agen pemrograman sangat baik dalam menghasilkan data dan cukup buruk dalam menghasilkan dokumen. Minta satu untuk “catatan rilis sebagai PDF” dan ia akan menulis file Markdown, kemudian skrip yang mengonversinya, kemudian memperbaiki font skrip tersebut. Pada rilis berikutnya, ia melakukannya lagi dengan sedikit perbedaan. Outputnya terlihat seperti apa pun yang menjadi default perpustakaan konversi, bukan seperti dokumen yang dikirim perusahaan Anda.

Template memperbaiki tampilan dan menempatkannya di bawah kontrol versi. templates/release-notes.docx adalah file Word normal dengan logo, gaya heading, dan tabel, plus beberapa tag <<…>>. Siapa pun yang memiliki tata letak mengeditnya di Word; agen tidak pernah menyentuhnya. JSON dihasilkan oleh alat rilis Anda, atau oleh agen dari git log, dan itulah bagian yang dilakukan dengan baik oleh agen pemrograman.

Ini juga membuat pekerjaan dapat ditinjau. Pull request yang mengubah data/release-4.2.0.json menunjukkan secara tepat perubahan apa yang akan muncul dalam catatan rilis, baris demi baris, dalam diff yang dapat dibaca reviewer dalam satu menit. Pull request yang mengubah PDF yang dihasilkan tidak menunjukkan apa-apa. Menjaga data dan tata letak sebagai file terpisah yang versi, dan memperlakukan dokumen sebagai sesuatu yang Anda render dari mereka, adalah ide yang sama seperti memisahkan kode sumber dan output build, dan berlaku untuk dokumen dengan alasan yang sama.

Seperti apa repositori

repo/
  data/
    release-4.2.0.json       {"release":{...}, "changes":[...4 items]}
    contributors-2026.json   {"contributors":[...3 items]}
  templates/
    release-notes.docx       <<[release.Version]>>, <<foreach [c in
                             changes]>> table row, counts
    certificate.docx         <<[contributor.Name]>> ...
  out/                       GROUPDOCS_MCP_OUTPUT_PATH, in .gitignore
        |
        |  Claude Code -> GroupDocs.Assembly MCP server (local, stdio)
        v
  release-notes-4.2.0.pdf    pnair.pdf  tvarga.pdf  mrossi.pdf

Panggilan-panggilan

Pertama agen memeriksa apa yang diharapkan template, sehingga ia dapat memberi tahu Anda jika JSON kehilangan sesuatu:

-> get_template_fields {"template":{"filePath":
     "repo/templates/release-notes.docx"}}
<- { "dataSourceNames": [ "release", "changes" ],
     "fields": [ "release.Product", "release.Version", "release.Date",
                 "changes[].Type", "changes[].Title",
                 "changes[].PullRequest", "changes[].Author" ] }

Kemudian satu panggilan merendernya:

-> assemble_document {"template":{"filePath":
     "repo/templates/release-notes.docx"},
     "data":{"filePath":"repo/data/release-4.2.0.json"},
     "format":"pdf","outputName":"release-notes-4.2.0.pdf"}
<- Assembled 'release-notes.docx' with 'release-4.2.0.json' (JSON
   object) as PDF
   Saved to: .../release-notes-4.2.0.pdf

Baris tabel template diulang sekali per perubahan, dan baris terakhir menghitung perubahan serta penulis unik dengan changes.Count() dan changes.Select(c => c.Author).Distinct().Count(). Angka-angka tersebut berasal dari data pada saat render, bukan dari agen.

Sertifikat adalah fan-out: satu PDF per elemen array contributors, dinamai berdasarkan handle kontributor:

-> assemble_per_record {"template":{"filePath":
     "repo/templates/certificate.docx"},
     "data":{"filePath":"repo/data/contributors-2026.json"},
     "recordsPath":"contributors","fileNameField":"Handle",
     "format":"pdf"}
<- Assembled 3 of 3 document(s) from 'certificate.docx' with
   'contributors-2026.json', one per record (each record as
   'contributor'), as PDF.
   Saved to:
   .../pnair.pdf
   .../tvarga.pdf
   .../mrossi.pdf

recordsPath memberi tahu server di mana array berada ketika file JSON adalah sebuah objek, yang merupakan bentuk umum file data nyata.

Jadikan kebiasaan, bukan sekadar perintah

Agen mengikuti instruksi proyek tentang kapan menggunakan alat. Beberapa baris dalam CLAUDE.md atau AGENTS.md mengubah ini menjadi konvensi:

Documents for people (release notes, reports, certificates) are generated
with the groupdocs-assembly MCP server from templates/*.docx and data/*.json.
Call get_template_fields first; never edit a template. Generated files land
in out/, which is in .gitignore. Dates in JSON as yyyy-MM-ddTHH:mm:ss.

Simpan output di luar git. Secara default server menulis di samping folder penyimpanannya; atur GROUPDOCS_MCP_OUTPUT_PATH dalam pendaftaran server ke folder out/ repositori dan tambahkan folder itu ke .gitignore. JSON dan template adalah sumber; PDF adalah artefak build, dihasilkan kembali dalam hitungan detik, dan meng-commit-nya hanya menghasilkan diff yang tidak dapat ditinjau siapa pun.

Batasan jujur

  • Mode evaluasi: setiap PDF dimulai dengan “Evaluation Only. Created with GroupDocs.Assembly 26.7…”. Baik untuk mencoba; beri lisensi server sebelum apa pun keluar dari tim.
  • Template adalah input yang dipercaya. Tag gambar dan dokumen memuat jalur dan URL yang dikembalikan oleh ekspresi mereka, jadi perlakukan template dari pull request seperti kode, dan berikan server satu folder penyimpanan.
  • Tanggal: tulis sebagai 2026-11-03T00:00:00 dan format dalam template (<<[release.Date]:"d MMMM yyyy">>). String tanggal saja bergeser satu hari pada mesin UTC+2 dalam pengujian kami; gambar Docker berjalan dalam UTC.
  • Generasi per-record hanya membaca JSON, dan maxDocuments (default 100) menghentikan array yang secara tak terduga besar sebelum apa pun ditulis.
  • get_template_fields bersifat statis: nilai yang dihitung di dalam proyeksi Select atau GroupBy tidak diikuti.

FAQ

Bisakah Claude Code menghasilkan PDF dari JSON di repositori saya tanpa layanan cloud?
Ya. Server MCP berjalan secara lokal sebagai proses anak Claude Code dan membaca template serta JSON dari folder yang Anda tunjuk.

Apakah ini dapat dijalankan di CI?
Server adalah server MCP, jadi memerlukan klien MCP: Claude Code dalam mode headless, atau runner agen apa pun. Gambar Docker (ghcr.io/groupdocs-assembly/assembly-net-mcp) adalah bentuk yang nyaman untuk pipeline.

Word atau PDF?
Keduanya. Hilangkan format dan outputnya adalah DOCX seperti template; "format":"pdf" menghasilkan PDF. get_supported_formats mencantumkan setiap target per template.

Selami lebih dalam