ScrivenerBLOCK
The definitive MCP server for Scrivener — connect your novels, screenplays, and manuscripts to Claude, ChatGPT, and any AI assistant. 53 tools: document management, writing analysis, content enhancement, offline semantic search, and character/plot tracking.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
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.
[](https://github.com/writerslogic/scrivener-mcp/actions/workflows/ci.yml) [](https://github.com/writerslogic/scrivener-mcp/actions/workflows/codeql.yml) [](https://securityscorecards.dev/viewer/?uri=github.com/writerslogic/scrivener-mcp) [](https://www.npmjs.com/package/scrivener-mcp) [](https://github.com/writerslogic/scrivener-mcp/blob/main/LICENSE)
Install · What You Can Do · All Tools · Guides · Contributing
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
e803c52b9502OBSERVED · 2026-10-08Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add scrivener-mcp -- npx -y [email protected]
Exposed tools (81)
59 read · 20 write · 2 destructive. Blast radius: 2 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
add_relationship | write | Record a typed, directed relationship between two story entities (e.g. a character |
advanced | read | Async job queue and batch operations |
analysis | read | Analyze writing quality, enhance prose, check consistency, track goals, tune writing preferences |
analyze_craft_local | write | Run local, deterministic prose-craft analysis on a document: readability grade levels, |
analyze_dialogue_tags_local | read | Audit dialogue in one document: the dialogue-to-narration ratio and every quoted line with |
analyze_document | read | Analyze the writing quality of a single document and return a summary of readability, pacing, |
analyze_foreshadowing_local | write | Scan the whole manuscript, in binder order, for setup/payoff pairs: recurring terms |
analyze_opening_local | read | Analyze a document |
analyze_rhythm_local | read | Measure sentence-length flow in one document: the distribution of sentence lengths, a |
analyze_writing_style | read | Analyze the prose style of one or more text samples — sentence variety, tone, voice, |
build_vector_store | read | Build search index |
cancel_job | read | Cancel a queued or running background job by its type and id. Returns whether the |
character_network | read | THE default tool for |
check_consistency | read | Scan the whole project for continuity problems and return the issues found: character |
check_continuity_local | write | Scan the whole manuscript, in binder order, for local-analyzer continuity signals: a |
check_plot_consistency | write | Scan a set of documents for plot-level inconsistencies — timeline conflicts, contradicted |
check_style_local | write | Line-edit one document with deterministic rules: -ly adverbs, filter words (felt, saw, |
close_project | write | Close the currently open project, flush any pending memory/auto-save state, and clear the |
collect_feedback | read | Record feedback on an AI operation (e.g. |
compare_snapshot | read | Compare a document snapshot against the current document text, or against another snapshot |
compilation | read | Compile manuscripts, export, statistics |
compile_documents | read | Compile the project |
create_document | write | Create a new text document or folder in the binder and return its new id. Optionally set the |
create_snapshot | write | Take a Scrivener-native snapshot of a document |
delete_document | destructive | Move a document to the project trash. This is reversible: the document can be listed with |
detect_open_project | read | Detect which Scrivener project the user currently has open in the desktop Scrivener app, so |
discover_connections | read | Surface previously unrecorded relationships across the project by analyzing entity |
discover_projects | read | Scan common locations (Documents, Desktop, and iCloud Mobile Documents) for Scrivener |
documents | destructive | Read, write, create, delete, move, and rename documents |
enhance_content | read | Produce an AI-improved version of a document |
export_project | read | Export the whole project to a publishing/interchange format. Markdown, HTML, and JSON |
find_analogies | read | Find analogies (A:B :: C:?) |
find_mentions | read | Find every occurrence of a specific name or term (a character, place, or keyword) across all |
find_orphaned_entities | read | List registered characters and locations that no document actually mentions — entities added |
find_relationships | read | Query the story graph for entities related to a given entity, returning the connected |
find_repetition_local | read | Find echoes (the same word reappearing within a window of words) and repeated multi-word |
generate_content | read | Generate new prose from a natural-language prompt and return the generated text, optionally |
generate_marketing_materials | read | Generate a publishing/marketing artifact from the manuscript — a synopsis, query letter, |
get_compile_settings | read | Return the project |
get_document_info | read | Return metadata for a single document without its body text: title, type, word count, |
get_entity_references | read | Trace the reference graph between documents and registered characters/locations, in either |
get_job_status | read | Look up the status and progress of a background job previously started by |
get_manuscript_briefing | read | One |
get_queue_stats | read | Get job queue statistics |
get_statistics | read | Return project-wide statistics: total word and document counts, plus title and author. Use |
get_structure | read | Return the binder hierarchy of the open project: its folders and documents in tree order, |
get_writing_goals | read | List writing goals with computed progress: percent complete, words remaining, and whether each |
get_writing_preferences | read | Return the current author writing preferences plus feedback insights: how much feedback has |
hhm_dream | read | Creative concept recombination |
list_skills | read | List the available skills (tool groups) — project, documents, search, analysis, |
list_snapshots | read | List the snapshots Scrivener has saved of a project |
list_trash | read | List all documents currently in the project trash, with their ids and titles. Use this to |
manuscript_style_report_local | write | Run the bluepencil report over every manuscript document in binder order and tabulate per- |
measure_voice_drift_local | read | Measure how a character |
memory | read | Store and recall persistent project facts (characters, world, plot, style) |
move_document | write | Move a document or folder to a different parent folder in the binder, optionally at a specific |
multi_agent_analysis | read | Multi-agent analysis |
open_project | read | Open a Scrivener project and make it the active project for this session. Every document, |
project | write | Open, browse, save, close, and verify Scrivener projects |
queue_document_analysis | read | Enqueue a background NLP analysis of one document (readability, entities, sentiment) and |
queue_project_analysis | read | Enqueue a background batch analysis across many documents at once and return a job id |
read_annotations | read | Return the inline comments and footnotes attached to a document, grouped by type. Use this |
read_document | write | Read the text of a single document. By default returns plain text; set format to |
read_snapshot | read | Return the text of a single document snapshot. Pass the documentId and the snapshotId from |
recall | read | Read back the project |
refresh_project | read | Reload the open project from disk, discarding the in-memory cache. Use this when the project |
relationships | read | Entity relationships, character networks, story graph |
remember | write | Store or update a fact in the project |
restore_document | read | Restore a trashed document back into the binder, optionally into a specific target folder |
search | read | Search the open project and return matching documents with relevance-ranked snippets. By |
semantic_search | read | Find passages by meaning rather than exact words, using the local HMS index, and |
set_writing_goal | write | Create or replace the active word-count goal for a cadence (daily, weekly, or whole project), |
set_writing_preferences | write | Set the author writing preferences that shape AI writing output (enhance_content and other |
store_chapter_order | write | Store chapter sequence |
suggest_connections | read | Suggest characters or locations a document might be missing: entities it does not mention |
suggest_improvements | read | Generate AI writing suggestions for a prompt or a specific document — ideas for revision, |
sync_to_neo4j | write | Sync relationships to Neo4j |
update_document | write | Update a document |
use_skill | read | Activate a skill so its tools become available to call. Returns the activated skill |
verify_project_integrity | read | Scan the open project for structural problems and return a read-only report: binder entries |
write_document | write | Replace a document |
Trust audit
BLOCKgrade D · trust 69/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | WARN |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (7 observation(s))
- Network
- declared (6 observation(s))
- Shell
- declared (1 observation(s))
- Dependencies
- not all pinned
- Secrets in source
- none-found
Findings (18)
const child = exec(command, (error, stdout, stderr) => {db
delete_document, documents
binder.autosave
.bestpractices.json
.prettierignore
.prettierrc.json
return crypto.createHash('md5').update(combined).digest('hex');const hash = crypto.createHash('sha1').update(bytes).digest('hex');const hash = crypto.createHash('md5').update(seed).digest('hex');import { getLogger } from '../../core/logger.js';import { splitIntoSentences } from '../../utils/text-metrics.js';import { getWritingTextMetrics as getTextMetrics } from '../../utils/text-metrics.js';import { simdTextProcessor } from '../../utils/simd-text-processor.js';import { generateHash } from '../../utils/common.js';@anthropic-ai/sdk, @modelcontextprotocol/sdk, better-sqlite3, bluepencil-node, bullmq, chalk, cheerio, compromise
Scrivener projects can be massive -- hundreds of documents, deeply nested binders, and chapters exceeding 10,000 words. Without optimization, a single tool call could consume the entire context window
Core read/write/search tools work without API keys. See [Getting Started](./getting-started.md#environment-variables) for the full list.
Gates applied: no_behavioural_pass.
e803c52b9502full audit observations/trust-audit/mcp-server/writerslogic__scrivener-1.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-08 | e803c52b9502 | BLOCK | D | 69 | first audit |
Questions
What is the Scrivener MCP server?
The definitive MCP server for Scrivener — connect your novels, screenplays, and manuscripts to Claude, ChatGPT, and any AI assistant. 53 tools: document management, writing analysis, content enhancement, offline semantic search, and character/plot tracking.
What tools does Scrivener expose?
81 in total: 59 read-only, 20 that write, and 2 that can delete or overwrite (delete_document, documents). Every one is listed on this page with its risk.
Is Scrivener safe to connect to an agent?
No — not without reading the findings first. The audit graded it D (69/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 2 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does Scrivener need?
It reads ANTHROPIC_API_KEY, KEYDB_URL, NEO4J_PASSWORD, OPENAI_API_KEY, OPENROUTER_API_KEY and SCRIVENER_DISABLE_KEY_DISCOVERY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does Scrivener run?
It speaks stdio, so it runs as a local process your client starts. It is published on npm as scrivener-mcp at 0.12.0.
How current is this page?
The grade is for one exact copy of the source (e803c52b9502), read on 2026-10-08. The repository is watched and re-audited when it changes.