Misar.Blog MCP Server

by mrgulshanyadav

1 stars
305 downloads
Not rated
GitHub Website

About

AI-first blogging platform MCP server — publish posts, track analytics, manage series, run newsletter campaigns.

Details

Author
mrgulshanyadav
GitHub stars
1
Downloads
305
Categories
Marketing, Other, AI

- 23 tools over stdio; 20 available on the Smithery remote
- Publish articles and manage drafts
- AI-powered topic research, title suggestions, and cover‑image generation
- View analytics summaries and manage series
- Authenticate via API key or one‑click browser login

Setting up with Highlight

This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:

  1. Download and install Highlight from highlightai.com/download
  2. Navigate to the plugins tab and select "Add Custom Plugin"
  3. Configure the plugin with the settings below
    Plugin Name Misar.Blog MCP Server
    Command (node, npx, python, etc.)

    Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.

  4. Enable "Start Automatically" if you want the plugin to start when Highlight launches

From the repository

Install via npx -y @misarblog/mcp and set the MISARBLOG_API_KEY environment variable, or omit the key and use the login tool for a browser-based authentication flow. Add the server configuration to your MCP client’s JSON file (e.g., ~/.cursor/mcp.json). Optionally, use the hosted remote on Smithery with a Bearer API key.

upgrade

Show the account's current plan, how much of each quota remains, and what a higher plan unlocks. Called with no arguments it only reads — useful any time, not just after hitting a limit, and the natural follow-up when a write tool reports a quota error. Two arguments make it act rather than report, so pass them only on explicit instruction from the user: `start_trial` ENROLS the account in the free trial immediately (a real account change, not a preview), and `open` LAUNCHES a checkout page in the user's browser. Neither charges a card by itself. Requires an API key. No billing state changes unless you pass start_trial; the returned quota snapshot already reflects a trial started in the same call. For whether you are authenticated at all, use `status`.

get_profile

Fetch the authenticated account's own creator profile: id, username, display name, bio, public profile URL, and whether Stripe payouts are connected. Use it to confirm which account a key belongs to before acting on that account's behalf, to get your own profile id for tools that take a UUID, or to check stripe_connected before discussing paid posts. It only ever describes the caller — there is no tool here for looking up someone else's profile. Reads only; nothing is modified. Requires an API key, and takes no parameters. Errors if the key is missing or invalid, which is the quickest way to test authentication.

get_analytics_summary

Summarise the account's performance over a trailing window: page views, gross and net revenue, and active subscriber count. Use it for 'how did I do this month' style questions. These are whole-account totals — it cannot break results down per article, and it covers a trailing window ending today rather than an arbitrary date range. Reads only. Requires an API key. Revenue is returned in cents (revenue_cents gross, revenue_net_cents after fees) with a formatted revenue_usd added for convenience — read the cents fields when doing arithmetic. Zero views is a real answer, not an error.

list_my_articles

List articles owned by the authenticated account, newest first, including drafts and scheduled posts. Use this to find your own work — it is the only listing that sees unpublished content. To search across the whole site, including other creators, use search_articles instead. Reads only; nothing is created or modified. Requires an API key. Returns `{ articles, total }`, where each article carries id, slug, title, status, url, editor_url, tags and timestamps, but NOT the article body — call get_article for that. `total` counts all matches, not just the page returned.

get_article

Fetch a single article by slug, including its full Markdown body. Use this after list_my_articles or search_articles has given you a slug and you need the actual content — for reading, editing, or repurposing it. Fetching one article at a time is deliberate: the listing tools omit bodies so they stay cheap. Reads only; nothing is created or modified. Requires an API key for unpublished articles; published ones are readable without. Returns the article object with content_markdown populated. Errors if the slug does not exist or the account cannot see it.

publish_article

Create a new article and make it live immediately, or schedule it for a future time. This PUBLISHES: without schedule_at the article is world-readable the moment this returns, at the visibility you choose. If the piece is not ready, use create_draft instead and publish later. Each call creates a NEW article — it is not idempotent, so calling twice publishes twice; use update_article to change one that exists. Requires an API key and consumes one publish from the account's plan quota; the response warns when the allowance is nearly spent. Returns the created article with its public url and editor_url.

create_draft

Save an article as an unpublished draft. Nothing becomes visible to readers: use this whenever the work still needs review, and publish_article only when it should go live. The draft can be edited afterwards with update_article. Each call creates a NEW draft — not idempotent, so calling twice leaves two drafts. Requires an API key. Returns the draft with an editor_url for finishing it in the browser.

update_article

Change the title, body, or tags of an article or draft that already exists. Only the fields you pass are touched; omitted fields keep their current values. Passing `tags` REPLACES the whole tag list rather than adding to it, so send the full set you want. Editing a published article changes what readers see immediately; it does not unpublish or re-date it. Safe to repeat: the same call twice leaves the same result. Requires an API key, and the account must own the article. Errors if no updatable field is supplied. Returns the updated article.

search_articles

Search PUBLISHED articles across all of Misar.Blog, including other creators' work. Use this for discovery, research, and competitive reading. It never returns drafts, scheduled, or private posts — not even your own — so reach for list_my_articles when you want your unpublished work. Reads only. No API key required; unauthenticated callers are rate-limited by IP. Filters combine with AND. Returns an array of article summaries without bodies; pass a slug to get_article for the full text. An empty array means no matches, which is not an error.

research_topic

Research a topic with AI and return insights, sources, and a suggested content outline. Use it at the START of a piece, before drafting — it produces raw material to write from, not a finished article and not a title. For titles use generate_title_seo; to see what already exists on Misar.Blog use search_articles. Nothing is saved: no draft, article, or file is created, and calling it has no effect on the blog. Requires an API key and consumes AI credits from the account's plan, so each call costs whether or not you use the output. Runs noticeably longer than a plain read, and being generative, two identical calls give different text. Returns prose to read, not structured JSON — verify any factual claims it makes.

generate_title_seo

Generate 5 search-optimised article titles from a TOPIC OR KEYWORD, each with a keyword-strategy hint. Aims at high-volume, low-competition long-tail phrases and at AI answer engines (ChatGPT, Perplexity, Claude) as well as Google. Pick between the two title tools by what you have in hand: use this one when you have a topic or keywords and the article may not be written yet. Use suggest_titles when the draft already exists and you want titles drawn from its actual text. Passing `context` here does not make them equivalent — this one still optimises for the keywords you supply. Nothing is saved and no article is created or retitled; use update_article to apply a title. Requires an API key and consumes AI credits per call. Generative, so repeated calls return different titles.

suggest_titles

Generate 5 title options FROM AN EXISTING DRAFT, derived from what the article actually says. Pick between the two title tools by what you have in hand: use this one when the text exists and should drive the headline. Use generate_title_seo when you are starting from a topic or keyword, or want titles aimed at specific search terms — this tool takes no keyword input at all. Nothing is saved and the article is not retitled; apply a choice with update_article. Requires an API key and consumes AI credits per call. Generative, so repeated calls return different titles. Needs at least 20 characters of text to work from.

generate_cover_image

Generate an image from a text prompt with AI, upload it to the Misar.Blog CDN, and return its public URL for use as cover_image_url when publishing. Use it when no artwork exists yet; use upload_image for a file the user already has. Each call generates a NEW image and costs generation credits against the account's plan — it is not idempotent, so re-running to 'try again' bills again. Generation takes noticeably longer than other tools. Requires an API key. The resulting URL is public and cannot be deleted through this server. Results vary between runs for the same prompt.

get_series

List every series the authenticated account owns. Despite the name this returns the whole collection, not one series — there is no single-series lookup. Use it to find a series slug before calling add_to_series, or to check whether a series already exists before create_series makes a duplicate. Reads only; nothing is created or modified. Requires an API key, and takes no parameters — it is unfiltered and unpaginated. Returns `{ series, total }` where each entry carries id, slug, title, description, url and article_count. An empty list means the account has no series yet, which is not an error.

create_series

Create a new, empty series — a named collection that related articles can be added to. Creating the series does not move any article into it; follow up with add_to_series for each one. Call get_series first to avoid making a second series with the same title, since each call creates a NEW series and nothing deduplicates them. Requires an API key. The series and its URL become publicly reachable, though it shows nothing until articles are added. Returns the series with the slug that add_to_series needs.

add_to_series

Place an existing article into an existing series, optionally at a specific position. Both the series and the article must already exist — this creates neither. Identify them by SLUG, not id: get_series supplies the series slug and the article tools supply the article slug. Omit position to append at the end. Requires an API key. Adding an article does not change its publication status or URL; it only changes where it appears. Inserting at a position shifts the articles after it down. Errors if either slug is unknown.

list_comments

Read the comment thread on one article, oldest first, paginated. Use it to review reader feedback or summarise a discussion. It reads comments only; there is no tool here for posting or moderating a reply. Reads only. Requires an API key and counts against the plan's request quota. Page through with limit and offset — the default returns the first 20. Returns the comments with their authors and timestamps; an empty list simply means no comments yet, which is not an error.

get_follow_status

Check whether the authenticated account follows a given profile, and how many followers that profile has. Use it before offering to follow someone, so you do not suggest an action that is already done. It answers about ONE profile identified by UUID — there is no tool here that lists everyone you follow. Reads only; following state is not changed. Requires an API key and counts against the plan's request quota. Returns the follow relationship and follower count. Errors if the UUID does not match a profile.

list_newsletter_subscribers

List the people subscribed to the authenticated account's newsletter, paginated. Use it to size the audience or export the list. For what has been SENT to them, use list_newsletter_issues instead. Reads only — no email is sent and no subscriber is added or removed. Requires an API key. This returns personal data (email addresses), so treat the result as confidential and do not echo it into shared transcripts. Page with limit and offset; the default returns the first 20.

list_newsletter_issues

List newsletter issues the account has sent or scheduled, newest first. Use it to check what went out and when, or to confirm a scheduled send exists before queueing another. For WHO receives them, use list_newsletter_subscribers. Reads only — this neither sends nor cancels an issue. Requires an API key. Returns each issue with its subject, status and send time. An empty list means nothing has been sent yet, which is not an error.

get_reactions

Read the reaction totals on one article, plus which reactions the authenticated account has left on it. Use it before add_reaction or remove_reaction so you know the current state — it is how you tell 'not yet liked' from 'already liked'. Covers one article at a time. Reads only; no reaction is added or removed. Requires an API key. Returns counts per type (like, clap, bookmark) alongside the caller's own reactions. Zero counts are a real answer, not an error.

add_reaction

Record one reaction — like, clap, or bookmark — from the authenticated account on an article. This acts publicly as the account holder, so only call it when the user has actually asked to react; do not react on their behalf to be helpful. Adds a single type per call — react twice for two types. Safe to repeat: if the reaction already exists the call succeeds and changes nothing, so it will not double-count. Requires an API key. Use remove_reaction to undo, and get_reactions to see the resulting totals.

remove_reaction

Withdraw one reaction the authenticated account previously left on an article. Removes exactly the type you name and leaves the account's other reactions on that article intact — removing 'like' does not remove a 'bookmark'. Nothing else is deleted: the article and its comments are untouched. Safe to repeat: removing a reaction that is not there succeeds and changes nothing. Requires an API key. Call get_reactions first if you need to know what is currently set.

Claude Desktop / Cursor

Paste into your MCP client config file to install this server.

{
    "mcpServers": {
        "misar.blog mcp server": {
            "misarblog": {
                "type": "http",
                "url": "https://www.misar.blog/api/mcp"
            }
        }
    }
}

McpServers

{
    "misarblog": {
        "type": "http",
        "url": "https://www.misar.blog/api/mcp"
    }
}
# @misarblog/mcp — Misar.Blog MCP Server **Publish & manage your blog from Claude Code, Cursor, or Windsurf** [![npm version](https://img.shields.io/npm/v/@misarblog/mcp.svg)](https://www.npmjs.com/package/@misarblog/mcp) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Node.js Version](https://img.shields.io/node/v/@misarblog/mcp.svg)](https://nodejs.org/) [![Smithery](https://smithery.ai/badge/misar/misarblog-mcp)](https://smithery.ai/server/misar/misarblog-mcp) Publish blog posts, manage drafts, organize series, run AI research/title/cover-image generation, and pull analytics — all from your AI coding environment. Connect your [Misar.Blog](https://www.misar.blog) creator account via an API key or the one-click `login` browser flow (no copy-paste). The stdio package exposes **23 tools**. On the hosted [Smithery](https://smithery.ai/server/misar/misarblog-mcp) remote (streamable-HTTP), **20** are available — the three local-only tools (`login`, `status`, `upload_image`) require a local process and are not exposed over remote HTTP. --- ## Installation ### Claude Code ```bash claude mcp add misarblog -- npx -y @misarblog/mcp ``` Then set your API key: ```bash export MISARBLOG_API_KEY=mbk_your_key ``` ### Manual configuration (Cursor, Windsurf, VS Code, any MCP client) ```json { "mcpServers": { "misarblog": { "command": "npx", "args": ["-y", "@misarblog/mcp"], "env": { "MISARBLOG_API_KEY": "mbk_your_key" } } } } ``` - **Cursor** — `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (project) - **Windsurf** — `~/.codeium/windsurf/mcp_config.json` - **VS Code (Copilot)** — `.vscode/mcp.json`, add `"type": "stdio"` to the server entry ### Hosted remote (no local install) Install the hosted server straight from Smithery — it runs the package for you and connects over streamable-HTTP: ```bash npx -y @smithery/cli install misar/misarblog-mcp --client claude ``` Or add the remote endpoint directly and authenticate with a Bearer API key: ``` https://www.misar.blog/api/mcp Authorization: Bearer mbk_your_key ``` --- ## Authentication **Option 1 — API key (recommended).** Generate a key at **[Dashboard → Settings → API Keys](https://www.misar.blog/dashboard/settings/api-keys)** (it starts with `mbk_`), then set `MISARBLOG_API_KEY`. Keys are rate-limited to 100 req/min and can be revoked or regenerated at any time. **Option 2 — browser login (stdio only).** Omit `MISARBLOG_API_KEY` and call the `login` tool as your first request. It starts a temporary `127.0.0.1` listener, opens `https://www.misar.blog/dashboard/settings/api?mcp_port=<port>`, and saves the returned key to `~/.misarblog/config.json` — no clipboard involved. The listener is local-only and shuts down after 120 seconds. --- ## Tools **23 tools** over stdio; the **20** marked ✓ are also available on the Smithery remote. | Area | Tools | Remote | |------|-------|:------:| | Connection & account | `login`, `status` | — | | | `get_profile` | ✓ | | Articles & drafts | `list_my_articles`, `get_article`, `publish_article`, `create_draft` | ✓ | | Series | `get_series`, `create_series`, `add_to_series` | ✓ | | AI writing | `research_topic`, `generate_title_seo`, `suggest_titles` | ✓ | | Images | `upload_image` | — | | | `generate_cover_image` | ✓ | | Analytics | `get_analytics_summary` | ✓ | | Comments & follows | `list_comments`, `get_follow_status` | ✓ | | Reactions | `get_reactions`, `add_reaction`, `remove_reaction` | ✓ | | Newsletter | `list_newsletter_subscribers`, `list_newsletter_issues` | ✓ | Full parameter tables, return shapes, and example prompts live in the **[MCP Tools Reference](https://docs.misar.io/blog)**. --- ## Usage examples Prompts you can send directly in Claude Code or Cursor Agent mode: ```text Write a 1000-word article about "Why AI-first blogging changes SEO forever" and publish it on my Misar.Blog with tags ["AI", "SEO", "blogging"]. ``` ```text Generate a dark, futuristic cover image for an article titled "Building with MCP", then create a draft with that image as the cover. ``` ```text List my published articles, create a series called "AI Writing Guide", and add the last 3 to it in chronological order. ``` ```text Show me my analytics for the last 90 days. ``` --- ## Self-hosted Misar.Blog Point the server at your own instance with `MISARBLOG_BASE_URL`: ```json { "mcpServers": { "misarblog": { "command": "npx", "args": ["-y", "@misarblog/mcp"], "env": { "MISARBLOG_API_KEY": "mbk_your_key", "MISARBLOG_BASE_URL": "https://blog.yourdomain.com" } } } } ``` --- ## Requirements - **Node.js** >= 18 (package fetched automatically via `npx`) - A [Misar.Blog](https://www.misar.blog) creator account - An API key from your [dashboard](https://www.misar.blog/dashboard/settings/api-keys), or the `login` tool --- ## Links - **Homepage** — https://www.misar.blog - **Smithery** — https://smithery.ai/server/misar/misarblog-mcp - **Docs** — https://docs.misar.io/blog - **npm** — https://www.npmjs.com/package/@misarblog/mcp - **Source** — https://git.misar.io/misaradmin/misar-io (`packages/blog-mcp-server/`) ## License MIT — Copyright (c) 2026 Misar AI Technology Pvt Ltd
No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.