# MisarPost MCP Server (remote · api.misar.io)

Plan, generate, schedule and repurpose posts across every channel, and track what performs.

- Trust score: 80/100 (high trust)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-23

## Components

- remote · `api.misar.io`: 80/100 (this document), [markdown](https://verifymcp.io/servers/misar-ai-misarpost-mcp/post-mcp.md), [page](https://verifymcp.io/servers/misar-ai-misarpost-mcp/post-mcp)
- npm · `@misarpost/mcp`: 72/100, [markdown](https://verifymcp.io/servers/misar-ai-misarpost-mcp/misarpost-mcp.md), [page](https://verifymcp.io/servers/misar-ai-misarpost-mcp/misarpost-mcp)

## Channel facts

- Endpoint: `https://api.misar.io/post/mcp`
- Transports: `streamable-http`
- Auth: `required (not validated)`
- Version: `3.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-23.

- **Endpoint Security**: 89/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, but the challenge carries no valid RFC 9728 metadata, so a client cannot discover where to get a token.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 86/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Tool/resource definitions use about 7597 tokens (~83/item across 91 items; 85 tools + 6 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 20/100
  - Stability observed for 6 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 98/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 9 of 10 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "list_publish_options" implies "publish" and declares readOnlyHint instead, contradicting what its own name says it does.
  - An AI judge read all 86 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 60/100
  - Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28.

## Install

### How do I install the MisarPost MCP Server server?

MisarPost MCP Server is a hosted endpoint at https://api.misar.io/post/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http misar-ai-misarpost-mcp 'https://api.misar.io/post/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "misar-ai-misarpost-mcp": {
      "url": "https://api.misar.io/post/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "misar-ai-misarpost-mcp": {
      "type": "http",
      "url": "https://api.misar.io/post/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.misar-ai-misarpost-mcp]
url = "https://api.misar.io/post/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "misar-ai-misarpost-mcp": {
      "type": "remote",
      "url": "https://api.misar.io/post/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add misar-ai-misarpost-mcp --url 'https://api.misar.io/post/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  misar-ai-misarpost-mcp:
    url: "https://api.misar.io/post/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "misar-ai-misarpost-mcp": {
      "Transport": "http",
      "Url": "https://api.misar.io/post/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add misar-ai-misarpost-mcp -t streamable-http -u 'https://api.misar.io/post/mcp'
```

### Other

```json
{
  "mcpServers": {
    "misar-ai-misarpost-mcp": {
      "type": "http",
      "url": "https://api.misar.io/post/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-22 (score 80, +1)

No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-20 (score 79, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-18 (score 78, +1)

- [functional improvement] Stability: unverified → 0.03

### 2026-10-17 (score 77)

First indexed and scored.

## MCP tools (85)

### `list_connections` (~53 tokens)

List the user's active connected social accounts with their account ID, platform and display name. Call this before scheduling: schedule_post needs the connected_account_id, and a post can only go to an account that is connected and active.

### `list_publish_options` (~157 tokens)

Look up the destinations a connected account can publish into — Discord or Slack channels, Pinterest boards, Reddit post flairs, Hashnode or Medium publications, Hashnode tags, Lemmy communities, Listmonk lists or templates, Skool groups, Whop forums, or WordPress categories and tags. Use the returned ids in schedule_post's platform_meta. Reads live from the platform, so an empty list can also mean the platform could not be reached.

Input parameters:

- `account_id` (string, required): Connected account UUID — from list_connections.
- `kind` (string, required): Which list to fetch; it must match the connected account's platform.
- `subreddit` (string): Subreddit name (without r/). Required for kind=reddit_flairs.

### `list_account_plugs` (~89 tokens)

Show the plugs (automatic follow-up actions — e.g. reposting or resharing a post once it passes a likes or reactions threshold, on X, Bluesky, Threads and LinkedIn) available for one connected account, how each is currently configured and activated, and the account's 20 most recent plug runs.

Input parameters:

- `account_id` (string, required): Connected account UUID — from list_connections.

### `configure_account_plug` (~163 tokens)

Turn a plug on or off for one connected account and set its configuration, replacing the plug's previous configuration. An activated plug later acts on that account's published posts automatically, in public, without asking again — confirm the exact plug and settings with the user first. Get valid plug keys and config fields from list_account_plugs.

Input parameters:

- `account_id` (string, required): Connected account UUID — from list_connections.
- `activated` (boolean, required): true to activate the plug, false to switch it off.
- `config` (object): The plug's configuration as flat key → string/number/boolean values, using the configFields list_account_plugs returns. Replaces the existing configuration.
- `plug_key` (string, required): Plug key — from list_account_plugs definitions.

### `list_posts` (~136 tokens)

List the user's scheduled and published posts, newest-scheduled first, 20 per page, with platform, status, scheduled/published time, post URL, tags and engagement metrics. Filter by status (e.g. queued or pending for what is coming up — the content calendar — or published for what went out) or by tag.

Input parameters:

- `page` (number): 1-indexed page number (default 1, 20 posts per page).
- `status` (string): Only posts in this status. Omit for every status except archived and cancelled.
- `tag_id` (string): Only posts carrying this post tag (UUID).

### `schedule_post` (~395 tokens)

Schedule a post to ONE connected account at a given time, or publish it immediately with scheduled_at="now". This queues real content for a real audience — show the user the exact text, account and time and get explicit approval first. To post the same content to several accounts, call once per account with the same post_batch_id. The user's post signature is appended server-side, and the safety gateway may refuse a post (account health, daily limits, duplicates).

Input parameters:

- `connected_account_id` (string, required): Connected account UUID — from list_connections.
- `content_text` (string, required): Post text, 1–5000 characters.
- `first_comment` (string): Optional first comment posted under the post (max 2200 characters).
- `media_urls` (array): Up to 10 publicly reachable media URLs to attach.
- `platform` (string, required): Platform of that connected account (must match it).
- `platform_meta` (object): Platform-specific publish settings, passed through to the publisher. Examples: Reddit { subreddit, flairId }, Pinterest { board }, Discord/Slack { channelId }, YouTube { title, privacyStatus }, Hashn…
- `post_batch_id` (string): UUID shared by every call that posts the same content to different accounts, so they can later be managed together.
- `scheduled_at` (string, required): ISO 8601 datetime with timezone (e.g. 2030-01-01T09:00:00Z), or "now" to publish immediately.
- `tag_ids` (array): Up to 20 post tag UUIDs to apply.
- `variant_id` (string): UUID of the draft (from list_drafts or generate_posts) this post was made from; marks that draft as scheduled.

### `cancel_post` (~80 tokens)

Cancel a post that is still pending or queued, so it never publishes. Posts that are already publishing or published cannot be cancelled, and a cancelled post cannot be re-queued — it must be scheduled again. To change a post instead, use update_post. Confirm with the user first.

Input parameters:

- `post_id` (string, required): Post UUID — from list_posts.

### `get_calendar` (~133 tokens)

Get every post scheduled between two dates (default: 7 days ago to 30 days ahead), oldest first, with platform, status, time, text, media, first comment and tags — the content calendar view. Optionally only posts with one tag. Needs a plan that includes the content calendar; otherwise it returns an upgrade message.

Input parameters:

- `from` (string): Start date, YYYY-MM-DD (default 7 days ago).
- `tag_id` (string): Only posts carrying this post tag (UUID).
- `to` (string): End date, YYYY-MM-DD, inclusive (default 30 days from now).

### `update_post` (~177 tokens)

Edit a post that has not gone out yet (status pending, queued or draft): its text, its scheduled time, its first comment, or its tags. Changing the time moves when it publishes, so confirm the new text and time with the user first. Published posts cannot be edited.

Input parameters:

- `content_text` (string): New post text.
- `first_comment` (string|null): New first comment, or null to remove it.
- `post_id` (string, required): Post UUID — from list_posts or get_calendar.
- `scheduled_at` (string): New ISO 8601 datetime with timezone offset, e.g. 2030-01-01T09:00:00+05:30.
- `tag_ids` (array): Replace the post's tags with these post tag UUIDs (max 20); [] removes all.

### `reply_to_post` (~98 tokens)

Post a public reply/comment on one of the user's ALREADY-PUBLISHED posts, on the platform it was published to. It goes live immediately and cannot be recalled from here. Show the user the exact text and get their explicit approval before calling. Not every platform supports replies; an unsupported one returns an error.

Input parameters:

- `message` (string, required): The reply text.
- `post_id` (string, required): Post UUID — from list_posts (status published).

### `revert_post` (~95 tokens)

Delete an ALREADY-PUBLISHED post from the platform it went out on (unlike cancel_post, which only stops a post that has not published yet). This removes it from the user's live profile and cannot be undone. Get the user's explicit approval for this exact post first. The response includes the post's postBatchId, for revert_post_batch.

Input parameters:

- `post_id` (string, required): Post UUID — from list_posts (status published).

### `revert_post_batch` (~103 tokens)

"Delete everywhere": delete every published post from one batch (one compose or repurpose action sent to several accounts) from all of its platforms. Each platform is attempted separately and reported separately; some platforms (e.g. TikTok) have no delete API and need manual clean-up. Cannot be undone — get the user's explicit approval first.

Input parameters:

- `post_batch_id` (string, required): Batch UUID — post_batch_id from list_posts, or postBatchId from revert_post.

### `share_post` (~68 tokens)

Create (or return the existing) public preview link for one of the user's posts. Anyone with the link can view the post without signing in, so get the user's explicit approval before sharing. Revoke it with unshare_post.

Input parameters:

- `post_id` (string, required): Post UUID — from list_posts.

### `unshare_post` (~47 tokens)

Revoke a post's public preview link, so the old link stops working. Safe to call when no link exists.

Input parameters:

- `post_id` (string, required): Post UUID — from list_posts.

### `list_drafts` (~48 tokens)

List up to 50 draft post variants awaiting review (status draft or pending_review), newest first — including AI-generated drafts from generate_posts — with platform, caption, hashtags, tone and source.

### `review_drafts` (~80 tokens)

Approve or reject several drafts at once by ID. Approving does NOT schedule or publish anything — use schedule_post for that. Rejected drafts drop out of list_drafts. Returns how many drafts were updated.

Input parameters:

- `action` (string, required): What to do with the drafts.
- `ids` (array, required): Draft UUIDs — from list_drafts.

### `get_stats` (~55 tokens)

Get the account overview: connected accounts, posts queued, published this week and this month, drafts waiting, the last published post, the top performing post of the month, and the average engagement rate (null when no metrics exist yet).

### `get_analytics_trends` (~101 tokens)

Get per-channel daily trends for the last 7, 30 or 90 days: posts published and failed, engagement and impressions, totals, and the change against the previous period. Each channel's metric field says whether real engagement data exists for it (engagement) or only publish volume (posts) — never present a posts-only channel's zero engagement as a real result.

Input parameters:

- `days` (number): Window in days (default 30).

### `get_growth_overview` (~89 tokens)

Get the Growth Hub overview for the last 7, 30 or 90 days: per-platform engagement trend lines, the weakest-performing platforms (bottlenecks), which post formats perform best, and which platforms have real trend data behind their suggestions. Requires the Empire plan; on other plans it returns an upgrade message.

Input parameters:

- `days` (number): Window in days (default 30).

### `list_growth_opportunities` (~73 tokens)

List rising trends worth posting about now, limited to the user's niches and to platforms they have connected, each with the hashtag, its growth, and a posting suggestion. Returns an empty list — never an invented one — when no real signal exists. Requires the Empire plan; on other plans it returns an upgrade message.

### `list_growth_playbooks` (~59 tokens)

Get per-platform growth playbooks for the user's connected platforms — cadence, format, timing and anti-spam guidance compiled from each platform's official creator documentation, with source links. Requires the Empire plan; on other plans it returns an upgrade message.

### `get_next_growth_opportunity` (~68 tokens)

Get the single best next content opportunity for the user's connected platforms and niches — a compact version of list_growth_opportunities. Returns `{ opportunity: null }` rather than an invented one when there is no real signal. Requires the Empire plan; on other plans it returns an upgrade message.

### `get_contentripple_usage` (~54 tokens)

Show how many ContentRipple repurposes the user has run this month, their monthly limit (null means unlimited), and their plan tier. Check before a large repurposing run so it does not stop halfway.

### `repurpose_content` (~209 tokens)

Turn one source — a URL, pasted text or markdown, or an RSS item — into channel-native variants such as an X thread, LinkedIn post or carousel, Instagram caption or reel script, newsletter, or YouTube description. Fetches the URL, extracts the core message, writes each variant with AI, and saves source and variants. Returns each saved variant with its id. Nothing is scheduled or published. Counts against the monthly ContentRipple allowance.

Input parameters:

- `formats` (array): Which variants to write. Omit for all of them.
- `raw_content` (string): Source text or markdown, up to 20,000 characters (required for text/docforge).
- `source_type` (string, required): url: fetch source_url. text or docforge: use raw_content (pasted text or markdown). rss: pass the item's URL as source_url.
- `source_url` (string): Source URL (required for source_type=url).
- `tone` (string): Writing tone (default professional).

### `update_content_variant` (~96 tokens)

Edit a saved ContentRipple variant's text (which marks it edited) and/or set its status. Use the variant id returned by repurpose_content. Publishes nothing.

Input parameters:

- `content` (string): New variant text, up to 20,000 characters.
- `status` (string): New status. At least one of content or status is required.
- `variant_id` (string, required): Content variant UUID — from repurpose_content.

### `schedule_content_variant` (~191 tokens)

Schedule a saved ContentRipple variant (its text plus hashtags) to a connected account of the matching platform at a given time. Only these formats can be published: twitter_thread, linkedin_post, linkedin_carousel, instagram_caption, instagram_reel_script, threads_post, mastodon_post, bluesky_post — the rest are copy-only. This queues real content for a real audience; confirm the text, account and time with the user first.

Input parameters:

- `connected_account_id` (string, required): Connected account UUID on the variant's platform — from list_connections.
- `post_batch_id` (string): Optional UUID shared with sibling posts of the same content, for managing them together.
- `scheduled_at` (string, required): ISO 8601 datetime (UTC, e.g. 2030-01-01T09:00:00Z).
- `variant_id` (string, required): Content variant UUID — from repurpose_content.

### `fetch_content_feed` (~57 tokens)

Read an RSS or Atom feed and return its entries, so the user can pick one to repurpose with repurpose_content (source_type rss). Nothing is saved.

Input parameters:

- `feed_url` (string, required): URL of the RSS or Atom feed.

### `parse_content_source` (~137 tokens)

Extract the core message, key points and structure from a URL, pasted text (50-20,000 characters) or Markdown, without generating any variants — a preview of what repurpose_content would work from. Counts against the monthly repurpose limit and uses one AI text action, so prefer repurpose_content when the user wants variants anyway.

Input parameters:

- `markdown` (string): Required when type is docforge.
- `text` (string): Required when type is text.
- `type` (string, required): What kind of source: a URL, plain text, or Markdown (docforge).
- `url` (string): Required when type is url.

### `list_repurpose_history` (~72 tokens)

List past ContentRipple repurposes, newest first: each source (type, URL, title, core message) with its variants and, for variants that were scheduled, the post's status, URL and engagement.

Input parameters:

- `limit` (integer): How many sources (default 20, at most 50).

### `delete_repurpose_source` (~62 tokens)

Delete one repurposed source and its variants from ContentRipple history. Posts already scheduled or published from it are not touched. This cannot be undone — confirm with the user first.

Input parameters:

- `source_id` (string, required): Source UUID — from list_repurpose_history.

### `generate_posts` (~123 tokens)

Write AI post variants about a topic for one or more platforms — up to 5 per platform — and save them as drafts (visible in list_drafts). Nothing is scheduled or published. Each call counts against the plan's monthly AI generation allowance.

Input parameters:

- `count` (number): Variants per platform, 1–5 (default 3).
- `platforms` (array, required): Platforms to write for (at least one).
- `tone` (string): Writing tone (default professional).
- `topic` (string, required): Topic or brief for the posts (3–500 characters).

### `enhance_topic` (~114 tokens)

Rewrite a raw topic or idea into a structured content brief: a sharper topic, suggested tone, content angles and key messages for the chosen platforms. Saves nothing; counts against the monthly AI allowance. Feed the result to generate_plan or generate_posts.

Input parameters:

- `audience` (string): Target audience, up to 200 characters.
- `goal` (string): Content goal (default engagement).
- `platforms` (array, required): Target platforms (at least one).
- `raw_topic` (string, required): Raw topic or idea (3–500 characters).

### `generate_plan` (~81 tokens)

For a topic or brief, suggest hook options, the best posting time slots, and trending hashtags per platform. Saves nothing and schedules nothing; counts against the monthly AI allowance.

Input parameters:

- `enhanced_topic` (string, required): Topic or content brief (3–1000 characters), e.g. from enhance_topic.
- `platforms` (array, required): Target platforms (at least one).

### `research_hashtags` (~100 tokens)

Build a tiered hashtag strategy for a keyword across platforms — broad, mid and niche tags plus each platform's algorithm signals. Saves nothing; counts against the monthly AI allowance.

Input parameters:

- `goal` (string): Strategy goal (default awareness).
- `keyword` (string, required): Primary keyword or topic (2–200 characters).
- `niche` (string): Content niche, up to 100 characters.
- `platforms` (array, required): Target platforms (at least one).

### `get_optimization_insights` (~74 tokens)

Analyse the last 30 days of post metrics with AI and return the best time of day, best tone, top hashtags, prompt suggestions and per-platform insights. Changes nothing, but each call counts against the monthly AI allowance.

Input parameters:

- `platform` (string): Only this platform's posts. Omit for all platforms.

### `generate_image` (~109 tokens)

Generate an image for a post from a text prompt, sized for the platform (16:9 for X, LinkedIn and YouTube, square for Instagram and Threads, 9:16 for TikTok), and store it in the user's media. Returns its URL to attach to a post. Uses one AI image action from the plan's quota. Nothing is posted.

Input parameters:

- `platform` (string): Platform to size it for (default twitter).
- `prompt` (string, required): What the image should show.

### `get_trends` (~48 tokens)

Get the latest trending hashtags and content hooks for the user's TrendPulse niches, each with a snapshot id. Returns cached results under two hours old, or refreshes them live from the trend sources.

### `queue_trend_drafts` (~76 tokens)

Turn 1–3 trend snapshots (from get_trends) into draft posts — one per snapshot for each platform the user has connected — saved to the draft queue (list_drafts). Nothing is scheduled or published.

Input parameters:

- `snapshot_ids` (array, required): 1–3 trend snapshot UUIDs — from get_trends.

### `schedule_trend_posts` (~133 tokens)

Publish posts about 1–3 trend snapshots to the given connected accounts, scheduled five minutes from now — one post per content hook per account, written from the trend's hooks. This puts real content in front of a real audience almost immediately and the user does not see the text first: show them get_trends' hooks and get explicit approval. Prefer queue_trend_drafts when they want to review.

Input parameters:

- `connected_account_ids` (array, required): Connected account UUIDs to post to — from list_connections.
- `snapshot_ids` (array, required): 1–3 trend snapshot UUIDs — from get_trends.

### `refresh_trends` (~61 tokens)

Force a fresh fetch of trending hashtags from every trend source for the user's niches and store new snapshots, instead of waiting for the scheduled refresh. Needs a plan that includes manual refresh; otherwise it returns an upgrade message. Use get_trends afterwards to read them.

### `send_trend_digest` (~58 tokens)

Email the user their trend digest (top recent trends for their niches) now. It always goes to the account owner's own address — never anyone else. Returns `skipped` when the digest is turned off or there are no recent trends.

### `get_trend_hooks` (~49 tokens)

Get the content hooks (opening lines and angles) for one trend snapshot — snapshot ids come from get_trends.

Input parameters:

- `snapshot_id` (string, required): Trend snapshot UUID — from get_trends.

### `get_trend_platform_content` (~67 tokens)

Get the per-platform content already generated for one trend snapshot — hashtags, plus title/description for YouTube and title/subtitle for Medium. Empty until generate_trend_platform_content has run for it.

Input parameters:

- `snapshot_id` (string, required): Trend snapshot UUID — from get_trends.

### `generate_trend_platform_content` (~102 tokens)

Generate per-platform content (hashtags, and titles where a platform needs them) for one trend snapshot, for the platforms asked (default: all seven). Regenerating replaces the earlier content for those platforms. Nothing is posted — turn one into a draft with use_trend_platform_content.

Input parameters:

- `platforms` (array): Platforms to generate for. Omit for all of them.
- `snapshot_id` (string, required): Trend snapshot UUID — from get_trends.

### `use_trend_platform_content` (~78 tokens)

Turn one platform's generated trend content into a draft post (generating it first if needed). The draft lands in the review queue (list_drafts) — nothing is published or scheduled.

Input parameters:

- `platform` (string, required): Which platform's content to draft.
- `snapshot_id` (string, required): Trend snapshot UUID — from get_trends.

### `get_trend_performance` (~52 tokens)

Show how the user's trend-sourced posts actually performed: each TrendPulse draft (last 100) joined to whether it was scheduled or published and its likes, comments, reposts, impressions and reach.

### `list_post_templates` (~42 tokens)

List the user's saved post templates, most recently updated first — reusable composer states with text, per-platform overrides, target accounts, platform settings, media and first comment.

### `get_post_template` (~47 tokens)

Get one saved post template in full, by id — to reuse its text, accounts and settings in schedule_post.

Input parameters:

- `template_id` (string, required): Template UUID — from list_post_templates.

### `create_post_template` (~174 tokens)

Save a reusable post template: default text, optional per-platform text, target accounts, platform settings, media and first comment. Saving publishes nothing.

Input parameters:

- `account_ids` (array): Connected account UUIDs the template targets (max 50) — from list_connections.
- `content` (string): Default post text, up to 20,000 characters.
- `content_overrides` (object): Per-platform text that replaces content for that platform, as platform → text.
- `first_comment` (string): First comment text (max 2200 characters).
- `media` (array): Up to 10 media attachments.
- `name` (string, required): Template name (1–120 characters).
- `platform_settings` (object): Per-platform publish settings, as platform → settings object (same keys as schedule_post's platform_meta).

### `update_post_template` (~193 tokens)

Change a saved post template. Only the fields passed are changed, and each one passed replaces the stored value entirely (e.g. account_ids replaces the whole list).

Input parameters:

- `account_ids` (array): Connected account UUIDs the template targets (max 50) — from list_connections.
- `content` (string): Default post text, up to 20,000 characters.
- `content_overrides` (object): Per-platform text that replaces content for that platform, as platform → text.
- `first_comment` (string): First comment text (max 2200 characters).
- `media` (array): Up to 10 media attachments.
- `name` (string): Template name (1–120 characters).
- `platform_settings` (object): Per-platform publish settings, as platform → settings object (same keys as schedule_post's platform_meta).
- `template_id` (string, required): Template UUID — from list_post_templates.

### `delete_post_template` (~47 tokens)

Permanently delete a saved post template. Posts already scheduled from it are not affected. Confirm with the user first.

Input parameters:

- `template_id` (string, required): Template UUID — from list_post_templates.

### `list_post_tags` (~39 tokens)

List the user's post tags (id, name, colour). Tag ids filter list_posts and get_calendar and are applied with schedule_post or update_post.

### `create_post_tag` (~57 tokens)

Create a post tag with a name and colour, for grouping posts by campaign or theme. Names must be unique per user.

Input parameters:

- `color` (string, required): Tag colour.
- `name` (string, required): Tag name (1–60 characters).

### `update_post_tag` (~61 tokens)

Rename and/or recolour a post tag. Posts keep the tag.

Input parameters:

- `color` (string): New colour.
- `name` (string): New name (1–60 characters).
- `tag_id` (string, required): Tag UUID — from list_post_tags.

### `delete_post_tag` (~53 tokens)

Permanently delete a post tag and remove it from every post that carries it. The posts themselves are not affected. Confirm with the user first.

Input parameters:

- `tag_id` (string, required): Tag UUID — from list_post_tags.

### `list_media` (~61 tokens)

List the user's uploaded media library, newest first, 24 per page, with each file's public URL — usable directly in schedule_post's media_urls.

Input parameters:

- `page` (number): 1-indexed page (default 1, 24 items per page).

### `delete_media` (~62 tokens)

Permanently delete a file from the media library and storage. Posts that already include its URL keep their own copy of the URL, but the file behind it is gone. Confirm with the user first.

Input parameters:

- `media_id` (string, required): Media UUID — from list_media.

### `list_video_avatars` (~48 tokens)

List the stock presenter avatars available for AI video generation. Pass an avatar's id to generate_video.

Input parameters:

- `provider` (string): Video provider (default heygen, currently the only one).

### `list_video_voices` (~47 tokens)

List the stock voices available for AI video generation. Pass a voice's id to generate_video.

Input parameters:

- `provider` (string): Video provider (default heygen, currently the only one).

### `create_video_script` (~64 tokens)

Write a short talking-presenter video script from a post's text. Saves nothing; counts against the monthly AI allowance. Show the script to the user before generate_video.

Input parameters:

- `post_text` (string, required): Post text to base the script on (1–4000 characters).

### `generate_video` (~142 tokens)

Start rendering an AI presenter video from a script, avatar and voice. Returns a job id immediately; poll get_video_status until it completes. Rendering is metered and spends the user's video allowance — confirm the script first.

Input parameters:

- `aspect_ratio` (string, required): Video shape.
- `avatar_id` (string, required): Avatar id — from list_video_avatars.
- `captions` (boolean): Burn in captions (default true).
- `provider` (string): Video provider (default heygen, currently the only one).
- `script` (string, required): What the presenter says (1–5000 characters).
- `voice_id` (string, required): Voice id — from list_video_voices.

### `get_video_status` (~56 tokens)

Check an AI video job: processing, failed (with the error), or completed with the video's URL in the media storage — ready for schedule_post's media_urls.

Input parameters:

- `job_id` (string, required): Job id — from generate_video.

### `list_personas` (~33 tokens)

List the user's PersonaForge personas — writing styles learned from a real account — plus extraction jobs still running and recent failures.

### `get_persona` (~49 tokens)

Get one persona in full: its name, cover image, source account, and the style profile used when writing in it.

Input parameters:

- `persona_id` (string, required): Persona UUID — from list_personas.

### `create_persona` (~188 tokens)

Start learning a writing persona from recent posts — either a connected account (instagram, twitter, youtube) or a public profile (youtube, medium, mastodon, bluesky). Fetches the posts and analyses them with AI in the background (counts against the plan's AI image allowance, for the persona cover); returns a job id to poll with get_persona_job_status.

Input parameters:

- `connected_account_id` (string): Required for connected_account — from list_connections.
- `identifier` (string): Required for public_profile — the profile handle or URL (max 300 characters).
- `name` (string): Optional persona name (max 60 characters).
- `platform` (string, required): connected_account: instagram, twitter, youtube. public_profile: youtube, medium, mastodon, bluesky.
- `source_kind` (string, required): Learn from one of the user's connected accounts, or from a public profile.

### `get_persona_job_status` (~52 tokens)

Check a persona extraction job started by create_persona: its status, the new persona's id once done, or the error.

Input parameters:

- `job_id` (string, required): Job id — from create_persona.

### `rename_persona` (~48 tokens)

Rename a persona. Its learned voice is unchanged.

Input parameters:

- `name` (string, required): New name (1–60 characters).
- `persona_id` (string, required): Persona UUID — from list_personas.

### `delete_persona` (~50 tokens)

Permanently delete a persona and its learned voice. Recreating it means re-running create_persona. Confirm with the user first.

Input parameters:

- `persona_id` (string, required): Persona UUID — from list_personas.

### `generate_persona_post` (~119 tokens)

Write a post about a topic in a persona's voice (or the user's own trained voice when no persona is given), with a voice-match score. The post is saved for review, not scheduled. Counts against the monthly PersonaForge post allowance.

Input parameters:

- `persona_id` (string): Persona UUID — from list_personas. Omit to use the user's own trained voice.
- `platform` (string, required): Platform to write for, e.g. linkedin or twitter.
- `topic` (string, required): What the post is about (1–500 characters).

### `list_persona_replies` (~48 tokens)

List AI-drafted replies to inbound comments and messages, by status (default pending — the ones waiting for review).

Input parameters:

- `status` (string): Which replies to list (default pending).

### `generate_persona_reply` (~130 tokens)

Draft a reply, in the user's trained voice, to an inbound comment or message on one of their posts. The draft is saved as pending for review (list_persona_replies) — nothing is sent. Needs a plan with PersonaForge replies.

Input parameters:

- `inbound_text` (string, required): The comment or message to reply to (max 2000 characters).
- `platform` (string, required): Platform the conversation is on.
- `source_post_id` (string, required): Platform id of the user's post being replied under.
- `source_post_text` (string, required): Text of that post (max 1000 characters).

### `review_persona_reply` (~106 tokens)

Approve, edit or reject one pending AI-drafted reply. Approving or editing adds the final text to the draft queue (list_drafts) — it is not posted. Reject marks it skipped. Act only on the user's decision.

Input parameters:

- `action` (string, required): Decision.
- `edited_text` (string): Required for action=edit: the corrected reply (max 2000 characters).
- `reply_id` (string, required): Reply UUID — from list_persona_replies.

### `get_voice_model` (~55 tokens)

Get the user's own trained voice model — tone breakdown, signature phrases, emoji patterns, average post length, preferred hooks, hashtag style and how many posts it learned from. `model` is null until train_voice_model has run.

### `train_voice_model` (~68 tokens)

Train (or retrain) the user's own voice model from their last 50 published posts. Replaces the existing voice model. Uses one AI text action from the plan's quota and fails with a clear message when the user has no published posts yet. Confirm with the user before retraining.

### `generate_bio_variants` (~106 tokens)

Generate two profile-bio variants for one platform in the user's trained voice — A authority-focused, B curiosity-focused — and save them as a bio A/B test. Optionally pass the current bio to improve on. Uses one AI text action. Nothing is changed on the platform itself.

Input parameters:

- `current_bio` (string): The bio the user has now, to improve on.
- `platform` (string, required): Platform the bio is for, e.g. twitter or linkedin.

### `list_competitor_personas` (~40 tokens)

List the competitor accounts the user has analysed, newest first, with posting frequency, content pillars, gaps, average engagement and best posting time.

### `analyze_competitor` (~122 tokens)

Analyse a competitor's public X (Twitter) or LinkedIn account — posting frequency, content pillars, gaps, engagement and best posting time — and save it (re-analysing the same handle updates it). Needs a plan that includes competitor analysis; otherwise it returns an upgrade message.

Input parameters:

- `display_name` (string): Name to show for this competitor.
- `handle` (string, required): The competitor's handle on that platform.
- `niche` (string): The competitor's niche, for context.
- `platform` (string, required): Platform the handle is on.

### `list_notifications` (~68 tokens)

List the user's MisarPost notifications (publish results, account problems and the like), newest first, with the unread count.

Input parameters:

- `page` (number): 1-indexed page (default 1).
- `page_size` (number): Items per page (default 20, max 50).

### `mark_notification_read` (~48 tokens)

Mark one notification as read, e.g. after relaying it to the user. It drops out of the unread count.

Input parameters:

- `notification_id` (string, required): Notification UUID — from list_notifications.

### `mark_all_notifications_read` (~27 tokens)

Mark every unread notification as read. There is no way to mark them unread again.

### `list_webhooks` (~43 tokens)

List the user's outbound webhooks — the URLs MisarPost sends signed event payloads to — with their events and whether each is active. Signing secrets are never returned.

### `create_webhook` (~110 tokens)

Register an outbound webhook: MisarPost will POST signed payloads for the chosen events to this URL from now on. The response carries the signing secret exactly once — tell the user to store it; it cannot be shown again. Sending account data to a new URL needs the user's explicit approval of that URL.

Input parameters:

- `events` (array, required): Events to deliver: post.published, post.failed, account.disconnected.
- `url` (string, required): The user's public HTTPS endpoint (max 2048 characters).

### `update_webhook` (~94 tokens)

Change an outbound webhook's URL or events, or pause/resume it with active. Only the fields passed change.

Input parameters:

- `active` (boolean): false pauses delivery, true resumes it.
- `events` (array): Events to deliver: post.published, post.failed, account.disconnected.
- `url` (string): New public HTTPS endpoint.
- `webhook_id` (string, required): Webhook UUID — from list_webhooks.

### `delete_webhook` (~46 tokens)

Permanently remove an outbound webhook; events stop being delivered to its URL. Confirm with the user first.

Input parameters:

- `webhook_id` (string, required): Webhook UUID — from list_webhooks.

### `list_workspaces` (~37 tokens)

List the workspaces the user belongs to. When workspace scoping is on, posts, accounts and stats are limited to the active workspace.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/misar-ai-misarpost-mcp/post-mcp#diagnostics

## Score history

- 2026-10-23: 80
- 2026-10-22: 80
- 2026-10-21: 79
- 2026-10-20: 79
- 2026-10-19: 78
- 2026-10-18: 78
- 2026-10-17: 77

## Common questions

### What is the MisarPost MCP Server server?

MisarPost MCP Server is listed in the public MCP registry as io.github.Misar-AI/misarpost-mcp. Plan, generate, schedule and repurpose posts across every channel, and track what performs. This page covers its hosted endpoint (https://api.misar.io/post/mcp).

### Is the MisarPost MCP Server server safe to use?

MisarPost MCP Server scores 80 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the MisarPost MCP Server server expose?

MisarPost MCP Server exposes 85 tools: list_connections, list_publish_options, list_account_plugs, configure_account_plug, list_posts, and 80 more. Their descriptions and schemas cost roughly 7,450 tokens of context every time the server is loaded.

### Does the MisarPost MCP Server server require authentication?

Yes. MisarPost MCP Server asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

### Is the MisarPost MCP Server server still maintained?

MisarPost MCP Server is still listed as active in the MCP registry. We last reached this channel on 23 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://api.misar.io/post/mcp
- Authorisation metadata: https://api.misar.io/.well-known/oauth-protected-resource/post/mcp
- Repository: https://github.com/Misar-AI/misarpost-mcp
- Website: https://www.misarpost.com/
- Changelog RSS feed: https://verifymcp.io/servers/misar-ai-misarpost-mcp/post-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/misar-ai-misarpost-mcp/post-mcp.json
- HTML version of this page: https://verifymcp.io/servers/misar-ai-misarpost-mcp/post-mcp
