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">'.token'</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">"Authorization: Bearer <span class="hljs-variable">$TOKEN</span>"</span> -H <span class="hljs-string">"Content-Type: application/json"</span> -d <span class="hljs-string">'{
"type": "blog",
"title": "My First mcpm Blog Post",
"description": "A short description shown in listings",
"tags": ["mcp", "community", "ai"],
"slug": "my-first-mcpm-post",
"content": "# My First mcpm Blog Post
Welcome to my first post on mcpm!
The Model Context Protocol makes AI agents truly useful..."
}'</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">'.token'</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">"<span class="hljs-variable">$FILE</span>"</span> ] || [ -z <span class="hljs-string">"<span class="hljs-variable">$SLUG</span>"</span> ]; <span class="hljs-keyword">then</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"Usage: ./publish.sh <file.md> <slug> <title> <description> <tag1,tag2>"</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">"<span class="hljs-variable">$FILE</span>"</span> | jq -Rs .)
TAGS_JSON=$(<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$TAGS</span>"</span> | jq -R <span class="hljs-string">'split(",")'</span>)
curl -X POST https://www.mcpm.dev/api/content -H <span class="hljs-string">"Authorization: Bearer <span class="hljs-variable">$TOKEN</span>"</span> -H <span class="hljs-string">"Content-Type: application/json"</span> -d <span class="hljs-string">"{
"</span><span class="hljs-built_in">type</span><span class="hljs-string">": "</span>blog<span class="hljs-string">",
"</span>title<span class="hljs-string">": "</span><span class="hljs-variable">$TITLE</span><span class="hljs-string">",
"</span>description<span class="hljs-string">": "</span><span class="hljs-variable">$DESC</span><span class="hljs-string">",
"</span>tags<span class="hljs-string">": <span class="hljs-variable">$TAGS_JSON</span>,
"</span>slug<span class="hljs-string">": "</span><span class="hljs-variable">$SLUG</span><span class="hljs-string">",
"</span>content<span class="hljs-string">": <span class="hljs-variable">$CONTENT</span>
}"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"✅ Published: https://www.mcpm.dev/blog/<span class="hljs-variable">$SLUG</span>"</span>
Usage:
<span class="hljs-built_in">chmod</span> +x publish.sh
./publish.sh my-post.md my-slug <span class="hljs-string">"My Title"</span> <span class="hljs-string">"My description"</span> <span class="hljs-string">"mcp,ai,community"</span>
Python Version
Save as publish.py:
<span class="hljs-comment">
<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">
auth = json.loads(Path.home() / <span class="hljs-string">".mcpm"</span> / <span class="hljs-string">"auth.json"</span>).read_text())
token = json.loads(auth)[<span class="hljs-string">"token"</span>]
<span class="hljs-comment">
content = Path(sys.argv[<span class="hljs-number">1</span>]).read_text()
<span class="hljs-comment">
resp = requests.post(
<span class="hljs-string">"https://www.mcpm.dev/api/content"</span>,
headers={
<span class="hljs-string">"Authorization"</span>: <span class="hljs-string">f"Bearer <span class="hljs-subst">{token}</span>"</span>,
<span class="hljs-string">"Content-Type"</span>: <span class="hljs-string">"application/json"</span>
},
json={
<span class="hljs-string">"type"</span>: sys.argv[<span class="hljs-number">2</span>], <span class="hljs-comment">
<span class="hljs-string">"title"</span>: sys.argv[<span class="hljs-number">3</span>],
<span class="hljs-string">"description"</span>: sys.argv[<span class="hljs-number">4</span>],
<span class="hljs-string">"tags"</span>: sys.argv[<span class="hljs-number">5</span>].split(<span class="hljs-string">","</span>),
<span class="hljs-string">"slug"</span>: sys.argv[<span class="hljs-number">6</span>],
<span class="hljs-string">"content"</span>: content
}
)
<span class="hljs-keyword">if</span> resp.ok:
<span class="hljs-built_in">print</span>(<span class="hljs-string">f"✅ 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>"</span>)
<span class="hljs-keyword">else</span>:
<span class="hljs-built_in">print</span>(<span class="hljs-string">f"❌ Failed: <span class="hljs-subst">{resp.text}</span>"</span>)
sys.exit(<span class="hljs-number">1</span>)
Usage:
python publish.py my-post.md blog <span class="hljs-string">"My Title"</span> <span class="hljs-string">"My description"</span> <span class="hljs-string">"mcp,ai"</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
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
Your browser opens. Click "Authorize" on GitHub. A CLI token is generated and stored at:
~/.mcpm/auth.json%USERPROFILE%\.mcpm\auth.jsonStep 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.jsonOr 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">'.token'</span>)Step 3: Write Your Post in Markdown
Create a
.mdfile:<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">"Authorization: Bearer <span class="hljs-variable">$TOKEN</span>"</span> -H <span class="hljs-string">"Content-Type: application/json"</span> -d <span class="hljs-string">'{ "type": "blog", "title": "My First mcpm Blog Post", "description": "A short description shown in listings", "tags": ["mcp", "community", "ai"], "slug": "my-first-mcpm-post", "content": "# 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..." }'</span>Step 5: Verify
Check your post is live:
Or visit:
https://www.mcpm.dev/blog/my-first-mcpm-postComplete 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">'.token'</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">"<span class="hljs-variable">$FILE</span>"</span> ] || [ -z <span class="hljs-string">"<span class="hljs-variable">$SLUG</span>"</span> ]; <span class="hljs-keyword">then</span> <span class="hljs-built_in">echo</span> <span class="hljs-string">"Usage: ./publish.sh <file.md> <slug> <title> <description> <tag1,tag2>"</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">"<span class="hljs-variable">$FILE</span>"</span> | jq -Rs .) TAGS_JSON=$(<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$TAGS</span>"</span> | jq -R <span class="hljs-string">'split(",")'</span>) curl -X POST https://www.mcpm.dev/api/content -H <span class="hljs-string">"Authorization: Bearer <span class="hljs-variable">$TOKEN</span>"</span> -H <span class="hljs-string">"Content-Type: application/json"</span> -d <span class="hljs-string">"{ "</span><span class="hljs-built_in">type</span><span class="hljs-string">": "</span>blog<span class="hljs-string">", "</span>title<span class="hljs-string">": "</span><span class="hljs-variable">$TITLE</span><span class="hljs-string">", "</span>description<span class="hljs-string">": "</span><span class="hljs-variable">$DESC</span><span class="hljs-string">", "</span>tags<span class="hljs-string">": <span class="hljs-variable">$TAGS_JSON</span>, "</span>slug<span class="hljs-string">": "</span><span class="hljs-variable">$SLUG</span><span class="hljs-string">", "</span>content<span class="hljs-string">": <span class="hljs-variable">$CONTENT</span> }"</span> <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span> <span class="hljs-built_in">echo</span> <span class="hljs-string">"✅ Published: https://www.mcpm.dev/blog/<span class="hljs-variable">$SLUG</span>"</span>Usage:
<span class="hljs-built_in">chmod</span> +x publish.sh ./publish.sh my-post.md my-slug <span class="hljs-string">"My Title"</span> <span class="hljs-string">"My description"</span> <span class="hljs-string">"mcp,ai,community"</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">".mcpm"</span> / <span class="hljs-string">"auth.json"</span>).read_text()) token = json.loads(auth)[<span class="hljs-string">"token"</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">"https://www.mcpm.dev/api/content"</span>, headers={ <span class="hljs-string">"Authorization"</span>: <span class="hljs-string">f"Bearer <span class="hljs-subst">{token}</span>"</span>, <span class="hljs-string">"Content-Type"</span>: <span class="hljs-string">"application/json"</span> }, json={ <span class="hljs-string">"type"</span>: sys.argv[<span class="hljs-number">2</span>], <span class="hljs-comment"># blog or tutorial</span> <span class="hljs-string">"title"</span>: sys.argv[<span class="hljs-number">3</span>], <span class="hljs-string">"description"</span>: sys.argv[<span class="hljs-number">4</span>], <span class="hljs-string">"tags"</span>: sys.argv[<span class="hljs-number">5</span>].split(<span class="hljs-string">","</span>), <span class="hljs-string">"slug"</span>: sys.argv[<span class="hljs-number">6</span>], <span class="hljs-string">"content"</span>: content } ) <span class="hljs-keyword">if</span> resp.ok: <span class="hljs-built_in">print</span>(<span class="hljs-string">f"✅ 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>"</span>) <span class="hljs-keyword">else</span>: <span class="hljs-built_in">print</span>(<span class="hljs-string">f"❌ Failed: <span class="hljs-subst">{resp.text}</span>"</span>) sys.exit(<span class="hljs-number">1</span>)Usage:
python publish.py my-post.md blog <span class="hljs-string">"My Title"</span> <span class="hljs-string">"My description"</span> <span class="hljs-string">"mcp,ai"</span> my-slugAvailable Post Types
blog/blog/{slug}tutorial/tutorials/{slug}Tips
my-awesome-postTroubleshooting
mcpm-dev loginagain — tokens expire after 30 daysNow you can publish to mcpm entirely from your terminal. Happy writing!
#MCP #Tutorial #CLI #Publishing #mcpm