@neuraldraft/mcp
Summary: @neuraldraft/mcp lets a coding assistant wire and manage Neural Draft CMS backends for client sites across one or more workspaces.
Manage multiple client workspaces:
list_workspaces,switch_workspace,find_workspaces.Read and update brand context: voice, audience, colors, fonts, languages, logo.
Create and manage editable content: translation keys, get/list/delete content, register/delete HTML components.
Manage pages: create, list, get, update, delete, add site pages, and SEO meta.
Manage images and galleries: list/get/register/replace/delete images; create/update/delete galleries.
Blog: generate AI blog posts, list/get/update posts.
Bookings and shop: create bookable services, get booking widget embed, list/get products.
Forms: list newsletter subscribers and contact-form submissions.
Account: check credit usage and poll async jobs.
Provides MCP resources (
brand://current, schemas, conventions) and prompts for scaffolding sites.Note:
generate_imageandgenerate_videoare registered but retired (API returns 410).
Click on "Deploy 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., "@@neuraldraft/mcp register hero image as editable component"
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.
Neural Draft MCP server (@neuraldraft/mcp)
The backend for sites built with AI: CMS, blog, bookings, forms, shop and social, one database per client. Your coding assistant wires the CMS while it builds; clients edit in a web editor or through Claude.
@neuraldraft/mcp is a Model Context Protocol server (stdio, MIT) for Neural Draft. Add it to Claude Code, Cursor, Codex or VS Code with a workspace API key, and while your assistant builds a client's site it can:
read the brand (voice, audience, colours, fonts, languages) before it writes a line;
create pages with SEO meta, and register editable content keys and components, so the client can change words and pictures in the Neural Draft editor without you;
add a page or sub-page to the hosted site in its own design, with a menu link;
set up bookable services, galleries and blog drafts, and read products, form submissions and newsletter sign-ups;
work across several client workspaces from one server (agencies).
Every client is its own Neural Draft workspace with its own Postgres database, API keys and team. A key only reaches the workspace it belongs to.

Install
You need Node 20+ and a workspace API key: in the Neural Draft admin, Settings → For developers → API keys (ndsk_live_…). Free plan included, no credit card.
Claude Code
claude mcp add neuraldraft-dev -e NEURALDRAFT_API_KEY=ndsk_live_... -- npx -y @neuraldraft/mcpAdd --scope project to write it to the project's .mcp.json, and keep the key out of git with an env reference:
{
"mcpServers": {
"neuraldraft-dev": {
"command": "npx",
"args": ["-y", "@neuraldraft/mcp"],
"env": { "NEURALDRAFT_API_KEY": "${NEURALDRAFT_API_KEY}" }
}
}
}Run /mcp to check it's connected.
Cursor
.cursor/mcp.json (project) or ~/.cursor/mcp.json (global):
{
"mcpServers": {
"neuraldraft-dev": {
"command": "npx",
"args": ["-y", "@neuraldraft/mcp"],
"env": { "NEURALDRAFT_API_KEY": "ndsk_live_..." }
}
}
}Codex
codex mcp add neuraldraft-dev --env NEURALDRAFT_API_KEY=ndsk_live_... -- npx -y @neuraldraft/mcpor ~/.codex/config.toml:
[mcp_servers.neuraldraft-dev]
command = "npx"
args = ["-y", "@neuraldraft/mcp"]
env = { NEURALDRAFT_API_KEY = "ndsk_live_..." }VS Code
.vscode/mcp.json:
{
"servers": {
"neuraldraft-dev": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@neuraldraft/mcp"],
"env": { "NEURALDRAFT_API_KEY": "ndsk_live_..." }
}
}
}Continue
~/.continue/config.yaml:
mcpServers:
- name: neuraldraft-dev
command: npx
args: ["-y", "@neuraldraft/mcp"]
env:
NEURALDRAFT_API_KEY: ndsk_live_...Related MCP server: WordPress MCP Server
Several client workspaces (agencies)
Each client has its own workspace and its own key. Put them all in one server and switch between them with list_workspaces / switch_workspace; every other tool acts on the active workspace.
{
"mcpServers": {
"neuraldraft-dev": {
"command": "npx",
"args": ["-y", "@neuraldraft/mcp"],
"env": {
"NEURALDRAFT_API_KEYS": "linden-bakery=ndsk_live_...,villa-lavanda=ndsk_live_...",
"NEURALDRAFT_WORKSPACE": "linden-bakery"
}
}
}
}NEURALDRAFT_API_KEYS also accepts a JSON object ({"linden-bakery":"ndsk_live_..."}). See Several workspaces.
Environment variables
Variable | Required | Notes |
| one of these two | One workspace key, |
| one of these two | Several workspaces: |
| no | Which of |
| no | Default |
| no | Override when one key spans several projects |
| no | Friendly name in your client's server list |
NEURAL_DRAFT_* spellings are accepted as aliases. A missing or malformed key fails at start with a message showing a working config. Never commit keys.
Remote / hosted connector
Neural Draft also runs a hosted remote MCP server, no API key and nothing to install:
https://neuraldraft.io/mcpStreamable HTTP with OAuth sign-in (Google or an emailed code). It works in Claude, ChatGPT, Codex, Claude Code, Cursor and VS Code, and it adds what this package doesn't do: deploying a build (deploy_site, rollback_site), custom domains, editing live site texts, bookings and availability, the blog, social scheduling, and finished ads and reels crafted by Batchcraft for your brand. We don't offer AI image or video creation. We craft finished static ads and reels for your brand.
# Claude Code
claude mcp add --transport http neuraldraft https://neuraldraft.io/mcp
# Codex
codex mcp add neuraldraft --url https://neuraldraft.io/mcp && codex mcp login neuraldraftClaude: Customize → Connectors → Add custom connector. ChatGPT: Settings → Apps → Add custom MCP server. Paste the URL and sign in. Setup for every app: Hosted connector.
Hosted connector |
| |
Auth | Sign-in (OAuth) | API key per workspace |
Runs | Remote, Streamable HTTP | Locally via |
Best for | Hosting and deploying the site, client edits, domains, blog, bookings, socials | Wiring a codebase: brand, content keys, components, pages, galleries |
Several clients | Tick workspaces at sign-in |
|
Developers often add both to Claude Code or Codex.
Tools
Group | Tools |
Workspaces |
|
Brand |
|
Content |
|
Pages |
|
Images and galleries |
|
Blog |
|
Bookings and shop |
|
Forms |
|
Account |
|
generate_image and generate_video are still registered for older clients but are retired: the API answers them with 410 media_generation_moved.
Resources
URI | What |
| Voice, audience, colours, fonts, languages. Read before generating UI. |
| Blog post response shape |
| Product and variant shape |
| Services, bookings, availability |
| The |
| Auth, errors, rate limits, jobs |
Prompts
Prompt | What it does |
| A full marketing site wired to Neural Draft (brand, editable keys, components) |
| A |
| Make an existing static site editable through Neural Draft |
Full reference: Tools, resources and prompts.
Try it
Read brand://current, build a hero and a services section for this site with editable keys, and register them with Neural Draft.
The assistant reads the brand, writes markup with data-translate and data-image-key, creates the keys and registers the sections, so they show up in the client's admin as editable.
Docs
MCP overview and setup
REST API and the TypeScript SDK
@neuraldraft/sdk
Local development
git clone https://github.com/vbalagovic/neuraldraft-mcp.git
cd neuraldraft-mcp
npm install
npm run lint # tsc --noEmit
npm test
npm run build # → dist/Run against a local API:
NEURALDRAFT_API_KEY=ndsk_test_xxx NEURALDRAFT_API_URL=http://localhost:8080/v1 npm run devInspect with the MCP Inspector: npx @modelcontextprotocol/inspector node dist/index.js.
The server is a thin wrapper over the Neural Draft Project API v1: every tool maps to one or a few REST calls. It never writes to stdout at runtime (stdio transport).
Contributing
Issues and PRs welcome. Keep tests passing (npm test), use the existing register* helper pattern for new tools, and update the tables above for any new surface.
License
Built by Neural Draft. Questions: info@neuraldraft.io.
Available Tools
38 toolscreate_bookable_serviceCreate a bookable serviceA
Create a service that customers can book. Two modes: • booking_type='time_slot' (default) — meeting / appointment style with fixed duration_minutes (e.g. 30, 60). • booking_type='date_range' — apartment / rental style with min_nights / max_nights. Free; embedding is via setup_booking_widget.
Inputs: name (required), slug, color, price, +17 more.
create_galleryCreate a galleryA
Create a new gallery (named, ordered collection of image URLs). Slug is auto-derived from name when omitted. If the derived slug exists, -2, -3, ... is appended. Items are optional at create time — start empty and add via update_gallery. Max 200 items per gallery; each item is {url, alt?}.
Inputs: name (required), slug, items.
create_pageCreate a pageA
Create a page (slug + title + per-page SEO meta). Use this for multi-page sites — call once per page, then register_component for each section on that page. Free; doesn't consume credits.
Inputs: slug (required), title (required), type, og_image, +8 more.
create_translation_keysBulk-create translation keysA
Create multiple translation keys with default values in one call. Use this for keys you reference outside of registered components (nav labels, error strings, etc.). Returns lists of newly-created and already-existing keys.
Inputs: keys (required), language.
delete_componentDelete a registered componentA
Permanently remove a registered component (editable HTML chunk) from the project. Use when retiring a section that's no longer on the page. Returns 404 if the component doesn't exist. Destructive — no undo.
Inputs: id (required).
delete_contentDelete a content keyA
Permanently remove a content / translation key and all its locale values. Use when retiring copy that's no longer rendered anywhere on the site. Returns 404 if the key doesn't exist. Destructive — no undo.
Inputs: key (required).
delete_galleryDelete a galleryA
Permanently delete a gallery by slug. Destructive — no undo. Only removes the gallery record (slug + ordered item list). Does NOT delete the underlying image URLs or registered images — those live separately.
Inputs: slug (required).
delete_imageDelete an image registrationA
Remove an image key registration so the URL is no longer resolvable via GET /v1/images/{key}. Does NOT delete the underlying CDN bytes; only the key→URL binding. Returns 404 if the key wasn't registered.
Inputs: key (required).
delete_pageDelete a pageA
Remove a page. Defaults to soft-retire (is_active=false), which is reversible via update_page. Pass force: true for a hard delete (irreversible). The homepage cannot be deleted — promote a different page to homepage first.
Inputs: id (required), force.
find_workspacesFind workspaces for an emailA
List the Neural Draft workspaces (tenants) an email is registered against. Useful for multi-workspace login troubleshooting — the user knows the email but forgot which workspace. Hits the CENTRAL host (e.g. https://app.neuraldraft.io), not the per-tenant API. Always 200, even for unknown emails (anti-enumeration). Free; doesn't consume credits.
Inputs: email (required), central_url.
generate_blog_postGenerate a blog postA
Kick off the AI blog generation pipeline (research → draft → image → SEO). Returns a Job ID immediately; poll with the get_job tool until status is 'completed'. Costs ~400 credits per post. Set translate_to_all=true to fan out into every project target language (5 credits per extra language).
Inputs: topic (required), style, word_count, image_style, +7 more.
generate_imageGenerate a brand-consistent imageA
Generate a brand-consistent image (uses the project's color palette and visual tone automatically). Returns a Job ID; poll with get_job until status is 'completed'. Pass key to make the image addressable later via GET /v1/images/{key} (recommended). Costs ~40 credits per image.
Inputs: prompt (required), key, style, aspect_ratio.
generate_videoGenerate a brand-aware video clipA
Kick off a video generation and return a Job. Two tiers: tier='budget' (default) uses Wan 2.1 — 40 credits per clip. tier='premium' uses Kling v2.1 / Runway Gen4 — 300 credits, Build plan or higher only. Poll with get_job until status='completed'. Aspect ratios optimised for short-form social: 9:16 (Reels/TikTok), 16:9 (YouTube), 1:1 (feed).
Inputs: prompt (required), tier, platforms, aspect_ratio, +2 more.
get_blog_postGet a blog postA
Fetch a blog post (title, body, excerpt, SEO meta, translations) by id or slug. Use lang to pick a non-default translation. Read-only; doesn't consume credits.
Inputs: id_or_slug (required), lang.
get_brandGet brand contextA
Read the project's brand: voice, audience, content tone, colors, fonts, logo, target topics. Identical to the brand://current resource but exposed as a tool for clients that don't list resources. Read-only; doesn't consume credits.
Inputs: no named parameters.
get_contentGet a translation keyA
Fetch a single translation key by name (returns the value for the chosen language plus every other locale that has been written). Use lang to pick the locale; defaults to the project default language. Read-only; doesn't consume credits.
Inputs: key (required), lang.
get_galleryGet a galleryA
Fetch a gallery by slug. Returns name + ordered items array of {url, alt}. Use list_galleries first if you don't know the slug. Read-only; doesn't consume credits.
Inputs: slug (required).
get_imageGet a registered image by keyA
Resolve the registered URL for an image key. Returns 404 if the key is not registered.
Inputs: key (required).
get_jobGet a job statusA
Poll the status of an async Neural Draft job (returned by generate_blog_post, generate_image, etc.). Status flows pending → running → completed | failed | cancelled.
Inputs: id (required).
get_pageGet a pageA
Fetch a single page (slug, title, type, SEO meta) by id or slug. Read-only; doesn't consume credits.
Inputs: id_or_slug (required).
get_productGet a productA
Fetch a single product by id. Read-only; does not consume credits. Use when scaffolding a /products/[slug] page.
Inputs: id (required).
get_usageGet current credit usageA
Read the project's current credit balance, monthly limit, reset date, and per-operation spend breakdown for this billing period. Use this to decide whether a multi-step generation will fit the budget before kicking it off. Read-only; doesn't consume credits.
Inputs: no named parameters.
list_blog_postsList blog postsA
List the project's blog posts (paginated). Filter by status (draft|published|scheduled), category slug/name, tag, or language. Sort by created_at or published_at; prefix with '-' for descending. Defaults to '-created_at'. Read-only; doesn't consume credits.
Inputs: tag, lang, page, sort, +3 more.
list_contact_form_submissionsList contact-form submissionsA
List the project's captured contact-form submissions (id, email, subject, message, data). Read-only; doesn't consume credits. Use search= to substring-match against email, subject, or message.
Inputs: page, search, page_size.
list_contentList translation keysA
List the project's translation keys (paginated). Use search for substring match on key name, scope to narrow to page/component/global, and lang to pick which language's value is returned alongside the all_locales map. Read-only; doesn't consume credits.
Inputs: lang, page, scope, search, +1 more.
list_galleriesList galleriesA
List galleries for the current project, ordered by name (slug, name, items_count). Galleries are named, ordered collections of images used by AI-built customer sites. Read-only; doesn't consume credits.
Inputs: page, per_page.
list_imagesList registered imagesA
List image keys registered for the current project (key, url, updated_at). Optional prefix narrows by user-key prefix (e.g. 'hero.' returns hero.background, hero.foreground). Read-only; doesn't consume credits.
Inputs: page, prefix, page_size.
list_newsletter_subscribersList newsletter subscribersA
List the project's captured newsletter subscribers (id, email, app_lead, subscribed_at). Read-only; doesn't consume credits. Use app_lead=true to filter to/from app-lead-only signups.
Inputs: page, search, app_lead, page_size.
list_pagesList pagesA
List the project's pages (slug, title, type, is_homepage, is_active). Read-only; doesn't consume credits.
Inputs: page, type, is_active, page_size.
list_productsList productsA
List the project's products (paginated). Read-only; does not consume credits. Use before scaffolding a storefront so you generate cards for real items.
Inputs: page, status, page_size.
register_componentRegister a generated componentA
Register an HTML section as an editable component in the customer's Neural Draft admin. Call this for EVERY section you generate (hero, features, pricing, footer, etc.). The HTML should follow the editable-HTML conventions (read conventions://editable-html first). Returns the component_id (preserve in code as a comment) and the translation keys that were created.
Inputs: html (required), intent (required), position, page_slug.
register_imageRegister or update an image URLA
Bind a direct image URL to a stable key (e.g. 'hero.background' → https://cdn.example.com/hero.webp). Idempotent — calling twice with the same key swaps the URL. Costs 0 credits. For AI-generated images use generate_image instead.
Inputs: key (required), url (required).
replace_imageReplace a registered imageA
Replace the image at key either by: - url: synchronous URL swap (0 credits), or - regenerate: true + prompt: AI regeneration (~40 credits, returns a Job — poll get_job). Exactly one mode must be supplied.
Inputs: key (required), url, style, prompt, +2 more.
setup_booking_widgetGet the booking widget embedA
Resolve the embed HTML + script URL for a bookable service. Drop the returned embed_html into the page where the booking flow should appear. Read-only; does not consume credits.
Inputs: service_id (required).
update_blog_postUpdate a blog postA
Patch a blog post's title / body / SEO meta / status. Use language_code to pick which translation the text fields write to. Free; doesn't consume credits.
Inputs: id (required), slug, tags, title, +8 more.
update_brandUpdate brand contextA
Patch the project's brand: voice, audience, tone, colors, fonts, logo, languages. Only the fields you pass are updated; others are preserved (merge semantics). Free; doesn't consume credits.
Inputs: fonts, voice, colors, audience, +7 more.
update_galleryUpdate a galleryA
Update a gallery by slug. Pass name to rename, items to replace the full ordered list. Items is a FULL REPLACE — to add or reorder, fetch the current list with get_gallery, mutate, then send the complete new array. Slug is immutable; max 200 items.
Inputs: slug (required), name, items.
update_pageUpdate a pageA
Patch a page's fields and/or SEO meta. Only the fields you pass are touched. Use this to backfill meta_* on a page that was auto-created by register_component. Free; doesn't consume credits.
Inputs: id (required), slug, type, title, +9 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 38 tools
Each tool targets a distinct resource-action pair (e.g., list_galleries, get_gallery, create_gallery, update_gallery, delete_gallery). Even closely related tools like register_image and replace_image have clearly separated responsibilities. No two tools appear to do the same thing.
All tools follow a consistent verb_noun snake_case pattern (create_, get_, list_, update_, delete_, generate_, register_, etc.). The resource name is always a clear object, making the action predictable from the tool name alone.
With 38 tools, this server is well beyond the typical well-scoped range of 3-15 tools. Even accounting for the broad feature set, the sheer number creates a heavy surface that could overwhelm agents and increase misselection risk.
The core resources have strong CRUD coverage: galleries, pages, and images are well-supported. However, there are notable gaps: components lack an update tool, blog posts have no delete, and translation keys have no update_content. These missing lifecycle operations force workarounds like delete-and-recreate.
Related MCP Connectors
Manage your blog ideas, article schedule, writing runs and draft approvals from your AI app.
Manage WordPress blogs and WooCommerce shops from Claude, ChatGPT, Cursor and other MCP apps.
The backend and back office for apps your AI writes: accounts, data, payments, content, real-time.
A blog CMS that AI agents write into over MCP: Markdown drafts, versions, media, human approval.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to manage WordPress sites through natural conversation, supporting post creation, content updates, site queries, and draft-to-publish workflows via the WordPress REST API.9MIT
- AlicenseCqualityDmaintenanceEnables AI assistants to manage WordPress content, design, SEO, WooCommerce, and more through natural language commands.10018 npm3MIT
- AlicenseNot gradedqualityDmaintenanceProvides a standardized interface for interacting with Notion's tools and services through a unified API, enabling content management and site configuration via natural language.1MIT
- AlicenseNot gradedqualityDmaintenanceConnects WordPress sites to AI agents, enabling content management through natural language commands via the WordPress REST API.20 npm2MIT