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
.scrivprojects - 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.dbwithin 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-memoryfolders 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