blogger-mcp-toolkit
Provides tools for managing Blogger blogs, posts, pages, comments, media, and user profiles via the Google Blogger API v3.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@blogger-mcp-toolkit List my recent blog posts"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
blogger-mcp-toolkit
A universal MCP (Model Context Protocol) server providing complete access to the Google Blogger API v3, permanent Base64 media embedding, and lightweight summary listing modes.
Interact seamlessly with Blogger blogs, posts, pages, comments, media, and user profiles directly from your favorite AI assistant or MCP-enabled client (such as Claude Code, Claude Desktop, Cursor, Zed, Windsurf, or Antigravity CLI).
📑 Table of Contents
Related MCP server: blogger-mcp
🌟 Features
100% Blogger API v3 Coverage + Media & Search Extensions: 29 MCP tools for full management of blogs, posts, pages, comments, media, and users.
Remote-Friendly Interactive OAuth (
npx blogger-mcp-auth): Standalone authentication CLI supporting local browser redirect AND manual code copy-pasting for remote/SSH/Docker environments.Strict
BLOGGER_*Environment Schema: Clean, standardized configuration usingBLOGGER_CLIENT_ID,BLOGGER_CLIENT_SECRET,BLOGGER_REFRESH_TOKEN, andBLOGGER_API_KEY.Permanent Base64 Image Embedding (
blogger_media_to_base64): Convert local images (.png,.jpg,.jpeg,.webp,.gif,.svg) into Base64 Data URIs with zero external CDN dependencies, ensuring your images never expire.Lightweight Listing Mode (
summaryOnly): Omit heavy HTML post content onlist,search, andsearchByLabelendpoints to drastically reduce JSON response sizes (from >50KB down to ~2KB) and prevent payload truncation.Dedicated Label Search (
blogger_posts_searchByLabel): Quick filtering of posts by tag/label.Automatic HTML Markdown Cleaner: Cleans raw Markdown code fences (e.g.
html ...) before publishing posts or pages to Blogger.
🚀 Quick Start & Installation
Step 1: Acquire your Blogger Refresh Token
Run the interactive authentication tool directly in your terminal:
Option A (Official GitHub Release — Recommended for Latest Version):
npx github:RadouaneElarfaoui/blogger-mcp-toolkit blogger-mcp-authOption B (NPM Registry Release):
npx blogger-mcp-authInteractive Prompt: Enter your
BLOGGER_CLIENT_IDandBLOGGER_CLIENT_SECRETwhen prompted.Browser Authentication: Authorize the app in your browser. (If working over SSH/remote container, simply copy-paste the redirected URL or authorization code back into the terminal!)
Token Output: Copy the generated
BLOGGER_REFRESH_TOKENdisplayed in green.
Step 2: Install across your AI assistants with add-mcp
Install and configure automatically across all your AI assistants (Claude Code, Cursor, Zed, Windsurf, VS Code, etc.) in one single command:
Option A (Official GitHub Release — Recommended for Latest Version):
npx add-mcp github:RadouaneElarfaoui/blogger-mcp-toolkit \ --env BLOGGER_CLIENT_ID=your-client-id.apps.googleusercontent.com \ --env BLOGGER_CLIENT_SECRET=your-client-secret \ --env BLOGGER_REFRESH_TOKEN=your-refresh-tokenOption B (NPM Registry Release):
npx add-mcp blogger-mcp-toolkit \ --env BLOGGER_CLIENT_ID=your-client-id.apps.googleusercontent.com \ --env BLOGGER_CLIENT_SECRET=your-client-secret \ --env BLOGGER_REFRESH_TOKEN=your-refresh-token
⚙️ Google Cloud Console Setup
To communicate with the Blogger API, you need OAuth2 credentials:
Create a Project: Go to Google Cloud Console, click New Project, and name it (e.g.,
Blogger MCP).Enable Blogger API v3: Go to APIs & Services > Library, search for Blogger API v3, and click Enable.
Configure OAuth Consent Screen:
Go to APIs & Services > OAuth consent screen.
Choose External, fill in required support email fields.
Under Test users, add your own Google email address (Crucial if your app is in "Testing" status!).
Create Credentials:
Go to APIs & Services > Credentials > + CREATE CREDENTIALS > OAuth client ID.
Select Web application (or Desktop app).
Add Authorized redirect URI:
http://localhost:3000/oauth2callback(or port 3001/3002).Copy your Client ID and Client Secret.
📦 Manual Setup
# Clone the repository
git clone https://github.com/RadouaneElarfaoui/blogger-mcp-toolkit.git
cd blogger-mcp-toolkit
# Install dependencies & build
npm install
npm run build
# Generate Refresh Token locally
cp .env.example .env
npm run auth🌍 Environment Variables
blogger-mcp-toolkit exclusively uses the following BLOGGER_* environment variables:
Variable | Description | Required |
| OAuth2 Client ID from Google Cloud Console | Yes |
| OAuth2 Client Secret from Google Cloud Console | Yes |
| OAuth2 Refresh Token (generated via | Yes |
| Optional API key for read-only access | No |
🛠️ Available Tools (29)
Tool Name | Description |
| Get blog metadata by blog ID |
| Get blog metadata by its URL |
| List blogs for a user |
Tool Name | Description |
| List posts for a blog (supports |
| Get a post by ID |
| Get a post by its URL path |
| Search posts by query string (supports |
| Filter posts by a label/tag (supports |
| Create a new post (automatically strips raw Markdown HTML code block wrappers) |
| Full update of a post |
| Partial update of a post |
| Delete a post |
| Publish a draft post |
| Revert a published post to draft |
Tool Name | Description |
| List static pages for a blog |
| Get a page by ID |
| Create a new static page (automatically strips raw Markdown HTML code block wrappers) |
| Full update of a page |
| Partial update of a page |
| Delete a page |
Tool Name | Description |
| List comments for a specific post |
| List comments across all posts |
| Get a specific comment |
| Approve a comment |
| Permanently delete a comment |
| Remove comment content |
| Mark a comment as spam |
Tool Name | Description |
| Convert a local image file (.png, .jpg, .jpeg, .webp, .gif, .svg) to an embedded Base64 Data URI with a ready-to-use Blogger |
Tool Name | Description |
| Get user profile information |
🔌 MCP Client Configuration
Claude Desktop
Edit your claude_desktop_config.json:
{
"mcpServers": {
"blogger": {
"command": "npx",
"args": ["-y", "blogger-mcp-toolkit"],
"env": {
"BLOGGER_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
"BLOGGER_CLIENT_SECRET": "your-client-secret",
"BLOGGER_REFRESH_TOKEN": "your-refresh-token"
}
}
}
}Cursor
Edit .cursor/mcp.json or Cursor MCP settings:
{
"mcpServers": {
"blogger": {
"command": "npx",
"args": ["-y", "blogger-mcp-toolkit"],
"env": {
"BLOGGER_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
"BLOGGER_CLIENT_SECRET": "your-client-secret",
"BLOGGER_REFRESH_TOKEN": "your-refresh-token"
}
}
}
}Windsurf
Edit ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"blogger": {
"command": "npx",
"args": ["-y", "blogger-mcp-toolkit"],
"env": {
"BLOGGER_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
"BLOGGER_CLIENT_SECRET": "your-client-secret",
"BLOGGER_REFRESH_TOKEN": "your-refresh-token"
}
}
}
}Zed
Edit settings.json in Zed:
{
"context_servers": {
"blogger": {
"command": {
"path": "npx",
"args": ["-y", "blogger-mcp-toolkit"]
},
"env": {
"BLOGGER_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
"BLOGGER_CLIENT_SECRET": "your-client-secret",
"BLOGGER_REFRESH_TOKEN": "your-refresh-token"
}
}
}
}📄 License
This project is licensed under the MIT License.
Available Tools
29 toolsblogger_blogs_getA
Retrieve a single blog's metadata by its unique blog ID. Returns blog details like name, description, URL, and post/page counts.
Inputs: blogId (required), view, maxPosts.
blogger_blogs_getByUrlA
Retrieve a single blog's metadata by its public URL. Useful when you only know the blog address.
Inputs: url (required), view.
blogger_blogs_listByUserA
List all blogs associated with a specific user. Returns an array of blogs.
Inputs: role, view, status, userId, +1 more.
blogger_comments_approveA
Approve a comment, removing it from spam or pending status and making it live.
Inputs: blogId (required), postId (required), commentId (required).
blogger_comments_deleteA
Permanently delete a comment from a post.
Inputs: blogId (required), postId (required), commentId (required).
blogger_comments_getB
Retrieve a single specific comment by its unique comment ID.
Inputs: blogId (required), postId (required), commentId (required), view.
blogger_comments_listC
List all comments for a specific post. Returns an array of comment objects.
Inputs: blogId (required), postId (required), view, status, +5 more.
blogger_comments_listByBlogA
List comments across all posts in a blog. Useful for a global comment moderation view.
Inputs: blogId (required), status, endDate, pageToken, +3 more.
blogger_comments_markAsSpamA
Mark a comment as spam, moving it out of the live view.
Inputs: blogId (required), postId (required), commentId (required).
blogger_comments_removeContentA
Remove comment content, replacing it with an admin notice, without fully deleting the comment object.
Inputs: blogId (required), postId (required), commentId (required).
blogger_media_to_base64A
Convert a local image file (.png, .jpg, .jpeg, .webp, .gif, .svg) into an embedded Base64 Data URI and generate a ready-to-use Blogger tag snippet. Guaranteed permanent embedding inside Blogger post bodies without external host dependencies.
Inputs: filePath (required), alt, style.
blogger_pages_deleteA
Permanently delete a static page by its ID.
Inputs: blogId (required), pageId (required).
blogger_pages_getA
Retrieve a single static page by its unique page ID, including its content and metadata.
Inputs: blogId (required), pageId (required), view.
blogger_pages_insertA
Create a new static page for a blog with the specified title and HTML content.
Inputs: title (required), blogId (required), content (required), isDraft.
blogger_pages_listB
List all static pages for a specific blog, with optional summary mode to strip heavy HTML.
Inputs: blogId (required), view, status, pageToken, +3 more.
blogger_pages_patchA
Perform a partial update of an existing static page. Only updates the provided fields (e.g., title or content).
Inputs: blogId (required), pageId (required), title, revert, +2 more.
blogger_pages_updateA
Perform a full update of an existing static page. Replaces the entire page with the new title and content.
Inputs: title (required), blogId (required), pageId (required), content (required), +2 more.
blogger_posts_deleteA
Permanently delete a blog post.
Inputs: blogId (required), postId (required).
blogger_posts_getA
Retrieve a single blog post by its unique ID, including content, metadata, labels, and optionally comments and images.
Inputs: blogId (required), postId (required), view, fetchBody, +2 more.
blogger_posts_getByPathA
Retrieve a single blog post by its URL path. Useful when resolving public blog links.
Inputs: path (required), blogId (required), view, maxComments.
blogger_posts_insertC
Create a new blog post.
Inputs: title (required), blogId (required), content (required), labels, +2 more.
blogger_posts_listA
List posts for a specific blog, with optional filtering, pagination, and lightweight summary mode.
Inputs: blogId (required), view, labels, status, +8 more.
blogger_posts_patchB
Perform a partial update of a blog post, updating only the provided fields.
Inputs: blogId (required), postId (required), title, labels, +3 more.
blogger_posts_publishA
Publish a draft blog post, either immediately or scheduled for the future.
Inputs: blogId (required), postId (required), publishDate.
blogger_posts_revertB
Revert a published blog post back to a draft.
Inputs: blogId (required), postId (required).
blogger_posts_searchA
Search across a blog's posts using a text query string, with optional lightweight summary mode.
Inputs: q (required), blogId (required), orderBy, fetchBodies, +1 more.
blogger_posts_searchByLabelA
Quickly filter and retrieve posts for a blog by a specific label (tag).
Inputs: label (required), blogId (required), status, pageToken, +2 more.
blogger_posts_updateB
Perform a full update of an existing blog post. Replaces the entire post content.
Inputs: title (required), blogId (required), postId (required), content (required), +3 more.
blogger_users_getA
Retrieve a user's Blogger profile information. Returns details like user ID, display name, profile URL, and location.
Inputs: userId.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 29 tools
Each tool targets a distinct resource and action, with clear boundaries between list/get/search, full updates vs patches, and comment moderation actions. Even similar tools like posts_update and posts_patch are clearly differentiated by their descriptions.
All tool names follow a consistent blogger_<resource>_<action> pattern using snake_case. Compound actions like getByPath and searchByLabel are also uniformly structured, making the naming predictable and easy to navigate.
At 29 tools, the count exceeds the 25+ threshold, making the server feel heavy. While the scope of Blogger API justifies many tools, the sheer number may overwhelm agents and increase selection complexity.
The toolkit provides thorough CRUD and lifecycle coverage for posts, pages, comments, and blogs, plus user and media utilities. There are no glaring gaps; the inclusion of publish/revert, spam handling, and media embedding makes the surface complete for common Blogger workflows.
Related MCP Connectors
An MCP server for the BlogCaster project.
Create, edit, organize, publish, and configure JustBlogged blogs from MCP clients.
Hosted MCP for BlogBat: read, write, generate, and publish blog articles and content.
Hosted MCP for BlogBat: read, write, generate, and publish blog articles and content.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn intermediary server that enables AI models to interact with Google's Blogger platform, automating the creation and management of blogs, posts, and labels through the Blogger API.15 npm1MIT
- AlicenseAqualityDmaintenanceA custom MCP server for interacting with Google Blogger blogs. It provides tools to list, create, edit, delete, and publish blog posts through Claude Code or Claude Desktop.9MIT
- FlicenseDqualityDmaintenanceMCP server for blog management that provides tools to get, search, and create blog posts via a mock API.3-
- FlicenseNot gradedqualityCmaintenanceMCP server for managing YouTube channels using Data API v3 and Analytics. Supports video upload, comments, playlists, and analytics via ~30 tools, with stateless OAuth authentication.-