This workflow corresponds to n8n.io template #17843 — we link there as the canonical source.
This workflow follows the HTTP Request Tool → Mcptrigger recipe pattern — see all workflows that pair these two integrations.
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 →
{
"id": "RlabQRyylzmmGez6",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "worflow for claude to post in blogger page",
"tags": [],
"nodes": [
{
"id": "173aaad3-710f-4ef5-b16c-d621f4b8d859",
"name": "MCP Server Trigger",
"type": "@n8n/n8n-nodes-langchain.mcpTrigger",
"position": [
1216,
112
],
"parameters": {
"path": "268c1353-9722-40c5-ac9c-4cc855307d3a",
"authentication": "bearerAuth"
},
"credentials": {
"httpBearerAuth": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "bd2fbe72-73a0-4de1-8673-862414ac3924",
"name": "List Static Pages",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
1328,
1008
],
"parameters": {
"url": "https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}/pages",
"options": {},
"authentication": "predefinedCredentialType",
"toolDescription": "Lists all static pages on the blog (e.g. About, Contact, Privacy Policy) \u2014 separate from chronological posts",
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "199df602-b079-46ef-8474-1f40578ff99c",
"name": "Create Static Page",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
1472,
1008
],
"parameters": {
"url": "https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}/pages",
"method": "POST",
"options": {},
"sendBody": true,
"authentication": "predefinedCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "kind",
"value": "blogger#page"
},
{
"name": "title",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters1_Value', 'The title of the static page', 'string') }}"
},
{
"name": "content",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters2_Value', 'The HTML content of the static page', 'string') }}"
}
]
},
"toolDescription": "Creates a new static page on the blog (e.g. an About or Contact page)",
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "0b49ee04-d0e8-4d4f-9b0e-6c301860d2a3",
"name": "Update Static Page",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
1792,
1008
],
"parameters": {
"url": "=https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}/pages/{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('pageId', 'The ID of the static page to update', 'string') }}",
"method": "PUT",
"options": {},
"sendBody": true,
"authentication": "predefinedCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "kind",
"value": "blogger#page"
},
{
"name": "id",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters1_Value', 'The ID of the static page to update', 'string') }}"
},
{
"name": "title",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters2_Value', 'The new title of the page', 'string') }}"
},
{
"name": "content",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters3_Value', 'The new HTML content of the page', 'string') }}"
}
]
},
"toolDescription": "Replaces an existing static page entirely with a new title and content",
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "3559f9e0-3fad-48ac-b7d2-b837c3a43f97",
"name": "Delete Static Page",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
1952,
1008
],
"parameters": {
"url": "=https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}/pages/{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('pageId', 'The ID of the static page to delete', 'string') }}",
"method": "DELETE",
"options": {},
"authentication": "predefinedCredentialType",
"toolDescription": "Permanently deletes a static page by its page ID. Note: unlike posts, Blogger pages have no trash/recovery option \u2014 this is not reversible.",
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "e6b0a370-2ebb-4994-a6c7-9de811ae394d",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-112,
-816
],
"parameters": {
"width": 496,
"height": 304,
"content": "## \ud83e\udd16 Blogger MCP Server for AI Agents\n\nThis workflow exposes Google **Blogger** as a set of tools (MCP server) that any AI agent (Claude, GPT, etc.) can call to manage a blog \u2014 create/edit/delete posts, static pages, comments, and view stats.\n\n\u2699\ufe0f Before using this workflow, you MUST set up your own credentials and variables. See the notes below for step-by-step setup."
},
"typeVersion": 1
},
{
"id": "2a9619f5-341e-43a7-8ec5-2df72c7349eb",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
544,
-768
],
"parameters": {
"width": 560,
"height": 368,
"content": "## \ud83d\udd11 Step 1: Set n8n Variables\n\nGo to **Settings \u2192 Variables** and add:\n\n1. `google_blogger_api_key`\n \u2192 Your Blogger API key from Google Cloud Console\n (Enable \"Blogger API v3\" in your GCP project first)\n\n2. `google_blogger_blog_id`\n \u2192 Your Blogger Blog ID\n \u2192 Find it via Blogger dashboard URL, or call the\n \"List My Blogs\" tool after connecting OAuth below\n\nBoth are referenced in every tool node as:\n{{$vars.google_blogger_api_key}}\n{{$vars.google_blogger_blog_id}}"
},
"typeVersion": 1
},
{
"id": "d084fb94-cbc8-4290-bb9b-c4774b549b3b",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1168,
-768
],
"parameters": {
"width": 528,
"height": 368,
"content": "## \ud83d\udd10 Step 2: Connect Credentials\n\nEach tool node needs its own credential connection:\n\n1. **Bearer Auth** (on MCP Server Trigger node)\n \u2192 Set any secret token \u2014 this protects your MCP endpoint URL.\n \u2192 Share this token only with the AI agent/app calling this server.\n\n2. **Google OAuth2** (on all Blogger action nodes)\n \u2192 Create a Google Cloud OAuth2 credential\n \u2192 Enable \"Blogger API v3\"\n \u2192 Scope needed: https://www.googleapis.com/auth/blogger\n \u2192 Connect your Google account that owns/manages the blog\n\n\u26a0\ufe0f Do not skip this \u2014 the workflow will not run without your own credentials."
},
"typeVersion": 1
},
{
"id": "1c7d2607-432d-4305-8839-2961f739eab4",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1792,
-848
],
"parameters": {
"width": 576,
"height": 352,
"content": "## \ud83d\ude80 Step 3: Use It\n\nOnce variables + credentials are set:\n\n1. Activate this workflow\n2. Copy the MCP Server Trigger's webhook URL\n3. Add it as an MCP server in your AI tool (Claude, n8n AI Agent, etc.), using the Bearer token you set above as the Authorization header\n\nAvailable actions: create/update/patch/delete posts, publish/revert/schedule, search posts, manage static pages, list/approve/delete/flag comments, get blog info & pageview stats."
},
"typeVersion": 1
},
{
"id": "f9b6b674-90cd-44f9-8407-8ffb150a330b",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
3024,
-432
],
"parameters": {
"width": 608,
"height": 880,
"content": "## \ud83d\udd0c Step 4: Connect this MCP server to Claude\n\nOption A \u2014 claude.ai / Claude Desktop / Claude Mobile (GUI)\n1. Go to Settings \u2192 Connectors \u2192 Add custom connector\n2. Paste your n8n MCP webhook URL (from the MCP Server Trigger node)\n3. Open \"Advanced settings\" \u2192 Request headers (beta feature \u2014 may need enabling)\n4. Add header:\n Name: Authorization\n Value: Bearer YOUR_TOKEN_HERE\n5. Click Add, then enable it for your chat via the \"+\" \u2192 Connectors menu\n\nOption B \u2014 Claude Code (CLI), exact JSON to paste into .mcp.json:\n\n{\n \"mcpServers\": {\n \"blogger-mcp\": {\n \"type\": \"http\",\n \"url\": \"YOUR_N8N_MCP_WEBHOOK_URL\",\n \"headers\": {\n \"Authorization\": \"Bearer YOUR_TOKEN_HERE\"\n }\n }\n }\n}\n\nOr via terminal command instead of editing the file:\nclaude mcp add --transport http blogger-mcp YOUR_N8N_MCP_WEBHOOK_URL --header \"Authorization: Bearer YOUR_TOKEN_HERE\"\n\n\u26a0\ufe0f Replace YOUR_N8N_MCP_WEBHOOK_URL with your MCP Server Trigger's Production URL, and YOUR_TOKEN_HERE with the Bearer Auth token you set in n8n credentials."
},
"typeVersion": 1
},
{
"id": "514f23bb-4a05-41d6-84d9-57c96bd08fee",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
2384,
864
],
"parameters": {
"color": 7,
"width": 432,
"height": 288,
"content": "## Comment moderation tools\n\nModerates Blogger comments by approving them, flagging them as spam, or deleting them."
},
"typeVersion": 1
},
{
"id": "a867acaa-6257-4cb8-8a5c-5c6a979935fb",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
2944,
848
],
"parameters": {
"color": 7,
"width": 432,
"height": 304,
"content": "## Post writing tools\n\nA far-right cluster for creating new Blogger posts and updating existing posts using full update or patch operations."
},
"typeVersion": 1
},
{
"id": "bf3d37e6-a0a9-42a3-bd55-af28cbb5b5ec",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
112,
-16
],
"parameters": {
"color": 7,
"width": 2736,
"height": 480,
"content": "## MCP server entry\n\nExposes the workflow as an MCP server so Ai Agent can discover and call the Blogger-related tools."
},
"typeVersion": 1
},
{
"id": "e5cc1c21-4bc2-4c37-b370-63b08bc3767b",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
-272,
848
],
"parameters": {
"color": 7,
"width": 640,
"height": 336,
"content": "## Post lookup tools\n\nA left-side cluster of Blogger API tools for finding posts by ID or path, listing blog posts, and searching posts."
},
"typeVersion": 1
},
{
"id": "49467c07-97b8-4848-815e-cf519b0fd2e5",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
416,
880
],
"parameters": {
"color": 7,
"width": 768,
"height": 288,
"content": "## Post lifecycle tools\n\nHandles nearby post management actions such as deleting, publishing, and reverting posts, with adjacent tools for reading blog information and comments."
},
"typeVersion": 1
},
{
"id": "16a02ad9-3f8c-4ad6-a38c-e28986bd5cf7",
"name": "Sticky Note11",
"type": "n8n-nodes-base.stickyNote",
"position": [
1280,
864
],
"parameters": {
"color": 7,
"width": 960,
"height": 288,
"content": "## Pages and stats\n\nA central cluster for managing Blogger static pages, checking page view statistics, and listing the user's blogs."
},
"typeVersion": 1
},
{
"id": "ff33041b-3a8b-4095-9eb6-7e400ef218b9",
"name": "Fetch Blog Post List2",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
-80,
1040
],
"parameters": {
"url": "https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}/posts",
"options": {},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "key",
"value": "={{$vars.google_blogger_api_key}}"
},
{
"name": "maxResults",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters1_Value', `number of blog post that will return `, 'string') }}"
},
{
"name": "status",
"value": "live"
},
{
"name": "orderBy",
"value": "published"
},
{
"name": "fetchBodies",
"value": "true"
}
]
},
"toolDescription": "Makes an HTTP request and returns the list of blog post"
},
"typeVersion": 4.4
},
{
"id": "d2ba31e1-1390-4ad5-8fa2-9a79bd140bb2",
"name": "Fetch Post by ID2",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
-240,
1040
],
"parameters": {
"url": "=https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}/posts/{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('postId', 'The ID of the post to retrieve', 'string') }}",
"options": {},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "key",
"value": "={{$vars.google_blogger_api_key}}"
},
{
"name": "view",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters1_Value', 'Access level: ADMIN, AUTHOR, or READER', 'string') }}"
}
]
},
"toolDescription": "Retrieves a single blog post by its post ID"
},
"typeVersion": 4.4
},
{
"id": "fa910621-321d-4441-9383-e240ab9fd2ce",
"name": "Fetch Post by Path1",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
80,
1040
],
"parameters": {
"url": "https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}/posts/bypath",
"options": {},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "path",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters0_Value', 'The path component of the post URL, e.g. /2026/07/my-first-post.html', 'string') }}"
},
{
"name": "key",
"value": "={{$vars.google_blogger_api_key}}"
}
]
},
"toolDescription": "Retrieves a blog post using its relative URL path/permalink"
},
"typeVersion": 4.4
},
{
"id": "1ac79bde-1fca-466c-9902-9ea3776b8c7c",
"name": "Search for Posts1",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
240,
1040
],
"parameters": {
"url": "https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}/posts/search",
"options": {},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "q",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters0_Value', 'Search query terms', 'string') }}"
},
{
"name": "key",
"value": "={{$vars.google_blogger_api_key}}"
},
{
"name": "fetchBodies",
"value": "true"
},
{
"name": "orderBy",
"value": "published"
}
]
},
"toolDescription": "Searches blog posts matching a query term"
},
"typeVersion": 4.4
},
{
"id": "d7e5d84b-a064-4d4d-b23f-90d3503c53f0",
"name": "Delete Blog Post1",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
448,
1024
],
"parameters": {
"url": "=https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}/posts/{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('postId', 'The ID of the post to delete', 'string') }}",
"method": "DELETE",
"options": {},
"sendQuery": true,
"authentication": "predefinedCredentialType",
"queryParameters": {
"parameters": [
{
"name": "useTrash",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters0_Value', 'true to move the post to Trash instead of permanently deleting it', 'string') }}"
}
]
},
"toolDescription": "Permanently deletes or trashes a blog post",
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "98d786c6-e4d7-48f2-9204-2db1efd3d71b",
"name": "Publish Blog Post1",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
608,
1024
],
"parameters": {
"url": "=https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}/posts/{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('postId', 'The ID of the draft post to publish', 'string') }}/publish",
"method": "POST",
"options": {},
"sendQuery": true,
"authentication": "predefinedCredentialType",
"queryParameters": {
"parameters": [
{
"name": "publishDate",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters0_Value', `RFC 3339 date-time to schedule publishing, e.g. 2026-08-01T12:00:00Z. Publishes an existing draft post immediately, making it live on the blog. Takes only the post ID \u2014 does not change the title or content, and does not support scheduling for a future date (use Publish_Post1 for scheduling instead).`, 'string') }}"
}
]
},
"toolDescription": "Publishes a draft post, optionally scheduling it for a future date",
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "a15e8538-6fdb-4136-abac-9734aef6a2f0",
"name": "Revert Blog Post1",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
768,
1024
],
"parameters": {
"url": "=https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}/posts/{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('postId', 'The ID of the post to revert to draft', 'string') }}/revert",
"method": "POST",
"options": {},
"authentication": "predefinedCredentialType",
"toolDescription": "Reverts a published or scheduled post back to draft state",
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "2067520d-b874-442d-891d-cc053edf93db",
"name": "Fetch Blog Information1",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
912,
1024
],
"parameters": {
"url": "https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}",
"options": {},
"authentication": "predefinedCredentialType",
"toolDescription": "Gets metadata about the blog: name, description, URL, and post/page counts. Useful for the AI to orient itself before other actions.",
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "081ebf2f-1254-4246-b907-3d51804d87af",
"name": "List Blog Comments1",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
1040,
1024
],
"parameters": {
"url": "=https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}/posts/{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('postId', 'The ID of the post to fetch comments for', 'string') }}/comments",
"options": {},
"authentication": "predefinedCredentialType",
"toolDescription": "Lists reader comments left on a specific blog post",
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "c0c649bd-832f-437d-9865-ef52a9b3beae",
"name": "Fetch Page Views Stats1",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
1632,
1008
],
"parameters": {
"url": "https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}/pageviews",
"options": {},
"sendQuery": true,
"authentication": "predefinedCredentialType",
"queryParameters": {
"parameters": [
{
"name": "range",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters0_Value', 'Timeframe range for stats. Acceptable values are: 7DAYS, 30DAYS, or all', 'string') }}"
}
]
},
"toolDescription": "Retrieves the page view traffic statistics/metrics for the blog over a specified time range",
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "07ea0533-d9a9-4cc1-93ee-d6f972bf8257",
"name": "List Personal Blogs1",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
2112,
1008
],
"parameters": {
"url": "https://www.googleapis.com/blogger/v3/users/self/blogs",
"options": {},
"authentication": "predefinedCredentialType",
"toolDescription": "Retrieves the list of all blogs the authenticated user has access rights to, along with their Blog IDs",
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "2f8caa36-7be0-46bd-9ec3-38762df19a5e",
"name": "Approve Blog Comment1",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
2400,
1024
],
"parameters": {
"url": "=https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}/posts/{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('postId', 'The ID of the post', 'string') }}/comments/{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('commentId', 'The ID of the comment to approve', 'string') }}/approve",
"method": "POST",
"options": {},
"authentication": "predefinedCredentialType",
"toolDescription": "Approves a comment that is pending moderation on a post",
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "05381d8d-10f7-4b67-8599-6bb4f97736a8",
"name": "Mark Comment as Spam1",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
2544,
1024
],
"parameters": {
"url": "=https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}/posts/{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('postId', 'The ID of the post', 'string') }}/comments/{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('commentId', 'The ID of the comment to flag as spam', 'string') }}/removecontent",
"method": "POST",
"options": {},
"authentication": "predefinedCredentialType",
"toolDescription": "Removes the content of a comment and flags it as spam (retains author metadata)",
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "e0671574-d1f3-473c-89f9-8ec15a6d1c08",
"name": "Remove Blog Comment1",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
2704,
1024
],
"parameters": {
"url": "=https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}/posts/{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('postId', 'The ID of the post', 'string') }}/comments/{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('commentId', 'The ID of the comment to delete', 'string') }}",
"method": "DELETE",
"options": {},
"authentication": "predefinedCredentialType",
"toolDescription": "Permanently deletes a comment from a post",
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "8ba26796-e1be-40c3-812f-2a7888f93549",
"name": "Create New Blog Post1",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
2976,
1008
],
"parameters": {
"url": "https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}/posts",
"method": "POST",
"options": {},
"jsonBody": "={{ {\n kind: 'blogger#post',\n title: $fromAI('title', 'The title of the blog post', 'string'),\n content: $fromAI('content', 'The HTML content of the blog post', 'string'),\n published: $fromAI('published', 'Optional: RFC 3339 date-time, e.g., 2026-07-19T20:48:00Z. Leave empty to publish immediately', 'string') || undefined,\n labels: $fromAI('labels', 'Optional: Comma-separated labels, e.g. Tech, News. Leave empty if none', 'string') ? $fromAI('labels', 'Optional: Comma-separated labels, e.g. Tech, News. Leave empty if none', 'string').split(',').map(s => s.trim()) : undefined,\n readerComments: $fromAI('readerComments', 'Optional: Reader comments option: ALLOW or DONT_ALLOW. Leave empty for default ALLOW', 'string') || undefined,\n customMetaData: $fromAI('customMetaData', 'Optional: Search description / SEO meta description (often buggy/ignored by Blogger but supported)', 'string') || undefined,\n location: $fromAI('locationName', 'Optional: Name of the location, e.g. San Francisco, CA. Leave empty if not setting location', 'string') ? {\n name: $fromAI('locationName', 'Optional: Name of the location, e.g. San Francisco, CA. Leave empty if not setting location', 'string'),\n lat: parseFloat($fromAI('locationLat', 'Optional: Latitude coordinate, e.g. 37.7749. Leave empty if not setting location', 'string') || 0),\n lng: parseFloat($fromAI('locationLng', 'Optional: Longitude coordinate, e.g. -122.4194. Leave empty if not setting location', 'string') || 0)\n } : undefined\n} }}",
"sendBody": true,
"sendQuery": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"queryParameters": {
"parameters": [
{
"name": "isDraft",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters0_Value', 'true to save as draft, false to publish immediately', 'string') }}"
}
]
},
"toolDescription": "Creates a new blog post with optional labels, custom published date, location, reader comments settings, and SEO description",
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "268b77da-08d9-42ea-b43e-bb3b73739a98",
"name": "Update Blog Post1",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
3120,
1008
],
"parameters": {
"url": "=https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}/posts/{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('postId', 'The ID of the post to update', 'string') }}",
"method": "PUT",
"options": {},
"jsonBody": "={{ {\n kind: 'blogger#post',\n id: $fromAI('postId', 'The ID of the post to update', 'string'),\n blog: {\n id: $vars.google_blogger_blog_id\n },\n title: $fromAI('title', 'The new title of the post', 'string'),\n content: $fromAI('content', 'The new HTML content of the post', 'string'),\n published: $fromAI('published', 'Optional: RFC 3339 date-time, e.g., 2026-07-19T20:48:00Z. Leave empty to keep existing or use current time', 'string') || undefined,\n labels: $fromAI('labels', 'Optional: Comma-separated labels, e.g. Tech, News. Leave empty if none', 'string') ? $fromAI('labels', 'Optional: Comma-separated labels, e.g. Tech, News. Leave empty if none', 'string').split(',').map(s => s.trim()) : undefined,\n readerComments: $fromAI('readerComments', 'Optional: Reader comments option: ALLOW or DONT_ALLOW. Leave empty for default ALLOW', 'string') || undefined,\n customMetaData: $fromAI('customMetaData', 'Optional: Search description / SEO meta description (often buggy/ignored by Blogger but supported)', 'string') || undefined,\n location: $fromAI('locationName', 'Optional: Name of the location, e.g. San Francisco, CA. Leave empty if not setting location', 'string') ? {\n name: $fromAI('locationName', 'Optional: Name of the location, e.g. San Francisco, CA. Leave empty if not setting location', 'string'),\n lat: parseFloat($fromAI('locationLat', 'Optional: Latitude coordinate, e.g. 37.7749. Leave empty if not setting location', 'string') || 0),\n lng: parseFloat($fromAI('locationLng', 'Optional: Longitude coordinate, e.g. -122.4194. Leave empty if not setting location', 'string') || 0)\n } : undefined\n} }}",
"sendBody": true,
"sendQuery": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"queryParameters": {
"parameters": [
{
"name": "publish",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters0_Value', 'true to publish this draft as part of the update', 'string') }}"
},
{
"name": "revert",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters1_Value', 'true to revert a published post back to draft', 'string') }}"
}
]
},
"toolDescription": "Replaces an existing blog post entirely, including optional labels, published date, location, reader comments settings, and SEO description",
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "0f0851b5-286f-4177-87b1-fd013cbfdccf",
"name": "Patch Blog Post1",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
3264,
1008
],
"parameters": {
"url": "=https://www.googleapis.com/blogger/v3/blogs/{{$vars.google_blogger_blog_id}}/posts/{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('postId', 'The ID of the post to patch', 'string') }}",
"method": "PATCH",
"options": {},
"jsonBody": "={{ {\n title: $fromAI('title', 'Optional: New title to set on the post', 'string') || undefined,\n content: $fromAI('content', 'Optional: New HTML content to set on the post', 'string') || undefined,\n published: $fromAI('published', 'Optional: New RFC 3339 date-time to set', 'string') || undefined,\n labels: $fromAI('labels', 'Optional: Comma-separated labels to update. Leave empty if not modifying', 'string') ? $fromAI('labels', 'Optional: Comma-separated labels to update. Leave empty if not modifying', 'string').split(',').map(s => s.trim()) : undefined,\n readerComments: $fromAI('readerComments', 'Optional: Reader comments setting: ALLOW or DONT_ALLOW', 'string') || undefined,\n customMetaData: $fromAI('customMetaData', 'Optional: New search description to update', 'string') || undefined,\n location: $fromAI('locationName', 'Optional: Name of the location, e.g. San Francisco, CA. Leave empty if not setting location', 'string') ? {\n name: $fromAI('locationName', 'Optional: Name of the location, e.g. San Francisco, CA. Leave empty if not setting location', 'string'),\n lat: parseFloat($fromAI('locationLat', 'Optional: Latitude coordinate, e.g. 37.7749. Leave empty if not setting location', 'string') || 0),\n lng: parseFloat($fromAI('locationLng', 'Optional: Longitude coordinate, e.g. -122.4194. Leave empty if not setting location', 'string') || 0)\n } : undefined\n} }}",
"sendBody": true,
"sendQuery": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"queryParameters": {
"parameters": [
{
"name": "publish",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters0_Value', 'true to publish this draft as part of the update', 'string') }}"
},
{
"name": "revert",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters1_Value', 'true to revert a published post back to draft', 'string') }}"
}
]
},
"toolDescription": "Updates specific fields of an existing post without replacing it entirely (e.g., updating only labels, title, comment settings, or SEO description)",
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
}
],
"active": true,
"settings": {
"binaryMode": "separate",
"callerPolicy": "workflowsFromSameOwner",
"timeSavedMode": "fixed",
"availableInMCP": true,
"executionOrder": "v1"
},
"versionId": "8bed1734-89d8-42e7-aa07-fc4d1bd66ff2",
"nodeGroups": [],
"connections": {
"Patch Blog Post1": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Delete Blog Post1": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Fetch Post by ID2": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"List Static Pages": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Revert Blog Post1": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Search for Posts1": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Update Blog Post1": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Create Static Page": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Delete Static Page": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Publish Blog Post1": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Update Static Page": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Fetch Post by Path1": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"List Blog Comments1": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"List Personal Blogs1": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Remove Blog Comment1": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Approve Blog Comment1": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Create New Blog Post1": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Fetch Blog Post List2": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Mark Comment as Spam1": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Fetch Blog Information1": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Fetch Page Views Stats1": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
googleOAuth2ApihttpBearerAuth
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow exposes Google Blogger API operations as an MCP server endpoint so an AI agent (for example, Claude) can create, update, publish, search, and delete Blogger posts, manage static pages and comments, and fetch blog metadata and pageview statistics. Receives an…
Source: https://n8n.io/workflows/17843/ — 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.
Need help? Want access to this workflow + many more paid workflows + live Q&A sessions with a top verified n8n creator?
Need help? Want access to this workflow + many more paid workflows + live Q&A sessions with a top verified n8n creator?
Complete MCP server exposing 21 api.clarify.io API operations to AI agents.
Turn n8n into a Google Search Console MCP server. This workflow exposes 18 tools any MCP client (Claude, Cursor, etc.) can call — search analytics, URL inspection, sitemaps, the Indexing API, site ver
Complete MCP server exposing 9 NPR Listening Service API operations to AI agents.