← 返回
未分类 Key 中文

notipo

Publish blog posts from AI agents to WordPress via Notion. One API call handles page creation, markdown conversion, image uploads, featured image generation,...
通过 Notion 将 AI 代理的博客文章发布到 WordPress。一次 API 调用即可完成页面创建、Markdown 转换、图片上传、封面图生成,...
kfuras kfuras 来源
未分类 clawhub v1.0.3 2 版本 100000 Key: 需要
★ 0
Stars
📥 588
下载
💾 3
安装
2
版本
#ai#automation#blog#latest#notion#publishing#seo#wordpress

概述

Install Notipo CLI if it doesn't exist

npm install -g notipo
  • npm release: https://www.npmjs.com/package/notipo
  • notipo docs: https://notipo.com/docs/api/introduction
  • notipo cli docs: https://notipo.com/docs/api/cli

Setup

Sign up at notipo.com, connect your Notion database and WordPress site through the dashboard, then grab your API key from Settings → Account.

Set the environment variables:

export NOTIPO_URL="https://notipo.com"
export NOTIPO_API_KEY="ntp_your-api-key"

Core Workflow

  1. Generate — AI agent creates title, body (markdown), category, tags, SEO keyword
  2. Fetch context — get categories and tags from Notipo to pick valid values
  3. Publishnotipo posts create with all fields
  4. Monitornotipo jobs to check completion status

Essential Commands

Check connection status

notipo status

Fetch categories and tags

# Get available categories (for picking a valid category)
curl -s $NOTIPO_URL/api/categories \
  -H "X-API-Key: $NOTIPO_API_KEY" | jq '.data[].name'

# Get available tags
curl -s $NOTIPO_URL/api/tags \
  -H "X-API-Key: $NOTIPO_API_KEY" | jq '.data[].name'

Create a post (draft)

notipo posts create \
  --title "Your Post Title" \
  --body "## Introduction\n\nYour markdown content here.\n\n## Main Section\n\nMore content." \
  --category "Tutorials" \
  --tags "automation,ai" \
  --seo-keyword "your focus keyword" \
  --image-title "Featured Image Title" \
  --slug "custom-url-slug"

Create and publish immediately

notipo posts create \
  --title "Your Post Title" \
  --body "Markdown content here." \
  --category "Guides" \
  --seo-keyword "focus keyword" \
  --publish

Create, publish, and wait for completion

notipo posts create \
  --title "Your Post Title" \
  --body "Markdown content here." \
  --category "Guides" \
  --publish --wait

The --wait flag polls until the job completes and returns the result with the WordPress URL.

Create with inline Unsplash images (Pro plan, curl only)

curl -X POST $NOTIPO_URL/api/posts/create \
  -H "X-API-Key: $NOTIPO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Your Post Title",
    "body": "## Introduction\n\nContent here.\n\n## Getting Started\n\nMore content.",
    "category": "Tutorials",
    "seoKeyword": "focus keyword",
    "images": [
      { "query": "developer workspace laptop", "afterHeading": "## Introduction" },
      { "query": "getting started tutorial", "afterHeading": "## Getting Started" }
    ],
    "publish": true
  }'

Update a post (fix content, change metadata, re-sync to WordPress)

notipo posts update POST_ID \
  --body "## Introduction\n\nUpdated content without the H1." \
  --seo-keyword "updated focus keyword" \
  --wait

Updates the Notion page content and/or properties, then triggers a re-sync to WordPress. Only the provided fields are updated — omitted fields stay unchanged. This is the correct way to fix post content after creation.

Check job status

notipo jobs

List posts

notipo posts

Trigger a sync (pick up Notion changes)

notipo sync

Delete a post

notipo posts delete POST_ID

Common Patterns

AI-generated blog post with full metadata

# 1. Fetch categories to pick a valid one
curl -s $NOTIPO_URL/api/categories -H "X-API-Key: $NOTIPO_API_KEY" | jq '.data[].name'

# 2. Create the post with all fields and wait for completion
notipo posts create \
  --title "10 Docker Best Practices for Production" \
  --body "## Introduction\n\nDocker containers are the standard...\n\n## Use Multi-Stage Builds\n\nReduce image size by separating build and runtime...\n\n## Pin Base Image Versions\n\nAvoid surprises by pinning specific tags..." \
  --category "DevOps" \
  --tags "docker,containers,production" \
  --seo-keyword "docker best practices production" \
  --image-title "Docker Best Practices" \
  --slug "docker-best-practices-production" \
  --publish --wait

Batch content pipeline

# Generate and publish multiple posts in sequence
for topic in "React hooks" "TypeScript generics" "Node.js streams"; do
  notipo posts create \
    --title "A Guide to $topic" \
    --body "## Overview\n\nGenerated content about $topic." \
    --category "Tutorials" \
    --seo-keyword "$(echo $topic | tr '[:upper:]' '[:lower:]')" \
    --wait
done

Full pipeline with inline images (curl)

curl -X POST $NOTIPO_URL/api/posts/create \
  -H "X-API-Key: $NOTIPO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "10 Docker Best Practices for Production",
    "body": "## Introduction\n\nDocker containers are the standard...\n\n## Use Multi-Stage Builds\n\nReduce image size...",
    "category": "DevOps",
    "tags": ["docker", "containers", "production"],
    "seoKeyword": "docker best practices production",
    "imageTitle": "Docker Best Practices",
    "slug": "docker-best-practices-production",
    "images": [
      { "query": "docker containers server", "afterHeading": "## Introduction" }
    ],
    "publish": true
  }'

CLI Reference

CommandDescription
----------------------
notipo statusShow Notion and WordPress connection status
notipo syncTrigger an immediate Notion poll
notipo postsList all posts
notipo posts createCreate a post in Notion and sync to WordPress
notipo posts update Update post content/properties and re-sync to WordPress
notipo posts delete Delete a post (cleans up WordPress + Notion)
notipo jobsList recent sync and publish jobs
notipo helpShow usage and examples

posts create flags

FlagDescription
-------------------
--title </code></td><td>Post title (required)</td></tr><tr><td><code>--body <markdown></code></td><td>Markdown content</td></tr><tr><td><code>--category <name></code></td><td>Category name (must exist in WordPress)</td></tr><tr><td><code>--tags <a,b,c></code></td><td>Comma-separated tag names</td></tr><tr><td><code>--seo-keyword <kw></code></td><td>Focus keyword for Rank Math / SEOPress</td></tr><tr><td><code>--image-title <text></code></td><td>Text overlay on featured image (Pro)</td></tr><tr><td><code>--slug <slug></code></td><td>Custom URL slug</td></tr><tr><td><code>--publish</code></td><td>Publish immediately (default: draft)</td></tr><tr><td><code>--wait</code></td><td>Wait for job completion and return result</td></tr></tbody></table><h3>posts update flags</h3><table><thead><tr><th>Flag</th><th>Description</th></tr></thead><tbody><tr><td>------</td><td>-------------</td></tr><tr><td><code>--title <title></code></td><td>New post title</td></tr><tr><td><code>--body <markdown></code></td><td>New markdown content (replaces all existing content)</td></tr><tr><td><code>--category <name></code></td><td>New category name</td></tr><tr><td><code>--tags <a,b,c></code></td><td>New comma-separated tag names</td></tr><tr><td><code>--seo-keyword <kw></code></td><td>New focus keyword for Rank Math / SEOPress</td></tr><tr><td><code>--slug <slug></code></td><td>New URL slug</td></tr><tr><td><code>--publish</code></td><td>Publish after syncing (default: keep current status)</td></tr><tr><td><code>--wait</code></td><td>Wait for job completion and return result</td></tr></tbody></table><h2>API Request Body Reference</h2><h3>PATCH /api/posts/:id (update)</h3><table><thead><tr><th>Field</th><th>Type</th><th>Required</th><th>Description</th></tr></thead><tbody><tr><td>-------</td><td>------</td><td>----------</td><td>-------------</td></tr><tr><td><strong>title</strong></td><td>string</td><td>No</td><td>New post title</td></tr><tr><td><strong>body</strong></td><td>string</td><td>No</td><td>New markdown content (replaces all existing content on the Notion page)</td></tr><tr><td><strong>category</strong></td><td>string</td><td>No</td><td>New category name</td></tr><tr><td><strong>tags</strong></td><td>string[]</td><td>No</td><td>New tag names</td></tr><tr><td><strong>seoKeyword</strong></td><td>string</td><td>No</td><td>New focus keyword</td></tr><tr><td><strong>slug</strong></td><td>string</td><td>No</td><td>New URL slug</td></tr><tr><td><strong>publish</strong></td><td>boolean</td><td>No</td><td>Publish after syncing</td></tr></tbody></table><p>Returns <code>{ jobId, postId, message }</code>. The update writes to Notion first, then triggers a sync job to push changes to WordPress.</p><h3>POST /api/posts/create</h3><p>For curl/HTTP usage, <code>POST /api/posts/create</code> accepts:</p><table><thead><tr><th>Field</th><th>Type</th><th>Required</th><th>Description</th></tr></thead><tbody><tr><td>-------</td><td>------</td><td>----------</td><td>-------------</td></tr><tr><td><strong>title</strong></td><td>string</td><td>Yes</td><td>Post title</td></tr><tr><td><strong>body</strong></td><td>string</td><td>No</td><td>Markdown content with headings and paragraphs</td></tr><tr><td><strong>category</strong></td><td>string</td><td>No</td><td>Category name (must exist in WordPress)</td></tr><tr><td><strong>tags</strong></td><td>string[]</td><td>No</td><td>Array of tag names</td></tr><tr><td><strong>seoKeyword</strong></td><td>string</td><td>No</td><td>Focus keyword for Rank Math / SEOPress</td></tr><tr><td><strong>imageTitle</strong></td><td>string</td><td>No</td><td>Text overlay on featured image (Pro)</td></tr><tr><td><strong>slug</strong></td><td>string</td><td>No</td><td>Custom URL slug</td></tr><tr><td><strong>publish</strong></td><td>boolean</td><td>No</td><td>Publish immediately (default: false)</td></tr><tr><td><strong>images</strong></td><td>object[]</td><td>No</td><td>Inline Unsplash images (Pro). Each: <code>{query, afterHeading}</code></td></tr></tbody></table><h2>What Notipo Handles</h2><ul><li>Notion page creation from markdown (no Notion credentials needed)</li><li>Markdown → Notion blocks → WordPress Gutenberg block conversion</li><li>Image download from Notion and upload to WordPress media library</li><li>Featured image generation (1200×628 with category background + title overlay)</li><li>Inline Unsplash image insertion by search query (Pro plan)</li><li>SEO metadata — Rank Math, Yoast, SEOPress, AIOSEO</li><li>Post status management in Notion</li><li>Failure notifications via Slack/Discord webhook</li></ul><h2>Common Gotchas</h2><ol><li><strong>Use <code>posts update</code> to fix content</strong> — don't delete and recreate. <code>notipo posts update <id> --body "..."</code> updates the Notion page and re-syncs to WordPress in one call.</li><li><strong>Include all fields for best results</strong> — only <code>title</code> is technically required, but AI agents should always generate body, category, tags, seoKeyword, imageTitle, and slug for a complete post.</li><li><strong>Category must exist</strong> — the category name must match an existing WordPress category. Fetch valid options first.</li><li><strong><code>--publish</code> runs two jobs</strong> — first SYNC_POST (creates draft), then PUBLISH_POST (makes it live). Use <code>--wait</code> to block until both complete.</li><li><strong>Images require Pro plan</strong> — the <code>images</code> array and featured image generation are Pro features. On Free plan, these fields are silently ignored.</li><li><strong>Fire and forget</strong> — the API returns a <code>jobId</code> immediately. Processing happens in the background. Use <code>notipo jobs</code> to check status.</li><li><strong>Markdown body format</strong> — use <code>## Heading</code> for h2, <code>### Heading</code> for h3. Paragraphs are separated by <code>\n\n</code>. Images can be included as <code>!<a href="url" target="_blank" rel="noopener">alt</a></code>.</li><li><strong>Rate limits</strong> — <code>notipo sync</code> has a 15-second cooldown. <code>notipo posts create</code> has no rate limit.</li><li><strong>API key format</strong> — keys start with <code>ntp_</code>. Get yours from Settings → Account in the dashboard.</li><li><strong>Slug defaults</strong> — if not set, the slug is derived from the SEO keyword. If no SEO keyword, WordPress generates it from the title.</li></ol></div> </div> </div> <div id="tab-versions" class="detail-content"> <div class="detail-section"> <h2>版本历史</h2> <p style="margin-bottom:12px;font-size:14px;color:#94a3b8;">共 2 个版本</p> <ul class="version-list"> <li> <div> <span class="version-tag">v1.0.3</span> <span style="font-size:11px;color:#5b6abf;margin-left:8px;background:#eef0ff;padding:1px 8px;border-radius:10px;">当前</span> </div> <div style="font-size:12px;color:#94a3b8;"> 2026-05-03 04:54 安全 安全 </div> </li> <li> <div> <span class="version-tag">v1.0.2</span> </div> <div style="font-size:12px;color:#94a3b8;"> 2026-03-30 13:21 </div> </li> </ul> </div> </div> <div id="tab-security" class="detail-content"> <div class="detail-section"> <h2>安全检测</h2> <div class="sec-grid"> <div class="sec-card"> <h4>腾讯云安全 (Keen)</h4> <div class="sec-status sec-safe"> 安全,无风险 </div> <a href="https://tix.qq.com/search/skill?keyword=c94e88a10d15def9e41da1c8b90fa94e" target="_blank">查看报告</a> </div> <div class="sec-card"> <h4>腾讯云安全 (Sanbu)</h4> <div class="sec-status sec-safe"> 安全,无风险 </div> <a href="https://static.cloudsec.tencent.com/html-report-v2/2026/05/25/415747_82d9ad3f252e8204c3d9868fefeadfcc.html?q-sign-algorithm=sha1&q-ak=AKID8JMG1bzBC1dz96qNhssfFftujT1NCoFi&q-sign-time=1781827375%3B1813363375&q-key-time=1781827375%3B1813363375&q-header-list=host&q-url-param-list=&q-signature=67eff27a32c1ae5f5640ba176cb4df47ec2e19d4" target="_blank">查看报告</a> </div> </div> </div> </div> <!-- Recommended Skills --> <div style="margin-top:24px;"> <h2 style="font-size:18px;font-weight:600;margin-bottom:16px;">🔗 相关推荐</h2> <div class="rec-grid"> <div class="rec-card"> <span class="badge-cat" style="margin-bottom:8px;display:inline-block;">ai-agent</span> <h3><a href="/s/self-improving-agent">self-improving agent</a></h3> <div class="rec-owner">pskoett</div> <div class="rec-desc">捕获经验教训、错误及修正内容,以实现持续改进。适用于以下场景:(1)命令或操作意外失败;(2)用户纠正Claude(如“不,那不对……”“实际上……”);(3)用户请求的功能不存在;(4)外部API或工具出现故障;(5)Claude发现自身</div> <div class="rec-stats"> <span style="color:#f39c12;">★ 4,095</span> <span style="color:#5b6abf;">📥 822,645</span> </div> </div> <div class="rec-card"> <span class="badge-cat" style="margin-bottom:8px;display:inline-block;">ai-agent</span> <h3><a href="/s/skill-vetter">Skill Vetter</a></h3> <div class="rec-owner">spclaudehome</div> <div class="rec-desc">AI智能体技能安全预审工具。安装ClawdHub、GitHub等来源技能前,检查风险信号、权限范围及可疑模式。</div> <div class="rec-stats"> <span style="color:#f39c12;">★ 1,234</span> <span style="color:#5b6abf;">📥 269,123</span> </div> </div> <div class="rec-card"> <span class="badge-cat" style="margin-bottom:8px;display:inline-block;">ai-agent</span> <h3><a href="/s/agent-browser">Agent Browser</a></h3> <div class="rec-owner">rez0</div> <div class="rec-desc">用于 AI 代理的浏览器自动化 CLI。当用户需要与网站交互(包括浏览页面、填写表单、点击按钮、截图等)时使用。</div> <div class="rec-stats"> <span style="color:#f39c12;">★ 832</span> <span style="color:#5b6abf;">📥 301,233</span> </div> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded',function(){ document.querySelectorAll('.detail-tab').forEach(function(btn){ btn.addEventListener('click',function(e){ var tab = this.getAttribute('data-tab'); document.querySelectorAll('.detail-tab').forEach(function(b){b.classList.remove('active')}); document.querySelectorAll('.detail-content').forEach(function(c){c.classList.remove('active')}); this.classList.add('active'); var el = document.getElementById('tab-'+tab); if(el) el.classList.add('active'); }); }); }); </script> <div class="footer"> <p>Skill工具集 © 2026</p> </div></body> </html>