Koskamo

Notipo MCP

An open-source MCP server and CLI that enables AI agents to publish content to self-hosted WordPress sites. It handles markdown-to-Gutenberg conversion, image hosting, featured image generation, and automatic SEO metadata application via plugins like Rank Math or Yoast.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Notipo MCP logo, by kfurasCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-06Published by kfuras
MCP endpoint (Streamable HTTP)
https://app.notipo.com/api/mcp
Vendor documentation

What its tools do

13 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

13 of 13 have a description · 13 of 13 declare behavior hints · 8 of 8 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Publish posts end-to-end from AI agents like Claude or Cursor
  • Sync Notion pages to WordPress by changing page status
  • Generate AI-powered featured images for blog posts
  • Apply SEO metadata automatically on publish

Source and maintenance

Community listingRegistry 1.2.5
Maintenance checked

Protocol and capabilities

Server
notipo 1.2.5
MCP protocol negotiated in check
2025-11-25
Tools
13 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Tools

13 advertised

list_posts — List Posts
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

list_posts input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {},
  "additionalProperties": false
}
list_posts output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "posts"
  ],
  "properties": {
    "posts": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "title",
          "status",
          "wpUrl",
          "category",
          "createdAt",
          "updatedAt"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "wpUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string",
            "description": "DRAFT | PUBLISHED | SYNCED | FAILED, etc."
          },
          "category": {
            "type": [
              "string",
              "null"
            ]
          },
          "createdAt": {
            "type": "string"
          },
          "updatedAt": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
list_posts annotations
{
  "readOnlyHint": true,
  "destructiveHint": false
}
get_post — Get Post
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

get_post input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "postId"
  ],
  "properties": {
    "postId": {
      "type": "string",
      "description": "The post ID"
    }
  },
  "additionalProperties": false
}
get_post output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id",
    "title",
    "status",
    "wpUrl",
    "category",
    "createdAt",
    "updatedAt",
    "wpPostId",
    "notionPageId"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "wpUrl": {
      "type": [
        "string",
        "null"
      ]
    },
    "status": {
      "type": "string",
      "description": "DRAFT | PUBLISHED | SYNCED | FAILED, etc."
    },
    "category": {
      "type": [
        "string",
        "null"
      ]
    },
    "wpPostId": {
      "type": [
        "number",
        "null"
      ]
    },
    "createdAt": {
      "type": "string"
    },
    "updatedAt": {
      "type": "string"
    },
    "notionPageId": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "additionalProperties": false
}
get_post annotations
{
  "readOnlyHint": true,
  "destructiveHint": false
}
create_post — Create Post
Advertised by the server during the last successful anonymous check.

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.

create_post input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "title"
  ],
  "properties": {
    "body": {
      "type": "string",
      "description": "Post content in markdown"
    },
    "slug": {
      "type": "string",
      "description": "Custom URL slug"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Tag names"
    },
    "title": {
      "type": "string",
      "description": "Post title"
    },
    "publish": {
      "type": "boolean",
      "default": false,
      "description": "Publish immediately (true) or create as draft (false)"
    },
    "category": {
      "type": "string",
      "description": "Category name"
    },
    "seoKeyword": {
      "type": "string",
      "description": "SEO focus keyword"
    },
    "seoDescription": {
      "type": "string",
      "maxLength": 160,
      "description": "Custom meta description for SEO (max 160 chars). Auto-derived from content if not set."
    }
  },
  "additionalProperties": false
}
create_post output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "jobId",
    "notionPageId"
  ],
  "properties": {
    "jobId": {
      "type": "string",
      "description": "Use get_job to poll status"
    },
    "notionPageId": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
create_post annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}
direct_publish — Direct Publish
Advertised by the server during the last successful anonymous check.

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.

direct_publish input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "title",
    "body"
  ],
  "properties": {
    "body": {
      "type": "string",
      "description": "Post content in markdown (required)"
    },
    "slug": {
      "type": "string",
      "description": "Custom URL slug"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Tag names"
    },
    "title": {
      "type": "string",
      "description": "Post title"
    },
    "publish": {
      "type": "boolean",
      "default": false,
      "description": "Publish immediately (true) or create as draft (false)"
    },
    "category": {
      "type": "string",
      "description": "Category name"
    },
    "imageTitle": {
      "type": "string",
      "description": "Featured image title/text overlay"
    },
    "seoKeyword": {
      "type": "string",
      "description": "SEO focus keyword"
    },
    "seoDescription": {
      "type": "string",
      "maxLength": 160,
      "description": "Custom meta description for SEO (max 160 chars)"
    }
  },
  "additionalProperties": false
}
direct_publish output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "jobId"
  ],
  "properties": {
    "jobId": {
      "type": "string",
      "description": "Use get_job to poll status"
    }
  },
  "additionalProperties": false
}
direct_publish annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}
update_post — Update Post
Advertised by the server during the last successful anonymous check.

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

update_post input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "postId"
  ],
  "properties": {
    "body": {
      "type": "string",
      "description": "New content in markdown (replaces entire body)"
    },
    "slug": {
      "type": "string",
      "description": "New URL slug"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "New tag names"
    },
    "title": {
      "type": "string",
      "description": "New title"
    },
    "postId": {
      "type": "string",
      "description": "The post ID to update"
    },
    "publish": {
      "type": "boolean",
      "description": "Set true to also publish after updating"
    },
    "category": {
      "type": "string",
      "description": "New category name"
    },
    "seoKeyword": {
      "type": "string",
      "description": "New SEO focus keyword"
    },
    "seoDescription": {
      "type": "string",
      "maxLength": 160,
      "description": "New meta description for SEO (max 160 chars)"
    }
  },
  "additionalProperties": false
}
update_post output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "jobId"
  ],
  "properties": {
    "jobId": {
      "type": "string",
      "description": "Use get_job to poll status"
    }
  },
  "additionalProperties": false
}
update_post annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}
publish_post — Publish Post
Advertised by the server during the last successful anonymous check.

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

publish_post input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "postId"
  ],
  "properties": {
    "postId": {
      "type": "string",
      "description": "The post ID to publish"
    }
  },
  "additionalProperties": false
}
publish_post output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "jobId"
  ],
  "properties": {
    "jobId": {
      "type": "string",
      "description": "Use get_job to poll status"
    }
  },
  "additionalProperties": false
}
publish_post annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}
delete_post — Delete Post
Advertised by the server during the last successful anonymous check.
Advertised destructive

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

delete_post input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "postId"
  ],
  "properties": {
    "postId": {
      "type": "string",
      "description": "The post ID to delete"
    }
  },
  "additionalProperties": false
}
delete_post output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "deleted"
  ],
  "properties": {
    "deleted": {
      "type": "boolean"
    }
  },
  "additionalProperties": false
}
delete_post annotations
{
  "readOnlyHint": false,
  "destructiveHint": true
}
list_categories — List Categories
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

list_categories input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {},
  "additionalProperties": false
}
list_categories output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "categories"
  ],
  "properties": {
    "categories": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "name",
          "wpCategoryId"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "wpCategoryId": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
list_categories annotations
{
  "readOnlyHint": true,
  "destructiveHint": false
}
list_tags — List Tags
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

list_tags input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {},
  "additionalProperties": false
}
list_tags output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "tags"
  ],
  "properties": {
    "tags": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "name",
          "wpTagId"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "wpTagId": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
list_tags annotations
{
  "readOnlyHint": true,
  "destructiveHint": false
}
get_job — Get Job Status
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

get_job input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "jobId"
  ],
  "properties": {
    "jobId": {
      "type": "string",
      "description": "The job ID returned from create_post, update_post, or publish_post"
    }
  },
  "additionalProperties": false
}
get_job output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id",
    "type",
    "status",
    "error",
    "createdAt",
    "completedAt",
    "startedAt",
    "post"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "post": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "id",
            "title",
            "status",
            "wpUrl"
          ],
          "properties": {
            "id": {
              "type": "string"
            },
            "title": {
              "type": "string"
            },
            "wpUrl": {
              "type": [
                "string",
                "null"
              ]
            },
            "status": {
              "type": "string"
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ]
    },
    "type": {
      "type": "string",
      "description": "SYNC_POST | PUBLISH_POST"
    },
    "error": {
      "type": [
        "string",
        "null"
      ]
    },
    "result": {
      "anyOf": [
        {},
        {
          "type": "null"
        }
      ]
    },
    "status": {
      "type": "string",
      "description": "PENDING | RUNNING | COMPLETED | FAILED"
    },
    "createdAt": {
      "type": "string"
    },
    "startedAt": {
      "type": [
        "string",
        "null"
      ]
    },
    "completedAt": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "additionalProperties": false
}
get_job annotations
{
  "readOnlyHint": true,
  "destructiveHint": false
}
list_jobs — List Recent Jobs
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

list_jobs input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "limit": {
      "type": "number",
      "default": 10,
      "maximum": 50,
      "minimum": 1,
      "description": "Number of jobs to return (default 10)"
    },
    "status": {
      "enum": [
        "PENDING",
        "RUNNING",
        "COMPLETED",
        "FAILED"
      ],
      "type": "string",
      "description": "Filter by job status"
    }
  },
  "additionalProperties": false
}
list_jobs output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "jobs"
  ],
  "properties": {
    "jobs": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "type",
          "status",
          "error",
          "createdAt",
          "completedAt"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "description": "SYNC_POST | PUBLISH_POST"
          },
          "error": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string",
            "description": "PENDING | RUNNING | COMPLETED | FAILED"
          },
          "createdAt": {
            "type": "string"
          },
          "completedAt": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
list_jobs annotations
{
  "readOnlyHint": true,
  "destructiveHint": false
}
get_settings — Get Settings
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

get_settings input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {},
  "additionalProperties": false
}
get_settings output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "notionConnected",
    "wordpressConnected",
    "plan",
    "wpSeoPlugin",
    "codeHighlighter"
  ],
  "properties": {
    "plan": {
      "type": "string",
      "description": "FREE | TRIAL | PRO"
    },
    "wpSeoPlugin": {
      "type": [
        "string",
        "null"
      ],
      "description": "RANK_MATH | YOAST | SEOPRESS | AIOSEO"
    },
    "codeHighlighter": {
      "type": [
        "string",
        "null"
      ]
    },
    "notionConnected": {
      "type": "boolean"
    },
    "wordpressConnected": {
      "type": "boolean"
    }
  },
  "additionalProperties": false
}
get_settings annotations
{
  "readOnlyHint": true,
  "destructiveHint": false
}
sync_now — Sync Now
Advertised by the server during the last successful anonymous check.

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.

sync_now input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {},
  "additionalProperties": false
}
sync_now output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "triggered",
    "message"
  ],
  "properties": {
    "message": {
      "type": "string"
    },
    "triggered": {
      "type": "boolean"
    }
  },
  "additionalProperties": false
}
sync_now annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-06: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1383 ms
95th percentile latency
1383 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1383 ms · metadata changed · 13 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http notipo-mcp https://app.notipo.com/api/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add notipo-mcp --url https://app.notipo.com/api/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable notipo-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "notipo-mcp": {
      "url": "https://app.notipo.com/api/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "notipo-mcp": {
      "type": "streamableHttp",
      "url": "https://app.notipo.com/api/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start notipo-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "notipo-mcp": {
      "type": "http",
      "url": "https://app.notipo.com/api/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http notipo-mcp https://app.notipo.com/api/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://app.notipo.com/api/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "notipo-mcp": {
      "serverUrl": "https://app.notipo.com/api/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Notipo MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.