Skip to main content
Glama

capture-one-mcp

gate

An MCP server that drives Capture One Pro on macOS through its AppleScript/JXA scripting interface — sessions and catalogs, collections, variants, adjustments, layers, recipes and output.

Status: complete through Phase 5 — 42 tools. Reading and navigation, ratings and metadata, the full adjustment surface, layers and masks including AI people masking, and output: recipes, processing with queue polling, import and batch rename, plus a non-destructive candidate/preview/compare workflow. Tethered capture is deliberately out of scope — see docs/TOOL-SURFACE.md.

Findings from verifying against the live app: adjustments · layers and masks · output, import and rename

Target

Built against the dictionary of the installed app:

App

Capture One 16.8.5.30

Bundle id

com.captureone.captureone16

Dictionary

reference/CaptureOne-16.8.5.sdef

Digest

docs/DICTIONARY.md

Regenerate the digest against whatever build is installed:

python3 scripts/gen-dictionary.py > docs/DICTIONARY.md

Related MCP server: photoshop-mcp-pro

Install

npm install && npm run build

Register it with an MCP client, e.g. Claude Code:

claude mcp add capture-one -- node /absolute/path/to/capture-one-mcp/dist/index.js

Verify it end to end against whatever Capture One has open:

npm test             # build + mocked regression tests; never controls Capture One
npm run verify       # typecheck + validate every embedded JXA block parses
npm run verify:live  # resolve every generated property name against the running app
npm run smoke        # drive the built server over stdio as a real MCP client

verify:live needs Capture One running with a document open. It exists because a wrong JXA property name fails as "Can't convert types.", which this codebase's defensive wrappers turn into a silent null — see docs/OUTPUT.md.

Tools

These tools are always available; none of them modifies image data.

Tool

What it does

co_status

Running state, whether Apple Events are actually getting through, version/tier, open document. Call this first if anything times out.

co_list_documents

Open sessions and catalogs, and which is frontmost

co_get_document

Paths, session folders, naming tokens, counters, queue depth

co_list_collections

Albums, projects, groups, smart albums, folders, favorites

co_set_current_collection

Focus a collection in the browser

co_list_variants

Find images — filter by rating, color tag, pick, filename, extension; paginated

co_get_variant

Full detail for one variant: EXIF, adjustments, crop, metadata, keywords, layers, outputs

co_list_recipes / co_get_recipe

Output recipes and their full settings

co_list_styles

Available style and preset names

co_list_keywords

Keywords in the current document

co_list_adjustments

The 83 adjustment properties with types and measured ranges

co_list_layers

Layers on variants, with luma-range settings and all registered scalar adjustments

co_list_recipe_properties

The 40 writable recipe properties

co_process_queue_status

Depth of the processing queue

co_variant_output_files

Files previously written, and whether they still exist

co_compare_variants

Readable differences between a source variant and a candidate clone

co_select_variants

Change the Capture One selection (view state only)

co_open_document is in the write tier rather than the read tier: opening an older document can trigger an irreversible format migration, and it changes which document later variant ids resolve against.

co_get_variant reads all registered scalar adjustments on the variant and its layers; co_list_layers reads those same settings on each layer. Adjustment keys remain camelCase (for example, levelMidtoneRgb); map these through co_list_adjustments to the snake_case parameters accepted by the write tools. Unavailable values are null, with details in the adjacent adjustmentReadErrors object. Check these errors before treating a snapshot as complete, and never restore null values. These reads cover the scalar registry, not masks or structured adjustments such as curves/color-editor settings; they cannot establish full style or image equivalence. Reads are sequential, so avoid editing during a snapshot.

Editing tools, hidden unless CAPTURE_ONE_MCP_ALLOW_WRITE=1:

Tool

What it does

co_set_flags

Rating (0–5), color tag, pick flag

co_set_metadata

IPTC fields — headline, description, creator, copyright, rights, title, instructions, city/state/country

co_apply_keyword

Apply an existing keyword (see limitation below)

co_remove_keyword

Remove a keyword from variants (unverified — see below)

co_adjust_variants

Any of the 83 adjustment properties, range-validated and read back

co_adjust_layer

The same, applied to a single layer

co_create_layer

Create adjustment layers

co_set_layer

Name, enabled, opacity

co_mask_edit

Invert, fill, feather, refine — not verifiable, see below

co_copy_mask

Copy a mask between layers

co_set_luma_range / co_clear_luma_range

Layer mask luma range

co_apply_style_to_layer

Apply a named style to a layer

co_create_people_mask

AI people masking

co_configure_recipe

Recipe settings, validated and read back

co_process_variants

Render to disk, polling the queue and reporting the files written

co_export_originals

Copy originals out

co_import_images

Import image files (paths validated)

co_create_candidates

Clone variants into editable candidates, preserving existing edits

co_render_preview

Render one variant to a bounded sRGB JPEG returned as an MCP image

co_open_document

Open a session or catalog by path

co_process_variants checks the effective recipe before submitting work. Recipes with existing_files: overwrite require CAPTURE_ONE_MCP_ALLOW_DESTRUCTIVE=1 as well, regardless of destination: custom paths and folder aliases can also reach originals. add suffix and skip recipes need ordinary write access only. Unreadable or unknown existing-files behavior is refused. When the recipe is omitted, the current recipe is resolved and explicitly submitted so another enabled recipe cannot bypass the check.

Requiring CAPTURE_ONE_MCP_ALLOW_DESTRUCTIVE=1 as well:

Tool

What it does

co_mask_replace

Clear, fill or rasterize a mask — not undoable

co_delete_layer

Delete a layer (never the background layer)

co_batch_rename

Rename original files on disk — not undoable

Editing tools never apply to the whole document implicitly: each requires either explicit variant_ids or use_current_selection: true, reports every id it could not resolve rather than silently doing less, and returns exactly what it changed.

Keywords cannot be created via AppleScript

Capture One 16.8.5 exposes no way to create a keyword. The keyword class declares no make responder, all three of its properties are read-only, and apply keyword documents its parameter as "an existing keyword object". Every construction form was tried against the live app — make at the document, at a variant, at a keywords element, with properties and with data — and all fail with "You cannot set or change this property of this object" or "AppleEvent handler failed". Keywords must be added in the Capture One UI, or imported into a keyword library from a file.

Consequently co_remove_keyword is implemented but has not been verified against a real keyword — the standing test session has none and none can be created, so its blast radius (whether deleting a variant's keyword also removes it from the document) is unconfirmed. The tool reports documentKeywordSurvives so a caller can check.

Candidate editing workflow

Non-destructive trial edits: clone a variant, edit the clone, look at it, and keep whichever one you prefer. Nothing is overwritten and nothing is deleted.

Step

Tool

Clone the originals

co_create_candidates — native Capture One clones, so existing edits carry over

Edit the candidates

co_adjust_variants / co_adjust_layer, targeting candidate ids

Look at the result

co_render_preview — bounded sRGB JPEG, returned as an MCP image

See what changed

co_compare_variants — readable differences, with its own coverage limits

Choose

Keep the candidate id, or go back to the source id. Both variants remain.

All three require the expected document_id and re-check it, so they stay safe even with document binding off. co_create_candidates is additive and not idempotent: an incomplete result must be inspected before any retry, or you get duplicate copies. co_render_preview needs write access — it creates a private temporary recipe and submits processing — though it never changes image adjustments.

Comparison is deliberately conservative. It covers the scalar adjustment registry, crop, lens correction, flags, metadata, engine, processing mode, style names and keywords; it cannot see masks, curves, luma ranges or colour-editor structures, and layers are paired by position because they have no id. No differences does not mean identical edits or identical appearance, and the tool says so in its own result.

See the workflow guide, candidate details and preview limits. The workflow passed automated and live tests on Capture One Pro 16.8.5 using five copied RAWs — validation evidence and limits.

Testing

All live testing runs against one disposable session that you nominate, and client sessions and catalogs are never touched. The harnesses will not choose a document on their own: set CAPTURE_ONE_MCP_TESTBED_DOCUMENT to the document id of a session you are willing to have modified, and both scripts/testbed.mjs and scripts/verify-adjustments.mjs refuse to run against anything else — including refusing outright when the variable is unset.

export CAPTURE_ONE_MCP_TESTBED_DOCUMENT="/path/to/a scratch session"

The reference figures below come from a 138-variant session (69 RAW + 69 JPEG).

Because Phase 2 writes to real variant state, scripts/testbed.mjs records and restores it. It talks to Capture One directly rather than through the MCP server, so it keeps working when the server is read-only and cannot be broken by the code under test, and it is hard-locked to that one session path — it refuses to run against any other document rather than trusting the caller.

node scripts/testbed.mjs snapshot   # ratings, tags, picks, IPTC, keywords, selection,
                                    # all 83 adjustments, layers, and all 9 recipes
node scripts/testbed.mjs diff       # what has changed since
node scripts/testbed.mjs restore    # put it all back, then re-verify

Snapshots land in .testbed/ (gitignored — it contains real image metadata).

Configuration

Variable

Default

Effect

CAPTURE_ONE_MCP_ALLOW_WRITE

unset

Enables the editing tools. Read-only until set.

CAPTURE_ONE_MCP_ALLOW_DESTRUCTIVE

unset

Additionally enables irreversible verbs. Requires the above.

CAPTURE_ONE_MCP_MAX_VARIANTS

500

Cap on variants returned in one call

CAPTURE_ONE_MCP_TIMEOUT_MS

20000

Fallback Apple Event budget for calls that set none

CAPTURE_ONE_MCP_DOCUMENT

unset

auto binds through a shared read-only probe before operations run; a document id binds to that one; unset disables the check

Binding to a document

Variant ids are small per-document integers (641, 3480), and nothing in the scripting interface ties an id to the document it came from. If the frontmost document changes between two calls — clicking another Capture One window is enough — an id read from one document can resolve to a completely different variant in another, and a write lands there silently.

Three modes:

CAPTURE_ONE_MCP_DOCUMENT

Behaviour

unset

No check. Only safe when exactly one document is ever open.

auto

Recommended. Binds to the first document the server actually touches, then refuses any other for the life of the process.

a document id

Binds to that specific document, whatever is open.

auto needs no path up front and follows whatever you are working on, while still converting "silently edited the wrong catalog" into a refusal. The binding lasts for the life of the process, so reconnect the server when you switch to a different session or catalog — in Claude Code, /mcp → reconnect.

A document id is the document's own folder path, e.g. /Volumes/Photos/a session folder. co_status reports the current binding and warns when it does not match the front document. Note that co_status itself does not bind — a health check should not claim the server.

Tools above their permitted risk level are not registered at all, so a blocked tool is invisible to the model rather than present-and-failing.

Requirements

  • macOS with Capture One installed and running

  • Node 20+

  • Automation permission: the process hosting this server must be allowed to control Capture One (System Settings → Privacy & Security → Automation)

Some verbs are gated by Capture One's licence tier — the dictionary marks process as PRO only and autocrop as Cultural Heritage only.

Notes on the Apple Event layer

Two behaviours worth knowing, both verified against the installed app rather than assumed:

  • Application("Capture One").version() and .running() are answered by JXA from the app bundle without sending an Apple Event. They stay responsive even when the event pipe is completely blocked, so they are useless as a liveness check. app version is served by Capture One's own handler and is the honest probe — that is what co_status uses.

  • A pending macOS automation-consent dialog blocks every Apple Event on the machine until someone clicks it. Nothing fails fast; calls just sit until the Apple Event timeout (-1712). src/jxa/bridge.ts imposes its own wall-clock budget and translates this into an actionable message.

Notes on the variant model

Verified against a real 138-variant session (69 NEF + 69 JPG), not assumed:

  • variant.name has no file extension and is not unique. A RAW+JPEG pair produces two variants both named DSC_1950. Extension is what makes a row identifiable, so co_list_variants always returns it. An early version filtered on a suffix of name and matched nothing at all.

  • variant.position is the position within a clone stack, not an index in the collection -- it is 1 for every unstacked variant. Exposed as positionInStack so it cannot be mistaken for a browser index.

  • document.path is the folder containing the document, not the document itself. co_get_document also returns documentPath and folder.

  • image.dimensions is a point record {x, y}, not a string; it stringifies to [object Object] if treated as one. Returned as {width, height}.

Why bulk reads

Each property access is one Apple Event, so the access pattern dominates everything. Measured on the 138-variant session:

Access pattern

Cost

variants.parentImage.extension() — chained, one event

24ms for all 138

fetch images then .map(i => i.extension())

2313ms for the same data

per-variant hydration

~215ms each

So the filter pass reads whole-specifier properties, chaining through relationships where needed, and stays flat regardless of collection size. Page hydration uses the same trick while the scope is modest and falls back to per-variant reads past BULK_HYDRATE_MAX (2000) or when the scope is a plain array (scope: "selection").

End-to-end result on that session:

Call

Time

all 138 rows, no extra fields

280ms

20 rows + EXIF

585ms (was 4295ms)

all 138 rows + EXIF, crop, adjustments, metadata

3968ms

Layout

src/index.ts        stdio entry point
src/server.ts       tool registration + risk gating
src/config.ts       risk levels and the env-var gate
src/jxa/bridge.ts   osascript transport, timeouts, error translation
src/jxa/health.ts   liveness probe that separates "not running" from "blocked"
src/co/             domain layer:
                      documents, collections, variants  — reading and navigation
                      edit, adjust, layers, process      — writing
                      candidates, preview, comparison    — candidate workflow
                      *-properties.ts, *-ranges.ts       — GENERATED registries
scripts/            gen-dictionary.py, gen-adjustments.py, gen-recipes.py,
                      gen-adjustment-ranges.mjs         — generators
                    check-jxa.mjs, verify-property-names.mjs, smoke.mjs
                                                       — guards and smoke test
                    testbed.mjs, verify-adjustments.mjs — live test harnesses
docs/               DICTIONARY.md (generated digest), ADJUSTMENTS.md, LAYERS.md,
                    OUTPUT.md, CANDIDATES.md, PREVIEWS.md,
                    EDIT-PREVIEW-WORKFLOW.md, WORKFLOW-VALIDATION.md,
                    TOOL-SURFACE.md (historical design doc)
reference/          vendored .sdef from the installed app
CLAUDE.md           guidance for agents working on this repo (AGENTS.md points to it)

Licence

MIT

Available Tools

18 tools
co_compare_variantsA
Read-onlyIdempotent

Compare readable settings of source and candidate variants from the same image in the expected document. Reports differences and unavailable fields, plus IDs for keeping the candidate or returning to the source. Mask contents, curves and luma ranges are outside comparison coverage.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_idYes
source_variant_idYes
candidate_variant_idYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds value by disclosing the comparison scope, the nature of the report (differences and unavailable fields), and the inclusion of decision IDs. It also explicitly lists limitations, which is useful context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

Two sentences with no redundancy. The action is front-loaded, and the coverage limitation is stated concisely. Every sentence contributes to understanding what the tool does and what it does not do.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only comparison tool with no output schema, the description covers the key elements: what is compared, what is reported, and what is excluded. The phrase 'expected document' is slightly ambiguous but understandable in context. It does not mention prerequisites or error conditions, but for a read-only operation with clear annotations, this is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It mentions 'source and candidate variants' and 'same image in the expected document,' giving some context about the relationship between the variant IDs, but it does not explicitly map each parameter (document_id, source_variant_id, candidate_variant_id) to its meaning. The parameter names are self-explanatory, but the description adds no direct semantics for them, leaving a gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Compare readable settings of source and candidate variants from the same image in the expected document.' It also specifies the output: differences, unavailable fields, and IDs for keeping or reverting. This distinguishes it from sibling tools like co_get_variant or co_list_variants, which retrieve or list but do not compare.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context on what the tool does and explicitly states what is out of scope ('Mask contents, curves and luma ranges are outside comparison coverage'). However, it does not name any sibling tools or provide explicit when-to-use vs. when-not-to-use guidance beyond its inherent purpose.

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

co_get_documentA
Read-onlyIdempotent

Detailed settings for the current document: kind (session or catalog), paths, session folders, naming/token formats, counters, current collection and recipe, and processing queue depth.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds a scoping qualifier ('current document') and lists the returned settings, but it does not disclose additional behavioral traits such as error behavior, freshness guarantees, or potential side effects. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

One concise sentence with a clear lead phrase and a colon-delimited list of contents. Every phrase contributes meaning, and there is no redundant or filler text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of describing the return payload. It enumerates the major setting groups, which is adequate for a zero-parameter read-only tool. Some details, such as the exact types or formats of paths and counters, remain implicit, but nothing essential for invoking the tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so parameter semantics are trivially covered; the description needs no additional parameter explanation. The listed settings describe the return payload, which is appropriate given the absence of an output schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as returning detailed settings for the current document and enumerates what those settings include, such as kind, paths, folders, formats, counters, and queue depth. This distinguishes it from list-oriented siblings like co_list_documents, though it does not explicitly contrast itself with any sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives such as co_status or co_list_documents. The description states what the tool returns but not when it should be preferred, nor does it mention exclusions or prerequisites. The only implicit signal is the phrase 'current document'.

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

co_get_recipeA
Read-onlyIdempotent

Full settings for one output recipe: file format and quality, scaling, output sharpening, destination and naming, metadata inclusion, crop handling and watermark.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesRecipe name (case-insensitive)

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the scope of the returned data but does not disclose additional behaviors such as failure modes, persistence effects, or access requirements, which is acceptable given the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

The entire description is one compact, front-loaded sentence that immediately identifies the resource and spells out the contained settings. There is no filler, repetition, or unnecessary qualification.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only, idempotent single-parameter lookup, the description provides enough detail to set agent expectations about the rich response. A slightly more explicit mention of the return nature could push it to 5, but the field list already forms a useful mental model.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents the only parameter, 'name', with a description and 100% coverage. The tool description confirms the object is 'one output recipe' but does not add new detail about the parameter. The baseline of 3 applies because schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource ('one output recipe') and enumerates the content of the returned settings (file format, quality, scaling, sharpening, destination, metadata, crop, watermark). This clearly distinguishes it from siblings such as co_list_recipes and co_get_variant, which operate on different data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The use case is implied: call this when you need the full configuration of a specific recipe, not when you need the list of recipes. However, it does not explicitly say when not to use it or name an alternative such as co_list_recipes, leaving some inference to the agent.

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

co_get_variantA
Read-onlyIdempotent

Everything scriptable about one variant: source image and EXIF, all adjustment values, crop, lens correction, IPTC metadata, keywords, layers, and previously written output files.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVariant id, as returned by co_list_variants

TDQS

A4/5.0
Behavior4/5

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

Description consistently implies a read-only getter, matching readOnlyHint and idempotentHint. It adds substantial specificity about return contents (EXIF, IPTC metadata, layers, output files) which is useful beyond the generic annotations. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

A single sentence beginning with 'Everything scriptable' conveys the full scope in eleven words. No wasted words; the enumerations are informative without bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a getter with one well-specified parameter and no output schema, this supplies the full return scope. It is slightly incomplete in not mentioning error behavior or that some listed fields could be empty, but those are minor given annotations cover safety.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter id is already described in the schema as 'Variant id, as returned by co_list_variants' – clear provenance and type. The description doesn't add parameter detail, but with 100% schema coverage, credit is not required beyond the existing description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (one variant) and the action (retrieve everything scriptable), followed by an explicit list of contents such as source image, EXIF, adjustments, layers, and output files. This separates it unambiguously from siblings like co_list_variants and co_get_document. Though it does not name a sibling, the scope of 'everything scriptable about one variant' is precise and self-differentiating.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use when you need comprehensive details of a single variant, but it does not explicitly state when to prefer this over alternatives like co_list_variants or co_get_document, nor does it mention preconditions. It lacks routing guidance like 'use co_list_variants first to obtain IDs.' It is adequate but not explicit.

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

co_list_adjustmentsA
Read-onlyIdempotent

List every writable adjustment property with its type, valid range and any quirks. Ranges were recovered by probing the live app — the scripting dictionary declares none. Call this before co_adjust_variants to get exact parameter names and limits.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNoSubstring match on the property name

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare this as read-only, idempotent, and non-destructive. The description adds important behavioral context beyond that: the ranges were recovered by probing the live app rather than from the scripting dictionary, and the tool discloses any 'quirks'. This explains the nature of the data and sets expectations about reliability.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

The description is two sentences of dense but efficient information: what the tool returns, the exact provenance of some data, and a directive for when to use it. It is front-loaded with the purpose and then adds the contextual hint about co_adjust_variants. Every clause contributes value, and there is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a lightweight discovery tool with a single optional parameter and no output schema. The description still fully answers what is enumerated, that the data is source-proxied from live probing, and how the results should be used (to feed co_adjust_variants). It is complete for a tool of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, 'filter', is already fully described in the input schema ('Substring match on the property name'). With 100% schema description coverage and no enums or nested objects, the schema itself does the work, so the description does not need to add parameter-level semantics. This meets the baseline for a well-documented schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and resource ('every writable adjustment property') and names the exact content it returns ('with its type, description-type, valid range and any quirks'). It clearly differentiates this from other list tools, which operate on documents, variants, recipes, etc., by focusing specifically on *adjustment* properties and framing them as 'writable'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when to invoke this tool: 'Call this before co_adjust_variants to get exact parameter names and limits.' This is a direct usage instruction with a concrete alternative tool and the reasoning for calling it first. It also implies when not to use it (i.e., not when you want to actually adjust something), which is all an agent needs.

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

co_list_collectionsA
Read-onlyIdempotent

List the collections in the current document: albums, projects, groups, smart albums, catalog folders and session favorites.

ParametersJSON Schema
NameRequiredDescriptionDefault
include_countsNoAlso count variants per collection. Off by default because it forces every collection (including smart albums) to resolve its contents, which is slow.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the useful scoping detail 'in the current document' and enumerates collection types, but it does not disclose behavior like ordering, return shape, or whether hidden/empty collections are included.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

A single sentence that front-loads the core action and scoping, followed by a useful list of collection types. There is no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple, safe read-only listing operation with fully documented parameters, the description covers the essential scope. There is no output schema, so a brief mention of what each returned collection entry contains could improve it, but the verb 'List' sufficiently implies a collection list.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the sole parameter include_counts has a thorough schema description including its performance tradeoff. The tool description itself does not need to repeat parameter details, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and a clear resource ('collections in the current document'), and enumerates the collection types (albums, projects, groups, smart albums, catalog folders, session favorites). It is immediately distinguishable from sibling tools like co_list_variants or co_list_documents.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives such as co_list_documents, co_set_current_collection, or co_list_variants. It only states what it does, leaving the agent to infer the appropriate context from sibling names.

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

co_list_documentsA
Read-onlyIdempotent

List the Capture One sessions and catalogs that are currently open, and which one is frontmost.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds useful context about scope (only open documents) and frontmost state, but does not explain return shape or how 'frontmost' is represented.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

A single concise sentence that front-loads the main verb 'List' and includes only necessary scope information. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only list tool with safety annotations, the description is sufficient for correct invocation. It tells the agent exactly what the tool returns—open sessions and catalogs plus the frontmost one—and no arguments are needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is complete at 100% coverage, so the description carries no parameter burden. Baseline 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: lists currently open Capture One sessions/catalogs and identifies which is frontmost. This clearly differentiates it from sibling list tools like co_list_collections and co_list_variants, which enumerate different object types.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrasing 'currently open' and 'frontmost' gives clear context for when to call this tool, such as discovering available documents or determining the active one. It does not explicitly name alternatives or exclusion conditions, but the use case is self-evident for a zero-parameter list tool.

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

co_list_keywordsB
Read-onlyIdempotent

Keywords defined in the current document.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

B3.4/5.0
Behavior3/5

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

The annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds the 'current document' scoping context but does not explain how that document is selected or what the response shape is, so it provides only modest value beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

One short sentence with no filler; the resource and scope are front-loaded and every word carries meaning. This is appropriately sized for a simple read-only list tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, read-only, idempotent list operation, the description covers the essential operation and scope. It is slightly incomplete because it does not describe output shape or how 'current document' is established, but these are minor for such a simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description makes no mention of the limit parameter, so it adds no meaning beyond the input schema. The schema itself is clear (optional integer with default 500, min 1, max 5000) and the parameter name is intuitive, but the description fails to compensate for the missing parameter context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource (keywords) and the scope (current document), so an agent can tell it apart from sibling list tools. It is phrased as a noun phrase rather than an explicit action like 'Lists all keywords...', which keeps it from being a perfect 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It offers only implied usage: for reading keywords in the current document. There is no explicit statement of when to use this versus co_list_variants, co_list_documents, or other list siblings, and no exclusions or prerequisites are mentioned.

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

co_list_layersA
Read-onlyIdempotent

List the layers on variants, with kind, enabled state, opacity and luma-range settings. Layers have no id and are addressed by index; index 0 is always the background layer.

ParametersJSON Schema
NameRequiredDescriptionDefault
variant_idsNo
use_current_selectionNo

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already reveal readOnlyHint/idempotentHint/destructiveHint, so the description only needs to add behavioral detail beyond safety. It adds valuable context: layers lack ids and are accessed by index, with the background layer fixed at index 0. This goes beyond what annotations provide and helps agents reason about addressing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

Two sentences deliver the core purpose, layer atypical identity, and addressing scheme without filler. The most important information is front-loaded, and no words are wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although the description thoroughly explains what a layer looks like and its index-based identity, it omits parameter semantics. Since there is no output schema and no explanation of the two parameters, the agent is left without crucial invocation information. The description is adequate for a simple idealized read but not complete enough for a real tool call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%: neither `variant_ids` nor `use_current_selection` are described in the schema or the tool description. The description refers to 'variants' but does not explain the parameters, their roles, defaults, or interplay such as when one vs. the other is used. With two parameters and no property descriptions, an agent has to guess how to fill out the request.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific action, 'List the layers on variants', and names the output fields (kind, enabled state, opacity, luma-range settings). It clearly distinguishes this from sibling tools like co_list_variants by focusing on layers, and adds useful identity details (no id, index addressing, background at index 0).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage on variant layers and indicates that layers are addressed by index, but it does not explain when to prefer this over alternatives like co_get_variant, nor does it mention exclusions. There is no explicit 'when to use this vs. that' guidance, only the implied context of variants having layers.

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

co_list_recipe_propertiesA
Read-onlyIdempotent

List every writable recipe property with its type and allowed values, for use with co_configure_recipe.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds value by clarifying the tool returns 'type and allowed values' for writable properties, which tells the agent what kind of output to expect despite there being no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

The entire description is one focused sentence that leads with the action and resource, then adds the key qualifier ('writable') and the output content ('type and allowed values'). Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless, read-only listing tool, this description is complete: it identifies what is listed, the depth of the information returned, and why an agent would call it. No additional context is necessary to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and an empty input schema, so there are no parameter semantics to document. The baseline for zero parameters is 4, and the description sensibly focuses on output rather than inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List') and resource ('every writable recipe property'), including the useful detail that it reports type and allowed values. It also connects to a specific downstream tool (co_configure_recipe), making its purpose unambiguous and distinct from siblings like co_list_recipes or co_get_recipe.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for use with co_configure_recipe' gives an explicit usage context and tells the agent why it would invoke this tool. It does not explicitly name alternatives to avoid or conditions for not using it, but the intended use case is clear enough.

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

co_list_recipesA
Read-onlyIdempotent

List the output recipes in the current document, with format and enabled state.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already cover the read-only, idempotent, non-destructive nature, so the description does not need to repeat those. The description adds useful behavioral context by naming what the returned list contains (format and enabled state), which is material since the schema is not provided. It doesn't reveal hidden behaviors like pagination or ordering, but none are clearly warranted for a zero-argument list tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

The description is one compact sentence that front-loads the verb and resource, then supplies the two key fields and the document scope. It is immediately scannable and contains no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only list tool with annotations covering safety and with no output schema, the description gives a sufficient scope and an indicator of the returned fields. It could have been slightly more precise about the relationship between 'output recipes' and the similar recipe-related siblings, but the tool is simple enough to invoke correctly from the shown definition.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the schema is entirely descriptive. Since 0 params get a baseline of 4 under the rubric, the description doesn't need to add parameter details. The 'current document' scoping is contextual rather than parameter information, so no additional justification is needed beyond the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies a clear verb ('list'), a resource ('output recipes'), the scope ('current document'), and the fields returned ('format and enabled state'). It is specific enough to convey what the tool does, but it does not explicitly differentiate itself from siblings like co_list_recipe_properties or co_get_recipe, so it doesn't earn a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'in the current document' gives a usage context, implying this is the right tool for the current document's recipe overview. However, there is no explicit guidance about when to choose co_list_recipes over alternative listing tools, and no when-not-to-use instructions.

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

co_list_stylesA
Read-onlyIdempotent

Names of the styles and presets available in Capture One. The scripting interface exposes names only, not their contents.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent behavior, and the description adds a meaningful limitation: only names are exposed, not the contents of styles or presets. This helps set agent expectations about what the query can return.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

One compact sentence immediately states the output and then adds the key limitation. No filler, no repetition of the tool name, and the most decision-relevant detail is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only listing tool, the description covers scope and output shape well enough. It omits details like sorting or error behavior, but those are not essential given the simple nature and the annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parametersasi and an empty schema, so there is no parameter detail to add. The baseline of 3 applies because the description does not need to supplement any input definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the exact output (names of styles and presets) and the product domain (Capture One). It is clearer than just the tool name, though it does not explicitly contrast with sibling list tools such as co_list_recipes or co_list_documents.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to choose this tool over alternatives. The intended use is implied by the name and resource type, but the description does not mention exclusions, alternatives, or selection criteria.

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

co_list_variantsA
Read-onlyIdempotent

List variants (the editable instances of images) with filtering and pagination. This is the main way to find images. Filter by rating, color tag, pick flag, filename or extension; request extra field groups only when needed, since those cost a round trip per variant.

ParametersJSON Schema
NameRequiredDescriptionDefault
pickNoFilter on the pick flag
limitNo
scopeNoWhere to look: a collection, the whole document, or the user's current selectioncollection
fieldsNoExtra field groups to hydrate for the returned page only
offsetNo
collectionNoCollection name or id when scope is 'collection'. Defaults to the current collection.
color_tagsNoMatch any of these color tag indices (0 = none)
extensionsNoLower-case file extensions without the dot, e.g. ['cr3','jpg']
max_ratingNo
min_ratingNo
name_containsNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, and non-destructive behavior, lowering the bar. The description adds a useful behavioral trait beyond those annotations: extra field groups cost an additional round trip per variant. This is actionable cost information that the agent would not otherwise know.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

The description is compact and front-loaded, with each sentence earning its place: what the tool lists, its primary role, supported filters, and the round-trip cost caveat. There is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter tool with no output schema, the description covers the core listing/filtering purpose and an important performance tradeoff, while defaults and scope values are already available in the schema. It does not explain response shape or pagination edge cases, but the read-only annotations and conventional list-tool behavior make it sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description translates several schema parameters into concrete filter categories: rating to min_rating/max_rating, color tag to color_tags, pick flag to pick, filename to name_contains, extension to extensions, and field groups to fields. This meaningfully compensates for the partial schema description coverage, though limit/offset semantics are only lightly implied by 'pagination'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: list variants, and clarifies what variants are with the parenthetical 'editable instances of images'. It also distinguishes this tool as 'the main way to find images', separating it from sibling list/get tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context by positioning this as the primary image-finding tool and advises requesting extra field groups only when needed. It does not explicitly name alternatives or exclusion conditions, so it stops short of full when-to-use/when-not-to-use guidance.

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

co_process_queue_statusA
Read-onlyIdempotent

Current depth of the processing queue, and the jobs still pending.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, which covers the safety profile. The description adds the semantic detail of what the status reflects, but it does not mention behavior such as caching, staleness, or whether the response is a snapshot. No contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

A single concise sentence that front-loads the key information. There is no filler, repetition, or unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only status tool, the description is almost complete: it states what is measured and what is reported. The only minor gap is the exact representation of 'jobs still pending' (e.g., count vs. list), but since there is no output schema and no input requirements, this is a small omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters and schema coverage is 100%, so the description has no parameter burden to carry. Per the baseline for parameterless tools, it does not need to add anything further.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (the processing queue) and the specific metric (current depth and pending jobs). It lacks an explicit verb like 'returns' or 'gets,' but the intent is unambiguous and it is easily distinguished from sibling tools like co_status by naming the queue specifically.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for monitoring queue state, but it provides no explicit guidance about when to use this tool versus co_status or other siblings, and it offers no exclusions or alternatives. The use case is inferable but not stated.

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

co_select_variantsA
DestructiveIdempotent

Change which variants are selected in Capture One. Selection is view state — no image data, metadata or library structure is modified. Useful to stage a set for the user to look at, or to set up a subsequent selection-scoped call.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoreplace the current selection, add to it, or remove from itreplace
variant_idsYesVariant ids from co_list_variants

TDQS

A4.2/5.0
Behavior4/5

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

The annotations (readOnlyHint=false, destructiveHint=true, idempotentHint=true) indicate a mutating selection operation. The description adds the crucial clarification that only view state changes and no image data/metadata/library is modified, which meaningfully tempers the destructive hint. It does not detail side effects of replace/add/remove beyond the schema, but the disclosure is solid. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

Three sentences, all dense with meaning: purpose, behavioral qualifier, and use cases. No filler or repetition. The key constraint (view state, non-destructive to data) is front-loaded near the verb.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, side effects, and likely usage intents. With no output schema, a tool that mutates selection state needs to clarify what happens and what doesn't; it does. It doesn't mention how selection interacts with the current document/collection context, but that's inferable from sibling names and the variant_ids parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with clear per-parameter descriptions ('Variant ids from co_list_variants', mode enum with 'replace, add, remove'). The description adds no parameter-level detail beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the action ('Change which variants are selected'), the target system ('in Capture One'), and immediately distinguishes it from data-modifying operations ('Selection is view state — no image data, metadata or library structure is modified'). This is a specific verb+resource description that leaves no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides concrete use cases ('stage a set for the user to look at', 'set up a subsequent selection-scoped call'), giving clear context for when to invoke it. It does not explicitly name sibling alternatives or when not to use it, which prevents a 5.

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

co_set_current_collectionA
DestructiveIdempotent

Focus a collection in the Capture One browser by name or id. Changes only what is displayed; no image data is touched.

ParametersJSON Schema
NameRequiredDescriptionDefault
name_or_idYesCollection name (case-insensitive) or its id

TDQS

A3.6/5.0
Behavior1/5

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

Description explicitly states 'no image data is touched' and 'changes only what is displayed', while annotations mark destructiveHint=true. This directly contradicts the annotation's implication of destructive side effects, so per rubric this dimension must score 1.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

Two tight sentences; the first states the action and lookup key, the second preempts concerns about data mutation. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter setter with no output schema, the description gives enough information to invoke it and states its only side effect. It doesn't explain whether the focused collection becomes the active context for subsequent sibling calls, but that is a minor gap given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of the single parameter, describing it as 'Collection name (case-insensitive) or its id'; the tool description merely repeats 'by name or id' without adding format, examples, or disambiguation. Baseline 3 applies because the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action ('Focus a collection') on a specific resource ('in the Capture One browser') plus the selection key ('by name or id'). It differentiates itself from sibling collection/list tools by clarifying it changes the browser view rather than returning or modifying collection data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description conveys the intended use: switching the current collection in the browser. It doesn't name alternative tools or explicit exclusion conditions, so it stops short of 5, but the context ('changes only what is displayed') provides enough guidance for an agent to select it over data-returning sibling tools.

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

co_statusA
Read-onlyIdempotent

Health and context for Capture One: whether it is running, whether Apple Events are actually getting through, the reported app version, the open document, and which write tiers are enabled. Call this first when anything else times out.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, non-destructive behavior. The description adds useful context beyond annotations by specifying what signals the status reports, particularly 'whether Apple Events are actually getting through' and which write tiers are enabled.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

Two tight sentences: the first front-loads the scope with a colon-delimited list of contents, and the second gives the key usage rule. Every part earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only status tool, the description covers what the tool reports and when to call it. The missing output schema does not create a gap because the described status fields are sufficient for an agent to interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters and 100% schema description coverage, so there is no parameter semantics for the description to add. This matches the 0-parameter baseline of 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific diagnostic resource and enumerates concrete contents: running state, Apple Events delivery, app version, open document, and write tiers. It is clearly distinguishable from sibling tools, which focus on documents, variants, recipes, and selection actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The instruction 'Call this first when anything else times out' provides an explicit, actionable trigger for using this tool. It does not name a specific alternative or state when not to use it, but it supplies clear context for the primary diagnostic scenario.

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

co_variant_output_filesC
Read-onlyIdempotent

Files previously written for variants, from Capture One's output history, including whether each file still exists on disk.

ParametersJSON Schema
NameRequiredDescriptionDefault
variant_idsNo
use_current_selectionNo

TDQS

C2.7/5.0
Behavior3/5

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

Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds useful behavioral context by clarifying that results come from Capture One's output history and include whether each file still exists on disk. However, it does not disclose return ordering, pagination, or failure behavior, so it is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

The description is a single focused sentence with no filler, and the most distinguishing detail—output history plus existence status—is front-loaded. It is appropriately terse, though it sacrifices useful context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no parameter guidance, the tool is incomplete for safe invocation. Annotations cover the mutation/safety profile, but the selection-mode ambiguity and lack of return-shape information leave significant gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain variant_ids or use_current_selection at all. The boolean switcher's relationship to the variant_ids array is entirely undocumented, forcing the agent to guess how to select variants.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies a specific resource—previously written output files for variants, sourced from Capture One's output history, with existence-on-disk status. This distinguishes it from sibling tools like co_list_variants or co_get_variant, though it lacks an explicit verb such as 'list' or 'retrieve'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus related sibling tools, nor any explanation of when to supply variant_ids versus set use_current_selection. The description states what the tool returns but not how an agent should choose between the available selection modes.

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. 18 tool updatesv0.1.0
    • First observedco_compare_variants
    • First observedco_get_document
    • First observedco_get_recipe
    • First observedco_get_variant
    • First observedco_list_adjustments
    • First observedco_list_collections
    • First observedco_list_documents
    • First observedco_list_keywords
    • First observedco_list_layers
    • First observedco_list_recipe_properties
    • First observedco_list_recipes
    • First observedco_list_styles
    • First observedco_list_variants
    • First observedco_process_queue_status
    • First observedco_select_variants
    • First observedco_set_current_collection
    • First observedco_status
    • First observedco_variant_output_files

TDQS

A3.5/5.0

Scored across 18 tools

Disambiguation5/5

Each tool targets a distinct aspect of Capture One—documents, collections, variants, recipes, styles, keywords, adjustments, layers, selection, processing, and output files. Even the list/get pairs are clearly separated by verb, and no two tools overlap in purpose. The only slight overlap is between co_list_documents and co_status, but they serve different functions (listing all open documents vs. health/status).

Naming Consistency4/5

All tools share the 'co_' prefix, and most follow a verb_noun pattern (list_*, get_*, set_*, select_*, compare_*). However, three tools—co_status, co_variant_output_files, and co_process_queue_status—are noun phrases without a verb, breaking the consistency slightly. The pattern is still readable and predictable overall.

Tool Count4/5

With 18 tools, the count is on the higher end of the reasonable range (16-25) but not excessive for a complex application like Capture One. It covers a broad range of features without being bloated, and each tool serves a clear purpose within the domain.

Completeness2/5

The tool set has significant gaps: it references co_configure_recipe and co_adjust_variants but these tools are not present, leaving no way to actually modify recipes or adjustments. Additionally, there are no tools for creating or modifying collections, layers, or applying edits. This incomplete surface will cause agent failures when trying to perform full workflows.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers