Dorico Maestro
The server lets an AI assistant remote-control Steinberg Dorico via MCP (note input, playback, transposition, mode switching) and run offline music-analysis tools.
Connect to Dorico and read its live status (
connect_to_dorico,get_status)Add notes, rests, and chords at the caret with durations, accidentals, and as-chord stacking (
add_notes,add_rest)Transpose the current selection up/down, chromatic or by octave (
transpose)Switch between Write/Engrave/Play/Print/Setup modes (
switch_mode)Control playback (play/stop, choose start location) and save the project (
playback,save)Move the viewport to start/end of score (
navigate; bar-jump is unsupported)Run any catalogued Dorico command via a generic escape hatch (
run_command), including destructive ones with confirmationDiscover the full command catalog, its parameters, and verification status via the
dorico://commandsresourceOffline theory tools are available (not in the schema but described in the README): analyze harmony, check voice leading, suggest next chord, instrument range, counterpoint checks, and full-score writing via a
ScoreSpec
Provides tools to control Steinberg Dorico through its Remote Control API, enabling note input, rests, transposition, mode switching, playback control, and score edits in an open Dorico project.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Dorico MaestroAdd a C major chord in the piano part"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.
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 |
๐ 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 withconfirm=True.Overwrite Mode Transparency: Because Dorico defaults to Overwrite mode and the Remote Control API cannot read bar contents back, Maestro monitors
noteInputModeand flagsdisplaces_existing: truein 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.git2. Connect to Dorico
Open Steinberg Dorico and open any project. Dorico automatically listens on local WebSocket port
4560.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.jsonon Windows,~/Library/Application Support/dorico-maestro/session_token.jsonon 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,
.doricoarchives, 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 |
Modal Dialog Confirmation | Dorico requires manual confirmation for file open and export dialogs | Press Enter on the export prompt once, and |
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:
NoteInput101 of 125: Pitches, durations, accidentals, articulations, chords, tuplets, and popovers.Window26 of 29: Window modes, layout views, panels, toolbar, and zoom controls.Play24 of 31: Transport commands, playhead placement, and mixer controls.View13 of 16: Viewport scrolling and zoom operations.NoteEdit8 of 8: Diatonic, chromatic, and octave transposition, plus enharmonic respelling.Edit6 of 16: Selection, copy, delete, and undo operations.EventEdit4 of 57: Selection navigation commands (Navigate*).File4 of 11: Project save and MusicXML import/export filters.UI3 of 7: Panel focusing commands.Print1 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 .venvActivate 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:
pytestPoint 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:
docs/architecture.md โ Internal architecture and multi-layer design
docs/protocol.md โ Dorico Remote Control WebSocket protocol specification
docs/dorico_command_catalog.md โ Complete base key-command catalog (340 commands)
CONTRIBUTING.md โ Guidelines for contributing and command verification
THIRD-PARTY.md โ Third-party notices, dependencies, and trademark attributions
LICENSE โ AGPL-3.0 License
Legal & Trademarks
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 toolsadd_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.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | Yes | Pitches in scientific notation, e.g. ['C4', 'E4', 'G4']: a letter, an optional # or b, then the octave number, where C4 is middle C. | |
| as_chord | No | True stacks the pitches into one chord on a single beat. False enters them one after another, each of the given duration. | |
| duration | No | Rhythmic duration, one of: whole, half, quarter, eighth, sixteenth, 32nd, 64th. Case-insensitive. | quarter |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| duration | No | Rhythmic duration, one of: whole, half, quarter, eighth, sixteenth, 32nd, 64th. Case-insensitive. | quarter |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_harmonyARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| score | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_counterpointARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| species | No | Which species to check. Only 1, note against note, is implemented. Any other value is refused rather than approximated. | |
| counterpoint | Yes | 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. | |
| cantus_firmus | Yes | The given line, as scientific pitch names in order, e.g. ['D4', 'F4', 'E4', 'D4']. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_leadingARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| score | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_doricoARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_musicxmlADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | 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. | |
| score | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| all_layouts | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_statusARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| bar | Yes | Bar number, counted from 1, so bar 1 is the first bar of the flow. Not an index. | |
| beat | No | Beat within the bar, counted from 1, so 1.0 is the downbeat and 2.5 is halfway through the second beat. | |
| staff | No | 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. | |
| pickup | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Filesystem path to the MusicXML file to open. Dorico reads it from disk, so it has to be a path Dorico can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_rangeARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| pitch | No | A pitch to test in scientific notation, e.g. 'C4' or 'A5'. Omit to get the full compass instead of a yes or no. | |
| instrument | Yes | Instrument to look up, e.g. 'violin', 'flute', 'cello' or 'trumpet'. Matched against the standard orchestral names. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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').
| Name | Required | Description | Default |
|---|---|---|---|
| bar | No | Bar to move the caret to first, counted from 1. Omit to open the popover wherever the caret already is. | |
| kind | Yes | Which popover to open: 'dynamic', 'tempo', 'key', 'time' or 'clef'. Each maps to its own NoteInput.Create* command. | |
| staff | No | 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. | |
| pickup | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
playbackAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | What the transport should do: 'play', 'stop' or 'rewind'. | play |
| location | No | 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. | kPlayhead |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| trigger | No | True 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_dir | Yes | Folder Dorico's export dialog is pointed at. The newest MusicXML file that appears there is the one read back. | |
| wait_seconds | No | How long to wait for the file while a person confirms the dialog. The call returns as soon as one appears. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_infoARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_scoreARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| bars | No | 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. | |
| path | Yes | Filesystem path to the MusicXML file to read. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_selectionARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| score | Yes | 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. | |
| dry_run | No | True 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | 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. | |
| command_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
saveADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_schemaARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and idempotent. The description adds 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.
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.
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.
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.
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.
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_commandsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Most entries to return. The answer still reports the total number of matches, so a truncated result says so. | |
| query | No | Substring matched case-insensitively against command IDs and their documentation. Empty matches everything, which with a limit is how to browse a category. | |
| status | No | 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. | |
| category | No | Command family to restrict to, e.g. 'NoteInput', 'Edit' or 'Play', matched case-insensitively. Omit for every family. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_signatureARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | 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. | C major |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_signatureARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| signature | No | 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. | 4/4 |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_chordARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The tonal centre the numerals are read against, e.g. 'C major', 'A minor' or 'F# major'. The numerals mean nothing without it. | |
| progression | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_modeAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| octave | No | True shifts by a full octave (12 semitones or 8 diatonic steps) and overrides chromatic, which is then ignored. | |
| chromatic | No | True steps by an exact chromatic semitone. False steps diatonically within the current key signature, so the interval varies by scale degree. | |
| direction | Yes | Which way to shift pitch: 'up' moves higher, 'down' moves lower. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| score | Yes | 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. | |
| method | No | 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. | caret |
| preflight | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 tool update
- Changed
transpose3 fields changed- changed
Input schema / properties / chromatic / descriptionPrevious 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." - changed
Input schema / properties / direction / descriptionPrevious value: -"Which way to move the pitch: up or down."New value: +"Which way to shift pitch: 'up' moves higher, 'down' moves lower." - changed
Input schema / properties / octave / descriptionPrevious 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."
9 tool updates
v0.1.5- Changed
analyze_harmony4 fields changed- changed
Input schema / $defs / EventIn / properties / kind / descriptionPrevious value: -"'note', 'chord' or 'rest'; inferred if absent."New value: +"'note', 'chord' or 'rest'. Inferred if absent." - changed
Input schema / $defs / EventIn / properties / staff / descriptionPrevious value: -"0-based; must match the nesting staff."New value: +"0-based. Must match the nesting staff." - changed
Input schema / $defs / EventIn / properties / voice / descriptionPrevious value: -"1-based; must match the nesting voice."New value: +"1-based. Must match the nesting voice." - changed
Input schema / $defs / VoiceIn / properties / index / descriptionPrevious value: -"1-based voice number; defaults to position."New value: +"1-based voice number, defaults to position."
- Changed
check_counterpoint1 field changed- changed
Input schema / properties / species / descriptionPrevious 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."
- Changed
check_voice_leading4 fields changed- changed
Input schema / $defs / EventIn / properties / kind / descriptionPrevious value: -"'note', 'chord' or 'rest'; inferred if absent."New value: +"'note', 'chord' or 'rest'. Inferred if absent." - changed
Input schema / $defs / EventIn / properties / staff / descriptionPrevious value: -"0-based; must match the nesting staff."New value: +"0-based. Must match the nesting staff." - changed
Input schema / $defs / EventIn / properties / voice / descriptionPrevious value: -"1-based; must match the nesting voice."New value: +"1-based. Must match the nesting voice." - changed
Input schema / $defs / VoiceIn / properties / index / descriptionPrevious value: -"1-based voice number; defaults to position."New value: +"1-based voice number, defaults to position."
- Changed
export_musicxml4 fields changed- changed
Input schema / $defs / EventIn / properties / kind / descriptionPrevious value: -"'note', 'chord' or 'rest'; inferred if absent."New value: +"'note', 'chord' or 'rest'. Inferred if absent." - changed
Input schema / $defs / EventIn / properties / staff / descriptionPrevious value: -"0-based; must match the nesting staff."New value: +"0-based. Must match the nesting staff." - changed
Input schema / $defs / EventIn / properties / voice / descriptionPrevious value: -"1-based; must match the nesting voice."New value: +"1-based. Must match the nesting voice." - changed
Input schema / $defs / VoiceIn / properties / index / descriptionPrevious value: -"1-based voice number; defaults to position."New value: +"1-based voice number, defaults to position."
- Changed
render_to_dorico4 fields changed- changed
Input schema / $defs / EventIn / properties / kind / descriptionPrevious value: -"'note', 'chord' or 'rest'; inferred if absent."New value: +"'note', 'chord' or 'rest'. Inferred if absent." - changed
Input schema / $defs / EventIn / properties / staff / descriptionPrevious value: -"0-based; must match the nesting staff."New value: +"0-based. Must match the nesting staff." - changed
Input schema / $defs / EventIn / properties / voice / descriptionPrevious value: -"1-based; must match the nesting voice."New value: +"1-based. Must match the nesting voice." - changed
Input schema / $defs / VoiceIn / properties / index / descriptionPrevious value: -"1-based voice number; defaults to position."New value: +"1-based voice number, defaults to position."
- Changed
run_command1 field changed- changed
Input schema / properties / params / descriptionPrevious 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."
- Changed
set_key_signature1 field changed- changed
Input schema / properties / key / descriptionPrevious 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."
- Changed
set_time_signature1 field changed- changed
Input schema / properties / signature / descriptionPrevious 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."
- Changed
write_score4 fields changed- changed
Input schema / $defs / EventIn / properties / kind / descriptionPrevious value: -"'note', 'chord' or 'rest'; inferred if absent."New value: +"'note', 'chord' or 'rest'. Inferred if absent." - changed
Input schema / $defs / EventIn / properties / staff / descriptionPrevious value: -"0-based; must match the nesting staff."New value: +"0-based. Must match the nesting staff." - changed
Input schema / $defs / EventIn / properties / voice / descriptionPrevious value: -"1-based; must match the nesting voice."New value: +"1-based. Must match the nesting voice." - changed
Input schema / $defs / VoiceIn / properties / index / descriptionPrevious value: -"1-based voice number; defaults to position."New value: +"1-based voice number, defaults to position."
25 tool updates
v0.1.2- Changed
add_notes3 fields changed- added
Input schema / properties / as_chord / descriptionAdded value: +"True stacks the pitches into one chord on a single beat. False enters them one after another, each of the given duration." - added
Input schema / properties / duration / descriptionAdded value: +"Rhythmic duration, one of: whole, half, quarter, eighth, sixteenth, 32nd, 64th. Case-insensitive." - added
Input schema / properties / notes / descriptionAdded 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."
- Changed
add_rest1 field changed- added
Input schema / properties / duration / descriptionAdded value: +"Rhythmic duration, one of: whole, half, quarter, eighth, sixteenth, 32nd, 64th. Case-insensitive."
- Changed
analyze_harmony1 field changed- added
Input schema / properties / score / descriptionAdded 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."
- Changed
check_counterpoint3 fields changed- added
Input schema / properties / cantus_firmus / descriptionAdded value: +"The given line, as scientific pitch names in order, e.g. ['D4', 'F4', 'E4', 'D4']." - added
Input schema / properties / counterpoint / descriptionAdded 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." - added
Input schema / properties / species / descriptionAdded value: +"Which species to check. Only 1, note against note, is implemented; any other value is refused rather than approximated."
- Changed
check_voice_leading1 field changed- added
Input schema / properties / score / descriptionAdded 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."
- Changed
export_musicxml2 fields changed- added
Input schema / properties / path / descriptionAdded 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." - added
Input schema / properties / score / descriptionAdded 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."
- Changed
export_pdf1 field changed- added
Input schema / properties / all_layouts / descriptionAdded 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."
- Changed
goto_bar4 fields changed- added
Input schema / properties / bar / descriptionAdded value: +"Bar number, counted from 1, so bar 1 is the first bar of the flow. Not an index." - added
Input schema / properties / beat / descriptionAdded value: +"Beat within the bar, counted from 1, so 1.0 is the downbeat and 2.5 is halfway through the second beat." - added
Input schema / properties / pickupAdded 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" +} - added
Input schema / properties / staff / descriptionAdded 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."
- Changed
import_musicxml1 field changed- added
Input schema / properties / path / descriptionAdded value: +"Filesystem path to the MusicXML file to open. Dorico reads it from disk, so it has to be a path Dorico can reach."
- Changed
instrument_range2 fields changed- added
Input schema / properties / instrument / descriptionAdded value: +"Instrument to look up, e.g. 'violin', 'flute', 'cello' or 'trumpet'. Matched against the standard orchestral names." - added
Input schema / properties / pitch / descriptionAdded 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."
- Changed
navigate2 fields changed- added
Input schema / properties / bar / descriptionAdded value: +"Bar number counted from 1, read only when target is 'bar'. Ignored for 'start' and 'end'." - added
Input schema / properties / target / descriptionAdded 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."
- Changed
open_popover4 fields changed- added
Input schema / properties / bar / descriptionAdded value: +"Bar to move the caret to first, counted from 1. Omit to open the popover wherever the caret already is." - added
Input schema / properties / kind / descriptionAdded value: +"Which popover to open: 'dynamic', 'tempo', 'key', 'time' or 'clef'. Each maps to its own NoteInput.Create* command." - added
Input schema / properties / pickupAdded 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" +} - added
Input schema / properties / staff / descriptionAdded 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."
- Changed
playback2 fields changed- added
Input schema / properties / action / descriptionAdded value: +"What the transport should do: 'play', 'stop' or 'rewind'." - added
Input schema / properties / location / descriptionAdded 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."
- Added
read_open_score - Changed
read_project_info1 field changed- added
Input schema / properties / path / descriptionAdded 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."
- Changed
read_score2 fields changed- added
Input schema / properties / bars / descriptionAdded 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." - added
Input schema / properties / path / descriptionAdded value: +"Filesystem path to the MusicXML file to read."
- Changed
render_to_dorico2 fields changed- added
Input schema / properties / dry_run / descriptionAdded 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." - added
Input schema / properties / score / descriptionAdded 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."
- Changed
run_command2 fields changed- added
Input schema / properties / command_id / descriptionAdded 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." - added
Input schema / properties / params / descriptionAdded 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."
- Changed
search_commands4 fields changed- added
Input schema / properties / category / descriptionAdded value: +"Command family to restrict to, e.g. 'NoteInput', 'Edit' or 'Play', matched case-insensitively. Omit for every family." - added
Input schema / properties / limit / descriptionAdded value: +"Most entries to return. The answer still reports the total number of matches, so a truncated result says so." - added
Input schema / properties / query / descriptionAdded value: +"Substring matched case-insensitively against command IDs and their documentation. Empty matches everything, which with a limit is how to browse a category." - added
Input schema / properties / status / descriptionAdded 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."
- Changed
set_key_signature1 field changed- added
Input schema / properties / key / descriptionAdded 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."
- Changed
set_time_signature1 field changed- added
Input schema / properties / signature / descriptionAdded 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."
- Changed
suggest_next_chord2 fields changed- added
Input schema / properties / key / descriptionAdded value: +"The tonal centre the numerals are read against, e.g. 'C major', 'A minor' or 'F# major'. The numerals mean nothing without it." - added
Input schema / properties / progression / descriptionAdded 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."
- Changed
switch_mode1 field changed- added
Input schema / properties / mode / descriptionAdded 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."
- Changed
transpose3 fields changed- added
Input schema / properties / chromatic / descriptionAdded value: +"True steps by a chromatic semitone. False steps diatonically, staying inside the key, so the interval depends on the note." - added
Input schema / properties / direction / descriptionAdded value: +"Which way to move the pitch: up or down." - added
Input schema / properties / octave / descriptionAdded value: +"True moves by a whole octave and overrides chromatic, which is then not read at all."
- Changed
write_score3 fields changed- added
Input schema / properties / method / descriptionAdded 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." - added
Input schema / properties / preflight / descriptionAdded 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." - added
Input schema / properties / score / descriptionAdded 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."
17 tool updates
v0.1.1- Added
analyze_harmony - Added
check_counterpoint - Added
check_voice_leading - Added
export_musicxml - Added
export_pdf - Added
goto_bar - Added
import_musicxml - Added
instrument_range - Added
open_popover - Added
read_project_info - Added
read_score - Added
read_selection - Added
render_to_dorico - Added
score_schema - Added
search_commands - Added
suggest_next_chord - Added
write_score
12 tool updates
v0.1.0- First observed
add_notes - First observed
add_rest - First observed
connect_to_dorico - First observed
get_status - First observed
navigate - First observed
playback - First observed
run_command - First observed
save - First observed
set_key_signature - First observed
set_time_signature - First observed
switch_mode - First observed
transpose
TDQS
Scored across 30 tools
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.
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.
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.
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
Related MCP Connectors
AI image, video, voice and music generation over MCP, routed to Veo 3.1, Seedance 2.5 and more.
- choriloOAuthcom.chorilo
Choir management for AI assistants: events, RSVP, announcements and sheet music of your choir.
Generate AI music via the Lacuna Music API from MCP clients like Claude Desktop & Code.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yoโฆ
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceConnects Ableton Live to AI assistants through Model Context Protocol (MCP), enabling natural language control of music production tasks like track creation, MIDI editing, instrument loading, and playback control.15MIT
- AlicenseNot gradedqualityBmaintenanceA Model Context Protocol server that provides programmatic control over MuseScore through a WebSocket-based plugin system, allowing AI assistants to compose music, add lyrics, navigate scores, and control MuseScore directly.91MIT
- AlicenseAqualityCmaintenanceAI-powered music notation server that lets you create and edit scores using natural language, integrating with MuseScore for live manipulation.1824MIT
- AlicenseBqualityDmaintenanceAn MCP server that enables natural language control of Steinberg Dorico music notation software through Claude Desktop or ChatGPT, offering tools for score creation, note input, notation, harmony analysis, and orchestration.5413MIT