# MendleM/Pipepost [Health: Active]

**Category:** 🎯 Marketing  
**Repository:** https://github.com/MendleM/Pipepost  
**GitHub Stars:** 5  
**npm Downloads (last month):** 458  
**Views:** 3  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/mendlem-pipepost

## Description
Publish from your terminal. Drafts SEO-scored articles, cross-publishes to Dev.to, Ghost, Hashnode, WordPress, and Medium with auto-wired canonical URLs, generates social posts for Twitter/LinkedIn/Reddit/Bluesky/HN, fetches Unsplash cover images, and submits URLs to IndexNow — all as local stdio, no cloud relay.

## Tools
Capabilities this server exposes over MCP:

- **seo_score** — Analyze markdown content for SEO quality and return a 0-100 score with grade. Basic scoring (heading structure, word count, keyword density, readability) requires no credentials and is FREE. Full analysis (issue list, prioritized suggestions, related-keyword gaps) costs 1 credit. Returns: { score, grade, breakdown, issues?, suggestions? }. Common errors: missing 'content' (VALIDATION_ERROR), insufficient credits for full analysis (PAYMENT_REQUIRED).
- **seo_meta** — Generate SEO-optimized meta title (<60 chars), meta description (<160 chars), and Open Graph tags from article content. No external API calls; runs locally. Costs 1 credit per call. Returns: { title, description, og: { title, description, image_alt }, twitter: { card, title, description } }. Common errors: insufficient credits (PAYMENT_REQUIRED).
- **seo_schema** — Generate valid JSON-LD structured data for Schema.org Article, FAQPage, or HowTo types. Output is ready to paste into a <script type="application/ld+json"> tag. Costs 1 credit per call. Returns: { jsonld: string, type: 'Article'|'FAQPage'|'HowTo' }. Common errors: invalid type for the supplied content shape (VALIDATION_ERROR), insufficient credits (PAYMENT_REQUIRED).
- **index_now** — Submit one or more URLs to the IndexNow API for instant search-engine indexing across Bing, Yandex, Naver, and Seznam (Google does not participate in IndexNow). FREE. No platform credentials required; uses the Pipepost shared key. Returns: { submitted: number, key, accepted: string[], rejected: string[] }. Common errors: malformed URL or non-https scheme (VALIDATION_ERROR), upstream 4xx from IndexNow (PLATFORM_ERROR).
- **cover_image** — Search Unsplash for cover images. FREE. Requires Unsplash access_key via setup. Subject to Unsplash's 50 req/h demo or 5000 req/h production rate limit. Returns: { results: [{ url_full, url_regular, url_small, photographer, photographer_url, attribution_html, alt }] }. Common errors: missing Unsplash key (VALIDATION_ERROR), rate-limit exceeded (PLATFORM_ERROR).
- **publish** — Publish a markdown article to one CMS platform: devto, ghost, hashnode, wordpress, medium, or substack. Costs 1 credit per call. Requires platform credentials configured via the 'setup' tool. Supports draft|published status, tags, canonical_url, series, and cover image. Substack is published via reverse-engineered cookie auth. Returns: { url, id, platform, status }. Common errors: platform not configured (VALIDATION_ERROR), credit exhaustion (PAYMENT_REQUIRED), upstream 4xx/5xx (PLATFORM_ERROR), network timeout (NETWORK_ERROR).
- **list_posts** — List your published and draft posts on a configured platform (devto, ghost, hashnode, wordpress, medium, substack). FREE. Requires platform credentials. Returns: { posts: [{ id, title, status, url, published_at }] }. Common errors: platform not configured (VALIDATION_ERROR), upstream auth failure (PLATFORM_ERROR).
- **cross_publish** — Publish one article to multiple CMS platforms in a single call. Costs 1 credit total regardless of how many platforms (typical use: 5 platforms). The first successful platform's URL is wired as the canonical for the rest. Requires credentials for every target platform. Returns: { results: [{ platform, status: 'success'|'error', url?, error? }], canonical_url, summary: { ok, failed } }. Common errors: zero platforms configured (VALIDATION_ERROR), credit exhaustion (PAYMENT_REQUIRED). Per-platform failures are reported in results without aborting the whole call.
- **frontmatter** — Generate correctly-formatted frontmatter for SSGs and publishing platforms: hugo, jekyll, astro, nextjs, devto, hashnode, ghost. FREE. Auto-extracts description, reading_time, slug, and suggests tags from content. No external calls. Returns: { frontmatter: string, format, extracted: { slug, reading_time_min, description } }. Common errors: unknown format (VALIDATION_ERROR).
- **generate_social_posts** — Generate platform-optimized social copy from an article: twitter (thread), linkedin (long form), reddit (post + suggested subreddits), bluesky (single post within 300 graphemes). Costs 1 credit per call regardless of platform count. No platform credentials required (this generates copy; use bluesky_post / linkedin_post / x_post / mastodon_post to actually post). Returns: { posts: { twitter?, linkedin?, reddit?, bluesky? } }. Common errors: insufficient credits (PAYMENT_REQUIRED).
- **repurpose** — Transform a full blog post into platform-native content for twitter, linkedin, reddit, hackernews (title only), bluesky, newsletter (intro paragraph). Costs 1 credit per call. Output preserves URLs and respects each platform's character limits. Returns: { outputs: { twitter?: string[], linkedin?: string, reddit?: { title, body, subreddits }, hackernews?: string, bluesky?: string, newsletter?: string } }. Common errors: insufficient credits (PAYMENT_REQUIRED).
- **analytics** — Fetch post views, reactions, and comments from every configured CMS platform (devto, ghost, hashnode, wordpress) and aggregate the totals. FREE. Requires platform credentials. Medium and Substack are listed but their APIs do not expose post-level analytics. Returns: { platforms: [{ platform, posts: [{ title, url, views?, reactions?, comments?, published_at? }], note? }], summary: { total_posts, total_views, total_reactions } }. Common errors: no platforms configured (VALIDATION_ERROR), upstream auth failure surfaces per-platform in 'note'.
- **setup** — Configure and persist platform credentials to ~/.pipepost/config.json (local file, never transmitted). Supports devto, ghost, hashnode, wordpress, medium, substack, unsplash. Replaces any existing credentials for the same platform. FREE. Returns: { platform, status: 'configured', validated: boolean }. Common errors: missing required fields for the chosen platform (VALIDATION_ERROR).
- **activate** — Activate a Pipepost credit-pack license key purchased from pipepost.dev. Validates the key against the license server and adds credits to the local balance. FREE. Returns: { activated: true, plan: 'starter'|'pro'|'power', credits_added, total_credits }. Common errors: invalid or already-redeemed key (VALIDATION_ERROR), license server unreachable (NETWORK_ERROR).
- **status** — Show the current Pipepost configuration: configured platforms, credit balance, monthly free-credit reset date, and active license plan. FREE. No arguments. Returns: { version, credits: { remaining, free_remaining, next_reset }, platforms: string[], plan }. No errors.
- **save_draft** — Save markdown content as a local draft in ~/.pipepost/drafts/ (machine-local, never transmitted). FREE. Drafts can target one or more platforms for later publishing via 'publish' or 'cross_publish'. Returns: { id, title, created_at, platforms?: string[] }. Common errors: missing 'content' (VALIDATION_ERROR), filesystem write failure (PLATFORM_ERROR).
- **list_drafts** — List every saved local draft with id, title, created_at, target platforms, and short preview. FREE. Reads from ~/.pipepost/drafts/. Returns: { drafts: [{ id, title, created_at, platforms?: string[], preview }] }. No errors.
- **get_draft** — Retrieve the full content of a saved draft by id. FREE. Returns: { id, title, content, created_at, platforms?: string[] }. Common errors: draft id not found (VALIDATION_ERROR).
- **delete_draft** — Permanently delete a saved draft by id. FREE. Operation is irreversible. Returns: { deleted: true, id }. Common errors: draft id not found (VALIDATION_ERROR).
- **content_audit** — Audit a markdown article for pre-publish quality issues: heading hierarchy, paragraph length, sentence complexity, passive voice, missing alt text, broken header order. Basic audit (counts, summary) is FREE. Full audit (per-issue line numbers, severity, fix suggestions) costs 1 credit. Returns: { score, word_count, reading_time_min, issues: [{ severity, line?, message, fix? }] }. Common errors: insufficient credits for full audit (PAYMENT_REQUIRED).
- **check_links** — Validate every URL in a markdown document by issuing HEAD (then GET fallback) requests. FREE. Concurrency-limited to 10 in-flight requests; per-URL timeout 8s. Reports broken (4xx/5xx), redirected (3xx), and timed-out links. Returns: { total, ok, broken: [{ url, status }], redirects: [{ url, to }], timeouts: string[] }. Common errors: malformed markdown produces zero results without throwing.
- **bluesky_post** — Post directly to Bluesky as a single post or a reply-chained thread. FREE. Requires social.bluesky.handle and social.bluesky.app_password configured via setup (app password from bsky.app/settings/app-passwords). 300 grapheme limit per post; bare URLs are auto-linkified into facets. Returns: { uri, cid, posts?: [{ uri, cid }] }. Common errors: missing credentials (VALIDATION_ERROR), grapheme overflow (VALIDATION_ERROR), Bluesky API 4xx (PLATFORM_ERROR).
- **mastodon_post** — Post directly to any Mastodon instance as a single status or a threaded series. FREE. Requires social.mastodon.instance_url and social.mastodon.access_token (scope: write:statuses) via setup. Per-instance character limit usually 500. Returns: { id, url, posts?: [{ id, url }] }. Common errors: missing credentials (VALIDATION_ERROR), instance API 4xx (PLATFORM_ERROR).
- **linkedin_post** — Post directly to LinkedIn as a single feed post (max 3000 chars). FREE. Requires social.linkedin.access_token (w_member_social scope). Person URN is auto-resolved from /v2/userinfo on first use and cached. LinkedIn has no public threading API, so only single posts are supported. Returns: { urn, url }. Common errors: missing or expired access_token (VALIDATION_ERROR), LinkedIn 401 (PLATFORM_ERROR), 3000-char overflow (VALIDATION_ERROR).
- **x_post** — Post directly to X (Twitter) as a single tweet (max 280 graphemes) or a reply-chained thread via X v2 /tweets. OAuth 1.0a HMAC-SHA1 signing built in. FREE in this server, but X's free API tier caps writes at 17 tweets per 24h. Requires social.x.api_key, api_secret, access_token, access_token_secret via setup. Returns: { id, url, tweets?: [{ id, url }] }. Common errors: missing credentials (VALIDATION_ERROR), 280-grapheme overflow (VALIDATION_ERROR), 429 rate-limit (PLATFORM_ERROR).
- **bluesky_mentions** — List notifications addressed to the configured Bluesky account: mentions and replies by default, optionally include reposts/likes/follows. FREE. Requires social.bluesky.handle and app_password. Returns: { notifications: [{ uri, cid, reason, author, record, indexed_at, is_read }] }. Common errors: missing credentials (VALIDATION_ERROR), AppView temporarily unavailable (PLATFORM_ERROR; the client falls back to bsky.social).
- **bluesky_search** — Search public Bluesky posts by keyword, author, mentions, tag, or language via app.bsky.feed.searchPosts. FREE. Now requires Bluesky auth (handle + app password) because the AppView gates this endpoint. Returns: { posts: [{ uri, cid, author, text, created_at, like_count, repost_count }], cursor? }. Common errors: missing credentials (VALIDATION_ERROR), AppView 5xx (PLATFORM_ERROR).
- **bluesky_thread** — Fetch the full conversation around a Bluesky post: parent posts above, reply tree below. Use this before bluesky_reply to understand the conversation. FREE. No credentials required for public threads. Returns: { thread: { post, parent?, replies?: thread[] } }. Common errors: post URI not found (VALIDATION_ERROR), AppView 5xx (PLATFORM_ERROR).
- **bluesky_reply** — Reply to a Bluesky post as a single reply or a chained thread. The root and parent strong-references required by the AT Protocol are computed automatically from the parent_uri. FREE. Requires social.bluesky.handle + app_password. 300 grapheme limit per post. Returns: { uri, cid, posts?: [{ uri, cid }] }. Common errors: missing credentials (VALIDATION_ERROR), parent post not found (VALIDATION_ERROR), grapheme overflow (VALIDATION_ERROR).

## Claude Desktop Quick Installation
Install path detected from listing signals. Uses `npx` (confidence: high):

```json
"mcpServers": {
  "pipepost": {
    "command": "npx",
    "args": ["-y","pipepost-mcp"]
  }
}
```

## Documentation

## What MendleM/Pipepost MCP server does

MendleM/Pipepost MCP server turns an MCP-compatible coding workflow into a content publishing pipeline. It accepts markdown and exposes tools for content quality checks, SEO preparation, frontmatter generation, draft storage, CMS publishing, social distribution, and analytics.

Content preparation includes heading and readability audits, link checking, SEO scoring, metadata generation, Schema.org JSON-LD, and frontmatter for Hugo, Jekyll, Astro, Next.js, Dev.to, Hashnode, and Ghost. It can also create platform-specific social copy or repurpose a full article into posts for Twitter/X, LinkedIn, Reddit, Bluesky, Hacker News, and newsletters.

Publishing targets include Dev.to, Ghost, Hashnode, WordPress, Medium, and Substack. Cross-publishing sends one article to several configured platforms and uses the first successful platform URL as the canonical URL for the others. Separate tools handle direct posting to Bluesky, Mastodon, LinkedIn, and X, along with Bluesky search, mentions, threads, and replies.

## How it works

The server runs as a local stdio process. A client invokes its MCP tools, while credentials and local data remain on the machine. Platform credentials are stored in `~/.pipepost/config.json`; drafts are stored under `~/.pipepost/drafts/`. The setup tool validates and replaces credentials for a selected CMS, social network, or Unsplash.

Local operations such as basic SEO scoring, basic content audits, link checks, frontmatter generation, draft management, and IndexNow submission are free. Full SEO analysis and full audits, metadata and schema generation, social generation, repurposing, publishing, and cross-publishing may consume credits. The status tool reports remaining credits, the free-credit reset date, configured platforms, and the active plan. Credit-pack keys can be activated through the activate tool.

## Setup and configuration

The README provides this MCP configuration for Claude Code:

```json
{
  "mcpServers": {
    "pipepost": {
      "command": "npx",
      "args": ["-y", "pipepost-mcp"]
    }
  }
}
```

The documented initialization command is `npx pipepost-mcp init`. After installation, use the setup tool to add credentials for each CMS or social service. Unsplash requires an access key. Bluesky requires a handle and app password; Mastodon requires an instance URL and write-statuses token; LinkedIn requires an access token with `w_member_social`; and X requires four OAuth 1.0a values. CMS requirements vary by platform.

## Tools and capabilities

MendleM/Pipepost MCP server includes tools for:

- SEO scoring, metadata, structured data, content audits, and link validation.
- Saving, listing, retrieving, and deleting local markdown drafts.
- Publishing one article or cross-publishing it with canonical URL wiring.
- Listing CMS posts and aggregating supported analytics.
- Finding Unsplash cover images and submitting HTTPS URLs through IndexNow.
- Generating or repurposing social content, then posting to supported networks.
- Reading Bluesky notifications, searching posts, fetching conversation trees, and replying.

Publishing and social tools return platform-specific errors for missing credentials, invalid input, credit exhaustion, rate limits, authentication failures, or upstream failures. Cross-publishing reports individual platform failures without necessarily stopping the other targets.

## Limitations and notes

MendleM/Pipepost MCP server does not provide Google indexing through IndexNow; Google does not participate in that protocol. Unsplash requests are subject to its rate limits. Bluesky posts and replies are limited to 300 graphemes, LinkedIn posts to 3,000 characters, and X posts to 280 graphemes. X's free API tier limits writes to 17 tweets per 24 hours.

Analytics covers Dev.to, Ghost, Hashnode, and WordPress. Medium and Substack do not expose post-level analytics through their APIs. Substack publishing uses reverse-engineered cookie authentication. Local drafts and configuration are machine-local, and the provided material states that credentials are not transmitted through a cloud relay.

_Full upstream README: https://allmcps.com/mcp/mendlem-pipepost/readme_

