capture-one-mcp
Click on "Install 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., "@capture-one-mcpshow me the layers and masks on the currently selected image"
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.
capture-one-mcp
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 |
|
Dictionary | |
Digest |
Regenerate the digest against whatever build is installed:
python3 scripts/gen-dictionary.py > docs/DICTIONARY.mdRelated MCP server: photoshop-mcp-pro
Install
npm install && npm run buildRegister it with an MCP client, e.g. Claude Code:
claude mcp add capture-one -- node /absolute/path/to/capture-one-mcp/dist/index.jsVerify 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 clientverify: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 |
| Running state, whether Apple Events are actually getting through, version/tier, open document. Call this first if anything times out. |
| Open sessions and catalogs, and which is frontmost |
| Paths, session folders, naming tokens, counters, queue depth |
| Albums, projects, groups, smart albums, folders, favorites |
| Focus a collection in the browser |
| Find images — filter by rating, color tag, pick, filename, extension; paginated |
| Full detail for one variant: EXIF, adjustments, crop, metadata, keywords, layers, outputs |
| Output recipes and their full settings |
| Available style and preset names |
| Keywords in the current document |
| The 83 adjustment properties with types and measured ranges |
| Layers on variants, with luma-range settings and all registered scalar adjustments |
| The 40 writable recipe properties |
| Depth of the processing queue |
| Files previously written, and whether they still exist |
| Readable differences between a source variant and a candidate clone |
| 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 |
| Rating (0–5), color tag, pick flag |
| IPTC fields — headline, description, creator, copyright, rights, title, instructions, city/state/country |
| Apply an existing keyword (see limitation below) |
| Remove a keyword from variants (unverified — see below) |
| Any of the 83 adjustment properties, range-validated and read back |
| The same, applied to a single layer |
| Create adjustment layers |
| Name, enabled, opacity |
| Invert, fill, feather, refine — not verifiable, see below |
| Copy a mask between layers |
| Layer mask luma range |
| Apply a named style to a layer |
| AI people masking |
| Recipe settings, validated and read back |
| Render to disk, polling the queue and reporting the files written |
| Copy originals out |
| Import image files (paths validated) |
| Clone variants into editable candidates, preserving existing edits |
| Render one variant to a bounded sRGB JPEG returned as an MCP image |
| 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 |
| Clear, fill or rasterize a mask — not undoable |
| Delete a layer (never the background layer) |
| 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 |
|
Edit the candidates |
|
Look at the result |
|
See what changed |
|
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-verifySnapshots land in .testbed/ (gitignored — it contains real image metadata).
Configuration
Variable | Default | Effect |
| unset | Enables the editing tools. Read-only until set. |
| unset | Additionally enables irreversible verbs. Requires the above. |
|
| Cap on variants returned in one call |
|
| Fallback Apple Event budget for calls that set none |
| unset |
|
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:
| Behaviour |
unset | No check. Only safe when exactly one document is ever open. |
| 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 versionis served by Capture One's own handler and is the honest probe — that is whatco_statususes.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.tsimposes 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.namehas no file extension and is not unique. A RAW+JPEG pair produces two variants both namedDSC_1950. Extension is what makes a row identifiable, soco_list_variantsalways returns it. An early version filtered on a suffix ofnameand matched nothing at all.variant.positionis the position within a clone stack, not an index in the collection -- it is1for every unstacked variant. Exposed aspositionInStackso it cannot be mistaken for a browser index.document.pathis the folder containing the document, not the document itself.co_get_documentalso returnsdocumentPathandfolder.image.dimensionsis 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 |
| 24ms for all 138 |
fetch images then | 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 toolsco_compare_variantsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| document_id | Yes | ||
| source_variant_id | Yes | ||
| candidate_variant_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds value by 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.
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.
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.
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.
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.
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_documentARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No 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, 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.
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.
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.
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.
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.
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_recipeARead-onlyIdempotent
Full settings for one output recipe: file format and quality, scaling, output sharpening, destination and naming, metadata inclusion, crop handling and watermark.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Recipe name (case-insensitive) |
TDQS
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.
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.
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.
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.
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.
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_variantARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Variant id, as returned by co_list_variants |
TDQS
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.
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.
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.
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.
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.
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_adjustmentsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Substring match on the property name |
TDQS
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.
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.
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.
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.
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.
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_collectionsARead-onlyIdempotent
List the collections in the current document: albums, projects, groups, smart albums, catalog folders and session favorites.
| Name | Required | Description | Default |
|---|---|---|---|
| include_counts | No | Also count variants per collection. Off by default because it forces every collection (including smart albums) to resolve its contents, which is slow. |
TDQS
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.
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.
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.
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.
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.
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_documentsARead-onlyIdempotent
List the Capture One sessions and catalogs that are currently open, and which one is frontmost.
| Name | Required | Description | Default |
|---|---|---|---|
No 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, 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.
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.
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.
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.
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.
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_keywordsBRead-onlyIdempotent
Keywords defined in the current document.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
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.
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.
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.
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.
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.
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_layersARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| variant_ids | No | ||
| use_current_selection | No |
TDQS
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.
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.
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.
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.
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.
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_propertiesARead-onlyIdempotent
List every writable recipe property with its type and allowed values, for use with co_configure_recipe.
| Name | Required | Description | Default |
|---|---|---|---|
No 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, 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.
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.
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.
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.
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.
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_recipesARead-onlyIdempotent
List the output recipes in the current document, with format and enabled state.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_stylesARead-onlyIdempotent
Names of the styles and presets available in Capture One. The scripting interface exposes names only, not their contents.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_variantsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| pick | No | Filter on the pick flag | |
| limit | No | ||
| scope | No | Where to look: a collection, the whole document, or the user's current selection | collection |
| fields | No | Extra field groups to hydrate for the returned page only | |
| offset | No | ||
| collection | No | Collection name or id when scope is 'collection'. Defaults to the current collection. | |
| color_tags | No | Match any of these color tag indices (0 = none) | |
| extensions | No | Lower-case file extensions without the dot, e.g. ['cr3','jpg'] | |
| max_rating | No | ||
| min_rating | No | ||
| name_contains | No |
TDQS
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.
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.
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.
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.
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.
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_statusARead-onlyIdempotent
Current depth of the processing queue, and the jobs still pending.
| Name | Required | Description | Default |
|---|---|---|---|
No 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, 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.
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.
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.
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.
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.
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_variantsADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | replace the current selection, add to it, or remove from it | replace |
| variant_ids | Yes | Variant ids from co_list_variants |
TDQS
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.
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.
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.
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.
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.
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_collectionADestructiveIdempotent
Focus a collection in the Capture One browser by name or id. Changes only what is displayed; no image data is touched.
| Name | Required | Description | Default |
|---|---|---|---|
| name_or_id | Yes | Collection name (case-insensitive) or its id |
TDQS
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.
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.
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.
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.
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.
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_statusARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_filesCRead-onlyIdempotent
Files previously written for variants, from Capture One's output history, including whether each file still exists on disk.
| Name | Required | Description | Default |
|---|---|---|---|
| variant_ids | No | ||
| use_current_selection | No |
TDQS
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.
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.
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.
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.
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.
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.
18 tool updates
v0.1.0- First observed
co_compare_variants - First observed
co_get_document - First observed
co_get_recipe - First observed
co_get_variant - First observed
co_list_adjustments - First observed
co_list_collections - First observed
co_list_documents - First observed
co_list_keywords - First observed
co_list_layers - First observed
co_list_recipe_properties - First observed
co_list_recipes - First observed
co_list_styles - First observed
co_list_variants - First observed
co_process_queue_status - First observed
co_select_variants - First observed
co_set_current_collection - First observed
co_status - First observed
co_variant_output_files
TDQS
Scored across 18 tools
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).
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.
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.
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
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
MCP Server for Slima - AI Writing IDE for Novel Authors with AI Beta Reader.
The MCP server for Azure DevOps, bringing the power of Azure DevOps directly to your agents.
AutoRender's MCP server for media assets, transformations, delivery, and workflow automation.
MCP server for detecting and redacting PII (Personally Identifiable Information) in PDF documents.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceAn MCP server providing tools for image processing operations330PythonMIT
- AlicenseAqualityDmaintenanceA professional MCP server that lets AI assistants directly control Adobe Photoshop for document creation, layer management, filters, adjustments, shapes, text, and design intelligence like palette generation and font pairing.322MIT
- FlicenseNot gradedqualityDmaintenanceA powerful Model Context Protocol (MCP) server for image processing, designed to empower AI models with advanced image manipulation capabilities.-
- AlicenseNot gradedqualityDmaintenanceThis MCP server enables AI tools to interact with your Apple Photos library via the osxphotos CLI, providing tools for querying and managing photos.1MIT