{
  "id": "XwaL3YqmSyHJOAJk",
  "name": "0_generate_full_word_documents_with_ai",
  "tags": [],
  "nodes": [
    {
      "id": "3eb01a62-1f19-425c-9fed-fb2cb124f070",
      "name": "Anthropic Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "position": [
        848,
        96
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "claude-sonnet-4-5-20250929",
          "cachedResultName": "Claude Sonnet 4.5"
        },
        "options": {
          "thinking": false,
          "maxTokensToSample": 8000
        }
      },
      "credentials": {
        "anthropicApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "6e277f2c-66dd-48e7-9e52-180fa702818d",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1088,
        48
      ],
      "parameters": {
        "autoFix": true,
        "jsonSchemaExample": "{\n\t\"JobId\": \"1234\"\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "8c0dbfa6-7819-40a8-bc59-65e92531a55c",
      "name": "OpenRouter Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        1088,
        176
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f6a6e5bb-3a29-4897-8831-b3997a16edb0",
      "name": "Json2Doc MCP",
      "type": "@n8n/n8n-nodes-langchain.mcpClientTool",
      "position": [
        976,
        96
      ],
      "parameters": {
        "include": "selected",
        "options": {},
        "endpointUrl": "https://mcp.json2doc.com/mcp",
        "includeTools": [
          "Create_a_new_job",
          "Get_section_schema"
        ],
        "authentication": "headerAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "592591d8-8317-4033-a220-980721e56790",
      "name": "Add Company styleguide",
      "type": "n8n-nodes-base.set",
      "position": [
        576,
        -112
      ],
      "parameters": {
        "mode": "raw",
        "options": {},
        "jsonOutput": "={\n  \"fontFamily\": \"Arial\",\n  \"fontSize\": 11,\n  \"color\": \"#333333\",\n  \"lineHeight\": 1.5,\n  \"spacing\": {\n    \"before\": {\n      \"h1\": 24,\n      \"h2\": 18,\n      \"h3\": 14,\n      \"text\": 0,\n      \"table\": 15,\n      \"list\": 10,\n      \"image\": 15\n    },\n    \"after\": {\n      \"h1\": 18,\n      \"h2\": 14,\n      \"h3\": 10,\n      \"text\": 12,\n      \"table\": 15,\n      \"list\": 10,\n      \"image\": 15\n    }\n  },\n  \"styles\": {\n    \"h1\": {\n      \"fontSize\": 28,\n      \"fontWeight\": \"bold\",\n      \"color\": \"#1a365d\",\n      \"align\": \"center\"\n    },\n    \"h2\": {\n      \"fontSize\": 22,\n      \"fontWeight\": \"bold\",\n      \"color\": \"#2d3748\"\n    }\n  },\n  \"header\": {\n    \"left\": \"Example LLC\",\n    \"right\": {\n      \"type\": \"image\",\n      \"src\": \"{{ $json['Logo URL'] }}\",\n      \"width\": 30,\n      \"alt\": \"Company Logo\"\n    },\n    \"excludeFirstPage\": false\n  },\n  \"footer\": {\n    \"center\": \"{{ 'Page ' + String.fromCharCode(123) + String.fromCharCode(123) + 'pageNumber' + String.fromCharCode(125) + String.fromCharCode(125) + ' of ' + String.fromCharCode(123) + String.fromCharCode(123) + 'totalPages' + String.fromCharCode(125) + String.fromCharCode(125) }}\",\n\n    \"align\": \"center\",\n    \"excludeFirstPage\": false\n  }\n}"
      },
      "typeVersion": 3.4
    },
    {
      "id": "b3785edf-88e1-42d5-ba14-85c3235e1ca0",
      "name": "Generate Sections",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        880,
        -112
      ],
      "parameters": {
        "text": "=The user wants to create a document with the following prompt:\n```\n {{ $('On form submission').item.json.Prompt }}\n```",
        "options": {
          "maxIterations": 10,
          "systemMessage": "=You are a professional document creator using only the Json2Doc MCP tool.\n\nCheck the user input and generate based on experience a docx document.\n\nDO NOT USE THE BUILDER MODE.\n\nTHE TOOL Validate job and create a job REQUIRES A JSON CONFIG REPRESENTING THE DOCUMENT AS INPUT\n\nhow to proceed :\n1. get the schema for sections from the tool\n2. generate a Json Definition for the document based on the schema from 1 by adding them to this config:\n```\n{\n  \"document\": {\n    \"type\": \"docx\",\n    \"filename\": \"ADD A FITTING NAME HERE (without suffix)\",\n    \"title\": \"ADD THE DOCUMENT TITLE HERE\"\n  },\n  //KEEP DEFAULTS AS DEFINED HERE 1:1\n  \"defaults\": {{ $json.toJsonString() }},\n  \"sections\": [\n    // ADD SECTIONS ACORDING TO SCHEMA HERE (2 Types supportet page and flow)\n    {\n      \"type\": \"page\",\n      \"content\": [\n        {\n          \"type\": \"h1\",\n          \"text\": \"FULL SINGLE PAGE EXAMPLE\"\n        }\n      ]\n    },\n    {\n      \"type\": \"flow\",\n      \"content\": [\n        {\n          \"type\": \"h2\",\n          \"text\": \"EXAMPLE FLOW -> continues seamlessly across pages\",\n          \"spacing\": { \"before\": 20 }\n        }]}\n  ]\n}\n\n```\n\n3. validate your generated json configuration based on the schema from 2 as config input by creating a new jo (if vaidation returns invaid retry until its valid and you get the job id)\n4. trigger a new job with the valid json you generated based on the schema from 1\n5. return The JobID "
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3
    },
    {
      "id": "c6838320-5262-421f-81a8-024cc4564ecc",
      "name": "On form submission",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        288,
        -112
      ],
      "parameters": {
        "options": {},
        "formTitle": "Generate docx",
        "formFields": {
          "values": [
            {
              "fieldType": "textarea",
              "fieldLabel": "Prompt",
              "placeholder": "Generate a template for an annual report",
              "requiredField": true
            },
            {
              "fieldLabel": "Logo URL",
              "placeholder": "https://example.com/logo.png"
            }
          ]
        },
        "formDescription": "Generate a Word file (docx) with company branding"
      },
      "typeVersion": 2.3
    },
    {
      "id": "06280495-249f-403f-ba3d-becd5194d116",
      "name": "Download Docx",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1856,
        -112
      ],
      "parameters": {
        "url": "=https://api.json2doc.com/api/v1/files/{{ $json.data.outputFileId }}/download",
        "options": {
          "redirect": {
            "redirect": {}
          }
        },
        "sendHeaders": true,
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "headerParameters": {
          "parameters": [
            {
              "name": "Accept",
              "value": "application/octet-stream"
            }
          ]
        }
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "dba91ccb-3d9f-4d3f-ae3d-7603f5f4bcfd",
      "name": "Wait for Document Generation",
      "type": "n8n-nodes-base.wait",
      "position": [
        1424,
        -112
      ],
      "parameters": {
        "amount": 3
      },
      "typeVersion": 1.1
    },
    {
      "id": "fdb49828-9ad2-48ce-9297-bf498798c424",
      "name": "HTTP Request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1552,
        -112
      ],
      "parameters": {
        "url": "=https://api.json2doc.com/api/v1/jobs/{{ $json.output.JobId }}",
        "options": {
          "redirect": {
            "redirect": {}
          }
        },
        "sendHeaders": true,
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "headerParameters": {
          "parameters": [
            {}
          ]
        }
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "d1fdcd8b-7a56-46bb-95e8-2c639a192e74",
      "name": "is Completed?",
      "type": "n8n-nodes-base.if",
      "position": [
        1680,
        -112
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "27c14f40-8e32-4115-88f7-56098d814e71",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.data.status }}",
              "rightValue": "COMPLETED"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "ee276d02-e143-48d7-a897-e563c020ff23",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        192,
        -192
      ],
      "parameters": {
        "color": 5,
        "width": 256,
        "height": 240,
        "content": "## Input Form\nTakes a Promt and a logo URL as input"
      },
      "typeVersion": 1
    },
    {
      "id": "7fd19214-9027-4dc2-85af-e14bc79481e4",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        496,
        -320
      ],
      "parameters": {
        "width": 288,
        "height": 400,
        "content": "## Consistent Styling\nAdd the company's style here.\n- Font\n- Font sizes, colors, and spacing\n- Footer & header\n- Table styles\nFor more details, see also:\n[Docs](https://docs.json2doc.com/docs/document-generation/overview#defaults-system)"
      },
      "typeVersion": 1
    },
    {
      "id": "69c6c80f-1c5f-46fd-a720-ede4586e8c50",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        800,
        -560
      ],
      "parameters": {
        "color": 4,
        "width": 544,
        "height": 880,
        "content": "## Generate Json2Doc Config\n\n**Warning**: The context generated by this step can become quite large depending on the size and complexity of the document.\n**Notes**:\n- This step uses the styling configuration passed from the previous node.\n- The output of this node is the **Job ID**, which will be required for the file download step.\n\n### **Authentication Setup**\nAn API Key header auth is required to use the MCP:\n\n1. **Get API Key:** \ud83d\udd17 [app.json2docs.com](https://app.json2docs.com)\n1. **Authentication:** Generic Credential Type  \n2. **Generic Auth Type:** Header Auth  \n3. **Create a new credential (or use the one create for MCP connection)** with:  \n   - **Header Name:** `x-api-key`  \n   - **Header Value:** *your API key*"
      },
      "typeVersion": 1
    },
    {
      "id": "c19905a5-9817-44ed-95c2-ccd54928ec46",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1376,
        -480
      ],
      "parameters": {
        "color": 6,
        "width": 704,
        "height": 688,
        "content": "# **Wait for Document & Download**\n\nThese nodes wait until the document associated with the returned **Job ID** is fully generated by the AI agent, and then download the final file.\n\n### **Authentication Setup (Same for MCP connection)**\nTo authenticate properly, configure the HTTP Request nodes as follows:\n\n1. **Authentication:** Generic Credential Type  \n2. **Generic Auth Type:** Header Auth  \n3. **Create a new credential (or use the one create for MCP connection)** with:  \n   - **Header Name:** `x-api-key`  \n   - **Header Value:** *your API key*"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "c788a07d-3717-45c1-aa31-6bda61178036",
  "connections": {
    "HTTP Request": {
      "main": [
        [
          {
            "node": "is Completed?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Json2Doc MCP": {
      "ai_tool": [
        [
          {
            "node": "Generate Sections",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "is Completed?": {
      "main": [
        [
          {
            "node": "Download Docx",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait for Document Generation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Sections": {
      "main": [
        [
          {
            "node": "Wait for Document Generation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On form submission": {
      "main": [
        [
          {
            "node": "Add Company styleguide",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Anthropic Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Generate Sections",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Structured Output Parser",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Add Company styleguide": {
      "main": [
        [
          {
            "node": "Generate Sections",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Generate Sections",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Wait for Document Generation": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}