io.github.writerslogic/scrivener-mcp
NPM · SCRIVENER-MCP · SCANNED SEP 21
MCP server for Scrivener: read, write, analyze, and search your manuscripts with AI assistants.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security91
- No malware found by supply-chain analysis.Pass
- Known CVEs were checked across the 286 of 287 dependencies we could resolve, so this covers what we could see, not the whole tree.Partial
- Runs a script at install time (postinstall) that we could not recognise. It may be perfectly ordinary, but we do not read the published tarball, so we cannot say what it does. View diagnostics → Partial
- Dependency health was assessed across the 286 of 287 dependencies we could resolve, so this covers what we could see, not the whole tree. View diagnostics → Partial
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to writerslogic/scrivener-mcp). View diagnostics → Pass
- Clear OSI-approved license (AGPL-3.0-only).Pass
- Actively maintained (last published 57 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability81
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 1892 tokens (~126/item across 15 items; 15 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management83
- Stability observed for 25 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (73% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 15 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 15 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the io.github.writerslogic/scrivener-mcp server?
io.github.writerslogic/scrivener-mcp runs locally as an npm package, launched with npx -y scrivener-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · scrivener-mcp
claude mcp add writerslogic-scrivener-mcp -- npx -y scrivener-mcp
{
"mcpServers": {
"writerslogic-scrivener-mcp": {
"command": "npx",
"args": [
"-y",
"scrivener-mcp"
]
}
}
} {
"servers": {
"writerslogic-scrivener-mcp": {
"command": "npx",
"args": [
"-y",
"scrivener-mcp"
]
}
}
} codex mcp add writerslogic-scrivener-mcp -- npx -y scrivener-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"writerslogic-scrivener-mcp": {
"type": "local",
"command": [
"npx",
"-y",
"scrivener-mcp"
],
"enabled": true
}
}
} openclaw mcp add writerslogic-scrivener-mcp --command npx --arg -y --arg scrivener-mcp
mcp_servers:
writerslogic-scrivener-mcp:
command: "npx"
args: ["-y", "scrivener-mcp"] {
"McpServers": {
"writerslogic-scrivener-mcp": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"scrivener-mcp"
]
}
}
} assistant mcp add writerslogic-scrivener-mcp -t stdio -c npx -a -y scrivener-mcp
{
"mcpServers": {
"writerslogic-scrivener-mcp": {
"command": "npx",
"args": [
"-y",
"scrivener-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 21 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 20 Sept 26 −3
- Stability: pass → 0.80 functional
- 19 Sept 26 +1
- Stability: 0.97 → pass security
- 17 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.
- 14 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 13 Sept 26 −3
- Stability: pass → 0.80 functional
- 12 Sept 26 +1
- Stability: 0.97 → pass security
- 10 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 21 Sept 2026 · Analysed npm/scrivener-mcp@0.12.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | writerslogic/scrivener-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/writerslogic/scrivener-mcp/.github/workflows/release.yml@refs/tags/v0.12.0 |
| Rekor log index | 2252378580 |
| Predicate type | https://slsa.dev/provenance/v1 |
| Subject digest | sha512:53172ecc10c34a4fff0bb04a8fea1873eb8f763d89a6bb6090203d2ff7c641dc185488ca70a634667062c9c920c6886253a99a9a89d188c91a4671779 |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| postinstall | unreviewed | node scripts/postinstall.cjs |
Background: Why install scripts are a supply-chain risk →
Dependencies 286 packages
| Packages resolved | 286 |
|---|---|
| Deprecated | 4 |
| Stale | 112 |
| Tree resolution | Partial |
The dependency tree was only partially resolved, so these counts may be incomplete.
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
close_project Close Project ~76
Close the currently open project, flush any pending memory/auto-save state, and clear the active session. After this, document and analysis tools have no project to act on until open_project is called again. Use this to switch projects cleanly or release file handles at the end of a session. Requires an open project. Takes no parameters.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
compare_snapshot Compare Snapshot ~129
Compare a document snapshot against the current document text, or against another snapshot (pass againstSnapshotId). Returns the paragraphs added and removed and the net word-count change — use this to see what changed since a snapshot was taken. Read-only. Requires an open project (call open_project first). Get snapshot ids from list_snapshots.
| Name | Type | Req | Description |
|---|---|---|---|
| againstSnapshotId | string | – | Optional second snapshot id to compare against. Omit to compare against the current document text. |
| documentId | string | yes | UUID of the document. |
| snapshotId | string | yes | The baseline snapshot id (from list_snapshots). |
| Name | Type | Req | Description |
|---|---|---|---|
| addedParagraphs | array | yes | Paragraphs present in the compared-to text but not the snapshot. |
| documentId | string | yes | – |
| from | object | yes | The baseline snapshot. |
| removedParagraphs | array | yes | Paragraphs present in the snapshot but not the compared-to text. |
| to | object | yes | What it was compared against ("current" or a snapshot id). |
| unchangedParagraphs | number | – | Count of paragraphs common to both. |
| wordDelta | number | yes | to.wordCount minus from.wordCount (negative means text was cut). |
| wordsAdded | number | – | Words present in the compared-to text but not the snapshot (word-level). |
| wordsRemoved | number | – | Words present in the snapshot but not the compared-to text (word-level). |
No examples provided.
create_snapshot Create Document Snapshot ~115
Take a Scrivener-native snapshot of a document's current content, restorable from Scrivener's own Snapshots browser. Use this before rewriting a document to give the writer a native rollback point. Copies the live content into the project's Snapshots directory with a title and timestamp; does not modify the document. Requires an open project and a document that has content.
| Name | Type | Req | Description |
|---|---|---|---|
| documentId | string | yes | UUID of the document to snapshot. |
| title | string | – | Snapshot title shown in Scrivener. Defaults to "Snapshot". |
| Name | Type | Req | Description |
|---|---|---|---|
| date | string | yes | Timestamp recorded for the snapshot. |
| documentId | string | yes | – |
| snapshotId | string | yes | Id of the new snapshot (for read_snapshot). |
| title | string | yes | – |
No examples provided.
detect_open_project Detect Open Scrivener Project ~171
Detect which Scrivener project the user currently has open in the desktop Scrivener app, so you can act on it without asking for a path. Use this when the user says "my project", "the project I have open", or gives a command with no project specified. Reads the open window names from the running app and resolves them to .scriv paths on disk; it does not open anything. If exactly one project is open, pass its path to open_project. macOS only right now (returns supported=false elsewhere; fall back to discover_projects). The first use may prompt macOS to allow the client app to control Scrivener.
| Name | Type | Req | Description |
|---|---|---|---|
| searchPath | string | – | Optional extra directory to resolve project names against, in addition to the default locations. Absolute or ~-relative path. |
| Name | Type | Req | Description |
|---|---|---|---|
| count | number | yes | Number of resolved open projects. |
| openProjects | array | yes | Open projects resolved to a .scriv path. |
| running | boolean | yes | Whether the Scrivener app appears to be running. |
| supported | boolean | yes | False on platforms where detection is not implemented (non-macOS). |
| unresolved | array | yes | Open project names that could not be matched to a .scriv folder on disk. |
No examples provided.
discover_projects Discover Scrivener Projects ~136
Scan common locations (Documents, Desktop, and iCloud Mobile Documents) for Scrivener projects and return the paths of every .scriv folder found, searching up to three levels deep. Use this when the user refers to their project by name rather than path ("open my novel"): present the results and pass the chosen path to open_project. Does not open anything itself. Returns a list of project paths, or a message if none are found.
| Name | Type | Req | Description |
|---|---|---|---|
| searchPath | string | – | Optional extra directory to search in addition to the default locations, e.g. an external drive or a custom projects folder. Absolute or ~-relative path. |
| Name | Type | Req | Description |
|---|---|---|---|
| count | number | yes | Number of projects found. |
| projects | array | yes | Absolute paths of the .scriv projects found. |
No examples provided.
get_compile_settings Get Compile & Taxonomy Settings ~116
Return the project's compile-format definitions (from Settings/compile.xml) and its taxonomy: the named compile formats and their section-layout counts, the current output file type, label and status definitions (with colors), saved collections, and user-defined section types. Use this to discover what compile formats and metadata categories a project defines before compiling or organizing. Read-only; does not run a compile. If a project has never been compiled, hasCompileSettings is false and only the taxonomy is returned. Requires an open project (call open_project first).
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| collections | array | – | Saved collections (binder, saved searches, groups). |
| compileFormats | array | yes | Named compile formats the project defines. |
| currentFileType | string | – | Default output file type of the last-used compile (e.g. "pdf"). |
| hasCompileSettings | boolean | yes | False when Settings/compile.xml is absent or unreadable. |
| labels | array | – | Label definitions with colors. |
| options | object | – | Global compile options. |
| sectionTypes | array | – | User-defined section types (Scene, Chapter, Part Heading, ...). |
| statuses | array | – | Status definitions. |
No examples provided.
get_manuscript_briefing Manuscript Briefing ~100
One "where am I?" snapshot of the whole manuscript: total word count against the project draft target (with percent-to-goal and deadline), document/folder counts, the per-status and per-label breakdown, and the longest and shortest documents. Use this right after open_project to orient before diving in, instead of stitching get_statistics, get_writing_goals, and get_compile_settings together. Read-only. Requires an open project.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| author | string | – | – |
| averageDocumentLength | number | – | Mean words per text document. |
| byLabel | object | yes | Count of text documents per label. |
| byStatus | object | yes | Count of text documents per status (e.g. To Do, Done). |
| documents | object | yes | – |
| longest | object | – | Longest text document by word count, or null. |
| shortest | object | – | Shortest text document by word count, or null. |
| title | string | – | – |
| words | object | yes | – |
No examples provided.
get_structure Get Project Structure ~260
Return the binder hierarchy of the open project: its folders and documents in tree order, each with id, title, type, depth, and word count. Use this to understand the manuscript layout and to obtain the document ids that read_document, write_document, and the analysis tools require. By default returns a compact flat array of [id, title, type, depth, wordCount, hasChildren] tuples to save tokens; set summaryOnly for just project-level counts. Requires an open project (call open_project first).
| Name | Type | Req | Description |
|---|---|---|---|
| flat | boolean | – | When true (default), return a compact flat array of [id, title, type, depth, wordCount, hasChildren] tuples. When false, return the nested tree object. |
| folderId | string | – | UUID of a binder folder, as returned by get_structure. |
| includeTrash | boolean | – | Set true to include trashed items in the result. Default false. |
| maxDepth | number | – | Maximum depth to descend into the binder tree, starting at 0 for top-level items. Omit to return the full hierarchy. |
| summaryOnly | boolean | – | When true, skip the tree and return only project-level counts (documents, words) plus title and author. Default false. |
| Name | Type | Req | Description |
|---|---|---|---|
| documents | array | – | Flat list of binder items in tree order (present unless summaryOnly). |
| structure | object | – | Nested binder tree (present when flat is false). |
| summary | object | – | Project-level counts plus title and author (present when summaryOnly). |
No examples provided.
list_skills List Skills ~75
List the available skills (tool groups) — project, documents, search, analysis, compilation, memory, relationships — with a description, the tool count, whether the skill is already active, and its tool names. Use this to discover capabilities, then call use_skill to activate a group whose tools you need. Takes no parameters.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| skills | array | yes | The available skills (tool groups). |
No examples provided.
list_snapshots List Document Snapshots ~139
List the snapshots Scrivener has saved of a project's documents (from the .scriv package's Snapshots/ directory). Pass documentId to list one document's snapshots, or omit it to list snapshots for every document that has any. Each entry gives the owning document id and title, a snapshotId (pass it to read_snapshot to get the text), the snapshot's title, and its date. Read-only. Returns an empty list when nothing has been snapshotted. Requires an open project (call open_project first).
| Name | Type | Req | Description |
|---|---|---|---|
| documentId | string | – | UUID of a single document to list snapshots for. Omit to list all documents. |
| Name | Type | Req | Description |
|---|---|---|---|
| documents | array | yes | One entry per document that has snapshots. |
No examples provided.
open_project Open Scrivener Project ~150
Open a Scrivener project and make it the active project for this session. Every document, structure, search, and analysis tool operates on the project opened here, so call this first. Accepts the path to a .scriv folder or the .scrivx file inside it and resolves the project automatically. Returns the project title, author, and metadata. Opening a project closes any project already open. If you do not know the path, call discover_projects first.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Path to the Scrivener project: either the .scriv folder (e.g. "~/Documents/My Novel.scriv") or the .scrivx file inside it. Absolute or ~-relative. |
No output schema declared.
No examples provided.
read_snapshot Read Document Snapshot ~90
Return the text of a single document snapshot. Pass the documentId and the snapshotId from list_snapshots. The snapshot's RTF is converted to plain text. Read-only; does not alter the document or restore the snapshot. Requires an open project (call open_project first).
| Name | Type | Req | Description |
|---|---|---|---|
| documentId | string | yes | UUID of the document. |
| snapshotId | string | yes | Snapshot id from list_snapshots. |
| Name | Type | Req | Description |
|---|---|---|---|
| date | string | – | Snapshot date. |
| documentId | string | yes | – |
| snapshotId | string | yes | – |
| text | string | yes | Snapshot content as plain text. |
| title | string | – | Snapshot title ("" if none). |
| wordCount | number | yes | Word count of the snapshot text. |
No examples provided.
refresh_project Reload Project From Disk ~62
Reload the open project from disk, discarding the in-memory cache. Use this when the project has been changed by the Scrivener app or another process while open here, so that subsequent reads reflect the latest saved state. Requires an open project. Takes no parameters.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
use_skill Activate Skill ~114
Activate a skill so its tools become available to call. Returns the activated skill's tool names and their schemas; clients that support tools/list_changed will also see the new tools appear automatically. Call list_skills first to see the available skill names. Tools are progressively disclosed, so activate the skill you need before using its tools (most tools are pre-activated by default).
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | The skill to activate, e.g. "documents", "search", or "analysis". Get valid names from list_skills. |
No output schema declared.
No examples provided.
verify_project_integrity Verify Project Integrity ~159
Scan the open project for structural problems and return a read-only report: binder entries with missing, malformed, or duplicate UUIDs, entries missing their type, and text documents whose backing content is unreadable or empty. Use when a project looks corrupted, after manual edits to the .scrivx file, or before a bulk operation; not when you just want the document tree (use get_structure) or a single document (use get_document_info). This tool only detects problems and never repairs them. related: get_structure, get_document_info. Requires an open project.
| Name | Type | Req | Description |
|---|---|---|---|
| includeTrash | boolean | – | Whether to also verify documents in the project trash. Defaults to true so the whole project is checked; set false to skip trashed items. |
| Name | Type | Req | Description |
|---|---|---|---|
| checked | number | yes | Number of binder items inspected. |
| issues | array | yes | Every integrity problem found; empty when the project is clean. |
| ok | boolean | yes | True when no error-severity issues were found. |
| summary | string | yes | One-line human-readable summary of the check. |
No examples provided.
What is the io.github.writerslogic/scrivener-mcp server?
io.github.writerslogic/scrivener-mcp is listed in the public MCP registry as io.github.writerslogic/scrivener-mcp. MCP server for Scrivener: read, write, analyze, and search your manuscripts with AI assistants. This page covers its npm package (scrivener-mcp).
Is the io.github.writerslogic/scrivener-mcp server safe to use?
io.github.writerslogic/scrivener-mcp scores 92 out of 100 on VerifyMCP. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.writerslogic/scrivener-mcp server expose?
io.github.writerslogic/scrivener-mcp exposes 15 tools: list_skills, use_skill, open_project, get_structure, refresh_project, and 10 more. Their descriptions and schemas cost roughly 1,892 tokens of context every time the server is loaded.
Is the io.github.writerslogic/scrivener-mcp server still maintained?
io.github.writerslogic/scrivener-mcp is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the io.github.writerslogic/scrivener-mcp server under?
io.github.writerslogic/scrivener-mcp declares the AGPL-3.0-only licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.