Ghost + Contentful MCP
# Ghost + Contentful MCP
An MCP (Model Context Protocol) server that lets AI assistants search across multiple CMS platforms — **Ghost** and **Contentful** — from a single interface.
## What it does
This server exposes five search tools over the MCP stdio transport:
| Tool | Source | Searches across |
|---|---|---|
| `search_blog_posts` | Ghost | Post title, excerpt, and body |
| `search_blog_pages` | Ghost | Page title and body |
| `search_learn_pages` | Contentful | Learn page title, meta fields, and rich-text body |
| `search_case_studies` | Contentful | Company name, overview, quote, use case, impact, and body |
| `search_events` | Contentful | Internal event pages and event cards (title, description, agenda) |
Each tool accepts a `query` string and returns matching results with contextual snippets highlighting where the match was found.
## Setup
1. Install dependencies:
```bash
yarn install
```
2. Create a `.env` file with your API credentials:
```
GHOST_CONTENT_ENDPOINT=https://your-ghost-instance.com/ghost/api/content
GHOST_API_KEY=your-ghost-content-api-key
CONTENTFUL_SPACE_ID=your-contentful-space-id
CONTENTFUL_ACCESS_TOKEN=your-contentful-access-token
```
3. Run the server:
```bash
yarn start
```
## MCP client configuration
Add the server to your MCP client config (e.g. Claude Desktop):
```json
{
"mcpServers": {
"cms-search": {
"command": "npx",
"args": ["tsx", "/absolute/path/to/mcp-cms-search/index.ts"]
}
}
}
```
TDQS
Scored across 5 tools
Each tool targets a distinct content type (learn pages, case studies, events, blog posts, blog pages), and the descriptions clearly specify the fields searched. There is no ambiguity between Contentful and Ghost entities.
All tool names follow the exact same verb_noun pattern: 'search_' followed by a specific content type. This is perfectly consistent and predictable.
The server has 5 tools, well within the ideal 3-15 range. Each tool covers a distinct searchable content type, so every tool earns its place without redundancy or bloat.
The tool surface is entirely search-focused, covering the apparent primary content types across both CMSs. Minor gaps exist, such as no ability to fetch a single content item by ID or search across all content types at once, but these are not critical for a search-oriented server.