Skip to main content
Glama

Scrivener MCP

MCP server for Scrivener: connect your novels, screenplays, and manuscripts to Claude, ChatGPT, and any AI assistant, with document management, writing analysis, content enhancement, offline semantic search, and character/plot tracking.

Start with the safe first session, then use editorial review and workflows, export presets, Content Credentials, or the Windows guide. Compatibility evidence records actual coverage and limits.

CI CodeQL OpenSSF Scorecard npm License


Scrivener MCP lets your AI assistant open, read, edit, analyze, and search your Scrivener projects directly. No exporting, no copy-pasting text back and forth. Tell it which project to open and start working.

You: Open my novel and analyze the pacing in Chapter 12.

Claude: Opens the .scriv project, reads Chapter 12, runs pacing analysis. The first half moves well, but the middle stalls — a three-page internal monologue starting at paragraph 14 kills the momentum you built in the confrontation scene. Consider cutting it to a paragraph and moving the backstory to Chapter 8.

Works with Claude Desktop, Claude Code, VS Code (Copilot/Continue), Cursor, and any MCP-compatible client. Reads Scrivener 3 projects on the supported platforms. Listed on the official MCP Registry as io.github.writerslogic/scrivener-mcp.

Scrivener MCP capability map: project and document management, local search, persistent memory and story bibles, AI writing, craft analysis, continuity, relationships, goals, dashboards, automation, reviewed edits, and publishing.

Install

Mac app: Draftbridge for Scrivener, $4.99

Not a terminal person? Draftbridge for Scrivener is the ready-made Mac app. It finds your AI apps — Claude Desktop, BoltAI, Cursor, VS Code, LM Studio, Raycast, Claude Code — connects Scrivener MCP to each with one click, shows your projects, and repairs the connection after an app update. No Terminal, no Node.js, no settings files. One-time $4.99, up to 3 Macs, signed and notarized by Apple.

The server, setup tool, and Claude Desktop extension here stay free and open source. The app is closed source; the fee buys the notarized build and supports development. See the Mac install guide and FAQ. Report app problems with the mac-app label.

Free: Claude Desktop extension or command line

Prefer to do it yourself? The .mcpb extension (Claude Desktop only) and the terminal setup below do the same job for free.

From a terminal:

npm install -g scrivener-mcp

Restart Claude Desktop and it's ready. Other clients need one more step:

npx scrivener-setup

This finds Claude Desktop, Claude Code, Cursor, VS Code, LM Studio, BoltAI, and Raycast and configures them for you, then confirms the server starts. No Node.js on your Mac? See the Mac install guide. To set up Claude Code by hand instead: claude mcp add -s user scrivener -- npx scrivener-mcp, then restart it (or run /mcp).

npx, no install

npx scrivener-mcp

or add it to Claude Desktop's config directly:

{
	"mcpServers": {
		"scrivener": { "command": "npx", "args": ["scrivener-mcp"] }
	}
}

From GitHub

npm install -g writerslogic/scrivener-mcp              # latest main; requires pinned Rust/wasm-pack
npm install -g writerslogic/scrivener-mcp#v0.12.0       # a specific release

Homebrew (macOS)

brew install writerslogic/tap/scrivener-mcp

Docker

docker build --platform linux/amd64 -t scrivener-mcp https://github.com/writerslogic/scrivener-mcp.git
docker run --platform linux/amd64 -i --rm -v /path/to/your/projects:/projects scrivener-mcp

The container uses Linux x64 with glibc because the pinned Narrative Lens 0.2.0 package has no Linux ARM64 or musl binary. Linux ARM64 and musl hosts can use this Docker configuration; ARM hosts need Docker's amd64 emulation. The image runs as the non-root node user; mounted project directories must permit that user to read and write.

Any other MCP client: point it at npx scrivener-mcp as a stdio server.

Document management, deterministic analysis, local passage search, and project memory work with no API key. Provider-assisted interpretation, generation and enhancement use Anthropic, OpenAI or OpenRouter. Set more than one and Claude handles chat by default; override with AI_PROVIDER=openai or AI_PROVIDER=openrouter (OpenRouter defaults to anthropic/claude-sonnet-4.6, change it with OPENROUTER_MODEL). If the active provider fails on an account-level error — bad key, no credit, an outage — the server retries on the next one you've configured. If your MCP client supports sampling, chat-based features can run through the client's own model on legacy MCP connections, no separate key needed. MCP 2026-07-28 connections currently use configured providers for AI features; modern multi-round sampling is not implemented. Passage retrieval runs locally through Holographic Memory 0.6.4; interpretation and explanations are optional provider features.

Keys are picked up automatically from:

  • ANTHROPIC_API_KEY / OPENAI_API_KEY / OPENROUTER_API_KEY

  • ~/.env or ~/.scrivener-mcp/.env

  • ~/.anthropic/key, ~/.openai/key, ~/.openrouter/key

  • macOS Keychain (anthropic-api-key / openai-api-key / openrouter-api-key)

security add-generic-password -s anthropic-api-key -a anthropic -w sk-ant-your-key-here   # Keychain
export ANTHROPIC_API_KEY="sk-ant-..."                                                      # or export it directly

Local passage search works without installing a model runtime. To use your own offline ONNX embedding or reranking models with a global installation, install the optional runtime alongside the server:

npm install -g scrivener-mcp '@huggingface/transformers@^4.3.2'

For a local installation, run the same command without -g in the server's installation directory. Set SCRIVENER_WARM_EMBED_MODEL_PATH to a complete local model directory and provide SCRIVENER_WARM_EMBED_MODEL_ID and SCRIVENER_WARM_EMBED_REVISION. Set SCRIVENER_WARM_RERANK_MODEL_PATH to enable a local reranker. No model weights are downloaded; the available options are listed in .env.example.

Related MCP server: Scrivener MCP Server

What You Can Do

For manuscript operations, open a project first. The server has no link to the Scrivener app itself and can't see what's open there. Say "Open my Scrivener project at ~/Documents/My Novel.scriv", or "Discover my Scrivener projects" if you don't know the path. On macOS, "Use the project I have open in Scrivener" works too (the first time, macOS will ask permission to control Scrivener). Do this once per conversation. If the project is also open and unsaved in Scrivener itself, save or close it there first, or the two can write over each other.

Manage your manuscript. Read chapters, create scenes, reorganize the binder, update synopses — all through conversation. "Create a new scene called 'The Reveal' after Chapter 5, and move the old epilogue to the trash."

Analyze your writing. Readability, pacing, style, dialogue quality, emotional arc — grounded in your actual prose, not generic advice. Ask whether a chapter's pacing is off and get specifics: which paragraphs stall, how the scene compares to your other chapters, filter-word density against your own average.

Enhance your prose. Targeted edits: cut filter words, strengthen verbs, vary sentence structure, add sensory detail, turn telling into showing, tighten dialogue, fix pacing.

Track characters and plot. Character profiles, plot threads, and style guides persist with the project across sessions. Save a profile for a character once; a consistency check months later catches contradictions — dialogue that doesn't sound like them, a limp that disappears for a chapter.

Search by meaning. Warm 0.6.4 combines native BM25 with local embeddings and optional cross-encoder reranking. Configure local ONNX models for general semantic search; the default encoder covers a disclosed English story-concept vocabulary. Results include exact passages, locations and saved revisions; changed passages update incrementally. No embedding provider is required. See local search configuration.

Track relationships. Record and query how characters, locations, themes, and plot threads connect. Relationships persist in the project's local SQLite state. Discovery proposes unrecorded character/location pairs using saved-text co-occurrence with source revisions.

Compile and export. Assemble chapters into one manuscript with your own formatting and structure preserved. Export inline as Markdown, HTML, or JSON, or write a DOCX, EPUB, or PDF to disk.

Sign and validate exports. Activate credentials with use_skill({"name":"credentials"}), then call c2pa_capabilities to inspect the installed SDK. Export a PDF with export_project, sign it to a new embedded output with sign_content_credentials, and check that output with validate_content_credentials. Credential operations run locally without an open project and use administrator-configured signing material. They do not establish human authorship or formal C2PA conformance. See Content Credentials for setup, mode coverage and limits.

All Tools

84 tools organized by workflow. MCP 2026-07-28 connections list all of them at once. On earlier protocol versions, tools load progressively to keep token usage low — project tools at startup, document and search tools once a project is open, the rest on demand. Set SCRIVENER_MCP_EAGER_TOOLS=1 to load everything up front.

Tool

What it does

open_project

Open a .scriv project (accepts .scriv folders or .scrivx files) and make it active

discover_projects

Scan common locations for Scrivener projects when you don't know the path

detect_open_project

Detect the project currently open in the Scrivener app (macOS) so you don't need a path

get_structure

Browse the binder hierarchy (folders, documents, word counts)

refresh_project

Reload from disk after external edits

close_project

Close the active project and flush pending changes

verify_project_integrity

Read-only scan for structural problems (missing/duplicate UUIDs, unreadable content)

get_compile_settings

Read the project's compile formats and taxonomy -- labels/statuses (with colors), collections, section types

get_manuscript_briefing

One "where am I?" snapshot: words vs. target (% to goal), document/status/label counts, longest/shortest documents

list_snapshots

List Scrivener snapshots (title, date) for one document or the whole project

read_snapshot

Read a snapshot's text as plain text, with word count

compare_snapshot

Diff a snapshot against the current document (or another snapshot): paragraphs added/removed and net word change

create_snapshot

Take a Scrivener-native snapshot of a document (restorable from Scrivener's own Snapshots browser) before editing

Tool

What it does

get_document_info

Metadata for one document (title, type, word count, synopsis, label, status)

read_document

Read content; format: "formatted" for rich text, offset/limit to page long docs

write_document

Replace saved content with revision checks, native snapshots and disclosed formatting risks

review_changes

Propose, preview, selectively approve or reject, apply batches, recover and undo saved edits

manuscript_dashboard

Interactive binder, scene context, pacing, findings and review; text fallback for other clients

create_document

Create a new text document or folder

update_document

Change title and/or metadata (synopsis, notes, label, status, custom fields)

move_document

Reorganize within the binder

delete_document

Move to trash (reversible)

Tool

What it does

search

Literal full-text search across the active binder; field: "title" for titles, scope: "trash" for trash

semantic_search

Local concept-vector passage retrieval, with scores, context and source revisions; no API key

search_passages

Local keyword, bounded English concept, or hybrid retrieval with exact quoted evidence

find_mentions

Locate every occurrence of a specific name or term, with context

list_trash

List trashed documents

restore_document

Restore a document from trash

read_annotations

Read a document's comments and footnotes

Tool

What it does

analyze_document

Analyze complete saved text; analysisTypes steers provider issues, with explicit broad local fallback and revision checks

check_consistency

Evidence-backed continuity report with source revisions, canon and inferred candidates

continuity_findings

Confirm, dismiss, resolve and recheck evidence-bound continuity findings

analyze_writing_style

Style-focused analysis

check_plot_consistency

Plot-thread consistency check

suggest_improvements

AI-generated improvement suggestions

enhance_content

Propose a complete saved-document rewrite with source revisions; maximum 12000 UTF-16 characters

generate_content

Generate prose from a prompt, saved-text excerpts and character profiles with revision-checked context

set_writing_goal

Set a word-count goal (daily, weekly, or whole project) with an optional target date

get_writing_goals

List goals with progress -- percent complete, words remaining, on-pace status

set_writing_preferences

Set author preferences (tone, complexity, length, POV, style guide) that steer AI output

get_writing_preferences

Show current preferences plus feedback insights and suggestions

collect_feedback

Record a rating/comment on an AI operation to inform those insights

analyze_manuscript_local

Local manuscript findings with exact evidence, author controls, coverage, persistent baselines and revision comparisons

analyze_narrative_annotations

Check author-supplied causality, knowledge, promises, subtext and other annotations against saved quotations

analyze_craft_local

Offline readability, grammar, syntax-tension, dialogue, and word-frequency report for one document (narrative-lens, no AI call)

check_continuity_local

Offline timeline and world-state continuity pass across the manuscript

analyze_foreshadowing_local

Offline setup/payoff tracking across scenes

measure_voice_drift_local

Compare a character's earlier vs later dialogue for voice drift

analyze_opening_local

Offline opening cues, source ranges and coverage; editorial quality remains unassessed

check_style_local

Line-edit one document for adverbs, filter words, hedges, clichés, passive voice, nominalizations, and personal tics, each with line and column (bluepencil, no AI call)

find_repetition_local

Echoes (a word reappearing within a window) and repeated phrases, with both locations

analyze_rhythm_local

Sentence-length distribution, monotonous runs, overlong sentences, and repeated openers

analyze_dialogue_tags_local

Dialogue ratio and every quoted line's tag classified as plain, showy, adverb-modified, or untagged

manuscript_style_report_local

Per-document style density across the manuscript with word-weighted means and outliers

Manuscript comparisons include comparisonBaseline.name and its original envelope, alongside the current result's envelope, so both saved source revisions remain identifiable after a baseline name is reused.

Enhancement types: eliminate-filter-words, strengthen-verbs, vary-sentences, add-sensory-details, show-dont-tell, improve-flow, enhance-descriptions, strengthen-dialogue, fix-pacing, expand, condense, rewrite

Tool

What it does

compile_documents

Combine documents; mode: "structured" compiles the Draft folder with the binder hierarchy as headings and honors "Include in Compile" (no AI), mode: "intelligent" for AI-optimized output

export_project

Write the manuscript to disk -- Markdown, HTML, JSON inline, or DOCX, EPUB, PDF as a file

read_result

Retrieve large compiled/analysis results in bounded UTF-8 chunks without filesystem tools

export_manuscript

Preflight and export submission DOCX, beta-reader DOCX and validated EPUB presets

get_statistics

Project-level word/document/character counts

generate_marketing_materials

Draft synopsis, query letter, pitch, and related materials

Intelligent compilation returns provider warnings, explicit quality availability, and saved-source revisions. Rewrites require the complete source to fit 12000 UTF-16 characters; otherwise the complete original is preserved. Quality opinions cover at most 4000 characters and identify that coverage. Marketing generation reads the saved Draft by default; use documentIds to select a smaller scope within the same 12000-character limit. Both reject source changes during generation and provide read_result references for large output.

Activate the credentials skill on demand; these tools do not require an open project.

Tool

What it does

c2pa_capabilities

Inspect actual SDK availability, declared format/mode coverage, limits and unassessed conformance status

sign_content_credentials

Sign a local asset to a distinct new embedded or supported .c2pa sidecar output using administrator-configured credentials

validate_content_credentials

Validate a local asset and optional sidecar; report integrity separately from signer trust, with raw reports opt-in

Format declarations are not proof of native compatibility. Use the Content Credentials guide and per-format native evidence before making coverage claims.

Tool

What it does

remember

Store information that persists across sessions with the project

manage_series

Create, join or leave an explicitly scoped series of selected projects

story_bible

Curate shared characters, aliases, locations, world rules and chronology with provenance

recall

Retrieve previously stored memory

Project memory travels within each .scriv project. Explicit series memberships and shared facts use the server's persistent registry; see editorial workflows.

remember validates nested records and acknowledges the saved snapshot with its revision and record ID. Use that ID for updates; identical creations reuse their ID, and unknown update IDs fail. Unrecorded profile fields, style preferences and writing statistics stay absent. worldBuilding stores named records, for example { name: "Moon Harbor", type: "location" }; all merges custom JSON by key. Requests are capped at 64 KiB and complete project memory at 16 MiB. Large recall results use read_result. Earlier custom world data remains available under recall with all.

Tool

What it does

add_relationship

Store a relationship between characters, locations, themes, or plot threads

find_relationships

Query entities related to a given character/theme/location

discover_connections

Find unrecorded pairs of known characters/locations that co-occur in saved Draft documents, with source revisions

character_network

The character relationship network

get_entity_references

Trace the reference graph in either direction: entities a document mentions (by documentId), or documents mentioning an entity (by entity)

find_orphaned_entities

List registered characters/locations that no document actually mentions

suggest_connections

Suggest entities a document may be missing, inferred from cross-document co-occurrence

Relationship tools use project-owned SQLite without an external service. Storage admits up to 10000 relationships; names contain at most 128 UTF-16 characters and labels 64. Discovery covers the characters and locations already recorded in that graph, up to 256 entities, 1000 Draft documents, 2 Mi UTF-16 source characters and a source-character count multiplied by entity count of at most 134217728. Its score is the fraction of documents mentioning both entities among those mentioning either; it is a candidate association, not a confirmed story fact. Result limits disclose omitted candidates, and large responses use read_result. Relationship queries page in stable identity order using nextOffset and graphRevision; edits require restarting the query. Document cross-reference tools use the character/location registries and saved text, including Research and Draft items excluded from Compile. Document queries read only the requested document; entity-wide queries and suggestions inspect all active text within the same source limits. They disclose missing registries, reject source/registry changes, and preserve every admitted match offset (up to 1000000 positions and 16 MiB of serialized mention records).

Tool

What it does

queue_document_analysis

Analyze supplied document text asynchronously; returns a job id

queue_project_analysis

Analyze an ordered batch of supplied document texts

get_job_status

Poll progress/results for a queued job

get_queue_stats

Inspect project-scoped queue counts, connectivity and legacy migration guidance

editorial_workflow

Run chapter review, continuity audit or beta-reader preparation with durable progress and resuming

cancel_job

Request cancellation; running embedded work finishes internally and its result is discarded

Queued analysis always runs local prose analysis and includes readability by default. Optional named entities require a native build with ONNX support and a loaded NER model; unavailable results are explicit. Optional sentiment uses a local lexicon heuristic. Source revisions hash the supplied UTF-8 text, and the envelope identifies this raw policy separately from saved RTF analysis and saved project controls. Project batches preserve input order and run sequentially unless parallel is selected, with at most five documents in flight. Large completed results return a _ref retrieved through read_result. Redis/KeyDB cannot remove an active job; embedded cancellation prevents work that has not started and discards the result of work already running.

suggest_improvements accepts async: true for the same suggestion result through get_job_status. With useContext: true, documentId is required: generation uses up to the first 16000 UTF-16 characters of that saved document and rejects a changed revision. Its result reports the exact excerpt range, truncation and source revision. The default useContext: false sends only the prompt. Suggestions use the configured provider or client sampling, and queued generation is not automatically retried. Large synchronous and queued results use read_result references.

analyze_writing_style accepts 1–64 nonempty text samples, each up to 64000 UTF-16 characters. Its provider prompt includes at most 8000 characters including separators; coverage reports the range used from every sample, including any omitted samples. Missing or malformed profile fields are explicitly unavailable, partial finding lists preserve valid entries, and sample revisions hash the original supplied UTF-8 text. Large profiles also use read_result references.

Tool

What it does

list_skills

List the available tool groups and their tools

use_skill

Activate another tool group on demand

Guides

  • Getting Started -- Installation, configuration, your first session

  • MCP Client Setup -- Copy-paste config for Claude Desktop, Claude Code, Cursor, and VS Code

  • Writing with AI -- Analysis workflows, enhancement strategies, memory management

  • Troubleshooting -- Common issues and fixes

  • Token Optimization -- Response limits and measured context costs

  • 0.14 Validation -- Candidate evidence, supported scope and remaining qualification limits

  • Architecture -- How the server works, module structure, data flow

  • Scrivener Compatibility -- Supported Scrivener versions, platforms, and format coverage

  • Content Credentials -- Local C2PA signing and validation, administrator setup, tested modes and conformance limits

  • Scrivener File Format -- The reverse-engineered .scriv format, what we read vs. infer, and safe-modification guidance

  • Fuzzing -- Jazzer.js target and OSS-Fuzz integration details

  • Contributing -- Development setup, code conventions, adding new tools

Requirements

  • Stable Node.js ^22.23.4 || ^24.22.1 || >=26.12.1 (24.22.1 or newer on Node 24 recommended)

  • Scrivener 3 project files (.scriv)

  • Native npm/npx installs: macOS x64/ARM64, Windows x64, or Linux x64 with glibc. Architecture refers to the Node.js runtime.

  • Optional: Anthropic, OpenAI, or OpenRouter API key for provider-backed AI features

  • Optional: Neo4j for persistence and advanced graph queries; core relationship tools work without it

The patched floors protect Node TLS paths used by the pinned CAI native SDK; SQLite 13 also requires Node-API 10. Node 23 and 25 are excluded. See the runtime compatibility policy.

Development

See the compatibility and upgrade policy for runtime checks, protocol contracts, dependency upgrades and the stable release gate.

git clone https://github.com/writerslogic/scrivener-mcp.git
cd scrivener-mcp
npm install --ignore-scripts
# Install the pinned Rust/wasm-pack tools listed in native/c2pa-binding/README.md
npm run build:c2pa   # Generate the engine from source
npm run dev          # Development mode with hot reload
npm run build        # Compile TypeScript
npm test             # Run tests
npm run typecheck    # Type checking only

Why This One?

A few Scrivener MCP servers exist. Our column describes the current server; other feature claims come from each project's own docs, published package, and advertised tools, last re-read on 2026-10-22; stars, forks, activity, and published version were refreshed

necessarily impossible through the connected AI client.

Feature

scrivener-mcp

jiayun

TwelveTake

Scrivener Assistant

ricopicone

zaphodsdad

Public MCP tools

84

30

22

38

18

10

Manuscript access

read/write

read/write

read/write

read-only; writes sidecar data/metadata

read-only by default; opt-in content/notes/synopsis writes

read-only

RTF handling

formatted reads; fidelity-preserving span writes

reads/writes document content

reads/writes document content

converts RTF to text; manuscript read-only

RTF-to-text reads; snapshot-protected content writes

converts RTF to text; read-only

Built-in writing analysis

readability, pacing, style, emotion, AI critique

readability, style, sentiment

continuity comparison

agent-driven five-point review workflow

no dedicated analysis tool

no dedicated analysis tool

Content generation/enhancement

generation + 12 targeted enhancement types

no

no

brainstorm/draft agent workflow

no

no

Local semantic retrieval

local concept vectors, BM25 and quoted passages

no

no

no

no

no

Continuity/project memory

persistent memory + consistency checks

persistent notes + consistency checks

mention/description comparison

world bible, story state, characters, locations, review history

no persistent memory

no persistent memory

Relationship tooling

persistent relationships, networks, reference graph; optional Neo4j

no

no

human-editable relations data

no

no

Token optimization

progressive skill loading, compact output, paged reads

no documented equivalent

no documented equivalent

no documented equivalent

scoped binder/chapter reads

scoped overview/read tools

Export / compilation

Markdown, HTML, JSON, DOCX, EPUB, PDF

compile + whole-draft export

PDF

saves AI drafts; no manuscript export documented

no

no

Windows support

native CI verified; synthetic projects

yes (prebuilt binary)

yes

not documented

not documented

yes

Installation

npm, Homebrew, Docker, or the Draftbridge Mac app

crates.io, prebuilt binary, or source

npm package (deprecated)

MCPB or source

source / uv

source / pip install -e

License

AGPL-3.0 / commercial dual-license

MIT

MIT

MIT

not declared

MIT

Repository/package status

weekly activity; npm 0.12.0

occasional activity

removed from npm

weekly activity

occasional activity; no releases

repository unavailable

Community

⭐ 71 · 25 forks

⭐ 7

source repository unavailable

⭐ 1

⭐ 0

unavailable

Counts and feature claims can change. Follow the linked projects for their own latest documentation. The table is generated from docs/comparison.yml — edit claims there, not here.

The alternative that isn't an MCP server

Scrivener can also Sync to External Folder, writing each document out as RTF or plain text, which any generic file-access MCP server (like @modelcontextprotocol/server-filesystem) can then read and write.

It's free and works today. What you lose is everything tied to the actual project — binder hierarchy, metadata, labels and status, snapshots, compile settings, RTF formatting — and edits land in the sync folder rather than the project itself, so a bad edit gets reconciled by Scrivener on the next sync instead of caught before it happens. Fine for occasional read-only help with prose; not if you want the structure to survive the round trip.

Contributing

We welcome contributions of all sizes. Check the issue tracker for good first issue labels, or see the contributing guide for development setup.

Areas where help is especially welcome:

  • Test coverage (#18)

  • Windows testing and path handling

  • Scrivener 2 compatibility testing

  • Documentation improvements (#25)

Security

Found a vulnerability? Please report it privately — see SECURITY.md.

License

AGPL-3.0 © WritersLogic, Inc.

Scrivener is a trademark of Literature & Latte Ltd. This project is independent and is not affiliated with, endorsed by, or sponsored by Literature & Latte.

Free for personal use and open-source projects. Commercial license available for proprietary integration. See COMMERCIAL_LICENSE.md for details.


Also from WritersLogic: WritersProof witnesses your keystrokes, pauses, and revisions as you write, then seals that process into tamper-evident, independently verifiable proof you wrote it yourself — AI accusations, settled with evidence instead of your word.

MCP 2026-07-28 uses server/discover and a stable full tool catalog. Each request supplies the protocol version and client capabilities in standard MCP _meta. open_project returns projectHandle in text and structured content; pass it as an ordinary argument on subsequent project tool calls. The legacy com.writerslogic/project request metadata token is also accepted. Handles expire on close, reopen or restart. Calls are serialized per modern stdio connection. Legacy MCP initialization, implicit project scope and progressive skill discovery remain available.

Each connection admits at most 32 active or queued tool calls and 16 MiB of retained request parameters, with a burst of 120 attempts and refill of two attempts per second. Rejections are explicit and report retry guidance. Canceled queued work releases its slot; running work retains capacity until it settles. These limits do not bound total process memory, tool results or native worker allocations. Prefer the documented report page defaults and follow revision-bound continuation cursors when retrieving large reports.

Available Tools

57 tools
add_relationshipAdd RelationshipA
Idempotent

Record a typed, directed relationship between two story entities (e.g. a character "mentors" another, or a character "appears in" a document) in the project story graph. Returns the stored edge with its generated id. Use this to build the knowledge graph that find_relationships, character_network, and discover_connections then query. Requires an open project with the relationship engine initialized.

Inputs: head (required), tail (required), headType (required), relation (required), +1 more.

analyze_documentAnalyze DocumentA
Read-onlyIdempotent

Analyze the writing quality of a single document and return a summary of readability, pacing, and the top issues found. This is the general-purpose prose analyzer: narrow it with analysisTypes to focus on style, structure, themes, characters, sentiment, or pacing. Use check_consistency for project-wide continuity instead, or enhance_content to get rewritten prose rather than a critique. Calls an external AI model. Requires an open project and a valid document id.

Inputs: documentId (required), analysisTypes. Returns: issues, pacing, readability

analyze_writing_styleAnalyze Writing StyleA
Read-onlyIdempotent

Analyze the prose style of one or more text samples — sentence variety, tone, voice, pacing, and other stylistic features — and return a structured style profile. Use this to characterize how something is written; use analyze_document for document-level metrics or check_plot_consistency for narrative coherence.

Inputs: samples (required). Returns: analysis

cancel_jobCancel JobA
Idempotent

Cancel a queued or running background job by its type and id. Returns whether the cancellation succeeded. Cancelling an already-finished or unknown job is harmless. Use get_job_status first to check whether a job is still in progress.

Inputs: jobId (required), jobType (required).

character_networkCharacter NetworkA
Read-onlyIdempotent

THE default tool for "map my characters" / "how do my characters connect": returns the full character relationship network — every character and the typed relationships between them — for rendering a graph or analyzing cast structure. Prefer this for any whole-cast question. Use find_relationships only for one entity's connections, get_entity_references for which documents mention an entity, and suggest_connections to surface missing links. Requires an open project with the relationship engine initialized. Takes no parameters.

Inputs: no named parameters. Returns: network

check_consistencyCheck Project ConsistencyA
Read-onlyIdempotent

Scan the whole project for continuity problems and return the issues found: character contradictions, timeline conflicts, location mismatches, and dropped or inconsistent plot threads. This is the project-wide continuity checker; use analyze_document to critique a single document's prose instead. Narrow the scan with checkTypes. Requires an open project.

Inputs: checkTypes. Returns: counts, issues, checkTypes

check_plot_consistencyCheck Plot ConsistencyA
Read-onlyIdempotent

Scan a set of documents for plot-level inconsistencies — timeline conflicts, contradicted facts, dropped threads — and return the issues found with the documents involved. Use this for story/plot coherence across chapters; use check_consistency for general consistency checks or analyze_writing_style for prose-level analysis.

Inputs: documents (required), async. Returns: jobId, issues, message

close_projectClose ProjectA
Idempotent

Close the currently open project, flush any pending memory/auto-save state, and clear the active session. After this, document and analysis tools have no project to act on until open_project is called again. Use this to switch projects cleanly or release file handles at the end of a session. Requires an open project. Takes no parameters.

Inputs: no named parameters.

collect_feedbackCollect FeedbackA

Record feedback on an AI operation (e.g. "enhance_content") so it feeds the insights returned by get_writing_preferences. Provide a 1-5 rating, whether the output was kept (accepted), and/or a comment. Use after the writer reacts to AI output. Requires an open project.

Inputs: operation (required), rating, comment, accepted.

compare_snapshotCompare SnapshotA
Read-onlyIdempotent

Compare a document snapshot against the current document text, or against another snapshot (pass againstSnapshotId). Returns the paragraphs added and removed and the net word-count change — use this to see what changed since a snapshot was taken. Read-only. Requires an open project (call open_project first). Get snapshot ids from list_snapshots.

Inputs: documentId (required), snapshotId (required), againstSnapshotId. Returns: to, from, wordDelta, documentId, +5 more

compile_documentsCompile DocumentsA
Read-onlyIdempotent

Compile the project's documents into a single continuous manuscript in the requested format and return the compiled text (large results are spooled to a file reference). In "standard" mode it joins documents in binder order; in "intelligent" mode it uses AI to optimize the output for a specific target such as an agent query or synopsis. To write a manuscript to disk in a publishing format (EPUB, etc.) use export_project instead. Requires an open project.

Inputs: mode, format, separator, documentIds, +8 more. Returns: file, text, format, sections, +2 more

create_documentCreate DocumentA

Create a new text document or folder in the binder and return its new id. Optionally set the initial body content and the parent folder; if no parent is given the item is added at the top level. Each call creates a distinct item (not idempotent). Use write_document to change content afterward. Requires an open project.

Inputs: title (required), force, content, parentId, +1 more. Returns: documentId

create_snapshotCreate Document SnapshotA

Take a Scrivener-native snapshot of a document's current content, restorable from Scrivener's own Snapshots browser. Use this before rewriting a document to give the writer a native rollback point. Copies the live content into the project's Snapshots directory with a title and timestamp; does not modify the document. Requires an open project and a document that has content.

Inputs: documentId (required), title. Returns: date, title, documentId, snapshotId

delete_documentDelete DocumentA
DestructiveIdempotent

Move a document to the project trash. This is reversible: the document can be listed with list_trash and brought back with restore_document until the trash is emptied in Scrivener. Deleting an already-trashed document is a no-op. Requires an open project and a valid document id.

Inputs: documentId (required), force.

detect_open_projectDetect Open Scrivener ProjectA
Read-onlyIdempotent

Detect which Scrivener project the user currently has open in the desktop Scrivener app, so you can act on it without asking for a path. Use this when the user says "my project", "the project I have open", or gives a command with no project specified. Reads the open window names from the running app and resolves them to .scriv paths on disk; it does not open anything. If exactly one project is open, pass its path to open_project. macOS only right now (returns supported=false elsewhere; fall back to discover_projects). The first use may prompt macOS to allow the client app to control Scrivener.

Inputs: searchPath. Returns: count, running, supported, unresolved, +1 more

discover_connectionsDiscover ConnectionsA
Read-onlyIdempotent

Surface previously unrecorded relationships across the project by analyzing entity co-occurrence, returning candidate connections the story graph does not yet contain. Use this to find latent links to confirm with add_relationship; use find_relationships for known connections of a specific entity. Requires an open project with the relationship engine initialized.

Inputs: k. Returns: connections

discover_projectsDiscover Scrivener ProjectsA
Read-onlyIdempotent

Scan common locations (Documents, Desktop, and iCloud Mobile Documents) for Scrivener projects and return the paths of every .scriv folder found, searching up to three levels deep. Use this when the user refers to their project by name rather than path ("open my novel"): present the results and pass the chosen path to open_project. Does not open anything itself. Returns a list of project paths, or a message if none are found.

Inputs: searchPath. Returns: count, projects

enhance_contentEnhance ContentA
Read-only

Produce an AI-improved version of a document's text for a chosen goal (fix grammar, refine style, improve clarity, expand, summarize, or rework creatively) and return the suggested rewrite. This does NOT modify the document; review the result and call write_document to save it. Use analyze_document for a critique instead of a rewrite, or generate_content to create new text from a prompt. Calls an external AI model. Requires an open project.

Inputs: documentId (required), enhancementType (required), options.

export_projectExport Project To FileA
Read-onlyIdempotent

Export the whole project to a publishing/interchange format. Markdown, HTML, and JSON are returned inline; DOCX (agent/editor submission), EPUB (e-readers), and PDF (print/review) are written to a file on disk and the path is returned. Use this to produce a deliverable file; use compile_documents when you want the compiled text back in the response rather than written to disk. Requires an open project.

Inputs: format (required), options, outputPath. Returns: path, bytes, format, content, +1 more

find_mentionsFind Entity MentionsA
Read-onlyIdempotent

Find every occurrence of a specific name or term (a character, place, or keyword) across all documents, returning each hit with surrounding context and its document. Use this for exact "where does X appear" lookups; use search for relevance-ranked results or semantic_search for meaning-based matches. Returns up to 50 mentions. Requires an open project.

Inputs: entity (required), contextLength. Returns: mentions

find_orphaned_entitiesFind Orphaned EntitiesA
Read-onlyIdempotent

List registered characters and locations that no document actually mentions — entities added to the registry but with no textual presence, which are candidates for removal or for prose that still needs writing. Uses exact whole-word matching, no AI. Requires an open project.

Inputs: no named parameters. Returns: orphans, registrySize

find_relationshipsFind RelationshipsA
Read-onlyIdempotent

Query the story graph for entities related to a given entity, returning the connected entities and the relationship types that link them. This covers cross-references and discovered connections for a specific entity; use character_network for the whole-cast graph, or discover_connections to surface co-occurring entities project-wide. Requires an open project with the relationship engine initialized.

Inputs: entity (required), k, relation. Returns: relationships

generate_contentGenerate ContentA
Read-only

Generate new prose from a natural-language prompt and return the generated text, optionally steered by project context (a document, characters, or a target style) and a desired length. This creates fresh text and does not modify any document. Use enhance_content to improve existing text instead, or analyze_document to critique it. Calls an external AI model and requires an AI provider key (ANTHROPIC_API_KEY, OPENAI_API_KEY, or OPENROUTER_API_KEY); without one a placeholder is returned.

Inputs: prompt (required), length, context.

generate_marketing_materialsGenerate Marketing MaterialsA
Read-only

Generate a publishing/marketing artifact from the manuscript — a synopsis, query letter, pitch packet, elevator pitch, or book blurb — using the project content as context, and return the generated text. Use this for submission and pitching materials; use compile_documents to assemble the manuscript itself. Requires an open project with text content. Each call regenerates fresh output (not idempotent).

Inputs: materialType (required), length, targetAudience.

get_compile_settingsGet Compile & Taxonomy SettingsA
Read-onlyIdempotent

Return the project's compile-format definitions (from Settings/compile.xml) and its taxonomy: the named compile formats and their section-layout counts, the current output file type, label and status definitions (with colors), saved collections, and user-defined section types. Use this to discover what compile formats and metadata categories a project defines before compiling or organizing. Read-only; does not run a compile. If a project has never been compiled, hasCompileSettings is false and only the taxonomy is returned. Requires an open project (call open_project first).

Inputs: no named parameters. Returns: labels, options, statuses, collections, +4 more

get_document_infoGet Document InfoA
Read-onlyIdempotent

Return metadata for a single document without its body text: title, type, word count, synopsis, label, status, parent, and custom metadata. Use this to inspect a document or to read its word count cheaply; call read_document when you need the actual prose, or get_structure for the whole binder. Requires an open project and a valid document id.

Inputs: documentId (required). Returns: path, document, location, metadata

get_entity_referencesGet Entity ReferencesA
Read-onlyIdempotent

Trace the reference graph between documents and registered characters/locations, in either direction. Pass documentId to list the entities a document mentions (its cast and settings, with counts and offsets); pass entity (registry id or name) to list every document that mentions it, ranked by count. Provide exactly one of documentId or entity. Exact whole-word, case-insensitive matching against the registries — no AI. Returns empty when there are no matches or the registries are empty. Requires an open project.

Inputs: entity, documentId. Returns: entity, mentions, documents, documentId

get_job_statusGet Job StatusA
Read-onlyIdempotent

Look up the status and progress of a background job previously started by queue_document_analysis, queue_project_analysis, or another async tool. Returns the job state (queued, running, completed, failed), progress, and result when finished. Poll this after enqueuing work; use cancel_job to stop a job.

Inputs: jobId (required), jobType (required). Returns: error, state, result, progress

get_manuscript_briefingManuscript BriefingA
Read-onlyIdempotent

One "where am I?" snapshot of the whole manuscript: total word count against the project draft target (with percent-to-goal and deadline), document/folder counts, the per-status and per-label breakdown, and the longest and shortest documents. Use this right after open_project to orient before diving in, instead of stitching get_statistics, get_writing_goals, and get_compile_settings together. Read-only. Requires an open project.

Inputs: no named parameters. Returns: title, words, author, byLabel, +5 more

get_statisticsGet Project StatisticsA
Read-onlyIdempotent

Return project-wide statistics: total word and document counts, plus title and author. Use this for a quick project overview; use get_structure for the per-document breakdown or get_document_info for a single document. Requires an open project.

Inputs: detailed. Returns: title, author, metadata, totalWords, +14 more

get_structureGet Project StructureA
Read-onlyIdempotent

Return the binder hierarchy of the open project: its folders and documents in tree order, each with id, title, type, depth, and word count. Use this to understand the manuscript layout and to obtain the document ids that read_document, write_document, and the analysis tools require. By default returns a compact flat array of [id, title, type, depth, wordCount, hasChildren] tuples to save tokens; set summaryOnly for just project-level counts. Requires an open project (call open_project first).

Inputs: flat, folderId, maxDepth, summaryOnly, +1 more. Returns: summary, documents, structure

get_writing_goalsGet Writing GoalsA
Read-onlyIdempotent

List writing goals with computed progress: percent complete, words remaining, and whether each goal is on pace given its target date and the current project word count. Use when the writer asks how close they are to a goal or for a progress dashboard; not when defining a new goal (use set_writing_goal) or forecasting a finish date from writing velocity (use predict_completion). Related: set_writing_goal. Requires an open project and the project database.

Inputs: status. Returns: goals, projectWords

get_writing_preferencesGet Writing PreferencesA
Read-onlyIdempotent

Return the current author writing preferences plus feedback insights: how much feedback has been recorded, average satisfaction per operation, and non-binding suggestions for adjusting preferences. Use to review what is currently steering AI output, or to see whether recorded feedback points to a change. Related: set_writing_preferences, collect_feedback. Requires an open project.

Inputs: no named parameters. Returns: insights, preferences

list_skillsList SkillsA
Read-onlyIdempotent

List the available skills (tool groups) — project, documents, search, analysis, compilation, memory, relationships — with a description, the tool count, whether the skill is already active, and its tool names. Use this to discover capabilities, then call use_skill to activate a group whose tools you need. Takes no parameters.

Inputs: no named parameters. Returns: skills

list_snapshotsList Document SnapshotsA
Read-onlyIdempotent

List the snapshots Scrivener has saved of a project's documents (from the .scriv package's Snapshots/ directory). Pass documentId to list one document's snapshots, or omit it to list snapshots for every document that has any. Each entry gives the owning document id and title, a snapshotId (pass it to read_snapshot to get the text), the snapshot's title, and its date. Read-only. Returns an empty list when nothing has been snapshotted. Requires an open project (call open_project first).

Inputs: documentId. Returns: documents

list_trashList TrashA
Read-onlyIdempotent

List all documents currently in the project trash, with their ids and titles. Use this to see what can be brought back with restore_document, or to confirm a delete_document call. Requires an open project. Takes no parameters.

Inputs: no named parameters. Returns: items

move_documentMove DocumentA
Idempotent

Move a document or folder to a different parent folder in the binder, optionally at a specific position among the target folder's children. Changes only the location, not the content. Requires an open project, a valid document id, and a valid target folder id.

Inputs: documentId (required), targetFolderId (required), force, position.

open_projectOpen Scrivener ProjectA
Idempotent

Open a Scrivener project and make it the active project for this session. Every document, structure, search, and analysis tool operates on the project opened here, so call this first. Accepts the path to a .scriv folder or the .scrivx file inside it and resolves the project automatically. Returns the project title, author, and metadata. Opening a project closes any project already open. If you do not know the path, call discover_projects first.

Inputs: path (required).

queue_document_analysisQueue Document AnalysisA

Enqueue a background NLP analysis of one document (readability, entities, sentiment) and return a job id immediately without blocking. Poll the job with get_job_status and stop it with cancel_job. Use this for large documents where a synchronous analyze_document call would be slow; use analyze_document directly for quick, inline results.

Inputs: content (required), documentId (required), options. Returns: jobId

queue_project_analysisQueue Project AnalysisA

Enqueue a background batch analysis across many documents at once and return a job id immediately. Poll progress with get_job_status and stop it with cancel_job. Use this to analyze a whole manuscript or large set of documents; for a single document prefer queue_document_analysis or the synchronous analyze_document.

Inputs: documents (required), projectId (required), options. Returns: jobId

read_annotationsRead Document AnnotationsA
Read-onlyIdempotent

Return the inline comments and footnotes attached to a document, grouped by type. Use this to review editorial notes and references without reading the full body; use read_document for the prose itself. Requires an open project and a valid document id.

Inputs: documentId (required), includeComments, includeFootnotes. Returns: comments, footnotes

read_documentRead DocumentA
Read-onlyIdempotent

Read the text of a single document. By default returns plain text; set format to "formatted" to get rich text with styling and structure preserved. Use offset and limit to page through long documents by word range instead of returning the whole thing. Use get_document_info when you only need metadata, or search/semantic_search to find content across many documents. Requires an open project and a valid document id.

Inputs: documentId (required), limit, format, offset.

read_snapshotRead Document SnapshotA
Read-onlyIdempotent

Return the text of a single document snapshot. Pass the documentId and the snapshotId from list_snapshots. The snapshot's RTF is converted to plain text. Read-only; does not alter the document or restore the snapshot. Requires an open project (call open_project first).

Inputs: documentId (required), snapshotId (required). Returns: date, text, title, wordCount, +2 more

recallRecall Project FactsA
Read-onlyIdempotent

Read back the project's persistent memory: stored characters, world-building, plot threads, and style guide. Returns the requested store, or the full memory when memoryType is omitted or "all". Use remember to write new facts. Requires an open project.

Inputs: memoryType. Returns: memory

refresh_projectReload Project From DiskA
Idempotent

Reload the open project from disk, discarding the in-memory cache. Use this when the project has been changed by the Scrivener app or another process while open here, so that subsequent reads reflect the latest saved state. Requires an open project. Takes no parameters.

Inputs: no named parameters.

rememberRemember Project FactsA

Store or update a fact in the project's persistent memory so later tools and sessions stay consistent: a character profile, world-building detail, plot thread, or style-guide entry. Pass an id inside data to update an existing entry, or omit it to add a new one. Use recall to read memory back. Requires an open project.

Inputs: data (required), memoryType (required).

restore_documentRestore Document From TrashA
Idempotent

Restore a trashed document back into the binder, optionally into a specific target folder (otherwise it returns to a default location). Use list_trash to find the document id first. This is the inverse of delete_document. Requires an open project and a valid document id.

Inputs: documentId (required), force, targetFolderId.

set_writing_goalSet Writing GoalA
Destructive

Create or replace the active word-count goal for a cadence (daily, weekly, or whole project), optionally with a target date. Setting a goal of a type that already has an active goal updates that goal in place rather than stacking duplicates. Use when the writer commits to a target ("write 1000 words a day", "finish an 80k novel by December"); not when you only want to read current progress (use get_writing_goals) or log a finished session. Related: get_writing_goals, predict_completion. Requires the project database.

Inputs: type (required), targetWords (required), targetDate.

set_writing_preferencesSet Writing PreferencesA
Idempotent

Set the author writing preferences that shape AI writing output (enhance_content and other generative tools). Preferences are injected into the AI prompt, so changes take effect on the next enhancement. All fields are optional and merge into the existing profile. Use when the writer states a preferred tone, complexity, length, point of view, style guide, or a custom instruction. Requires an open project (preferences persist in the project database).

Inputs: tone, length, enabled, complexity, +3 more.

suggest_connectionsSuggest Missing ConnectionsA
Read-onlyIdempotent

Suggest characters or locations a document might be missing: entities it does not mention but that frequently co-occur — in other documents — with the entities it does mention. Deterministic co-occurrence inference (no AI), ranked by how many of the document’s entities each suggestion travels with. Use this to spot a scene that omits a character who usually appears with its cast. Returns empty when the document has no known entities. Requires an open project.

Inputs: documentId (required). Returns: documentId, suggestions

suggest_improvementsSuggest ImprovementsA
Read-only

Generate AI writing suggestions for a prompt or a specific document — ideas for revision, next steps, or alternatives. Returns suggestion text. Optionally grounds the suggestions in a document's content. Use this for generative "how could this be better" help; use analyze_document for structured metrics or check_consistency to find contradictions.

Inputs: prompt (required), async, documentId, useContext.

update_documentUpdate Document Title & MetadataA
Idempotent

Update a document's title and/or its metadata (synopsis, notes, label, status, and custom fields) in a single call. Pass only the fields you want to change; omitted fields are left untouched. To change the body text use write_document; to move it use move_document. Requires an open project and a valid document id.

Inputs: documentId (required), force, label, notes, +4 more.

use_skillActivate SkillA
Idempotent

Activate a skill so its tools become available to call. Returns the activated skill's tool names and their schemas; clients that support tools/list_changed will also see the new tools appear automatically. Call list_skills first to see the available skill names. Tools are progressively disclosed, so activate the skill you need before using its tools (most tools are pre-activated by default).

Inputs: name (required).

verify_project_integrityVerify Project IntegrityA
Read-onlyIdempotent

Scan the open project for structural problems and return a read-only report: binder entries with missing, malformed, or duplicate UUIDs, entries missing their type, and text documents whose backing content is unreadable or empty. Use when a project looks corrupted, after manual edits to the .scrivx file, or before a bulk operation; not when you just want the document tree (use get_structure) or a single document (use get_document_info). This tool only detects problems and never repairs them. related: get_structure, get_document_info. Requires an open project.

Inputs: includeTrash. Returns: ok, issues, checked, summary

write_documentWrite DocumentA
Idempotent

Replace a document's text with new content, preserving the surrounding Scrivener formatting the edit did not touch (stylesheet, styles, images, footnotes) byte-for-byte. The result reports whether formatting was fully preserved; when an edit would drop non-round-trippable content it takes a Scrivener snapshot first (restorable in Scrivener) and says so. To change only the title or metadata use update_document; to add a new document use create_document. Requires an open project and a valid document id.

Inputs: content (required), documentId (required), force.

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 57 tools

    Disambiguation3/5

    Most tools have clearly differentiated purposes, especially around document CRUD, snapshots, search modes, and export. However, the cluster of analysis and feedback tools—analyze_document, analyze_writing_style, check_consistency, check_plot_consistency, and suggest_improvements—has meaningful overlap and requires careful description-reading to select correctly.

    Naming Consistency4/5

    The naming convention is overwhelmingly verb_noun snake_case with consistent prefixes like get_, list_, create_, read_, write_, and set_. A few bare-verb or noun-style exceptions such as search, remember, recall, and character_network deviate slightly, preventing a perfect score.

    Tool Count1/5

    At 57 tools, this server is in the extreme mismatch range and presents a very heavy namespace for agents to navigate. The skills-based progressive disclosure mitigates discovery cost, but it does not reduce the total surface, and many analysis and generation tools could likely be consolidated.

    Completeness5/5

    The tool surface covers the full Scrivener workflow: project discovery and session lifecycle, document CRUD and trash recovery, snapshots, metadata, multiple search modes, AI analysis and generation, goals, memory, relationship graphs, compile/export, and background jobs. There are no obvious dead ends for the stated domain.

    Maintenance

    ActivityActive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables Claude Desktop to search and query personal document collections (PDF, Word, Markdown, text) using semantic search and conversational AI with full context preservation across exchanges.
      MIT
    • A
      license
      B
      quality
      Not graded
      maintenance
      Enables AI-powered knowledge management and creative support by connecting Scrapbox data to Claude. Supports advanced search, relationship analysis between pages, theme extraction, and literary analysis of personal knowledge bases.
      3
      2
      -
    • A
      license
      Not graded
      quality
      D
      maintenance
      Local MCP server that exposes Scrivener projects to AI clients, enabling project creation, binder navigation, document read/write, and metadata updates without opening Scrivener.
      275 npm
      1
      AGPL 3.0