Skip to main content
Glama

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.

npm version npm downloads MCP Registry License: MIT Docs

@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.

A Claude Code session driving Neural Draft over MCP

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/mcp

Add --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/mcp

or ~/.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

NEURALDRAFT_API_KEY

one of these two

One workspace key, ndsk_live_…

NEURALDRAFT_API_KEYS

one of these two

Several workspaces: name=key,name=key or a JSON object

NEURALDRAFT_WORKSPACE

no

Which of NEURALDRAFT_API_KEYS is active at start (default: the first)

NEURALDRAFT_API_URL

no

Default https://api.neuraldraft.io/v1

NEURALDRAFT_PROJECT_ID

no

Override when one key spans several projects

NEURALDRAFT_DISPLAY_NAME

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/mcp

Streamable 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 neuraldraft

Claude: 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

@neuraldraft/mcp (this repo)

Auth

Sign-in (OAuth)

API key per workspace

Runs

Remote, Streamable HTTP

Locally via npx (stdio)

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

NEURALDRAFT_API_KEYS

Developers often add both to Claude Code or Codex.

Tools

Group

Tools

Workspaces

list_workspaces, switch_workspace, find_workspaces

Brand

get_brand, update_brand

Content

create_translation_keys, get_content, list_content, delete_content, register_component, delete_component

Pages

create_page, list_pages, get_page, update_page, delete_page, add_site_page

Images and galleries

list_images, get_image, register_image, replace_image (by URL), delete_image, list_galleries, get_gallery, create_gallery, update_gallery, delete_gallery

Blog

generate_blog_post (a draft in the brand's voice), list_blog_posts, get_blog_post, update_blog_post

Bookings and shop

create_bookable_service, setup_booking_widget, list_products, get_product

Forms

list_newsletter_subscribers, list_contact_form_submissions

Account

get_usage, get_job

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

brand://current

Voice, audience, colours, fonts, languages. Read before generating UI.

schema://blog-post

Blog post response shape

schema://product

Product and variant shape

schema://booking

Services, bookings, availability

conventions://editable-html

The data-translate / data-image-key markup rules

conventions://api-usage

Auth, errors, rate limits, jobs

Prompts

Prompt

What it does

/scaffold-marketing-site

A full marketing site wired to Neural Draft (brand, editable keys, components)

/scaffold-blog-page

A /blog index and post page in an existing project

/connect-existing-site

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

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 dev

Inspect 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

MIT


Built by Neural Draft. Questions: info@neuraldraft.io.

Available Tools

38 tools
create_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_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_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_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_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

    A4/5.0

    Scored across 38 tools

    Disambiguation5/5

    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.

    Naming Consistency5/5

    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.

    Tool Count2/5

    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.

    Completeness3/5

    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

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Enables 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.
      9
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Connects WordPress sites to AI agents, enabling content management through natural language commands via the WordPress REST API.
      20 npm
      2
      MIT