Skip to main content
Glama

Notipo

Open-source WordPress publishing for AI agents — MCP server, REST API, and CLI. Or sync from Notion.

Point your agent (Claude, Cursor, ChatGPT, n8n, any HTTP client) at Notipo and it publishes to your self-hosted WordPress — no plugin required. Notipo handles the full pipeline: markdown → Gutenberg conversion, image hosting in your WordPress media library, AI- or Unsplash-generated featured images, and Rank Math / Yoast / SEOPress / AIOSEO metadata applied automatically on publish.

License: AGPL-3.0 npm: notipo CLI Hosted SaaS at notipo.com MCP Server


Two ways to publish to WordPress

1. From Notion

Connect Notion, change a page status to Post to Wordpress or Publish, and Notipo handles the rest — markdown extraction, image caching to WP media library, featured image generation, SEO metadata via Rank Math / Yoast / SEOPress / AIOSEO.

2. From an AI agent, REST API, CLI, or n8n workflow

Notipo exposes a Model Context Protocol (MCP) server with 13 tools for AI agents, plus a REST API and a CLI. Claude Desktop, Cursor, Windsurf, Claude Code, ChatGPT — any MCP-compatible agent can publish posts end-to-end.

# CLI: publish a post end-to-end
npm install -g notipo
notipo posts create --title "Why Every Dev Should Have a Blog" --publish

# REST API: one call runs the full pipeline
curl -X POST https://app.notipo.com/api/posts/create \
  -H "X-API-Key: $NOTIPO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"Hello","body":"## Intro\n\nMarkdown in, WordPress out.","publish":true}'
// MCP: drop into Claude Desktop config
{
  "mcpServers": {
    "notipo": {
      "type": "http",
      "url": "https://app.notipo.com/api/mcp",
      "headers": { "x-api-key": "your-api-key" }
    }
  }
}

See notipo.com/ai-agents for the full AI-agent integration story.


Related MCP server: wp-cli-mcp

Hosted SaaS vs. self-hosting

The hosted version at notipo.com is the supported, batteries-included product — managed infrastructure, automatic upgrades, instant Notion webhook delivery, and a free tier with 5 posts/month. Pro is $19/month for unlimited posts plus AI featured images.

This repository is the same code that runs the hosted product. You can self-host it under the AGPL-3.0 license — see DEVELOPMENT.md for the local dev story and docker-compose.yml for production deployment with Traefik + Let's Encrypt.

Self-hosting is unsupported — no help beyond what's in this repo, no upgrade path. If you need any of those, the hosted product is faster, cheaper, and already running.


Tech stack

  • Backend: Fastify, TypeScript, Prisma, PostgreSQL 17

  • Job queue: pg-boss (Postgres-backed, no Redis)

  • Frontend (admin): Next.js 16 + shadcn/ui + Tailwind

  • AI: Google Gemini (featured images), Model Context Protocol (agent integration)

  • Other: Sharp (images), Stripe (billing), Resend (transactional email), Sentry (errors), PostHog (product analytics), Notion SDK, WordPress REST API

  • CLI: zero-dependency npm package, native fetch only

Monorepo (Turborepo + npm workspaces):

apps/
  api/     — Fastify backend, MCP server, job workers
  web/     — Next.js admin UI
packages/
  cli/     — `notipo` npm package (MIT-licensed thin client)
  shared/  — TypeScript types and enums
plugins/
  notipo-seo-meta-writer/  — WordPress plugin for Yoast/AIOSEO metadata bridge

Quick start (self-host)

You'll need: Docker, Docker Compose, a domain pointed at your server, a Notion integration, and a WordPress site with Application Passwords enabled (WP 5.6+).

git clone https://github.com/kfuras/notipo-app.git
cd notipo-app
cp apps/api/.env.example .env
# Edit .env — at minimum set DATABASE_URL, ENCRYPTION_KEY, API_KEY,
# DOMAIN, ACME_EMAIL, RESEND_API_KEY
docker compose up -d

The compose stack pulls multi-arch images (linux/amd64 + linux/arm64) from ghcr.io/kfuras/notipo-api and ghcr.io/kfuras/notipo-web, so it works on both x86 servers and Apple Silicon / ARM hardware.

The compose stack starts Traefik + the API + admin UI + Postgres, with Let's Encrypt TLS on first run. See docker-compose.yml for details.

For local development without Docker:

docker compose -f docker-compose.dev.yml up   # Postgres only
npm install
npm run migrate -w @notipo/api
turbo dev                                      # API on :3000, web on :3001

See DEVELOPMENT.md for the full development guide.


Documentation


License

This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0) — see LICENSE.

In plain English:

  • ✅ You can use, modify, and self-host Notipo for any purpose, including commercial.

  • ✅ You can fork it and contribute changes back.

  • ⚠️ If you run a modified version as a hosted service, you must publish your modifications under the same license. This is the "Affero clause" — it closes the network-service loophole that plain GPL leaves open.

  • ✅ The notipo CLI package is published to npm under MIT (it's just a thin API client wrapper).

  • ✅ The notipo-seo-meta-writer WordPress plugin is published under MIT (compatible with WordPress's GPL ecosystem).

If you want to use Notipo's code in a proprietary hosted product without AGPL obligations, open an issue — commercial licensing may be available.


Contributing

PRs welcome. See CONTRIBUTING.md for guidelines and CODE_OF_CONDUCT.md for community standards.

For security disclosures, see SECURITY.md — please don't open public issues for vulnerabilities.


Available Tools

13 tools
create_postCreate PostAInspect

Create a new blog post. Creates a Notion page and triggers sync to WordPress. The body should be markdown. Set publish=true to publish immediately, or leave false to create a draft.

Inputs: title (required), body, slug, tags, +4 more. Returns: jobId, notionPageId

delete_postDelete PostA
Destructive
Inspect

Delete a post from Notipo, WordPress, and reset the Notion page status. This cannot be undone.

Inputs: postId (required). Returns: deleted

direct_publishDirect PublishAInspect

Publish a blog post directly to WordPress without Notion. Handles image uploads, Gutenberg conversion, featured image generation, and SEO metadata. Body must be markdown. Set publish=true to go live, false for draft. Use this instead of create_post when you don't need Notion.

Inputs: body (required), title (required), slug, tags, +5 more. Returns: jobId

get_jobGet Job StatusA
Read-only
Inspect

Check the status of a sync or publish job. Returns status (PENDING, RUNNING, COMPLETED, FAILED), progress steps, and any error message.

Inputs: jobId (required). Returns: id, post, type, error, +5 more

get_postGet PostA
Read-only
Inspect

Get details of a specific post by ID, including status, WordPress URL, and category.

Inputs: postId (required). Returns: id, title, wpUrl, status, +5 more

get_settingsGet SettingsA
Read-only
Inspect

Get your Notipo account configuration: which services are connected (Notion, WordPress), current plan, feature settings, and trigger statuses.

Inputs: no named parameters. Returns: plan, wpSeoPlugin, codeHighlighter, notionConnected, +1 more

list_categoriesList CategoriesA
Read-only
Inspect

List all WordPress categories synced to Notipo. Use these names when creating posts.

Inputs: no named parameters. Returns: categories

list_jobsList Recent JobsA
Read-only
Inspect

List recent sync and publish jobs. Useful for monitoring pipeline activity.

Inputs: limit, status. Returns: jobs

list_postsList PostsA
Read-only
Inspect

List all posts for your Notipo account. Returns title, status, WordPress URL, category, and timestamps.

Inputs: no named parameters. Returns: posts

list_tagsList TagsA
Read-only
Inspect

List all WordPress tags synced to Notipo. Use these names when creating posts.

Inputs: no named parameters. Returns: tags

publish_postPublish PostAInspect

Publish a draft post to WordPress (make it live).

Inputs: postId (required). Returns: jobId

sync_nowSync NowAInspect

Trigger an immediate sync from Notion. Checks for any posts with trigger statuses and queues sync jobs. Pro plan only. Has a 15-second cooldown between calls.

Inputs: no named parameters. Returns: message, triggered

update_postUpdate PostAInspect

Update an existing post's content or properties in Notion, then re-sync to WordPress. Only provided fields are updated.

Inputs: postId (required), body, slug, tags, +5 more. Returns: jobId

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4/5.0

    Scored across 13 tools

    Disambiguation4/5

    Each tool targets a distinct operation, though create_post and direct_publish have overlapping purposes (both create posts) but their descriptions clearly differentiate the workflows (via Notion vs direct). Overall, an agent can easily distinguish them.

    Naming Consistency4/5

    Most tools follow verb_noun pattern (create_post, list_posts, etc.), but 'direct_publish' uses an adjective+verb and 'sync_now' uses verb_adverb, which are minor inconsistencies. Overall, the naming is predictable.

    Tool Count5/5

    With 13 tools, the server covers the full range of operations needed for managing posts between Notion and WordPress without being excessive. Each tool serves a clear purpose.

    Completeness4/5

    The tool set provides CRUD for posts, publishing, syncing, and monitoring jobs. However, it only lists categories and tags without create/update/delete capabilities, which is a minor gap.

    Maintenance

    ActivityActive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      A comprehensive MCP server for WordPress automation that enables users to manage content, themes, and site configurations using AI-driven workflows and the WordPress REST API. It provides a wide array of tools for site planning, management, and optimization compatible with tools like Cursor and Claude.
      52 npm
      1
      ISC
    • F
      license
      Not graded
      quality
      D
      maintenance
      A small FastMCP server that lets an AI client create drafts, publish/update posts, upload media, set featured images, and manage categories/tags on a self-hosted WordPress.org site via the REST API + Application Passwords.
      -