A Model Context Protocol (MCP) server for seamless Scrivener integration with Claude AI
Features β’ Installation β’ Usage β’ API β’ Contributing
A powerful Model Context Protocol (MCP) server that enables Claude AI to seamlessly interact with Scrivener projects. This server provides comprehensive document management, AI-powered content analysis, and advanced writing assistance capabilities - all without requiring external services like Redis.
npm install -g scrivener-mcp
β¨ Features:
- Automatic Claude Desktop configuration - Just restart Claude Desktop after installation
- No Redis or external services required - Built-in embedded queue system
- Zero configuration - Works out of the box
- AI providers optional - Core features work without API keys
If automatic setup didn't work, you can manually configure:
# Run the setup script
npx scrivener-mcp setup
# Or manually add to claude_desktop_config.json:
{
"mcpServers": {
"scrivener": {
"command": "npx",
"args": ["scrivener-mcp"]
}
}
}
# Remove the package and configuration
npm uninstall -g scrivener-mcp
- Project Management: Open and manage Scrivener
.scriv
projects - Document CRUD: Read, write, create, delete, and move documents and folders
- Metadata Management: Update document titles, keywords, and custom metadata
- Project Structure: Navigate and manipulate the hierarchical binder structure
- Full RTF Parsing: Complete support for Scrivener's RTF document format
- Formatted Content: Preserve and manipulate bold, italic, underline, and other formatting
- Scrivener Annotations: Extract and preserve Scrivener-specific annotations and comments
- Unicode Support: Handle international characters and special symbols
- Deep Writing Analysis: Comprehensive metrics including Flesch scores, readability, pacing
- Style Assessment: Sentence variety, vocabulary complexity, adverb usage analysis
- Quality Indicators: Detection of clichΓ©s, filter words, repetitiveness
- Emotional Analysis: Track emotional arcs and tension levels
- Smart Suggestions: Actionable recommendations for improvement
- Legacy Analysis: Basic readability metrics and passive voice detection
- Project Memory: Persistent storage within each Scrivener project
- Character Profiles: Track character details, relationships, and arcs
- Plot Threads: Manage multiple storylines and their progression
- Style Guide: Maintain consistent tone, voice, POV, and tense
- Writing Statistics: Track progress, word counts, and productivity
- Auto-save: Automatic backups with version history
- Smart Editing: 12+ enhancement types for improving prose
- Filter Word Elimination: Remove unnecessary qualifiers
- Verb Strengthening: Replace weak verbs with powerful alternatives
- Sentence Variation: Improve rhythm and flow
- Sensory Enhancement: Add vivid sensory details
- Show Don't Tell: Convert telling to showing
- Pacing Control: Adjust story tempo
- Content Expansion/Condensing: Meet word count targets
- Multi-document Compilation: Combine multiple documents into single output
- Format Preservation: Option to maintain or strip RTF formatting
- Custom Separators: Configure how documents are joined
- Semantic Search: Find documents by meaning, not just keywords
- Analogical Reasoning: Discover relationships like "protagonist:hero :: antagonist:?"
- Auto-Memorization: Documents automatically stored in 10,000-dimensional semantic space
- GPU Acceleration: WebGPU-powered operations with CPU fallback
- Multi-modal Learning: Text, documents, relationships, and temporal sequences
- Creative Combinations: Dream mode generates novel concept associations
- Memory Evolution: Background learning and concept refinement
- Consistency Checking: Detect contradictory information across documents
- SIMD Optimization: Vectorized operations for maximum performance
- Vector Caching: LRU cache system for frequently accessed patterns
The MCP server provides 75+ powerful tools for comprehensive Scrivener integration:
open_project(path)
- Open a Scrivener projectget_structure(options?)
- Get the project's hierarchical structure- Options:
maxDepth
(limit tree depth),folderId
(get specific folder),includeTrash
(include trash),summaryOnly
(return counts only)
- Options:
get_document_info(documentId)
- Get document metadata with full parent hierarchy and locationget_project_metadata()
- Get project-level metadata
read_document(documentId)
- Read plain text contentread_document_formatted(documentId)
- Read with RTF formatting preservedwrite_document(documentId, content)
- Write content to documentget_document_annotations(documentId)
- Get Scrivener annotations
create_document(parentId?, title, type?)
- Create new document or folderdelete_document(documentId)
- Delete document or foldermove_document(documentId, newParentId?)
- Move document to new location
update_metadata(documentId, metadata)
- Update document metadatasearch_content(query, options?)
- Search across all documents (excludes trash)get_word_count(documentId?)
- Get word/character counts
list_trash()
- List all documents in the trash foldersearch_trash(query, options?)
- Search only within trashed documentsrecover_document(documentId, targetParentId?)
- Recover document from trash
analyze_document(documentId)
- Deep AI-powered content analysisdeep_analyze_content(documentId)
- Comprehensive writing metrics and suggestionscritique_document(documentId, focusAreas?)
- Get constructive feedbackcompile_documents(documentIds, separator?, preserveFormatting?)
- Compile multiple documents
enhance_content(documentId, enhancementType, options?)
- Apply AI improvements- 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
- Enhancement types:
save_character_profile(name, role, description?, traits?, arc?)
- Store character dataget_character_profiles()
- Retrieve all character profilesupdate_style_guide(tone?, voice?, pov?, tense?)
- Set writing preferencesget_style_guide()
- Get current style guidesave_plot_thread(name, description, status?, documents?)
- Track plot linesget_plot_threads()
- View all plot threadsget_writing_stats()
- Get project statisticsexport_project_memory()
- Export complete memory data
get_all_documents(includeTrash?)
- Get flat list of all documentssave_project()
- Save any pending changes to the projectis_project_modified()
- Check if project has unsaved changesread_document_rtf(documentId)
- Read document with RTF formatting preservedupdate_document_context(documentId, summary?, themes?, pacing?)
- Update document memory contextadd_custom_context(key, value)
- Add custom context to project memoryget_custom_context(key?)
- Get custom context from project memoryupdate_writing_session(wordsWritten, duration?)
- Update writing session statisticsextract_research_data(html, keywords?)
- Extract research data from web contentimport_memory(memoryData)
- Import project memory from exported dataupdate_document_synopsis_notes(documentId, synopsis?, notes?)
- Update synopsis and/or notes for a documentbatch_update_synopsis_notes(updates)
- Update synopsis and/or notes for multiple documents at once
semantic_search(query, k?, threshold?)
- Find documents by semantic meaningfind_analogies(a, b, c)
- Discover analogical relationships (A:B :: C:?)hhm/memorize/text(text, id?)
- Store text in semantic memoryhhm/memorize/document(document)
- Store document with structurehhm/memorize/relationship(subject, relation, object)
- Store semantic relationshipshhm/query/text(text, k?)
- Query memory with texthhm/query/analogy(a, b, c)
- Find analogical completionshhm/concepts/generate()
- Generate novel concept combinationshhm/dream(duration?)
- Enter creative recombination modehhm/consistency/check(memoryIds)
- Verify memory consistencyhhm/stats()
- Get HHM system statisticshhm/benchmark/run(dimensions?)
- Run performance benchmarkshhm/benchmark/gpu()
- Test GPU acceleration capabilitieshhm/cache/clear()
- Clear vector cachehhm/cache/stats()
- Get cache performance metrics
get_database_status()
- Get status of SQLite and Neo4j databasesquery_database(query, params?)
- Execute SELECT queries on SQLite databaseget_writing_statistics(days?)
- Get writing statistics for specified periodrecord_writing_session(wordsWritten, durationMinutes?, documentsWorkedOn?, notes?)
- Record a writing sessionanalyze_story_structure()
- Analyze document flow, character arcs, and themes using Neo4jfind_character_relationships(characterId)
- Find all relationships for a charactercreate_relationship(fromId, fromType, toId, toType, relationshipType, properties?)
- Create relationships between entitiesget_content_analysis_history(documentId, analysisType?)
- Get historical analysis databackup_databases(backupPath?)
- Create backup of project databases
This MCP server includes comprehensive RTF (Rich Text Format) support specifically designed for Scrivener's document format:
- RTF Parsing: Converts RTF to structured content with formatting preserved
- RTF Generation: Creates valid RTF from plain or formatted text
- Scrivener Extensions: Handles Scrivener-specific RTF extensions and annotations
- Character Encoding: Properly handles Unicode and special characters
- Metadata Extraction: Extracts document metadata from RTF info groups
ScrivenerProject
- Main class for project operationsRTFHandler
- Comprehensive RTF parsing and generationDatabaseService
- Manages SQLite and Neo4j database operationsMemoryManager
- Persistent project memory and context storageContentAnalyzer
- Deep writing analysis and metricsContentEnhancer
- AI-powered content improvement engineHolographicMemorySystem
- 10,000-dimensional semantic memory with GPU acceleration- MCP Server - Tool definitions and request handling
- SQLite Database - Stored in
.scrivener-databases/scrivener.db
within each project- Documents, characters, plot threads, themes, writing sessions
- Content analysis history and relationships
- Neo4j Graph Database - Optional graph database for relationship analysis
- Document flow, character networks, theme progression
- Falls back gracefully if not available
- Memory Files - Stored in
.ai-memory
folders for quick access - Automatic backups maintain history and data integrity
- All data persists between sessions and travels with the project
// Open a project
open_project("/path/to/MyNovel.scriv")
// Get project structure
get_structure()
// Read a document
read_document("UUID-OF-DOCUMENT")
// Analyze content
deep_analyze_content("UUID-OF-DOCUMENT")
// Apply enhancements
enhance_content("UUID-OF-DOCUMENT", "strengthen-verbs")
// Update synopsis for a single document
update_document_synopsis_notes("UUID-OF-CHAPTER", {
synopsis: "Elizabeth meets Mr. Darcy at the assembly ball and takes an instant dislike to him.",
notes: "Important first impression scene - sets up central conflict"
})
// Batch update multiple documents
batch_update_synopsis_notes([
{
documentId: "UUID-OF-CHAPTER-1",
synopsis: "Introduction to Elizabeth and her family",
notes: "Character establishment chapter"
},
{
documentId: "UUID-OF-CHAPTER-2",
synopsis: "The Netherfield ball",
notes: "Major social event - introduces Bingley and Darcy"
}
])
// Check database status
get_database_status()
// Query documents with custom SQL
query_database("SELECT title, word_count FROM documents WHERE word_count > 1000")
// Record a writing session
record_writing_session({
wordsWritten: 1250,
durationMinutes: 45,
documentsWorkedOn: ["UUID-1", "UUID-2"],
notes: "Productive morning session"
})
// Get writing statistics
get_writing_statistics(30) // Last 30 days
// Analyze story structure (requires Neo4j)
analyze_story_structure()
// Find character relationships in graph
find_character_relationships("CHARACTER-UUID")
// Create document relationship
create_relationship(
"CHAPTER-1-UUID", "document",
"CHAPTER-2-UUID", "document",
"FOLLOWS"
)
// Save a character profile
save_character_profile({
name: "Elizabeth Bennet",
role: "protagonist",
description: "Intelligent and witty young woman",
traits: ["independent", "prejudiced", "romantic"],
arc: "Overcomes initial prejudice to find true love"
})
// Retrieve all characters
get_character_profiles()
// Set style guide
update_style_guide({
tone: ["witty", "romantic", "formal"],
voice: "Jane Austen-esque",
pov: "third-limited",
tense: "past"
})
// Apply style-aware enhancements
enhance_content("UUID", "match-style")
// Get comprehensive analysis
const analysis = deep_analyze_content("UUID")
// Returns metrics, suggestions, quality indicators, pacing analysis
// Get focused critique
critique_document("UUID", ["pacing", "dialogue"])
The server includes robust error handling for:
- Invalid project paths
- Missing documents
- RTF parsing failures
- File system errors
- Malformed project structures
- Memory corruption recovery
npm run dev # Development mode with hot reload
npm run build # Build TypeScript
npm run lint # ESLint
npm run typecheck # TypeScript checking
- Node.js 18+
- TypeScript 5.0+
- Valid Scrivener 3 project files
MIT Β© David Condrey
Contributions are welcome! Please feel free to submit a Pull Request.
If you find this project helpful, consider:
- β Starring the repository
- π Reporting bugs or requesting features
- β Buying me a coffee
- π£ Sharing with other Scrivener users
- Holographic Memory Guide - Complete guide to the new HHM system