Skip to main content
Glama
romanstark

Dorico Maestro

Dorico Maestro

An AI composition and orchestration partner for Steinberg Doricoยฎ. Speak in natural language to write notes directly into your score, audit voice leading, analyze harmony, check instrument ranges, and manage engraving layouts, right inside your open project.

License: AGPL-3.0 Python 3.11+ Dorico 4+ No telemetry Glama


Stay in the creative flow

Composing and engraving music in a notation program requires deep focus, but constantly breaking your train of thought to navigate popovers, click through staves, and proofread voice leading can pull you out of the zone.

Dorico Maestro acts like an assistant orchestrator and copyist sitting beside you at the scoring desk:

  • Keep your eyes on the score: Dorico stays open in front of you. You watch the notation appear, evaluate voicing and balance, and make the musical decisions.

  • Natural scoring dialogue: Ask for chord voicings, chorale harmonizations, counterpoint audits, transpositions, or layout adjustments in plain musical language.

  • Real notation, real scores: Nothing is simulated or pre-rendered. Everything is written directly into your active Dorico project through the live caret or standard MusicXML as editable Steinberg Dorico notation events.


Related MCP server: MuseScore MCP Server

How it feels at the scoring desk

Here is what collaborating with Maestro looks like during a scoring session:

1. Score Writing & Harmony

You: "Write a 4-part chorale phrase in D minor at the caret. Soprano starts on F4 and moves step-wise down to D4. Build a classical SATB voicing with smooth contrary motion."

Assistant: Entered a 4-bar phrase in D minor across Soprano, Alto, Tenor, and Bass staves:

  • Soprano: F4 (half note) -> E4 (quarter note) -> D4 (half note).

  • Alto / Tenor: Inner voices provide full triadic harmony with step-wise motion.

  • Bass: Contrary root motion resolving firmly to the final tonic cadence.

  • Verification: Audited voice leading: no parallel fifths or octaves detected.

Notes are in your score and ready to play.

2. Voice Leading & Counterpoint Audit

You: "Check the active string quartet passage for voice crossing, parallel octaves, and unresolved leading tones."

Assistant:

  • Audited the four parts using local music theory analysis.

  • Result: Detected parallel octaves between Violin 2 and Cello on beat 3 of bar 14 (A3->B3 and A2->B2).

  • Voice Leading: Unresolved leading tone in Viola (G#4 steps down to E4 instead of resolving up to A4).

  • Recommendation: Resolve Viola up to A4 to complete the cadence and hold Violin 2 on E4 to eliminate the octave parallel.

3. Orchestration & Engraving

You: "Check if the Cor Anglais part is within comfortable range, transpose the French Horn in F down a minor third, and export the current layout to PDF."

Assistant:

  • Verified Cor Anglais compass: all notes fall between G3 and C6 (well within comfortable orchestral range).

  • Transposed the French Horn selection down a minor third using chromatic transposition with flat-enharmonic spelling.

  • Exported the current layout directly to PDF into your project directory without opening a modal dialog.


What you can do

Workflow

Example prompt

What Maestro does

โœ๏ธ Caret Note Entry

"Input a 4-bar melody at the caret in G major with dotted quarters and eighths"

Steps through the score at the caret, sets durations and pitches, applies accidentals and ties

๐ŸŽผ Full-Score Writing

"Create a string quartet sketch with Violin 1, Violin 2, Viola, and Cello"

Generates complete multi-part scores with staves, voices, key signatures, and meters

๐Ÿ” Harmony & Analysis

"Analyze the Roman numeral harmony of this progression in E-flat major"

Performs local key detection, chord labeling, and harmonic analysis

๐Ÿ“ Voice Leading & Rules

"Audit this counterpoint passage against first-species voice leading rules"

Identifies parallel fifths, octaves, voice crossing, and forbidden melodic leaps

๐ŸŽบ Orchestration & Range

"Check whether the Trumpet 1 line exceeds the comfortable orchestral range"

Validates instrument compasses and warns of difficult register extremes

๐Ÿ–จ๏ธ Engraving & Layout

"Switch to Print mode and export the full score layout as PDF"

Navigates Dorico modes, switches views, and runs unattended PDF exports

๐Ÿ“‚ Offline Project Inspection

"Read the flows, players, and metadata from this .dorico file"

Inspects .dorico project archives directly on disk without launching Dorico

๐Ÿ“– Reading Your Open Score

"Read the score I have open, then add a viola line that fits"

Inspects the active flow via one-click MusicXML export to extract key, meter, bar count, and upbeat presence for exact subsequent caret operations

๐Ÿ”„ Enharmonic & Transpose

"Transpose selected notes up a whole tone and respell using sharps"

Dispatches diatonic/chromatic transpositions and enharmonic respelling


Why Maestro is reliable

Most AI music tools generate raw MIDI or static audio files without understanding the underlying notation rules.

Dorico Maestro is built on a robust, safety-first architecture:

  • Lifecycle & Caret Safety: Note input commands use strict session context managers (try ... finally: NoteInput.Exit). Even if an operation fails or arguments are malformed, Dorico is never left stranded in an open note-input state.

  • Destructive Command Guard: Commands that could discard musical work (Edit.Delete, File.Close, File.Quit) are automatically blocked unless explicitly authorized with confirm=True.

  • Overwrite Mode Transparency: Because Dorico defaults to Overwrite mode and the Remote Control API cannot read bar contents back, Maestro monitors noteInputMode and flags displaces_existing: true in its response whenever notes land in Overwrite mode.

  • Data-Driven & Verified: Built on a comprehensive catalog of 348 commands, with 190 of 348 commands verified live against Dorico 6.

  • Dual Writing Paths: Offers direct live caret input for fast interactive editing, and native MusicXML generation powered by music21 for complete multi-voice orchestral scores.


Quick start

You need Steinberg Dorico 4, 5, or 6 and uv. No repository, no virtual environment, no Python knowledge.

1. Install it

uv tool install git+https://github.com/romanstark/dorico-maestro.git

2. Connect to Dorico

  1. Open Steinberg Dorico and open any project. Dorico automatically listens on local WebSocket port 4560.

  2. On first connection, Dorico will display a permission prompt ("Do you want to allow Dorico Maestro to connect?"). Click Authorize. A persistent session token is saved automatically (%APPDATA%\dorico-maestro\session_token.json on Windows, ~/Library/Application Support/dorico-maestro/session_token.json on macOS) for future sessions.

3. Connect your AI assistant

Add Dorico Maestro to your MCP client configuration (Claude Desktop, Cursor, Antigravity IDE):

{
  "mcpServers": {
    "dorico-maestro": {
      "command": "dorico-maestro"
    }
  }
}

To run it without installing anything permanently, let uvx fetch it per launch:

{
  "mcpServers": {
    "dorico-maestro": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/romanstark/dorico-maestro.git", "dorico-maestro"]
    }
  }
}

Open a project in Dorico, connect, and start with: "What mode is Dorico currently in?"


Your music stays yours

  • 100% Local: All communication between your AI assistant and Dorico takes place over a local loopback WebSocket connection (127.0.0.1:4560) on your machine.

  • No Telemetry or Cloud Tracking: Dorico Maestro collects zero analytics and transmits no prompts, scores, or project files to any external server.

  • Local Storage: Your music, .dorico archives, and MusicXML files remain strictly on your local disk.


What stays in your hands

Dorico's Remote Control API is powerful, but certain tasks are intentionally reserved for you in the Dorico interface:

Task

Why

How to do it

Typing into Popovers

Remote API opens popovers (Shift+D, Shift+T, etc.) but cannot type text into them

Maestro opens the popover and tells you the exact value; you press Enter, or use write_score(method="musicxml")

Modal Dialog Confirmation

Dorico requires manual confirmation for file open and export dialogs

Press Enter on the export prompt once, and read_open_score automatically ingests the resulting MusicXML (use export_pdf for unattended PDF export)

Initial Connection Approval

Dorico security model requires one-time user authorization

Click Authorize on the Dorico permission prompt on first run

Artistic Judgment

AI can check rules and draft parts, but musical intent and taste belong to you

Guide the score, listen to playback, and refine the music


Current Verification Status

Verified live (190 commands), grouped by category:

  • NoteInput 101 of 125: Pitches, durations, accidentals, articulations, chords, tuplets, and popovers.

  • Window 26 of 29: Window modes, layout views, panels, toolbar, and zoom controls.

  • Play 24 of 31: Transport commands, playhead placement, and mixer controls.

  • View 13 of 16: Viewport scrolling and zoom operations.

  • NoteEdit 8 of 8: Diatonic, chromatic, and octave transposition, plus enharmonic respelling.

  • Edit 6 of 16: Selection, copy, delete, and undo operations.

  • EventEdit 4 of 57: Selection navigation commands (Navigate*).

  • File 4 of 11: Project save and MusicXML import/export filters.

  • UI 3 of 7: Panel focusing commands.

  • Print 1 of 7: Unattended PDF export (Print.ExportCurrentLayoutAsPDF).

The remaining 12 categories are currently untested.

Testing & Environment

Empirical testing was conducted against Dorico 6.2.30 Elements on Windows 11. Dorico restricts commands depending on product tier (SE, Elements, Pro). Commands requiring Pro (such as Lua scripting) return kUnknownCommand and are classified as unavailable rather than broken.

Dorico Maestro exposes 30 tools and one resource (dorico://commands) for complete command discovery.

A note to Steinberg (and Dorico Pro users)

Dorico Maestro is an independent open-source project developed with a personal Dorico Elements license. Advanced features exclusive to Dorico Pro (such as Lua scripting via Script.*, full engraving options, and advanced dialog automation) are currently classified as unavailable or untested simply because they cannot be executed on Elements.

If anyone from Steinberg discovers this project and would like to support bringing first-class AI integration to Dorico: an NFR or developer license for Dorico Pro would be immensely appreciated to test, verify, and unlock the remaining Pro-specific commands for the entire community. Feel free to get in touch via GitHub or email at mail@romanstark.de!


Also producing in Ableton Liveโ„ข?

If you also produce music in a DAW, check out Live Maestro, an MCP server built with the same architecture for Ableton Live. Bridge your workflow between session sketching in Ableton Live and engraving parts in Dorico with the same AI assistant.


Development

Working on the server itself rather than composing with it:

git clone https://github.com/romanstark/dorico-maestro.git
cd dorico-maestro
python -m venv .venv

Activate the environment with .venv\Scripts\activate on Windows or source .venv/bin/activate on macOS and Linux, then install dependencies:

pip install -e ".[dev]"

Verify tests without needing Dorico:

pytest

Point your MCP client at the checkout's interpreter while you work on it:

{
  "mcpServers": {
    "dorico-maestro": {
      "command": "/absolute/path/to/dorico-maestro/.venv/Scripts/python.exe",
      "args": ["-m", "dorico_maestro.server"]
    }
  }
}

On macOS and Linux the interpreter is .venv/bin/python rather than .venv/Scripts/python.exe.


Documentation & Developer Resources

For architectural details, wire protocols, and contributor information:


Steinberg and Dorico are trademarks or registered trademarks of Steinberg Media Technologies GmbH, registered in Europe and other countries. Ableton is a registered trademark and Live is a trademark of Ableton AG.

Dorico Maestro is an independent open-source project and is not affiliated with, endorsed, sponsored, or supported by Steinberg Media Technologies GmbH or Ableton AG. For full third-party notices, licenses, and attributions, see THIRD-PARTY.md.

Available Tools

30 tools
add_notesA

Input notes at the caret, then leave note-input mode cleanly.

ONE insertion at the current caret. For a SEQUENCE of notes or chords over
time, use ``write_score`` / ``render_to_dorico`` with a ScoreSpec (a chord is
one event with >=2 pitches). Repeated ``add_notes`` calls do NOT chain: each
re-enters note input at the same spot, so successive chords stack on one beat.

Returns:
    Result dictionary with the notes and duration entered, the note input mode
    they landed in, whether an undo is available, and displaces_existing.

Note:
    Read displaces_existing before treating this as an addition. Dorico has an
    overwrite note input mode, and in it these notes replace the music already
    at the caret instead of pushing it along. The mode belongs to the
    application rather than to this call, so it is reported back and not chosen
    here. get_status reads it beforehand.

    Uses :class:`NoteInputSession`, so note input is always exited even on
    error. Success indicates command acceptance (kOK). Verify note placement
    via get_status, playback, or score inspection. Do not read can_undo as
    that verification: entering note input alone already sets it.
ParametersJSON Schema
NameRequiredDescriptionDefault
notesYesPitches in scientific notation, e.g. ['C4', 'E4', 'G4']: a letter, an optional # or b, then the octave number, where C4 is middle C.
as_chordNoTrue stacks the pitches into one chord on a single beat. False enters them one after another, each of the given duration.
durationNoRhythmic duration, one of: whole, half, quarter, eighth, sixteenth, 32nd, 64th. Case-insensitive.quarter

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses rich behavioral detail beyond the minimal annotations: note input is always exited even on error, success only means command acceptance (kOK), can_undo is not verification, and Dorico's overwrite mode can replace existing music rather than push it along. These are exactly the kinds of caveats that prevent an agent from misinterpreting results.

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?

The description is front-loaded with the core action and then organized into Returns and Note sections. It is longer than average, but nearly every sentence adds essential caveats or guidance; only minor redundancy exists around verification, so it earns a strong score rather than a perfect one.

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 a small schema, providing output schema, and meaningful behavioral caveats, the description covers everything an agent needs: what the tool does, what repeated calls do, how overwrite mode affects results, how to verify placement, and what success does and does not mean. It also anticipates the can_undo misconception.

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 schema already fully documents notes, as_chord, and duration with examples, defaults, and allowed values. The description adds little parameter-specific meaning beyond what the schema provides, so the 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 opening sentence states a specific verb and resource: 'Input notes at the caret, then leave note-input mode cleanly.' It clearly distinguishes itself from sequence-oriented siblings by explicitly directing users to write_score / render_to_dorico for a sequence of notes or chords, and clarifies that repeated add_notes calls do not chain.

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 gives explicit when-to-use guidance: use for a single insertion at the caret, use write_score / render_to_dorico for sequences over time. It also warns that repeated calls stack on the same beat, and provides practical direction to read displaces_existing and get_status beforehand, which is far beyond a vague 'use when adding notes.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_restA

Input one rest at the caret, then leave note-input mode cleanly.

One rest at the current caret position, which then advances by that duration.
Note input is always exited afterwards, including when the call fails.

Returns:
    Result dictionary with success, the duration entered, the undo flag and the
    resulting mode.

Note:
    Success means Dorico accepted the command (kOK), not that the rest is where
    it was wanted (docs/protocol.md, 'Command Acceptance vs Effect'). Check with
    get_status or by inspecting the score.

    For a passage rather than one rest, put rest events in a ScoreSpec and use
    write_score: repeated calls here do not chain, because each one re-enters
    note input at the caret. Use goto_bar first to choose where it lands.
    Do not read can_undo as evidence: entering note input alone already sets it.
ParametersJSON Schema
NameRequiredDescriptionDefault
durationNoRhythmic duration, one of: whole, half, quarter, eighth, sixteenth, 32nd, 64th. Case-insensitive.quarter

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are minimal, so the description carries the behavioral burden. It discloses that note-input mode is always exited even on failure, that success means Dorico accepted the command rather than the rest being effective, that calls do not chain, and that can_undo is set merely by entering note input. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a front-loaded summary, a Returns section, and a Note section. There is minor redundancy between the first and second paragraphs, but the additional detail about failure behavior, result fields, and non-chaining justifies the length.

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 the tool's side effects, acceptance semantics, alternatives, required navigation, and common pitfall with can_undo. With an output schema present and annotations available, nothing essential is missing for an agent to call this 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?

The single parameter `duration` is fully documented in the input schema with accepted values and a default, so 100% schema coverage means the description does not need to repeat parameter details. The description adds behavioral context about the caret advancing by that duration, but this is not required 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 states a specific verb and resource: 'Input one rest at the caret, then leave note-input mode cleanly.' It clearly distinguishes from related tools by emphasizing a single rest and directing passage-level work to write_score.

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?

Usage context is explicit: one rest at the current caret, and for a passage the description directs the agent to put rest events in a ScoreSpec and use write_score instead. It also tells the agent to use goto_bar first and warns not to read can_undo as evidence.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_harmonyA
Read-onlyIdempotent

Estimate the key of a ScoreSpec and name its chords in Roman numerals.

Entirely offline: the score is analysed as data and Dorico is not involved, so
this works on music that has never been in a project.

Returns:
    Result dictionary with the key estimate, its confidence, and a Roman numeral
    reading of each sonority.

Note:
    Key estimation relies on pitch distribution. For short or highly chromatic
    excerpts, verify the estimated tonal center before relying on Roman numerals.

    This answers what the harmony is. For whether the voices move well between
    those chords use check_voice_leading, for strict two-part exercises
    check_counterpoint, and for what could come next suggest_next_chord.
ParametersJSON Schema
NameRequiredDescriptionDefault
scoreYesThe score to work on, as a ScoreSpec object: metadata, parts, and the events inside them. Call score_schema first for the exact shape, which refuses unknown keys rather than ignoring them.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, but the description adds valuable behavioral detail: the analysis is entirely offline and does not involve Dorico, the return value is a result dictionary with key estimate, confidence, and Roman numerals, and key estimation relies on pitch distribution with a caveat for short or chromatic excerpts. This goes well 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 front-loaded with the core purpose, then uses short labeled sections for returns and notes. Every sentence adds information: offline behavior, output contents, a limitation, and sibling routing. There is no filler or repetition of schema details.

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 single-parameter, read-only analysis tool with a rich output schema, the description is complete. It covers the operation, the execution context, the result shape, a known limitation, and alternatives. The agent has everything needed to decide when to call it and what to expect.

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 there is only one parameter. The schema already explains the score parameter thoroughly as a ScoreSpec object and even points to score_schema for the exact shape. The description merely refers to 'ScoreSpec,' so it adds no new parameter meaning 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 opens with a specific verb and resource: 'Estimate the key of a ScoreSpec and name its chords in Roman numerals.' This clearly identifies the operation, the input, and the output. It also positions the tool against siblings by saying 'This answers what the harmony is,' which helps distinguish it from related analysis tools.

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 gives explicit when-to-use guidance: it answers what the harmony is, and it names the alternatives for related questions (check_voice_leading for voice movement, check_counterpoint for strict two-part writing, suggest_next_chord for what could come next). It also clarifies that the tool works offline and on music never in a project, giving clear context for when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_counterpointA
Read-onlyIdempotent

Check a two-part first-species counterpoint against the classic rules.

Entirely offline and read-only. Enforces the strict set: begin and end on a
perfect consonance, consonant verticals only, no consecutive perfect fifths,
octaves or unisons, no voice crossing, and one melodic climax in the
counterpoint.

Returns:
    Result dictionary with one entry per issue, each naming the rule and the beat
    it happens on. An empty list means the exercise passes.

Note:
    Only first species is implemented, so passing any other species is refused
    rather than checked loosely. The two lines must be the same length, since
    note against note pairs them one to one.

    These rules are stricter than ordinary part-writing on purpose. For a
    chorale or a quartet use check_voice_leading, which applies the
    common-practice rules to any number of voices.
ParametersJSON Schema
NameRequiredDescriptionDefault
speciesNoWhich species to check. Only 1, note against note, is implemented. Any other value is refused rather than approximated.
counterpointYesThe line written against it, same notation and the same length: first species is note against note, so the two lists pair up one to one.
cantus_firmusYesThe given line, as scientific pitch names in order, e.g. ['D4', 'F4', 'E4', 'D4'].

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, and non-destructive behavior, and the description reinforces this with 'Entirely offline and read-only.' It adds valuable behavioral detail beyond annotations: the strict rule set enforced, the refusal of unsupported species, and the result format with an empty list meaning success. These details let an agent predict tool behavior without calling it.

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 organized: a one-sentence summary, a read-only/offline note, the rule list, return semantics, and caveats. Every sentence adds useful information, and the most important scoping facts are front-loaded. No filler 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?

The tool checks a specialized music-theory concept, but the description covers scope, restrictions, failure modes, return value semantics, and alternatives. Combined with the rich input schema and output schema, an agent has everything needed to decide whether and how to invoke it 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 coverage is 100%, so the schema already documents all three parameters with types and examples. The description reinforces the same-length and one-to-one pairing constraints, but those are also present in the schema. It does not add substantial new parameter-level meaning beyond what the schema provides, so the 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 opens with a specific verb and resource: 'Check a two-part first-species counterpoint against the classic rules.' This immediately distinguishes the tool from the sibling check_voice_leading by narrowing scope to two-part first-species counterpoint. The listed rules further clarify exactly what the tool checks.

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 gives explicit usage conditions: only first species is implemented, other species are refused, and the two lines must be the same length. It also names the alternative tool, check_voice_leading, and states when to use that instead ('for a chorale or a quartet'). This is exemplary guidance for an agent deciding between sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_voice_leadingA
Read-onlyIdempotent

Audit a ScoreSpec for parallel fifths and octaves, overlaps and spacing.

Entirely offline and read-only: nothing in the score is changed and Dorico is
not involved. Written for part-writing of any number of voices, so a chorale or
a string quartet is the natural input.

Returns:
    Result dictionary with one entry per issue found, each naming the rule, the
    voices involved and where it happens. An empty list means nothing was found.

Note:
    These are the common-practice rules, so a passage that breaks them on purpose
    is reported too. The findings are advice and nothing here rewrites the music.

    For a strict two-part species exercise, check_counterpoint applies the
    stricter set of rules that belongs to it. For what the chords are rather than
    how the voices move between them, use analyze_harmony.
ParametersJSON Schema
NameRequiredDescriptionDefault
scoreYesThe score to work on, as a ScoreSpec object: metadata, parts, and the events inside them. Call score_schema first for the exact shape, which refuses unknown keys rather than ignoring them.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description goes further by stating the tool is 'entirely offline and read-only,' that 'nothing in the score is changed,' and that 'findings are advice and nothing here rewrites the music.' It also discloses that common-practice rules mean intentionally broken passages are still reported. This adds meaningful behavioral context beyond the annotations without contradicting them.

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 with clear sections: a front-loaded purpose statement, an offline/read-only note, a concise Returns section, and a Note with rule-scope and alternative routing. Every sentence adds value; there is no filler or repetition of schema 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 read-only analysis tool with a single well-documented parameter, an output schema, and annotations covering safety, the description is complete. It explains what the return value means, covers edge behavior (purposeful rule-breaking), and routes the agent to the correct sibling tools. Nothing needed for correct selection or invocation is missing.

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%, with the single 'score' parameter fully described as a ScoreSpec object and with a pointer to score_schema for exact shape. The tool description reinforces that the input is a ScoreSpec but does not add substantial parameter semantics beyond the schema. Baseline 3 is appropriate since the schema carries the descriptive load.

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 opens with a specific verb and resource: 'Audit a ScoreSpec for parallel fifths and octaves, overlaps and spacing.' It clearly identifies the tool's purpose and distinguishes it from related siblings like check_counterpoint and analyze_harmony by naming exactly what this tool checks.

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: for part-writing of any number of voices, with chorales or string quartets as natural inputs. It also gives two concrete alternatives: check_counterpoint for strict two-part species exercises and analyze_harmony for chordal analysis rather than voice movement. This is exemplary usage routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

connect_to_doricoA
Read-onlyIdempotent

Connect to Dorico Remote Control and return application status.

Call this before anything else here: every other tool that talks to Dorico
needs the session this opens. It is safe to call again on an open connection.

Returns:
    Result dictionary with the connection outcome and the first status snapshot.

Note:
    On the first connection Dorico shows an authorization prompt inside the
    application, and nothing proceeds until a person accepts it. The token is
    then kept in AppData and later runs connect without asking.

    Use get_status afterwards to re-read the state without reconnecting.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Although annotations already declare readOnlyHint and idempotentHint, the description adds critical behavioral context: the first connection triggers an authorization prompt that requires human action, and the token persists in AppData for later connections. This goes well beyond what annotations provide and helps the agent anticipate a potentially blocking interaction.

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 front-loaded with the core purpose and usage rule, then provides Returns and Note sections that each earn their place. The authorization caveat and get_status alternative are directly useful; there is 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?

For a zero-parameter tool with annotations covering safety and idempotence, the description is complete. It explains the human-in-the-loop authorization behavior, token persistence, what the function returns, and when to use a sibling tool instead. The output schema already covers return values, so no additional detail is needed.

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 zero parameters and the schema has 100% coverage with no required fields, so the baseline is 4. The description doesn't need to add parameter semantics because there are none to explain.

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 and resource: 'Connect to Dorico Remote Control and return application status.' It clearly differentiates itself from get_status by explaining that get_status should be used afterwards to re-read the state without reconnecting.

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 says 'Call this before anything else here' and notes that every other Dorico tool needs the session this opens. It also provides an alternative: 'Use get_status afterwards to re-read the state without reconnecting,' and states that re-calling is safe on an open connection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_musicxmlA
Destructive

Write a ScoreSpec to a MusicXML file on disk, without Dorico.

Entirely offline: no connection is opened and Dorico need not be running. Key,
time signature, clefs, dynamics and tempo all survive the round trip, which is
what makes this the way to set the two signatures no popover will accept.

Returns:
    Result dictionary with the outcome and the path that was written.

Note:
    A specified path is overwritten without confirmation. Omit the path to
    write to a temporary file.

    To get the file into Dorico afterwards, import_musicxml opens it as a new
    flow, and write_score(method='musicxml') does both steps in one call. For a
    printable file rather than an interchange one, use export_pdf.
ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoWhere to write the .musicxml file. An existing file at this path is overwritten. Omit to write to a temporary file and take the path from the answer.
scoreYesThe score to work on, as a ScoreSpec object: metadata, parts, and the events inside them. Call score_schema first for the exact shape, which refuses unknown keys rather than ignoring them.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already mark the tool as destructive, and the description reinforces this by stating that a specified path is overwritten without confirmation. It also adds valuable behavioral context beyond annotations: entirely offline, no connection opened, Dorico need not be running, and musical elements survive the round trip.

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 and front-loaded with the core purpose; the offline behavior, return value, overwrite warning, and alternative tools each have a clear and compact section. No sentence is wasted, and the formatting makes the key warning and routing advice easy to scan.

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 annotations and output schema, the description is complete enough for an agent to call the tool safely: it covers destructive behavior, path handling, offline operation, return result shape, and how to get the file back into Dorico or produce a printable output. Nothing critical is missing.

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 schema already documents both path and score thoroughly. The description adds little new parameter-level meaning beyond restating that a specified path is overwritten and that omission writes to a temporary file, which the schema also states. 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 opening sentence states a specific verb and resource: 'Write a ScoreSpec to a MusicXML file on disk, without Dorico.' It also distinguishes this from export_pdf and write_score by naming them as alternatives with different purposes, so the agent can tell the tools apart immediately.

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 gives clear routing guidance: import_musicxml opens the file into Dorico later, write_score(method='musicxml') does both steps in one call, and export_pdf is for printable rather than interchange files. It also explains the offline/no-Dorico context, which is a strong signal for when this tool is the right choice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_pdfA

Export the score to PDF unattended without opening a dialog.

Writes the file next to the .dorico project, named after the layout. This is the
unattended path. File.Export opens a modal dialog and is not usable from here.

Returns:
    Result dictionary reporting whether the command was accepted.

Note:
    Receiving kOK does not prove a file exists yet. Dorico runs commands on its
    UI thread, so a request sent while a modal dialog is open waits in the queue
    until the dialog closes. Tested against Dorico Elements 6.2.30. Check the
    expected path on disk rather than trusting the return.

    The all_layouts path is catalogued as untested, unlike the current-layout
    path which is verified, so treat a multi-layout export as unproven and check
    what actually landed. For an interchange format rather than a printable one,
    use export_musicxml.
ParametersJSON Schema
NameRequiredDescriptionDefault
all_layoutsNoFalse exports the layout currently on screen through Print.ExportCurrentLayoutAsPDF. True exports every layout in the project through Print.ExportAllLayoutsAsPDF, which writes one file per layout.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even with annotations present, the description adds substantial behavioral context: the file is written next to the .dorico project, kOK does not guarantee file existence, commands run on the UI thread and can queue behind modal dialogs, and the all_layouts path is untested. It also discloses the tested version. This goes far 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 moderately long but every sentence contributes: core purpose first, then side-effect location, alternative exclusion, return semantics, asynchronous caveat, version testing, and unverified-path warning. Nothing is redundant 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?

For a tool with one optional boolean parameter and an output schema, the description covers purpose, side effects, failure modes, testing status, and routing to the sibling export_musicxml. An agent has everything needed to decide when to call it and what to verify afterward.

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 input schema already fully documents the single all_layouts parameter, including which underlying command each value triggers. The description adds valuable caveats about the all_layouts path being untested and the need to check the filesystem, which enriches the parameter's meaning 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 states a specific verb and resource: 'Export the score to PDF unattended without opening a dialog.' It clearly distinguishes itself from File.Export and from export_musicxml by contrasting unattended PDF export with the modal dialog path and with interchange-format export.

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 explains when to use this tool: for unattended PDF export, not via File.Export, and not for interchange formats, which should use export_musicxml. It also warns that all_layouts is unverified, guiding the agent to prefer the verified current-layout path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_statusA
Read-onlyIdempotent

Return Dorico's current pushed application status snapshot.

The state of the application rather than of the music: which mode is active,
whether note input is running, whether anything is selected, whether an undo is
available.

Returns:
    Result dictionary carrying the merged status snapshot.

Note:
    Dorico pushes status as deltas and this is the accumulated snapshot of them,
    so it costs nothing to read and needs no command to be sent.

    This is also how to check whether a command that answered kOK actually took
    effect, since kOK only says the UI queue accepted it (docs/protocol.md,
    'Command Acceptance vs Effect'). For the properties of the selected notes
    rather than the state of the application, use read_selection.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, but the description adds valuable behavior: the status is an accumulated snapshot of pushed deltas, reading it costs nothing, and no command needs to be sent. It also clarifies the kOK acceptance-vs-effect protocol distinction.

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?

The primary purpose is front-loaded and each section adds meaningful context. The Returns and Note sections are slightly extended but every sentence contributes to correct usage, so it avoids unnecessary padding.

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 read-only snapshot tool with an output schema, the description is complete: it states what is returned, why it is cheap, when to use it, and what it is not for. There is no missing information an agent would need to invoke it 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?

The tool has no parameters, so the baseline is 4. The description adds no parameter-specific details, but none are needed since the input schema is empty and schema description coverage is 100%.

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 opens with a precise verb and resource: 'Return Dorico's current pushed application status snapshot.' It then specifies what the snapshot contains (mode, note input, selection, undo availability), which clearly distinguishes it from related tools like read_selection.

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 explains when to use this tool: to verify whether a command that returned kOK actually took effect. It also directs users to read_selection when they need properties of selected notes rather than application state, providing a clear alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

goto_barA

Move the caret to a bar and return the assumed position.

The position is assumed, not read. Dorico exposes no caret coordinates over the
Remote API, so this dead-reckons: it enters note input, rewinds to bar 1 of the
top staff, then steps forward to the bar, staff and beat asked for.

Returns:
    Result dictionary with the assumed caret position and the caveat attached.

Note:
    Because it counts rather than measures, the answer drifts from the truth if
    anything moved the caret in between, and it cannot detect that. Treat it as
    the position it aimed for, and confirm what was written with read_selection
    or by inspecting the score.

    This enters note input, so it is the call to make before add_notes or
    add_rest. To scroll the view without touching the caret, use navigate.

    Ask whether the flow opens with a pickup bar before relying on a bar
    number, because Dorico leaves a pickup out of the count and this lands one
    bar short without the pickup flag. The API cannot tell, so the person with
    the score on screen has to say, or read an exported MusicXML with
    read_score.

    The move costs the same handful of commands at any flow length, so a long
    flow is no less exact than a short one.
ParametersJSON Schema
NameRequiredDescriptionDefault
barYesBar number, counted from 1, so bar 1 is the first bar of the flow. Not an index.
beatNoBeat within the bar, counted from 1, so 1.0 is the downbeat and 2.5 is halfway through the second beat.
staffNoStaff index, counted from 0, where 0 is the topmost staff in the current layout. Counted differently from a bar number on purpose: bars start at 1, staves at 0.
pickupNoTrue when the flow starts with a pickup (upbeat) bar. Dorico does not number it as bar 1, so bar navigation lands one bar short without this. Nothing in the API reveals a pickup, so ask the person whose score it is, or read an exported MusicXML file with read_score.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations are all false/unspecified, so the description carries the disclosure burden. It is transparent about dead-reckoning, drift from reality, inability to detect drift, entering note input, and landing one bar short without the pickup flag. This fully reveals the tool's behavioral quirks.

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 long but every paragraph earns its place: caveat, usage routing, pickup trap, and performance characteristic. It is front-loaded with the core purpose and returns, then structured into clearly labeled notes. No filler or tautology.

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 complexity, the description is complete: it covers side effects, prerequisites for sequence usage, alternatives, failure modes, and the pickup edge case. An output schema exists for the return value, so the brief 'Returns' note plus schema is sufficient.

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 the baseline is 3; the description adds value by explaining why pickup matters, reinforcing that bars count from 1 while staves count from 0, and advising how to resolve pickup uncertainty. It does not deeply elaborate every parameter, but it goes beyond the schema where it matters most.

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 begins with a specific verb and resource ('Move the caret to a bar') and immediately clarifies that the position is guessed rather than read. It also distinguishes itself from navigate, which scrolls without touching the caret.

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 this is the right call: before add_notes or add_rest because it enters note input. It also names the alternative for pure scrolling ('use navigate') and warns about the pickup-bar situation with guidance to ask the user or check via read_score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

import_musicxmlA

Import a MusicXML file into Dorico via the Remote Control API.

Dispatches File.Open with MusicXMLImportFilter.

Returns:
    Result dictionary with success, supported, attempted,
    requires_confirmation, code, path and note.

Note:
    An import arrives as a new flow rather than joining the one on screen, and
    Dorico may raise a player assignment prompt that waits for a person. While
    that prompt is open, later commands are accepted but sit unexecuted in the
    queue (docs/protocol.md, "Modal Dialogs").

    To add music into the flow already open, use write_score(method="caret").
    Use export_musicxml to produce the file in the first place, or
    write_score(method="musicxml") to do both steps in one call.
ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFilesystem path to the MusicXML file to open. Dorico reads it from disk, so it has to be a path Dorico can reach.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses important non-obvious behaviors: the import creates a new flow rather than joining the current one, Dorico may raise a player assignment prompt that waits for a person, and later commands may sit unexecuted in the queue while that prompt is open. These details go well beyond the annotations and help an agent anticipate blocking and 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear first sentence, a Returns section, and a Note section. It is longer than simplest definitions, but each section earns its place by covering return fields, behavioral caveats, and alternatives. The formatting makes the extra detail easy to scan.

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 single parameter, the presence of an output schema, and the annotation set, the description covers all important contextual aspects: behavior, return shape, blocking modal risk, queue effects, and alternative tools. Nothing critical for selecting or invoking the tool correctly is missing.

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 parameter, path, and the schema already provides a full description: it is a filesystem path, Dorico reads it from disk, and it must be reachable by Dorico. The tool description does not add further parameter-specific meaning, but with 100% schema description coverage, the 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 a specific action and resource: 'Import a MusicXML file into Dorico via the Remote Control API.' It also names the underlying mechanism, 'Dispatches File.Open with MusicXMLImportFilter,' and distinguishes the tool from write_score and export_musicxml by describing what each alternative does.

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 gives explicit routing guidance: use write_score(method="caret") to add music into an already-open flow, use export_musicxml to produce the file, and use write_score(method="musicxml") to do both steps in one call. It also warns about the modal dialog behavior and queued commands, giving the agent a clear context for when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

instrument_rangeA
Read-onlyIdempotent

Look up a standard instrument compass, or test one pitch against it.

Two questions through one door: without a pitch it reports the range, with one it
reports whether that note is inside it. Entirely offline and read-only.

Returns:
    Result dictionary with in_range when a pitch was given, or the lowest and
    highest playable pitches when it was not.

Note:
    These are the standard written ranges for a competent player, not the limits
    of the instrument or of a particular one: professionals exceed them and
    beginners do not reach them.

    Worth calling before write_score when writing for an instrument, since
    write_score with preflight left on runs the same check over a whole score and
    reports what falls outside.
ParametersJSON Schema
NameRequiredDescriptionDefault
pitchNoA pitch to test in scientific notation, e.g. 'C4' or 'A5'. Omit to get the full compass instead of a yes or no.
instrumentYesInstrument to look up, e.g. 'violin', 'flute', 'cello' or 'trumpet'. Matched against the standard orchestral names.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnly, idempotent, and non-destructive behavior, so the description's added value is strong: it clarifies that the ranges are standard written ranges for a competent player, not instrument limits, and that professionals exceed them while beginners do not. It also explicitly states the operation is offline and read-only, reinforcing the safety profile with 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?

The description is well-structured and front-loaded: a one-paragraph summary of the tool's dual behavior, followed by concise 'Returns' and 'Note' sections. Every sentence contributes useful information, and the relationship to write_score is positioned at the end where it naturally supports usage decisions.

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 rich input schema, output schema, and thorough annotations, the description covers the remaining context needed: the two possible outcomes, the caveat about standard written ranges, and the link to write_score preflight. Nothing critical is missing 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?

The input schema already documents both parameters with examples and descriptions, so the baseline is 3. The description adds some behavioral color about 'without a pitch' versus 'with one,' but most parameter-level meaning is already present in the schema. It does not substantially extend the parameter 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 opens with a specific action ('Look up a standard instrument compass, or test one pitch against it'), clearly identifying both the resource and the two modes of the tool. It distinguishes itself from siblings like write_score by framing itself as a standalone range-check tool rather than a score-writing or transformation operation.

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 ('Worth calling before write_score when writing for an instrument') and contrasts it with write_score, which runs the same check over a whole score. It also explains the conditional behavior depending on whether a pitch is supplied, giving the agent clear decision criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

open_popoverA

Open an input popover at the caret for manual text entry.

Opens the popover and stops there. Dorico's Remote API cannot populate popovers
directly, so this positions the caret if requested, triggers the
NoteInput.Create* command, and returns the required input format.

Returns:
    Result dictionary with the popover kind, caret location, and typing
    instructions.

Note:
    Requires user interaction in Dorico. Opening a popover leaves it waiting
    for keyboard input. Treat anything sent while it waits as unsafe: a modal
    dialog leaves later commands accepted but unexecuted (docs/protocol.md,
    'Modal Dialog Detection'), and a waiting popover has not been measured to
    behave any better.

    For an unattended write, put the marking in a ScoreSpec and use write_score:
    dynamics and clefs are ScoreSpec fields, and a key or time signature goes in
    through write_score(method='musicxml').
ParametersJSON Schema
NameRequiredDescriptionDefault
barNoBar to move the caret to first, counted from 1. Omit to open the popover wherever the caret already is.
kindYesWhich popover to open: 'dynamic', 'tempo', 'key', 'time' or 'clef'. Each maps to its own NoteInput.Create* command.
staffNoStaff index, counted from 0, where 0 is the topmost staff in the current layout. Counted differently from a bar number on purpose: bars start at 1, staves at 0.
pickupNoTrue when the flow starts with a pickup (upbeat) bar. Dorico does not number it as bar 1, so bar navigation lands one bar short without this. Nothing in the API reveals a pickup, so ask the person whose score it is, or read an exported MusicXML file with read_score.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are all false or unhelpful, but the description discloses rich behavioral detail: the popover cannot be populated directly, the command stops after opening, it returns typing instructions, requires user interaction, and leaves the system in a state where later commands may be unsafe. This is far beyond minimal disclosure and directly informs invocation.

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 with a clear summary, return explanation, and a safety note. Every section earns its place, and the critical behavioral warning is separated and emphasized rather than buried.

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 an interactive tool with no useful annotations, the description covers what the tool does, what it returns, what it cannot do, when not to use it, and what operational risks exist. The output schema exists, and the description appropriately explains return semantics rather than repeating schema structure.

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 each parameter already has a detailed description including counting conventions and defaults. The tool description adds some contextual color about the popover kind mapping to NoteInput.Create* commands, but it does not substantially add meaning beyond the schema for individual parameters, so the 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 opens with a specific verb and resource: 'Open an input popover at the caret for manual text entry.' It clearly distinguishes itself from siblings by stating that unattended writes should go through write_score instead, so an agent can tell this interactive popover tool apart from the ScoreSpec-based tools.

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 tells when to use this tool versus alternatives: it is for manual, interactive entry, and it names write_score as the route for unattended writes, including which markings map to ScoreSpec fields. It also warns about the need for user interaction and about unsafe conditions while the popover waits, giving clear situational guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

playbackA
Idempotent

Start, stop or rewind Dorico playback.

Transport only: no note, dynamic or layout changes as a result.

Returns:
    Result dictionary reporting whether the transport command was accepted.

Note:
    Playback is the one way to hear whether a write landed, since kOK proves
    only that the command was accepted (docs/protocol.md, 'Command Acceptance
    vs Effect'). It makes sound, which matters if a person is in the room.

    Use navigate to scroll the score without playing, and goto_bar to move the
    caret. Neither of those moves the playhead.
ParametersJSON Schema
NameRequiredDescriptionDefault
actionNoWhat the transport should do: 'play', 'stop' or 'rewind'.play
locationNoWhere playback starts from, read only when action is 'play': 'kPlayhead' from the playhead, 'kSelection' from what is selected, 'kStartOfFlow' from the top, 'kLastStartPosition' from wherever the last play began.kPlayhead

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/destructive/idempotent hints, the description discloses the bounded side-effect surface ('no note, dynamic or layout changes'), the audible side effect ('It makes sound'), and the semantics of the Result dictionary ('reporting whether the transport command was accepted'). It even adds the important acceptance-vs-effect nuance around kOK, which is valuable for an agent.

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 core action and constraints are front-loaded, the Returns note is separated, and the following Note earns its place by explaining user-visible side effects and sibling routing. 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?

For a two-optional-parameter transport tool with an output schema, the description covers purpose, safety boundaries, return semantics, audible side effects, and alternatives. An agent has everything needed to invoke it 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?

The schema already fully documents both parameters with 100% coverage, so the description adds little parameter-level meaning; 'start, stop or rewind' merely restates the action enum. The baseline 3 applies because the description does not need to compensate for schema gaps.

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 opens with a specific action set ('Start, stop or rewind Dorico playback') and scopes the tool to 'Transport only', explicitly disclaiming note, dynamic, or layout changes. It further distinguishes itself by naming navigate and goto_bar as non-audible alternatives, so an agent can pick the right sibling without guessing.

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 names the alternatives: 'Use navigate to scroll the score without playing, and goto_bar to move the caret', and states that neither moves the playhead. It also gives a concrete reason to prefer playback โ€” 'the one way to hear whether a write landed' โ€” making the when-to-use decision explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_open_scoreA

Read the whole open score back by way of a MusicXML export.

The only route to the full contents of the score that is open. Reads over the
Remote API see the selection alone, so everything else here works blind. This
is what makes bar count, key, time signature and above all a pickup bar
knowable instead of guessed.

Returns:
    Result dictionary with the parsed summary, the pickup finding, the last
    bar number, and the file that was read.

Note:
    Dorico's MusicXML export filter opens a modal dialog that requires user
    confirmation. This tool triggers the export dialog and awaits the resulting
    file in export_dir. Point the export dialog to export_dir once in Dorico to
    enable one-key export confirmations on subsequent reads.

    The result is a snapshot of the score at export time. Re-export after
    edits to refresh score state.
ParametersJSON Schema
NameRequiredDescriptionDefault
triggerNoTrue opens Dorico's MusicXML export dialog first. False skips that and reads whatever MusicXML already lies in the folder, which is what to use after a timeout or a manual export.
export_dirYesFolder Dorico's export dialog is pointed at. The newest MusicXML file that appears there is the one read back.
wait_secondsNoHow long to wait for the file while a person confirms the dialog. The call returns as soon as one appears.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing that Dorico opens a modal confirmation dialog, that the tool triggers an export and waits for a file, and that the result is a snapshot which may be stale after edits. This is important behavioral context the agent would otherwise have no way to know.

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 front-loaded with the core purpose, followed by a clear returns section and a focused note. Every sentence earns its place, and the modal-dialog caveat is appropriately separated from the main 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?

Covers what the tool does, why it matters, what it returns, how the dialog interaction works, and how stale results should be handled. With a detailed input schema and output schema present, nothing an agent needs to call this correctly is missing.

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 mostly reinforces the schema's parameter meanings rather than adding new parameter-specific detail, though the note about the export dialog and one-key setup does enrich the context around `export_dir` and `trigger`.

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?

States a specific verb and resource: 'Read the whole open score back by way of a MusicXML export.' It also distinguishes itself from selection-scoped reads by explaining that Remote API reads see only the selection, making this the only route to the full score contents.

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 positions the tool as the only way to access full-score contents, contrasting with selection-only reads. It also advises when to refresh the snapshot after edits, and the trigger parameter description gives a clear condition for when to use False after a timeout or manual export.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_project_infoA
Read-onlyIdempotent

Read metadata, flows, and player rosters from a saved .dorico file.

Opens the project as the ZIP archive it is and reads the document and per-flow
metadata out of it. Entirely offline: Dorico need not be running, and this works
on a project nobody has open.

Returns:
    Result dictionary with the document metadata, the flows, and the players.

Note:
    This reads the project wrapper, not the music: for notes and rhythms, export
    with export_musicxml and read that with read_score. For the project open in
    Dorico right now, get_status reports its state and read_selection its
    selection.
ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFilesystem path to a saved .dorico project. Read straight from the file, so it can be any project on disk and not only the one open in Dorico.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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, and destructiveHint, and the description adds meaningful behavioral context: it reads the .dorico file as a ZIP archive, runs entirely offline, does not require Dorico to be running, works on unopened projects, and reads only the project wrapper rather than musical content.

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?

The description is front-loaded, well-organized into Returns and Note sections, and concise overall. It loses a point for slightly repeating what the parameter schema already states, but every other 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 an existing output schema, the description need not spell out return values. It still explains the wrapper-vs-music distinction, offline behavior, and sibling alternatives, so an agent has sufficient context 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% and the path parameter is already documented as a filesystem path that can point to any project on disk, not just the open one. The description repeats that idea and adds the 'offline' framing, but does not add new parameter-level detail 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 opening sentence names a specific verb ('Read'), a specific object ('metadata, flows, and player rosters'), and a specific resource ('saved .dorico file'). The note further distinguishes it from music-extraction and live-state siblings, so an agent can tell it apart from read_score, export_musicxml, get_status, and read_selection.

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 says to use export_musicxml + read_score for notes and rhythms, and identifies get_status/read_selection for the project open in Dorico. This provides clear when-to-use and when-not-to-use guidance with named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_scoreA
Read-onlyIdempotent

Read an existing MusicXML file measure by measure using music21.

Entirely offline and read-only. This is the way to see pitches, which Dorico
itself will not report over the Remote API.

Returns:
    Structured dictionary with the metadata, parts, measures and note events.

Note:
    Use the bars filter rather than reading everything when the question is
    local: a full read of a long score returns every note of every part.

    To see the music currently in Dorico, export it with export_musicxml first
    and read that. read_project_info reads a .dorico project wrapper instead,
    and read_selection reports the live selection without pitches.
ParametersJSON Schema
NameRequiredDescriptionDefault
barsNoWhich bars to read, as a filter string: '8' for one, '8-12' for a range, '8,10,12' for a list. Bars are counted from 1. Omit to read the whole score, which on a long one is a lot of output.
pathYesFilesystem path to the MusicXML file to read.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reinforces the read-only and offline nature, consistent with the annotations (readOnlyHint=true, idempotentHint=true, destructiveHint=false). No side effects are hidden; the return type is mentioned as a structured dictionary.

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?

The description is efficient, with each sentence contributing either to purpose, usage guidance, or alternative comparisons. It is slightly verbose but not unnecessarily long.

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 (not shown but indicated), the description provides sufficient context about return structure (dictionary), usage scenarios, and tool relationships, making it complete for an agent to decide when and how to use 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 schema already provides 100% coverage with descriptions for both parameters. The description adds a practical tip about using the bars filter to limit output, enhancing the schema without redundancy.

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 reads an existing MusicXML file using music21, and distinguishes itself from siblings like read_selection and read_project_info by specifying 'existing MusicXML file' and 'measure by measure'.

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: use the bars filter for local questions, export from Dorico first to see current music, and contrasts with read_project_info and read_selection, leaving no ambiguity about alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_selectionA
Read-onlyIdempotent

Read rhythmic and notation properties of the active selection.

Reports duration, dots, articulations, accidental and event type for whatever a
person has selected in Dorico. Nothing here can change the selection, so make it
in Dorico or move the caret with goto_bar first.

Returns:
    Result dictionary with has_selection, and the properties when it is true.
    An empty selection answers has_selection=False rather than an error.

Note:
    Pitch and bar or beat position are not exposed by Dorico's Remote API, so
    they are absent here and no amount of selecting will produce them. To read
    pitches, export the flow with export_musicxml and read it with read_score,
    or read a saved project with read_project_info.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly and idempotent annotations, the description discloses the empty-selection behavior (has_selection=False rather than an error), the API limitation about pitch and bar/beat position, and routes around that limitation. This gives the agent accurate expectations for edge cases.

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 with a clear purpose statement, a concise returns section, and a useful note about limitations. Every sentence contributes meaning, and the most important behavioral details are 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 zero-parameter read tool with an output schema and strong annotations, the description covers what the agent needs: what the tool reads, how to prepare the selection, what empty selections return, and where to go for unavailable data. Nothing essential is missing.

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 zero parameters, so parameter semantics are largely moot. The baseline for zero-parameter tools is 4, and the description correctly focuses on behavior and return values instead of inventing parameter details.

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 reads rhythmic and notation properties of the active selection, and lists concrete properties like duration, dots, articulations, accidental, and event type. This distinguishes it from sibling tools that read full scores or project information.

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 tells the agent to establish the selection first, either in Dorico or via goto_bar, and warns that this tool cannot change the selection. It also names specific alternatives for reading pitch data, which is not available here.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_to_doricoA

Render a ScoreSpec through the caret path, or plan it without sending.

The lower half of write_score, exposed on its own for the two cases where that
matters: seeing the command plan before it runs, and skipping the preflight
checks and the MusicXML option that write_score adds on top.

Returns:
    Result dictionary with the command plan when dry_run is true, or the
    execution outcome when it is false.

Note:
    Prefer write_score for ordinary composition: it runs the range and voice
    leading checks first and can take the MusicXML path when a key or time
    signature is needed. Come here to inspect what would be sent, or when the
    caret path is specifically what is wanted.

    With dry_run true this is a read: nothing is dispatched and Dorico need not
    even be running.
ParametersJSON Schema
NameRequiredDescriptionDefault
scoreYesThe score to work on, as a ScoreSpec object: metadata, parts, and the events inside them. Call score_schema first for the exact shape, which refuses unknown keys rather than ignoring them.
dry_runNoTrue plans the commands and returns them without sending any, which changes nothing in Dorico and needs no connection to it. False dispatches them.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds significant behavior beyond the annotations: dry_run true is a read that dispatches nothing and does not even require Dorico to be running, while dry_run false dispatches commands. It also discloses that this path skips the preflight checks and MusicXML handling that write_score adds, and explains the different return shapes for the two modes. The annotation readOnlyHint=false is consistent because the false mode writes/dispatches.

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 tightly organized with a lead sentence, a Returns section, and a Note section. Every sentence carries information: what the tool does, how it relates to write_score, what it returns, when to prefer the sibling, and the read-like behavior of dry_run. There is no filler or repetition that wastes the agent's attention.

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 is present, the description does not need to enumerate return fields. It covers what the tool does, the two usage modes, the difference from write_score, when to choose each, and the connection/dispatch implications of dry_run. This is complete enough for an agent to select and invoke the tool correctly in both modes.

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, and the schema already provides strong descriptions for both 'score' and 'dry_run'. The tool description reinforces the dry_run semantics with 'plan it without sending' and 'nothing is dispatched', but it does not add meaningful new parameter-level information beyond what the 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?

The description opens with a specific verb and resource: 'Render a ScoreSpec through the caret path, or plan it without sending.' It clearly distinguishes this tool from write_score by calling it 'the lower half of write_score' and naming the two cases that matter, so an agent can separate it from its siblings without guessing.

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 Note explicitly says to 'Prefer write_score for ordinary composition' and gives exact reasons: it runs range and voice-leading checks and can take the MusicXML path. It then says to come here 'to inspect what would be sent, or when the caret path is specifically what is wanted.' This is exemplary when/when-not guidance with a named alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_commandA

Dispatch any catalogued Dorico command by ID, with optional parameters.

The escape hatch, reaching the whole catalogued command set rather than the
handful of tools here. What it can send is bounded by the catalog.

Returns:
    Result dictionary with the command outcome and the catalog row status, which
    says how well that command is actually established.

Note:
    Read the registry_status in the answer before trusting the result: a row may
    be verified, reachable, unavailable, broken or untested, and only verified
    has been seen to work. Combined with kOK meaning acceptance rather than
    effect (docs/protocol.md), a clean return from an untested row is weak
    evidence. Check with get_status or by inspecting the score.

    Prefer a dedicated tool where one exists: write_score, transpose,
    switch_mode, playback and save all add validation or verification this does
    not. Use search_commands to find a command ID and what it takes.
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNoQuery parameters for the command, whose names differ per command and are declared in the catalog rather than here. Add {'confirm': True} to authorise a command the catalog marks destructive. Without it such a command is refused.
command_idYesThe command to send, exactly as the catalog declares it, e.g. 'Edit.Undo'. Case and spelling are not corrected. Find one with search_commands or the dorico://commands resource.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations: it explains registry_status semantics (verified, reachable, unavailable, broken, untested), cautions that kOK means acceptance rather than effect, and discloses the confirm flag requirement for destructive commands. It also warns that command_id is matched exactly with no case/spelling correction.

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 long but every sentence earns its place. It is front-loaded with the core purpose, then organizes Return behavior and safety notes into clear sections. No fluff or repetition of schema fields; it packs high-density operational guidance.

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 an escape-hatch command dispatcher, the description covers command discovery, parameter semantics, destructive-command authorization, result trustworthiness, verification alternatives, and fallback logic. The presence of an output schema also relieves it of explaining return structure, and it still explains the key status field.

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?

Even though schema coverage is 100%, the description adds crucial meaning: params are command-specific and declared in the catalog, {'confirm': True} authorizes destructive commands, and command_id must match the catalog exactly. This is exactly the kind of contextual parameter guidance an agent needs beyond the raw 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 opens with a specific verb and resource: 'Dispatch any catalogued Dorico command by ID, with optional parameters.' It clearly frames the tool as an escape hatch that reaches the entire catalogued command set, distinguishing it from the more specialized sibling tools.

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?

Usage guidance is explicit and actionable: 'Prefer a dedicated tool where one exists: write_score, transpose, switch_mode, playback and save all add validation or verification this does not.' It also directs the agent to search_commands for finding command IDs and parameters, and explains when this tool is the appropriate fallback.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saveA
Destructive

Save the open project over its existing file on disk.

Sends File.Save, which writes the project in place. A project that has never
been saved has no path to write to, so this cannot be relied on to save one:
check that the project has a file before treating it as a save.

Returns:
    Result dictionary reporting whether the command was accepted.

Note:
    When to use: Save changes in an already-saved project file on disk.
    When NOT to use: Do not use if the project has never been saved (has no
    path). To produce a file for external use without altering the open
    project file, use export_pdf or export_musicxml instead.

    Acceptance is not completion here either (docs/protocol.md, "Command
    Acceptance vs Effect"), so a kOK does not prove the file on disk has changed.

    This overwrites the .dorico project file in place.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that the tool overwrites the .dorico file in place, that acceptance (kOK) does not guarantee the file changed, and that the command has no effect on unsaved projects. This goes well beyond the destructiveHint annotation and gives the agent important behavioral expectations.

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?

The description is front-loaded with the core purpose and uses clear Returns and Note sections. It is slightly repetitive in places (e.g., restating 'in place' and 'overwrite'), but the overall structure is readable and each section contributes operational guidance.

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 save operation with an output schema present, the description covers all the essential context: the action, the precondition (already saved), the destructive effect, the acceptance caveat, and alternatives. Nothing an agent needs to call it correctly is missing.

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?

There are no parameters and the schema coverage is 100%, so no additional parameter documentation is needed. The description's zero-parameter nature makes this dimension trivially satisfied; a 4 is appropriate rather than 5 because there is no parameter semantics to add at all.

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 states a specific verb and resource ('Save the open project over its existing file on disk') and clearly distinguishes it from export alternatives like export_pdf and export_musicxml. It is immediately obvious what the tool does and how it differs from siblings.

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 and when-not-to-use guidance, including the key limitation that it cannot save a project that has never been saved. It also names the alternatives to use for exports, giving the agent clear decision criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

score_schemaA
Read-onlyIdempotent

Return the ScoreSpec input format write_score/render_to_dorico expect.

Call this instead of guessing or reading source. Unknown keys are rejected by
the parser rather than ignored, so the shape has to match exactly.

Returns:
    Result dictionary with a copyable minimal example in both the flat and the
    nested form, the allowed enum values (durations, articulations, dynamics,
    clefs) and the indexing rules.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/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 valuable behavioral context beyond that: unknown keys are rejected rather than ignored, and the result contains copyable examples, enum values, and indexing rules. This significantly helps the agent trust and correctly use the output.

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 compact, front-loaded with the core purpose, and clearly structured into use-case guidance and return-value details. Every sentence adds information and no space is wasted.

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 parameterless, read-only, idempotent tool with an output schema, the description is fully adequate. It explains when to call it, what it does, a critical parser behavior, and the contents of the returned example. Nothing essential is missing for an agent to invoke it 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?

The tool has zero parameters, so parameter semantics are not applicable; the baseline for a parameterless tool is 4. The description instead explains what the returned result contains, which is the relevant semantic information for a no-input tool.

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 states a specific verb ('Return') and a specific resource ('ScoreSpec input format') and names the downstream tools that consume it (write_score/render_to_dorico). This cleanly differentiates the tool from all data-retrieval or editing siblings.

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 instructs to call this instead of guessing or reading source, which tells the agent when to use this tool and removes ambiguity. It also implies the tool is a prerequisite for write_score/render_to_dorico, providing clear contextual guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_commandsA
Read-onlyIdempotent

Search the Dorico command catalog by query, category, or status.

Entirely offline: the catalog ships with this server, so nothing is asked of
Dorico and it need not be running.

Returns:
    Result dictionary with the total number of matches, a count per status, and
    the matching commands with their IDs, parameters and documentation.

Note:
    This is how to find a command ID and what it takes before sending it with
    run_command, and how to see the status that tells you how far to trust it.
    Only 'verified' rows have been observed to work.

    Prefer a dedicated tool where one exists: much of what the catalog can reach
    is already covered by write_score, transpose, playback, save and the rest,
    with validation run_command does not perform.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMost entries to return. The answer still reports the total number of matches, so a truncated result says so.
queryNoSubstring matched case-insensitively against command IDs and their documentation. Empty matches everything, which with a limit is how to browse a category.
statusNoHow well established the command is: 'verified', 'reachable', 'unavailable', 'broken' or 'untested'. Filter on 'verified' for the ones actually seen to work. Omit for every status.
categoryNoCommand family to restrict to, e.g. 'NoteInput', 'Edit' or 'Play', matched case-insensitively. Omit for every family.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds meaningful context beyond those annotations: the search is entirely offline, Dorico need not be running, and the return shape includes total matches, per-status counts, and matching commands. This gives the agent a clear model of side effects and environment requirements.

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 front-loaded with the core purpose, then uses short labeled sections for offline behavior, return value, and usage guidance. Every sentence adds value: the offline note prevents false assumptions about needing Dorico, the return description clarifies output semantics, and the 'prefer a dedicated tool' line prevents misuse. It is longer than a one-liner but not bloated.

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 is complete for a search tool of this complexity. It explains the environment constraint, the return value, the trust model for status, and the relationship to run_command and sibling tools. The input schema covers parameter semantics, and the output schema is present, so the description does not need to repeat structured details.

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 the schema already documents all four parameters well. The description adds extra meaning by explaining that status indicates how far to trust a command and that only 'verified' rows have been observed to work, which directly informs how an agent should use the status parameter. It also reinforces that an empty query with a limit is a way to browse categories, matching the schema's 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 opens with a specific verb and resource: 'Search the Dorico command catalog by query, category, or status.' It clearly distinguishes this tool from siblings by explaining its role as the lookup mechanism for command IDs before using run_command, rather than a command-execution or music-editing tool.

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 gives explicit guidance on when to use this tool: to find a command ID, understand its required inputs, and check status trust before invoking run_command. It also explicitly warns to prefer dedicated sibling tools where they exist, naming write_score, transpose, playback, and save as alternatives, which is strong routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_key_signatureA
Read-onlyIdempotent

Report that a key signature cannot be set here, and what to use instead.

This writes nothing and always reports failure, for the same reason as
set_time_signature: Dorico takes a key signature only through an interactive
popover, and the Remote API cannot type into one.

Returns:
    Result dictionary explaining the limitation and naming the alternatives.

Note:
    For a person at the keyboard, open_popover(kind='key') opens the popover for
    them to type into. For an unattended write, put the key in a ScoreSpec and
    use write_score(method='musicxml') or export_musicxml, which set it through
    the file rather than the UI.
ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoThe key that was wanted, e.g. 'G major', 'C# minor' or 'Bb major'. Reported back in the answer so the caller can carry it to one of the alternatives. Nothing is written from it.C major

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that it writes nothing and always reports failure, going beyond the readOnlyHint and idempotentHint annotations. It also explains why the limitation exists, which helps the agent understand that this is an intentional capability gap rather than an error.

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?

Every sentence earns its place: the primary behavior is front-loaded, the reason is explained, return semantics are stated, and the note cleanly separates the two practical alternatives. No redundant 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?

For a deliberately failing tool with a single parameter, an output schema, and read-only annotations, the description is complete. It covers behavior, reason, return value, and the exact alternative tools to use, leaving no operational ambiguity.

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 the parameter is well described there. The description adds useful context by explaining that the key value is simply reported back so the caller can carry it to an alternative, and that nothing is written from it.

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?

States a specific verb and resource: it reports that a key signature cannot be set and explains what to use instead. This clearly distinguishes it from a normal setter like set_time_signature or write_score by making its failure behavior explicit.

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: open_popover for a person at the keyboard, and write_score or export_musicxml for unattended writes. It also references set_time_signature to group related limitation-based tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_time_signatureA
Read-onlyIdempotent

Report that a time signature cannot be set here, and what to use instead.

This writes nothing and always reports failure, which is the honest answer
rather than a silent no-op: Dorico takes a time signature only through an
interactive popover, and the Remote API cannot type into one.

Returns:
    Result dictionary explaining the limitation and naming the alternatives.

Note:
    Two ways round it. For a person at the keyboard, open_popover(kind='time')
    opens the popover for them to type into. For an unattended write, put the
    time signature in a ScoreSpec and use write_score(method='musicxml') or
    export_musicxml, both of which set it through the file rather than the UI.
ParametersJSON Schema
NameRequiredDescriptionDefault
signatureNoThe time signature that was wanted, e.g. '4/4', '3/4' or '6/8'. Reported back in the answer so the caller can carry it to one of the alternatives. Nothing is written from it.4/4

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even though annotations already declare readOnlyHint, idempotentHint, and destructiveHint, the description adds crucial behavioral context: it 'writes nothing and always reports failure' and explains why a silent no-op would be misleading. This is exactly the kind of non-obvious behavior an agent needs to understand.

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 with a front-loaded summary, a returns line, and a note section. Every sentence earns its place by explaining the limitation, the failure behavior, or the alternatives. No filler or repeated schema content.

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 unusual behaviorโ€”always failing on purposeโ€”the description fully covers what the tool does, why it does it, what the caller gets back, and what to use instead. The presence of an output schema and full parameter coverage means no essential context is missing.

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 schema already covers the single parameter with a clear description, so the baseline is 3. The tool description adds extra value by explaining that the signature is 'reported back in the answer so the caller can carry it to one of the alternatives' and emphasizing that 'nothing is written from it.'

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 opens with a specific verb and resource: 'Report that a time signature cannot be set here, and what to use instead.' It clearly distinguishes this from siblings like set_key_signature by framing it as a deliberate failure-reporting tool rather than an actual setting operation.

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 names alternatives and gives conditions for choosing them: open_popover(kind='time') for interactive use, and write_score(method='musicxml') or export_musicxml for unattended writes. This gives an agent concrete routing guidance rather than leaving usage to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

suggest_next_chordA
Read-onlyIdempotent

Suggest functional continuations for a Roman numeral progression.

Entirely offline and read-only: this reasons about numerals as symbols and never
touches a score or Dorico.

Returns:
    Result dictionary with the candidate next chords, each carrying its harmonic
    function and why it follows.

Note:
    Suggestions come from common-practice function, so they describe what usually
    follows rather than what must. Nothing is written anywhere. To hear a
    candidate, put it in a ScoreSpec and use write_score.

    This takes numerals, not notes. To get numerals out of actual music, run
    analyze_harmony first and feed its reading in here.
ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesThe tonal centre the numerals are read against, e.g. 'C major', 'A minor' or 'F# major'. The numerals mean nothing without it.
progressionYesThe chords so far as Roman numerals, in order, e.g. ['I', 'vi', 'ii']. Case carries the quality: upper case is major, lower case minor. The last entry is the one being continued from.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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, and destructiveHint=false, and the description adds meaningful behavioral context beyond those: 'Entirely offline', 'reasons about numerals as symbols and never touches a score or Dorico', and 'common-practice function... what usually follows rather than what must.' This tells the agent the tool is heuristic, symbolic, and side-effect-free in operational terms, not just via hints.

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?

The description is well-structured with a lead sentence, a Returns block, and a Note block. It is efficient and front-loaded. Minor redundancy exists: 'read-only' and 'Nothing is written anywhere' both restate what annotations already convey, but this is not harmful given the safety-critical nature of read-only assurances.

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 an output schema present, the description need not detail return fields, yet it still summarizes the return shape. It covers operational context (offline, non-Dorico), limitations (common-practice heuristics), and integration with relevant siblings. For a two-parameter tool, this is comprehensive and leaves no critical gap.

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 schema already documents both key and progression with examples and case conventions. The description adds no extra parameter-level semantics beyond restating that it takes numerals rather than notes. Baseline 3 is appropriate since the schema carries the full burden.

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 opens with a specific verb and resource: 'Suggest functional continuations for a Roman numeral progression.' This clearly distinguishes it from sibling tools like analyze_harmony (which extracts numerals) and write_score (which materializes music). The purpose is unambiguous and not a tautology.

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 gives explicit workflow guidance: 'This takes numerals, not notes. To get numerals out of actual music, run analyze_harmony first and feed its reading in here.' It also names write_score as the way to hear a candidate. These are concrete when-to-use and how-to-chain instructions with sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

switch_modeA
Idempotent

Switch which of Dorico's five workspace modes is on screen.

Changes the window and nothing in the music: no notes, no playback position and
no selection move as a result.

Returns:
    Result dictionary reporting whether the switch was accepted.

Note:
    Note entry needs write mode, so switch there before add_notes, add_rest,
    goto_bar or write_score if the project might be in another one. get_status
    reports which mode is active without changing it.

    This is not navigation. To scroll the score use navigate, and to move the
    caret use goto_bar.
ParametersJSON Schema
NameRequiredDescriptionDefault
modeYesWhich mode to show: 'setup' for players, layouts and flows, 'write' for note entry and editing, 'engrave' for graphical adjustment and spacing, 'play' for the track view and VST instruments, 'print' for print and export setup. The raw kName forms are accepted too.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

While the idempotentHint annotation is present, the description adds concrete behavioral detail: it changes only the window, doesn't affect notes, playback position, or selection, and reports whether the switch was accepted. It also clarifies that the mode change is not read-only in the annotation sense but is still non-destructive.

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-organized with a clear first sentence, explicit side-effect statement, return mention, and practical note. Every section adds distinct value and important 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?

The tool is conceptually simple with one parameter, an output schema, and annotations. The description fully covers purpose, side effects, prerequisites, and exclusions relative to sibling tools. Nothing an agent needs to call it correctly is missing.

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 a detailed mode parameter description listing all five values and their meanings. The description adds value by tying those modes to practical workflow context (e.g., write mode is needed before note-entry tools), which helps the agent pick the right mode value.

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 states a specific verb ('Switch') and resource ('Dorico's five workspace modes') and immediately distinguishes the tool from navigation tools by explicitly saying this is not navigation. An agent can understand exactly what mode switching accomplishes.

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 gives explicit when-to-use guidance: switch to write mode before note-entry tools if needed, and explicitly contrasts with navigate and goto_bar for scrolling and caret movement. This is ideal routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

transposeA

Transpose currently selected notes up or down in the score.

Directly modifies the score by altering the pitches of the current selection
in place. Relative and repeatable: calling it twice moves the selection twice
as far, with no absolute target pitch.

Returns:
    Result dictionary with the command outcome and the catalog row
    registry_status.

Note:
    When to use: Shift existing selected notes by semitone, diatonic step,
    or octave intervals.
    When NOT to use: Do not use to enter new music (use write_score or
    add_notes). Do not use to change key signatures (use set_key_signature).

    Operates strictly on the active selection (reads are selection-only). If
    nothing is selected, Dorico ignores the command and no notes are modified;
    make a selection first or place the caret via goto_bar.

    Parameters: direction sets shift orientation ('up'/'down'). chromatic
    shifts by exact semitone when True or diatonically when False. octave=True
    overrides chromatic and shifts by a full octave.

    Maps to NoteEdit.Pitch{Up,Down}[Chromatic|Octave]. Read registry_status in
    the returned result and verify the change in the score or via playback.
ParametersJSON Schema
NameRequiredDescriptionDefault
octaveNoTrue shifts by a full octave (12 semitones or 8 diatonic steps) and overrides chromatic, which is then ignored.
chromaticNoTrue steps by an exact chromatic semitone. False steps diatonically within the current key signature, so the interval varies by scale degree.
directionYesWhich way to shift pitch: 'up' moves higher, 'down' moves lower.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations only provide minimal hints (readOnly=false, destructive=false, idempotent=false). The description adds critical behavior: it modifies the score in place, is relative and repeatable, is a no-op with no selection, and tells the agent to verify via registry_status and the score/playback.

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?

The description is structured clearly: purpose first, then returns, then when/when-not, then behavior and parameters. It is longer than minimal, but each section carries useful guidance; only the 'Maps to CommandNote.Pitch...' line is mildly internal and less essential.

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 selection-dependent, relative, repeatable behavior and no rich annotations, the description covers the preconditions, failure mode, parameter behavior, and verification steps. Since an output schema exists, not explaining the return dictionary in detail is acceptable.

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?

The schema has 100% coverage and already fully documents direction, chromatic, and octave semantics, including the override behavior. The description essentially restates these facts ('direction sets shift orientation', 'octave=True overrides chromatic') without adding meaning beyond the schema, so a 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 opens with 'Transpose currently selected notes up or down in the score,' a specific verb plus resource. It also differentiates from siblings by stating what the tool is not for: entry music (write_score/add_notes) and key signature changes (set_key_signature).

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?

An explicit 'When to use' block says to shift selected notes by semitone, diatonic step, or octave intervals, and a 'When NOT to use' block names the alternative tools. It also explains the no-selection case and directs the agent to make a selection or use goto_bar.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

write_scoreA

Render a ScoreSpec into Dorico by caret entry or MusicXML import.

The main way to write music here, and the one to reach for whenever there is
more than a single beat to enter: add_notes and add_rest do not chain, because
each re-enters note input at the caret and stacks on the same beat.

Returns:
    Result dictionary with the execution report, the preflight warnings, and the
    caveats attached to what was dispatched.

Note:
    Choose the method by what the score needs. 'caret' adds to the current flow
    and leaves the rest of the project alone, but it cannot set a key or time
    signature, because those go in through a popover no API can type into.
    'musicxml' carries them, at the price of arriving as a new flow rather than
    joining the current one.

    Call score_schema first for the exact shape: unknown keys are refused rather
    than ignored. Dorico must be in write mode, so use switch_mode if unsure.
    Nothing is verified by the return, since kOK means accepted rather than
    effective (docs/protocol.md), so check the result in the score.

    The caret path repositions between staves by jumping to the start of the
    flow, so it needs to know nothing about the flow's meter or length.
ParametersJSON Schema
NameRequiredDescriptionDefault
scoreYesThe score to work on, as a ScoreSpec object: metadata, parts, and the events inside them. Call score_schema first for the exact shape, which refuses unknown keys rather than ignoring them.
methodNoHow to get the music in. 'caret' types it into the flow already open, adding to what is there. 'musicxml' writes the whole score to a file and imports it as a new flow, which is the only path that carries key and time signatures.caret
preflightNoTrue runs the offline range and voice-leading checks first and reports what they found before anything is sent to Dorico. It warns rather than blocks.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are sparse (only safe/write flags), so the description carries the burden. It discloses that kOK means accepted rather than effective, that the caret path restarts at the start of the flow, that musicxml imports as a new flow, and that unknown keys are refused rather than ignored. 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?

The description is long but every section earns its place: headline purpose, sibling differentiation, return summary, method decision rule, preconditions, and a subtle caret navigation behavior. It is structured with Returns and Note sections, making the density navigable.

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 complex write tool with no meaningful annotations, the description covers when to use it, how to choose the method, what side effects each method has, what preconditions exist, and how to interpret the return. Nothing an agent needs to call it correctly is missing.

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 the schema already documents score, method, and preflight. The description adds meaning beyond it: method choice tradeoffs, that preflight warns rather than blocks, and that score_schema should be called first because strict parsing rejects unknown keys. This is useful but not radically more than the 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?

The first sentence names a specific verb ('Render') and resource ('ScoreSpec into Dorico') and immediately distinguishes the two entry paths, caret and MusicXML. It further contrasts with add_notes/add_rest by explaining they do not chain, so an agent can tell this tool apart from its closest siblings.

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 this is the tool to reach for whenever more than a single beat is needed, and why add_notes/add_rest are unsuitable. It also gives a decision rule between caret and musicxml, including limitations (key/time signatures) and side effects (new flow), plus prerequisites like switch_mode and score_schema.

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. 1 tool update
    • Changedtranspose3 fields changed
      • changedInput schema / properties / chromatic / description
        Previous value: -"True steps by a chromatic semitone. False steps diatonically, staying inside the key, so the interval depends on the note."New value: +"True steps by an exact chromatic semitone. False steps diatonically within the current key signature, so the interval varies by scale degree."
      • changedInput schema / properties / direction / description
        Previous value: -"Which way to move the pitch: up or down."New value: +"Which way to shift pitch: 'up' moves higher, 'down' moves lower."
      • changedInput schema / properties / octave / description
        Previous value: -"True moves by a whole octave and overrides chromatic, which is then not read at all."New value: +"True shifts by a full octave (12 semitones or 8 diatonic steps) and overrides chromatic, which is then ignored."
  2. 9 tool updatesv0.1.5
    • Changedanalyze_harmony4 fields changed
      • changedInput schema / $defs / EventIn / properties / kind / description
        Previous value: -"'note', 'chord' or 'rest'; inferred if absent."New value: +"'note', 'chord' or 'rest'. Inferred if absent."
      • changedInput schema / $defs / EventIn / properties / staff / description
        Previous value: -"0-based; must match the nesting staff."New value: +"0-based. Must match the nesting staff."
      • changedInput schema / $defs / EventIn / properties / voice / description
        Previous value: -"1-based; must match the nesting voice."New value: +"1-based. Must match the nesting voice."
      • changedInput schema / $defs / VoiceIn / properties / index / description
        Previous value: -"1-based voice number; defaults to position."New value: +"1-based voice number, defaults to position."
    • Changedcheck_counterpoint1 field changed
      • changedInput schema / properties / species / description
        Previous value: -"Which species to check. Only 1, note against note, is implemented; any other value is refused rather than approximated."New value: +"Which species to check. Only 1, note against note, is implemented. Any other value is refused rather than approximated."
    • Changedcheck_voice_leading4 fields changed
      • changedInput schema / $defs / EventIn / properties / kind / description
        Previous value: -"'note', 'chord' or 'rest'; inferred if absent."New value: +"'note', 'chord' or 'rest'. Inferred if absent."
      • changedInput schema / $defs / EventIn / properties / staff / description
        Previous value: -"0-based; must match the nesting staff."New value: +"0-based. Must match the nesting staff."
      • changedInput schema / $defs / EventIn / properties / voice / description
        Previous value: -"1-based; must match the nesting voice."New value: +"1-based. Must match the nesting voice."
      • changedInput schema / $defs / VoiceIn / properties / index / description
        Previous value: -"1-based voice number; defaults to position."New value: +"1-based voice number, defaults to position."
    • Changedexport_musicxml4 fields changed
      • changedInput schema / $defs / EventIn / properties / kind / description
        Previous value: -"'note', 'chord' or 'rest'; inferred if absent."New value: +"'note', 'chord' or 'rest'. Inferred if absent."
      • changedInput schema / $defs / EventIn / properties / staff / description
        Previous value: -"0-based; must match the nesting staff."New value: +"0-based. Must match the nesting staff."
      • changedInput schema / $defs / EventIn / properties / voice / description
        Previous value: -"1-based; must match the nesting voice."New value: +"1-based. Must match the nesting voice."
      • changedInput schema / $defs / VoiceIn / properties / index / description
        Previous value: -"1-based voice number; defaults to position."New value: +"1-based voice number, defaults to position."
    • Changedrender_to_dorico4 fields changed
      • changedInput schema / $defs / EventIn / properties / kind / description
        Previous value: -"'note', 'chord' or 'rest'; inferred if absent."New value: +"'note', 'chord' or 'rest'. Inferred if absent."
      • changedInput schema / $defs / EventIn / properties / staff / description
        Previous value: -"0-based; must match the nesting staff."New value: +"0-based. Must match the nesting staff."
      • changedInput schema / $defs / EventIn / properties / voice / description
        Previous value: -"1-based; must match the nesting voice."New value: +"1-based. Must match the nesting voice."
      • changedInput schema / $defs / VoiceIn / properties / index / description
        Previous value: -"1-based voice number; defaults to position."New value: +"1-based voice number, defaults to position."
    • Changedrun_command1 field changed
      • changedInput schema / properties / params / description
        Previous value: -"Query parameters for the command, whose names differ per command and are declared in the catalog rather than here. Add {'confirm': True} to authorise a command the catalog marks destructive; without it such a command is refused."New value: +"Query parameters for the command, whose names differ per command and are declared in the catalog rather than here. Add {'confirm': True} to authorise a command the catalog marks destructive. Without it such a command is refused."
    • Changedset_key_signature1 field changed
      • changedInput schema / properties / key / description
        Previous value: -"The key that was wanted, e.g. 'G major', 'C# minor' or 'Bb major'. Reported back in the answer so the caller can carry it to one of the alternatives; nothing is written from it."New value: +"The key that was wanted, e.g. 'G major', 'C# minor' or 'Bb major'. Reported back in the answer so the caller can carry it to one of the alternatives. Nothing is written from it."
    • Changedset_time_signature1 field changed
      • changedInput schema / properties / signature / description
        Previous value: -"The time signature that was wanted, e.g. '4/4', '3/4' or '6/8'. Reported back in the answer so the caller can carry it to one of the alternatives; nothing is written from it."New value: +"The time signature that was wanted, e.g. '4/4', '3/4' or '6/8'. Reported back in the answer so the caller can carry it to one of the alternatives. Nothing is written from it."
    • Changedwrite_score4 fields changed
      • changedInput schema / $defs / EventIn / properties / kind / description
        Previous value: -"'note', 'chord' or 'rest'; inferred if absent."New value: +"'note', 'chord' or 'rest'. Inferred if absent."
      • changedInput schema / $defs / EventIn / properties / staff / description
        Previous value: -"0-based; must match the nesting staff."New value: +"0-based. Must match the nesting staff."
      • changedInput schema / $defs / EventIn / properties / voice / description
        Previous value: -"1-based; must match the nesting voice."New value: +"1-based. Must match the nesting voice."
      • changedInput schema / $defs / VoiceIn / properties / index / description
        Previous value: -"1-based voice number; defaults to position."New value: +"1-based voice number, defaults to position."
  3. 25 tool updatesv0.1.2
    • Changedadd_notes3 fields changed
      • addedInput schema / properties / as_chord / description
        Added value: +"True stacks the pitches into one chord on a single beat. False enters them one after another, each of the given duration."
      • addedInput schema / properties / duration / description
        Added value: +"Rhythmic duration, one of: whole, half, quarter, eighth, sixteenth, 32nd, 64th. Case-insensitive."
      • addedInput schema / properties / notes / description
        Added value: +"Pitches in scientific notation, e.g. ['C4', 'E4', 'G4']: a letter, an optional # or b, then the octave number, where C4 is middle C."
    • Changedadd_rest1 field changed
      • addedInput schema / properties / duration / description
        Added value: +"Rhythmic duration, one of: whole, half, quarter, eighth, sixteenth, 32nd, 64th. Case-insensitive."
    • Changedanalyze_harmony1 field changed
      • addedInput schema / properties / score / description
        Added value: +"The score to work on, as a ScoreSpec object: metadata, parts, and the events inside them. Call score_schema first for the exact shape, which refuses unknown keys rather than ignoring them."
    • Changedcheck_counterpoint3 fields changed
      • addedInput schema / properties / cantus_firmus / description
        Added value: +"The given line, as scientific pitch names in order, e.g. ['D4', 'F4', 'E4', 'D4']."
      • addedInput schema / properties / counterpoint / description
        Added value: +"The line written against it, same notation and the same length: first species is note against note, so the two lists pair up one to one."
      • addedInput schema / properties / species / description
        Added value: +"Which species to check. Only 1, note against note, is implemented; any other value is refused rather than approximated."
    • Changedcheck_voice_leading1 field changed
      • addedInput schema / properties / score / description
        Added value: +"The score to work on, as a ScoreSpec object: metadata, parts, and the events inside them. Call score_schema first for the exact shape, which refuses unknown keys rather than ignoring them."
    • Changedexport_musicxml2 fields changed
      • addedInput schema / properties / path / description
        Added value: +"Where to write the .musicxml file. An existing file at this path is overwritten. Omit to write to a temporary file and take the path from the answer."
      • addedInput schema / properties / score / description
        Added value: +"The score to work on, as a ScoreSpec object: metadata, parts, and the events inside them. Call score_schema first for the exact shape, which refuses unknown keys rather than ignoring them."
    • Changedexport_pdf1 field changed
      • addedInput schema / properties / all_layouts / description
        Added value: +"False exports the layout currently on screen through Print.ExportCurrentLayoutAsPDF. True exports every layout in the project through Print.ExportAllLayoutsAsPDF, which writes one file per layout."
    • Changedgoto_bar4 fields changed
      • addedInput schema / properties / bar / description
        Added value: +"Bar number, counted from 1, so bar 1 is the first bar of the flow. Not an index."
      • addedInput schema / properties / beat / description
        Added value: +"Beat within the bar, counted from 1, so 1.0 is the downbeat and 2.5 is halfway through the second beat."
      • addedInput schema / properties / pickup
        Added value: +{
        +  "default": false,
        +  "description": "True when the flow starts with a pickup (upbeat) bar. Dorico does not number it as bar 1, so bar navigation lands one bar short without this. Nothing in the API reveals a pickup, so ask the person whose score it is, or read an exported MusicXML file with read_score.",
        +  "title": "Pickup",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / staff / description
        Added value: +"Staff index, counted from 0, where 0 is the topmost staff in the current layout. Counted differently from a bar number on purpose: bars start at 1, staves at 0."
    • Changedimport_musicxml1 field changed
      • addedInput schema / properties / path / description
        Added value: +"Filesystem path to the MusicXML file to open. Dorico reads it from disk, so it has to be a path Dorico can reach."
    • Changedinstrument_range2 fields changed
      • addedInput schema / properties / instrument / description
        Added value: +"Instrument to look up, e.g. 'violin', 'flute', 'cello' or 'trumpet'. Matched against the standard orchestral names."
      • addedInput schema / properties / pitch / description
        Added value: +"A pitch to test in scientific notation, e.g. 'C4' or 'A5'. Omit to get the full compass instead of a yes or no."
    • Changednavigate2 fields changed
      • addedInput schema / properties / bar / description
        Added value: +"Bar number counted from 1, read only when target is 'bar'. Ignored for 'start' and 'end'."
      • addedInput schema / properties / target / description
        Added value: +"Where to scroll: 'start' for the beginning of the flow, 'end' for the end. 'bar' is accepted and redirects to goto_bar, because reaching a bar means moving the caret rather than the viewport."
    • Changedopen_popover4 fields changed
      • addedInput schema / properties / bar / description
        Added value: +"Bar to move the caret to first, counted from 1. Omit to open the popover wherever the caret already is."
      • addedInput schema / properties / kind / description
        Added value: +"Which popover to open: 'dynamic', 'tempo', 'key', 'time' or 'clef'. Each maps to its own NoteInput.Create* command."
      • addedInput schema / properties / pickup
        Added value: +{
        +  "default": false,
        +  "description": "True when the flow starts with a pickup (upbeat) bar. Dorico does not number it as bar 1, so bar navigation lands one bar short without this. Nothing in the API reveals a pickup, so ask the person whose score it is, or read an exported MusicXML file with read_score.",
        +  "title": "Pickup",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / staff / description
        Added value: +"Staff index, counted from 0, where 0 is the topmost staff in the current layout. Counted differently from a bar number on purpose: bars start at 1, staves at 0."
    • Changedplayback2 fields changed
      • addedInput schema / properties / action / description
        Added value: +"What the transport should do: 'play', 'stop' or 'rewind'."
      • addedInput schema / properties / location / description
        Added value: +"Where playback starts from, read only when action is 'play': 'kPlayhead' from the playhead, 'kSelection' from what is selected, 'kStartOfFlow' from the top, 'kLastStartPosition' from wherever the last play began."
    • Addedread_open_score
    • Changedread_project_info1 field changed
      • addedInput schema / properties / path / description
        Added value: +"Filesystem path to a saved .dorico project. Read straight from the file, so it can be any project on disk and not only the one open in Dorico."
    • Changedread_score2 fields changed
      • addedInput schema / properties / bars / description
        Added value: +"Which bars to read, as a filter string: '8' for one, '8-12' for a range, '8,10,12' for a list. Bars are counted from 1. Omit to read the whole score, which on a long one is a lot of output."
      • addedInput schema / properties / path / description
        Added value: +"Filesystem path to the MusicXML file to read."
    • Changedrender_to_dorico2 fields changed
      • addedInput schema / properties / dry_run / description
        Added value: +"True plans the commands and returns them without sending any, which changes nothing in Dorico and needs no connection to it. False dispatches them."
      • addedInput schema / properties / score / description
        Added value: +"The score to work on, as a ScoreSpec object: metadata, parts, and the events inside them. Call score_schema first for the exact shape, which refuses unknown keys rather than ignoring them."
    • Changedrun_command2 fields changed
      • addedInput schema / properties / command_id / description
        Added value: +"The command to send, exactly as the catalog declares it, e.g. 'Edit.Undo'. Case and spelling are not corrected. Find one with search_commands or the dorico://commands resource."
      • addedInput schema / properties / params / description
        Added value: +"Query parameters for the command, whose names differ per command and are declared in the catalog rather than here. Add {'confirm': True} to authorise a command the catalog marks destructive; without it such a command is refused."
    • Changedsearch_commands4 fields changed
      • addedInput schema / properties / category / description
        Added value: +"Command family to restrict to, e.g. 'NoteInput', 'Edit' or 'Play', matched case-insensitively. Omit for every family."
      • addedInput schema / properties / limit / description
        Added value: +"Most entries to return. The answer still reports the total number of matches, so a truncated result says so."
      • addedInput schema / properties / query / description
        Added value: +"Substring matched case-insensitively against command IDs and their documentation. Empty matches everything, which with a limit is how to browse a category."
      • addedInput schema / properties / status / description
        Added value: +"How well established the command is: 'verified', 'reachable', 'unavailable', 'broken' or 'untested'. Filter on 'verified' for the ones actually seen to work. Omit for every status."
    • Changedset_key_signature1 field changed
      • addedInput schema / properties / key / description
        Added value: +"The key that was wanted, e.g. 'G major', 'C# minor' or 'Bb major'. Reported back in the answer so the caller can carry it to one of the alternatives; nothing is written from it."
    • Changedset_time_signature1 field changed
      • addedInput schema / properties / signature / description
        Added value: +"The time signature that was wanted, e.g. '4/4', '3/4' or '6/8'. Reported back in the answer so the caller can carry it to one of the alternatives; nothing is written from it."
    • Changedsuggest_next_chord2 fields changed
      • addedInput schema / properties / key / description
        Added value: +"The tonal centre the numerals are read against, e.g. 'C major', 'A minor' or 'F# major'. The numerals mean nothing without it."
      • addedInput schema / properties / progression / description
        Added value: +"The chords so far as Roman numerals, in order, e.g. ['I', 'vi', 'ii']. Case carries the quality: upper case is major, lower case minor. The last entry is the one being continued from."
    • Changedswitch_mode1 field changed
      • addedInput schema / properties / mode / description
        Added value: +"Which mode to show: 'setup' for players, layouts and flows, 'write' for note entry and editing, 'engrave' for graphical adjustment and spacing, 'play' for the track view and VST instruments, 'print' for print and export setup. The raw kName forms are accepted too."
    • Changedtranspose3 fields changed
      • addedInput schema / properties / chromatic / description
        Added value: +"True steps by a chromatic semitone. False steps diatonically, staying inside the key, so the interval depends on the note."
      • addedInput schema / properties / direction / description
        Added value: +"Which way to move the pitch: up or down."
      • addedInput schema / properties / octave / description
        Added value: +"True moves by a whole octave and overrides chromatic, which is then not read at all."
    • Changedwrite_score3 fields changed
      • addedInput schema / properties / method / description
        Added value: +"How to get the music in. 'caret' types it into the flow already open, adding to what is there. 'musicxml' writes the whole score to a file and imports it as a new flow, which is the only path that carries key and time signatures."
      • addedInput schema / properties / preflight / description
        Added value: +"True runs the offline range and voice-leading checks first and reports what they found before anything is sent to Dorico. It warns rather than blocks."
      • addedInput schema / properties / score / description
        Added value: +"The score to work on, as a ScoreSpec object: metadata, parts, and the events inside them. Call score_schema first for the exact shape, which refuses unknown keys rather than ignoring them."
  4. 17 tool updatesv0.1.1
    • Addedanalyze_harmony
    • Addedcheck_counterpoint
    • Addedcheck_voice_leading
    • Addedexport_musicxml
    • Addedexport_pdf
    • Addedgoto_bar
    • Addedimport_musicxml
    • Addedinstrument_range
    • Addedopen_popover
    • Addedread_project_info
    • Addedread_score
    • Addedread_selection
    • Addedrender_to_dorico
    • Addedscore_schema
    • Addedsearch_commands
    • Addedsuggest_next_chord
    • Addedwrite_score
  5. 12 tool updatesv0.1.0
    • First observedadd_notes
    • First observedadd_rest
    • First observedconnect_to_dorico
    • First observedget_status
    • First observednavigate
    • First observedplayback
    • First observedrun_command
    • First observedsave
    • First observedset_key_signature
    • First observedset_time_signature
    • First observedswitch_mode
    • First observedtranspose

TDQS

A4.3/5.0

Scored across 30 tools

Disambiguation4/5

Most tools have clearly distinct purposes, but a few could be confused: write_score and render_to_dorico overlap significantly, and read_score, read_open_score, and read_project_info all deal with reading scores but from different sources. The descriptions do a good job of clarifying the differences, so misselection is unlikely for an agent that reads them carefully.

Naming Consistency4/5

Tool names mostly follow a verb_noun pattern (e.g., search_commands, read_selection, write_score), but a few deviate: transpose, playback, and save are single verbs, and score_schema is a noun. These deviations are minor and the overall naming is still predictable and readable.

Tool Count2/5

With 30 tools, this server exceeds the 25-tool threshold that the rubric considers too many. While the domain is complex and the tools cover a broad range of operations (editing, playback, export, analysis), the large surface area may overwhelm agents and increase the chance of misselection. The count is not extreme (not 50+), but it is still high.

Completeness4/5

The tool set covers the core workflows: writing notes (add_notes, add_rest, write_score), editing (transpose), reading (read_selection, read_score, read_open_score), export/import (export_pdf, export_musicxml, import_musicxml), and analysis (analyze_harmony, check_voice_leading, etc.). Gaps exist, such as inability to set key/time signatures directly and no explicit undo/redo, but these are addressed through documented workarounds (e.g., using write_score with MusicXML, or run_command). The surface is largely complete for the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers