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-mcp
🌟 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 implementation
Usage
# Run the MCP server
make run
# Development mode with auto-reload
make dev
# Check system status
make status
# View container logs
make logs
Project 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 config
Available 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
.envfile- Default 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_here
Optional 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 verify - Submit a pull request
📄 License
MIT License - see LICENSE file for details
🆘 Support
- Issues: GitHub issues for bugs and features
- Documentation: Check
contracts/for API details - Logs: Use
make logsfor troubleshooting - Status: Use
make statusfor system health
Built with FastMCP 2.12.3 and Ghost 5.x 🚀
Metadata
Release files for ghost-mcp 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| ghost_mcp-0.2.0.tar.gz | 170.7 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ghost_mcp-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 211.2 kB
Release files / ghost_mcp-0.2.0.tar.gz
| Download URL | ghost_mcp-0.2.0.tar.gz |
|---|---|
| Size | 170.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0778fa4d3e0f11ecaf8b3db7273bc0494dbd27082c097cfeda201dd6cd5448af
|
|
BLAKE2b-256 checksum How to use checksums |
8b46522a556f2eaf55b4c81dbebcde33ae9bf43d209189cc13ababf33c6001c4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 24, 2025.
Transparency logRelease files / ghost_mcp-0.2.0-py3-none-any.whl
| Download URL | ghost_mcp-0.2.0-py3-none-any.whl |
|---|---|
| Size | 40.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cf06d37ea934ad1689773c3ac93f2ce9107b67121948e6424f7e740d3c17b71a
|
|
BLAKE2b-256 checksum How to use checksums |
ca9c904d32acacb1a317737ffff7ac440e0f76560869134cf6793709f2935856
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 24, 2025.
Transparency logSecurity for ghost-mcp 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for ghost_mcp-0.2.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 24, 2025.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.