ghost-mcp
Provides tools for interacting with Ghost CMS, enabling management of posts, pages, tags, authors, settings, and more via the Content and Admin APIs.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ghost-mcpcreate a new blog post titled 'MCP Integration Guide'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Ghost MCP Server
A comprehensive Model Context Protocol (MCP) server for Ghost CMS, providing both read-only Content API and read/write Admin API access through FastMCP.
โก Quick Start
For Claude Code:
claude mcp add ghost --scope user \
-e GHOST_URL=http://localhost:2368 \
-e GHOST_CONTENT_API_KEY=your_key_here \
-e GHOST_ADMIN_API_KEY=your_key_here \
-- uvx ghost-mcpRelated MCP server: Ghost MCP Server
๐ Getting Started
Standard Configuration
For most MCP clients, use this configuration:
{
"mcpServers": {
"ghost": {
"command": "uvx",
"args": [
"ghost-mcp"
],
"env": {
"GHOST_URL": "http://localhost:2368",
"GHOST_CONTENT_API_KEY": "your_content_api_key_here",
"GHOST_ADMIN_API_KEY": "your_admin_api_key_here"
}
}
}
}Creating API Keys
To create the required API keys for your Ghost instance:
Content API Key: In your Ghost admin panel, go to Settings โ Integrations โ Add custom integration
Admin API Key: The same custom integration will provide both Content and Admin API keys
Set the environment variables in your configuration as shown above
For local development, you can use the automated setup:
make setup # This will start Ghost, create tokens, and configure everything๐ฏ Features
Complete Ghost API Coverage: Both Content API (read-only) and Admin API (read/write)
15+ MCP Tools: Posts, pages, tags, authors, settings, and more
Modern Python Implementation: FastMCP 2.12.3 with async/await
JWT Authentication: Secure Admin API access with token caching
Robust Error Handling: 5 error categories with comprehensive logging
Configuration Management: Environment variables with precedence
Development Tools: Complete Docker setup and automation scripts
๐ ๏ธ Development
Prerequisites
Docker and Docker Compose
Python 3.10+ (with uv recommended)
Setup
# Clone the repository
git clone https://github.com/thenets/ghost-mcp.git
cd ghost-mcp
# Complete setup from scratch
make setup
# Or step by step:
make install-uv # Install uv package manager
make install # Install Python dependencies
make start-ghost # Start Ghost and database
make setup-tokens # Extract API keys and create .env
make test # Test the implementationUsage
# Run the MCP server
make run
# Development mode with auto-reload
make dev
# Check system status
make status
# View container logs
make logsProject Structure
ghost-mcp/
โโโ src/ghost_mcp/
โ โโโ server.py # FastMCP server entry point
โ โโโ client.py # Ghost API client
โ โโโ config.py # Configuration management
โ โโโ auth/ # Authentication modules
โ โโโ tools/
โ โ โโโ content/ # Content API tools
โ โ โโโ admin/ # Admin API tools
โ โโโ types/ # Type definitions
โ โโโ utils/ # Utilities
โโโ scripts/ # Setup and test scripts
โโโ contracts/ # API documentation
โโโ docker-compose.yml # Ghost + MySQL setup
โโโ Makefile # Development commands
โโโ pyproject.toml # Python project configAvailable Commands
make help # Show all commands
make setup # Complete setup from scratch
make install # Install dependencies with uv
make start-ghost # Start Ghost containers
make setup-tokens # Generate API keys
make test # Run tests
make test-connection # Test API connectivity
make run # Run MCP server
make status # Check system status
make clean # Clean up everything๐ Available MCP Tools
Content API Tools (Read-only)
get_posts- Get published posts with filtering/paginationget_post_by_id- Get single post by IDget_post_by_slug- Get single post by slugsearch_posts- Search posts by title/contentget_pages- Get published pagesget_page_by_id- Get single page by IDget_page_by_slug- Get single page by slugget_tags- Get tags with filteringget_tag_by_id- Get single tag by IDget_tag_by_slug- Get single tag by slugget_authors- Get authorsget_author_by_id- Get single author by IDget_author_by_slug- Get single author by slugget_settings- Get public settingsget_site_info- Get basic site information
Admin API Tools (Read/Write)
create_post- Create new posts with full optionsupdate_post- Update existing postsdelete_post- Delete postsget_admin_posts- Get posts including draftscreate_page- Create new pagescreate_tag- Create new tags
Utility Tools
check_ghost_connection- Test connectivity and configuration
๐ง Configuration
Configuration is managed through environment variables with precedence:
Environment variables
.envfileDefault values
Required Variables
GHOST_URL=http://localhost:2368
GHOST_CONTENT_API_KEY=your_content_api_key_here
GHOST_ADMIN_API_KEY=your_admin_api_key_hereOptional Variables
GHOST_VERSION=v5.0
GHOST_MODE=auto # auto, readonly, readwrite
GHOST_TIMEOUT=30
GHOST_MAX_RETRIES=3
GHOST_RETRY_BACKOFF_FACTOR=2.0
LOG_LEVEL=info # debug, info, warning, error
LOG_STRUCTURED=true
LOG_REQUEST_ID=true๐ณ Docker Environment
The project includes a complete Docker Compose setup:
Ghost: Latest Ghost 5.x with Alpine Linux
MySQL 8.0: Database with health checks
Development optimized: Logging, auto-restart, volume persistence
URLs
Ghost Admin: http://localhost:2368/ghost/
Ghost Site: http://localhost:2368/
Database: localhost:3306
๐ API Authentication
Content API
Uses query parameter authentication
26-character hex API key
Read-only access to published content
Admin API
Uses JWT token authentication
Format:
id:secret(24-char + 64-char hex)5-minute token expiration with automatic renewal
Full read/write access
๐ Error Handling
Comprehensive error handling with 5 categories:
Network Errors: Connection timeouts, DNS failures
Authentication Errors: Invalid keys, expired tokens
Ghost API Errors: Ghost-specific errors with codes
Validation Errors: Invalid parameters, malformed data
File Upload Errors: Media upload failures
All errors include:
Unique error ID
Category classification
Context information
Request ID for tracing
๐งช Testing
# Test Ghost API connectivity
make test-connection
# Run all tests
make test
# Test specific functionality
make test-connection๐ Logging
Structured logging with configurable levels:
Request IDs: Track requests across components
Structured format: JSON output for production
Context preservation: Error context and debugging info
Performance metrics: Request timing and retry information
๐ Retry Logic
Robust retry mechanism:
Exponential backoff: Configurable base delay and multiplier
Jitter: Prevents thundering herd problems
Max retries: Configurable retry limits
Circuit breaker: Fail fast after repeated failures
๐ Documentation
API Contracts: Complete Ghost API documentation in
contracts/Type Definitions: Full type coverage with Pydantic models
Examples: Working examples for all tools
Development Guide: Step-by-step setup and usage
๐ค Contributing
Fork the repository
Create a feature branch
Make changes with tests
Run
make testto verifySubmit a pull request
๐ License
MIT License - see LICENSE file for details
๐ Support
Issues: GitHub issues for bugs and features
Documentation: Check
contracts/for API detailsLogs: Use
make logsfor troubleshootingStatus: Use
make statusfor system health
Built with FastMCP 2.12.3 and Ghost 5.x ๐
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/thenets/ghost-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server