scrivener-mcp
Local MCP server that exposes Scrivener projects to AI clients, enabling project creation, binder navigation, document read/write, and metadata updates without opening Scrivener.
README
scrivener-mcp
A local MCP server that exposes your Scrivener projects to Claude (or any MCP-compatible client). Create new projects from scratch, navigate the binder, read and write document content, and update metadata — all without opening Scrivener.
Requirements
- Node.js 18 or later
- Scrivener 3 on macOS (
.scrivpackages)
Setup
cd scrivener-mcp
npm install
Environment variables
| Variable | Description |
|---|---|
SCRIV_DIR |
Path to a directory containing .scriv packages. Enables list_projects, open_project, and create_project. |
SCRIV_PATH |
Path to a single .scriv package. Opens it immediately on startup. |
SCRIV_PLATFORM |
mac (default) or windows. Controls the RTF format used when writing document content. |
At least one of SCRIV_DIR or SCRIV_PATH must be set. Both can be set simultaneously.
Running manually
# Multi-project mode (recommended)
SCRIV_DIR="/path/to/ScrivenerProjects" npm start
# Single-project mode
SCRIV_PATH="/path/to/MyProject.scriv" npm start
Configuring Claude Desktop
Edit the Claude Desktop config file:
- Mac:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Mac:
{
"mcpServers": {
"scrivener": {
"command": "node",
"args": ["/absolute/path/to/scrivener-mcp/src/index.js"],
"env": {
"SCRIV_DIR": "/Users/you/Writing/ScrivenerProjects"
}
}
}
}
Windows:
{
"mcpServers": {
"scrivener": {
"command": "node",
"args": ["C:\\path\\to\\scrivener-mcp\\src\\index.js"],
"env": {
"SCRIV_DIR": "C:\\Users\\you\\Documents\\ScrivenerProjects",
"SCRIV_PLATFORM": "windows"
}
}
}
}
Restart Claude Desktop after saving.
Available tools
Project management
| Tool | Description |
|---|---|
list_projects |
Lists all .scriv packages in SCRIV_DIR. |
open_project(name) |
Opens a project by name, making it active for all document tools. |
create_project(name, ...) |
Creates a new project and opens it. See below. |
Document tools (require an open project)
| Tool | Description |
|---|---|
get_outline |
Returns the full binder as a nested tree with synopses, labels, and statuses. The best starting point for understanding and working on a project's structure. |
list_documents |
Returns the binder as a flat list with depth indicators. Useful for getting UUIDs. |
get_document(uuid) |
Returns metadata and plain text content for a single document. |
add_document(...) |
Adds a new document or folder to the binder. |
move_document(uuid, newParentUuid) |
Moves a binder item to a different parent folder. |
write_document(uuid, content) |
Writes new plain text content to a document (stored as RTF). |
update_metadata(uuid, changes) |
Updates title, synopsis, label, status, or compile inclusion. |
search_documents(query) |
Searches titles and synopses across the binder. |
Creating a project
create_project accepts a full binder structure so Claude can scaffold an entire project from an idea in one call.
Parameters
| Parameter | Type | Description |
|---|---|---|
name |
string | Project name (becomes the .scriv package name). |
labels |
array | Label definitions. Each is a string or {name, color}. Colors: red, orange, yellow, green, blue, purple, pink, cyan. |
statuses |
array | Status names. Defaults to: To Do, In Progress, First Draft, Revised Draft, Done. |
manuscript |
array | Binder items in the Draft (Manuscript) folder. |
research |
array | Binder items in the Research folder. |
Binder item structure
{
"title": "Chapter 1",
"type": "Folder",
"synopsis": "Alice finds the letter and confronts Bob.",
"content": "Optional initial body text (Text items only).",
"label": "POV: Alice",
"status": "To Do",
"includeInCompile": true,
"children": [...]
}
type:"Folder"for containers (acts, parts, chapters);"Text"for documents (scenes, notes). Defaults to"Text".synopsis: The virtual index card text — appears in Scrivener's corkboard and outliner views. Write a 1–3 sentence summary of what happens or what this item covers.labelandstatusmust match names defined in the project'slabelsandstatusesarrays.
Example
{
"name": "My Novel",
"labels": [
{ "name": "POV: Alice", "color": "blue" },
{ "name": "POV: Bob", "color": "red" }
],
"statuses": ["To Do", "First Draft", "Revised", "Done"],
"manuscript": [
{
"title": "Act One",
"type": "Folder",
"synopsis": "Alice discovers the conspiracy.",
"children": [
{
"title": "Chapter 1",
"type": "Folder",
"synopsis": "A normal Tuesday turns strange.",
"children": [
{
"title": "The Letter",
"type": "Text",
"synopsis": "Alice finds an unsigned letter in her mailbox.",
"label": "POV: Alice",
"status": "To Do"
}
]
}
]
}
],
"research": [
{
"title": "Characters",
"type": "Folder",
"children": [
{
"title": "Alice",
"type": "Text",
"synopsis": "Protagonist. Mid-30s journalist, sceptical but curious."
}
]
}
]
}
Collaborative workflow
The intended pattern is to work with Claude on the structure and content of a project together, using Scrivener's own organisational features:
- Start with
get_outline— Claude reads the full nested structure with synopses before suggesting or making any changes. This is how it understands the story shape. - Build structure with
add_document— Add scenes, chapters, acts, or research notes at any point in the hierarchy. Always include a synopsis; it is what appears on the index card in Scrivener's corkboard. - Reorganise with
move_document— Move items between parents to restructure the narrative without losing any content or metadata. - Write prose with
write_document— Once structure is agreed, populate scenes with content. - Track progress with
update_metadata— Update labels (e.g. POV, scene type) and statuses (e.g. First Draft, Revised) as work progresses.
Notes
- Close Scrivener before writing.
write_document,update_metadata,add_document, andmove_documentall modify project files directly. If Scrivener has the project open, it will overwrite changes on its next auto-save. - Reload after editing in Scrivener. Call
open_projectagain to reload a project that was modified in Scrivener while the server was running. write_documentgenerates minimal RTF compatible with Scrivener 3. Non-ASCII characters are Unicode-escaped.- Label and status IDs are discoverable via
list_documents—labelId/statusIdare raw IDs,label/statusare the resolved names.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。