A Model Context Protocol (MCP) server that integrates with the Ghost Admin API. This server enables programmatic access to Ghost CMS features including post management, page management, member management, and more.
- Post Management (create, read, update, delete, search)
- Page Management (create, read, update, delete)
- Tag Management
- Author Management
- Member Management (create, read, update, delete, search)
- Image Upload Support
- Node.js (v18 or higher recommended)
- Ghost CMS instance
- Ghost Admin API key
Install the package using npm:
npm install @mtane0412/ghost-mcp-server
-
Create a new custom integration in your Ghost Admin dashboard under Settings > Integrations.
-
Set the following environment variables:
# macOS/Linux
export GHOST_URL="https://your-ghost-blog.com"
export GHOST_ADMIN_API_KEY="your_admin_api_key"
# Windows (PowerShell)
$env:GHOST_URL="https://your-ghost-blog.com"
$env:GHOST_ADMIN_API_KEY="your_admin_api_key"
Alternatively, you can create a .env
file:
GHOST_URL=https://your-ghost-blog.com
GHOST_ADMIN_API_KEY=your_admin_api_key
After installation, start the server with:
npx @mtane0412/ghost-mcp-server
Retrieves a list of blog posts.
Input:
{
"limit": "number", // Optional: Number of posts to retrieve (1-100, default: 10)
"page": "number" // Optional: Page number (default: 1)
}
Retrieves a specific post by ID.
Input:
{
"id": "string" // Required: Post ID
}
Searches for posts.
Input:
{
"query": "string", // Required: Search query
"limit": "number" // Optional: Number of posts to retrieve (1-100, default: 10)
}
Creates a new post.
Input:
{
"title": "string", // Required: Post title
"html": "string", // Optional: HTML content
"lexical": "string", // Optional: Lexical content
"status": "string", // Optional: Post status (published/draft/scheduled)
"visibility": "string" // Optional: Visibility level (public/members/paid/tiers)
}
Updates an existing post.
Input:
{
"id": "string", // Required: Post ID
"title": "string", // Optional: Post title
"html": "string", // Optional: HTML content
"lexical": "string", // Optional: Lexical content
"status": "string" // Optional: Post status
}
Deletes a post.
Input:
{
"id": "string" // Required: Post ID
}
Retrieves a list of pages.
Input:
{
"limit": "number", // Optional: Number of pages to retrieve (1-100, default: 10)
"page": "number", // Optional: Page number (default: 1)
"order": "string", // Optional: Sort order
"formats": ["string"], // Optional: Content formats (html/mobiledoc/lexical)
"include": ["string"] // Optional: Related data to include (authors/tags)
}
Retrieves a list of members.
Input:
{
"limit": "number", // Optional: Number of members to retrieve (1-100, default: 10)
"page": "number", // Optional: Page number (default: 1)
"order": "string", // Optional: Sort order
"include": ["string"] // Optional: Related data to include (labels/newsletters)
}
Searches for members.
Input:
{
"query": "string", // Required: Search query
"limit": "number", // Optional: Number of members to retrieve (1-100, default: 10)
"include": ["string"] // Optional: Related data to include (labels/newsletters)
}
Uploads an image.
Input:
{
"file": "string", // Required: Base64 encoded image data
"purpose": "string" // Optional: Image purpose (image/profile_image/icon)
}
Since MCP servers communicate over stdio, debugging can be challenging. We recommend using the MCP Inspector, which is available as a package script:
npm run inspect
The Inspector will provide a URL to access debugging tools in your browser.
MIT License