scrivener-mcp

scrivener-mcp

Local MCP server that exposes Scrivener projects to AI clients, enabling project creation, binder navigation, document read/write, and metadata updates without opening Scrivener.

Category
Visit Server

README

scrivener-mcp

A local MCP server that exposes your Scrivener projects to Claude (or any MCP-compatible client). Create new projects from scratch, navigate the binder, read and write document content, and update metadata — all without opening Scrivener.


Requirements

  • Node.js 18 or later
  • Scrivener 3 on macOS (.scriv packages)

Setup

cd scrivener-mcp
npm install

Environment variables

Variable Description
SCRIV_DIR Path to a directory containing .scriv packages. Enables list_projects, open_project, and create_project.
SCRIV_PATH Path to a single .scriv package. Opens it immediately on startup.
SCRIV_PLATFORM mac (default) or windows. Controls the RTF format used when writing document content.

At least one of SCRIV_DIR or SCRIV_PATH must be set. Both can be set simultaneously.


Running manually

# Multi-project mode (recommended)
SCRIV_DIR="/path/to/ScrivenerProjects" npm start

# Single-project mode
SCRIV_PATH="/path/to/MyProject.scriv" npm start

Configuring Claude Desktop

Edit the Claude Desktop config file:

  • Mac: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Mac:

{
  "mcpServers": {
    "scrivener": {
      "command": "node",
      "args": ["/absolute/path/to/scrivener-mcp/src/index.js"],
      "env": {
        "SCRIV_DIR": "/Users/you/Writing/ScrivenerProjects"
      }
    }
  }
}

Windows:

{
  "mcpServers": {
    "scrivener": {
      "command": "node",
      "args": ["C:\\path\\to\\scrivener-mcp\\src\\index.js"],
      "env": {
        "SCRIV_DIR": "C:\\Users\\you\\Documents\\ScrivenerProjects",
        "SCRIV_PLATFORM": "windows"
      }
    }
  }
}

Restart Claude Desktop after saving.


Available tools

Project management

Tool Description
list_projects Lists all .scriv packages in SCRIV_DIR.
open_project(name) Opens a project by name, making it active for all document tools.
create_project(name, ...) Creates a new project and opens it. See below.

Document tools (require an open project)

Tool Description
get_outline Returns the full binder as a nested tree with synopses, labels, and statuses. The best starting point for understanding and working on a project's structure.
list_documents Returns the binder as a flat list with depth indicators. Useful for getting UUIDs.
get_document(uuid) Returns metadata and plain text content for a single document.
add_document(...) Adds a new document or folder to the binder.
move_document(uuid, newParentUuid) Moves a binder item to a different parent folder.
write_document(uuid, content) Writes new plain text content to a document (stored as RTF).
update_metadata(uuid, changes) Updates title, synopsis, label, status, or compile inclusion.
search_documents(query) Searches titles and synopses across the binder.

Creating a project

create_project accepts a full binder structure so Claude can scaffold an entire project from an idea in one call.

Parameters

Parameter Type Description
name string Project name (becomes the .scriv package name).
labels array Label definitions. Each is a string or {name, color}. Colors: red, orange, yellow, green, blue, purple, pink, cyan.
statuses array Status names. Defaults to: To Do, In Progress, First Draft, Revised Draft, Done.
manuscript array Binder items in the Draft (Manuscript) folder.
research array Binder items in the Research folder.

Binder item structure

{
  "title": "Chapter 1",
  "type": "Folder",
  "synopsis": "Alice finds the letter and confronts Bob.",
  "content": "Optional initial body text (Text items only).",
  "label": "POV: Alice",
  "status": "To Do",
  "includeInCompile": true,
  "children": [...]
}
  • type: "Folder" for containers (acts, parts, chapters); "Text" for documents (scenes, notes). Defaults to "Text".
  • synopsis: The virtual index card text — appears in Scrivener's corkboard and outliner views. Write a 1–3 sentence summary of what happens or what this item covers.
  • label and status must match names defined in the project's labels and statuses arrays.

Example

{
  "name": "My Novel",
  "labels": [
    { "name": "POV: Alice", "color": "blue" },
    { "name": "POV: Bob", "color": "red" }
  ],
  "statuses": ["To Do", "First Draft", "Revised", "Done"],
  "manuscript": [
    {
      "title": "Act One",
      "type": "Folder",
      "synopsis": "Alice discovers the conspiracy.",
      "children": [
        {
          "title": "Chapter 1",
          "type": "Folder",
          "synopsis": "A normal Tuesday turns strange.",
          "children": [
            {
              "title": "The Letter",
              "type": "Text",
              "synopsis": "Alice finds an unsigned letter in her mailbox.",
              "label": "POV: Alice",
              "status": "To Do"
            }
          ]
        }
      ]
    }
  ],
  "research": [
    {
      "title": "Characters",
      "type": "Folder",
      "children": [
        {
          "title": "Alice",
          "type": "Text",
          "synopsis": "Protagonist. Mid-30s journalist, sceptical but curious."
        }
      ]
    }
  ]
}

Collaborative workflow

The intended pattern is to work with Claude on the structure and content of a project together, using Scrivener's own organisational features:

  1. Start with get_outline — Claude reads the full nested structure with synopses before suggesting or making any changes. This is how it understands the story shape.
  2. Build structure with add_document — Add scenes, chapters, acts, or research notes at any point in the hierarchy. Always include a synopsis; it is what appears on the index card in Scrivener's corkboard.
  3. Reorganise with move_document — Move items between parents to restructure the narrative without losing any content or metadata.
  4. Write prose with write_document — Once structure is agreed, populate scenes with content.
  5. Track progress with update_metadata — Update labels (e.g. POV, scene type) and statuses (e.g. First Draft, Revised) as work progresses.

Notes

  • Close Scrivener before writing. write_document, update_metadata, add_document, and move_document all modify project files directly. If Scrivener has the project open, it will overwrite changes on its next auto-save.
  • Reload after editing in Scrivener. Call open_project again to reload a project that was modified in Scrivener while the server was running.
  • write_document generates minimal RTF compatible with Scrivener 3. Non-ASCII characters are Unicode-escaped.
  • Label and status IDs are discoverable via list_documentslabelId/statusId are raw IDs, label/status are the resolved names.

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured