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> |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| 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
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- 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