loading…
Search for a command to run...
loading…
Enables Claude AI to seamlessly interact with Scrivener projects for document management, AI-powered content analysis, and advanced writing assistance.
Enables Claude AI to seamlessly interact with Scrivener projects for document management, AI-powered content analysis, and advanced writing assistance.
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:
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
.scriv projectsThe MCP server provides 75+ powerful tools for comprehensive Scrivener integration:
open_project(path) - Open a Scrivener projectget_structure(options?) - Get the project's hierarchical structuremaxDepth (limit tree depth), folderId (get specific folder), includeTrash (include trash), summaryOnly (return counts only)get_document_info(documentId) - Get document metadata with full parent hierarchy and locationget_project_metadata() - Get project-level metadataread_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 annotationscreate_document(parentId?, title, type?) - Create new document or folderdelete_document(documentId) - Delete document or foldermove_document(documentId, newParentId?) - Move document to new locationupdate_metadata(documentId, metadata) - Update document metadatasearch_content(query, options?) - Search across all documents (excludes trash)get_word_count(documentId?) - Get word/character countslist_trash() - List all documents in the trash foldersearch_trash(query, options?) - Search only within trashed documentsrecover_document(documentId, targetParentId?) - Recover document from trashanalyze_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 documentsenhance_content(documentId, enhancementType, options?) - Apply AI improvementseliminate-filter-words, strengthen-verbs, vary-sentences, add-sensory-details, show-dont-tell, improve-flow, enhance-descriptions, strengthen-dialogue, fix-pacing, expand, condense, rewritesave_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 dataget_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 oncesemantic_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 metricsget_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 databasesThis MCP server includes comprehensive RTF (Rich Text Format) support specifically designed for Scrivener's document format:
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.scrivener-databases/scrivener.db within each project.ai-memory folders for quick access// 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:
npm run dev # Development mode with hot reload
npm run build # Build TypeScript
npm run lint # ESLint
npm run typecheck # TypeScript checking
MIT © David Condrey
Contributions are welcome! Please feel free to submit a Pull Request.
If you find this project helpful, consider:
Выполни в терминале:
claude mcp add scrivener-mcp-server -- npx Безопасность
Низкий рискАвтоматическая эвристика по публичным данным — не гарантия безопасности.