Skip to main content
Glama

CI CodeQL OpenSSF Scorecard OpenSSF Best Practices License Code of Conduct GitHub Sponsors


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 install -g scrivener-mcp

Restart 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-setup

This 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-mcp

Then 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 claude

npx (no install)

Use directly without installing globally:

npx scrivener-mcp

Or 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-mcp

Or a specific release:

npm install -g writerslogic/scrivener-mcp#v0.12.0

Homebrew (macOS)

brew install writerslogic/tap/scrivener-mcp

Docker

docker build -t scrivener-mcp https://github.com/writerslogic/scrivener-mcp.git
docker run -i --rm -v /path/to/your/projects:/projects scrivener-mcp

Run the interactive setup to auto-detect and configure your client:

npx scrivener-setup

This 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_KEY environment variables

  • ~/.env, ~/.scrivener-mcp/.env

  • ~/.anthropic/key, ~/.openai/key, ~/.openrouter/key

  • macOS 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-here

Or 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 .scriv project 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_project

Open a .scriv project (accepts .scriv folders or .scrivx files) and make it active

discover_projects

Scan common locations for Scrivener projects when you don't know the path

detect_open_project

Detect the project currently open in the Scrivener app (macOS) so you don't need a path

get_structure

Browse the binder hierarchy (folders, documents, word counts)

refresh_project

Reload from disk after external edits

close_project

Close the active project and flush pending changes

verify_project_integrity

Read-only scan for structural problems (missing/duplicate UUIDs, unreadable content)

get_compile_settings

Read the project's compile formats and taxonomy -- labels/statuses (with colors), collections, section types

get_manuscript_briefing

One "where am I?" snapshot: words vs. target (% to goal), document/status/label counts, longest/shortest documents

list_snapshots

List Scrivener snapshots (title, date) for one document or the whole project

read_snapshot

Read a snapshot's text as plain text, with word count

compare_snapshot

Diff a snapshot against the current document (or another snapshot): paragraphs added/removed and net word change

create_snapshot

Take a Scrivener-native snapshot of a document (restorable from Scrivener's own Snapshots browser) before editing

Tool

What it does

get_document_info

Metadata for one document (title, type, word count, synopsis, label, status)

read_document

Read content; format: "formatted" for rich text, offset/limit to page long docs

write_document

Replace a document's content (atomic, with pre-write backup)

create_document

Create a new text document or folder

update_document

Change title and/or metadata (synopsis, notes, label, status, custom fields)

move_document

Reorganize within the binder

delete_document

Move to trash (reversible)

Tool

What it does

search

Keyword/full-text search; field: "title" for titles, scope: "trash" for trash

semantic_search

Find passages by meaning using the local HMS index plus provider-backed query interpretation, with similarity scores

find_mentions

Locate every occurrence of a specific name or term, with context

list_trash

List trashed documents

restore_document

Restore a document from trash

read_annotations

Read a document's comments and footnotes

Tool

What it does

analyze_document

AI writing analysis; focus with aspects (structure, style, pacing, themes...)

check_consistency

Project-wide continuity check; scope for plot, characters, or timeline

analyze_writing_style

Style-focused analysis

check_plot_consistency

Plot-thread consistency check

suggest_improvements

AI-generated improvement suggestions

enhance_content

Suggest a specific improvement to a document

generate_content

Generate new prose from a prompt and context

set_writing_goal

Set a word-count goal (daily, weekly, or whole project) with an optional target date

get_writing_goals

List goals with progress -- percent complete, words remaining, on-pace status

set_writing_preferences

Set author preferences (tone, complexity, length, POV, style guide) that steer AI output

get_writing_preferences

Show current preferences plus feedback insights and suggestions

collect_feedback

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

compile_documents

Combine documents; mode: "structured" compiles the Draft folder with the binder hierarchy as headings and honors "Include in Compile" (no AI), mode: "intelligent" for AI-optimized output

export_project

Write the manuscript to disk -- Markdown, HTML, JSON inline, or DOCX, EPUB, PDF as a file

get_statistics

Project-level word/document/character counts

generate_marketing_materials

Draft synopsis, query letter, pitch, and related materials

Tool

What it does

remember

Store information that persists across sessions with the project

recall

Retrieve previously stored memory

Memory is stored within each .scriv project and travels with it.

Tool

What it does

add_relationship

Store a relationship between characters, locations, themes, or plot threads

find_relationships

Query entities related to a given character/theme/location

discover_connections

Find co-occurring entities across the manuscript

character_network

The character relationship network

get_entity_references

Trace the reference graph in either direction: entities a document mentions (by documentId), or documents mentioning an entity (by entity)

find_orphaned_entities

List registered characters/locations that no document actually mentions

suggest_connections

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

queue_document_analysis

Enqueue an async analysis of one document; returns a job id

queue_project_analysis

Enqueue an async analysis of the whole project

get_job_status

Poll progress/results for a queued job

cancel_job

Cancel a queued or running job

Tool

What it does

list_skills

List the available tool groups and their tools

use_skill

Activate a tool group (most are pre-activated by default)

Guides

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 only

Why 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

jiayun

TwelveTake

Scrivener Assistant

ricopicone

zaphodsdad

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

PDF

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 / uv

source / pip install -e

License

AGPL-3.0 / commercial dual-license

MIT

MIT

MIT

not declared

MIT

Repository/package status

weekly activity; npm 0.12.0

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 tools
add_relationshipAdd RelationshipA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
headYesName of the source entity, e.g. a character name like "Elena".
tailYesName of the target entity the relationship points to.
headTypeYesType of the source entity.
relationYesThe relationship verb/label from head to tail, e.g. "mentors", "appears_in".
tailTypeYesType of the target entity.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 DocumentA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
documentIdYesScrivener document UUID, as returned by get_structure (a binder item "id").
analysisTypesNoAspects 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

ParametersJSON Schema
NameRequiredDescription
issuesYesCraft issues found in the document.
pacingYesPacing assessment of the passage (e.g. slow/steady/fast with a brief reason).
readabilityYesReadability assessment of the passage (e.g. easy/moderate/complex with a brief reason).

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 StyleA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
samplesYesArray of text samples (strings) to analyze. Provide one or more passages of prose.

Output Schema

ParametersJSON Schema
NameRequiredDescription
analysisYesStructured style profile of the samples (sentence variety, tone, voice, pacing, and other stylistic features).

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 JobA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYesThe job id returned when the job was enqueued.
jobTypeYesThe kind of job, as returned when the job was enqueued.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 NetworkA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
networkYesMap keyed by source character name; each value is that character's outgoing edges.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ConsistencyA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
checkTypesNoContinuity dimensions to check. Omit or use ["all"] for every check; otherwise pick any of characters, timeline, locations, plotThreads.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countsYesIssue tallies by severity.
issuesYesContinuity issues found, sorted by severity.
checkTypesYesThe continuity dimensions that were checked.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 ConsistencyA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
asyncNoRun as a background job and return a job id instead of waiting. Default false.
documentsYesArray of documents (id and content) to check together, e.g. the chapters of a manuscript.

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobIdNoIdentifier of the queued job (present when run asynchronously).
issuesNoPlot-level inconsistencies found (present for synchronous runs).
messageNoHuman-readable status message.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ProjectA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ratingNoSatisfaction rating from 1 (poor) to 5 (excellent). Optional.
commentNoOptional free-text comment.
acceptedNoWhether the AI output was kept (true) or discarded (false). Optional.
operationYesThe operation being rated, e.g. "enhance_content" or "compile_documents".

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 SnapshotA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
documentIdYesUUID of the document.
snapshotIdYesThe baseline snapshot id (from list_snapshots).
againstSnapshotIdNoOptional second snapshot id to compare against. Omit to compare against the current document text.

Output Schema

ParametersJSON Schema
NameRequiredDescription
toYesWhat it was compared against ("current" or a snapshot id).
fromYesThe baseline snapshot.
wordDeltaYesto.wordCount minus from.wordCount (negative means text was cut).
documentIdYes
wordsAddedNoWords present in the compared-to text but not the snapshot (word-level).
wordsRemovedNoWords present in the snapshot but not the compared-to text (word-level).
addedParagraphsYesParagraphs present in the compared-to text but not the snapshot.
removedParagraphsYesParagraphs present in the snapshot but not the compared-to text.
unchangedParagraphsNoCount of paragraphs common to both.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 DocumentsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo"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.
formatNoOutput format of the compiled manuscript. Default "text".
separatorNoText inserted between documents in the standard-mode fallback. Default "\n\n---\n\n".
documentIdsNoOptional explicit list of document ids to compile, in order. Overrides rootFolderId when provided; most useful with mode "intelligent".
hierarchicalNoPreserve the binder folder hierarchy as headings. Default false.
includeNotesNoInclude each document's notes in the output. Default false.
rootFolderIdNoOptional binder folder id to compile only its descendants. Omit to compile all text documents.
includeTitlesNoFor mode "structured": emit each document title as a heading. Default true.
sceneSeparatorNoFor mode "structured": text placed between consecutive sibling documents (e.g. "#" or "* * *"). Default empty (a blank line).
includeExcludedNoFor mode "structured": include documents whose "Include in Compile" flag is off. Default false (excluded documents are omitted, matching Scrivener).
includeSynopsisNoInclude each document's synopsis in the output. Default false.
targetOptimizationNoFor mode "intelligent": what to optimize the compiled output for. Default "general".

Output Schema

ParametersJSON Schema
NameRequiredDescription
fileNoFile reference the compiled text was spooled to. Present only when the result was too large to inline.
textNoThe compiled manuscript text. Present for small results; large results spool to a file instead.
formatYesFormat the manuscript was compiled to (text, markdown, or html).
sectionsYesNumber of documents compiled into the manuscript.
charCountYesCharacter count of the compiled manuscript.
wordCountYesWord count of the compiled manuscript.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoWrite 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.
titleYesTitle for the new document or folder. Truncated to 255 characters.
contentNoDocument body as plain text. May be empty.
parentIdNoUUID of a binder folder, as returned by get_structure.
documentTypeNoWhether to create a "Text" document (default) or a "Folder".

Output Schema

ParametersJSON Schema
NameRequiredDescription
documentIdYesScrivener UUID of the newly created document or folder.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoSnapshot title shown in Scrivener. Defaults to "Snapshot".
documentIdYesUUID of the document to snapshot.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateYesTimestamp recorded for the snapshot.
titleYes
documentIdYes
snapshotIdYesId of the new snapshot (for read_snapshot).

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 DocumentA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoWrite 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.
documentIdYesScrivener document UUID, as returned by get_structure (a binder item "id").

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ProjectA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchPathNoOptional extra directory to resolve project names against, in addition to the default locations. Absolute or ~-relative path.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNumber of resolved open projects.
runningYesWhether the Scrivener app appears to be running.
supportedYesFalse on platforms where detection is not implemented (non-macOS).
unresolvedYesOpen project names that could not be matched to a .scriv folder on disk.
openProjectsYesOpen projects resolved to a .scriv path.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ConnectionsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
kNoMaximum number of candidate connections to return. Omit for the engine default.

Output Schema

ParametersJSON Schema
NameRequiredDescription
connectionsYesCandidate connections inferred from entity co-occurrence, not yet in the graph.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ProjectsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchPathNoOptional 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

ParametersJSON Schema
NameRequiredDescription
countYesNumber of projects found.
projectsYesAbsolute paths of the .scriv projects found.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ContentA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionsNoOptional enhancement parameters passed through to the enhancer.
documentIdYesScrivener document UUID, as returned by get_structure (a binder item "id").
enhancementTypeYesThe improvement goal: "grammar" fixes errors, "style" refines voice, "clarity" simplifies, "expand" lengthens, "summarize" condenses, "creative" reworks freely.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 FileA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatYesTarget 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.
optionsNoOptional format-specific export options (e.g. metadata, styling).
outputPathNoAbsolute 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

ParametersJSON Schema
NameRequiredDescription
pathNoPath of the written file (binary formats: docx, epub, pdf).
bytesNoSize of the written file in bytes (binary formats only).
formatYesFormat the project was exported to (markdown, html, json, docx, epub, or pdf).
contentNoThe exported document content (text formats only).
metadataYesExport metadata: exportDate, format, and documentCount (number of documents exported).

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 MentionsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
entityYesThe exact name or term to locate, e.g. a character name like "Elena".
contextLengthNoNumber of characters of surrounding context to include on each side of a match. Default 100.

Output Schema

ParametersJSON Schema
NameRequiredDescription
mentionsYesOccurrences of the entity, up to 50, each with surrounding context.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 EntitiesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
orphansYesRegistered entities with zero mentions across all documents.
registrySizeYesTotal number of registered entities considered.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 RelationshipsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
kNoMaximum number of related entities to return. Omit for the engine default.
entityYesName of the entity to find relationships for, e.g. a character name.
relationNoOptional relationship type to filter by (e.g. "mentors"). Omit to return all relationship types.

Output Schema

ParametersJSON Schema
NameRequiredDescription
relationshipsYesStored relationships in which the queried entity is the head or tail.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ContentA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
lengthNoApproximate target length in words. Default 500.
promptYesNatural-language instruction describing the content to generate.
contextNoOptional project context to steer generation.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 MaterialsA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
lengthNoTarget length: short (~500 words), medium (~1000, default), or long (~2000).
materialTypeYesWhich marketing artifact to generate.
targetAudienceNoOptional description of the intended audience or market (e.g. "YA fantasy readers").

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 SettingsA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
labelsNoLabel definitions with colors.
optionsNoGlobal compile options.
statusesNoStatus definitions.
collectionsNoSaved collections (binder, saved searches, groups).
sectionTypesNoUser-defined section types (Scene, Chapter, Part Heading, ...).
compileFormatsYesNamed compile formats the project defines.
currentFileTypeNoDefault output file type of the last-used compile (e.g. "pdf").
hasCompileSettingsYesFalse when Settings/compile.xml is absent or unreadable.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 InfoA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
documentIdYesScrivener document UUID, as returned by get_structure (a binder item "id").

Output Schema

ParametersJSON Schema
NameRequiredDescription
pathYesAncestor chain from the binder root to the document.
documentYesThe document metadata (body text excluded).
locationYesWhere the document lives: "active", "trash", or "unknown".
metadataYesDerived metadata map (synopsis, notes, keywords, status, label) as strings.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ReferencesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
entityNoRegistry id or name of a character/location to list the documents that mention it, e.g. "Elena". Mutually exclusive with documentId.
documentIdNoUUID of a document to list the entities it mentions (from get_structure). Mutually exclusive with entity.

Output Schema

ParametersJSON Schema
NameRequiredDescription
entityNoEchoed when querying by entity.
mentionsNoEntities the document references (present when querying by documentId).
documentsNoDocuments referencing the entity (present when querying by entity).
documentIdNoEchoed when querying by document.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 StatusA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYesThe job id returned when the job was enqueued.
jobTypeYesThe kind of job, as returned when the job was enqueued.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoFailure reason when the job failed or was not found.
stateYesCurrent job state (e.g. queued, running, completed, failed, not_found).
resultNoJob result when the job has completed.
progressYesCompletion progress of the job.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 BriefingA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
titleNo
wordsYes
authorNo
byLabelYesCount of text documents per label.
longestNoLongest text document by word count, or null.
byStatusYesCount of text documents per status (e.g. To Do, Done).
shortestNoShortest text document by word count, or null.
documentsYes
averageDocumentLengthNoMean words per text document.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 StatisticsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
detailedNoInclude extended per-category statistics when available. Default false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
titleYesProject title (defaults to "Untitled").
authorNoProject author, if set.
metadataYesProject metadata.
totalWordsYesTotal word count across all documents.
lastModifiedYesISO timestamp of when these statistics were generated.
totalFoldersYesNumber of folder items.
draftDocumentsYesNumber of documents in the Draft.
totalDocumentsYesTotal number of items in the project.
documentsByTypeYesCount of documents keyed by type.
longestDocumentNoThe longest document, or null if none.
totalCharactersYesTotal character count across all documents.
documentsByLabelYesCount of documents keyed by label.
recentlyModifiedYesRecently modified documents.
shortestDocumentNoThe shortest document, or null if none.
trashedDocumentsYesNumber of trashed documents.
documentsByStatusYesCount of documents keyed by status.
researchDocumentsYesNumber of documents in Research.
averageDocumentLengthYesAverage word count per text document.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 StructureA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
flatNoWhen true (default), return a compact flat array of [id, title, type, depth, wordCount, hasChildren] tuples. When false, return the nested tree object.
folderIdNoUUID of a binder folder, as returned by get_structure.
maxDepthNoMaximum depth to descend into the binder tree, starting at 0 for top-level items. Omit to return the full hierarchy.
summaryOnlyNoWhen true, skip the tree and return only project-level counts (documents, words) plus title and author. Default false.
includeTrashNoSet true to include trashed items in the result. Default false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
summaryNoProject-level counts plus title and author (present when summaryOnly).
documentsNoFlat list of binder items in tree order (present unless summaryOnly).
structureNoNested binder tree (present when flat is false).

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 GoalsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoOptional filter by goal status. Omit to list goals of every status; use "active" to see only goals still in progress.

Output Schema

ParametersJSON Schema
NameRequiredDescription
goalsYesGoals with computed progress; empty when none match the filter.
projectWordsYesCurrent total word count of the open project.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 PreferencesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
insightsYesAggregated feedback view plus non-binding suggestions.
preferencesYesThe active author writing-preference profile.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 SkillsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
skillsYesThe available skills (tool groups).

TDQS

A4.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 SnapshotsA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
documentIdNoUUID of a single document to list snapshots for. Omit to list all documents.

Output Schema

ParametersJSON Schema
NameRequiredDescription
documentsYesOne entry per document that has snapshots.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 TrashA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYesDocuments currently in the project trash, in binder order.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 DocumentA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoWrite 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.
positionNoZero-based index at which to insert the item among the target folder's children. Omit to append at the end.
documentIdYesScrivener document UUID, as returned by get_structure (a binder item "id").
targetFolderIdYesUUID of a binder folder, as returned by get_structure.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ProjectA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPath to the Scrivener project: either the .scriv folder (e.g. "~/Documents/My Novel.scriv") or the .scrivx file inside it. Absolute or ~-relative.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesDocument body as plain text. May be empty.
optionsNoOptional flags selecting which analyses to run and the job priority.
documentIdYesScrivener document UUID, as returned by get_structure (a binder item "id").

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobIdYesIdentifier of the queued job; poll it with get_job_status.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionsNoOptional batch execution settings.
documentsYesArray of documents (id and content) to include in the batch analysis.
projectIdYesIdentifier of the project the documents belong to.

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobIdYesIdentifier of the queued batch job; poll it with get_job_status.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 AnnotationsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
documentIdYesScrivener document UUID, as returned by get_structure (a binder item "id").
includeCommentsNoInclude inline comments. Default true.
includeFootnotesNoInclude footnotes. Default true.

Output Schema

ParametersJSON Schema
NameRequiredDescription
commentsYesInline comments as [key, value] pairs, where key identifies the comment and value is its text.
footnotesYesFootnotes as [key, value] pairs, where key identifies the footnote and value is its text.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 DocumentA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of words to return from offset. Omit to read to the end.
formatNo"plain" (default) returns unstyled text and supports offset/limit paging. "formatted" returns rich text with styling and structure preserved (paged reading does not apply).
offsetNoZero-based word index to start reading from. Default 0. Plain format only.
documentIdYesScrivener document UUID, as returned by get_structure (a binder item "id").

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 SnapshotA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
documentIdYesUUID of the document.
snapshotIdYesSnapshot id from list_snapshots.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateNoSnapshot date.
textYesSnapshot content as plain text.
titleNoSnapshot title ("" if none).
wordCountYesWord count of the snapshot text.
documentIdYes
snapshotIdYes

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 FactsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
memoryTypeNoWhich memory store to read. Omit or use "all" to return the full project memory.

Output Schema

ParametersJSON Schema
NameRequiredDescription
memoryYesThe 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

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 DiskA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesThe entry to store. Include an "id" field to update an existing entry; omit it to create a new one.
memoryTypeYesWhich memory store to write to: "characters", "worldBuilding", "plotThreads", "styleGuide", or "all" for arbitrary custom context.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 TrashA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoWrite 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.
documentIdYesScrivener document UUID, as returned by get_structure (a binder item "id").
targetFolderIdNoOptional id of the folder to restore into. Omit to restore to a default location.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

set_writing_goalSet Writing GoalA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeYesGoal cadence: "daily" or "weekly" track words written in that window; "project" tracks the whole manuscript toward a final length.
targetDateNoOptional deadline as an ISO date, e.g. "2026-12-31". Used to judge whether progress is on pace. Omit for an open-ended goal.
targetWordsYesTarget word count for this goal, a positive whole number (e.g. 1000 for a daily goal, 80000 for a novel-length project goal).

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 PreferencesA
Idempotent

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
toneNoDesired tone: "neutral" (no steer), "formal", "casual", or "creative".
lengthNoVerbosity: "balanced" (no steer), "concise", or "comprehensive".
enabledNoMaster switch. When false, preferences are kept but not applied to AI output.
complexityNoLanguage complexity: "balanced" (no steer), "simple", or "advanced".
pointOfViewNoNarrative point of view to maintain, e.g. "third-person limited". Free text; pass an empty string to clear.
styleGuidesNoStyle guides to honour, e.g. ["Chicago"]. Replaces the existing list; pass [] to clear.
customInstructionsNoFree-form instruction appended verbatim to the AI directive. Pass an empty string to clear.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ConnectionsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
documentIdYesUUID of the document to suggest connections for.

Output Schema

ParametersJSON Schema
NameRequiredDescription
documentIdYesThe document suggestions are for.
suggestionsYesCandidate entities to consider adding, strongest first.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ImprovementsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
asyncNoRun as a background job and return a job id instead of waiting. Default false.
promptYesWhat to get suggestions about, e.g. "tighten the opening paragraph".
documentIdNoScrivener document UUID, as returned by get_structure (a binder item "id").
useContextNoGround suggestions in the referenced document's content. Default false.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 & MetadataA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoWrite 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.
labelNoLabel name (e.g. a POV character or chapter color label).
notesNoDocument notes (the inspector Notes pane).
titleNoNew title for the document. Omit to leave the title unchanged.
statusNoStatus name (e.g. "To Do", "First Draft", "Done").
synopsisNoSynopsis / index-card text shown in the Scrivener outliner.
documentIdYesScrivener document UUID, as returned by get_structure (a binder item "id").
customMetadataNoMap of custom metadata field names to string values.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 SkillA
Idempotent

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe skill to activate, e.g. "documents", "search", or "analysis". Get valid names from list_skills.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 IntegrityA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeTrashNoWhether 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

ParametersJSON Schema
NameRequiredDescription
okYesTrue when no error-severity issues were found.
issuesYesEvery integrity problem found; empty when the project is clean.
checkedYesNumber of binder items inspected.
summaryYesOne-line human-readable summary of the check.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 DocumentA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoWrite 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.
contentYesDocument body as plain text. May be empty.
documentIdYesScrivener document UUID, as returned by get_structure (a binder item "id").

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 15 tool updatesv0.12.0
    • Addedcompare_snapshot
    • Changedcompile_documents5 fields changed
      • addedInput schema / properties / includeExcluded
        Added value: +{
        +  "description": "For mode \"structured\": include documents whose \"Include in Compile\" flag is off. Default false (excluded documents are omitted, matching Scrivener).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / includeTitles
        Added value: +{
        +  "description": "For mode \"structured\": emit each document title as a heading. Default true.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / mode / description
        Previous 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."
      • changedInput schema / properties / mode / enum
        Previous value: -[
        -  "standard",
        -  "intelligent"
        -]New value: +[
        +  "standard",
        +  "structured",
        +  "intelligent"
        +]
      • addedInput schema / properties / sceneSeparator
        Added value: +{
        +  "description": "For mode \"structured\": text placed between consecutive sibling documents (e.g. \"#\" or \"* * *\"). Default empty (a blank line).",
        +  "type": "string"
        +}
    • Changedcreate_document1 field changed
      • addedInput schema / properties / force
        Added 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"
        +}
    • Addedcreate_snapshot
    • Changeddelete_document1 field changed
      • addedInput schema / properties / force
        Added 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"
        +}
    • Removedget_document_references
    • Addedget_entity_references
    • Addedget_manuscript_briefing
    • Removedget_referencing_documents
    • Addedlist_snapshots
    • Changedmove_document1 field changed
      • addedInput schema / properties / force
        Added 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"
        +}
    • Addedread_snapshot
    • Changedrestore_document1 field changed
      • addedInput schema / properties / force
        Added 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"
        +}
    • Changedupdate_document1 field changed
      • addedInput schema / properties / force
        Added 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"
        +}
    • Changedwrite_document1 field changed
      • addedInput schema / properties / force
        Added 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"
        +}
  2. 7 tool updatesv0.9.0
    • Addeddetect_open_project
    • Changedexport_project8 fields changed
      • changedInput schema / properties / format / description
        Previous 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."
      • changedInput schema / properties / format / enum
        Previous value: -[
        -  "markdown",
        -  "html",
        -  "json",
        -  "epub"
        -]New value: +[
        +  "markdown",
        +  "html",
        +  "json",
        +  "docx",
        +  "epub",
        +  "pdf"
        +]
      • changedInput schema / properties / outputPath / description
        Previous 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."
      • addedOutput schema / properties / bytes
        Added value: +{
        +  "description": "Size of the written file in bytes (binary formats only).",
        +  "type": "number"
        +}
      • changedOutput schema / properties / content / description
        Previous value: -"The exported document content."New value: +"The exported document content (text formats only)."
      • changedOutput schema / properties / format / description
        Previous 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)."
      • addedOutput schema / properties / path
        Added value: +{
        +  "description": "Path of the written file (binary formats: docx, epub, pdf).",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "format",
        -  "content",
        -  "metadata"
        -]New value: +[
        +  "format",
        +  "metadata"
        +]
    • Addedfind_orphaned_entities
    • Addedget_compile_settings
    • Addedget_document_references
    • Addedget_referencing_documents
    • Addedsuggest_connections
  3. 42 tool updates
    • Changedanalyze_document2 fields changed
      • addedInput schema / properties / documentId / description
        Added value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")."
      • changedOutput 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"
        +}
    • Removedanalyze_narrative
    • Changedanalyze_writing_style1 field changed
      • changedOutput 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"
        +}
    • Changedcharacter_network1 field changed
      • changedOutput 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"
        +}
    • Removedcheck_character_continuity
    • Changedcheck_consistency1 field changed
      • changedOutput 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"
        +}
    • Changedcheck_plot_consistency1 field changed
      • changedOutput 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"
        +}
    • Addedcollect_feedback
    • Changedcompile_documents1 field changed
      • changedOutput 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"
        +}
    • Changedcreate_document3 fields changed
      • addedInput schema / properties / content / description
        Added value: +"Document body as plain text. May be empty."
      • addedInput schema / properties / parentId / description
        Added value: +"UUID of a binder folder, as returned by get_structure."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "documentId": {
        +      "description": "Scrivener UUID of the newly created document or folder.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "documentId"
        +  ],
        +  "type": "object"
        +}
    • Changeddelete_document1 field changed
      • addedInput schema / properties / documentId / description
        Added value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")."
    • Changeddiscover_connections1 field changed
      • changedOutput 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"
        +}
    • Changeddiscover_projects1 field changed
      • changedOutput 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"
        +}
    • Changedenhance_content1 field changed
      • addedInput schema / properties / documentId / description
        Added value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")."
    • Changedexport_project1 field changed
      • changedOutput 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"
        +}
    • Changedfind_mentions1 field changed
      • changedOutput 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"
        +}
    • Changedfind_relationships1 field changed
      • changedOutput 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"
        +}
    • Changedget_document_info2 fields changed
      • addedInput schema / properties / documentId / description
        Added value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")."
      • changedOutput 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"
        +}
    • Changedget_job_status1 field changed
      • changedOutput 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"
        +}
    • Removedget_memory_stats
    • Changedget_statistics1 field changed
      • changedOutput 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"
        +}
    • Changedget_structure3 fields changed
      • addedInput schema / properties / folderId / description
        Added value: +"UUID of a binder folder, as returned by get_structure."
      • addedInput schema / properties / includeTrash / description
        Added value: +"Set true to include trashed items in the result. Default false."
      • changedOutput 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"
        +}
    • Addedget_writing_goals
    • Addedget_writing_preferences
    • Changedlist_skills1 field changed
      • changedOutput 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"
        +}
    • Changedlist_trash1 field changed
      • changedOutput 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"
        +}
    • Changedmove_document2 fields changed
      • addedInput schema / properties / documentId / description
        Added value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")."
      • addedInput schema / properties / targetFolderId / description
        Added value: +"UUID of a binder folder, as returned by get_structure."
    • Changedqueue_document_analysis3 fields changed
      • addedInput schema / properties / content / description
        Added value: +"Document body as plain text. May be empty."
      • addedInput schema / properties / documentId / description
        Added value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")."
      • changedOutput 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"
        +}
    • Changedqueue_project_analysis1 field changed
      • changedOutput 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"
        +}
    • Changedread_annotations2 fields changed
      • addedInput schema / properties / documentId / description
        Added value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")."
      • changedOutput 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"
        +}
    • Changedread_document1 field changed
      • addedInput schema / properties / documentId / description
        Added value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")."
    • Changedrecall1 field changed
      • changedOutput 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"
        +}
    • Changedrestore_document1 field changed
      • addedInput schema / properties / documentId / description
        Added value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")."
    • Changedsearch2 fields changed
      • addedInput schema / properties / query / description
        Added value: +"Search query: keywords for full-text search, or a natural-language phrase for semantic search, depending on the tool."
      • changedOutput 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"
        +}
    • Changedsemantic_search3 fields changed
      • addedInput schema / properties / maxResults / description
        Added value: +"Maximum number of results to return."
      • addedInput schema / properties / query / description
        Added value: +"Search query: keywords for full-text search, or a natural-language phrase for semantic search, depending on the tool."
      • changedOutput 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"
        +}
    • Addedset_writing_goal
    • Addedset_writing_preferences
    • Changedsuggest_improvements1 field changed
      • addedInput schema / properties / documentId / description
        Added value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")."
    • Removedtrack_motifs
    • Changedupdate_document1 field changed
      • addedInput schema / properties / documentId / description
        Added value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")."
    • Addedverify_project_integrity
    • Changedwrite_document2 fields changed
      • addedInput schema / properties / content / description
        Added value: +"Document body as plain text. May be empty."
      • addedInput schema / properties / documentId / description
        Added value: +"Scrivener document UUID, as returned by get_structure (a binder item \"id\")."
  4. 68 tool updates
    • Changedadd_relationship5 fields changed
      • addedInput schema / properties / head / description
        Added value: +"Name of the source entity, e.g. a character name like \"Elena\"."
      • addedInput schema / properties / headType / description
        Added value: +"Type of the source entity."
      • addedInput schema / properties / relation / description
        Added value: +"The relationship verb/label from head to tail, e.g. \"mentors\", \"appears_in\"."
      • addedInput schema / properties / tail / description
        Added value: +"Name of the target entity the relationship points to."
      • addedInput schema / properties / tailType / description
        Added value: +"Type of the target entity."
    • Changedanalyze_document2 fields changed
      • addedInput schema / properties / analysisTypes / description
        Added 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."
      • changedInput schema / properties / analysisTypes / items / enum
        Previous value: -[
        -  "readability",
        -  "sentiment",
        -  "themes",
        -  "characters",
        -  "pacing",
        -  "all"
        -]New value: +[
        +  "readability",
        +  "sentiment",
        +  "themes",
        +  "characters",
        +  "pacing",
        +  "style",
        +  "structure",
        +  "all"
        +]
    • Changedanalyze_narrative4 fields changed
      • addedInput schema / properties / analysisType / description
        Added value: +"Which facet to analyze: \"structure\" (arc/beats), \"motifs\", \"relationships\", or \"all\" (default)."
      • addedInput schema / properties / options / description
        Added value: +"Optional output toggles."
      • addedInput schema / properties / options / properties / includeMetrics / description
        Added value: +"Include quantitative narrative metrics in the result. Default false."
      • addedInput schema / properties / options / properties / includeVisualization / description
        Added value: +"Include graph/visualization data in the result. Default false."
    • Changedanalyze_writing_style1 field changed
      • addedInput schema / properties / samples / description
        Added value: +"Array of text samples (strings) to analyze. Provide one or more passages of prose."
    • Removedbuild_vector_store
    • Changedcancel_job2 fields changed
      • addedInput schema / properties / jobId / description
        Added value: +"The job id returned when the job was enqueued."
      • addedInput schema / properties / jobType / description
        Added value: +"The kind of job, as returned when the job was enqueued."
    • Changedcheck_character_continuity3 fields changed
      • addedInput schema / properties / chapterId / description
        Added value: +"Optional chapter/folder id to limit the check to a single chapter."
      • addedInput schema / properties / characterName / description
        Added value: +"Exact name of the character to audit, e.g. \"Elena\"."
      • addedInput schema / properties / includeRelationships / description
        Added value: +"When true, also report continuity of the character's relationships with others. Default false."
    • Changedcheck_consistency1 field changed
      • addedInput schema / properties / checkTypes / description
        Added value: +"Continuity dimensions to check. Omit or use [\"all\"] for every check; otherwise pick any of characters, timeline, locations, plotThreads."
    • Changedcheck_plot_consistency2 fields changed
      • addedInput schema / properties / async / description
        Added value: +"Run as a background job and return a job id instead of waiting. Default false."
      • addedInput schema / properties / documents / description
        Added value: +"Array of documents (id and content) to check together, e.g. the chapters of a manuscript."
    • Removedcollect_feedback
    • Changedcompile_documents9 fields changed
      • addedInput schema / properties / documentIds
        Added 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"
        +}
      • addedInput schema / properties / format / description
        Added value: +"Output format of the compiled manuscript. Default \"text\"."
      • addedInput schema / properties / hierarchical / description
        Added value: +"Preserve the binder folder hierarchy as headings. Default false."
      • addedInput schema / properties / includeNotes / description
        Added value: +"Include each document's notes in the output. Default false."
      • addedInput schema / properties / includeSynopsis / description
        Added value: +"Include each document's synopsis in the output. Default false."
      • addedInput schema / properties / mode
        Added value: +{
        +  "description": "\"standard\" (default) joins documents in order; \"intelligent\" applies AI optimization toward targetOptimization.",
        +  "enum": [
        +    "standard",
        +    "intelligent"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / rootFolderId / description
        Added value: +"Optional binder folder id to compile only its descendants. Omit to compile all text documents."
      • addedInput schema / properties / separator / description
        Added value: +"Text inserted between documents in the standard-mode fallback. Default \"\\n\\n---\\n\\n\"."
      • addedInput schema / properties / targetOptimization
        Added 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"
        +}
    • Changedcreate_document2 fields changed
      • addedInput schema / properties / documentType / description
        Added value: +"Whether to create a \"Text\" document (default) or a \"Folder\"."
      • addedInput schema / properties / title / description
        Added value: +"Title for the new document or folder. Truncated to 255 characters."
    • Removedcross_reference_analysis
    • Changeddiscover_connections1 field changed
      • addedInput schema / properties / k / description
        Added value: +"Maximum number of candidate connections to return. Omit for the engine default."
    • Changeddiscover_projects1 field changed
      • changedInput schema / properties / searchPath / description
        Previous 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."
    • Changedenhance_content2 fields changed
      • addedInput schema / properties / enhancementType / description
        Added value: +"The improvement goal: \"grammar\" fixes errors, \"style\" refines voice, \"clarity\" simplifies, \"expand\" lengthens, \"summarize\" condenses, \"creative\" reworks freely."
      • addedInput schema / properties / options / description
        Added value: +"Optional enhancement parameters passed through to the enhancer."
    • Changedexport_project3 fields changed
      • addedInput schema / properties / format / description
        Added value: +"Target file format to export to."
      • addedInput schema / properties / options / description
        Added value: +"Optional format-specific export options (e.g. metadata, styling)."
      • addedInput schema / properties / outputPath / description
        Added value: +"Absolute or project-relative path to write the exported file. Omit to use a default location."
    • Removedfind_analogies
    • Removedfind_cooccurrences
    • Removedfind_document
    • Changedfind_mentions2 fields changed
      • changedInput schema / properties / contextLength / description
        Previous value: -"Context chars"New value: +"Number of characters of surrounding context to include on each side of a match. Default 100."
      • addedInput schema / properties / entity / description
        Added value: +"The exact name or term to locate, e.g. a character name like \"Elena\"."
    • Changedfind_relationships3 fields changed
      • addedInput schema / properties / entity / description
        Added value: +"Name of the entity to find relationships for, e.g. a character name."
      • addedInput schema / properties / k / description
        Added value: +"Maximum number of related entities to return. Omit for the engine default."
      • addedInput schema / properties / relation / description
        Added value: +"Optional relationship type to filter by (e.g. \"mentors\"). Omit to return all relationship types."
    • Removedfractal_search
    • Removedgenerate_ai_suggestions
    • Changedgenerate_content6 fields changed
      • addedInput schema / properties / context / description
        Added value: +"Optional project context to steer generation."
      • addedInput schema / properties / context / properties / characterIds / description
        Added value: +"Ids of characters the generated content should be consistent with."
      • addedInput schema / properties / context / properties / documentId / description
        Added value: +"Id of a document to use as surrounding context."
      • addedInput schema / properties / context / properties / style / description
        Added value: +"Target writing style or voice."
      • changedInput schema / properties / length / description
        Previous value: -"Word count"New value: +"Approximate target length in words. Default 500."
      • addedInput schema / properties / prompt / description
        Added value: +"Natural-language instruction describing the content to generate."
    • Changedgenerate_marketing_materials3 fields changed
      • addedInput schema / properties / length / description
        Added value: +"Target length: short (~500 words), medium (~1000, default), or long (~2000)."
      • addedInput schema / properties / materialType / description
        Added value: +"Which marketing artifact to generate."
      • addedInput schema / properties / targetAudience / description
        Added value: +"Optional description of the intended audience or market (e.g. \"YA fantasy readers\")."
    • Removedget_all_documents
    • Removedget_document_annotations
    • Changedget_job_status2 fields changed
      • addedInput schema / properties / jobId / description
        Added value: +"The job id returned when the job was enqueued."
      • addedInput schema / properties / jobType / description
        Added value: +"The kind of job, as returned when the job was enqueued."
    • Removedget_memory
    • Removedget_memory_analytics
    • Changedget_memory_stats2 fields changed
      • addedInput schema / properties / documentId / description
        Added value: +"Optional document id to report memory stats for a single document instead of the whole project."
      • addedInput schema / properties / includeDetails / description
        Added value: +"Include a per-component breakdown rather than summary totals. Default false."
    • Removedget_queue_stats
    • Changedget_statistics1 field changed
      • addedInput schema / properties / detailed / description
        Added value: +"Include extended per-category statistics when available. Default false."
    • Changedget_structure3 fields changed
      • changedInput schema / properties / flat / description
        Previous 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."
      • changedInput schema / properties / maxDepth / description
        Previous 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."
      • changedInput schema / properties / summaryOnly / description
        Previous value: -"Counts only"New value: +"When true, skip the tree and return only project-level counts (documents, words) plus title and author. Default false."
    • Removedget_word_count
    • Removedhhm_dream
    • Removedingest_document_fractal
    • Removedingest_project_fractal
    • Removedintelligent_compilation
    • Changedmove_document1 field changed
      • addedInput schema / properties / position / description
        Added value: +"Zero-based index at which to insert the item among the target folder's children. Omit to append at the end."
    • Removedmulti_agent_analysis
    • Changedopen_project1 field changed
      • changedInput schema / properties / path / description
        Previous 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."
    • Changedqueue_document_analysis5 fields changed
      • addedInput schema / properties / options / description
        Added value: +"Optional flags selecting which analyses to run and the job priority."
      • addedInput schema / properties / options / properties / includeEntities / description
        Added value: +"Include named-entity extraction (characters, places). Default false."
      • addedInput schema / properties / options / properties / includeReadability / description
        Added value: +"Include readability scoring. Default false."
      • addedInput schema / properties / options / properties / includeSentiment / description
        Added value: +"Include sentiment analysis. Default false."
      • addedInput schema / properties / options / properties / priority / description
        Added value: +"Queue priority; higher runs sooner. Default 0."
    • Changedqueue_project_analysis6 fields changed
      • addedInput schema / properties / documents / description
        Added value: +"Array of documents (id and content) to include in the batch analysis."
      • addedInput schema / properties / options / description
        Added value: +"Optional batch execution settings."
      • addedInput schema / properties / options / properties / batchSize / description
        Added value: +"Number of documents per batch when processing in parallel."
      • addedInput schema / properties / options / properties / parallel / description
        Added value: +"Process documents concurrently rather than sequentially. Default false."
      • addedInput schema / properties / options / properties / priority / description
        Added value: +"Queue priority; higher runs sooner. Default 0."
      • addedInput schema / properties / projectId / description
        Added value: +"Identifier of the project the documents belong to."
    • Addedread_annotations
    • Changedread_document3 fields changed
      • addedInput schema / properties / format
        Added 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"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"Max words to return"New value: +"Maximum number of words to return from offset. Omit to read to the end."
      • changedInput schema / properties / offset / description
        Previous value: -"Start word index"New value: +"Zero-based word index to start reading from. Default 0. Plain format only."
    • Removedread_document_formatted
    • Addedrecall
    • Removedrecover_document
    • Addedremember
    • Removedrename_document
    • Addedrestore_document
    • Addedsearch
    • Removedsearch_content
    • Removedsearch_trash
    • Changedsemantic_search3 fields changed
      • removedInput schema / properties / k
        Removed value: -{
        -  "type": "number"
        -}
      • addedInput schema / properties / maxResults
        Added value: +{
        +  "type": "number"
        +}
      • addedInput schema / properties / threshold
        Added 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"
        +}
    • Removedstart_realtime_assistance
    • Removedstore_chapter_order
    • Addedsuggest_improvements
    • Removedsync_to_neo4j
    • Changedtrack_motifs3 fields changed
      • addedInput schema / properties / chapterId / description
        Added value: +"Optional chapter/folder id to limit motif tracking to a single chapter."
      • addedInput schema / properties / minStrength / description
        Added 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."
      • addedInput schema / properties / patternType / description
        Added value: +"Restrict to one motif kind: \"theme\", \"symbol\", \"phrase\", or \"structure\". Omit to track all kinds."
    • Addedupdate_document
    • Removedupdate_memory
    • Removedupdate_metadata
    • Removedupdate_retrieval_policy
    • Changeduse_skill1 field changed
      • changedInput schema / properties / name / description
        Previous value: -"Skill name from list_skills"New value: +"The skill to activate, e.g. \"documents\", \"search\", or \"analysis\". Get valid names from list_skills."
    • Removedvector_search
  5. 69 tool updatesv0.6.0
    • First observedadd_relationship
    • First observedanalyze_document
    • First observedanalyze_narrative
    • First observedanalyze_writing_style
    • First observedbuild_vector_store
    • First observedcancel_job
    • First observedcharacter_network
    • First observedcheck_character_continuity
    • First observedcheck_consistency
    • First observedcheck_plot_consistency
    • First observedclose_project
    • First observedcollect_feedback
    • First observedcompile_documents
    • First observedcreate_document
    • First observedcross_reference_analysis
    • First observeddelete_document
    • First observeddiscover_connections
    • First observeddiscover_projects
    • First observedenhance_content
    • First observedexport_project
    • First observedfind_analogies
    • First observedfind_cooccurrences
    • First observedfind_document
    • First observedfind_mentions
    • First observedfind_relationships
    • First observedfractal_search
    • First observedgenerate_ai_suggestions
    • First observedgenerate_content
    • First observedgenerate_marketing_materials
    • First observedget_all_documents
    • First observedget_document_annotations
    • First observedget_document_info
    • First observedget_job_status
    • First observedget_memory
    • First observedget_memory_analytics
    • First observedget_memory_stats
    • First observedget_queue_stats
    • First observedget_statistics
    • First observedget_structure
    • First observedget_word_count
    • First observedhhm_dream
    • First observedingest_document_fractal
    • First observedingest_project_fractal
    • First observedintelligent_compilation
    • First observedlist_skills
    • First observedlist_trash
    • First observedmove_document
    • First observedmulti_agent_analysis
    • First observedopen_project
    • First observedqueue_document_analysis
    • First observedqueue_project_analysis
    • First observedread_document
    • First observedread_document_formatted
    • First observedrecover_document
    • First observedrefresh_project
    • First observedrename_document
    • First observedsearch_content
    • First observedsearch_trash
    • First observedsemantic_search
    • First observedstart_realtime_assistance
    • First observedstore_chapter_order
    • First observedsync_to_neo4j
    • First observedtrack_motifs
    • First observedupdate_memory
    • First observedupdate_metadata
    • First observedupdate_retrieval_policy
    • First observeduse_skill
    • First observedvector_search
    • First observedwrite_document

TDQS

A4/5.0

Scored across 57 tools

Disambiguation3/5

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.

Naming Consistency4/5

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.

Tool Count1/5

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.

Completeness5/5

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

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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
  • A
    license
    B
    quality
    Not graded
    maintenance
    Enables 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.
    3
    2
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Local MCP server that exposes Scrivener projects to AI clients, enabling project creation, binder navigation, document read/write, and metadata updates without opening Scrivener.
    87 npm
    1
    AGPL 3.0