Skip to main content
Glama
blogger-mcp-toolkit

blogger-mcp-toolkit

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.

npm version Node.js TypeScript License: MIT MCP Compatible

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 using BLOGGER_CLIENT_ID, BLOGGER_CLIENT_SECRET, BLOGGER_REFRESH_TOKEN, and BLOGGER_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 on list, search, and searchByLabel endpoints 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-auth
  • Option B (NPM Registry Release):

    npx blogger-mcp-auth
  • Interactive Prompt: Enter your BLOGGER_CLIENT_ID and BLOGGER_CLIENT_SECRET when 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_TOKEN displayed 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-token
  • Option 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:

  1. Create a Project: Go to Google Cloud Console, click New Project, and name it (e.g., Blogger MCP).

  2. Enable Blogger API v3: Go to APIs & Services > Library, search for Blogger API v3, and click Enable.

  3. 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!).

  4. 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

BLOGGER_CLIENT_ID

OAuth2 Client ID from Google Cloud Console

Yes

BLOGGER_CLIENT_SECRET

OAuth2 Client Secret from Google Cloud Console

Yes

BLOGGER_REFRESH_TOKEN

OAuth2 Refresh Token (generated via npx blogger-mcp-auth)

Yes

BLOGGER_API_KEY

Optional API key for read-only access

No


🛠️ Available Tools (29)

Tool Name

Description

blogger_blogs_get

Get blog metadata by blog ID

blogger_blogs_getByUrl

Get blog metadata by its URL

blogger_blogs_listByUser

List blogs for a user

Tool Name

Description

blogger_posts_list

List posts for a blog (supports summaryOnly mode to strip heavy HTML content)

blogger_posts_get

Get a post by ID

blogger_posts_getByPath

Get a post by its URL path

blogger_posts_search

Search posts by query string (supports summaryOnly mode)

blogger_posts_searchByLabel

Filter posts by a label/tag (supports summaryOnly mode)

blogger_posts_insert

Create a new post (automatically strips raw Markdown HTML code block wrappers)

blogger_posts_update

Full update of a post

blogger_posts_patch

Partial update of a post

blogger_posts_delete

Delete a post

blogger_posts_publish

Publish a draft post

blogger_posts_revert

Revert a published post to draft

Tool Name

Description

blogger_pages_list

List static pages for a blog

blogger_pages_get

Get a page by ID

blogger_pages_insert

Create a new static page (automatically strips raw Markdown HTML code block wrappers)

blogger_pages_update

Full update of a page

blogger_pages_patch

Partial update of a page

blogger_pages_delete

Delete a page

Tool Name

Description

blogger_comments_list

List comments for a specific post

blogger_comments_listByBlog

List comments across all posts

blogger_comments_get

Get a specific comment

blogger_comments_approve

Approve a comment

blogger_comments_delete

Permanently delete a comment

blogger_comments_removeContent

Remove comment content

blogger_comments_markAsSpam

Mark a comment as spam

Tool Name

Description

blogger_media_to_base64

Convert a local image file (.png, .jpg, .jpeg, .webp, .gif, .svg) to an embedded Base64 Data URI with a ready-to-use Blogger <img> tag snippet for zero-dependency permanent embedding

Tool Name

Description

blogger_users_get

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 tools
blogger_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_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

    A3.7/5.0

    Scored across 29 tools

    Disambiguation5/5

    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.

    Naming Consistency5/5

    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.

    Tool Count2/5

    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.

    Completeness5/5

    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

    Related MCP Servers