This workflow corresponds to n8n.io template #11703 — we link there as the canonical source.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "7726c8ac-204b-4464-b4eb-8cde21dbe515",
"name": "Google Drive MCP Server",
"type": "@n8n/n8n-nodes-langchain.mcpTrigger",
"position": [
720,
-320
],
"parameters": {
"path": "a289c719-fb71-4b08-97c6-79d12645dc7e"
},
"typeVersion": 1
},
{
"id": "b0645471-cf3d-4fe9-b313-1bb3267f32b5",
"name": "Search Files from Gdrive",
"type": "n8n-nodes-base.googleDriveTool",
"position": [
240,
-96
],
"parameters": {
"limit": 10,
"filter": {
"driveId": {
"mode": "list",
"value": "My Drive"
},
"whatToSearch": "files"
},
"options": {},
"resource": "fileFolder",
"queryString": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Search_Query', ``, 'string') }}"
},
"typeVersion": 3
},
{
"id": "70d3d7a8-3058-450d-9659-ceb87c79b2e0",
"name": "Create a document in Google Docs",
"type": "n8n-nodes-base.googleDocsTool",
"position": [
448,
-96
],
"parameters": {
"title": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Title', ``, 'string') }}",
"folderId": "1L3CaQB_khbHGb4HZO-qyDDQCvZfut3jY"
},
"typeVersion": 2
},
{
"id": "548e33dc-c80e-448f-8dd0-d32de30abc00",
"name": "Get a document in Google Docs",
"type": "n8n-nodes-base.googleDocsTool",
"position": [
656,
-96
],
"parameters": {
"operation": "get",
"documentURL": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Doc_ID_or_URL', ``, 'string') }}"
},
"typeVersion": 2
},
{
"id": "f2024410-0e71-42cf-b06e-d83d5667edc7",
"name": "Update a document in Google Docs using Find and Replace",
"type": "n8n-nodes-base.googleDocsTool",
"position": [
864,
-96
],
"parameters": {
"actionsUi": {
"actionFields": [
{
"text": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_Text', ``, 'string') }}",
"action": "replaceAll",
"matchCase": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_Match_Case', ``, 'boolean') }}",
"replaceText": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_New_Text', ``, 'string') }}"
}
]
},
"operation": "update",
"documentURL": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Doc_ID_or_URL', ``, 'string') }}"
},
"typeVersion": 2
},
{
"id": "c0cb449d-ccb4-4573-8716-3243e8395050",
"name": "Add Text to a document in Google Docs",
"type": "n8n-nodes-base.googleDocsTool",
"position": [
1072,
-96
],
"parameters": {
"actionsUi": {
"actionFields": [
{
"text": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_Text', ``, 'string') }}",
"action": "insert"
}
]
},
"operation": "update",
"documentURL": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Doc_ID_or_URL', ``, 'string') }}",
"descriptionType": "manual",
"toolDescription": "Add text to the end of a document in Google Docs"
},
"typeVersion": 2
},
{
"id": "e5358578-99c0-4d4a-943f-a2643dc50a59",
"name": "Add Page Break to the end of a document in Google Docs1",
"type": "n8n-nodes-base.googleDocsTool",
"position": [
1296,
-96
],
"parameters": {
"actionsUi": {
"actionFields": [
{
"action": "insert",
"object": "pageBreak"
}
]
},
"operation": "update",
"documentURL": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Doc_ID_or_URL', ``, 'string') }}",
"updateFields": {
"writeControlObject": {
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Revision_ID', ``, 'string') }}"
}
},
"descriptionType": "manual",
"toolDescription": "Add page break to the end of a document in Google Docs"
},
"typeVersion": 2
},
{
"id": "1c8b55b9-750b-476d-b91b-5547990b7045",
"name": "Create Checkbox List in a document in Google Docs1",
"type": "n8n-nodes-base.googleDocsTool",
"position": [
448,
64
],
"parameters": {
"actionsUi": {
"actionFields": [
{
"action": "create",
"object": "paragraphBullets",
"endIndex": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_End_Index', ``, 'number') }}",
"startIndex": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_Start_Index', ``, 'number') }}",
"bulletPreset": "BULLET_CHECKBOX"
}
]
},
"operation": "update",
"documentURL": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Doc_ID_or_URL', ``, 'string') }}",
"updateFields": {
"writeControlObject": {
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Revision_ID', ``, 'string') }}"
}
},
"descriptionType": "manual",
"toolDescription": "Create Checkbox list from paragraphs of a document in Google Docs using index"
},
"typeVersion": 2
},
{
"id": "bea96516-cb71-421c-bcd0-0c93529e1ef1",
"name": "Create Bullet List in a document in Google Docs",
"type": "n8n-nodes-base.googleDocsTool",
"position": [
240,
64
],
"parameters": {
"actionsUi": {
"actionFields": [
{
"action": "create",
"object": "paragraphBullets",
"endIndex": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_End_Index', ``, 'number') }}",
"startIndex": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_Start_Index', ``, 'number') }}"
}
]
},
"operation": "update",
"documentURL": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Doc_ID_or_URL', ``, 'string') }}",
"updateFields": {
"writeControlObject": {
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Revision_ID', ``, 'string') }}"
}
},
"descriptionType": "manual",
"toolDescription": "Create Bullet List from paragraphs of a document in Google Docs using index"
},
"typeVersion": 2
},
{
"id": "73172169-dbd4-42f2-826c-86fe7bab7ffd",
"name": "Create Numbered List in a document in Google Docs",
"type": "n8n-nodes-base.googleDocsTool",
"position": [
656,
64
],
"parameters": {
"actionsUi": {
"actionFields": [
{
"action": "create",
"object": "paragraphBullets",
"endIndex": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_End_Index', ``, 'number') }}",
"startIndex": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_Start_Index', ``, 'number') }}",
"bulletPreset": "NUMBERED_DECIMAL_NESTED"
}
]
},
"operation": "update",
"documentURL": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Doc_ID_or_URL', ``, 'string') }}",
"updateFields": {
"writeControlObject": {
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Revision_ID', ``, 'string') }}"
}
},
"descriptionType": "manual",
"toolDescription": "Create Numbered list from paragraphs of a document in Google Docs using index"
},
"typeVersion": 2
},
{
"id": "3609d5c9-7379-4c02-bd60-aa6f53422852",
"name": "Insert Empty Table to the end of a document in Google Docs1",
"type": "n8n-nodes-base.googleDocsTool",
"position": [
864,
64
],
"parameters": {
"actionsUi": {
"actionFields": [
{
"rows": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_Rows', ``, 'number') }}",
"action": "insert",
"object": "table",
"columns": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_Columns', ``, 'number') }}"
}
]
},
"operation": "update",
"documentURL": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Doc_ID_or_URL', ``, 'string') }}",
"updateFields": {
"writeControlObject": {
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Revision_ID', ``, 'string') }}"
}
},
"descriptionType": "manual",
"toolDescription": "Create Empty table to the end of a document in Google Docs"
},
"typeVersion": 2
},
{
"id": "7c39abdf-da09-49c5-b452-507fda4772e5",
"name": "Insert Empty Table to a document in Google Docs using Index",
"type": "n8n-nodes-base.googleDocsTool",
"position": [
1072,
64
],
"parameters": {
"actionsUi": {
"actionFields": [
{
"rows": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_Rows', ``, 'number') }}",
"index": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_Index', ``, 'number') }}",
"action": "insert",
"object": "table",
"columns": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_Columns', ``, 'number') }}",
"locationChoice": "location"
}
]
},
"operation": "update",
"documentURL": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Doc_ID_or_URL', ``, 'string') }}",
"updateFields": {
"writeControlObject": {
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Revision_ID', ``, 'string') }}"
}
},
"descriptionType": "manual",
"toolDescription": "Create Empty table to a document in Google Docs using index"
},
"typeVersion": 2
},
{
"id": "a19cb50c-b144-4cd0-8ff3-4ecae24a763e",
"name": "Insert Page Break to a document in Google Docs using Index",
"type": "n8n-nodes-base.googleDocsTool",
"position": [
1520,
-96
],
"parameters": {
"actionsUi": {
"actionFields": [
{
"index": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_Index', ``, 'number') }}",
"action": "insert",
"object": "pageBreak",
"locationChoice": "location"
}
]
},
"operation": "update",
"documentURL": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Doc_ID_or_URL', ``, 'string') }}",
"updateFields": {
"writeControlObject": {
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Revision_ID', ``, 'string') }}"
}
},
"descriptionType": "manual",
"toolDescription": "Add page break to a document in Google Docs using Index"
},
"typeVersion": 2
},
{
"id": "d5655a38-0eec-4411-b93c-fdc238b1e006",
"name": "Insert Text to the end of a document in Google Docs",
"type": "n8n-nodes-base.googleDocsTool",
"position": [
1296,
64
],
"parameters": {
"actionsUi": {
"actionFields": [
{
"text": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_Text', ``, 'string') }}",
"action": "insert"
}
]
},
"operation": "update",
"documentURL": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Doc_ID_or_URL', ``, 'string') }}"
},
"typeVersion": 2
},
{
"id": "5631701c-6abf-4ac6-9f88-3a074f64f466",
"name": "Insert Text to a document in Google Docs using Index",
"type": "n8n-nodes-base.googleDocsTool",
"position": [
1520,
64
],
"parameters": {
"actionsUi": {
"actionFields": [
{
"text": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_Text', ``, 'string') }}",
"index": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_Index', ``, 'number') }}",
"action": "insert",
"locationChoice": "location"
}
]
},
"operation": "update",
"documentURL": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Doc_ID_or_URL', ``, 'string') }}"
},
"typeVersion": 2
},
{
"id": "6eeebb92-2cd7-4f9a-be12-ae9d3c24d405",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-736,
-400
],
"parameters": {
"width": 288,
"height": 640,
"content": "## Google Docs MCP Access Server\nThis MCP server enables coding agents such as Claude, ChatGPT (with MCP support),\nClawed Code, and other MCP-compatible clients to interact with **Google Docs**\nprogrammatically \u2014 including reading, writing, editing, and structuring content.\n\nMany agents today can *search Google Drive*, but cannot reliably **edit or mutate**\ndocuments. This workflow fills that gap by exposing Google Docs actions via MCP.\n\nSupported operations include:\n* Search files in Google Drive\n* Create a new Google Doc\n* Get a Google Doc\u2019s content\n* Update a Google Doc (find & replace, insert text, page breaks, bullets, tables)\n* List formatting actions (checkbox list, bullet list, numbered list)\n"
},
"typeVersion": 1
},
{
"id": "deddf09e-0f61-4376-92f9-fac50ac421ec",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-432,
-400
],
"parameters": {
"width": 288,
"height": 640,
"content": "## Why This Google Docs MCP Server Matters\nCoding agents often struggle with Drive-only access:\n* They can *find* docs via Drive search\u2026\n* \u2026but **cannot reliably open, edit, or format content**.\n\nThis workflow standardizes document interactions via MCP:\n* Agents send structured requests to read or modify a doc\n* Your server triggers Google Docs actions in n8n\n* Results are returned to the agent in a structured response\n\nResult: richer Doc automation for workflows like:\n* auto-generating reports based on Drive search\n* cleaning or restructuring docs via AI\n* formatting checklists, bullets, tables programmatically\n"
},
"typeVersion": 1
},
{
"id": "f6d906a5-a0b1-4f18-ac66-feb66d2ae261",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-128,
-400
],
"parameters": {
"width": 288,
"height": 640,
"content": "## How This MCP Server Works\n1. **Agent Sends a Request** \n The MCP client asks to *search docs*, *create*, *get*, or *update* a Google Doc.\n\n2. **Trigger Receives Input** \n The MCP Server Trigger handles structured inputs such as:\n * search query\n * document URL/ID\n * text edits, replace instructions, formatting commands\n\n3. **Google Drive & Docs Tools Execute** \n * Drive search finds matching files\n * Google Docs actions read/edit content\n * Use cases include find & replace, insert text, page breaks, bullet lists, tables\n\n4. **Return Output to Agent** \n Results, status, or updated content is sent back to the client in a clean MCP response.\n"
},
"typeVersion": 1
}
],
"connections": {
"Search Files from Gdrive": {
"ai_tool": [
[
{
"node": "Google Drive MCP Server",
"type": "ai_tool",
"index": 0
}
]
]
},
"Get a document in Google Docs": {
"ai_tool": [
[
{
"node": "Google Drive MCP Server",
"type": "ai_tool",
"index": 0
}
]
]
},
"Create a document in Google Docs": {
"ai_tool": [
[
{
"node": "Google Drive MCP Server",
"type": "ai_tool",
"index": 0
}
]
]
},
"Add Text to a document in Google Docs": {
"ai_tool": [
[
{
"node": "Google Drive MCP Server",
"type": "ai_tool",
"index": 0
}
]
]
},
"Create Bullet List in a document in Google Docs": {
"ai_tool": [
[
{
"node": "Google Drive MCP Server",
"type": "ai_tool",
"index": 0
}
]
]
},
"Create Numbered List in a document in Google Docs": {
"ai_tool": [
[
{
"node": "Google Drive MCP Server",
"type": "ai_tool",
"index": 0
}
]
]
},
"Create Checkbox List in a document in Google Docs1": {
"ai_tool": [
[
{
"node": "Google Drive MCP Server",
"type": "ai_tool",
"index": 0
}
]
]
},
"Insert Text to the end of a document in Google Docs": {
"ai_tool": [
[
{
"node": "Google Drive MCP Server",
"type": "ai_tool",
"index": 0
}
]
]
},
"Insert Text to a document in Google Docs using Index": {
"ai_tool": [
[
{
"node": "Google Drive MCP Server",
"type": "ai_tool",
"index": 0
}
]
]
},
"Add Page Break to the end of a document in Google Docs1": {
"ai_tool": [
[
{
"node": "Google Drive MCP Server",
"type": "ai_tool",
"index": 0
}
]
]
},
"Update a document in Google Docs using Find and Replace": {
"ai_tool": [
[
{
"node": "Google Drive MCP Server",
"type": "ai_tool",
"index": 0
}
]
]
},
"Insert Page Break to a document in Google Docs using Index": {
"ai_tool": [
[
{
"node": "Google Drive MCP Server",
"type": "ai_tool",
"index": 0
}
]
]
},
"Insert Empty Table to a document in Google Docs using Index": {
"ai_tool": [
[
{
"node": "Google Drive MCP Server",
"type": "ai_tool",
"index": 0
}
]
]
},
"Insert Empty Table to the end of a document in Google Docs1": {
"ai_tool": [
[
{
"node": "Google Drive MCP Server",
"type": "ai_tool",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow creates an MCP server that allows coding agents (e.g. Claude, ChatGPT with MCP support, Clawed Code) to interact with Google Docs programmatically.
Source: https://n8n.io/workflows/11703/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
The official ChatGPT connector doesn’t allow you to interact directly with Google Workspace apps from within the app. Let’s see how to overcome this limitation by creating a dedicated MCP server.
Business Assistant Telegram AI Agent. Uses telegramTrigger, telegram, httpRequest, memoryPostgresChat. Event-driven trigger; 41 nodes.
Template Overview This workflow demonstrates how to build a simple Telegram bot that can schedule events, check service prices, and query company documents using AI integrated with MCP and RAG. It’s d
This workflow automatically analyzes meeting effectiveness and provides constructive feedback:
3634. Uses executeWorkflowTrigger, mcpTrigger, googleDrive, toolWorkflow. Event-driven trigger; 17 nodes.