Ghost Styling MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GHOST_ADMIN_URL | Yes | The URL of your Ghost admin (e.g., https://yourblog.example.com) | |
| GHOST_API_VERSION | No | Ghost API version (default v6.0) | v6.0 |
| GHOST_STAFF_ACCESS_TOKEN | Yes | Your staff access token in the format <id>:<secret> |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| extract_brandA | Distil a live site's brand into clean tokens to theme against. Step one of theming a customer's blog: point this at their public product or marketing site and it returns the brand to match, so you design against real colours and fonts instead of guessing or hand-reading a stylesheet. Fetches the page and its CSS (public http(s) only; private/localhost hosts refused). It also reads the site's menus, so you can offer to reuse them on the blog
(write them with |
| get_theme_structureA | Inspect a live Ghost page and return its markup and CSS. Fetches the public, rendered page at |
| check_contrastA | Check the WCAG contrast ratio between two colours before shipping a theme. Guards against unreadable text-on-accent: pass two colours -- as hex
( |
| create_themeA | Generate a complete, valid, previewable Ghost theme on disk. Writes a ready-to-use theme (layout, home/post/page templates, page
handling, the Koenig CSS classes Ghost requires, and Width convention: the base stylesheet keeps the structural chrome classes
( Optionally override the home/post/page templates, and the For content templates (index/post/page), layout inheritance is handled for
you: the After generating, call |
| preview_themeA | Render a Ghost theme locally and serve it for preview in a browser. Builds a static render of the theme's home, post, and page templates using sample content, then serves it on localhost. Open the returned URL in a browser to check layout and styling before activating the theme on the live site. The render is a style-focused mockup: structure and CSS are faithful, while content is sampled and some dynamic helpers are stubbed. Only one preview runs at a time: each call stops the previous server and replaces it, so older preview URLs go dead. Always hand the user the URL from the most recent call. |
| upload_themeA | Package a theme directory and upload it to Ghost WITHOUT activating it. The live site keeps its current theme; the uploaded theme is installed but inactive, so it can be reviewed and activated manually. Ghost validates the theme on upload; any errors or warnings are returned. |
| list_themesA | List the themes installed on the blog and which one is active. |
| download_themeA | Download an installed theme's source as a ZIP to a local temp file. Useful for grabbing a theme's assets, branding, or |
| restyle_themeA | Restyle an installed theme by editing its stylesheet, then re-upload it. Iterate a theme already on the blog without regenerating it: this downloads
the named theme, rewrites its |
| activate_themeA | Activate an installed theme, making it the LIVE theme. Changes the site. This is the one theme tool that alters what visitors see: it switches the blog's active theme. Call it ONLY on the user's explicit instruction to activate a specific theme -- never as an automatic follow-on to generating, uploading, or restyling one. Upload installs inactive on purpose so a theme can be reviewed first; activation is the deliberate, separate go-live step. |
| get_site_settingsA | Read the blog's brand and SEO settings. Returns the site identity (title, description), branding (accent colour, logo, icon, cover), and SEO/social metadata (meta title/description and the Open Graph and Twitter card fields). Use it to review the current state before updating, or to keep the blog aligned with the main site. |
| update_site_metadataA | Update the blog's identity and SEO/social metadata. Sets the site title/description, the search-result metadata
(meta_title/meta_description), and the Open Graph and Twitter card fields
used when posts are shared. Only the arguments you provide are changed; omit
the rest. Good Returns the fields that were updated, with their new values. |
| update_brandingA | Update the blog's brand accent colour.
Returns the fields that were updated. |
| update_navigationA | Set the blog's navigation menus (primary header and secondary/footer). Each menu is a list of Membership actions (login/sign-up/account) belong in the theme as Ghost Portal
buttons ( |
| list_postsC | List blog posts. |
| get_postA | Read a single post by id or slug, including its rendered HTML. Provide either |
| create_postA | Create a blog post from HTML content. Defaults to a draft; pass Returns the created post's summary, including a |
| update_postA | Update an existing post by id; only the fields you pass are changed. Pass |
| publish_postA | Publish a post AND email it to a newsletter's subscribers. SENDS REAL EMAIL. This is outward-facing and irreversible: it emails the post to members the
moment it publishes (or at |
| delete_postB | Delete a post by id. This cannot be undone. |
| list_pagesA | List pages (standalone content outside the post feed). |
| get_pageA | Read a single page by id or slug, including its rendered HTML. Provide either |
| create_pageA | Create a page from HTML content. Defaults to a draft; pass Returns the created page's summary, including a |
| update_pageA | Update an existing page by id; only the fields you pass are changed. Pass |
| delete_pageA | Delete a page by id. This cannot be undone. |
| upload_imageA | Upload a local image file to the blog and return its hosted URL. Use the returned URL for a post's |
| upload_image_from_urlA | Fetch a public image by URL and re-upload it to the blog, returning the URL. The source is fetched under the same SSRF guard as the vision tools (public http(s) only; private/localhost hosts and oversized responses are refused), then uploaded to Ghost so the image is served from the blog itself. |
| list_tagsB | List tags, with how many posts use each. |
| get_tagA | Read a single tag by id or slug. Provide either |
| create_tagA | Create a tag. Only |
| update_tagB | Update a tag by id; only the fields you pass are changed. |
| delete_tagA | Delete a tag by id. Posts keep existing; they just lose the tag. |
| list_membersA | List members (newest first), with their labels and subscribed newsletters. |
| get_memberC | Read a single member by id, including labels, newsletters, and tiers. |
| create_memberA | Create a member from an email address. Only |
| update_memberA | Update a member by id; only the fields you pass are changed.
|
| list_newslettersC | List newsletters (active and archived). |
| get_newsletterB | Read a single newsletter by id. |
| create_newsletterA | Create a newsletter. Only |
| update_newsletterA | Update a newsletter by id; only the fields you pass are changed. Set |
| list_tiersB | List tiers (paid plans), including their prices and benefits. |
| get_tierB | Read a single tier by id, including its prices and benefits. |
| create_tierB | Create a tier (paid plan). Only |
| update_tierA | Update a tier by id; only the fields you pass are changed. There is no delete for tiers; retire one with |
| list_offersB | List discount offers, each with its linked tier. |
| get_offerA | Read a single offer by id, including its linked tier. |
| create_offerB | Create a discount offer against a tier. |
| update_offerA | Update an offer by id. Ghost only allows editing |
| list_labelsB | List member labels. |
| get_labelA | Read a single label by id or slug. Provide either |
| create_labelA | Create a member label. Only |
| update_labelB | Update a label by id; only the fields you pass are changed. |
| delete_labelA | Delete a label by id. Members keep existing; they just lose the label. |
| list_usersA | List users (authors/staff). Read-only: the Admin API forbids integrations from writing users. |
| get_userB | Read a single user by id or slug. Provide either |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| theme-a-site | Guided flow to design and build a custom Ghost theme matched to a brand. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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/stemcreations/ghost-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server