Scrivener MCP
The Scrivener MCP Server lets AI assistants directly interact with Scrivener projects — reading, writing, analyzing, and managing your manuscripts through conversation, no copy-pasting required.
Project & Document Management
Open, close, refresh, and auto-discover Scrivener projects
Browse the full binder hierarchy (folders, documents, word counts)
Create, read, write, rename, move, delete, and restore documents
Update metadata: title, synopsis, notes, label, status, custom fields
Access annotations, comments, and footnotes
Search & Discovery
Full-text keyword, regex, and semantic (vector-based) search across documents
Find passages by meaning, not just keywords; hybrid search combining both approaches
Locate all mentions of specific characters, places, or terms with context
Search trash and restore deleted documents
Writing Analysis
Analyze documents for readability, pacing, sentiment, themes, and character presence
Check project-wide consistency (characters, timeline, locations, plot threads)
Detect contradictions and continuity errors across chapters
Track recurring motifs, themes, and symbols
Multi-agent analysis (editor, critic, researcher, stylist, plotter)
AI-Powered Enhancement
Improve prose: grammar, style, clarity, filter words, showing vs. telling, dialogue, pacing
Generate new content from a prompt with project context
Start real-time writing, editing, or brainstorming sessions
Memory & Knowledge
Store and retrieve persistent character profiles, world-building notes, plot threads, and style guides across sessions
Ingest documents into a Holographic Memory System (HMS) for fractal/semantic retrieval
Find analogies (A:B :: C:?) within the story
Relationships & Story Graph
Define and query relationships between characters, locations, themes, and plot threads
Analyze the full character relationship network
Discover entity co-occurrences across the manuscript
Sync to Neo4j for advanced graph analysis
Compile & Export
Compile documents into a single manuscript (text, Markdown, HTML)
AI-optimized compilation targeting agent submissions, query letters, pitches, etc.
Export to Markdown, HTML, JSON, or EPUB
Generate marketing materials: synopsis, query letter, pitch packet, elevator pitch, book blurb
Background Jobs
Queue and monitor long-running NLP analysis tasks for documents or entire projects
Build and rebuild the semantic vector search index
View job queue statistics and cancel running jobs
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Scrivener MCPanalyze the writing style of my current project"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Scrivener MCP lets your AI assistant open, read, edit, analyze, and search your Scrivener projects directly. No copy-pasting. No exporting. Tell your assistant which project to open, and start working.
You: Open my novel and analyze the pacing in Chapter 12.
Claude: Opens your .scriv project, reads Chapter 12, runs pacing analysis. The first half moves well with short, tense paragraphs. The middle section slows considerably -- the three-page internal monologue starting at paragraph 14 stalls the momentum you built in the confrontation scene. Consider cutting it to a single paragraph and moving the backstory to Chapter 8 where Elena is first introduced.
Works with Claude Desktop, Claude Code, VS Code (Copilot/Continue), Cursor, and any MCP-compatible client. Scrivener 3 on macOS, Windows, and Linux. Listed on the official MCP Registry as io.github.writerslogic/scrivener-mcp.
Install
Pick the method that works for you. Most auto-configure Claude Desktop on install. Claude Code and other clients need one extra step -- see Claude Code below.
npm (recommended)
npm install -g scrivener-mcpRestart Claude Desktop. Done.
Claude Code
Installing the npm package does not register the server with Claude Code -- the install-time auto-config only writes Claude Desktop's config. After installing, register the server:
npx scrivener-setupThis detects Claude Code (along with Claude Desktop and Cursor) and writes the config for you. To register it manually instead:
claude mcp add -s user scrivener -- npx scrivener-mcpThen restart Claude Code (or run /mcp to reconnect) and Scrivener MCP appears in the server list. Drop -s user to scope it to the current project instead of all projects.
Smithery
npx -y @smithery/cli install scrivener-mcp --client claudenpx (no install)
Use directly without installing globally:
npx scrivener-mcpOr add to your Claude Desktop config manually:
{
"mcpServers": {
"scrivener": {
"command": "npx",
"args": ["scrivener-mcp"]
}
}
}GitHub
Install directly from the repo (latest main):
npm install -g writerslogic/scrivener-mcpOr a specific release:
npm install -g writerslogic/scrivener-mcp#v0.12.0Homebrew (macOS)
brew install writerslogic/tap/scrivener-mcpDocker
docker build -t scrivener-mcp https://github.com/writerslogic/scrivener-mcp.git
docker run -i --rm -v /path/to/your/projects:/projects scrivener-mcpRun the interactive setup to auto-detect and configure your client:
npx scrivener-setupThis detects Claude Desktop, Claude Code, and Cursor, and writes the config for you.
For other MCP clients, point them at npx scrivener-mcp as a stdio server.
Core features (document management, deterministic analysis, keyword search, and project memory) work without any API key. AI-powered analysis, generation, enhancement, and semantic search work with an Anthropic (Claude), OpenAI, or OpenRouter key; when several are present, Claude handles chat and generation (set AI_PROVIDER=openai or AI_PROVIDER=openrouter to override). OpenRouter defaults to the anthropic/claude-sonnet-4.6 model; set OPENROUTER_MODEL to use another model in its catalog. If the active provider fails with an account-level error (invalid key, exhausted credit, outage), the server automatically retries the request on the next configured provider. When your MCP client supports the sampling capability, supported chat-based AI features can also run through the client's own model—with no separately configured API key. Semantic indexing and similarity scoring use the local Holographic Memory System rather than an external embedding API, while the current semantic_search pipeline uses the configured chat provider to interpret queries and explain results. The server automatically discovers keys from common locations:
ANTHROPIC_API_KEY/OPENAI_API_KEY/OPENROUTER_API_KEYenvironment variables~/.env,~/.scrivener-mcp/.env~/.anthropic/key,~/.openai/key,~/.openrouter/keymacOS Keychain (service names
anthropic-api-key/openai-api-key/openrouter-api-key)
To store a key in the macOS Keychain:
security add-generic-password -s anthropic-api-key -a anthropic -w sk-ant-your-key-hereOr export it manually:
export ANTHROPIC_API_KEY="sk-ant-..." # or OPENAI_API_KEY="sk-..."This enables provider-backed writing analysis, content enhancement, generation, semantic search, character consistency checking, and intelligent compilation.
Related MCP server: Scrivener MCP Server
What You Can Do
First, open a project. The server acts on whatever
.scrivproject you point it at -- it has no link to the Scrivener app and can't see what you have open there. Start a conversation with "Open my Scrivener project at~/Documents/My Novel.scriv" (or "Discover my Scrivener projects" if you don't know the path), then give your commands. On macOS you can also just say "Use the project I have open in Scrivener" -- it detects the open project and opens it (the first time, macOS asks you to allow controlling Scrivener). Do this once at the start of each conversation; the examples below all assume a project is open. If the same project is also open and unsaved in the Scrivener app, save or close it there first to avoid conflicting writes.
Manage Your Manuscript
Open any Scrivener project and work with it naturally. Read chapters, create new scenes, reorganize the binder, update synopses -- all through conversation.
You: Create a new scene called "The Reveal" after Chapter 5, and move the old epilogue to the trash.
Analyze Your Writing
Get detailed feedback on readability, pacing, style, dialogue quality, and emotional arc. Not generic advice -- analysis grounded in your actual prose.
You: Analyze Chapter 3. Is the pacing too slow?
Claude: Readability is good (Flesch-Kincaid grade 8.2), but pacing flags:
4 consecutive paragraphs of internal monologue (lines 45-78) with no action or dialogue
The scene is 3,200 words with only 2 scene breaks -- your other chapters average 4
Filter word density is 2x your manuscript average ("felt", "seemed", "noticed") Specific suggestions: ...
Enhance Your Prose
Apply targeted improvements: eliminate filter words, strengthen verbs, vary sentence structure, add sensory details, convert telling to showing, tighten dialogue, adjust pacing.
You: Eliminate the filter words in Chapter 7 and strengthen the verbs.
Track Characters and Plot
Store character profiles, plot threads, and style guides that persist with your project. The AI remembers your characters across sessions.
You: Save a character profile for Marcus: retired detective, cynical but fair, walks with a limp from an old injury, speaks in clipped sentences.
Later...
You: Check if Marcus is consistent across all chapters.
Claude: Found an inconsistency: Marcus walks "briskly" in Chapter 9 (line 34), but his limp is referenced in Chapters 2, 5, and 11. Also, his dialogue in Chapter 4 uses long flowing sentences, which contradicts the "clipped sentences" note in his profile.
Search by Meaning
Find passages by what they're about, not just keyword matching. "Find scenes where the protagonist feels isolated" works even if the word "isolated" never appears. The project index and similarity scoring run locally through the Holographic Memory System; the current search pipeline also uses your configured AI provider for query interpretation and result explanations, so semantic_search requires a provider.
You: Find all scenes where Elena and Marcus are alone together.
Track Relationships
Store and query relationships between characters, locations, themes, and plot threads. No Neo4j required -- relationships live in the semantic memory engine and persist with your project.
You: Who is connected to Marcus? What plot threads involve the lighthouse?
Compile and Export
Combine chapters into a single manuscript with configurable formatting, separators, and structure preservation. Export the result inline as Markdown, HTML, or JSON, or write a DOCX, EPUB, or PDF file to disk for submission, e-readers, or print.
All Tools
57 tools organized by workflow. To keep token usage low, tools load progressively -- project tools at startup, document and search tools when you open a project, and the rest on demand (your AI client activates them automatically, or calls them directly and the owning skill activates on the fly). Set SCRIVENER_MCP_EAGER_TOOLS=1 to load everything at once.
Tool | What it does |
| Open a .scriv project (accepts .scriv folders or .scrivx files) and make it active |
| Scan common locations for Scrivener projects when you don't know the path |
| Detect the project currently open in the Scrivener app (macOS) so you don't need a path |
| Browse the binder hierarchy (folders, documents, word counts) |
| Reload from disk after external edits |
| Close the active project and flush pending changes |
| Read-only scan for structural problems (missing/duplicate UUIDs, unreadable content) |
| Read the project's compile formats and taxonomy -- labels/statuses (with colors), collections, section types |
| One "where am I?" snapshot: words vs. target (% to goal), document/status/label counts, longest/shortest documents |
| List Scrivener snapshots (title, date) for one document or the whole project |
| Read a snapshot's text as plain text, with word count |
| Diff a snapshot against the current document (or another snapshot): paragraphs added/removed and net word change |
| Take a Scrivener-native snapshot of a document (restorable from Scrivener's own Snapshots browser) before editing |
Tool | What it does |
| Metadata for one document (title, type, word count, synopsis, label, status) |
| Read content; |
| Replace a document's content (atomic, with pre-write backup) |
| Create a new text document or folder |
| Change title and/or metadata (synopsis, notes, label, status, custom fields) |
| Reorganize within the binder |
| Move to trash (reversible) |
Tool | What it does |
| Keyword/full-text search; |
| Find passages by meaning using the local HMS index plus provider-backed query interpretation, with similarity scores |
| Locate every occurrence of a specific name or term, with context |
| List trashed documents |
| Restore a document from trash |
| Read a document's comments and footnotes |
Tool | What it does |
| AI writing analysis; focus with |
| Project-wide continuity check; |
| Style-focused analysis |
| Plot-thread consistency check |
| AI-generated improvement suggestions |
| Suggest a specific improvement to a document |
| Generate new prose from a prompt and context |
| Set a word-count goal (daily, weekly, or whole project) with an optional target date |
| List goals with progress -- percent complete, words remaining, on-pace status |
| Set author preferences (tone, complexity, length, POV, style guide) that steer AI output |
| Show current preferences plus feedback insights and suggestions |
| Record a rating/comment on an AI operation to inform those insights |
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
Tool | What it does |
| Combine documents; |
| Write the manuscript to disk -- Markdown, HTML, JSON inline, or DOCX, EPUB, PDF as a file |
| Project-level word/document/character counts |
| Draft synopsis, query letter, pitch, and related materials |
Tool | What it does |
| Store information that persists across sessions with the project |
| Retrieve previously stored memory |
Memory is stored within each .scriv project and travels with it.
Tool | What it does |
| Store a relationship between characters, locations, themes, or plot threads |
| Query entities related to a given character/theme/location |
| Find co-occurring entities across the manuscript |
| The character relationship network |
| Trace the reference graph in either direction: entities a document mentions (by documentId), or documents mentioning an entity (by entity) |
| List registered characters/locations that no document actually mentions |
| Suggest entities a document may be missing, inferred from cross-document co-occurrence |
Works without Neo4j -- relationships live in the Holographic Memory System and are available immediately. The document cross-reference tools are fully deterministic (exact whole-word matching, no AI) and need no external services; Neo4j adds advanced graph analysis when connected.
Tool | What it does |
| Enqueue an async analysis of one document; returns a job id |
| Enqueue an async analysis of the whole project |
| Poll progress/results for a queued job |
| Cancel a queued or running job |
Tool | What it does |
| List the available tool groups and their tools |
| Activate a tool group (most are pre-activated by default) |
Guides
Getting Started -- Installation, configuration, your first session
MCP Client Setup -- Copy-paste config for Claude Desktop, Claude Code, Cursor, and VS Code
Writing with AI -- Analysis workflows, enhancement strategies, memory management
Troubleshooting -- Common issues and fixes
Token Optimization -- How the server minimizes context window usage
Architecture -- How the server works, module structure, data flow
Scrivener Compatibility -- Supported Scrivener versions, platforms, and format coverage
Scrivener File Format -- The reverse-engineered
.scrivformat, what we read vs. infer, and safe-modification guidanceFuzzing -- Jazzer.js target and OSS-Fuzz integration details
Contributing -- Development setup, code conventions, adding new tools
Requirements
Node.js 18+
Scrivener 3 project files (.scriv)
macOS, Windows, or Linux
Optional: Anthropic, OpenAI, or OpenRouter API key for provider-backed AI features
Optional: Neo4j for persistence and advanced graph queries; core relationship tools work without it
Development
git clone https://github.com/writerslogic/scrivener-mcp.git
cd scrivener-mcp
npm install
npm run dev # Development mode with hot reload
npm run build # Compile TypeScript
npm test # Run tests
npm run typecheck # Type checking onlyWhy This One?
Several Scrivener MCP servers exist. Feature claims below come from each project’s public documentation, published package, and advertised tool surface, last re-read on 2026-08-22; stars, forks, activity, and published version were refreshed 2026-08-22. “No” means the project does not document that capability; it does not claim the capability is impossible through the connected AI client.
Feature | scrivener-mcp | |||||
Public MCP tools | 57 | 29 | 22 | 38 | 18 | 10 |
Manuscript access | read/write | read/write | read/write | read-only; writes sidecar data/metadata | read-only by default; opt-in content/notes/synopsis writes | read-only |
RTF handling | formatted reads; fidelity-preserving span writes | reads/writes document content | reads/writes document content | converts RTF to text; manuscript read-only | RTF-to-text reads; snapshot-protected content writes | converts RTF to text; read-only |
Built-in writing analysis | readability, pacing, style, emotion, AI critique | readability, style, sentiment | continuity comparison | agent-driven five-point review workflow | no dedicated analysis tool | no dedicated analysis tool |
Content generation/enhancement | generation + 12 targeted enhancement types | no | no | brainstorm/draft agent workflow | no | no |
Local semantic retrieval | HMS index and similarity search | no | no | no | no | no |
Continuity/project memory | persistent memory + consistency checks | persistent notes + consistency checks | mention/description comparison | world bible, story state, characters, locations, review history | no persistent memory | no persistent memory |
Relationship tooling | persistent relationships, networks, reference graph; optional Neo4j | no | no | human-editable relations data | no | no |
Token optimization | progressive skill loading, compact output, paged reads | no documented equivalent | no documented equivalent | no documented equivalent | scoped binder/chapter reads | scoped overview/read tools |
Export / compilation | Markdown, HTML, JSON, DOCX, EPUB, PDF | compile + whole-draft export | saves AI drafts; no manuscript export documented | no | no | |
Windows support | yes | yes (prebuilt binary) | yes | not documented | not documented | yes |
Installation | npm, Homebrew, Docker, Smithery | Cargo or prebuilt binary | npm package (deprecated) | MCPB or source | source / | source / |
License | AGPL-3.0 / commercial dual-license | MIT | MIT | MIT | not declared | MIT |
Repository/package status | weekly activity; npm | weekly activity | discontinued and unmaintained | occasional activity | occasional activity; no releases | occasional activity |
Community | ⭐ 46 · 13 forks | ⭐ 7 | source repository unavailable | ⭐ 1 | ⭐ 0 | ⭐ 5 · 1 fork |
Counts and feature claims can change. Follow the linked projects for their latest documentation.
The table is generated from docs/comparison.yml — edit claims there, not here.
The option that isn't an MCP server
Worth naming, because it is the real alternative for many writers: Scrivener can
Sync to External Folder, writing each document out as RTF or plain text, and any
general-purpose file MCP server (for example
@modelcontextprotocol/server-filesystem)
can then read and write those files.
That costs nothing and works today. What it gives up is everything that depends on understanding the project rather than the folder: the binder hierarchy, metadata, labels and status, snapshots, compile settings, and RTF formatting all flatten away, and edits land in the sync folder rather than the project — so a bad edit is reconciled by Scrivener on the next sync rather than caught before it happens. Use the sync-folder route for occasional read-only help with prose; use a Scrivener MCP server when you want the structure to survive the round trip.
Contributing
We welcome contributions of all sizes. Check the issue tracker for good first issue labels, or see the contributing guide for development setup.
Areas where help is especially welcome:
Test coverage (#18)
Windows testing and path handling
Scrivener 2 compatibility testing
Documentation improvements (#25)
Security
Found a vulnerability? Please report it privately — see SECURITY.md.
License
AGPL-3.0 © WritersLogic, Inc.
Free for personal use and open-source projects. Commercial license available for proprietary integration. See COMMERCIAL_LICENSE.md for details.
Available Tools
57 toolsadd_relationshipAdd RelationshipAIdempotent
Record a typed, directed relationship between two story entities (e.g. a character "mentors" another, or a character "appears in" a document) in the project story graph. Returns the stored edge with its generated id. Use this to build the knowledge graph that find_relationships, character_network, and discover_connections then query. Requires an open project with the relationship engine initialized.
| Name | Required | Description | Default |
|---|---|---|---|
| head | Yes | Name of the source entity, e.g. a character name like "Elena". | |
| tail | Yes | Name of the target entity the relationship points to. | |
| headType | Yes | Type of the source entity. | |
| relation | Yes | The relationship verb/label from head to tail, e.g. "mentors", "appears_in". | |
| tailType | Yes | Type of the target entity. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide good safety hints (readOnlyHint=false, destructiveHint=false, idempotentHint=true, openWorldHint=true). The description adds return value info but no additional behavioral traits such as authentication needs or side effects. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences that efficiently communicate the tool's action, purpose, and relationship to other tools. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 5 required parameters and no output schema, the description explains purpose, prerequisite, and downstream usage. It lacks error handling details but is otherwise complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds an example of a relationship ('mentors') but does not provide additional constraints or formatting beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool records a typed, directed relationship between two story entities in the project story graph and returns the stored edge with an id. It distinguishes from siblings by noting that this builds the knowledge graph queried by find_relationships, character_network, and discover_connections.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this to build the knowledge graph for subsequent querying tools, and mentions a prerequisite: an open project with the relationship engine initialized. This provides clear context, though it does not explicitly list when not to use alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_documentAnalyze DocumentARead-onlyIdempotent
Analyze the writing quality of a single document and return a summary of readability, pacing, and the top issues found. This is the general-purpose prose analyzer: narrow it with analysisTypes to focus on style, structure, themes, characters, sentiment, or pacing. Use check_consistency for project-wide continuity instead, or enhance_content to get rewritten prose rather than a critique. Calls an external AI model. Requires an open project and a valid document id.
| Name | Required | Description | Default |
|---|---|---|---|
| documentId | Yes | Scrivener document UUID, as returned by get_structure (a binder item "id"). | |
| analysisTypes | No | Aspects to focus the analysis on. Omit or use ["all"] for a broad analysis; otherwise pick any of readability, sentiment, themes, characters, pacing, style, structure. |
Output Schema
| Name | Required | Description |
|---|---|---|
| issues | Yes | Craft issues found in the document. |
| pacing | Yes | Pacing assessment of the passage (e.g. slow/steady/fast with a brief reason). |
| readability | Yes | Readability assessment of the passage (e.g. easy/moderate/complex with a brief reason). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive. The description adds that the tool calls an external AI model and requires an open project and valid document ID, providing useful context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences long, front-loaded with the core purpose, and each sentence adds distinct value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (2 params, output schema exists), the description covers purpose, usage, alternatives, prerequisites, and behavioral traits comprehensively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so parameters are already documented. The description adds minimal extra value by saying 'narrow it with analysisTypes' and mentioning the requirement for an open project and document ID, but does not significantly enhance parameter understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it analyzes writing quality and returns a summary. It distinguishes from sibling tools by explicitly recommending check_consistency for project-wide continuity and enhance_content for rewritten prose, making the purpose specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use context (general-purpose prose analyzer) and when-not-to-use with named alternatives (check_consistency, enhance_content). It also explains how to narrow analysis using analysisTypes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_writing_styleAnalyze Writing StyleARead-onlyIdempotent
Analyze the prose style of one or more text samples — sentence variety, tone, voice, pacing, and other stylistic features — and return a structured style profile. Use this to characterize how something is written; use analyze_document for document-level metrics or check_plot_consistency for narrative coherence.
| Name | Required | Description | Default |
|---|---|---|---|
| samples | Yes | Array of text samples (strings) to analyze. Provide one or more passages of prose. |
Output Schema
| Name | Required | Description |
|---|---|---|
| analysis | Yes | Structured style profile of the samples (sentence variety, tone, voice, pacing, and other stylistic features). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds behavioral context by listing the specific stylistic features analyzed (sentence variety, tone, voice, pacing) and confirming it returns a structured style profile. This goes beyond what annotations provide, though it does not mention any performance or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first defines the tool's action and output, second gives usage guidance and alternatives. Every word adds value; no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existence of an output schema (not shown but referenced), the description need not detail return values. It covers the input (samples), the analysis dimensions, the output type (structured style profile), and trade-offs with sibling tools. This is fully sufficient for an agent to understand and correctly invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single required parameter 'samples' described as 'Array of text samples (strings) to analyze. Provide one or more passages of prose.' The description does not add additional semantics beyond the schema, meeting the baseline for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool analyzes prose style including sentence variety, tone, voice, pacing, and returns a structured profile. The description also distinguishes it from sibling tools analyze_document and check_plot_consistency by specifying what those tools do instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool ('Use this to characterize how something is written') and provides clear alternatives: 'use analyze_document for document-level metrics or check_plot_consistency for narrative coherence.' This gives the agent direct guidance on tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_jobCancel JobAIdempotent
Cancel a queued or running background job by its type and id. Returns whether the cancellation succeeded. Cancelling an already-finished or unknown job is harmless. Use get_job_status first to check whether a job is still in progress.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | The job id returned when the job was enqueued. | |
| jobType | Yes | The kind of job, as returned when the job was enqueued. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate idempotentHint=true and destructiveHint=false. The description adds that cancellation is harmless and returns success status, which aligns with and reinforces the annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each serving a purpose: main action, return value and safety note, usage guidance. Front-loaded and no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with 2 parameters and no output schema, the description covers all necessary behavioral context: what it does, return value, idempotency, and usage ordering relative to get_job_status.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% parameter coverage with descriptions. The description only mentions 'type and id' without adding new meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action ('Cancel'), the resource ('queued or running background job'), and the method ('by its type and id'). It distinguishes from sibling tools like get_job_status (which checks status) and queue_* tools (which create jobs).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: 'Cancelling an already-finished or unknown job is harmless' and 'Use get_job_status first to check whether a job is still in progress.' This tells the agent when to use this tool and when to consider an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
character_networkCharacter NetworkARead-onlyIdempotent
THE default tool for "map my characters" / "how do my characters connect": returns the full character relationship network — every character and the typed relationships between them — for rendering a graph or analyzing cast structure. Prefer this for any whole-cast question. Use find_relationships only for one entity's connections, get_entity_references for which documents mention an entity, and suggest_connections to surface missing links. Requires an open project with the relationship engine initialized. Takes no parameters.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| network | Yes | Map keyed by source character name; each value is that character's outgoing edges. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint. The description adds context about output (graph rendering, cast analysis) and the precondition. No contradictions, but it doesn't disclose anything beyond what annotations and context imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each adding value: core purpose, usage comparison, precondition. Front-loaded with clear action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and an existing output schema, the description fully covers purpose, usage context, and prerequisites. No gaps identified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, and schema coverage is 100%. The description confirms 'Takes no parameters', meeting the baseline for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool returns the full character relationship network using strong verbs ('returns'). It distinguishes itself from siblings like find_relationships and get_entity_references.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: 'Prefer this for any whole-cast question' and names specific alternatives for different use cases. Also notes a precondition (open project with relationship engine initialized).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_consistencyCheck Project ConsistencyARead-onlyIdempotent
Scan the whole project for continuity problems and return the issues found: character contradictions, timeline conflicts, location mismatches, and dropped or inconsistent plot threads. This is the project-wide continuity checker; use analyze_document to critique a single document's prose instead. Narrow the scan with checkTypes. Requires an open project.
| Name | Required | Description | Default |
|---|---|---|---|
| checkTypes | No | Continuity dimensions to check. Omit or use ["all"] for every check; otherwise pick any of characters, timeline, locations, plotThreads. |
Output Schema
| Name | Required | Description |
|---|---|---|
| counts | Yes | Issue tallies by severity. |
| issues | Yes | Continuity issues found, sorted by severity. |
| checkTypes | Yes | The continuity dimensions that were checked. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description adds value by stating it scans the whole project and requires an open project. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose and action. No extraneous information. Efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given presence of output schema, description adequately covers purpose, types of issues, usage with checkTypes, alternative tool, and prerequisite. Complete for a well-annotated tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and description adds context by explaining that omitting checkTypes defaults to all checks, and clarifies valid values beyond the enum list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it scans the whole project for continuity problems and lists specific issue types (character contradictions, timeline conflicts, etc.). It distinguishes from analyze_document but does not address the sibling check_plot_consistency, which may overlap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly directs to use analyze_document for single document prose critique, and mentions narrowing scan with checkTypes and the prerequisite of an open project. However, it does not discuss when not to use this tool or alternatives like check_plot_consistency.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_plot_consistencyCheck Plot ConsistencyARead-onlyIdempotent
Scan a set of documents for plot-level inconsistencies — timeline conflicts, contradicted facts, dropped threads — and return the issues found with the documents involved. Use this for story/plot coherence across chapters; use check_consistency for general consistency checks or analyze_writing_style for prose-level analysis.
| Name | Required | Description | Default |
|---|---|---|---|
| async | No | Run as a background job and return a job id instead of waiting. Default false. | |
| documents | Yes | Array of documents (id and content) to check together, e.g. the chapters of a manuscript. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobId | No | Identifier of the queued job (present when run asynchronously). |
| issues | No | Plot-level inconsistencies found (present for synchronous runs). |
| message | No | Human-readable status message. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds valuable behavioral context about the types of inconsistencies checked (timeline, facts, threads) and confirms it returns issues. While it doesn't add new safety or cost details, it enriches the agent's understanding of the tool's behavior beyond what annotations alone provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, with the main purpose front-loaded and alternative usage in the second sentence. Every word serves a purpose; no filler or redundancy. Highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, existence of an output schema, and rich annotations, the description covers the key aspects: what it checks (three types of issues) and when to use it. It is complete enough for an agent to understand the tool's role, though it omits potential prerequisites or limitations (e.g., document size) which are minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 per guidelines. The description does not add further parameter-specific information beyond what the schema already conveys (e.g., documents = array of id+content, async = background job flag). No additional semantic value is provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'scan' and the resource 'set of documents for plot-level inconsistencies' with specific examples (timeline conflicts, contradicted facts, dropped threads). It also explicitly distinguishes from siblings 'check_consistency' and 'analyze_writing_style', making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance ('Use this for story/plot coherence across chapters') and contrasts with alternatives ('use check_consistency for general consistency checks or analyze_writing_style for prose-level analysis'). This fully informs the agent about selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_projectClose ProjectAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses side effects beyond annotations: 'flush any pending memory/auto-save state, clear the active session, release file handles'. Annotations indicate idempotent=true but description adds behavioral detail. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each serving a purpose: action + side effects, usage guidance, and prerequisite. No extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no parameters and no output schema, the description fully covers purpose, side effects, usage context, and prerequisites. Completely adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters; schema coverage is 100%. Description correctly states 'Takes no parameters', adding clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Close the currently open project' with a specific verb and resource, distinguishing it from siblings like 'open_project' and 'refresh_project'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use ('switch projects cleanly or release file handles') and context ('After this, document and analysis tools have no project to act on until open_project is called again'). Also states prerequisite ('Requires an open project').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
collect_feedbackCollect FeedbackA
Record feedback on an AI operation (e.g. "enhance_content") so it feeds the insights returned by get_writing_preferences. Provide a 1-5 rating, whether the output was kept (accepted), and/or a comment. Use after the writer reacts to AI output. Requires an open project.
| Name | Required | Description | Default |
|---|---|---|---|
| rating | No | Satisfaction rating from 1 (poor) to 5 (excellent). Optional. | |
| comment | No | Optional free-text comment. | |
| accepted | No | Whether the AI output was kept (true) or discarded (false). Optional. | |
| operation | Yes | The operation being rated, e.g. "enhance_content" or "compile_documents". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description indicates the tool writes data (records feedback), consistent with readOnlyHint=false. It adds context about feeding insights into get_writing_preferences, which annotations do not cover. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three efficient sentences, front-loaded with purpose, no unnecessary words. Each sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the tool's effect (feeds into get_writing_preferences). Without an output schema, it does not detail return values, but for a simple feedback tool, it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description largely repeats parameter information (rating, accepted, comment). It adds narrative but does not significantly extend beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool records feedback on an AI operation and that it feeds into get_writing_preferences. This distinguishes it from sibling tools, none of which are directly about feedback.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description specifies 'Use after the writer reacts to AI output' and 'Requires an open project,' providing clear context. However, it does not explicitly state when not to use or name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_snapshotCompare SnapshotARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| documentId | Yes | UUID of the document. | |
| snapshotId | Yes | The baseline snapshot id (from list_snapshots). | |
| againstSnapshotId | No | Optional second snapshot id to compare against. Omit to compare against the current document text. |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | Yes | What it was compared against ("current" or a snapshot id). |
| from | Yes | The baseline snapshot. |
| wordDelta | Yes | to.wordCount minus from.wordCount (negative means text was cut). |
| documentId | Yes | |
| wordsAdded | No | Words present in the compared-to text but not the snapshot (word-level). |
| wordsRemoved | No | Words present in the snapshot but not the compared-to text (word-level). |
| addedParagraphs | Yes | Paragraphs present in the compared-to text but not the snapshot. |
| removedParagraphs | Yes | Paragraphs present in the snapshot but not the compared-to text. |
| unchangedParagraphs | No | Count of paragraphs common to both. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Declares read-only behavior, aligning with annotations. Adds detail on required open project and output structure. Annotations already cover safety, so description adds useful behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with front-loaded core action, then details. No filler, every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and the description's coverage of return values, prerequisites, and parameter usage, it is fully adequate for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and description provides additional context for snapshotId (baseline) and againstSnapshotId (optional second snapshot), clarifying their roles beyond schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it compares a document snapshot against current text or another snapshot, and specifies return values (paragraphs added/removed, net word-count change). Distinguishes from siblings like list_snapshots and read_snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use (to see changes since a snapshot), mentions prerequisite of an open project, and instructs how to get snapshot IDs. Also explains optional againstSnapshotId usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compile_documentsCompile DocumentsARead-onlyIdempotent
Compile the project's documents into a single continuous manuscript in the requested format and return the compiled text (large results are spooled to a file reference). In "standard" mode it joins documents in binder order; in "intelligent" mode it uses AI to optimize the output for a specific target such as an agent query or synopsis. To write a manuscript to disk in a publishing format (EPUB, etc.) use export_project instead. Requires an open project.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | "standard" (default) joins documents in order; "structured" compiles the Draft/Manuscript folder (like Scrivener) with the binder hierarchy as headings and a scene separator between documents, honoring each document's "Include in Compile" flag — deterministic, no AI; "intelligent" applies AI optimization toward targetOptimization. | |
| format | No | Output format of the compiled manuscript. Default "text". | |
| separator | No | Text inserted between documents in the standard-mode fallback. Default "\n\n---\n\n". | |
| documentIds | No | Optional explicit list of document ids to compile, in order. Overrides rootFolderId when provided; most useful with mode "intelligent". | |
| hierarchical | No | Preserve the binder folder hierarchy as headings. Default false. | |
| includeNotes | No | Include each document's notes in the output. Default false. | |
| rootFolderId | No | Optional binder folder id to compile only its descendants. Omit to compile all text documents. | |
| includeTitles | No | For mode "structured": emit each document title as a heading. Default true. | |
| sceneSeparator | No | For mode "structured": text placed between consecutive sibling documents (e.g. "#" or "* * *"). Default empty (a blank line). | |
| includeExcluded | No | For mode "structured": include documents whose "Include in Compile" flag is off. Default false (excluded documents are omitted, matching Scrivener). | |
| includeSynopsis | No | Include each document's synopsis in the output. Default false. | |
| targetOptimization | No | For mode "intelligent": what to optimize the compiled output for. Default "general". |
Output Schema
| Name | Required | Description |
|---|---|---|
| file | No | File reference the compiled text was spooled to. Present only when the result was too large to inline. |
| text | No | The compiled manuscript text. Present for small results; large results spool to a file instead. |
| format | Yes | Format the manuscript was compiled to (text, markdown, or html). |
| sections | Yes | Number of documents compiled into the manuscript. |
| charCount | Yes | Character count of the compiled manuscript. |
| wordCount | Yes | Word count of the compiled manuscript. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds valuable context: large results are spooled to a file reference, and the two modes have different behaviors (deterministic vs AI-driven). This enriched behavioral understanding beyond annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exceptionally concise: three sentences covering purpose, modes, large result handling, alternative tool, and prerequisite. Every sentence adds value without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (12 parameters, multiple modes, output schema exists), the description adequately covers key aspects: functionality, mode selection, result handling, and alternatives. It does not need to detail return values since an output schema is present. Minor omission: no mention of structured mode in description, but it's in the schema. Yet, the overall completeness is high.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 12 parameters have schema descriptions, providing 100% coverage. The tool description adds overall context about modes and fallback behavior but does not significantly augment individual parameter meanings. The baseline is 3, as the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool compiles documents into a single manuscript, specifies modes ('standard' and 'intelligent'), and distinguishes itself from the sibling 'export_project' by noting that export is for writing to disk in publishing formats. The verb 'compile' and resource 'documents' are specific, and the mention of large result spooling adds clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance on when to use the tool (to compile documents) and when not to (for publishing formats, use export_project). It also notes the prerequisite of an open project. However, it does not explicitly mention exclusions for other siblings like get_compile_settings, but the context is sufficient for an AI agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_documentCreate DocumentA
Create a new text document or folder in the binder and return its new id. Optionally set the initial body content and the parent folder; if no parent is given the item is added at the top level. Each call creates a distinct item (not idempotent). Use write_document to change content afterward. Requires an open project.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Write even if the project appears open in Scrivener. Default false, which refuses the write to protect against your changes being overwritten by Scrivener on save. | |
| title | Yes | Title for the new document or folder. Truncated to 255 characters. | |
| content | No | Document body as plain text. May be empty. | |
| parentId | No | UUID of a binder folder, as returned by get_structure. | |
| documentType | No | Whether to create a "Text" document (default) or a "Folder". |
Output Schema
| Name | Required | Description |
|---|---|---|
| documentId | Yes | Scrivener UUID of the newly created document or folder. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses non-idempotency (matching annotations) and requirement for open project (beyond annotations). No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with main action, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers creation, optional parent, non-idempotency, and alternative tool. Output schema handles return values. Could mention default documentType, but not essential.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so description need not repeat schema. Adds context about parent behavior ('top level') but does not elaborate on force or documentType defaults. Value added is modest.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a text document or folder, returns a new ID, and optionally sets content and parent. It distinguishes itself from write_document for subsequent edits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly mentions requires an open project and directs to write_document for content changes. Could be more explicit about when not to use, but the main alternative is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_snapshotCreate Document SnapshotA
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 | Required | Description | Default |
|---|---|---|---|
| title | No | Snapshot title shown in Scrivener. Defaults to "Snapshot". | |
| documentId | Yes | UUID of the document to snapshot. |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | Yes | Timestamp recorded for the snapshot. |
| title | Yes | |
| documentId | Yes | |
| snapshotId | Yes | Id of the new snapshot (for read_snapshot). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate not readOnly, not destructive. Description adds that it 'copies the live content into the project's Snapshots directory' and 'does not modify the document,' which aligns with annotations. It also mentions prerequisites (open project, document with content). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences covering purpose, usage, behavior, and prerequisites. No wasted words. Front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple 2-parameter schema and presence of an output schema, the description adequately covers prerequisites and behavior. Could mention error conditions (e.g., document not found) but not essential.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema documentation covers 100% of parameters with descriptions. The description mentions 'with a title and timestamp,' which adds slight context but does not substantially exceed schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a Scrivener-native snapshot of a document's content. It distinguishes from sibling tools like list_snapshots, read_snapshot, and compare_snapshot by focusing on creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises using the tool 'before rewriting a document to give the writer a native rollback point,' providing clear usage context. It does not explicitly exclude other scenarios or mention alternatives, but the purpose is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_documentDelete DocumentADestructiveIdempotent
Move a document to the project trash. This is reversible: the document can be listed with list_trash and brought back with restore_document until the trash is emptied in Scrivener. Deleting an already-trashed document is a no-op. Requires an open project and a valid document id.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Write even if the project appears open in Scrivener. Default false, which refuses the write to protect against your changes being overwritten by Scrivener on save. | |
| documentId | Yes | Scrivener document UUID, as returned by get_structure (a binder item "id"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond annotations, such as the reversible trash operation, the no-op for already-trashed documents, and the requirement for an open project and valid document ID. Annotations already declare idempotent and destructive hints, and the description enriches understanding without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with three front-loaded sentences. The first sentence states the core action, the second elaborates on reversibility and related tools, and the third gives prerequisites. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is fairly complete for a simple reversible deletion tool, covering core behavior, safety (reversibility), and prerequisites. It does not mention the force parameter, but schema coverage is 100% so the agent can retrieve it. Minor gap but overall good completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description does not add information about parameters beyond what is in the schema (e.g., the force parameter is not mentioned). It meets the baseline but provides no extra value for parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool moves a document to the project trash, distinguishing it from other document operations and trash-related siblings like list_trash and restore_document. It also clarifies the no-op behavior for already-trashed documents, providing specific verb and resource context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the reversible nature and mentions related tools (list_trash, restore_document), giving implied usage guidance. It states prerequisites (open project, valid document id) but does not explicitly list alternatives or when not to use the tool. The context is clear but lacks exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_open_projectDetect Open Scrivener ProjectARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| searchPath | No | Optional extra directory to resolve project names against, in addition to the default locations. Absolute or ~-relative path. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | Number of resolved open projects. |
| running | Yes | Whether the Scrivener app appears to be running. |
| supported | Yes | False on platforms where detection is not implemented (non-macOS). |
| unresolved | Yes | Open project names that could not be matched to a .scriv folder on disk. |
| openProjects | Yes | Open projects resolved to a .scriv path. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint. The description adds extra context: it reads window names, resolves to paths, does not open anything, and notes the first use may prompt macOS permissions. This goes beyond the annotations to explain the mechanism and potential side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: it starts with purpose, then usage guidelines, then how it works, then limitations and fallback. Every sentence adds value, and it is not overly verbose. The information is front-loaded for quick understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and annotations covering safety, the description is largely complete. It covers usage, behavior, constraints, and side effects. However, it does not explicitly describe what happens when zero or multiple projects are open, which is a minor gap. Still, overall very good.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema description for searchPath is clear ('Optional extra directory... Absolute or ~-relative path.'). The description does not add further meaning beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool detects which Scrivener project the user has open, for acting on it without asking for a path. It distinguishes from sibling tools like open_project and discover_projects by specifying that it passes the path to open_project and falls back to discover_projects on non-macOS.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use: when user says 'my project', 'the project I have open', or gives a command with no project. Also says when not to use: macOS only, else fall back to discover_projects. Provides an alternative tool and clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discover_connectionsDiscover ConnectionsARead-onlyIdempotent
Surface previously unrecorded relationships across the project by analyzing entity co-occurrence, returning candidate connections the story graph does not yet contain. Use this to find latent links to confirm with add_relationship; use find_relationships for known connections of a specific entity. Requires an open project with the relationship engine initialized.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Maximum number of candidate connections to return. Omit for the engine default. |
Output Schema
| Name | Required | Description |
|---|---|---|
| connections | Yes | Candidate connections inferred from entity co-occurrence, not yet in the graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, destructiveHint. The description adds context about analyzing entity co-occurrence, returning connections not yet in the story graph, and the initialization requirement, which enhances transparency beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no fluff: first states the action, second provides usage guidance, third states a prerequisite. Front-loaded and every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (1 optional param, good annotations, and existing output schema), the description is complete. It explains purpose, usage, and prerequisite without needing to detail output format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one optional parameter 'k' with schema description coverage 100%. The description does not add new information about the parameter beyond what the schema already provides, so baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'surfaces previously unrecorded relationships across the project by analyzing entity co-occurrence', which is a specific verb+resource. It distinguishes from siblings by mentioning 'add_relationship' for confirming latent links and 'find_relationships' for known connections.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'to find latent links to confirm with add_relationship' and contrasts with 'find_relationships for known connections'. Also provides prerequisite: 'Requires an open project with the relationship engine initialized.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discover_projectsDiscover Scrivener ProjectsARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| searchPath | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | Number of projects found. |
| projects | Yes | Absolute paths of the .scriv projects found. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint, openWorldHint. Description adds useful detail: search depth, default locations, return format (list or message), and that it doesn't open anything. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: two sentences that efficiently convey action, context, behavior, and output. Front-loaded with verb and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one optional param, scanning operation) and existence of output schema, the description fully covers purpose, usage, behavior, parameter explanation, and expected output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so baseline is 3. Description provides context for the optional searchPath parameter (e.g. external drive) but doesn't add beyond what schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool scans common locations for Scrivener projects up to three levels deep and returns paths. Distinguishes itself by specifying its use case and relationship with sibling tool open_project.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use ('when user refers to project by name rather than path'), what not to do ('does not open anything'), and suggests workflow: present results and pass chosen path to open_project.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enhance_contentEnhance ContentARead-only
Produce an AI-improved version of a document's text for a chosen goal (fix grammar, refine style, improve clarity, expand, summarize, or rework creatively) and return the suggested rewrite. This does NOT modify the document; review the result and call write_document to save it. Use analyze_document for a critique instead of a rewrite, or generate_content to create new text from a prompt. Calls an external AI model. Requires an open project.
| Name | Required | Description | Default |
|---|---|---|---|
| options | No | Optional enhancement parameters passed through to the enhancer. | |
| documentId | Yes | Scrivener document UUID, as returned by get_structure (a binder item "id"). | |
| enhancementType | Yes | The improvement goal: "grammar" fixes errors, "style" refines voice, "clarity" simplifies, "expand" lengthens, "summarize" condenses, "creative" reworks freely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false; the description adds that it calls an external AI model and requires an open project, which are useful behavioral traits beyond annotations. However, it doesn't detail potential latency or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise sentences, each adding unique value: core purpose, non-modification and workflow, sibling differentiation, and external AI call + prerequisite. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (3 params, no output schema), the description covers purpose, usage, non-destructive nature, and prerequisites. It lacks details about the output format or potential asynchronous behavior, but overall is well-rounded.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so baseline is 3. The description essentially restates the enumeration meanings from the schema without adding new semantics; the 'options' parameter is not elaborated beyond the schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it produces an AI-improved version of a document's text for specific goals, and explicitly distinguishes from sibling tools like analyze_document and generate_content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use guidance, mentioning alternatives for critiques or new text, and specifies the workflow: review result and use write_document to save. Also states requirement of an open project.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_projectExport Project To FileARead-onlyIdempotent
Export the whole project to a publishing/interchange format. Markdown, HTML, and JSON are returned inline; DOCX (agent/editor submission), EPUB (e-readers), and PDF (print/review) are written to a file on disk and the path is returned. Use this to produce a deliverable file; use compile_documents when you want the compiled text back in the response rather than written to disk. Requires an open project.
| Name | Required | Description | Default |
|---|---|---|---|
| format | Yes | Target file format. Text formats (markdown, html, json) return their content inline; binary formats (docx, epub, pdf) are written to a file and return its path. | |
| options | No | Optional format-specific export options (e.g. metadata, styling). | |
| outputPath | No | Absolute or project-relative path to write the exported file. Omit to use a default location (the working directory, named after the project title). Required in effect only if you want a specific location for docx/epub/pdf. |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | No | Path of the written file (binary formats: docx, epub, pdf). |
| bytes | No | Size of the written file in bytes (binary formats only). |
| format | Yes | Format the project was exported to (markdown, html, json, docx, epub, or pdf). |
| content | No | The exported document content (text formats only). |
| metadata | Yes | Export metadata: exportDate, format, and documentCount (number of documents exported). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnly, idempotent), description explains inline vs file output behavior for each format, and that file path is returned. Adds context about file writing not being destructive to project.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, then details, then usage guidance. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given output schema exists, description covers all necessary context: what, formats, return mechanism, sibling differentiation, prerequisite. Complete for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds nuance: explains that outputPath only needed for specific location, and options are format-specific. Slightly redundant but helpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Explicitly states it exports the whole project to publishing/interchange formats, lists specific formats, and distinguishes from the sibling tool compile_documents. The verb 'export' and resource 'project' are clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear guidance: use for deliverable files, use compile_documents for inline compiled text. Also notes prerequisite 'requires an open project'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_mentionsFind Entity MentionsARead-onlyIdempotent
Find every occurrence of a specific name or term (a character, place, or keyword) across all documents, returning each hit with surrounding context and its document. Use this for exact "where does X appear" lookups; use search for relevance-ranked results or semantic_search for meaning-based matches. Returns up to 50 mentions. Requires an open project.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | The exact name or term to locate, e.g. a character name like "Elena". | |
| contextLength | No | Number of characters of surrounding context to include on each side of a match. Default 100. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mentions | Yes | Occurrences of the entity, up to 50, each with surrounding context. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the tool is safe and idempotent. The description adds behavioral context: returns up to 50 mentions and requires an open project, which adds value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences that are concise and front-loaded. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the description fully covers its behavior: what it does, how it differs from siblings, output limits, and prerequisites. Output schema exists, so return values need not be detailed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters (entity and contextLength). The description adds some value by explaining the purpose of entity as 'exact name or term' and contextLength as 'surrounding context', but largely overlaps with schema. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Find every occurrence of a specific name or term... across all documents, returning each hit with surrounding context and its document.' It also distinguishes it from sibling tools by contrasting with search and semantic_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly guides when to use: 'Use this for exact "where does X appear" lookups; use search for relevance-ranked results or semantic_search for meaning-based matches.' This provides clear context and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_orphaned_entitiesFind Orphaned EntitiesARead-onlyIdempotent
List registered characters and locations that no document actually mentions — entities added to the registry but with no textual presence, which are candidates for removal or for prose that still needs writing. Uses exact whole-word matching, no AI. Requires an open project.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| orphans | Yes | Registered entities with zero mentions across all documents. |
| registrySize | Yes | Total number of registered entities considered. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, idempotentHint, destructiveHint), the description adds that matching is exact whole-word and no AI, plus the requirement of an open project, providing useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences: purpose, use-case context, and constraints. No wasted words, front-loaded with key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only listing tool with no parameters, good annotations, and an output schema, the description covers the purpose, matching method, and use case adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters and 100% schema coverage, the description does not need to add parameter details; baseline 4 is appropriate as it explains the tool's behavior without parameter info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists characters and locations not mentioned in any document, distinguishing it from sibling tools like find_mentions or check_consistency by focusing on orphaned entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides context on when to use (candidates for removal or missing prose) and a prerequisite (open project), but does not explicitly exclude alternatives or state when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_relationshipsFind RelationshipsARead-onlyIdempotent
Query the story graph for entities related to a given entity, returning the connected entities and the relationship types that link them. This covers cross-references and discovered connections for a specific entity; use character_network for the whole-cast graph, or discover_connections to surface co-occurring entities project-wide. Requires an open project with the relationship engine initialized.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Maximum number of related entities to return. Omit for the engine default. | |
| entity | Yes | Name of the entity to find relationships for, e.g. a character name. | |
| relation | No | Optional relationship type to filter by (e.g. "mentors"). Omit to return all relationship types. |
Output Schema
| Name | Required | Description |
|---|---|---|
| relationships | Yes | Stored relationships in which the queried entity is the head or tail. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, destructiveHint. Description adds context about covering cross-references and discovered connections, and the requirement for relationship engine initialization, which is useful beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences: purpose, differentiation, prerequisite. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, sibling differentiation, and prerequisite. Output schema exists so return values are handled. Fully adequate for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with good descriptions for all three parameters. Description does not add additional semantics beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it queries a story graph for related entities, returns connected entities and relationship types. Differentiates from siblings character_network (whole-cast) and discover_connections (project-wide).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use alternatives (character_network, discover_connections) and states prerequisite (open project with relationship engine initialized).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_contentGenerate ContentARead-only
Generate new prose from a natural-language prompt and return the generated text, optionally steered by project context (a document, characters, or a target style) and a desired length. This creates fresh text and does not modify any document. Use enhance_content to improve existing text instead, or analyze_document to critique it. Calls an external AI model and requires an AI provider key (ANTHROPIC_API_KEY, OPENAI_API_KEY, or OPENROUTER_API_KEY); without one a placeholder is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| length | No | Approximate target length in words. Default 500. | |
| prompt | Yes | Natural-language instruction describing the content to generate. | |
| context | No | Optional project context to steer generation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds that the tool does not modify documents (consistent with annotations) and details external AI model dependency and fallback behavior (placeholder).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with purpose, each sentence adds essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage, dependencies, and side effects. Could mention return format, but returning generated text is implied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds context on how 'context' and 'length' steer generation, adding minimal value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it generates new prose from a prompt, distinguishes from enhance_content and analyze_document.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use (generate new text) and when not (use enhance_content/analyze_document for existing text). Also mentions AI provider key requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_marketing_materialsGenerate Marketing MaterialsARead-only
Generate a publishing/marketing artifact from the manuscript — a synopsis, query letter, pitch packet, elevator pitch, or book blurb — using the project content as context, and return the generated text. Use this for submission and pitching materials; use compile_documents to assemble the manuscript itself. Requires an open project with text content. Each call regenerates fresh output (not idempotent).
| Name | Required | Description | Default |
|---|---|---|---|
| length | No | Target length: short (~500 words), medium (~1000, default), or long (~2000). | |
| materialType | Yes | Which marketing artifact to generate. | |
| targetAudience | No | Optional description of the intended audience or market (e.g. "YA fantasy readers"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, already signaling safe read operations. Description adds valuable behavioral context: requires open project, each call regenerates fresh output (non-idempotent, matching idempotentHint=false). No contradictions. Slight deduction for not explaining why readOnlyHint is appropriate for a generative action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise sentences. First sentence defines purpose with specific artifact list. Second provides usage guidance. Third adds prerequisite. Fourth notes non-idempotency. No wasted words, information dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 3 parameters, no output schema, and informative annotations, the description covers all necessary context: what it generates, usage domain, prerequisite, behavioral trait. Return value is clearly specified as 'generated text'. Provides complete decision support for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions for all three parameters (materialType, length, targetAudience). The description does not add parameter-specific meaning beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool generates publishing/marketing artifacts (synopsis, query letter, etc.) from a manuscript, and distinguishes it from compile_documents for assembling the manuscript. The verb 'generate' and specific artifact list provide excellent purpose clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: for submission and pitching materials. Identifies alternative: compile_documents for manuscript assembly. No ambiguity about usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_compile_settingsGet Compile & Taxonomy SettingsARead-onlyIdempotent
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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| labels | No | Label definitions with colors. |
| options | No | Global compile options. |
| statuses | No | Status definitions. |
| collections | No | Saved collections (binder, saved searches, groups). |
| sectionTypes | No | User-defined section types (Scene, Chapter, Part Heading, ...). |
| compileFormats | Yes | Named compile formats the project defines. |
| currentFileType | No | Default output file type of the last-used compile (e.g. "pdf"). |
| hasCompileSettings | Yes | False when Settings/compile.xml is absent or unreadable. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint and idempotentHint true. Description adds behavioral details: returns taxonomy even if never compiled (hasCompileSettings false), and that it requires an open project. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise paragraph of 5 sentences, front-loaded with the main action. Every sentence adds value: purpose, usage advice, read-only clarification, special case, and prerequisite. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, comprehensive annotations, and presence of output schema (though not shown), the description fully covers what the tool does, when to use, and edge case (never compiled). Complete for agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters, so baseline 4 applies. Schema coverage is 100% vacuously, and description does not need to add parameter info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb 'Return' and resource 'compile-format definitions and taxonomy', clearly distinguishing from siblings like compile_documents. It explains what is returned and when to use it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states 'Use this to discover... before compiling or organizing' and clarifies 'Read-only; does not run a compile'. Mentions prerequisite 'Requires an open project (call open_project first)'. No explicit alternative named but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_infoGet Document InfoARead-onlyIdempotent
Return metadata for a single document without its body text: title, type, word count, synopsis, label, status, parent, and custom metadata. Use this to inspect a document or to read its word count cheaply; call read_document when you need the actual prose, or get_structure for the whole binder. Requires an open project and a valid document id.
| Name | Required | Description | Default |
|---|---|---|---|
| documentId | Yes | Scrivener document UUID, as returned by get_structure (a binder item "id"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | Ancestor chain from the binder root to the document. |
| document | Yes | The document metadata (body text excluded). |
| location | Yes | Where the document lives: "active", "trash", or "unknown". |
| metadata | Yes | Derived metadata map (synopsis, notes, keywords, status, label) as strings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it as read-only and idempotent. Description adds that it does not return body text, which is critical for understanding its non-destructive nature and the 'cheaply' hint implies low computational cost.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first states what it does and what metadata it returns, second provides usage guidance. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values are documented elsewhere. Description covers purpose, scope, limitations, and prerequisites. Complete for a simple metadata retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single parameter 'documentId' has schema description identifying it as a Scrivener document UUID from get_structure. Description mentions referencing get_structure but adds no further semantic nuance beyond schema (100% coverage).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it returns metadata without body text, lists specific fields (title, type, word count, etc.), and distinguishes from siblings read_document and get_structure by contrasting use cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use (inspect document, cheaply read word count) and when not to (use read_document for prose, get_structure for binder). Also states prerequisite: open project and valid document id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_entity_referencesGet Entity ReferencesARead-onlyIdempotent
Trace the reference graph between documents and registered characters/locations, in either direction. Pass documentId to list the entities a document mentions (its cast and settings, with counts and offsets); pass entity (registry id or name) to list every document that mentions it, ranked by count. Provide exactly one of documentId or entity. Exact whole-word, case-insensitive matching against the registries — no AI. Returns empty when there are no matches or the registries are empty. Requires an open project.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | No | Registry id or name of a character/location to list the documents that mention it, e.g. "Elena". Mutually exclusive with documentId. | |
| documentId | No | UUID of a document to list the entities it mentions (from get_structure). Mutually exclusive with entity. |
Output Schema
| Name | Required | Description |
|---|---|---|
| entity | No | Echoed when querying by entity. |
| mentions | No | Entities the document references (present when querying by documentId). |
| documents | No | Documents referencing the entity (present when querying by entity). |
| documentId | No | Echoed when querying by document. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and idempotent. The description adds behavioral details: exact whole-word case-insensitive matching, returns counts/offsets, empty results when no matches or registries empty, requires open project. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences cover purpose, dual usage, matching rules, prerequisites, and edge cases with no redundancies. Front-loaded with the primary function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the description sufficiently covers all behavioral aspects for both directions, matching constraints, prerequisites, and empty results. No gaps for this type of tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%. The description adds mutual exclusivity, explains 'registry id or name', mentions counts/offsets, ranking by count, and exact matching semantics, providing significant added value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Describes tracing reference graphs between documents and registered entities in two directions. Clearly distinguishes from sibling tools like find_mentions by specifying exact whole-word matching and registry-based lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states to provide exactly one of documentId or entity, and explains the use case for each parameter. Does not mention specific alternatives among siblings, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_job_statusGet Job StatusARead-onlyIdempotent
Look up the status and progress of a background job previously started by queue_document_analysis, queue_project_analysis, or another async tool. Returns the job state (queued, running, completed, failed), progress, and result when finished. Poll this after enqueuing work; use cancel_job to stop a job.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | The job id returned when the job was enqueued. | |
| jobType | Yes | The kind of job, as returned when the job was enqueued. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Failure reason when the job failed or was not found. |
| state | Yes | Current job state (e.g. queued, running, completed, failed, not_found). |
| result | No | Job result when the job has completed. |
| progress | Yes | Completion progress of the job. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, signaling a safe, side-effect-free operation. The description adds context about returning job states and progress, and implies polling behavior. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: purpose, return values, usage guidance. No unnecessary words. Purpose is front-loaded. Efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existence of an output schema and comprehensive annotations, the description covers all essential aspects: what the tool does, when to use it, what it returns. It is complete for the tool's complexity level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage with clear explanations for jobId and jobType (including an enum). The description does not add additional meaning to the parameters beyond what the schema already provides, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Look up the status and progress of a background job previously started by...', clearly identifying the verb (look up) and resource (job status). It distinguishes from sibling tools like queue_document_analysis (which starts jobs) and cancel_job (which stops jobs).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: 'Poll this after enqueuing work; use cancel_job to stop a job.' This tells when to use the tool (after enqueuing) and when not to (to stop a job, use an alternative). It also mentions the specific async tools that start the jobs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_manuscript_briefingManuscript BriefingARead-onlyIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| title | No | |
| words | Yes | |
| author | No | |
| byLabel | Yes | Count of text documents per label. |
| longest | No | Longest text document by word count, or null. |
| byStatus | Yes | Count of text documents per status (e.g. To Do, Done). |
| shortest | No | Shortest text document by word count, or null. |
| documents | Yes | |
| averageDocumentLength | No | Mean words per text document. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, idempotent, non-destructive. The description adds 'Read-only. Requires an open project.' which provides important context about the prerequisite. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose and usage guidance, no wasted words. Efficient and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, full safety annotations, and an output schema, the description covers the tool's purpose and return contents (word count, counts, breakdowns, extremes). Complete for a read-only snapshot tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist (schema coverage 100%), so the description does not need to add parameter semantics. Baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool provides a 'where am I?' snapshot of the manuscript, listing specific data points (word count, counts, breakdowns). It distinguishes from siblings like get_statistics, get_writing_goals, get_compile_settings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises using this tool right after open_project to orient, and recommends against stitching together multiple other tools. Provides clear when-to-use and alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statisticsGet Project StatisticsARead-onlyIdempotent
Return project-wide statistics: total word and document counts, plus title and author. Use this for a quick project overview; use get_structure for the per-document breakdown or get_document_info for a single document. Requires an open project.
| Name | Required | Description | Default |
|---|---|---|---|
| detailed | No | Include extended per-category statistics when available. Default false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| title | Yes | Project title (defaults to "Untitled"). |
| author | No | Project author, if set. |
| metadata | Yes | Project metadata. |
| totalWords | Yes | Total word count across all documents. |
| lastModified | Yes | ISO timestamp of when these statistics were generated. |
| totalFolders | Yes | Number of folder items. |
| draftDocuments | Yes | Number of documents in the Draft. |
| totalDocuments | Yes | Total number of items in the project. |
| documentsByType | Yes | Count of documents keyed by type. |
| longestDocument | No | The longest document, or null if none. |
| totalCharacters | Yes | Total character count across all documents. |
| documentsByLabel | Yes | Count of documents keyed by label. |
| recentlyModified | Yes | Recently modified documents. |
| shortestDocument | No | The shortest document, or null if none. |
| trashedDocuments | Yes | Number of trashed documents. |
| documentsByStatus | Yes | Count of documents keyed by status. |
| researchDocuments | Yes | Number of documents in Research. |
| averageDocumentLength | Yes | Average word count per text document. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, destructiveHint. Description adds that it returns specific data and requires open project. No contradictions; sufficient additional context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first defines output, second gives usage guidance. No waste, front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With output schema present and annotation richness, description covers all needed: function, output, usage context, prerequisite, and alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter 'detailed' with full schema description (boolean, default false, includes extended stats). Description adds no extra meaning beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it returns project-wide statistics (total word and document counts, title, author). Distinguishes from siblings get_structure and get_document_info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use for quick project overview, and directs to get_structure for per-document breakdown or get_document_info for single document. Also mentions prerequisite: requires an open project.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_structureGet Project StructureARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| flat | No | When true (default), return a compact flat array of [id, title, type, depth, wordCount, hasChildren] tuples. When false, return the nested tree object. | |
| folderId | No | UUID of a binder folder, as returned by get_structure. | |
| maxDepth | No | Maximum depth to descend into the binder tree, starting at 0 for top-level items. Omit to return the full hierarchy. | |
| summaryOnly | No | When true, skip the tree and return only project-level counts (documents, words) plus title and author. Default false. | |
| includeTrash | No | Set true to include trashed items in the result. Default false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| summary | No | Project-level counts plus title and author (present when summaryOnly). |
| documents | No | Flat list of binder items in tree order (present unless summaryOnly). |
| structure | No | Nested binder tree (present when flat is false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint. Description adds value: explains default flat format to save tokens, summaryOnly option, and requirement of open project. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, well-structured with purpose first. Every sentence adds value, no redundancy. Concise yet comprehensive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given output schema exists (not shown), description covers return formats, parameters, prerequisites, and usage context. Fully adequate for a read-only tree tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description adds context: explains default flat format, that summaryOnly skips the tree, and that folderId comes from prior get_structure calls. Adds meaning beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it returns binder hierarchy with specific fields (id, title, type, depth, word count). Distinguishes from siblings by noting it provides document IDs required by other tools like read_document and write_document.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use for understanding manuscript layout and obtaining document IDs. Also states prerequisite: requires open project. Lacks explicit when not to use alternatives, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_writing_goalsGet Writing GoalsARead-onlyIdempotent
List writing goals with computed progress: percent complete, words remaining, and whether each goal is on pace given its target date and the current project word count. Use when the writer asks how close they are to a goal or for a progress dashboard; not when defining a new goal (use set_writing_goal) or forecasting a finish date from writing velocity (use predict_completion). Related: set_writing_goal. Requires an open project and the project database.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Optional filter by goal status. Omit to list goals of every status; use "active" to see only goals still in progress. |
Output Schema
| Name | Required | Description |
|---|---|---|
| goals | Yes | Goals with computed progress; empty when none match the filter. |
| projectWords | Yes | Current total word count of the open project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the read-only, non-destructive nature is covered. The description adds that the tool requires an open project and database, and that it computes progress fields, which is useful behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with three sentences: first states the primary purpose, second provides usage guidelines, third mentions prerequisites. No unnecessary words, front-loaded with key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (so return values are documented elsewhere), the description covers purpose, usage guidelines, and behavioral context (requirement for open project and database). It is complete for an agent to decide whether and when to use this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one optional parameter (status) with enum and description already fully covered in the input schema (100% coverage). The description does not add new meaning beyond what the schema provides, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists writing goals with computed progress (percent complete, words remaining, on pace), using a specific verb and resource. It distinguishes from siblings like set_writing_goal and predict_completion, which are mentioned as alternatives for different tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (when writer asks about goal progress or dashboard) and when not to use (defining goals or forecasting finish dates) with alternative tools named. This provides excellent usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_writing_preferencesGet Writing PreferencesARead-onlyIdempotent
Return the current author writing preferences plus feedback insights: how much feedback has been recorded, average satisfaction per operation, and non-binding suggestions for adjusting preferences. Use to review what is currently steering AI output, or to see whether recorded feedback points to a change. Related: set_writing_preferences, collect_feedback. Requires an open project.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| insights | Yes | Aggregated feedback view plus non-binding suggestions. |
| preferences | Yes | The active author writing-preference profile. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds behavioral context by stating the output includes feedback insights and requires an open project, which is a precondition not captured by annotations. This goes beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences plus a brief mention of related tools. It is front-loaded with the primary function and lists outputs, then provides usage guidance. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters, an output schema exists, and annotations cover safety, the description is fully sufficient. It explains what the tool returns, when to use it, a prerequisite (open project), and related tools. No gaps remain for typical usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, so the description cannot add meaning beyond the input schema. Baseline for 0 parameters is 4, and the description appropriately focuses on the tool's purpose and outputs rather than parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns 'current author writing preferences plus feedback insights' and enumerates specific outputs: feedback recorded, average satisfaction, suggestions. It distinguishes from related tools by mentioning 'set_writing_preferences' and 'collect_feedback' and specifying the use case to review current AI steering or feedback trends.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use to review what is currently steering AI output, or to see whether recorded feedback points to a change' and notes the prerequisite 'Requires an open project.' It names related tools, giving context for when to use this tool versus alternatives, though it does not explicitly state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_skillsList SkillsARead-onlyIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| skills | Yes | The available skills (tool groups). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is clear. The description adds that it takes no parameters and lists the output content, which complements the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose and output details, followed by usage guidance. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple listing tool with zero parameters and an output schema, the description fully covers its purpose and usage context, including what is returned and next steps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist; the schema is 100% covered. The description confirms 'Takes no parameters,' adding no ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists available skills (tool groups) and enumerates examples. It distinguishes from sibling tools like use_skill by specifying that this tool is for discovery.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this to discover capabilities, then call use_skill to activate a group whose tools you need.' Provides clear when-to-use and a concrete alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_snapshotsList Document SnapshotsARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| documentId | No | UUID of a single document to list snapshots for. Omit to list all documents. |
Output Schema
| Name | Required | Description |
|---|---|---|
| documents | Yes | One entry per document that has snapshots. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, destructiveHint, idempotentHint. Description adds context: returns empty list when none, lists returned fields, and reinforces read-only. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four efficient sentences: purpose, parameter usage, output description, prerequisite. No wasted words, front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given simple schema, rich annotations, and presence of output schema, description covers all necessary context: prerequisite, empty result, linkage to read_snapshot, and return fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and description adds meaning: clarifies effect of omitting vs including documentId, and its optional nature. Does not add format details but fully explains behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it lists snapshots, with specific verb 'list' and resource. Distinguishes from read_snapshot by mentioning snapshotId usage for getting text, and from write operations by stating read-only.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use when listing snapshots, explains parameter behavior (omit for all, specify for one), and notes prerequisite call open_project first. Lacks explicit statement of when not to use, but context implies read-only nature.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_trashList TrashARead-onlyIdempotent
List all documents currently in the project trash, with their ids and titles. Use this to see what can be brought back with restore_document, or to confirm a delete_document call. Requires an open project. Takes no parameters.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | Documents currently in the project trash, in binder order. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint. The description adds that it takes no parameters and requires an open project. It does not contradict annotations and provides useful contextual behavioral info beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each serving a distinct purpose: function, usage, and prerequisites. Efficient and front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool with existing output schema, the description covers purpose, usage context, prerequisite, and output content. No gaps identified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so schema coverage is 100%. The description correctly notes 'Takes no parameters', adding clarity but not required since schema already indicates zero properties.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List', the resource 'documents in trash', and the output 'ids and titles'. It distinguishes from sibling tools like restore_document and delete_document by indicating its use for seeing what can be restored or confirming deletions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'to see what can be brought back with restore_document, or to confirm a delete_document call.' Also mentions prerequisite 'Requires an open project.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_documentMove DocumentAIdempotent
Move a document or folder to a different parent folder in the binder, optionally at a specific position among the target folder's children. Changes only the location, not the content. Requires an open project, a valid document id, and a valid target folder id.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Write even if the project appears open in Scrivener. Default false, which refuses the write to protect against your changes being overwritten by Scrivener on save. | |
| position | No | Zero-based index at which to insert the item among the target folder's children. Omit to append at the end. | |
| documentId | Yes | Scrivener document UUID, as returned by get_structure (a binder item "id"). | |
| targetFolderId | Yes | UUID of a binder folder, as returned by get_structure. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states 'Changes only the location, not the content', aligning with annotations (destructiveHint=false). It also explains the force parameter's behavior regarding project openness protection. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences efficiently convey purpose, prerequisites, and parameter context without excess. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately covers input requirements, parameter behavior, and effect (location change). It could mention return value but is otherwise complete for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, baseline is 3. The description adds value by explaining position as zero-based and omitting appends, and force's default and protective behavior. This goes beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Move a document or folder to a different parent folder', providing a specific verb and resource. It distinguishes from sibling tools like create_document or update_document by focusing on repositioning.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lists required prerequisites (open project, valid IDs) and mentions optional position control. However, it does not explicitly state when not to use this tool or name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_projectOpen Scrivener ProjectAIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| path | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds behavioral context beyond annotations: it resolves project automatically, returns metadata, and closes any previously open project. Annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=true, destructiveHint=false) are consistent with the described side effects and usage pattern.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences front-loaded with purpose and importance, then technical details. No wasted words; every sentence serves a clear purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description fully covers purpose, prerequisites, side effects, return value, and parameter format. It is complete given the tool's complexity and sibling context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'path' has 100% schema coverage. Description adds value by explaining acceptable formats (.scriv folder or .scrivx file) and auto-resolution, which clarifies usage beyond the schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Open a Scrivener project and make it the active project for this session.' It uses a specific verb (open) and resource (Scrivener project), and distinguishes from sibling tools by noting that subsequent tools operate on this opened project.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'call this first' and advises calling discover_projects if the path is unknown. It also states that opening a project closes any already open project, providing clear when-to-use and prerequisite guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
queue_document_analysisQueue Document AnalysisA
Enqueue a background NLP analysis of one document (readability, entities, sentiment) and return a job id immediately without blocking. Poll the job with get_job_status and stop it with cancel_job. Use this for large documents where a synchronous analyze_document call would be slow; use analyze_document directly for quick, inline results.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Document body as plain text. May be empty. | |
| options | No | Optional flags selecting which analyses to run and the job priority. | |
| documentId | Yes | Scrivener document UUID, as returned by get_structure (a binder item "id"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobId | Yes | Identifier of the queued job; poll it with get_job_status. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are present (readOnlyHint=false, etc.) and the description adds behavioral context: execution is non-blocking, returns immediately with a job ID, and runs in the background. No contradictions with annotations. Minor omission: doesn't mention that the job might fail or require authentication, but overall good.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that front-load the core purpose and follow with usage guidance. Every sentence adds value; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (job ID) and annotations, the description covers everything needed: what it does, when to use, how to monitor progress, and the asynchronous nature. Fully sufficient for correct tool selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%. The description adds value by explaining that documentId comes from get_structure and that content may be empty. The options are already described in the schema. The parameter overview is adequate but not exceptional beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool enqueues a background NLP analysis (readability, entities, sentiment) on a single document and returns a job ID. It explicitly distinguishes from the synchronous sibling 'analyze_document' by mentioning blocking vs. non-blocking behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool (large documents where synchronous would be slow) and when to use the alternative 'analyze_document' for quick inline results. It also names related tools for polling (get_job_status) and cancellation (cancel_job).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
queue_project_analysisQueue Project AnalysisA
Enqueue a background batch analysis across many documents at once and return a job id immediately. Poll progress with get_job_status and stop it with cancel_job. Use this to analyze a whole manuscript or large set of documents; for a single document prefer queue_document_analysis or the synchronous analyze_document.
| Name | Required | Description | Default |
|---|---|---|---|
| options | No | Optional batch execution settings. | |
| documents | Yes | Array of documents (id and content) to include in the batch analysis. | |
| projectId | Yes | Identifier of the project the documents belong to. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobId | Yes | Identifier of the queued batch job; poll it with get_job_status. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, destructiveHint=false) indicate it's a write operation that is not destructive. The description adds key behavioral context: it enqueues a background job and returns a job ID immediately, implying asynchronous processing. It references polling and cancellation, which informs the agent about the lifecycle. One could argue it could mention potential errors or resource limits, but overall it's sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise: three sentences with no fluff. The first sentence states the core action, the second provides lifecycle context (polling/stopping), and the third gives usage guidance with alternatives. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (3 params, nested objects, output schema exists), the description covers the core purpose, usage guidance, and lifecycle. It does not explain the output schema or return values, but since an output schema is provided separately, that is acceptable. It might lack error handling details, but overall it is complete enough for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add new details about the parameters beyond what the schema already provides. It frames the 'documents' param in the context of 'many documents' and mentions 'batch analysis', but this adds only marginal semantic value beyond the schema's descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a clear, specific verb ('Enqueue a background batch analysis') and resource ('many documents'). It explicitly distinguishes itself from sibling tools by mentioning alternatives for single documents (queue_document_analysis and analyze_document).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use: 'Use this to analyze a whole manuscript or large set of documents; for a single document prefer queue_document_analysis or the synchronous analyze_document.' It also tells how to monitor and cancel the job, directing to get_job_status and cancel_job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_annotationsRead Document AnnotationsARead-onlyIdempotent
Return the inline comments and footnotes attached to a document, grouped by type. Use this to review editorial notes and references without reading the full body; use read_document for the prose itself. Requires an open project and a valid document id.
| Name | Required | Description | Default |
|---|---|---|---|
| documentId | Yes | Scrivener document UUID, as returned by get_structure (a binder item "id"). | |
| includeComments | No | Include inline comments. Default true. | |
| includeFootnotes | No | Include footnotes. Default true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| comments | Yes | Inline comments as [key, value] pairs, where key identifies the comment and value is its text. |
| footnotes | Yes | Footnotes as [key, value] pairs, where key identifies the footnote and value is its text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds behavioral context by stating the requirement for an open project and valid document ID, which is not in annotations. It also mentions grouping by type, giving output structure insight.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two sentences, front-loaded with the core purpose. Every sentence adds distinct value: purpose, usage guidance, and prerequisites. No unnecessary details or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and comprehensive annotations, the description covers all necessary context: what the tool returns (grouped by type), when to use it, prerequisites, and sibling differentiation. It is complete for a read-only tool with three parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description does not add additional meaning to parameters beyond what the schema already provides; it only mentions the grouping by type, which applies to the output, not parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Return' and identifies the exact resource (inline comments and footnotes) with grouping by type. It explicitly distinguishes from the sibling tool 'read_document' by contrasting its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool (reviewing editorial notes) and when to use the alternative (read_document for full prose). It also notes a prerequisite (open project and valid document id).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_documentRead DocumentARead-onlyIdempotent
Read the text of a single document. By default returns plain text; set format to "formatted" to get rich text with styling and structure preserved. Use offset and limit to page through long documents by word range instead of returning the whole thing. Use get_document_info when you only need metadata, or search/semantic_search to find content across many documents. Requires an open project and a valid document id.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of words to return from offset. Omit to read to the end. | |
| format | No | "plain" (default) returns unstyled text and supports offset/limit paging. "formatted" returns rich text with styling and structure preserved (paged reading does not apply). | |
| offset | No | Zero-based word index to start reading from. Default 0. Plain format only. | |
| documentId | Yes | Scrivener document UUID, as returned by get_structure (a binder item "id"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and no destructiveness. The description adds valuable details: format differences, paging behavior (limit/offset work only in plain mode), and requirement for open project. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three focused sentences; front-loaded with purpose. Every sentence earns its place, with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given it's a simple read operation with comprehensive annotations and schema, the description covers format options, paging, prerequisites, and alternatives. No output schema needed as return values are explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear parameter descriptions. The description reiterates paging and format behavior but adds limited new meaning beyond the schema's existing documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states it reads the text of a single document, with clear options for plain or formatted text. It distinguishes from siblings like get_document_info, search, and semantic_search by contrasting their purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use this tool versus alternatives (get_document_info for metadata, search/semantic_search for content across documents). Also states prerequisites (open project, valid document id).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_snapshotRead Document SnapshotARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| documentId | Yes | UUID of the document. | |
| snapshotId | Yes | Snapshot id from list_snapshots. |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | No | Snapshot date. |
| text | Yes | Snapshot content as plain text. |
| title | No | Snapshot title ("" if none). |
| wordCount | Yes | Word count of the snapshot text. |
| documentId | Yes | |
| snapshotId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description confirms read-only nature and no alteration, matching annotations. Adds that RTF is converted to plain text and requires open project, providing useful context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences with clear purpose, parameter guidance, and behavioral notes. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given output schema exists, description covers all needed aspects: input, behavior, side effects (none), and prerequisites. Complete for a read-only retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description adds meaning by specifying snapshotId comes from list_snapshots, which aids proper usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool returns text of a snapshot, specifies resource (snapshot), action (return text), and distinguishes from sibling tools like list_snapshots and create_snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use (to get snapshot text), gives prerequisite (open project), and implies not to use for listing or creating.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recallRecall Project FactsARead-onlyIdempotent
Read back the project's persistent memory: stored characters, world-building, plot threads, and style guide. Returns the requested store, or the full memory when memoryType is omitted or "all". Use remember to write new facts. Requires an open project.
| Name | Required | Description | Default |
|---|---|---|---|
| memoryType | No | Which memory store to read. Omit or use "all" to return the full project memory. |
Output Schema
| Name | Required | Description |
|---|---|---|
| memory | Yes | The requested memory store. For "all" (or omitted) this is the full project memory object (characters, worldBuilding, plotThreads, styleGuide, and more); for a specific memoryType it is that store: an array for characters and plotThreads, an object for styleGuide and worldBuilding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds value by specifying default return behavior (full memory when memoryType is omitted or 'all'), which is not covered by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences that cover purpose, usage guidance, and default behavior with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (1 optional parameter, rich annotations, output schema present), the description is complete: it covers what the tool does, how to use it, alternatives, prerequisites, and default behavior. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description adds semantic value by explaining the default behavior of omitting memoryType or using 'all', going beyond the enum description in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Read back' and the resource 'project's persistent memory', specifying the types of stored information (characters, world-building, plot threads, style guide). It also distinguishes itself from the sibling 'remember' tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: 'Use remember to write new facts' and 'Requires an open project.' It clearly indicates when to use this tool (reading) vs. its write counterpart, though it lacks explicit when-not-to-use scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_projectReload Project From DiskAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond the annotations by explaining that the tool discards the in-memory cache and reloads from disk. Annotations already indicate idempotentHint=true, openWorldHint=true, and destructiveHint=false, but the description provides concrete context for these traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the primary action, then context, then a prerequisite. No extraneous information, every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters, no output schema, and annotations covering behavioral hints, the description is fully adequate. It explains the purpose, usage scenario, and prerequisite, making it complete for an agent to decide when and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, and the description explicitly states 'Takes no parameters.' This is helpful reinforcement. With 100% schema coverage and no parameters, the description does not need to add more, earning baseline 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Reload' and the resource 'open project from disk', specifying the action of discarding the in-memory cache. This distinguishes it from siblings like 'open_project' and 'close_project', as it refreshes the current project rather than opening or closing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 'when the project has been changed by the Scrivener app or another process while open here'. It also specifies a prerequisite: 'Requires an open project', providing clear context and exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rememberRemember Project FactsA
Store or update a fact in the project's persistent memory so later tools and sessions stay consistent: a character profile, world-building detail, plot thread, or style-guide entry. Pass an id inside data to update an existing entry, or omit it to add a new one. Use recall to read memory back. Requires an open project.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | The entry to store. Include an "id" field to update an existing entry; omit it to create a new one. | |
| memoryType | Yes | Which memory store to write to: "characters", "worldBuilding", "plotThreads", "styleGuide", or "all" for arbitrary custom context. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains update behavior ('Pass an id inside data to update an existing entry, or omit it to add a new one') and requires an open project. Annotations lack specific behavioral hints beyond readOnly/write, so the description adds useful context without contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and examples. Every sentence is useful; no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 2 parameters, 100% schema coverage, and no output schema, the description effectively explains what to store and how to use the parameters. It could mention the return value (e.g., confirmation), but the key behaviors are covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. The description adds value by explaining how to update vs create via the 'id' field in data, and the memoryType enum is described. This aids correct parameter usage beyond the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to store or update facts in persistent memory. It lists concrete examples (character profile, world-building detail, plot thread, style-guide entry) and distinguishes from sibling 'recall' for reading.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly mentions when to use a sibling tool ('Use recall to read memory back') and states a prerequisite ('Requires an open project'). It does not list scenarios to avoid, but the context from sibling names makes alternatives clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_documentRestore Document From TrashAIdempotent
Restore a trashed document back into the binder, optionally into a specific target folder (otherwise it returns to a default location). Use list_trash to find the document id first. This is the inverse of delete_document. Requires an open project and a valid document id.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Write even if the project appears open in Scrivener. Default false, which refuses the write to protect against your changes being overwritten by Scrivener on save. | |
| documentId | Yes | Scrivener document UUID, as returned by get_structure (a binder item "id"). | |
| targetFolderId | No | Optional id of the folder to restore into. Omit to restore to a default location. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide idempotentHint true, destructiveHint false, and readOnlyHint false. The description adds context: it requires an open project, uses list_trash as prerequisite, and describes the optional folder behavior. It does not contradict annotations and adds meaningful behavioral information beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each contributing distinct value: purpose and option, prerequisite, and relationship to sibling tool. No wasted words, front-loaded with the core action. This is an excellent example of brevity with substance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (restoration with optional folder, prerequisites), and full schema coverage with no output schema, the description covers the essential points: what it does, how to get the required ID, and the required project state. It does not delve into error cases or edge cases, but this is acceptable for typical usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds context for documentId ('use list_trash to find') and targetFolderId ('optionally into a specific target folder'), but does not add extra meaning beyond the schema's descriptions for force or other parameters. This is adequate but not exceptional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Restore', the resource 'trashed document', and the context 'back into the binder, optionally into a specific target folder'. It also explicitly positions itself as the inverse of delete_document, distinguishing it from sibling tools like delete_document or move_document.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: 'Use list_trash to find the document id first' and 'Requires an open project and a valid document id'. It also states the optional nature of targetFolderId. While it does not list when not to use or alternative tools, the context is clear enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearch DocumentsARead-onlyIdempotent
Search the open project and return matching documents with relevance-ranked snippets. By default performs an intelligent full-text/semantic search of document content; set field to "title" for a fast case-insensitive title lookup, or scope to "trash" to search only trashed documents. For meaning-based "find passages about X" queries use semantic_search; to find every occurrence of a specific name or term use find_mentions. Requires an open project.
| Name | Required | Description | Default |
|---|---|---|---|
| field | No | "content" (default) searches document body text; "title" matches document titles only (fast, case-insensitive substring). | |
| query | Yes | Search query: keywords for full-text search, or a natural-language phrase for semantic search, depending on the tool. | |
| regex | No | Treat the query as a regular expression. Default false. Content search only. | |
| scope | No | "active" (default) searches the live binder; "trash" searches only trashed documents. | |
| searchIn | No | Additional metadata fields to include in content search, e.g. "synopsis", "notes". | |
| caseSensitive | No | Match case exactly. Default false. Applies to content search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | Matching documents. Field set varies by search mode: content/semantic searches return id/title/snippet/score; title search returns id/title/type/path; trash search returns documentId/title/matches. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds context like default full-text/semantic search, field options, and scope behavior; no contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single paragraph, front-loaded with main action, concise yet informative with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, an output schema, and sibling tools, the description covers main behavior, constraints, and distinctions fully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds high-level context (e.g., 'intelligent full-text/semantic search') and clarifies defaults, adding value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches the open project and returns matching documents with snippets. It distinguishes from siblings like semantic_search and find_mentions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly guides when to use this tool vs alternatives: use semantic_search for meaning-based queries and find_mentions for specific terms, also notes requirement of an open project.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
semantic_searchSemantic SearchARead-onlyIdempotent
Find passages by meaning rather than exact words, using embeddings over the project, and return the most relevant documents with similarity scores and related entities. Use this for conceptual "find passages about X" queries; use search for keyword/full-text matching and find_mentions to locate every occurrence of a specific name or term. Calls an external embedding model. Requires an open project with semantic indexing available.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query: keywords for full-text search, or a natural-language phrase for semantic search, depending on the tool. | |
| threshold | No | Minimum similarity score (0-1) a result must meet to be returned. Default 0.5; raise for stricter matches, lower for broader recall. | |
| maxResults | No | Maximum number of results to return. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | Documents most relevant to the query, ordered by similarity. |
| searchType | No | Search mode used; always 'semantic' for this tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive. Description adds context about external embedding model calls and prerequisite (open project with semantic indexing), which is valuable beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each serving a distinct purpose (what it does, when to use, requirements). No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given output schema and comprehensive annotations, the description adequately covers purpose, usage, dependencies, and prerequisites, leaving no gaps for agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with good descriptions for each parameter. The tool description does not add new information about parameters beyond reinforcing the overall purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Find passages by meaning rather than exact words' and contrasts with sibling tools search and find_mentions, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use ('conceptual queries') and when not, naming specific alternatives (search, find_mentions).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_writing_goalSet Writing GoalADestructive
Create or replace the active word-count goal for a cadence (daily, weekly, or whole project), optionally with a target date. Setting a goal of a type that already has an active goal updates that goal in place rather than stacking duplicates. Use when the writer commits to a target ("write 1000 words a day", "finish an 80k novel by December"); not when you only want to read current progress (use get_writing_goals) or log a finished session. Related: get_writing_goals, predict_completion. Requires the project database.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Goal cadence: "daily" or "weekly" track words written in that window; "project" tracks the whole manuscript toward a final length. | |
| targetDate | No | Optional deadline as an ISO date, e.g. "2026-12-31". Used to judge whether progress is on pace. Omit for an open-ended goal. | |
| targetWords | Yes | Target word count for this goal, a positive whole number (e.g. 1000 for a daily goal, 80000 for a novel-length project goal). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains that setting a goal of a type that already has an active goal updates in place rather than stacking duplicates, which goes beyond the destructiveHint annotation. It also notes the requirement for a project database. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three well-structured sentences, each adding value: purpose+behavior, usage guidelines, and related tools/requirements. No extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description sufficiently covers behavior (updates in place), preconditions (requires project database), and related tools. It is complete and actionable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaningful context for each parameter: explains the behavior of 'type' cadences, the purpose of 'targetDate' for pacing judgment, and that 'targetWords' is a positive whole number.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it creates or replaces an active word-count goal for a cadence (daily, weekly, or project) with optional target date. It uses specific verbs and resource, and distinguishes from siblings like get_writing_goals and predict_completion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use ('when the writer commits to a target') and when-not-to-use ('not when you only want to read current progress... or log a finished session'), and names alternative tools (get_writing_goals, predict_completion).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_writing_preferencesSet Writing PreferencesAIdempotent
Set the author writing preferences that shape AI writing output (enhance_content and other generative tools). Preferences are injected into the AI prompt, so changes take effect on the next enhancement. All fields are optional and merge into the existing profile. Use when the writer states a preferred tone, complexity, length, point of view, style guide, or a custom instruction. Requires an open project (preferences persist in the project database).
| Name | Required | Description | Default |
|---|---|---|---|
| tone | No | Desired tone: "neutral" (no steer), "formal", "casual", or "creative". | |
| length | No | Verbosity: "balanced" (no steer), "concise", or "comprehensive". | |
| enabled | No | Master switch. When false, preferences are kept but not applied to AI output. | |
| complexity | No | Language complexity: "balanced" (no steer), "simple", or "advanced". | |
| pointOfView | No | Narrative point of view to maintain, e.g. "third-person limited". Free text; pass an empty string to clear. | |
| styleGuides | No | Style guides to honour, e.g. ["Chicago"]. Replaces the existing list; pass [] to clear. | |
| customInstructions | No | Free-form instruction appended verbatim to the AI directive. Pass an empty string to clear. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring idempotentHint=true and destructiveHint=false, the description adds valuable context: preferences are injected into the AI prompt and take effect on the next enhancement, fields merge into the existing profile, and an open project is required. This goes beyond annotations, though it could mention that preferences persist in the database.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the main purpose, and every sentence adds unique value: what it does, how it works, when to use it, and prerequisites. No redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 optional parameters, no required fields, and no output schema, the description covers the tool's effect on AI output, merging behavior, clearing semantics, and the need for an open project. It does not specify error handling if no project is open, but overall it is sufficiently complete for a settings tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for each parameter. The description adds meaning beyond schema: 'All fields are optional and merge into the existing profile', clarifies clearing behavior for pointOfView, styleGuides, and customInstructions (pass empty string/array), and explains customInstructions is appended verbatim. This enhances understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Set the author writing preferences that shape AI writing output', specifying the verb 'set', the resource 'writing preferences', and the context of influencing generative tools like enhance_content. This distinguishes it from the sibling get_writing_preferences, which reads preferences.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use when the writer states a preferred tone, complexity, length, point of view, style guide, or a custom instruction' and notes the prerequisite 'Requires an open project'. It provides clear context but does not explicitly mention when not to use it or alternatives like get_writing_preferences to check before setting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_connectionsSuggest Missing ConnectionsARead-onlyIdempotent
Suggest characters or locations a document might be missing: entities it does not mention but that frequently co-occur — in other documents — with the entities it does mention. Deterministic co-occurrence inference (no AI), ranked by how many of the document’s entities each suggestion travels with. Use this to spot a scene that omits a character who usually appears with its cast. Returns empty when the document has no known entities. Requires an open project.
| Name | Required | Description | Default |
|---|---|---|---|
| documentId | Yes | UUID of the document to suggest connections for. |
Output Schema
| Name | Required | Description |
|---|---|---|
| documentId | Yes | The document suggestions are for. |
| suggestions | Yes | Candidate entities to consider adding, strongest first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds behavioral context beyond annotations: deterministic (no AI), ranked by co-occurrence count, requires open project. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with clear structure: action, method, usage, edge case, prerequisite. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given output schema and annotations, covers all necessary info: functionality, ranking logic, deterministic nature, edge case, prerequisite.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter with description. The tool description repeats the parameter's purpose but doesn't add new syntax or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool suggests missing characters/locations based on co-occurrence. Distinguishes from siblings like discover_connections and add_relationship.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides context for when to use (spot missing characters) and when not (returns empty if no known entities). Mentions prerequisite (open project). Could be more explicit about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_improvementsSuggest ImprovementsARead-only
Generate AI writing suggestions for a prompt or a specific document — ideas for revision, next steps, or alternatives. Returns suggestion text. Optionally grounds the suggestions in a document's content. Use this for generative "how could this be better" help; use analyze_document for structured metrics or check_consistency to find contradictions.
| Name | Required | Description | Default |
|---|---|---|---|
| async | No | Run as a background job and return a job id instead of waiting. Default false. | |
| prompt | Yes | What to get suggestions about, e.g. "tighten the opening paragraph". | |
| documentId | No | Scrivener document UUID, as returned by get_structure (a binder item "id"). | |
| useContext | No | Ground suggestions in the referenced document's content. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. The description adds that it returns suggestion text and optionally grounds in document content, which is useful behavioral context beyond annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, no wasted words. Efficiently communicates core function and usage distinction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage guidance, return type, and optional grounding. Could detail the async behavior or exact output structure, but schema covers async and the tool is simple enough that the description is adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description does not need to add much. It mentions the key parameters (prompt, documentId, useContext) but does not provide meaning beyond schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Generate') and resource ('AI writing suggestions'), clearly scoped to a prompt or document. It distinguishes from sibling tools by explicitly referencing analyze_document and check_consistency.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear guidance on when to use ('how could this be better' help) and when not to (use analyze_document for metrics, check_consistency for contradictions), providing explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_documentUpdate Document Title & MetadataAIdempotent
Update a document's title and/or its metadata (synopsis, notes, label, status, and custom fields) in a single call. Pass only the fields you want to change; omitted fields are left untouched. To change the body text use write_document; to move it use move_document. Requires an open project and a valid document id.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Write even if the project appears open in Scrivener. Default false, which refuses the write to protect against your changes being overwritten by Scrivener on save. | |
| label | No | Label name (e.g. a POV character or chapter color label). | |
| notes | No | Document notes (the inspector Notes pane). | |
| title | No | New title for the document. Omit to leave the title unchanged. | |
| status | No | Status name (e.g. "To Do", "First Draft", "Done"). | |
| synopsis | No | Synopsis / index-card text shown in the Scrivener outliner. | |
| documentId | Yes | Scrivener document UUID, as returned by get_structure (a binder item "id"). | |
| customMetadata | No | Map of custom metadata field names to string values. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses partial update behavior (omitted fields untouched) and explains force parameter effect. Annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false) are consistent with description. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose and constraints. Every sentence adds value without redundancy. Efficient and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters (including nested customMetadata) and no output schema, the description covers update scope, optionality, alternatives, and prerequisites fully. No missing critical context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage with descriptive parameter docs. Description adds overall guidance on partial updates not present in individual descriptions, but the schema already provides strong semantics, so slight value over baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it updates a document's title and metadata (synopsis, notes, label, status, custom fields) in a single call. It distinguishes from sibling tools write_document (body) and move_document, providing specific verb+resource with context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use (update title/metadata) and when not (use write_document for body, move_document for moving). Mentions prerequisite: requires open project and valid documentId. Also advises partial update strategy: pass only fields to change.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
use_skillActivate SkillAIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| name | Yes | The skill to activate, e.g. "documents", "search", or "analysis". Get valid names from list_skills. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (idempotentHint, non-destructive), it describes return value (tool names/schemas) and automatic tool list update for clients supporting list_changed, adding significant behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences efficiently convey the main action, return details, and usage context. No wasted words; information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with no output schema, the description fully covers purpose, return, and usage. No gaps are evident.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description repeats the schema's guidance to get valid names from list_skills but adds no new meaning beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Activate a skill so its tools become available to call,' using a specific verb and resource. It distinguishes itself from siblings like 'list_skills' by explaining the activation workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly advises to 'Call list_skills first to see the available skill names' and notes that most tools are pre-activated, giving clear when-to-use and when-not-to-use context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_project_integrityVerify Project IntegrityARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| includeTrash | No | Whether to also verify documents in the project trash. Defaults to true so the whole project is checked; set false to skip trashed items. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when no error-severity issues were found. |
| issues | Yes | Every integrity problem found; empty when the project is clean. |
| checked | Yes | Number of binder items inspected. |
| summary | Yes | One-line human-readable summary of the check. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, destructiveHint. The description adds context: it only detects problems and never repairs them, and lists specific structural issues checked. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences plus a related tools note and prerequisite. Every sentence adds value: purpose, usage guidelines, behavioral note. Could be slightly more concise but still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description need not explain returns. It covers purpose, usage, behavioral constraints, and parameter details are handled by schema. It is contextually complete for a read-only inspection tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a description for includeTrash. The tool description does not add additional meaning to the parameter beyond what is in the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Scan'), names the resource ('open project'), and lists exact problem types (missing/malformed/duplicate UUIDs, missing type, unreadable/empty backing content). It explicitly distinguishes from sibling tools get_structure and get_document_info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear when-to-use scenarios (corrupted project, after manual edits, before bulk operation) and when-not-to (just want document tree or single document), with named alternatives. Also states prerequisite: an open project.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_documentWrite DocumentAIdempotent
Replace a document's text with new content, preserving the surrounding Scrivener formatting the edit did not touch (stylesheet, styles, images, footnotes) byte-for-byte. The result reports whether formatting was fully preserved; when an edit would drop non-round-trippable content it takes a Scrivener snapshot first (restorable in Scrivener) and says so. To change only the title or metadata use update_document; to add a new document use create_document. Requires an open project and a valid document id.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Write even if the project appears open in Scrivener. Default false, which refuses the write to protect against your changes being overwritten by Scrivener on save. | |
| content | Yes | Document body as plain text. May be empty. | |
| documentId | Yes | Scrivener document UUID, as returned by get_structure (a binder item "id"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behaviors beyond annotations: it reports formatting preservation, takes a Scrivener snapshot when dropping non-round-trippable content, and explains the force parameter's default refusal. Annotations already provide idempotentHint=true and destructiveHint=false, so the description adds value without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded: it states the purpose first, then covers behavior, alternatives, and prerequisites in a clear, well-structured paragraph without unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all necessary aspects: what the tool does, how it handles formatting, the safety behavior (force and snapshot), alternatives, and prerequisites. Even without an output schema, it explains the return result (formatting preservation report and snapshot notification).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description does not add significant new meaning beyond the schema's parameter descriptions. The force parameter behavior is already described in the schema, so no extra semantic value from the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Replace a document's text with new content, preserving the surrounding Scrivener formatting...' It uses a specific verb (replace) and resource (document's text), and explicitly distinguishes from siblings update_document and create_document.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use alternatives: 'To change only the title or metadata use update_document; to add a new document use create_document.' It also mentions prerequisites: 'Requires an open project and a valid document id.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
15 tool updates
v0.12.0- Added
compare_snapshot - Changed
compile_documents5 fields changed- added
Input schema / properties / includeExcludedAdded value: +{ + "description": "For mode \"structured\": include documents whose \"Include in Compile\" flag is off. Default false (excluded documents are omitted, matching Scrivener).", + "type": "boolean" +} - added
Input schema / properties / includeTitlesAdded value: +{ + "description": "For mode \"structured\": emit each document title as a heading. Default true.", + "type": "boolean" +} - changed
Input schema / properties / mode / descriptionPrevious value: -"\"standard\" (default) joins documents in order; \"intelligent\" applies AI optimization toward targetOptimization."New value: +"\"standard\" (default) joins documents in order; \"structured\" compiles the Draft/Manuscript folder (like Scrivener) with the binder hierarchy as headings and a scene separator between documents, honoring each document's \"Include in Compile\" flag — deterministic, no AI; \"intelligent\" applies AI optimization toward targetOptimization." - changed
Input schema / properties / mode / enumPrevious value: -[ - "standard", - "intelligent" -]New value: +[ + "standard", + "structured", + "intelligent" +] - added
Input schema / properties / sceneSeparatorAdded value: +{ + "description": "For mode \"structured\": text placed between consecutive sibling documents (e.g. \"#\" or \"* * *\"). Default empty (a blank line).", + "type": "string" +}
- Changed
create_document1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Write even if the project appears open in Scrivener. Default false, which refuses the write to protect against your changes being overwritten by Scrivener on save.", + "type": "boolean" +}
- Added
create_snapshot - Changed
delete_document1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Write even if the project appears open in Scrivener. Default false, which refuses the write to protect against your changes being overwritten by Scrivener on save.", + "type": "boolean" +}
- Removed
get_document_references - Added
get_entity_references - Added
get_manuscript_briefing - Removed
get_referencing_documents - Added
list_snapshots - Changed
move_document1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Write even if the project appears open in Scrivener. Default false, which refuses the write to protect against your changes being overwritten by Scrivener on save.", + "type": "boolean" +}
- Added
read_snapshot - Changed
restore_document1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Write even if the project appears open in Scrivener. Default false, which refuses the write to protect against your changes being overwritten by Scrivener on save.", + "type": "boolean" +}
- Changed
update_document1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Write even if the project appears open in Scrivener. Default false, which refuses the write to protect against your changes being overwritten by Scrivener on save.", + "type": "boolean" +}
- Changed
write_document1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Write even if the project appears open in Scrivener. Default false, which refuses the write to protect against your changes being overwritten by Scrivener on save.", + "type": "boolean" +}
7 tool updates
v0.9.0- Added
detect_open_project - Changed
export_project8 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"Target file format to export to."New value: +"Target file format. Text formats (markdown, html, json) return their content inline; binary formats (docx, epub, pdf) are written to a file and return its path." - changed
Input schema / properties / format / enumPrevious value: -[ - "markdown", - "html", - "json", - "epub" -]New value: +[ + "markdown", + "html", + "json", + "docx", + "epub", + "pdf" +] - changed
Input schema / properties / outputPath / descriptionPrevious value: -"Absolute or project-relative path to write the exported file. Omit to use a default location."New value: +"Absolute or project-relative path to write the exported file. Omit to use a default location (the working directory, named after the project title). Required in effect only if you want a specific location for docx/epub/pdf." - added
Output schema / properties / bytesAdded value: +{ + "description": "Size of the written file in bytes (binary formats only).", + "type": "number" +} - changed
Output schema / properties / content / descriptionPrevious value: -"The exported document content."New value: +"The exported document content (text formats only)." - changed
Output schema / properties / format / descriptionPrevious value: -"Format the project was exported to (markdown, html, json, or epub)."New value: +"Format the project was exported to (markdown, html, json, docx, epub, or pdf)." - added
Output schema / properties / pathAdded value: +{ + "description": "Path of the written file (binary formats: docx, epub, pdf).", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "format", - "content", - "metadata" -]New value: +[ + "format", + "metadata" +]
- Added
find_orphaned_entities - Added
get_compile_settings - Added
get_document_references - Added
get_referencing_documents - Added
suggest_connections
42 tool updates
- Changed
analyze_document2 fields changed- added
Input schema / properties / documentId / descriptionAdded value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "issues": { + "description": "Craft issues found in the document.", + "items": { + "properties": { + "description": { + "description": "What the issue is.", + "type": "string" + }, + "severity": { + "description": "Issue severity when known (low/medium/high).", + "type": "string" + } + }, + "required": [ + "description" + ], + "type": "object" + }, + "type": "array" + }, + "pacing": { + "description": "Pacing assessment of the passage (e.g. slow/steady/fast with a brief reason).", + "type": "string" + }, + "readability": { + "description": "Readability assessment of the passage (e.g. easy/moderate/complex with a brief reason).", + "type": "string" + } + }, + "required": [ + "readability", + "pacing", + "issues" + ], + "type": "object" +}
- Removed
analyze_narrative - Changed
analyze_writing_style1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "analysis": { + "description": "Structured style profile of the samples (sentence variety, tone, voice, pacing, and other stylistic features).", + "type": "object" + } + }, + "required": [ + "analysis" + ], + "type": "object" +}
- Changed
character_network1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "network": { + "additionalProperties": { + "items": { + "properties": { + "properties": { + "description": "Optional edge properties (present via the Neo4j backend).", + "type": "object" + }, + "relation": { + "description": "Relationship label from the source to the target.", + "type": "string" + }, + "target": { + "description": "Name of the connected character.", + "type": "string" + } + }, + "required": [ + "target", + "relation" + ], + "type": "object" + }, + "type": "array" + }, + "description": "Map keyed by source character name; each value is that character's outgoing edges.", + "type": "object" + } + }, + "required": [ + "network" + ], + "type": "object" +}
- Removed
check_character_continuity - Changed
check_consistency1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "checkTypes": { + "description": "The continuity dimensions that were checked.", + "items": { + "type": "string" + }, + "type": "array" + }, + "counts": { + "description": "Issue tallies by severity.", + "properties": { + "errors": { + "description": "Number of error-severity issues.", + "type": "number" + }, + "info": { + "description": "Number of info-severity issues.", + "type": "number" + }, + "total": { + "description": "Total issues found.", + "type": "number" + }, + "warnings": { + "description": "Number of warning-severity issues.", + "type": "number" + } + }, + "required": [ + "total", + "errors", + "warnings", + "info" + ], + "type": "object" + }, + "issues": { + "description": "Continuity issues found, sorted by severity.", + "items": { + "properties": { + "description": { + "description": "What the issue is.", + "type": "string" + }, + "documentId": { + "description": "Id of the document the issue relates to, when applicable.", + "type": "string" + }, + "severity": { + "description": "Severity: error, warning, or info.", + "type": "string" + }, + "suggestion": { + "description": "Recommended action to resolve the issue, when available.", + "type": "string" + }, + "type": { + "description": "Issue category (character, timeline, worldbuilding, plot, or location).", + "type": "string" + } + }, + "required": [ + "type", + "severity", + "description" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "issues", + "counts", + "checkTypes" + ], + "type": "object" +}
- Changed
check_plot_consistency1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "issues": { + "description": "Plot-level inconsistencies found (present for synchronous runs).", + "items": { + "properties": { + "issue": { + "description": "Description of the inconsistency.", + "type": "string" + }, + "locations": { + "description": "Document ids involved in the issue.", + "items": { + "type": "string" + }, + "type": "array" + }, + "severity": { + "description": "Severity of the issue.", + "enum": [ + "low", + "medium", + "high" + ], + "type": "string" + }, + "suggestion": { + "description": "Suggested way to resolve the issue.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "jobId": { + "description": "Identifier of the queued job (present when run asynchronously).", + "type": "string" + }, + "message": { + "description": "Human-readable status message.", + "type": "string" + } + }, + "type": "object" +}
- Added
collect_feedback - Changed
compile_documents1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "charCount": { + "description": "Character count of the compiled manuscript.", + "type": "number" + }, + "file": { + "description": "File reference the compiled text was spooled to. Present only when the result was too large to inline.", + "type": "string" + }, + "format": { + "description": "Format the manuscript was compiled to (text, markdown, or html).", + "type": "string" + }, + "sections": { + "description": "Number of documents compiled into the manuscript.", + "type": "number" + }, + "text": { + "description": "The compiled manuscript text. Present for small results; large results spool to a file instead.", + "type": "string" + }, + "wordCount": { + "description": "Word count of the compiled manuscript.", + "type": "number" + } + }, + "required": [ + "format", + "wordCount", + "charCount", + "sections" + ], + "type": "object" +}
- Changed
create_document3 fields changed- added
Input schema / properties / content / descriptionAdded value: +"Document body as plain text. May be empty." - added
Input schema / properties / parentId / descriptionAdded value: +"UUID of a binder folder, as returned by get_structure." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "documentId": { + "description": "Scrivener UUID of the newly created document or folder.", + "type": "string" + } + }, + "required": [ + "documentId" + ], + "type": "object" +}
- Changed
delete_document1 field changed- added
Input schema / properties / documentId / descriptionAdded value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")."
- Changed
discover_connections1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "connections": { + "description": "Candidate connections inferred from entity co-occurrence, not yet in the graph.", + "items": { + "properties": { + "entity1": { + "description": "Name of the first entity in the candidate connection.", + "type": "string" + }, + "entity2": { + "description": "Name of the second entity in the candidate connection.", + "type": "string" + }, + "strength": { + "description": "Similarity score for the candidate connection (0-1).", + "type": "number" + } + }, + "required": [ + "entity1", + "entity2", + "strength" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "connections" + ], + "type": "object" +}
- Changed
discover_projects1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "count": { + "description": "Number of projects found.", + "type": "number" + }, + "projects": { + "description": "Absolute paths of the .scriv projects found.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "projects", + "count" + ], + "type": "object" +}
- Changed
enhance_content1 field changed- added
Input schema / properties / documentId / descriptionAdded value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")."
- Changed
export_project1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "content": { + "description": "The exported document content.", + "type": "string" + }, + "format": { + "description": "Format the project was exported to (markdown, html, json, or epub).", + "type": "string" + }, + "metadata": { + "description": "Export metadata: exportDate, format, and documentCount (number of documents exported).", + "type": "object" + } + }, + "required": [ + "format", + "content", + "metadata" + ], + "type": "object" +}
- Changed
find_mentions1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "mentions": { + "description": "Occurrences of the entity, up to 50, each with surrounding context.", + "items": { + "properties": { + "id": { + "description": "Id of the document containing the match.", + "type": "string" + }, + "score": { + "description": "Always null; mentions are unranked.", + "type": "null" + }, + "snippet": { + "description": "Context around the match, truncated to 100 characters.", + "type": "string" + }, + "title": { + "description": "Title of the document.", + "type": "string" + } + }, + "required": [ + "id", + "title", + "snippet" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "mentions" + ], + "type": "object" +}
- Changed
find_relationships1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "relationships": { + "description": "Stored relationships in which the queried entity is the head or tail.", + "items": { + "properties": { + "head": { + "description": "Source entity name.", + "type": "string" + }, + "headType": { + "description": "Type of the source entity.", + "type": "string" + }, + "id": { + "description": "Deterministic relationship id.", + "type": "string" + }, + "properties": { + "description": "Optional edge properties, when present.", + "type": "object" + }, + "relation": { + "description": "Relationship label from head to tail.", + "type": "string" + }, + "tail": { + "description": "Target entity name.", + "type": "string" + }, + "tailType": { + "description": "Type of the target entity.", + "type": "string" + } + }, + "required": [ + "id", + "head", + "headType", + "relation", + "tail", + "tailType" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "relationships" + ], + "type": "object" +}
- Changed
get_document_info2 fields changed- added
Input schema / properties / documentId / descriptionAdded value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "document": { + "description": "The document metadata (body text excluded).", + "properties": { + "customMetadata": { + "description": "Map of custom metadata field names to string values.", + "type": "object" + }, + "id": { + "description": "Scrivener UUID of the document.", + "type": "string" + }, + "includeInCompile": { + "description": "Whether the document is included in compile.", + "type": "boolean" + }, + "keywords": { + "description": "Keywords assigned to the document.", + "items": { + "type": "string" + }, + "type": "array" + }, + "label": { + "description": "Label name, if set.", + "type": "string" + }, + "notes": { + "description": "Inspector notes, if set.", + "type": "string" + }, + "path": { + "description": "Binder path of the document.", + "type": "string" + }, + "status": { + "description": "Status name, if set.", + "type": "string" + }, + "synopsis": { + "description": "Synopsis / index-card text, if set.", + "type": "string" + }, + "title": { + "description": "Document title.", + "type": "string" + }, + "type": { + "description": "Item type: \"Text\", \"Folder\", or \"Other\".", + "type": "string" + }, + "wordCount": { + "description": "Word count of the document body.", + "type": "number" + } + }, + "required": [ + "id", + "title", + "type", + "path" + ], + "type": "object" + }, + "location": { + "description": "Where the document lives: \"active\", \"trash\", or \"unknown\".", + "type": "string" + }, + "metadata": { + "description": "Derived metadata map (synopsis, notes, keywords, status, label) as strings.", + "type": "object" + }, + "path": { + "description": "Ancestor chain from the binder root to the document.", + "items": { + "properties": { + "id": { + "description": "UUID of the ancestor binder item.", + "type": "string" + }, + "title": { + "description": "Title of the ancestor item.", + "type": "string" + }, + "type": { + "description": "Type of the ancestor item.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "document", + "path", + "metadata", + "location" + ], + "type": "object" +}
- Changed
get_job_status1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "error": { + "description": "Failure reason when the job failed or was not found.", + "type": "string" + }, + "progress": { + "description": "Completion progress of the job.", + "type": "number" + }, + "result": { + "description": "Job result when the job has completed." + }, + "state": { + "description": "Current job state (e.g. queued, running, completed, failed, not_found).", + "type": "string" + } + }, + "required": [ + "state", + "progress" + ], + "type": "object" +}
- Removed
get_memory_stats - Changed
get_statistics1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "author": { + "description": "Project author, if set.", + "type": "string" + }, + "averageDocumentLength": { + "description": "Average word count per text document.", + "type": "number" + }, + "documentsByLabel": { + "description": "Count of documents keyed by label.", + "type": "object" + }, + "documentsByStatus": { + "description": "Count of documents keyed by status.", + "type": "object" + }, + "documentsByType": { + "description": "Count of documents keyed by type.", + "type": "object" + }, + "draftDocuments": { + "description": "Number of documents in the Draft.", + "type": "number" + }, + "lastModified": { + "description": "ISO timestamp of when these statistics were generated.", + "type": "string" + }, + "longestDocument": { + "description": "The longest document, or null if none.", + "type": [ + "object", + "null" + ] + }, + "metadata": { + "description": "Project metadata.", + "type": "object" + }, + "recentlyModified": { + "description": "Recently modified documents.", + "type": "array" + }, + "researchDocuments": { + "description": "Number of documents in Research.", + "type": "number" + }, + "shortestDocument": { + "description": "The shortest document, or null if none.", + "type": [ + "object", + "null" + ] + }, + "title": { + "description": "Project title (defaults to \"Untitled\").", + "type": "string" + }, + "totalCharacters": { + "description": "Total character count across all documents.", + "type": "number" + }, + "totalDocuments": { + "description": "Total number of items in the project.", + "type": "number" + }, + "totalFolders": { + "description": "Number of folder items.", + "type": "number" + }, + "totalWords": { + "description": "Total word count across all documents.", + "type": "number" + }, + "trashedDocuments": { + "description": "Number of trashed documents.", + "type": "number" + } + }, + "required": [ + "totalDocuments", + "totalFolders", + "totalWords", + "totalCharacters", + "draftDocuments", + "researchDocuments", + "trashedDocuments", + "metadata", + "documentsByType", + "documentsByStatus", + "documentsByLabel", + "averageDocumentLength", + "recentlyModified", + "title", + "lastModified" + ], + "type": "object" +}
- Changed
get_structure3 fields changed- added
Input schema / properties / folderId / descriptionAdded value: +"UUID of a binder folder, as returned by get_structure." - added
Input schema / properties / includeTrash / descriptionAdded value: +"Set true to include trashed items in the result. Default false." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "documents": { + "description": "Flat list of binder items in tree order (present unless summaryOnly).", + "items": { + "properties": { + "depth": { + "description": "Nesting depth, 0 for top-level items.", + "type": "number" + }, + "hasChildren": { + "description": "Whether the item contains nested items.", + "type": "boolean" + }, + "id": { + "description": "Document/folder UUID for read_document etc.", + "type": "string" + }, + "title": { + "description": "Item title as shown in the binder.", + "type": "string" + }, + "type": { + "description": "Item type, e.g. \"Text\" or \"Folder\".", + "type": "string" + }, + "wordCount": { + "description": "Word count of the item (0 for folders).", + "type": "number" + } + }, + "type": "object" + }, + "type": "array" + }, + "structure": { + "description": "Nested binder tree (present when flat is false).", + "type": "object" + }, + "summary": { + "description": "Project-level counts plus title and author (present when summaryOnly).", + "type": "object" + } + }, + "type": "object" +}
- Added
get_writing_goals - Added
get_writing_preferences - Changed
list_skills1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "skills": { + "description": "The available skills (tool groups).", + "items": { + "properties": { + "activated": { + "description": "Whether the skill is already active this session.", + "type": "boolean" + }, + "description": { + "description": "What the skill covers.", + "type": "string" + }, + "name": { + "description": "Skill identifier passed to use_skill.", + "type": "string" + }, + "tool_names": { + "description": "Names of the visible tools in the skill.", + "items": { + "type": "string" + }, + "type": "array" + }, + "tools": { + "description": "Number of visible tools in the skill.", + "type": "number" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "skills" + ], + "type": "object" +}
- Changed
list_trash1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "items": { + "description": "Documents currently in the project trash, in binder order.", + "items": { + "properties": { + "id": { + "description": "Document id.", + "type": "string" + }, + "path": { + "description": "Binder path of the item.", + "type": "string" + }, + "title": { + "description": "Document title.", + "type": "string" + }, + "type": { + "description": "Binder item type (Text, Folder, or Other).", + "type": "string" + }, + "wordCount": { + "description": "Word count, when known.", + "type": "number" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "items" + ], + "type": "object" +}
- Changed
move_document2 fields changed- added
Input schema / properties / documentId / descriptionAdded value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")." - added
Input schema / properties / targetFolderId / descriptionAdded value: +"UUID of a binder folder, as returned by get_structure."
- Changed
queue_document_analysis3 fields changed- added
Input schema / properties / content / descriptionAdded value: +"Document body as plain text. May be empty." - added
Input schema / properties / documentId / descriptionAdded value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "jobId": { + "description": "Identifier of the queued job; poll it with get_job_status.", + "type": "string" + } + }, + "required": [ + "jobId" + ], + "type": "object" +}
- Changed
queue_project_analysis1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "jobId": { + "description": "Identifier of the queued batch job; poll it with get_job_status.", + "type": "string" + } + }, + "required": [ + "jobId" + ], + "type": "object" +}
- Changed
read_annotations2 fields changed- added
Input schema / properties / documentId / descriptionAdded value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "comments": { + "description": "Inline comments as [key, value] pairs, where key identifies the comment and value is its text.", + "items": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "array" + }, + "footnotes": { + "description": "Footnotes as [key, value] pairs, where key identifies the footnote and value is its text.", + "items": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "array" + } + }, + "required": [ + "comments", + "footnotes" + ], + "type": "object" +}
- Changed
read_document1 field changed- added
Input schema / properties / documentId / descriptionAdded value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")."
- Changed
recall1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "memory": { + "description": "The requested memory store. For \"all\" (or omitted) this is the full project memory object (characters, worldBuilding, plotThreads, styleGuide, and more); for a specific memoryType it is that store: an array for characters and plotThreads, an object for styleGuide and worldBuilding." + } + }, + "required": [ + "memory" + ], + "type": "object" +}
- Changed
restore_document1 field changed- added
Input schema / properties / documentId / descriptionAdded value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")."
- Changed
search2 fields changed- added
Input schema / properties / query / descriptionAdded value: +"Search query: keywords for full-text search, or a natural-language phrase for semantic search, depending on the tool." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "results": { + "description": "Matching documents. Field set varies by search mode: content/semantic searches return id/title/snippet/score; title search returns id/title/type/path; trash search returns documentId/title/matches.", + "items": { + "properties": { + "documentId": { + "description": "Document id (trash-scope results).", + "type": "string" + }, + "id": { + "description": "Document id.", + "type": "string" + }, + "matches": { + "description": "Matched excerpts (trash-scope results).", + "items": { + "type": "string" + }, + "type": "array" + }, + "path": { + "description": "Binder path (title-field results).", + "type": "string" + }, + "score": { + "description": "Relevance score, or null when unranked.", + "type": [ + "number", + "null" + ] + }, + "snippet": { + "description": "Relevance snippet (content/semantic results).", + "type": "string" + }, + "title": { + "description": "Document title.", + "type": "string" + }, + "type": { + "description": "Binder item type (title-field results).", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "results" + ], + "type": "object" +}
- Changed
semantic_search3 fields changed- added
Input schema / properties / maxResults / descriptionAdded value: +"Maximum number of results to return." - added
Input schema / properties / query / descriptionAdded value: +"Search query: keywords for full-text search, or a natural-language phrase for semantic search, depending on the tool." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "results": { + "description": "Documents most relevant to the query, ordered by similarity.", + "items": { + "properties": { + "id": { + "description": "Document id.", + "type": "string" + }, + "score": { + "description": "Similarity score, or null when unavailable.", + "type": [ + "number", + "null" + ] + }, + "snippet": { + "description": "Leading excerpt of the matched document.", + "type": "string" + }, + "title": { + "description": "Document title.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "searchType": { + "description": "Search mode used; always 'semantic' for this tool.", + "type": "string" + } + }, + "required": [ + "results" + ], + "type": "object" +}
- Added
set_writing_goal - Added
set_writing_preferences - Changed
suggest_improvements1 field changed- added
Input schema / properties / documentId / descriptionAdded value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")."
- Removed
track_motifs - Changed
update_document1 field changed- added
Input schema / properties / documentId / descriptionAdded value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")."
- Added
verify_project_integrity - Changed
write_document2 fields changed- added
Input schema / properties / content / descriptionAdded value: +"Document body as plain text. May be empty." - added
Input schema / properties / documentId / descriptionAdded value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")."
68 tool updates
- Changed
add_relationship5 fields changed- added
Input schema / properties / head / descriptionAdded value: +"Name of the source entity, e.g. a character name like \"Elena\"." - added
Input schema / properties / headType / descriptionAdded value: +"Type of the source entity." - added
Input schema / properties / relation / descriptionAdded value: +"The relationship verb/label from head to tail, e.g. \"mentors\", \"appears_in\"." - added
Input schema / properties / tail / descriptionAdded value: +"Name of the target entity the relationship points to." - added
Input schema / properties / tailType / descriptionAdded value: +"Type of the target entity."
- Changed
analyze_document2 fields changed- added
Input schema / properties / analysisTypes / descriptionAdded value: +"Aspects to focus the analysis on. Omit or use [\"all\"] for a broad analysis; otherwise pick any of readability, sentiment, themes, characters, pacing, style, structure." - changed
Input schema / properties / analysisTypes / items / enumPrevious value: -[ - "readability", - "sentiment", - "themes", - "characters", - "pacing", - "all" -]New value: +[ + "readability", + "sentiment", + "themes", + "characters", + "pacing", + "style", + "structure", + "all" +]
- Changed
analyze_narrative4 fields changed- added
Input schema / properties / analysisType / descriptionAdded value: +"Which facet to analyze: \"structure\" (arc/beats), \"motifs\", \"relationships\", or \"all\" (default)." - added
Input schema / properties / options / descriptionAdded value: +"Optional output toggles." - added
Input schema / properties / options / properties / includeMetrics / descriptionAdded value: +"Include quantitative narrative metrics in the result. Default false." - added
Input schema / properties / options / properties / includeVisualization / descriptionAdded value: +"Include graph/visualization data in the result. Default false."
- Changed
analyze_writing_style1 field changed- added
Input schema / properties / samples / descriptionAdded value: +"Array of text samples (strings) to analyze. Provide one or more passages of prose."
- Removed
build_vector_store - Changed
cancel_job2 fields changed- added
Input schema / properties / jobId / descriptionAdded value: +"The job id returned when the job was enqueued." - added
Input schema / properties / jobType / descriptionAdded value: +"The kind of job, as returned when the job was enqueued."
- Changed
check_character_continuity3 fields changed- added
Input schema / properties / chapterId / descriptionAdded value: +"Optional chapter/folder id to limit the check to a single chapter." - added
Input schema / properties / characterName / descriptionAdded value: +"Exact name of the character to audit, e.g. \"Elena\"." - added
Input schema / properties / includeRelationships / descriptionAdded value: +"When true, also report continuity of the character's relationships with others. Default false."
- Changed
check_consistency1 field changed- added
Input schema / properties / checkTypes / descriptionAdded value: +"Continuity dimensions to check. Omit or use [\"all\"] for every check; otherwise pick any of characters, timeline, locations, plotThreads."
- Changed
check_plot_consistency2 fields changed- added
Input schema / properties / async / descriptionAdded value: +"Run as a background job and return a job id instead of waiting. Default false." - added
Input schema / properties / documents / descriptionAdded value: +"Array of documents (id and content) to check together, e.g. the chapters of a manuscript."
- Removed
collect_feedback - Changed
compile_documents9 fields changed- added
Input schema / properties / documentIdsAdded value: +{ + "description": "Optional explicit list of document ids to compile, in order. Overrides rootFolderId when provided; most useful with mode \"intelligent\".", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / format / descriptionAdded value: +"Output format of the compiled manuscript. Default \"text\"." - added
Input schema / properties / hierarchical / descriptionAdded value: +"Preserve the binder folder hierarchy as headings. Default false." - added
Input schema / properties / includeNotes / descriptionAdded value: +"Include each document's notes in the output. Default false." - added
Input schema / properties / includeSynopsis / descriptionAdded value: +"Include each document's synopsis in the output. Default false." - added
Input schema / properties / modeAdded value: +{ + "description": "\"standard\" (default) joins documents in order; \"intelligent\" applies AI optimization toward targetOptimization.", + "enum": [ + "standard", + "intelligent" + ], + "type": "string" +} - added
Input schema / properties / rootFolderId / descriptionAdded value: +"Optional binder folder id to compile only its descendants. Omit to compile all text documents." - added
Input schema / properties / separator / descriptionAdded value: +"Text inserted between documents in the standard-mode fallback. Default \"\\n\\n---\\n\\n\"." - added
Input schema / properties / targetOptimizationAdded value: +{ + "description": "For mode \"intelligent\": what to optimize the compiled output for. Default \"general\".", + "enum": [ + "agent", + "submission", + "pitch_packet", + "synopsis", + "query_letter", + "general" + ], + "type": "string" +}
- Changed
create_document2 fields changed- added
Input schema / properties / documentType / descriptionAdded value: +"Whether to create a \"Text\" document (default) or a \"Folder\"." - added
Input schema / properties / title / descriptionAdded value: +"Title for the new document or folder. Truncated to 255 characters."
- Removed
cross_reference_analysis - Changed
discover_connections1 field changed- added
Input schema / properties / k / descriptionAdded value: +"Maximum number of candidate connections to return. Omit for the engine default."
- Changed
discover_projects1 field changed- changed
Input schema / properties / searchPath / descriptionPrevious value: -"Additional directory to search (optional)"New value: +"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."
- Changed
enhance_content2 fields changed- added
Input schema / properties / enhancementType / descriptionAdded value: +"The improvement goal: \"grammar\" fixes errors, \"style\" refines voice, \"clarity\" simplifies, \"expand\" lengthens, \"summarize\" condenses, \"creative\" reworks freely." - added
Input schema / properties / options / descriptionAdded value: +"Optional enhancement parameters passed through to the enhancer."
- Changed
export_project3 fields changed- added
Input schema / properties / format / descriptionAdded value: +"Target file format to export to." - added
Input schema / properties / options / descriptionAdded value: +"Optional format-specific export options (e.g. metadata, styling)." - added
Input schema / properties / outputPath / descriptionAdded value: +"Absolute or project-relative path to write the exported file. Omit to use a default location."
- Removed
find_analogies - Removed
find_cooccurrences - Removed
find_document - Changed
find_mentions2 fields changed- changed
Input schema / properties / contextLength / descriptionPrevious value: -"Context chars"New value: +"Number of characters of surrounding context to include on each side of a match. Default 100." - added
Input schema / properties / entity / descriptionAdded value: +"The exact name or term to locate, e.g. a character name like \"Elena\"."
- Changed
find_relationships3 fields changed- added
Input schema / properties / entity / descriptionAdded value: +"Name of the entity to find relationships for, e.g. a character name." - added
Input schema / properties / k / descriptionAdded value: +"Maximum number of related entities to return. Omit for the engine default." - added
Input schema / properties / relation / descriptionAdded value: +"Optional relationship type to filter by (e.g. \"mentors\"). Omit to return all relationship types."
- Removed
fractal_search - Removed
generate_ai_suggestions - Changed
generate_content6 fields changed- added
Input schema / properties / context / descriptionAdded value: +"Optional project context to steer generation." - added
Input schema / properties / context / properties / characterIds / descriptionAdded value: +"Ids of characters the generated content should be consistent with." - added
Input schema / properties / context / properties / documentId / descriptionAdded value: +"Id of a document to use as surrounding context." - added
Input schema / properties / context / properties / style / descriptionAdded value: +"Target writing style or voice." - changed
Input schema / properties / length / descriptionPrevious value: -"Word count"New value: +"Approximate target length in words. Default 500." - added
Input schema / properties / prompt / descriptionAdded value: +"Natural-language instruction describing the content to generate."
- Changed
generate_marketing_materials3 fields changed- added
Input schema / properties / length / descriptionAdded value: +"Target length: short (~500 words), medium (~1000, default), or long (~2000)." - added
Input schema / properties / materialType / descriptionAdded value: +"Which marketing artifact to generate." - added
Input schema / properties / targetAudience / descriptionAdded value: +"Optional description of the intended audience or market (e.g. \"YA fantasy readers\")."
- Removed
get_all_documents - Removed
get_document_annotations - Changed
get_job_status2 fields changed- added
Input schema / properties / jobId / descriptionAdded value: +"The job id returned when the job was enqueued." - added
Input schema / properties / jobType / descriptionAdded value: +"The kind of job, as returned when the job was enqueued."
- Removed
get_memory - Removed
get_memory_analytics - Changed
get_memory_stats2 fields changed- added
Input schema / properties / documentId / descriptionAdded value: +"Optional document id to report memory stats for a single document instead of the whole project." - added
Input schema / properties / includeDetails / descriptionAdded value: +"Include a per-component breakdown rather than summary totals. Default false."
- Removed
get_queue_stats - Changed
get_statistics1 field changed- added
Input schema / properties / detailed / descriptionAdded value: +"Include extended per-category statistics when available. Default false."
- Changed
get_structure3 fields changed- changed
Input schema / properties / flat / descriptionPrevious value: -"Compact array format (default true)"New value: +"When true (default), return a compact flat array of [id, title, type, depth, wordCount, hasChildren] tuples. When false, return the nested tree object." - changed
Input schema / properties / maxDepth / descriptionPrevious value: -"Max depth"New value: +"Maximum depth to descend into the binder tree, starting at 0 for top-level items. Omit to return the full hierarchy." - changed
Input schema / properties / summaryOnly / descriptionPrevious value: -"Counts only"New value: +"When true, skip the tree and return only project-level counts (documents, words) plus title and author. Default false."
- Removed
get_word_count - Removed
hhm_dream - Removed
ingest_document_fractal - Removed
ingest_project_fractal - Removed
intelligent_compilation - Changed
move_document1 field changed- added
Input schema / properties / position / descriptionAdded value: +"Zero-based index at which to insert the item among the target folder's children. Omit to append at the end."
- Removed
multi_agent_analysis - Changed
open_project1 field changed- changed
Input schema / properties / path / descriptionPrevious value: -"Path to .scriv"New value: +"Path to the Scrivener project: either the .scriv folder (e.g. \"~/Documents/My Novel.scriv\") or the .scrivx file inside it. Absolute or ~-relative."
- Changed
queue_document_analysis5 fields changed- added
Input schema / properties / options / descriptionAdded value: +"Optional flags selecting which analyses to run and the job priority." - added
Input schema / properties / options / properties / includeEntities / descriptionAdded value: +"Include named-entity extraction (characters, places). Default false." - added
Input schema / properties / options / properties / includeReadability / descriptionAdded value: +"Include readability scoring. Default false." - added
Input schema / properties / options / properties / includeSentiment / descriptionAdded value: +"Include sentiment analysis. Default false." - added
Input schema / properties / options / properties / priority / descriptionAdded value: +"Queue priority; higher runs sooner. Default 0."
- Changed
queue_project_analysis6 fields changed- added
Input schema / properties / documents / descriptionAdded value: +"Array of documents (id and content) to include in the batch analysis." - added
Input schema / properties / options / descriptionAdded value: +"Optional batch execution settings." - added
Input schema / properties / options / properties / batchSize / descriptionAdded value: +"Number of documents per batch when processing in parallel." - added
Input schema / properties / options / properties / parallel / descriptionAdded value: +"Process documents concurrently rather than sequentially. Default false." - added
Input schema / properties / options / properties / priority / descriptionAdded value: +"Queue priority; higher runs sooner. Default 0." - added
Input schema / properties / projectId / descriptionAdded value: +"Identifier of the project the documents belong to."
- Added
read_annotations - Changed
read_document3 fields changed- added
Input schema / properties / formatAdded value: +{ + "description": "\"plain\" (default) returns unstyled text and supports offset/limit paging. \"formatted\" returns rich text with styling and structure preserved (paged reading does not apply).", + "enum": [ + "plain", + "formatted" + ], + "type": "string" +} - changed
Input schema / properties / limit / descriptionPrevious value: -"Max words to return"New value: +"Maximum number of words to return from offset. Omit to read to the end." - changed
Input schema / properties / offset / descriptionPrevious value: -"Start word index"New value: +"Zero-based word index to start reading from. Default 0. Plain format only."
- Removed
read_document_formatted - Added
recall - Removed
recover_document - Added
remember - Removed
rename_document - Added
restore_document - Added
search - Removed
search_content - Removed
search_trash - Changed
semantic_search3 fields changed- removed
Input schema / properties / kRemoved value: -{ - "type": "number" -} - added
Input schema / properties / maxResultsAdded value: +{ + "type": "number" +} - added
Input schema / properties / thresholdAdded value: +{ + "description": "Minimum similarity score (0-1) a result must meet to be returned. Default 0.5; raise for stricter matches, lower for broader recall.", + "type": "number" +}
- Removed
start_realtime_assistance - Removed
store_chapter_order - Added
suggest_improvements - Removed
sync_to_neo4j - Changed
track_motifs3 fields changed- added
Input schema / properties / chapterId / descriptionAdded value: +"Optional chapter/folder id to limit motif tracking to a single chapter." - added
Input schema / properties / minStrength / descriptionAdded value: +"Minimum recurrence strength (0–1) a motif must reach to be reported. Higher values return only the most prominent motifs. Omit for no threshold." - added
Input schema / properties / patternType / descriptionAdded value: +"Restrict to one motif kind: \"theme\", \"symbol\", \"phrase\", or \"structure\". Omit to track all kinds."
- Added
update_document - Removed
update_memory - Removed
update_metadata - Removed
update_retrieval_policy - Changed
use_skill1 field changed- changed
Input schema / properties / name / descriptionPrevious value: -"Skill name from list_skills"New value: +"The skill to activate, e.g. \"documents\", \"search\", or \"analysis\". Get valid names from list_skills."
- Removed
vector_search
69 tool updates
v0.6.0- First observed
add_relationship - First observed
analyze_document - First observed
analyze_narrative - First observed
analyze_writing_style - First observed
build_vector_store - First observed
cancel_job - First observed
character_network - First observed
check_character_continuity - First observed
check_consistency - First observed
check_plot_consistency - First observed
close_project - First observed
collect_feedback - First observed
compile_documents - First observed
create_document - First observed
cross_reference_analysis - First observed
delete_document - First observed
discover_connections - First observed
discover_projects - First observed
enhance_content - First observed
export_project - First observed
find_analogies - First observed
find_cooccurrences - First observed
find_document - First observed
find_mentions - First observed
find_relationships - First observed
fractal_search - First observed
generate_ai_suggestions - First observed
generate_content - First observed
generate_marketing_materials - First observed
get_all_documents - First observed
get_document_annotations - First observed
get_document_info - First observed
get_job_status - First observed
get_memory - First observed
get_memory_analytics - First observed
get_memory_stats - First observed
get_queue_stats - First observed
get_statistics - First observed
get_structure - First observed
get_word_count - First observed
hhm_dream - First observed
ingest_document_fractal - First observed
ingest_project_fractal - First observed
intelligent_compilation - First observed
list_skills - First observed
list_trash - First observed
move_document - First observed
multi_agent_analysis - First observed
open_project - First observed
queue_document_analysis - First observed
queue_project_analysis - First observed
read_document - First observed
read_document_formatted - First observed
recover_document - First observed
refresh_project - First observed
rename_document - First observed
search_content - First observed
search_trash - First observed
semantic_search - First observed
start_realtime_assistance - First observed
store_chapter_order - First observed
sync_to_neo4j - First observed
track_motifs - First observed
update_memory - First observed
update_metadata - First observed
update_retrieval_policy - First observed
use_skill - First observed
vector_search - First observed
write_document
TDQS
Scored across 57 tools
Most tools have clearly differentiated purposes, especially around document CRUD, snapshots, search modes, and export. However, the cluster of analysis and feedback tools—analyze_document, analyze_writing_style, check_consistency, check_plot_consistency, and suggest_improvements—has meaningful overlap and requires careful description-reading to select correctly.
The naming convention is overwhelmingly verb_noun snake_case with consistent prefixes like get_, list_, create_, read_, write_, and set_. A few bare-verb or noun-style exceptions such as search, remember, recall, and character_network deviate slightly, preventing a perfect score.
At 57 tools, this server is in the extreme mismatch range and presents a very heavy namespace for agents to navigate. The skills-based progressive disclosure mitigates discovery cost, but it does not reduce the total surface, and many analysis and generation tools could likely be consolidated.
The tool surface covers the full Scrivener workflow: project discovery and session lifecycle, document CRUD and trash recovery, snapshots, metadata, multiple search modes, AI analysis and generation, goals, memory, relationship graphs, compile/export, and background jobs. There are no obvious dead ends for the stated domain.
Maintenance
Related MCP Connectors
Persistent context for Claude. Your AI always knows your projects and next actions across sessions.
Give Claude only the Google Drive files you choose. Every action logged.
- platform7nOAuthtech.p7n
Connect Claude to your Platform7n workspaces — chat, links, and tasks. One-click OAuth.
Persistent memory for Claude Code and Cursor. Stop re-explaining your project every session.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables Claude Desktop to search and query personal document collections (PDF, Word, Markdown, text) using semantic search and conversational AI with full context preservation across exchanges.MIT
- AlicenseAqualityNot gradedmaintenanceEnables AI assistants to read, write, organize, search, and compile Scrivener writing projects. Supports manuscript editing, document management, consistency checking, and PDF export for writers using Scrivener 3.228 npm-
- AlicenseBqualityNot gradedmaintenanceEnables AI-powered knowledge management and creative support by connecting Scrapbox data to Claude. Supports advanced search, relationship analysis between pages, theme extraction, and literary analysis of personal knowledge bases.32-
- AlicenseNot gradedqualityDmaintenanceLocal MCP server that exposes Scrivener projects to AI clients, enabling project creation, binder navigation, document read/write, and metadata updates without opening Scrivener.87 npm1AGPL 3.0