← Back to Blog
tutorialclipublishingcontent

How to Publish Blog Posts to mcpm via CLI

Use the mcpm CLI after GitHub login to publish blog posts and tutorials directly to mcpm.dev from your terminal.

·4 min read·xapable

How to Publish Blog Posts to mcpm via CLI

You can publish blog posts and tutorials to mcpm.dev directly from your terminal. No browser needed after login. Here's the complete workflow.

Step 1: Login with GitHub

mcpm-dev login

Your browser opens. Click "Authorize" on GitHub. A CLI token is generated and stored at:

  • macOS/Linux: ~/.mcpm/auth.json
  • Windows: %USERPROFILE%\.mcpm\auth.json

Step 2: Get Your Token

The token is stored in the auth file. Extract it:

<span class="hljs-comment"># macOS/Linux</span>
<span class="hljs-built_in">cat</span> ~/.mcpm/auth.json

<span class="hljs-comment"># Windows (PowerShell)</span>
Get-Content <span class="hljs-variable">$env</span>:USERPROFILE\.mcpm\auth.json

Or read it programmatically:

<span class="hljs-comment"># Using jq</span>
TOKEN=$(<span class="hljs-built_in">cat</span> ~/.mcpm/auth.json | jq -r <span class="hljs-string">&#x27;.token&#x27;</span>)

Step 3: Write Your Post in Markdown

Create a .md file:

<span class="hljs-section"># My First mcpm Blog Post</span>

Welcome to my first post on mcpm!

<span class="hljs-section">## Why I Love MCP</span>

The Model Context Protocol makes AI agents truly useful...

Step 4: Publish via the Content API

Use curl with your token:

curl -X POST https://www.mcpm.dev/api/content   -H <span class="hljs-string">&quot;Authorization: Bearer <span class="hljs-variable">$TOKEN</span>&quot;</span>   -H <span class="hljs-string">&quot;Content-Type: application/json&quot;</span>   -d <span class="hljs-string">&#x27;{
    &quot;type&quot;: &quot;blog&quot;,
    &quot;title&quot;: &quot;My First mcpm Blog Post&quot;,
    &quot;description&quot;: &quot;A short description shown in listings&quot;,
    &quot;tags&quot;: [&quot;mcp&quot;, &quot;community&quot;, &quot;ai&quot;],
    &quot;slug&quot;: &quot;my-first-mcpm-post&quot;,
    &quot;content&quot;: &quot;# My First mcpm Blog Post

Welcome to my first post on mcpm!

## Why I Love MCP

The Model Context Protocol makes AI agents truly useful...&quot;
  }&#x27;</span>

Step 5: Verify

Check your post is live:

curl https://www.mcpm.dev/api/content/blog/my-first-mcpm-post

Or visit: https://www.mcpm.dev/blog/my-first-mcpm-post

Complete Script: Publish from a Markdown File

Save this as publish.sh:

<span class="hljs-meta">#!/bin/bash</span>
<span class="hljs-comment"># publish.sh — Publish a markdown file to mcpm</span>

TOKEN=$(<span class="hljs-built_in">cat</span> ~/.mcpm/auth.json | jq -r <span class="hljs-string">&#x27;.token&#x27;</span>)
FILE=<span class="hljs-variable">$1</span>
SLUG=<span class="hljs-variable">$2</span>
TITLE=<span class="hljs-variable">$3</span>
DESC=<span class="hljs-variable">$4</span>
TAGS=<span class="hljs-variable">$5</span>

<span class="hljs-keyword">if</span> [ -z <span class="hljs-string">&quot;<span class="hljs-variable">$FILE</span>&quot;</span> ] || [ -z <span class="hljs-string">&quot;<span class="hljs-variable">$SLUG</span>&quot;</span> ]; <span class="hljs-keyword">then</span>
  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Usage: ./publish.sh &lt;file.md&gt; &lt;slug&gt; &lt;title&gt; &lt;description&gt; &lt;tag1,tag2&gt;&quot;</span>
  <span class="hljs-built_in">exit</span> 1
<span class="hljs-keyword">fi</span>

CONTENT=$(<span class="hljs-built_in">cat</span> <span class="hljs-string">&quot;<span class="hljs-variable">$FILE</span>&quot;</span> | jq -Rs .)
TAGS_JSON=$(<span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$TAGS</span>&quot;</span> | jq -R <span class="hljs-string">&#x27;split(&quot;,&quot;)&#x27;</span>)

curl -X POST https://www.mcpm.dev/api/content   -H <span class="hljs-string">&quot;Authorization: Bearer <span class="hljs-variable">$TOKEN</span>&quot;</span>   -H <span class="hljs-string">&quot;Content-Type: application/json&quot;</span>   -d <span class="hljs-string">&quot;{
    &quot;</span><span class="hljs-built_in">type</span><span class="hljs-string">&quot;: &quot;</span>blog<span class="hljs-string">&quot;,
    &quot;</span>title<span class="hljs-string">&quot;: &quot;</span><span class="hljs-variable">$TITLE</span><span class="hljs-string">&quot;,
    &quot;</span>description<span class="hljs-string">&quot;: &quot;</span><span class="hljs-variable">$DESC</span><span class="hljs-string">&quot;,
    &quot;</span>tags<span class="hljs-string">&quot;: <span class="hljs-variable">$TAGS_JSON</span>,
    &quot;</span>slug<span class="hljs-string">&quot;: &quot;</span><span class="hljs-variable">$SLUG</span><span class="hljs-string">&quot;,
    &quot;</span>content<span class="hljs-string">&quot;: <span class="hljs-variable">$CONTENT</span>
  }&quot;</span>

<span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;&quot;</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;✅ Published: https://www.mcpm.dev/blog/<span class="hljs-variable">$SLUG</span>&quot;</span>

Usage:

<span class="hljs-built_in">chmod</span> +x publish.sh
./publish.sh my-post.md my-slug <span class="hljs-string">&quot;My Title&quot;</span> <span class="hljs-string">&quot;My description&quot;</span> <span class="hljs-string">&quot;mcp,ai,community&quot;</span>

Python Version

Save as publish.py:

<span class="hljs-comment">#!/usr/bin/env python3</span>
<span class="hljs-keyword">import</span> json, sys, requests
<span class="hljs-keyword">from</span> pathlib <span class="hljs-keyword">import</span> Path

<span class="hljs-comment"># Read token</span>
auth = json.loads(Path.home() / <span class="hljs-string">&quot;.mcpm&quot;</span> / <span class="hljs-string">&quot;auth.json&quot;</span>).read_text())
token = json.loads(auth)[<span class="hljs-string">&quot;token&quot;</span>]

<span class="hljs-comment"># Read markdown file</span>
content = Path(sys.argv[<span class="hljs-number">1</span>]).read_text()

<span class="hljs-comment"># Publish</span>
resp = requests.post(
    <span class="hljs-string">&quot;https://www.mcpm.dev/api/content&quot;</span>,
    headers={
        <span class="hljs-string">&quot;Authorization&quot;</span>: <span class="hljs-string">f&quot;Bearer <span class="hljs-subst">{token}</span>&quot;</span>,
        <span class="hljs-string">&quot;Content-Type&quot;</span>: <span class="hljs-string">&quot;application/json&quot;</span>
    },
    json={
        <span class="hljs-string">&quot;type&quot;</span>: sys.argv[<span class="hljs-number">2</span>],       <span class="hljs-comment"># blog or tutorial</span>
        <span class="hljs-string">&quot;title&quot;</span>: sys.argv[<span class="hljs-number">3</span>],
        <span class="hljs-string">&quot;description&quot;</span>: sys.argv[<span class="hljs-number">4</span>],
        <span class="hljs-string">&quot;tags&quot;</span>: sys.argv[<span class="hljs-number">5</span>].split(<span class="hljs-string">&quot;,&quot;</span>),
        <span class="hljs-string">&quot;slug&quot;</span>: sys.argv[<span class="hljs-number">6</span>],
        <span class="hljs-string">&quot;content&quot;</span>: content
    }
)

<span class="hljs-keyword">if</span> resp.ok:
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;✅ Published: https://www.mcpm.dev/<span class="hljs-subst">{sys.argv[<span class="hljs-number">2</span>]}</span>/<span class="hljs-subst">{sys.argv[<span class="hljs-number">6</span>]}</span>&quot;</span>)
<span class="hljs-keyword">else</span>:
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;❌ Failed: <span class="hljs-subst">{resp.text}</span>&quot;</span>)
    sys.exit(<span class="hljs-number">1</span>)

Usage:

python publish.py my-post.md blog <span class="hljs-string">&quot;My Title&quot;</span> <span class="hljs-string">&quot;My description&quot;</span> <span class="hljs-string">&quot;mcp,ai&quot;</span> my-slug

Available Post Types

Type URL Pattern Best For
blog /blog/{slug} News, announcements, opinions
tutorial /tutorials/{slug} Step-by-step guides, how-tos

Tips

  • Slugs must be unique — use kebab-case: my-awesome-post
  • Tags help discovery — up to 5 tags per post
  • First paragraph matters — it becomes the listing description
  • Write for AI agents too — some agents read mcpm posts as context
  • Update a post — republish with the same slug to overwrite

Troubleshooting

Problem Solution
"Not authenticated" Run mcpm-dev login again — tokens expire after 30 days
"Slug already taken" Choose a different slug or add a suffix
"Invalid JSON" Escape special characters in your content
Post not showing It may take a few seconds for the site to regenerate

Now you can publish to mcpm entirely from your terminal. Happy writing!

#MCP #Tutorial #CLI #Publishing #mcpm