Skip to main content
Glama
Berrio
by Berrio

inkscape-mcp

Local MCP server, via stdio, for bounded headless control of Inkscape. This pre-alpha version focuses on SVG/Inkscape documents, sizes, pages, and verified exports to PNG, PDF, and SVG.

What works today

  • Inkscape discovery, including the Windows MSIX package, and --doctor with capability evidence.

  • Authorized workspaces with safe relative paths, SHA-256 revisions, locks, backups, and atomic commits.

  • Create, inspect, and resize SVG documents with page_only semantics, custom measurements, or A3/A4/Letter presets, and initial pages.

  • Explicit Inkscape 1.4 pages: list, add, update, delete, and reorder with stable IDs.

  • Typed page settings: page color/opacity, desktop color, and border color/opacity.

  • Basic SVG preflight and PNG, PDF 1.4/1.5, and flat or Inkscape SVG exports. Results are verified before publishing.

It is not yet a complete vector editor: it does not announce general manipulation of objects, layers, text, paths, selections, filters, or local dependencies. See the master plan for scope and pending tasks.

Related MCP server: inkscape-mcp

Requirements

  • Node.js 24.x and npm 11.x.

  • Inkscape 1.4.4 or compatible. On Windows, the MSIX installation observed during development is detected automatically.

Run locally

npm ci
npm run check
npm run test:mcp
node dist/cli.js --doctor --json
node dist/cli.js --workspace-root C:\ruta\a\tus\disenos

The last command keeps the MCP protocol exclusively on stdout. Configure your MCP client to launch it with node, argument dist/cli.js, and one or more --workspace-root arguments; only those directories will be visible to the document tools.

Current MCP tools

Tool

Usage

inkscape_status

Status, capabilities, and security posture.

workspace_list, workspace_list_documents

Available workspaces and allowed SVG/SVGZ.

document_create, document_inspect, document_resize

Create and manage viewport, units, viewBox, pages, anchors, contain/cover/stretch, revision, and SVG inventory.

document_pages

List or mutate explicit Inkscape 1.4 pages.

document_settings

Read or edit page background, desktop, and border.

document_preflight

Detect active content, external resources, and errors with basic/web/print/interchange profiles.

elements_update

Update geometry, basic style, text, or layer label via typed patches.

elements_arrange

Change sibling Z-order: front/back/raise/lower, without arbitrary XML indices or ordering.

elements_group

Group siblings or ungroup an SVG group without breaking external href references.

elements_query

Query bounded summaries by ID, type, or layer, with pagination and missingIds.

elements_create

Create typed shapes, text, groups, and layers; supports parentId within the batch.

elements_delete

Delete selected IDs without leaving broken fragment references.

elements_transform

Transform elements with typed translate, scale, rotate, skew, flip, or matrix.

export_png, export_pdf, export_svg

Export via Inkscape with staging and validate the artifact; PNG accepts area/DPI/background, PDF reports pages and MediaBox, and SVG can convert text to paths.

Mutations and exports require expectedRevision. If a file changes between read and commit, the operation fails instead of overwriting someone else's revision. Every export provides Inkscape with a verified copy of the SVG in staging, never the live workspace path.

Security and status

The project does not promise to isolate unknown vulnerabilities in native parsers. It limits paths, XML, arguments, processes, sizes, and overwrites; the current native input policy is trusted-local-only. Export rejects SVG with active content or remote resources before starting Inkscape; resize mutations apply the same rule.

Contribution instructions and invariants are in AGENTS.md. The package remains private: publishing it to npm or a registry will require separate explicit authorization.

License

MIT Copyright 2026 Berrio.

Available Tools

90 tools
accessibility_inspectB
Read-only

Provides explicitly heuristic SVG text contrast and document reading-order diagnostics; contrast uses an opaque Inkscape page background when available, otherwise white, and only direct hex fill.

NameRequiredDescriptionDefault
pathYes
workspaceIdYes

Output Schema

NameRequiredDescription
warningsYes
backgroundYes
readingOrderYes
lowContrastTextYes

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description goes beyond that by disclosing the heuristic's actual mechanics: contrast is measured against an opaque Inkscape page background when present, otherwise white, and only direct hex fills are considered. That tells the agent when results will be unreliable, which is valuable behavioral context.

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

Conciseness4/5

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

A single compact sentence with no filler, and the core purpose is front-loaded before the heuristic caveats. The semicolon clause is dense but each part carries information.

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

Completeness3/5

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

An output schema exists, so return values need not be explained, and annotations cover the read-only nature. What remains missing is any parameter explanation and any routing guidance among the many inspect/preflight siblings, leaving the definition only minimally complete.

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% for two required parameters, and the description never mentions path or workspaceId. It does not compensate for the gap, so the agent must infer that path is an SVG file and workspaceId a workspace identifier from the schema patterns alone.

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 a specific verb-plus-resource: heuristic SVG text-contrast and document reading-order diagnostics. That scope is distinct from siblings like document_inspect, document_preflight, and color_management_inspect, so an agent can identify what this tool uniquely covers, though the phrasing is dense.

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 when-to-use guidance, no mention of alternatives (document_inspect, document_preflight, color_management_inspect, palette_inspect all sit nearby), and no prerequisites such as needing an SVG document in the workspace. Usage is only implied by the word 'accessibility'.

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

artifact_read_chunkB
Read-only

Reads one owner-bound, bounded binary artifact chunk by opaque ID. Use resource links for ordinary artifact consumption.

NameRequiredDescriptionDefault
lengthYes
offsetYes
artifactIdYes
workspaceIdYes

Output Schema

NameRequiredDescription
hashYes
sizeYes
lengthYes
offsetYes
mimeTypeYes
artifactIdYes
bytesBase64Yes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds ownership ('owner-bound') and size-limiting ('bounded') context beyond annotations, but never states what happens past the bounds, whether reads are streaming, or any auth/error behavior. With annotations carrying the read-only signal, this is adequate but thin.

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 short sentences, purpose front-loaded, alternative named second, zero filler. Nothing could be removed without losing routing or scope information.

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?

An output schema exists so return values need no explanation, but for a 4-param, 0%-coverage read tool the description leaves the offset/length chunking contract unexplained, which is the core usage model. An agent would have to infer how to iterate or how large a chunk may be.

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% across 4 required params, so the description must compensate. It loosely covers artifactId ('opaque ID'), workspaceId ('owner-bound'), and length ('bounded'), but 'offset' — the parameter that defines the entire chunking mechanism — is never addressed, and no format or range guidance is given.

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?

Specific verb+resource: 'Reads one ... binary artifact chunk', with qualifiers 'owner-bound, bounded' and 'by opaque ID'. An agent can tell it reads raw artifact bytes, not metadata or documents. Sibling differentiation comes only via the generic phrase 'resource links' rather than a named tool, which keeps it from 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 Guidelines4/5

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

'Use resource links for ordinary artifact consumption' gives an explicit when-not boundary, implying this tool is for lower-level/chunked access. It stops short of stating the positive trigger (partial reads, offset iteration, or large binaries) or rate/ownership prerequisites.

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

assets_packageB

Creates a portable workspace-local SVG package containing document.svg, rewritten local assets, and a revision manifest. Every package file is published together and existing files are never overwritten.

NameRequiredDescriptionDefault
pathYes
workspaceIdYes
assetLicensesNo
outputDirectoryYes
expectedRevisionYes

Output Schema

NameRequiredDescription
filesYes
documentPathYes
manifestPathYes
dependencyCountYes

TDQS

B3.3/5.0
Behavior4/5

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

Annotations only provide destructiveHint=false, so the description carries most of the burden and delivers real value: it states that all package files are published together (atomicity) and that existing files are never overwritten (safety/no-clobber). It still omits what happens on a revision mismatch, permission needs, or whether the output directory must pre-exist.

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, both earning their place, with the core product statement front-loaded and the atomicity/no-overwrite guarantee following immediately. No filler or redundant restatement of the name.

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

Completeness3/5

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

The output schema exists, so return values need not be explained, and the description covers what is produced and the mutation safety profile. However, four required parameters with zero schema documentation leaves a real gap for an agent about to call this write-style 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% across 5 parameters, so the description must compensate and largely does not. Only 'revision manifest' loosely hints at expectedRevision's concurrency role; path, workspaceId, outputDirectory, and the assetLicenses license/sourceUri pair are given no meaning, constraints, or format guidance.

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 gives a specific verb ('Creates') and resource ('portable workspace-local SVG package') and even enumerates the package contents (document.svg, rewritten local assets, revision manifest). It is clear what the tool produces, though it never contrasts itself with likely-confusable siblings such as document_export or export_svg, so an agent must infer the difference.

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 when-to-use guidance, no prerequisites, and no mention of alternatives among the many export/document tools in the sibling list. The agent is left to infer that this is the packaging path versus a plain export.

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

clips_manageA
Destructive

Creates typed rectangular SVG clipPaths, applies or releases them from explicit elements, and prevents deletion while any SVG or CSS reference remains.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
idNo
actionYes
revisionYes
targetIdsNo
backupCreatedYes

TDQS

A3.7/5.0
Behavior4/5

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

With only destructiveHint=true in the annotations, the description carries real weight and delivers: it discloses the shape constraint ('typed rectangular'), the scoping rule ('from explicit elements'), and a genuine referential-integrity behavior ('prevents deletion while any SVG or CSS reference remains'). It still omits concurrency behavior around expectedRevision and what happens when a guarded delete is rejected.

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?

A single front-loaded sentence with three dense, information-bearing clauses and no filler. It is slightly over-compressed, since the explicit 'delete' action is only implied through the guard clause.

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 complex four-variant polymorphic tool, the description covers the create/apply/release lifecycle plus a delete constraint, and an output schema exists so return values need not be explained. Remaining gaps (revision/optimistic-concurrency semantics, delete prerequisites) are secondary.

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 reported at 100%, so the baseline is 3; the schema already encodes the four action variants, required fields, patterns, and the spec object. The description adds only marginal meaning ('rectangular' clarifies the spec geometry) and says nothing about expectedRevision or targetIds semantics.

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 specific resource (typed rectangular SVG clipPaths) and the operations (create, apply, release, and implicitly delete via the deletion guard), so an agent can tell this apart from generic element tools. It does not, however, distinguish itself from the nearby masks_manage sibling or explain the clip-vs-mask boundary.

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?

Usage is only implied: the multi-action schema plus the phrase 'applies or releases them from explicit elements' hints at when to use apply/release, but there is no explicit when-to-use, when-not-to-use, or alternative tooling named. The deletion constraint is the closest thing to guidance.

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

color_management_inspectA
Read-only

Lists local SVG color-profile metadata and ICC paint references without claiming CMYK conversion or PDF/X output-intent validation.

NameRequiredDescriptionDefault
pathYes
workspaceIdYes

Output Schema

NameRequiredDescription
profilesYes
limitationsYes
iccReferenceCountYes
cmykLikeReferenceCountYes
unresolvedProfileNamesYes

TDQS

A3.5/5.0
Behavior4/5

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

readOnlyHint=true is already declared, so the safety profile is covered. The description adds real value beyond the annotation by disclaiming what the tool will not do (no CMYK conversion, no PDF/X output-intent validation), which prevents an agent from over-trusting the result.

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 front-loaded sentence with no filler; the scope disclaimer is tightly integrated rather than padding.

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

Completeness3/5

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

An output schema exists, so return values need not be explained, and the read-only annotation covers safety. However, the two required parameters remain undocumented and there is no usage/routing context, leaving gaps for an agent to fill.

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 both required parameters (path, workspaceId) are undocumented in the schema. The description adds no information about what path points to or the workspaceId format, so it fails to compensate for the coverage gap.

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?

States a specific verb ('Lists') and specific resources ('local SVG color-profile metadata and ICC paint references'), which clearly separates it from write/convert operations. The negative clause sharpens the boundary but the core purpose is unambiguous.

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?

No explicit when-to-use or alternatives are named (e.g., palette_inspect, mesh_gradients_inspect). The 'without claiming CMYK conversion or PDF/X output-intent validation' clause does imply a when-not boundary, giving weak scope guidance rather than a genuine routing instruction.

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

connector_createC
Destructive

Creates one typed Inkscape polyline connector between two existing local element IDs without accepting SVG/XML or arbitrary connection attributes.

NameRequiredDescriptionDefault
idYes
pathYes
toIdYes
fromIdYes
pointsYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
idYes
revisionYes
backupCreatedYes

TDQS

C2.9/5.0
Behavior3/5

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

With destructiveHint=true already declared, the description usefully narrows scope: one typed polyline connector, existing local IDs only, and no SVG/XML or arbitrary connection attributes. It does not explain what a create may overwrite (given destructiveHint) or that expectedRevision guards against stale writes.

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?

A single front-loaded sentence with the verb and resource first, and no padding. It is dense but every clause carries information about scope or exclusions.

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?

An output schema covers return values, but for a 7-parameter mutation tool with 0% schema description coverage the description leaves too much undocumented. An agent cannot infer points format, expectedRevision meaning, or path purpose from either source.

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% across 7 required parameters, so the description must compensate but largely does not. It only implies fromId/toId via "between two existing local element IDs" and says nothing about id, path, points, workspaceId, or expectedRevision semantics.

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?

States a specific verb ("Creates"), resource ("Inkscape polyline connector"), and scope ("between two existing local element IDs"). An agent can distinguish this from sibling connector_retarget/connector_route, though no sibling is named explicitly.

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 when-to-use guidance and no reference to the alternative connector tools (connector_retarget, connector_route). The clause about not accepting SVG/XML is a constraint, not usage guidance, and no prerequisites are stated.

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

connector_retargetA
Destructive

Retargets an existing semantic Inkscape connector to two explicit local endpoints while preserving its current polyline route.

NameRequiredDescriptionDefault
idYes
pathYes
toIdYes
fromIdYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
idYes
revisionYes
backupCreatedYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already flag this as destructive, and the description adds a meaningful behavioral guarantee: the connector's current polyline route is preserved during retargeting. It does not, however, explain what destructive side effects might occur or whether authorization or revision checks apply.

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 a single, front-loaded sentence with no wasted words. It communicates the core action and the key preservation guarantee immediately.

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 an output schema exists and the destructive annotation provides some safety context, the input schema has no parameter descriptions. For a six-parameter destructive operation, the description omits required concurrency handling (expectedRevision), workspace scoping, and path semantics, making it too thin for reliable invocation.

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% across six required parameters. The description clarifies that two endpoints are involved (fromId and toId) and refers to an existing connector (id), but it does not explain path, workspaceId, or expectedRevision, leaving half the parameters semantically undocumented.

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 precise verb (retargets), a specific resource (existing semantic Inkscape connector), and the action scope (two explicit local endpoints while preserving the polyline route). It clearly distinguishes this mutation from sibling tools like connector_create or connector_route.

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?

Use is implied by 'existing' connector, so an agent can infer this is for modifying rather than creating a connector. However, the description does not explicitly compare against alternatives such as connector_create or connector_route, nor does it state when not to use this tool.

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

connector_routeB
Destructive

Routes a semantic Inkscape connector orthogonally between explicit rect, circle, or ellipse endpoints. Optional explicit obstacles use bounded Manhattan routing with axis-aligned transforms and a typed clearance.

NameRequiredDescriptionDefault
idYes
axisNoauto
pathYes
toIdYes
fromIdYes
clearanceNo
obstacleIdsNo
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
idYes
pointsYes
revisionYes
backupCreatedYes
avoidedObstacleIdsYes

TDQS

B3.1/5.0
Behavior3/5

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

Annotations only declare destructiveHint=true, and the description does not disclose that the existing connector path is replaced/rewritten or what happens on an unreachable route. It does add algorithmic context beyond annotations (bounded Manhattan routing, obstacles, clearance), which earns partial credit but leaves the destructive side of the operation unexplained.

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?

Two dense, front-loaded sentences with no filler; the action and its routing model come first. Terminology such as 'typed clearance' is slightly opaque but the structure is efficient.

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?

For a 9-parameter, 6-required mutation tool with 0% schema coverage, the description omits the meaning of expectedRevision (concurrency guard), path, and id, and offers no failure or permission context. The existence of an output schema excuses return-value explanation, but the input-side gaps are substantial.

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 0% for all 9 parameters, so the description must carry the load. It covers the endpoint concept (from/to), obstacleIds ('optional explicit obstacles'), clearance ('typed clearance') and axis ('axis-aligned transforms'), but id, path, workspaceId, and expectedRevision are never clarified, and bounds/semantics of clearance and obstacle limits are absent.

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?

States a specific verb (routes) and resource (Inkscape connector) plus the endpoint constraint (rect/circle/ellipse) and routing style (orthogonal). An agent can distinguish it from connector_create, but the description never names or contrasts with those siblings explicitly.

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 on when to use this versus connector_create or connector_retarget, nor prerequisites such as needing an existing connector with both endpoints present. Usage must be inferred from the verb alone.

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

defs_vacuumB
Destructive

Plans or conservatively removes unused top-level SVG definitions. Defaults to dry-run and never rewrites referenced resources.

NameRequiredDescriptionDefault
pathYes
dryRunNo
workspaceIdYes
expectedRevisionNo

Output Schema

NameRequiredDescription
dryRunYes
revisionNo
removedIdsYes
candidateIdsYes
backupCreatedNo

TDQS

B3.4/5.0
Behavior4/5

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

Annotations only declare destructiveHint=true, and the description adds genuinely useful safety context beyond that: defaults to dry-run, and referenced resources are never rewritten. It stops short of explaining what the plan output contains or how expectedRevision gating behaves.

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?

Two tight sentences with no filler, and the operation plus its safety defaults are front-loaded. It is appropriately sized, though the second sentence is doing parameter work that belongs in the schema.

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

Completeness3/5

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

An output schema exists so return values needn't be explained, and the destructive/dry-run behavior is covered. But with 0% parameter description coverage and an undocumented revision guard, an agent lacks enough to invoke this correctly in the non-dry-run case.

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% across four parameters, so the description must compensate — it only clarifies the dryRun default. Nothing is said about path, workspaceId, or the expectedRevision concurrency token, which is the most consequential parameter to understand.

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?

States a specific verb and resource: 'Plans or conservatively removes unused top-level SVG definitions.' The scope qualifier (top-level, unused) is useful, but it doesn't differentiate itself from adjacent maintenance siblings such as document_optimize or document_normalize_ids.

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?

'Plans or conservatively removes' plus the dry-run default implies a two-phase plan-then-apply workflow, so usage is inferable. However, it never says when to prefer this over other cleanup/optimization siblings, nor what preconditions (revision match) apply.

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

document_apply_operationsB
Destructive

Applies a bounded ordered design transaction to an SVG. Every operation is validated against the preceding in-memory result; a failure leaves the source untouched.

NameRequiredDescriptionDefault
pathYes
dryRunNo
versionNo
operationsYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
diffYes
dryRunYes
versionYes
revisionYes
operationsYes
backupCreatedYes
estimatedCostYes

TDQS

B3.3/5.0
Behavior4/5

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

Annotations only declare destructiveHint=true, so the description carries extra burden and delivers: it discloses that operations are validated sequentially against the preceding in-memory result and that a failure leaves the source untouched (all-or-nothing atomicity). That is meaningful behavioral context beyond the annotation and is consistent with destructiveHint. It omits authentication/workspace requirements and dryRun semantics.

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 with zero waste. The purpose is front-loaded in the first clause, and the second sentence adds the atomicity guarantee, so every sentence earns its place.

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

Completeness3/5

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

For a highly complex, many-branch transactional tool with an output schema in place, the description covers atomicity but omits concurrency-control semantics (expectedRevision), the dryRun flag's effect, and any usage routing against sibling mutation tools. Adequate but with clear gaps given the tool's complexity.

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 references none of the six parameters. It says nothing about expectedRevision (optimistic concurrency), dryRun, path, or workspaceId, so it fails to compensate for the prose-description gap. The schema's rich enums/consts describe operation shape structurally, but the top-level control parameters remain unexplained.

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?

States a specific verb and target: 'Applies a bounded ordered design transaction to an SVG.' The phrase 'design transaction' conveys that this is a batch/atomic operation rather than a single-element mutation, which distinguishes it conceptually from siblings like elements_create or elements_update. However, it never names those siblings or explicitly contrasts the batch approach with the single-operation tools.

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 when-to-use guidance, no exclusions, and no mention of alternatives. An agent cannot tell from the description why it should batch operations here versus calling elements_create/elements_update/elements_transform individually. The only contextual hint is implicit in the word 'transaction'.

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

document_createB

Creates a new SVG document from bounded custom dimensions or a named page preset. Existing outputs are never overwritten.

NameRequiredDescriptionDefault
unitNo
pagesNo
widthNo
heightNo
presetNo
outputPathYes
workspaceIdYes

Output Schema

NameRequiredDescription
revisionYes
documentPathYes

TDQS

B3.1/5.0
Behavior3/5

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

The annotations only supply destructiveHint=false; the description usefully adds the no-overwrite guarantee ('Existing outputs are never overwritten'), which is real behavioral context. However it does not say what actually happens on path conflict (error vs skip) or note permission/auth requirements, so it adds value but not richness.

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 with the core action and creation modes front-loaded, then the no-overwrite guarantee. No filler whatsoever.

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

Completeness3/5

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

An output schema exists so return values needn't be explained, and the safety profile is covered by annotations plus the no-overwrite note. But for a 7-parameter creation tool at 0% schema coverage with no preset-vs-custom guidance, the description leaves notable gaps an agent would need to resolve by inspection.

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% across 7 parameters, so the description carries the full burden and largely fails. It loosely gestures at the width/height/unit/preset and outputPath parameters but adds no syntax, format, or constraints (allowed units, preset list, workspaceId format, the pages array).

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?

States a specific verb (creates) and resource (SVG document), and names the two creation modes (custom dimensions vs named preset). It clearly reads as a create-new tool rather than the numerous document_import_* siblings, though it does not explicitly contrast itself with import.

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 when-to-use or when-not-to-use guidance. It never says when to prefer a named preset over bounded custom dimensions, nor does it name an alternative sibling (e.g., document_import) for bringing in existing content.

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

document_exportB

Exports one PNG, PDF, SVG, plain SVG, PS, EPS, EMF, experimental WMF, or a fixed versioned DXF/HPGL/FXG/SIF/GPL adapter from a validated ExportSpec through the bounded Inkscape pipeline. Legacy vector formats require explicit acknowledgement of fidelity limits.

NameRequiredDescriptionDefault
specYes
workspaceIdYes

Output Schema

NameRequiredDescription
formatYes
adapterNo
artifactYes
revisionYes
warningsYes
outputPathYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations only declare destructiveHint=false. The description adds that conversion runs through a bounded Inkscape pipeline and that legacy vector formats require explicit fidelity acknowledgement, which is useful context, but it omits output write/overwrite semantics, revision checks, and failure behavior.

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 two sentences are front-loaded and free of filler. The format enumeration is long but functional given the schema's many export branches.

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

Completeness3/5

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

An output schema exists, so return values need not be described. Yet for a high-complexity multi-format export with 0% schema description coverage, the description is thin: it lacks sibling selection guidance and does not cover workspaceId or important target/revision semantics.

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 does not explain workspaceId or the nested ExportSpec fields such as area, source, target, or format-specific options. It only names the ExportSpec as validated, lists formats, and references fidelity limits, leaving most parameter meaning to the schema structure itself.

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 provides a specific verb and resource: exporting a document/selection to a list of graphic formats from a validated ExportSpec through a bounded Inkscape pipeline. It is clear what the tool does, but it does not distinguish itself from sibling export_png, export_pdf, export_svg, or document_export_batch.

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 gives a prerequisite ('validated ExportSpec') and a conditional rule that legacy vector formats require explicit acknowledgement of fidelity limits. However, it never says when to choose this tool over narrower export siblings or batch/preset alternatives, so usage remains implied.

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

document_export_batchC

Renders a bounded batch of baseline PNG, PDF, SVG, or plain SVG variants. all_or_nothing verifies every variant before one logical publish; best_effort publishes verified successes.

NameRequiredDescriptionDefault
modeYes
specsNo
presetNo
deliveryNosync
planTokenNo
timeoutMsNo
workspaceIdYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior3/5

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

Annotations provide only destructiveHint=false, so the description carries most of the burden. It adds genuinely useful publish semantics: all_or_nothing verifies every variant before one logical publish (atomic) versus best_effort publishing verified successes (partial success). However it omits other material behavior: that outputs are written to disk targets, overwrite semantics, the sync/job delivery switch, timeout behavior, and planToken idempotency/planning requirements.

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?

Two tight sentences with no filler, and the batch scope is front-loaded ahead of the mode semantics. It is efficient, though arguably under-sized for a tool whose schema is this deep.

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?

For a tool with 7 parameters, 0% schema description coverage, deeply nested oneOf format branches, and only a destructiveHint annotation, the description is far too thin. The elements an agent most needs (planToken sourcing, delivery mode, timeout, overwrite/expectedRevision concurrency behavior) are absent, though the presence of an output schema excuses it from documenting return values.

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 for 7 parameters, yet it only loosely maps to mode and never mentions specs, preset, delivery, planToken, timeoutMs, or workspaceId. The names 'all_or_nothing' and 'best_effort' roughly correspond to mode enum values, but planToken (which links to the document_export_preset_plan sibling) and delivery are left entirely unexplained.

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

Purpose3/5

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

States a specific verb and resource ("Renders a bounded batch of ... variants"), which is clearer than a tautology. But the enumerated formats (PNG, PDF, SVG, plain SVG) are only a subset of what the schema actually accepts (ps, eps, emf, wmf, xaml, dxf, hpgl, fxg, sif, gpl, svgz), so the scope statement is partially misleading. It also gives no differentiation from near-identical siblings such as document_export, export_png, export_pdf, or document_export_preset_plan.

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 two clauses explain what the mode values do, not when to pick this tool over document_export, export_png, or document_export_preset_plan. No prerequisites, no exclusions, no guidance on batching vs single export. An agent must infer usage entirely from the name.

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

document_export_preset_planA
Read-only

Preflights one named export preset without publishing files and returns an owner-bound, single-use plan token. Execution must use the token before it expires, so the plan stays tied to the source revision and observed Inkscape capabilities.

NameRequiredDescriptionDefault
ttlMsNo
presetYes
workspaceIdYes

Output Schema

NameRequiredDescription
digestYes
expiresAtYes
planTokenYes
preflightYes
outputPathsYes
variantCountYes
presetMetadataNo
outputDirectoryYes

TDQS

A3.6/5.0
Behavior4/5

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

Consistent with readOnlyHint=true: 'without publishing files' confirms no side effects. Beyond annotations it discloses the owner-bound, single-use, expiring token and that the plan is pinned to the source revision and observed Inkscape capabilities. It omits what happens on expiry or token misuse, so not a 5.

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?

Two sentences, front-loaded with the core action and output. Slight redundancy between 'single-use plan token' and 'must use the token before it expires', but every sentence is relevant.

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

Completeness3/5

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

An output schema exists, so return values need no explanation, and the description covers the preflight-then-execute contract. Against a parameter count of 3 with a large nested preset object at 0% coverage, though, the description leaves several structural details to the schema alone.

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 0%, so the description carries the burden. It meaningfully hints at preset name, source revision (expectedRevision), and TTL ('before it expires'), but never mentions workspaceId or the preset's outputDirectory/metadata/overrides structure. Partial compensation for a deeply nested 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?

Names a specific verb and resource ('Preflights one named export preset'), states the key output ('single-use plan token'), and clarifies it does not publish files, which separates it from the export siblings. It does not name an alternative (e.g., document_export) explicitly, so it stops short of 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?

Usage is implied: preflight a preset, then execute with the returned token before expiry. However it never names the tool that consumes the token nor states when to prefer this over sibling exports like document_export or document_export_batch, leaving the agent to infer the workflow.

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

document_fit_pageB
Destructive

Fits a page to native visual drawing or selected-object bounds with explicit per-side margins. This never transforms objects.

NameRequiredDescriptionDefault
idsNo
pathYes
unitYes
scopeYes
marginsNo
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
pageYes
boundsYes
revisionYes
warningsYes
backupCreatedYes
boundsFidelityYes

TDQS

B3/5.0
Behavior3/5

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

Annotations only carry destructiveHint=true, so the description must carry the rest of the burden. 'This never transforms objects' is a genuinely useful clarification about what is and isn't mutated, but it omits concurrency/optimistic-locking behavior around expectedRevision, permission needs, and what page state changes. Adds real value but leaves major gaps.

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 short sentences, front-loaded with the core action and followed by the key non-mutation caveat. Nothing is 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?

With an output schema present, return values needn't be described, but a destructive, revision-guarded mutation tool with 7 parameters (5 required), nested margins, and 0% param coverage is under-specified. An agent cannot reliably invoke this without inferring parameter meanings and lock semantics.

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% across 7 parameters. The description implies 'margins' via 'explicit per-side margins' and touches the scope choice, but leaves unit, path, ids, workspaceId, and expectedRevision entirely unexplained. It only marginally compensates for the coverage gap.

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 a specific verb (fits) and resource (page) and clarifies the two bound modes ('native visual drawing or selected-object bounds'), which map to the scope enum. This differentiates it from the page-manipulation siblings (document_resize, document_page_adjust), though it never names them.

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 choose this over document_resize or document_page_adjust, nor on prerequisites such as the required expectedRevision or whether a selection must exist. The 'never transforms objects' note is a behavioral trait, not a usage directive.

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

document_importB

Imports one workspace-local SVG or SVGZ into a new sanitized SVG plus an adjacent reproducible conversion manifest. SVGZ expansion is hard-limited and no external resource is fetched.

NameRequiredDescriptionDefault
pathYes
formatYes
outputPathYes
workspaceIdYes
manifestPathYes
sanitizeModeNopreserve-local
expectedRevisionYes

Output Schema

NameRequiredDescription
manifestYes
revisionYes
outputPathYes
manifestPathYes
manifestRevisionYes

TDQS

B3.3/5.0
Behavior4/5

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

Annotations only declare destructiveHint=false, so the description carries most of the burden, and it usefully discloses that SVGZ expansion is hard-limited, no external resource is fetched, and output is sanitized. It stops short of explaining concurrency/expectedRevision behavior or what happens if outputPath/manifestPath already exist.

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 tightly written sentences with no waste, front-loading the core action and then the safety constraints. Every clause adds information.

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

Completeness3/5

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

An output schema exists so return values need not be described, and the safety constraints are covered, but with 6 required parameters and zero schema coverage the definition leaves substantial mechanical detail (sanitizeMode default, revision checking, overwrite semantics) for the agent to infer.

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% across 7 parameters, so the description must compensate but largely does not. Only 'workspace-local', 'SVG or SVGZ' loosely map to path/workspaceId/format; sanitizeMode, expectedRevision, outputPath, and manifestPath semantics are left entirely to the 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?

It names a specific verb and resource with scope ('Imports one workspace-local SVG or SVGZ') and states the output artifacts (sanitized SVG plus conversion manifest). This distinguishes it from raster/PDF/PostScript import siblings, though it does not explicitly differentiate itself from the closely related document_import_svg 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 when-to-use guidance, no prerequisites, and no named alternative despite several competing import tools in the sibling list. The agent is left to infer that this applies to local SVG/SVGZ sources only.

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

document_import_capabilitiesA
Read-only

Reports the exact input types observed from this local Inkscape --list-input-types probe, including headless fixture gates for supported native import adapters. A detected type is never exposed until its real headless conversion fixture passes.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
inputTypesYes
svgzImportYes
rasterImportYes
nativeImportGatesYes
nativeProbeAvailableYes

TDQS

A3.6/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, and the description adds genuinely non-obvious behavioral context: the probe is local, and detected types are withheld unless their headless conversion fixture passes, which tells the agent the output may be deliberately incomplete. It does not cover performance or caching behavior, but the fixture-gating disclosure is substantive.

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?

Two sentences, both front-loaded and free of filler; the key claim (reports observed input types) comes first, with the fixture gate as supporting detail. The phrasing is jargon-dense ('headless fixture gates') but each clause carries information.

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

Completeness4/5

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

An output schema exists, so return values need no explanation, and the tool is parameterless and read-only. The description adequately covers what is reported and the caveat on withheld types; only the routing question of when to invoke it is left open, which is scored under usage guidelines.

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 takes zero parameters, so there is no parameter semantics to explain and the baseline of 4 applies. The description correctly implies the probe is run without arguments.

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 a specific verb and resource: it reports the exact input types observed from a local Inkscape --list-input-types probe. This is distinguishable from the many document_import_* siblings, which perform actual imports, though it never names a sibling explicitly.

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 statement of when to call this versus the import tools (document_import_svg, document_import_raster, etc.) or inkscape_status. An agent must infer usage from the word 'capabilities' alone; no prerequisites or exclusions are given.

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

document_import_emfB

Imports one trusted workspace-local EMF file through the observed local Inkscape capability into a sanitized SVG and conversion manifest. It never accepts arbitrary native formats or arguments.

NameRequiredDescriptionDefault
pathYes
outputPathYes
workspaceIdYes
manifestPathYes
sanitizeModeNopreserve-local
dependencyPolicyNo
expectedRevisionYes

Output Schema

NameRequiredDescription
manifestYes
revisionYes
outputPathYes
manifestPathYes
manifestRevisionYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations only supply destructiveHint=false, so the description carries most of the load and does add real context: the conversion runs through the local Inkscape capability, output is sanitized, a conversion manifest is produced, and only a single trusted workspace-local file is processed. It is silent on failure behavior, revision conflicts, and permission requirements, which keeps it below a 5.

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, zero filler, with the core action front-loaded and the scope guardrail second. Nothing is repeated from the name or schema and no clause is 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?

An output schema exists so return values need no explanation, but for a 7-parameter mutation-ish tool with 0% schema descriptions and no annotations beyond destructiveHint, the description leaves too much unsaid: expectedRevision semantics, dependencyPolicy behavior, sanitizeMode tradeoffs, and error/conflict handling are all absent.

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% across 7 parameters, including a nested dependencyPolicy object and a regex-constrained expectedRevision. The description only obliquely gestures at workspaceId ('workspace-local'), path ('EMF file'), and sanitizeMode ('sanitized'), and never explains expectedRevision (concurrency guard), manifestPath, outputPath, or dependencyPolicy. It does not compensate for the coverage gap.

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?

States a specific verb and resource ('Imports one trusted workspace-local EMF file') plus the concrete outputs (sanitized SVG and conversion manifest), which is enough to tell it apart from document_import_svg or document_import_raster. It does not, however, name any sibling importer explicitly, so the differentiation is carried by the tool name rather than the prose.

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?

Usage is implied rather than stated: one file, workspace-local, trusted, EMF only. The closing clause 'never accepts arbitrary native formats or arguments' functions as a soft when-not, steering agents toward other import tools for other formats, but no alternative is named and no prerequisites (Inkscape availability) are given.

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

document_import_pdfB

Imports exactly one page of a workspace-local PDF through the local Inkscape importer into a sanitized SVG and conversion manifest. The internal and Poppler importers are explicit, capability-gated modes with fidelity warnings.

NameRequiredDescriptionDefault
modeYes
pageYes
pathYes
outputPathYes
workspaceIdYes
fontStrategyNo
manifestPathYes
sanitizeModeNopreserve-local
dependencyPolicyNo
expectedRevisionYes

Output Schema

NameRequiredDescription
manifestYes
revisionYes
outputPathYes
manifestPathYes
manifestRevisionYes

TDQS

B3.2/5.0
Behavior4/5

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

Annotations only declare destructiveHint=false, and the description adds substantial behavior beyond that: it discloses the produced artifacts (sanitized SVG plus a conversion manifest), that exactly one page is processed, and that non-default importers are capability-gated modes carrying fidelity warnings. It does not cover failure handling or the revision-safety behavior, but this is meaningful added context given the thin annotation set.

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?

Two dense, front-loaded sentences that lead with the core action and outcome, then add the mode caveat. No filler, though the second sentence is jargon-heavy and could read as an afterthought rather than actionable guidance.

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

Completeness3/5

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

An output schema exists, so return values need no explanation, and the description establishes the general workflow (import one page to sanitized SVG + manifest). However, for a 10-parameter tool with nested objects it omits why expectedRevision is required, what the dependencyPolicy does, and how mode capability-gating affects the call, so an agent still lacks enough to invoke it confidently.

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 carries the full burden, yet it only indirectly gestures at mode, page, sanitize/output, and manifestPath. It never explains fontStrategy (six enum values), the nested dependencyPolicy, or the required expectedRevision hash, leaving required parameters undocumented in both schema and prose.

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?

States a specific verb (Imports) and resource (exactly one page of a workspace-local PDF) with a clear output (sanitized SVG and conversion manifest), which separates it from the SVG/raster/PostScript/EMF import siblings. It stops short of distinguishing itself from the generic document_import, but the PDF specificity and one-page scope are precise.

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 names the three importers (Inkscape/internal/Poppler) but never says when to pick this tool over document_import, document_import_svg, or the other import siblings, nor when to choose internal vs Poppler. 'Capability-gated' hints that document_import_capabilities should be consulted first, but no alternative or condition is stated explicitly.

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

document_import_postscriptB

Imports one trusted workspace-local EPS or PostScript file through the observed local Inkscape capability into a sanitized SVG and conversion manifest. It never accepts arbitrary native formats or arguments.

NameRequiredDescriptionDefault
pathYes
formatYes
outputPathYes
workspaceIdYes
manifestPathYes
sanitizeModeNopreserve-local
dependencyPolicyNo
expectedRevisionYes

Output Schema

NameRequiredDescription
manifestYes
revisionYes
outputPathYes
manifestPathYes
manifestRevisionYes

TDQS

B3.4/5.0
Behavior3/5

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

With only destructiveHint=false in the annotations, the description carries the burden and adds useful guardrail context: the source must be workspace-local and trusted, output is sanitized, and no arbitrary arguments are accepted. It does not, however, disclose what sanitizeMode or dependencyPolicy actually change, whether existing outputPath/manifestPath contents are overwritten, or how expectedRevision concurrency failures behave.

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?

Two tight sentences with the operation and scope front-loaded; the second sentence's format/argument restriction is a meaningful guardrail rather than filler. Slightly dense phrasing ('observed local Inkscape capability') costs a little, but there is no waste.

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 an output schema exists so return values need not be described, an 8-parameter, 6-required import tool with a nested policy object and a revision token is under-documented when the description explains none of the optional knobs or failure modes. It is enough to identify the tool but not enough to invoke it confidently.

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% across 8 parameters, including a nested dependencyPolicy object, two enums, and a concurrency token, so the description must compensate and largely does not. It gestures at path/format/workspaceId ('one trusted workspace-local EPS or PostScript file') but says nothing about sanitizeMode, dependencyPolicy, outputPath, manifestPath, or expectedRevision semantics.

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

Purpose5/5

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

The description gives a specific verb (imports) and resource (one trusted workspace-local EPS or PostScript file) and states the resulting artifacts (sanitized SVG plus conversion manifest). The explicit format restriction distinguishes it from the many sibling importers (document_import_svg, document_import_pdf, document_import_emf, document_import_raster) without needing to name them.

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?

Usage is implied rather than stated: the agent can infer this is the importer for EPS/PS sources only, and the 'never accepts arbitrary native formats or arguments' line functions as a partial when-not clause. There is no explicit guidance on when to pick this over document_import or document_import_capabilities, and no prerequisites (e.g., that Inkscape must be available) are called out.

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

document_import_rasterA

Imports one workspace-local uncompressed BMP/TIFF/TGA, PNG, JPEG, GIF, or WebP as a new SVG document with a byte-sniffed, megapixel-bounded raster wrapper and conversion manifest. It can embed the approved bytes or retain one workspace-local relative link; it never fetches a URL.

NameRequiredDescriptionDefault
pathYes
embeddingNoembed
outputPathYes
workspaceIdYes
manifestPathYes
expectedRevisionYes

Output Schema

NameRequiredDescription
manifestYes
revisionYes
outputPathYes
manifestPathYes
manifestRevisionYes

TDQS

A4/5.0
Behavior4/5

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

With only destructiveHint=false in annotations, the description carries most of the burden and does it well: byte-sniffing, megapixel bounding, embed-vs-link behavior, and the conversion manifest are all disclosed. It omits what expectedRevision (optimistic concurrency) implies for behavior on a stale revision, which is a notable gap for a write 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?

Two tightly packed sentences with the format scope, output artifact, and safety constraint front-loaded; every clause adds information and nothing is redundant.

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

Completeness3/5

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

An output schema exists, so return values need not be described. However, for a 5-required-parameter mutation tool with 0% schema coverage, the missing explanation of expectedRevision, outputPath, and manifestPath leaves the agent guessing at required semantics.

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% across 6 parameters, so the description must compensate. It explains the embedding enum values ('embed the approved bytes or retain one workspace-local relative link') but leaves path, outputPath, manifestPath, workspaceId, and especially the required expectedRevision undocumented in any human-readable form.

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?

Specific verb ('Imports') plus a precisely enumerated resource set (BMP/TIFF/TGA/PNG/JPEG/GIF/WebP) and a clearly stated outcome (a new SVG document with raster wrapper and conversion manifest). It is immediately distinguishable from the sibling importers (document_import_svg, document_import_postscript, document_import_emf, document_import_pdf) by format.

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?

Format restrictions and the 'never fetches a URL' exclusion give a clear context for use and implicitly route the agent among the import siblings. It does not, however, explicitly say when to prefer this over document_import or document_import_capabilities, so it stops short of full when/alternatives guidance.

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

document_import_svgA

Imports one workspace-local SVG into a new sanitized SVG document. Scripts, event handlers and forbidden external references are removed according to the selected policy.

NameRequiredDescriptionDefault
pathYes
outputPathYes
workspaceIdYes
sanitizeModeNopreserve-local
expectedRevisionYes

Output Schema

NameRequiredDescription
removedYes
revisionYes
outputPathYes

TDQS

A3.6/5.0
Behavior4/5

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

Annotations only provide destructiveHint=false, so the description carries most of the behavioral burden and it does disclose the substantive effect: scripts, event handlers, and forbidden external references are removed, and the result is a NEW document (non-destructive). It still does not elaborate on what the 'selected policy' does or any permission requirements, but the sanitization behavior is concrete and useful.

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 tightly written sentences, front-loaded with the core action and immediately followed by the sanitization behavior. No filler or redundancy.

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

Completeness3/5

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

An output schema exists, so return values need no explanation, and the behavioral clause is present. However, for a 5-parameter mutating import (4 required, including a revision/concurrency token and a policy enum) with 0% schema coverage, the description leaves key parameter semantics undocumented.

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 names no parameters. It gestures at 'selected policy' (sanitizeMode), 'workspace-local' (path/workspaceId), and 'new document', but leaves expectedRevision, outputPath, and the sanitizeMode enum values unexplained, so it fails to compensate for the coverage 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?

States a specific verb ('Imports') with a precise resource ('one workspace-local SVG') and a defined output ('a new sanitized SVG document'). The SVG/format specificity inherently distinguishes it from siblings like document_import_raster, document_import_pdf, document_import_emf, and document_import_postscript.

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 never states when to choose this tool over the generic document_import or the other format-specific importers, nor any exclusions or prerequisites. The only hint is the 'workspace-local' qualifier, which is a scope detail rather than usage guidance.

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

document_inspectB
Read-only

Reads SVG settings and a bounded, redacted design inventory from an authorized document without mutating it.

NameRequiredDescriptionDefault
pathYes
levelNostandard
workspaceIdYes
inventoryKindsNo
inventoryLimitNo
inventoryOffsetNo
expectedRevisionNo
includeVisualBoundsNo

Output Schema

NameRequiredDescription
pagesYes
widthYes
heightYes
viewBoxYes
revisionYes
warningsYes
inventoryNo
resourcesYes
widthUnitYes
heightUnitYes
visualBoundsNo
normalizationYes
inspectionLevelYes
ambiguousViewportYes

TDQS

B3.1/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, and the description adds real context beyond that: the document must be authorized, the inventory is bounded and redacted, and the operation is non-mutating. Redaction and bounding are behaviorally meaningful and not derivable from the annotations. It does not, however, say what authorization means or what the bounds are.

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?

A single well-formed sentence with the verb and scope front-loaded and no filler. It is dense but not padded; the only nit is that it compresses several ideas into one clause chain rather than separating them.

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?

An output schema exists, so return values are covered, but an 8-parameter tool with a constrained enum, regex-validated ids, and an optimistic-concurrency field (expectedRevision) is under-described. The description communicates the spirit of the operation without the detail needed to invoke it correctly on the first attempt.

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% across 8 parameters, so the description carries the full burden and mostly fails it. "Bounded" loosely gestures at inventoryLimit/inventoryOffset and "redacted" at inventoryKinds, but the level enum (summary/standard/deep), expectedRevision, and includeVisualBounds are never explained, and none of the required path/workspaceId constraints are surfaced.

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 gives a specific verb ("Reads") and a concrete resource pair ("SVG settings and a bounded, redacted design inventory"), plus a scope qualifier ("authorized document without mutating it"). An agent can tell this is an inspection tool rather than a mutation tool, though it never names a sibling to contrast with.

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 when-to-use statement and no mention of alternatives such as document_snapshot, document_settings, or accessibility_inspect, which are plausible near-neighbors in the sibling list. The read-only framing implies inspection but leaves routing entirely to inference.

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

document_normalize_idsB
Destructive

Explicitly normalizes invalid or duplicate SVG IDs and rewrites supported local href, URL, ARIA and CSS references. Existing valid unique IDs remain unchanged.

NameRequiredDescriptionDefault
pathYes
prefixNosvg
workspaceIdYes
assignMissingIdsNo
expectedRevisionYes

Output Schema

NameRequiredDescription
renamedYes
revisionYes
backupCreatedYes

TDQS

B3.2/5.0
Behavior4/5

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

Annotations declare only destructiveHint=true; the description usefully adds the exact mutation surface (which reference types get rewritten) and the no-op guarantee that already-valid unique IDs are untouched. That is real added context on top of the annotation, though it omits revision-conflict behavior despite the required expectedRevision parameter.

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 short sentences, mutation scope front-loaded, preservation guarantee second. No filler, no restatement of the name, nothing that could be cut.

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?

For a destructive, revision-guarded mutation with five undocumented parameters, the description covers what happens to IDs but not the conditions for calling it safely. With 0% schema coverage it should explain at least the prefix and assignMissingIds semantics; the output schema does relieve it of describing return values.

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% across five parameters, so the schema gives no meaning for path, workspaceId, prefix, assignMissingIds, or expectedRevision. The description loosely implies missing IDs may be assigned ('invalid or duplicate IDs') but never explains prefix defaults, the assignMissingIds toggle, or the revision-matching requirement, so it fails to compensate for the coverage gap.

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 gives a concrete verb+resource ('normalizes invalid or duplicate SVG IDs') plus the scope of side effects ('rewrites supported local href, URL, ARIA and CSS references'). It is clearly distinguishable in content from vague siblings like defs_vacuum or document_optimize, but it never names or contrasts with an alternative tool, so it stops short of the 5 tier.

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?

Beyond the adverb 'Explicitly' hinting that normalization is a deliberate opt-in step, there is no when-to-use, when-not-to-use, or alternative guidance. An agent cannot tell from the text whether to call this before export, as part of an import cleanup, or instead of defs_vacuum/document_optimize.

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

document_optimizeB

Plans or writes a derived SVG that removes only unused top-level definitions. Publication requires a deterministic Inkscape visual-regression render; the source document is never modified.

NameRequiredDescriptionDefault
pathYes
dryRunNo
outputPathNo
workspaceIdYes
visualToleranceNo
expectedRevisionNo
expectedOutputRevisionNo

Output Schema

NameRequiredDescription
dryRunYes
revisionNo
outputPathYes
removedIdsYes
candidateIdsYes
visualRegressionNo

TDQS

B3.3/5.0
Behavior4/5

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

Annotations only declare destructiveHint=false, so the description adds real value by stating 'the source document is never modified' and disclosing the out-of-band dependency on an Inkscape visual-regression render before publication. It still doesn't say what happens if the render mismatches or what gets written to the derived output.

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?

Two dense sentences with the core action front-loaded and zero filler. The second sentence is slightly jargon-heavy but earns its place by conveying the render gate and non-destructive guarantee.

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?

An output schema exists so return values need no explanation, but for a 7-parameter tool with 0% schema coverage and revision-tracking parameters, the description leaves too much undocumented. It also omits any differentiation from the overlapping 'defs_vacuum' sibling, leaving the agent unable to confidently select this 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% across 7 parameters, so the description carries the full burden. It only gestures at dryRun ('Plans or writes') and outputPath ('derived SVG'); visualTolerance, expectedRevision, and expectedOutputRevision are entirely unexplained despite having constrained ranges and patterns.

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?

States a specific action pair ('Plans or writes a derived SVG') and a precise scope constraint ('removes only unused top-level definitions'), which an agent can act on. It fails to differentiate from the sibling 'defs_vacuum', which appears to operate on the same domain, so it falls short of 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 mention that 'Publication requires a deterministic Inkscape visual-regression render' implies a two-phase plan/commit workflow, which is useful context. However, there is no explicit statement of when to use this versus 'defs_vacuum' or when dryRun should be toggled, leaving routing to inference.

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

document_page_adjustC
Destructive

Crops, expands or changes page orientation with explicit physical margins, preserving object geometry.

NameRequiredDescriptionDefault
pathYes
unitYes
actionYes
anchorNotop_left
marginsNo
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
pageYes
revisionYes
warningsYes
backupCreatedYes

TDQS

C2.9/5.0
Behavior3/5

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

destructiveHint=true already warns that this mutates irreversibly, but the description does not say what is destroyed (content outside cropped margins) or why expectedRevision is required for concurrency safety. It does add one useful trait beyond the annotations: object geometry is preserved rather than rescaled, which helps distinguish it from resize.

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?

A single dense sentence with zero filler and the operations front-loaded before the invariant. Efficient, though the compression is partly what leaves the behavioral and parameter gaps unaddressed.

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?

For a destructive 7-parameter mutation tool with 0% schema description coverage, the description is far too thin. Even granting that the output schema covers return values, an agent gets no help on unit/anchor interaction, crop vs expand semantics, or the revision-check workflow.

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% across 7 parameters. The description only gestures at margins being 'explicit physical margins', mapping loosely to the margins and unit fields, and says nothing about the action enum values, anchor alignment, path, workspaceId, or expectedRevision semantics.

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?

Names three specific operations (crop, expand, toggle orientation) on a specific resource (page) with a stated invariant (preserving object geometry). It is clearly distinguishable from a generic resize, but it never names the closest siblings (document_resize, document_fit_page) to draw the boundary.

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 choose this over document_resize, document_fit_page, or images_crop, nor any mention of prerequisites such as needing the current revision or being scoped to a workspace. The agent must infer selection from the name alone.

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

document_pagesB
Destructive

Lists or safely changes explicit Inkscape 1.4 pages by stable page ID. Mutations require the current document revision.

NameRequiredDescriptionDefault
pageNo
pathYes
patchNo
actionYes
pageIdNo
pageIdsNo
workspaceIdYes
expectedRevisionNo

Output Schema

NameRequiredDescription
pagesYes
revisionYes

TDQS

B3.1/5.0
Behavior3/5

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

Annotations supply only destructiveHint=true, so the description must carry more weight than it does. It does add genuine context beyond the annotation — optimistic-concurrency via "current document revision" and stable-ID addressing — but never says which of the five actions actually destroys data (delete), nor what "safely" guarantees.

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?

Two sentences, zero filler, with the operation scope front-loaded and the mutation precondition second. The only soft spot is the vague adverb "safely," which costs a word without adding testable meaning.

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?

An output schema exists, so return values needn't be described, but for a tool with five actions, nested page/patch objects, and three required parameters, two sentences is far too thin. Which parameter applies to which action, and the irreversibility of delete, are not covered anywhere structured.

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% across 8 parameters, including two nested objects, so the description must compensate and mostly doesn't. It only hints at pageId/pageIds ("stable page ID") and expectedRevision ("current document revision"), leaving page, patch, action values, and workspaceId unexplained for a 5-action tool.

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?

States a specific verb pair ("Lists or safely changes") and a concrete resource ("explicit Inkscape 1.4 pages"), plus a key qualifier: addressing is by stable page ID. That distinguishes it from ID-churn operations like document_normalize_ids, though it does not separate itself from the adjacent document_page_adjust / document_page_validate siblings.

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?

Provides one real prerequisite (mutations require the current document revision), which tells the agent to fetch a revision first. It gives no when-to-use-vs-alternatives guidance, so the agent cannot tell from the description why to pick this over document_page_adjust or document_page_validate.

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

document_page_validateB
Read-only

Validates explicit Inkscape page overlap, empty pages and objects outside every page using native visual bounds.

NameRequiredDescriptionDefault
pathYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
pagesYes
revisionYes
warningsYes
validationYes
boundsFidelityYes

TDQS

B3/5.0
Behavior3/5

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

readOnlyHint=true already tells the agent this is a safe inspection. The description adds genuinely useful method context ('using native visual bounds'), clarifying the basis of the geometric checks. It stops short of describing what a failed validation yields or whether it mutates anything, but with annotations carrying the safety profile a 3 is fair.

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?

A single dense sentence that front-loads the verb and enumerates the checks in order of importance. No filler, though the phrase is packed enough that it verges on hard to parse.

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

Completeness3/5

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

An output schema exists, so return values need no explanation, and readOnlyHint covers safety. The gap is the unconveyed expectedRevision contract and any behavior on revision mismatch, which matter for correct invocation of a 3-required-parameter 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% across three required parameters, so the schema contributes no semantics. The description explains none of them, and notably ignores expectedRevision, whose 64-hex pattern strongly implies an optimistic-concurrency/revision-match contract that the agent cannot learn from anywhere else.

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?

States a specific verb ('Validates') plus three concrete checks: page overlap, empty pages, and objects outside every page. An agent knows exactly what condition set is tested. It does not, however, distinguish itself from the closely related sibling document_preflight, which likely performs a similar validation pass.

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 on when to run this versus document_preflight, document_inspect, or document_pages, and no mention of prerequisites such as needing a workspace-bound path. Usage must be inferred entirely from the name and description.

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

document_preflightB
Read-only

Runs a read-only basic, web, print, or interchange preflight without opening linked resources.

NameRequiredDescriptionDefault
pathYes
bleedNo
profileNobasic
workspaceIdYes

Output Schema

NameRequiredDescription
printNo
validYes
issuesYes
profileYes

TDQS

B3.2/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, and the description usefully corroborates and extends this: it repeats 'read-only' and adds the meaningful constraint that linked resources are not opened, so the caller knows external assets won't be fetched or mutated. It stops short of describing cost, error reporting, or pagination-like behaviors.

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 front-loaded sentence with no filler; the read-only and no-linked-resource qualifiers are packed into the same clause rather than padding the description.

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 four parameters, a nested bleed object, and 0% schema coverage, the description is too thin: it never explains what bleed/behavior mean or how path and workspaceId are expected to be supplied. The existence of an output schema excuses it from describing return values, but the input side remains under-specified for a non-trivial 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%, so the description carries the full burden, yet it only restates the profile enum values already visible in the schema. The nested bleed object (behavior enum, per-side unit/value pairs) and the workspaceId pattern requirement get no explanation at all.

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?

States a specific verb (runs) and resource (preflight) and enumerates the supported profiles (basic, web, print, interchange), which is more than a tautology. It does not explicitly distinguish itself from the sibling fonts_preflight, leaving that distinction to be inferred from the name.

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 statement of when to run a preflight versus alternatives like document_inspect, document_page_validate, or fonts_preflight, nor any prerequisites such as when a profile should be chosen. The profile list hints at a selection decision but offers no guidance on making it.

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

document_render_previewB

Renders a bounded transparent PNG preview through Inkscape without changing the source document. Small results are returned inline and every preview is saved to an authorized workspace path.

NameRequiredDescriptionDefault
areaNopage
pathYes
widthNo
heightNo
pageIdNo
outputPathYes
selectionIdNo
workspaceIdYes
expectedRevisionYes
expectedOutputRevisionNo

Output Schema

NameRequiredDescription
areaYes
cacheYes
widthYes
heightYes
inlineYes
pageIdNo
artifactYes
revisionYes
selectionIdNo
documentPathYes

TDQS

B3.2/5.0
Behavior4/5

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

Annotations supply only destructiveHint=false, so the description carries most of the burden and delivers real value: non-destructive ('without changing the source document'), transparency, inline return for small results, and a defined save destination ('authorized workspace path'). It stops short of permissions, rate limits, or failure behavior.

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

Conciseness5/5

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

Two tight sentences, front-loaded with the core action and followed by the output behavior. No filler or repetition.

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?

An output schema exists, so return values need not be described, but for a 10-parameter tool with 0% schema coverage and minimal annotations the description leaves major gaps — notably optimistic-concurrency revisions and selection/area targeting. It is not complete enough for an agent to invoke confidently without reading the schema.

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% across 10 parameters, so the description must compensate and largely does not. Only 'bounded' vaguely gestures at the width/height limits and 'workspace path' at outputPath/workspaceId; the concurrency semantics of expectedRevision/expectedOutputRevision and the meaning of area/pageId/selectionId are unexplained.

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?

States a specific verb and resource ('Renders a ... PNG preview') with useful scope qualifiers ('bounded', 'transparent', 'without changing the source document'). It does not explicitly distinguish itself from siblings like export_png or document_export, so an agent must infer the preview-vs-export distinction.

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 when-to-use guidance, no named alternatives, and no conditions for choosing this over export_png or other render/export siblings. Usage is only implied by the word 'preview'.

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

document_resizeB
Destructive

Changes the SVG page size with page_only semantics while preserving element geometry, returning a bounded semantic diff. Requires the current document revision.

NameRequiredDescriptionDefault
modeNopage_only
pathYes
unitYes
widthYes
anchorNo
dryRunNo
heightYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
diffYes
dryRunYes
revisionYes
warningsYes
predictedNo
backupCreatedYes
contentFidelityYes
contentLimitationsYes

TDQS

B3.3/5.0
Behavior4/5

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

With only destructiveHint=true provided, the description usefully adds that element geometry is preserved, that the return is a bounded semantic diff, and that the current revision is required. That said, it doesn't explain what is actually destroyed or how the destructive mode variants behave, so it stops short of full disclosure.

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 dense sentences with the core operation, its semantics, and its prerequisite front-loaded. No filler or redundancy.

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

Completeness3/5

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

The output schema covers the semantic diff, so return values needn't be re-explained, but with 9 parameters at 0% coverage and no sibling differentiation, the description is thin for a complex mutation tool. Key parameters (unit, anchor, dryRun) remain unexplained.

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% across 9 parameters, so the description must carry the load, but it only clarifies mode ('page_only') and alludes to revision. It says nothing about unit, anchor, dryRun, path, or workspaceId, leaving most parameters undocumented.

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?

States a specific verb+resource (changes the SVG page size) with a scoping qualifier (page_only semantics) and the preservation guarantee. However, it does not distinguish itself from plausible siblings like document_page_adjust or document_fit_page, leaving the agent to open schemas to disambiguate.

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 when-to-use or when-not-to-use guidance, and no alternative tool is named despite several page-related siblings. The only conditional information is the prerequisite (requires current revision), which is implied rather than framed as selection criteria.

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

document_restoreB
Destructive

Restores an owner-bound snapshot only when the current document revision matches exactly.

NameRequiredDescriptionDefault
pathYes
snapshotIdYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
revisionYes
backupCreatedYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations supply only destructiveHint=true, so the description carries most of the burden. It usefully discloses the exact-revision precondition and implies an ownership/authorization boundary via 'owner-bound', but it never says what happens to existing content, whether the restore is reversible, or how a revision conflict surfaces.

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?

One sentence, zero filler, and the gating precondition is front-loaded. It is efficient, though arguably too terse given the undocumented parameters it should be compensating for.

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

Completeness3/5

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

An output schema exists, so return values need not be explained. However, for a destructive, 4-parameter operation with no annotation depth and 0% schema coverage, the description leaves the parameter contract and failure behavior unaddressed.

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% — none of the four required parameters (path, snapshotId, workspaceId, expectedRevision) are documented in the schema. The description only indirectly gestures at expectedRevision via 'current document revision' and at workspaceId via 'owner-bound'; it adds no meaning for path or snapshotId and no format guidance despite strict patterns.

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?

States a specific verb ('Restores') and resource ('owner-bound snapshot'), which separates it from sibling document_snapshot and document_import tools. The scope is clear, though 'owner-bound' is unexplained jargon that an agent may not decode.

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 gives one real precondition: the current document revision must match exactly. That is usable guidance, but there is no explicit when-not clause, no naming of alternatives (e.g. re-snapshotting instead of restoring), and no statement of what to do on mismatch.

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

document_settingsA
Destructive

Reads or updates typed Inkscape page, desk and border display settings. Updates require the current document revision.

NameRequiredDescriptionDefault
pathYes
settingsNo
workspaceIdYes
expectedRevisionNo

Output Schema

NameRequiredDescription
revisionYes
settingsYes

TDQS

A3.5/5.0
Behavior3/5

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

The only annotation is destructiveHint=true, and the description does add real behavioral context beyond it: updates require the current document revision, implying optimistic concurrency. It does not disclose permission needs, what read mode returns, or what happens to settings fields not supplied.

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, zero filler, and the read/write nature is front-loaded before the write prerequisite. Every clause earns its place.

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

Completeness3/5

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

An output schema exists so return values need not be explained. Yet for a tool that both reads and mutates with destructiveHint=true, 0% schema coverage, and a nested settings object, the description omits auth requirements and merge/replace semantics for supplied settings.

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 0% across four parameters, so the description carries the burden. It partially compensates by naming the settings domains (page, desk, border) and explaining expectedRevision as 'the current document revision', but says nothing about path or workspaceId semantics.

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?

States a concrete verb pair and resource: reads/updates Inkscape page, desk and border display settings. This distinguishes it from neighbors like guides_grids_manage and document_page_adjust, though the read/write dual nature and 'typed' remain slightly vague.

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 prerequisite for writes is given ('Updates require the current document revision'), which is useful. However, there is no guidance on when to choose this over sibling tools such as document_page_adjust or guides_grids_manage, and no when-not conditions.

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

document_snapshotA

Creates an opaque, owner-bound snapshot of a document after verifying its exact revision.

NameRequiredDescriptionDefault
pathYes
ttlMsNo
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
revisionYes
snapshotIdYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations only declare destructiveHint=false; the description adds meaningful context about revision verification, owner-binding, and opacity. However it omits whether the snapshot fails on revision mismatch, TTL expiry behavior, or storage/auth implications of ownership.

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?

A single well-formed sentence with the verification precondition front-loaded. No waste, though it packs two concepts (creation and verification) that could be clarified.

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?

Output schema exists, so return values need no explanation. The description covers the essential precondition and mutation semantics for a 4-param mutation tool; only failure modes on revision mismatch remain unstated.

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 0% across 4 parameters, but the schema itself enforces constraints (pattern, min/max, default) that document syntax well. The description names only 'revision' semantics; ttlMs, workspaceId, and path carry no added meaning beyond the schema. Baseline 3 per high structured enforcement.

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?

States a specific verb and resource: 'Creates... snapshot of a document.' The 'opaque, owner-bound' qualifiers distinguish it from export/render siblings, though it doesn't name an alternative tool. A clear, self-contained purpose.

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?

Implies use via 'after verifying its exact revision', suggesting optimistic-concurrency use, but gives no explicit when-to-use vs alternatives (e.g., vs document_render_preview or export tools) and no 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.

elements_alignB
Destructive

Aligns SVG elements to a selection, page, coordinate or another element using Inkscape visual bounds; selected ancestors and descendants are rejected.

NameRequiredDescriptionDefault
idsYes
pathYes
anchorNo
alignmentYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
movesYes
revisionYes
alignmentYes
backupCreatedYes

TDQS

B3.4/5.0
Behavior4/5

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

The annotation set only carries destructiveHint=true, so the description adds real value by disclosing that alignment is computed against Inkscape visual bounds and that selected ancestors and descendants are rejected. It is consistent with the destructive hint (alignment mutates positions) but does not elaborate on what state is altered.

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?

A single front-loaded sentence that leads with the action and target, with no filler. The ancestor/descendant rejection clause is somewhat compressed into the same sentence but remains readable.

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

Completeness3/5

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

An output schema exists so return values need not be explained, and the base purpose is covered. However, for a 6-parameter mutation tool with 0% schema description coverage, nothing explains ids/path selection semantics or the concurrency role of expectedRevision, leaving material gaps.

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% across 6 parameters. The mention of selection/page/coordinate/element merely restates the anchor oneOf const values already encoded in the schema and says nothing about the alignment enum, ids, path, expectedRevision, or workspaceId. With near-zero schema coverage, the description does not compensate.

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?

States a specific verb (Aligns) and resource (SVG elements) and enumerates the four anchor targets (selection, page, coordinate, another element), so the operation is concrete. It does not explicitly contrast itself with near-siblings like elements_arrange or elements_distribute, so it falls short of full sibling differentiation.

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?

Usage is implied by the enumeration of anchor targets, and the rejection of ancestors/descendants hints at a precondition, but there is no explicit when-to-use guidance, no statement of prerequisites (e.g., expectedRevision/workspaceId requirements), and no routing to alternatives such as elements_arrange.

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

elements_arrangeA
Destructive

Moves same-parent SVG elements to front, back, one step, a deterministic sibling index, or immediately before/after a sibling.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
idsYes
indexNo
actionYes
revisionYes
relativeToNo
backupCreatedYes

TDQS

A3.7/5.0
Behavior2/5

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

The only annotation is destructiveHint=true; the description adds no behavioral context beyond restating that elements move. It never mentions that ordering changes are persisted mutations requiring expectedRevision for optimistic-concurrency conflict detection, whether the operation is atomic across multiple ids, or what happens when ids are not siblings. For a destructive mutation tool these are real gaps.

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 front-loaded sentence with the verb first and the operation enumeration in the same breath. No filler, no restatement of the tool name, and every clause carries information.

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

Completeness3/5

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

An output schema exists so return values need not be explained, and the action semantics are covered. However, for a destructive, revision-guarded mutation with a 3-branch oneOf contract, the description omits the mutation/conflict model and error conditions, leaving the agent to infer the write semantics from the schema alone.

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

Parameters4/5

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

Schema description coverage is 100%, so baseline is 3, but the description adds meaning beyond the raw enum values: it clarifies that lower/raise are "one step", that index is "deterministic" sibling placement, and that before/after acts relative to a sibling. This maps the three oneOf branches to intent, though it says nothing about ids, path, or expectedRevision format constraints.

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

Purpose5/5

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

States a specific verb ("Moves") plus a precise resource and constraint ("same-parent SVG elements"), then enumerates the full operation space: front, back, one step, deterministic sibling index, before/after. This z-order semantics is clearly distinguishable from spatial siblings like elements_align or elements_distribute without opening any schema.

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 action vocabulary implies when each mode applies, but there is no explicit guidance on when to choose elements_arrange over elements_align, elements_distribute, or elements_transform, and no stated preconditions (e.g. that elements must share a parent). Usage 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.

elements_createC
Destructive

Creates a bounded batch of typed SVG basic shapes without accepting XML or arbitrary attributes.

NameRequiredDescriptionDefault
pathYes
elementsYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
idsYes
revisionYes
backupCreatedYes

TDQS

C2.9/5.0
Behavior3/5

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

With only destructiveHint=true annotated, the description adds some context ('bounded batch' implies an item cap, and the no-XML/arbitrary-attributes constraint is a real behavioral limit). However, it does not explain the destructive nature flagged by the annotation, nor the concurrency role of expectedRevision. It neither contradicts the annotation nor fully discharges the burden the annotation leaves.

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?

A single front-loaded sentence with the verb first and no filler. It is efficient, though the brevity comes at the cost of the missing details noted elsewhere.

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?

For a tool with 100+ nested shape variants, four required params, and only a destructiveHint annotation, one sentence is thin. The output schema covers return values, but the description omits expectedRevision semantics, the destructive/optimistic-locking behavior, and where elements are placed, so an agent lacks enough context to invoke it confidently.

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% with four required parameters (elements, expectedRevision, path, workspaceId), so the description must compensate and largely fails to. It alludes to the 'batch' of shapes but says nothing about expectedRevision conflict handling, path scoping, or workspaceId, leaving critical call semantics undocumented.

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 a specific verb and resource ('Creates a bounded batch of typed SVG basic shapes') and adds a meaningful scope qualifier ('without accepting XML or arbitrary attributes') that implicitly contrasts with import-based siblings like document_import_svg. It stops short of naming an alternative explicitly, so it is clear but not sibling-differentiating at the highest level.

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 when-to-use guidance and no reference to alternatives such as elements_update, elements_duplicate, or document_apply_operations. Usage is only weakly implied by the verb 'Creates', leaving the agent to infer when this tool is the correct choice over the many other element-mutation siblings.

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

elements_deleteB
Destructive

Deletes explicitly selected SVG elements and rejects deletions that would leave fragment references broken.

NameRequiredDescriptionDefault
idsYes
pathYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
revisionYes
deletedIdsYes
backupCreatedYes

TDQS

B3.2/5.0
Behavior4/5

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

Annotations only state destructiveHint=true; the description adds a genuinely non-obvious behavioral rule — deletions that would break fragment references are rejected, so the agent can expect partial/blocked failure modes. It still omits cascade behavior for child elements and how expectedRevision conflicts are handled.

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?

One sentence, front-loaded with the action and resource, with no filler. It is tight, though the brevity contributes to the parameter and usage gaps rather than compensating for them.

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

Completeness3/5

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

An output schema exists, so return values need not be described, and the destructive hint is covered. However, for a four-parameter mutation with a required concurrency token and no schema descriptions, an agent still lacks enough to call it correctly without inspecting the schema.

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 coverage is 0% across four required parameters. The description only implies that 'ids' are explicit element identifiers; it says nothing about expectedRevision (optimistic-concurrency token), path, or workspaceId, leaving most parameters undocumented in both places.

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?

Specific verb + resource: 'Deletes ... SVG elements.' The qualifier 'explicitly selected' usefully narrows scope (ID-based, not query-based deletion), which separates it from siblings like elements_query or elements_update without naming them.

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 when-to-use or when-not guidance and no alternatives named. An agent gets no help deciding between this, elements_update, document_apply_operations, or defs_vacuum, nor any prerequisite about resolving element IDs before deletion.

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

elements_distributeB
Destructive

Distributes SVG elements by visual edges, centres or gaps using native Inkscape bounds, preserving the first and last element on the chosen axis.

NameRequiredDescriptionDefault
idsYes
axisYes
modeYes
pathYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
axisYes
modeYes
movesYes
revisionYes
backupCreatedYes

TDQS

B3/5.0
Behavior3/5

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

Annotations declare destructiveHint=true, so the mutation profile is already flagged. The description still adds real behavioral value by disclosing that spacing is computed from 'native Inkscape bounds' and that the first and last element are pinned on the chosen axis — a non-obvious outcome. It omits the concurrency/revision guard and the minimum-three-element requirement.

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?

A single tight sentence that front-loads the verb and packs mode meanings plus the endpoint-preservation behavior without filler. Slightly dense, but nothing is wasted.

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

Completeness3/5

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

An output schema exists, so return values need no explanation, and annotations cover the destructive profile. However, for a six-param mutation tool with zero schema descriptions, leaving the revision/workspace contract and the 3-element minimum undocumented is a meaningful gap.

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 carries the full burden, yet it only illuminates two of six parameters: axis ('chosen axis') and mode (edges/centres/gaps). The ids, path, workspaceId, and expectedRevision parameters — including the 3–100 count constraint and the 64-hex revision token — get no explanation anywhere.

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?

States a specific verb and resource ('distributes SVG elements') and enumerates the three operative modes (visual edges, centres, gaps), which separates it from a generic transform. It does not name or contrast with the closest sibling, elements_align, so the agent must infer the align-vs-distribute boundary.

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 explains what distribution does but never says when to reach for it instead of elements_align or elements_arrange, nor what prerequisites apply. No explicit when/when-not guidance is present.

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

elements_duplicateB
Destructive

Duplicates a bounded SVG subtree with deterministic local-ID remapping, or creates an explicit SVG use clone. Only internal fragment references in a copied subtree are rewritten; malformed source IDs must be normalized first.

NameRequiredDescriptionDefault
idYes
modeYes
pathYes
newIdYes
parentIdNo
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
idYes
modeYes
revisionYes
remappedIdsYes
backupCreatedYes

TDQS

B3.4/5.0
Behavior4/5

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

With only destructiveHint=true available, the description adds meaningful behavior: deterministic local-ID remapping, the precise scope of reference rewriting ('Only internal fragment references in a copied subtree'), and a precondition on malformed IDs. It does not explain why the operation is flagged destructive or what document state changes occur, which keeps it from a 5.

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?

Two dense sentences with no filler, and the core action is front-loaded before the constraint. The second sentence packs edge-case detail ('only internal fragment references... rewritten') that is somewhat compressed but still earns its place.

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

Completeness3/5

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

An output schema exists, so return values need not be described, and the description supplies solid behavioral context for a mutation tool. The notable gap is parameter semantics for a 7-param required-heavy schema, plus no explanation of the destructive annotation, leaving the definition only partially complete.

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% across 7 parameters, so the description must compensate but only gesture at 'mode' via copy/use and 'id' via the malformed-ID precondition. newId, parentId, path, workspaceId, and expectedRevision are left entirely undocumented, so most parameters lack semantic guidance.

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 uses a specific verb ('Duplicates') plus resource ('bounded SVG subtree') and names the alternative behavior ('or creates an explicit SVG use clone'), making the two modes distinguishable. It does not explicitly name a sibling like elements_create to differentiate, so it stops short of 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?

It implies mode selection (copy vs use clone) and states a prerequisite ('malformed source IDs must be normalized first'), which routes the agent to document_normalize_ids. However, there is no explicit when-to-use vs when-not-to-use guidance relative to sibling creation/grouping tools.

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

elements_flatten_transformA
Destructive

Bakes each selected element's own axis-aligned translate/scale/matrix transform into safe primitive geometry. It rejects rotation, skew, paths and inherited transforms rather than changing SVG semantics.

NameRequiredDescriptionDefault
idsYes
pathYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
revisionYes
flattenedIdsYes
backupCreatedYes

TDQS

A3.5/5.0
Behavior4/5

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

Annotations only declare destructiveHint=true; the description adds real value by explaining what mutation occurs (transforms are replaced by baked geometry) and that unsupported inputs are rejected rather than silently altering SVG semantics. It does not disclose the revision-guard/concurrency behavior implied by expectedRevision.

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 tightly written sentences, front-loaded with the core action and followed by the constraint. Every clause earns its place with no filler.

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

Completeness3/5

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

Output schema exists so return values need no explanation, and the operation semantics are well covered. But for a destructive batch tool with four undocumented required parameters and a maxItems=100 constraint, the description leaves important operational context unaddressed.

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% across 4 required parameters, so the description must carry the burden and it does not. It says nothing about ids, path, workspaceId, or the optimistic-concurrency expectedRevision token, leaving an agent with no meaning beyond raw patterns.

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?

Names a specific verb (bakes) and resource (axis-aligned translate/scale/matrix transforms) and states the outcome (safe primitive geometry). An agent can distinguish it from elements_transform and paths_flatten by the 'own axis-aligned' scope, though no sibling is named explicitly.

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 rejection list (rotation, skew, paths, inherited transforms) functions as implicit when-not-to-use guidance, which is genuinely useful. However, it never says when to prefer this over siblings like elements_transform or paths_flatten, so the routing decision is left to inference.

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

elements_groupA
Destructive

Groups same-parent SVG elements or ungroups one non-layer group while preserving child order and rejecting broken href references.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
idsYes
actionYes
revisionYes
backupCreatedYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations only declare destructiveHint=true; the description adds genuinely useful behavior beyond that: child order is preserved, broken href references are rejected, and ungrouping is limited to a single non-layer group. It does not discuss atomicity or expectedRevision conflict behavior, keeping it out of 5 territory.

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?

A single dense sentence that front-loads the action and follows with the governing constraints. Every clause carries information, though the run-on construction packs three constraints together and slightly taxes readability.

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 annotations (destructiveHint) and an output schema present, the description need not explain return values, and it covers the mutation's constraints and failure mode (broken hrefs). It omits anything about revision/optimistic-concurrency failure, which the expectedRevision parameter implies but does not explain.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description contributes real constraints the schema cannot express: the grouped elements must share a parent, and ungroup operates on exactly one non-layer group. These operational rules materially guide correct invocation.

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?

States a specific verb+resource ('Groups ... SVG elements') and covers the inverse operation ('or ungroups'), so the dual group/ungroup nature mapped to the `action` enum is clear. It does not explicitly name a sibling it must be distinguished from (e.g. elements_reparent), so it falls short of 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?

Usage is implied through the two actions: grouping applies to 'same-parent' elements, ungrouping to 'one non-layer group'. There is no explicit statement of when to prefer this tool over siblings like elements_reparent, elements_arrange or elements_duplicate, nor any stated prerequisites.

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

elements_queryC
Read-only

Lists bounded SVG element summaries by IDs, type, layer, or one safe CSS compound selector without exposing arbitrary XML attributes.

NameRequiredDescriptionDefault
idsNo
pathYes
kindsNo
limitNo
offsetNo
layerIdNo
selectorNo
workspaceIdYes
includeBoundsNo
expectedRevisionNo
includeComputedStyleNo

Output Schema

NameRequiredDescription
totalYes
elementsYes
missingIdsYes

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so safety is partly covered. The description does add value beyond that: it discloses that results are 'bounded' and that arbitrary XML attributes are deliberately not exposed, and it constrains the selector to 'one safe CSS compound selector'. However, it omits pagination behavior, revision semantics, and the effect of the inclusion flags, so it only partially carries the behavioral burden.

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?

A single dense sentence front-loads the verb and resource with no filler. It is efficient, though the packing of four filter modes and two safety constraints into one clause makes it slightly hard to parse and leaves room for a short second sentence on usage.

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?

For an 11-parameter read tool, the description is thin: it lacks guidance on pagination, the meaning of expectedRevision and the inclusion flags, and any hint of usage context. The existence of an output schema excuses it from describing return values, but it does not excuse the missing parameter and selection guidance.

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% across 11 parameters, so the description must compensate and largely does not. It touches ids, kinds ('type'), layerId ('layer'), and selector, but says nothing about path, workspaceId, limit/offset pagination, includeBounds, includeComputedStyle, or the optimistic-concurrency expectedRevision. More than half the parameters remain undocumented in either location.

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?

States a specific verb (Lists) and resource (bounded SVG element summaries) plus the four filter dimensions (IDs, type, layer, selector). It clearly reads as the read/query counterpart to siblings like elements_create, elements_update, and elements_delete. It doesn't explicitly differentiate itself from document_inspect, but the element-scoped query purpose is unambiguous.

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 when-to-use or when-not-to-use guidance, nor any named alternative. Usage is only loosely implied by the mention of filter dimensions. An agent is left to infer that this is the discovery step before mutating elements with the elements_* siblings.

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

elements_remove_overlapsA
Destructive

Separates overlapping SVG elements by deterministic translation on one axis, using Inkscape visual bounds. It does not union, trim, delete, or otherwise alter path geometry.

NameRequiredDescriptionDefault
gapNo
idsYes
axisYes
pathYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
gapYes
axisYes
movesYes
revisionYes
backupCreatedYes

TDQS

A3.5/5.0
Behavior4/5

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

The description goes beyond the lone destructiveHint annotation by disclosing mechanism (deterministic translation, one axis, Inkscape visual bounds) and the crucial guarantee that path geometry is untouched — i.e. only positions change. It omits revision/concurrency behavior and permission context, but the core mutation semantics are clearly explained.

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 tightly written sentences, no filler. The positive behavior is front-loaded and the exclusion clause follows immediately, which is exactly the right ordering for this tool.

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

Completeness3/5

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

An output schema exists, so return values need no coverage, and the geometry-preservation guarantee is valuable. However, for a destructive positional mutation requiring expectedRevision and workspaceId, the description says nothing about the optimistic-concurrency contract or what a failed call looks like, leaving a material gap.

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 none of the six property descriptions add meaning: 'axis' is only echoed as 'one axis', and gap, ids, path, workspaceId and expectedRevision are never explained. With five undocumented parameters including a revision token and ID list, the description fails to compensate for the coverage gap.

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?

States a specific verb and resource ('Separates overlapping SVG elements') plus the mechanism (deterministic translation on one axis using Inkscape visual bounds), which is enough to distinguish it from paths_boolean, elements_delete and path_modify. It does not, however, differentiate itself from close siblings like elements_arrange, elements_align or elements_distribute.

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 negative clause ('does not union, trim, delete, or otherwise alter path geometry') tells the agent when NOT to reach for this tool versus boolean/path-editing siblings. There is no positive guidance on when to choose it over elements_align, elements_distribute or elements_arrange, so usage is only implied.

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

elements_reparentB
Destructive

Moves bounded SVG elements under one existing group or layer in source document order. It rejects cycles and ancestor-descendant selections.

NameRequiredDescriptionDefault
idsYes
pathYes
parentIdYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
idsYes
revisionYes
backupCreatedYes

TDQS

B3/5.0
Behavior3/5

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

The only annotation is destructiveHint=true. The description adds useful behavioral detail by stating it rejects cycles and ancestor-descendant selections and preserves source document order. However, it does not disclose what specifically gets destroyed, whether the move is reversible, or any permission requirements.

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

Conciseness5/5

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

Two tightly written sentences, front-loaded with the core action and followed by key rejection behavior. No redundant or filler text.

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?

For a destructive mutation with 5 required parameters, 0% schema documentation, and an output schema that handles return values, the description is incomplete. It omits parameter meanings and usage alternatives, leaving the agent without enough context to call the tool correctly in varied scenarios.

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% across 5 required parameters. The description only loosely implies that 'parentId' is the group/layer and 'ids' are the elements; it says nothing about expectedRevision (optimistic concurrency), workspaceId, or path.

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?

States a specific verb ('Moves') and resource ('bounded SVG elements under one existing group or layer in source document order'), making the operation clear. It implicitly distinguishes from siblings like elements_group by specifying an existing parent, though it does not name alternative tools.

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 rejection conditions (cycles, ancestor-descendant selections) but does not explain when to use this tool versus alternatives like elements_group or elements_transform. No prerequisites or contexts for choosing it are provided.

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

elements_transformB
Destructive

Appends an allowlisted numeric SVG transform to selected elements without accepting transform strings, then re-routes compatible semantic connectors attached to moved endpoints.

NameRequiredDescriptionDefault
idsYes
pathYes
transformYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
idsYes
revisionYes
backupCreatedYes
reroutedConnectorIdsYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations supply only destructiveHint=true, so the description adds real value: it discloses that the transform is appended (not replaced), that inputs are an allowlist of numeric kinds, that a side effect re-routes compatible semantic connectors on moved endpoints, and that string transforms are rejected. It does not cover permissions, reversibility, or the revision-conflict behavior.

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?

A single front-loaded sentence with no filler; the constraint and the side effect each earn their place. Slightly dense for one sentence but not padded.

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

Completeness3/5

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

An output schema exists so return values need no explanation, and the mutation's main behavior plus connector side effect are stated. However a destructive multi-element mutation with a revision token and 5 undocumented parameters should say more about preconditions, concurrency failure, and scope limits.

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% for 5 required parameters. The description clarifies the transform parameter's shape (allowlisted numeric kinds, no strings) but says nothing about ids, path, workspaceId, or expectedRevision -- including that expectedRevision is presumably an optimistic-concurrency guard and ids is capped in the 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?

States a specific verb and resource: append an allowlisted numeric SVG transform to selected elements. It implicitly distinguishes itself from elements_flatten_transform, elements_update and connector_route by naming the connector re-routing side effect, but never names a sibling explicitly.

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?

Usage is only implied -- the phrase 'without accepting transform strings' hints that callers must supply the structured transform object rather than raw SVG, and connector re-routing signals a move use case. No when-to-use vs. alternatives (e.g. elements_flatten_transform, elements_arrange) and no stated preconditions such as revision freshness.

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

elements_updateC
Destructive

Updates bounded SVG geometry, basic styles, text, or layer labels through typed allowlisted patches.

NameRequiredDescriptionDefault
pathYes
elementsYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
idsYes
revisionYes
backupCreatedYes
reroutedConnectorIdsYes

TDQS

C2.9/5.0
Behavior3/5

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

Only destructiveHint=true is annotated, and the description usefully adds that patches are 'bounded' and 'allowlisted', telling the agent the mutation surface is limited rather than arbitrary. However, it omits the two behaviors that matter most here: optimistic concurrency via expectedRevision (what happens on a stale revision) and whether unspecified fields are preserved.

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?

A single front-loaded sentence with no filler, and the updateable categories are listed before the mechanism. Efficient, though the terseness is arguably at the edge given the payload complexity.

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?

For a four-parameter, revision-gated mutation with nested geometry/style objects and a destructive hint, one sentence is thin. The output schema covers return values, but concurrency semantics, partial-update behavior, and element/batch limits are absent.

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 carries the full burden. It loosely maps to elements[].geometry/.style/.text/.label, which helps, but it says nothing about path, workspaceId, or expectedRevision — the revision token is required and completely unexplained, leaving the agent without the concurrency contract it needs to call this correctly.

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?

Names a specific verb (Updates) and enumerates the resource surface (SVG geometry, basic styles, text, layer labels), and adds the mechanism (typed allowlisted patches) so an agent can distinguish it from broader transforms like elements_transform. It stops short of naming a sibling or stating what it is not, so it lands at 4 rather than 5.

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 when-to-use guidance at all: it does not say when to prefer this over elements_transform, elements_arrange, path_node_edit, or text_manage, nor does it state prerequisites such as needing a current revision or a valid workspace path. The agent is left to infer routing entirely.

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

export_pdfC

Exports an SVG document to a validated PDF through Inkscape using bounded, allowlisted options.

NameRequiredDescriptionDefault
pathYes
latexNo
marginNo
filtersNopreserve
pageIdsNo
filterDpiNo
outputPathYes
pdfVersionNo
textToPathNo
workspaceIdYes
expectedRevisionYes
expectedOutputRevisionNo
expectedLatexOutputRevisionNo

Output Schema

NameRequiredDescription
hashYes
pageIdsNo
versionYes
revisionYes
strategyYes
warningsYes
cropBoxesYes
pageCountYes
byteLengthYes
mediaBoxesYes
latexSidecarNo

TDQS

C2.9/5.0
Behavior3/5

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

Only destructiveHint=false is annotated, so the description carries most of the burden. It usefully discloses that rendering goes through Inkscape and that options are bounded/allowlisted, which implies unsupported settings are rejected. It omits the concurrency contract implied by expectedRevision/expectedOutputRevision, overwrite behavior on outputPath, and the LaTeX side output, which are the riskiest behaviors here.

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?

A single front-loaded sentence with no filler or repetition. It is tight, but the brevity costs information for a 13-parameter tool rather than being genuinely economical.

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?

An output schema exists, so return values need no explanation, but for a high-complexity tool with nested objects, enums, and revision-based optimistic concurrency, the description omits parameter meaning, usage conditions, and side effects. An agent cannot safely call this from the definition alone.

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% across 13 parameters, including a nested margin object and three hash-shaped revision parameters, so the description is the only place meaning could be added. Instead it says nothing about any parameter — not what pageIds, filters, filterDpi, textToPath, or the expected*Revision fields do or when they are required.

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?

States a specific verb and resource chain — exports an SVG document to a PDF via Inkscape. An agent knows what the tool produces. However it never distinguishes itself from the sibling export_pdf_pages, export_svg, or the generic document_export, so the reader must infer the boundary from the schema.

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 when-to-use guidance, no prerequisites, and no mention of alternatives such as export_pdf_pages for subset exports or document_export for other formats. The scoping word 'validated' hints at preflight but is never explained as a condition for calling this tool.

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

export_pdf_pagesB

Exports explicit Inkscape pages as individually validated PDFs with stable page-NNN.pdf names.

NameRequiredDescriptionDefault
pathYes
pageIdsNo
workspaceIdYes
outputDirectoryYes
expectedRevisionYes
expectedOutputRevisionsNo

Output Schema

NameRequiredDescription
pagesYes
strategyYes
warningsYes

TDQS

B3/5.0
Behavior3/5

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

Annotations provide only destructiveHint=false, so the description adds genuine value by disclosing validation ('validated PDFs') and the naming contract ('stable page-NNN.pdf names'). It still omits overwrite/conflict behavior and what happens on a revision mismatch, which matters for a tool carrying expectedRevision.

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 front-loaded sentence with no filler; the action, target, and output naming convention are all packed in without waste.

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 an output schema exists (so return values needn't be described) and annotations cover the safety profile, a 6-parameter tool with 0% schema coverage and only one annotation leaves too much unexplained – revision/concurrency semantics and page-selection behavior are absent.

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% across 6 parameters, yet the description explains none of them. It gestures at pageIds ('explicit pages') and the output location ('page-NNN.pdf names'), but leaves expectedRevision, workspaceId, and expectedOutputRevisions entirely undocumented in both schema and prose.

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?

States a specific verb (Exports) and resource (explicit Inkscape pages, as PDFs), and the phrase 'explicit ... pages' implicitly distinguishes it from the whole-document export_pdf sibling. However, it never names the alternative, so the differentiation is inferred rather than stated.

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 when-to-use/when-not guidance and no mention of the obvious alternatives (export_pdf, document_export). The agent can only infer from 'explicit pages' that this is the per-page variant; nothing tells it which tool to pick or what preconditions apply.

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

export_pngC

Exports an SVG document to PNG through Inkscape using only bounded, allowlisted options.

NameRequiredDescriptionDefault
dpiNo
areaNopage
pathYes
widthNo
heightNo
pageIdNo
antialiasNo
colorModeNo
ditheringNo
backgroundNodocument
customAreaNo
outputPathYes
compressionNo
selectionIdNo
workspaceIdYes
allowDistortionNo
backgroundColorNo
expectedRevisionYes
snapAreaToPixelsNo
backgroundOpacityNo
expectedOutputRevisionNo

Output Schema

NameRequiredDescription
areaYes
dpiXNo
dpiYNo
hashYes
widthYes
heightYes
pageIdNo
bitDepthYes
revisionYes
colorTypeYes
backgroundYes
byteLengthYes
selectionIdNo

TDQS

C2.7/5.0
Behavior3/5

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

Annotations only carry destructiveHint=false, so the description must shoulder most of the behavioral burden. It usefully discloses that conversion runs through Inkscape with 'bounded, allowlisted options', which is real context beyond the annotation. However, it omits overwrite behavior for outputPath, the meaning of the expectedRevision/expectedOutputRevision preconditions, and that this is a file-writing operation.

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?

A single front-loaded sentence with no filler, stating the transformation and the execution constraint immediately. It earns its place but is arguably under-sized for a 21-parameter mutation tool.

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?

An output schema exists, so return values need no explanation, but the description is too thin for a 21-parameter, 4-required export operation: no revision-precondition guidance, no overwrite/error semantics, and no routing to sibling export tools. Given the tool's complexity, more was needed.

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% across 21 parameters, including a nested customArea object and three enums, and the description explains none of them. The vague 'bounded, allowlisted options' phrase hints at constrained values but names no parameter, so it does not compensate for the coverage gap.

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?

States a specific verb (exports), source resource (SVG document) and target format (PNG), so an agent can distinguish it from export_svg and export_pdf without opening a schema. It stops short of explicitly naming which sibling export to prefer, so it is not 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 Guidelines2/5

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

No when-to-use guidance, no mention of alternatives (export_svg, export_pdf, document_export_batch), and no prerequisites or preconditions for the required revision/workspace parameters. The 'through Inkscape' clause explains mechanism, not when to select this tool.

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

export_svgC

Exports an SVG as Inkscape SVG or plain SVG through the bounded Inkscape pipeline.

NameRequiredDescriptionDefault
pathYes
flavorYes
outputPathYes
textToPathNo
workspaceIdYes
selectionIdsNo
expectedRevisionYes
expectedOutputRevisionNo

Output Schema

NameRequiredDescription
hashYes
assetsYes
flavorYes
viewBoxYes
revisionYes
warningsYes
byteLengthYes

TDQS

C2.7/5.0
Behavior2/5

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

Only destructiveHint=false is annotated, so the description carries the disclosure burden. It hints that export runs through an Inkscape pipeline (implying an Inkscape dependency) but says nothing about how outputPath is written, whether an existing output is overwritten, or how expectedRevision/expectedOutputRevision concurrency checks behave.

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?

A single front-loaded sentence with no filler, opening with the verb. Its brevity, however, is closer to under-specification than to efficient density for an 8-parameter tool.

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?

An output schema means return values need no explanation, but with 8 params at 0% coverage and near-empty annotations, the description leaves the revision semantics and output-write behavior entirely undocumented for a tool that produces a file.

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% across 8 parameters. The description only loosely maps 'Inkscape SVG or plain SVG' to the flavor enum; the required optimistic-concurrency fields (expectedRevision, expectedOutputRevision), path/outputPath, workspaceId, selectionIds, and textToPath are entirely unexplained.

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?

States a specific verb (exports) and resource (SVG), and distinguishes the two output flavors (Inkscape vs plain SVG). It reads clearly against SVG-adjacent siblings like export_png, export_pdf, and document_export, though 'bounded Inkscape pipeline' is jargon rather than useful differentiation.

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 choose this over document_export, document_export_batch, export_png, or export_pdf, and no prerequisites or exclusions are stated. Usage is only implied by the noun 'SVG'.

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

filters_manageB
Destructive

Creates, replaces, applies, releases or safely deletes typed SVG blur, drop-shadow, blend and color-matrix filters without accepting arbitrary XML.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
idNo
actionYes
revisionYes
targetIdsNo
backupCreatedYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already flag destructiveHint=true, so the safety profile is partly covered. The description adds genuine behavioral context by stating it will not accept arbitrary XML (input is strictly schema-validated) and that deletion is 'safe', but it omits the optimistic-concurrency model implied by expectedRevision and gives no detail on what deletion actually does or whether it is recoverable.

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?

A single front-loaded sentence that puts the operations and resource first and the XML constraint last. Dense but not padded; the only mild weakness is that the long verb list is harder to scan than a short lead clause would be.

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

Completeness3/5

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

An output schema exists, so return values need not be described. However, this is a five-variant discriminated union (create/update/delete/apply/release) where each action requires a different parameter set; the description explains none of that per-action structure and omits the revision/conflict model, leaving real gaps 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?

Schema description coverage is 100%, so the schema carries the parameter burden and the baseline is 3. The description does add one useful mapping by naming the filter kinds that correspond to spec.kind, but it says nothing about path, workspaceId, expectedRevision, id, or targetIds.

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 a concrete resource (SVG filters) and enumerates the operations (create, replace, apply, release, delete) plus the supported filter types (blur, drop-shadow, blend, color-matrix), so an agent immediately knows this is the filter-management tool rather than masks_manage or gradients_manage. It does not name any sibling explicitly, and the verb 'replaces' does not match the schema's 'update' action token, so it falls short of 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 operation list implicitly tells the agent which action to pick, but there is no explicit when-to-use vs. when-not guidance, no mention of prerequisites (workspace scoping, expectedRevision concurrency token), and no alternative tool named. Usage 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.

flowed_text_convertA
Destructive

Converts one simple one-region Inkscape flowRoot to editable SVG text only after explicit lossy confirmation. Complex flows are rejected.

NameRequiredDescriptionDefault
idYes
pathYes
workspaceIdYes
confirmLossyYes
expectedRevisionYes

Output Schema

NameRequiredDescription
idYes
warningYes
revisionYes
backupCreatedYes

TDQS

A4/5.0
Behavior4/5

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

Annotations only mark destructiveHint=true; the description adds material context beyond that: the conversion is lossy, it requires explicit confirmation, and complex/multi-region flows are rejected rather than partially handled. It stops short of saying exactly what is lost (styling, wrapping, spacing) or whether the operation is reversible.

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, zero filler, with the core action and the gating requirement front-loaded. Every clause carries information.

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

Completeness3/5

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

An output schema exists so return values need not be described, and the lossy-confirmation behavior is well covered. However, for a five-required-parameter destructive tool with no schema descriptions, the concurrency token (expectedRevision), the workspace/path/id addressing model, and any undo/restore path are unaddressed.

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% across five required parameters, so the description must carry the load and largely does not. It hints at confirmLossy semantics ('only after explicit lossy confirmation') and the 'one-region' qualifier touches flow selection, but expectedRevision (an optimistic-concurrency hash), workspaceId, id, and path are never explained.

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 (converts), a precise source resource (one simple one-region Inkscape flowRoot), and a precise result (editable SVG text). It implicitly distinguishes itself from siblings like flowed_text_inspect and text_to_paths by scoping to flowRoot conversion and rejecting complex flows.

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?

Gives a clear condition for use ('only after explicit lossy confirmation') and an exclusion ('complex flows are rejected'), which tells the agent when this tool is applicable. It does not, however, name a named alternative (e.g., flowed_text_inspect for inspection, text_to_paths for outline conversion) for the rejected cases.

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

flowed_text_inspectA
Read-only

Lists Inkscape flowed-text roots and paragraph counts without interpreting their layout.

NameRequiredDescriptionDefault
pathYes
workspaceIdYes

Output Schema

NameRequiredDescription
flowedTextsYes

TDQS

A3.6/5.0
Behavior3/5

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

readOnlyHint=true already declares a safe read. The description adds the useful 'without interpreting their layout' boundary, marking it non-interpreting, but doesn't cover pagination, ordering, or error behavior beyond that.

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 front-loaded sentence with zero waste; the scope boundary is packed in tightly.

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?

An output schema exists, so return values need no explanation. For a simple two-parameter read-only lister, the description is essentially complete; only sibling differentiation is missing.

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

Parameters3/5

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

Schema description coverage is 0%, yet both params (path, workspaceId) are self-evident strings with patterns and constraints supplied in the schema. The description adds no parameter meaning, but little is needed; baseline 3 with an unmet opportunity to clarify path semantics.

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?

States a specific verb (Lists) and resource (Inkscape flowed-text roots and paragraph counts). The 'without interpreting their layout' clause frames scope, though it doesn't name the closest sibling (flowed_text_convert) to differentiate.

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?

Implied usage: an inspection tool for flowed text. No explicit when-to-use, when-not-to-use, or the alternative flowed_text_convert mentioned, so the agent must infer routing.

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

fonts_listB
Read-only

Lists a bounded cache of local system font family names without exposing font file paths.

NameRequiredDescriptionDefault
refreshNo

Output Schema

NameRequiredDescription
cachedYes
sourceYes
familiesYes
familyCountYes

TDQS

B3.1/5.0
Behavior3/5

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

With readOnlyHint=true already covering the safety profile, the description still adds two real traits: results come from a 'bounded cache' (so the list may be incomplete or stale) and font file paths are deliberately withheld. However, it never explains the refresh parameter's behavior (e.g. whether it bypasses the cache), which is the one behavioral detail a caller most needs.

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 front-loaded sentence with no filler; the resource and the two key constraints (bounded, no file paths) all land immediately.

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

Completeness3/5

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

An output schema exists, so return values need no explanation, and the read-only annotation covers safety. Still, for a tool whose only parameter is an undocumented cache-bypass flag, the description leaves a real gap in how to invoke it correctly.

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 single parameter 'refresh' is completely undocumented in both schema and description. The phrase 'bounded cache' hints that a cache exists but the description does not connect it to the refresh flag or explain its default effect, so it fails to compensate for the coverage gap.

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 a specific verb and resource ('Lists ... local system font family names') and scopes it precisely with 'local system' and 'family names' rather than full font data. It does not explicitly distinguish itself from the sibling fonts_preflight, so an agent must infer the split between listing fonts and preflighting them.

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 when-to-use guidance, no mention of the fonts_preflight alternative, and no indication of when a caller should prefer this over inspecting or validating fonts. The purpose is inferable but no routing guidance is provided.

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

fonts_preflightA
Read-only

Checks SVG-declared font families against the local cached font inventory; glyph coverage and embedding permissions remain explicitly unverified.

NameRequiredDescriptionDefault
pathYes
workspaceIdYes
refreshFontsNo

Output Schema

NameRequiredDescription
cachedYes
sourceYes
warningsYes
genericFamiliesYes
missingFamiliesYes
presentFamiliesYes
declaredFamiliesYes

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so safety is covered. The description adds genuine value beyond that by naming what is deliberately NOT verified (glyph coverage, embedding permissions), which sets accurate expectations about scope and limits false assumptions.

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 with zero waste; the positive scope is front-loaded and the caveat follows, making it easy to scan.

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 an output schema present, return values need not be explained, and the description covers both what is checked and what is left unverified. The remaining gap is the undocumented parameters, which leaves callers to rely on field names alone.

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% across three parameters, so the description carries the full burden, yet it explains none of them. The mention of "local cached font inventory" loosely hints at refreshFonts but gives no guidance on path, workspaceId, or when to refresh.

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?

States a specific verb ("Checks") and a precisely scoped resource ("SVG-declared font families against the local cached font inventory"). An agent can tell it apart from fonts_list without opening the schema, though no sibling is named explicitly.

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 word "preflight" implies a validation-before-action context, but there is no explicit when-to-use, when-not-to-use, or pointer to the sibling fonts_list. Usage is inferable but not spelled out.

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

gradients_manageB
Destructive

Creates, replaces, applies or deletes typed SVG linear/radial gradients in without accepting free XML or CSS.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
idYes
actionYes
revisionYes
targetIdsNo
backupCreatedYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations only declare destructiveHint=true, so the description carries most of the burden. It adds genuine behavioral context by restricting the tool to typed gradients in <defs> and excluding free XML/CSS, which prevents misuse. However, it doesn't disclose the destructive scope of the delete/apply actions, the optimistic-concurrency role of expectedRevision, or any auth requirement on workspaceId.

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?

A single dense, front-loaded sentence with no filler; the scope constraint is placed last where it belongs. The only minor issue is that 'replaces' does not match the schema's 'update' action verb, which slightly muddies the mapping.

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

Completeness3/5

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

The tool has an output schema, so return values need not be explained, and the input schema is fully covered. Still, for a multi-action mutation tool the description omits any guidance on action selection, revision-conflict handling, or target selection, leaving the agent to infer these from the oneOf branches.

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 schema is extremely detailed (patterns, enums for kind/paint/spread/units, oneOf variants). With the schema doing the heavy lifting, baseline is 3. The description's verbs loosely map to the action variants and it notes the linear/radial typing, but adds no syntax or format detail the schema lacks.

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 gives specific verbs (creates, replaces, applies, deletes) and a specific resource (typed SVG linear/radial gradients in <defs>). An agent can understand the tool's remit clearly. It stops short of naming a sibling (e.g., mesh_gradients_inspect or defs_vacuum) to explicitly draw the boundary, so it does not reach 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 Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance and no alternatives named, despite a crowded sibling set (patterns_manage, filters_manage, mesh_gradients_inspect). The only routing hint is the negative constraint 'without accepting free XML or CSS', which is a scope limit rather than usage direction.

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

guides_grids_manageB
Destructive

Inspects and safely changes document-local Inkscape guides and xygrids. It never reads or changes global Inkscape preferences.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
idNo
gridsNo
actionYes
guidesNo
revisionNo
backupCreatedNo

TDQS

B3.4/5.0
Behavior3/5

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

Annotations declare destructiveHint=true, so the agent knows mutations are possible. The description adds useful scope clarification ('document-local', 'never reads or changes global Inkscape preferences'), but doesn't disclose the required revision preconditions for mutations or what gets destroyed on delete.

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, no filler. The scope constraint is front-loaded and the negative guarantee follows immediately.

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?

For a 7-variant action-dispatch tool with mutation and deletion actions plus expectedRevision concurrency requirements, the description omits the action model entirely. An agent cannot infer that it must choose between inspect/create/update/delete for guides vs grids from this description alone.

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 oneOf variants are highly structured, so the schema carries the parameter burden. The description adds no parameter-level detail beyond scope, which is baseline-appropriate given full schema coverage.

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?

Clearly states verb+resource: inspects and changes document-local guides and xygrids. The scope ('document-local' vs 'global preferences') is a meaningful distinguishing detail, though it doesn't name specific sibling tools despite many *_manage siblings existing.

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 this tool handles guides/grids in documents, but offers no explicit when-to-use guidance, no mention of the action-based dispatch (inspect/guide_create/guide_update/guide_delete/grid_create/grid_update/grid_delete), and no mention of expectedRevision-based concurrency semantics.

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

images_cropC
Destructive

Crops one SVG image non-destructively by applying a new local user-space clipPath; the original image href and geometry remain unchanged.

NameRequiredDescriptionDefault
xYes
yYes
pathYes
widthYes
clipIdYes
heightYes
imageIdYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
clipIdYes
imageIdYes
revisionYes
backupCreatedYes

TDQS

C2.5/5.0
Behavior1/5

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

The description explicitly asserts the operation is 'non-destructively' applied and that 'the original image href and geometry remain unchanged', while the annotation declares destructiveHint=true. An agent reading both signals cannot tell whether data loss or irreversible state change occurs, so the description directly conflicts with the structured safety hint.

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?

A single dense sentence with the operation and its key behavioral property front-loaded and no filler. It is compact, though the semicolon-clause makes it slightly information-dense rather than plainly readable.

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?

For a 9-required-parameter mutation tool with 0% schema description coverage, the description is far too thin: it omits parameter meaning, coordinate-space details, revision-conflict behavior, and any routing guidance among clips/masks/images siblings. An output schema exists, so return-value explanation is not required, but the invocation surface remains largely unexplained.

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% across nine required parameters, so the description bears full responsibility, and it explains almost nothing: only the phrase 'local user-space clipPath' hints that x/y/width/height are in local user-space coordinates. It says nothing about clipId, imageId, workspaceId, path, or the meaning of expectedRevision (evidently an optimistic-concurrency token).

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?

States a specific verb and resource ('Crops one SVG image') plus the mechanism used (applying a new local user-space clipPath). It is unambiguous about what the tool does, though it never contrasts itself with adjacent siblings like images_manage, clips_manage, or masks_manage.

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 when-to-use guidance at all: no statement of which situations warrant cropping versus managing clips directly, no prerequisites, and no named alternative. The agent must infer selection purely from the name.

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

images_inspect_dpiB
Read-only

Reports effective DPI X/Y for embedded PNG images and a conservative singular-value range when transforms include rotation or skew. Linked image bytes are never read.

NameRequiredDescriptionDefault
pathYes
workspaceIdYes

Output Schema

NameRequiredDescription
imagesYes

TDQS

B3.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description adds genuinely new behavior: linked image bytes are never read, and rotated/skewed transforms yield a conservative singular-value range rather than an exact figure. That caveat about approximation accuracy is the kind of context an agent cannot get from the 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?

Two sentences, fully front-loaded with the primary output (DPI X/Y) before the conditional caveat. No filler or restatement of the tool name.

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

Completeness3/5

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

An output schema exists, so return values need no explanation, and the behavioral caveats are covered. What is missing is any grounding of the 'path' parameter and any indication of behavior for non-PNG or linked-only images beyond the one negative statement, leaving the two required inputs underspecified.

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 both required parameters (path, workspaceId) are undocumented, and the description never clarifies them. It is ambiguous whether 'path' refers to a document, an element, or an image resource, and no format or resolution behavior for the path is given.

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?

States a specific verb and resource: 'Reports effective DPI X/Y for embedded PNG images.' The scoping to embedded PNGs (plus a singular-value range for rotated/skewed transforms) is precise enough to separate it from siblings like images_manage, images_crop, or images_trace. It does not, however, name any sibling explicitly.

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 statement of when to reach for this tool versus the other image/inspection siblings (images_manage, images_crop, images_trace, document_inspect). The 'embedded PNG' scope implies a use case, but the agent must infer that it is an inspection-only diagnostic call.

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

images_manageB
Destructive

Relinks, embeds, or extracts explicit SVG raster images using only workspace-confined files and bounded supported MIME types.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
actionYes
imageIdYes
revisionYes
assetPathYes
backupCreatedYes

TDQS

B3.1/5.0
Behavior3/5

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

Annotations supply only destructiveHint=true, so the description does add value by stating the workspace confinement and bounded MIME-type constraint. It does not, however, say what is destroyed or overwritten (the embedded image? the target file at outputPath?), nor that expectedRevision/expectedOutputRevision act as optimistic-concurrency preconditions that will fail the call. With annotations covering only the safety flag, some real behavioral burden remains unaddressed.

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?

A single front-loaded sentence with no filler or redundancy. It is dense to the point of being slightly jargon-heavy ('explicit SVG raster images'), but every clause carries information.

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?

For a destructive, union-schema tool with two distinct action branches, optimistic-concurrency tokens, and file output, one sentence is not sufficient. An agent gets no branch-level explanation of what relink versus extract actually do to the workspace or the asset path; the existing output schema covers return values but not intent.

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 oneOf schema is richly self-documenting via const discriminators, enum values, patterns, and additionalProperties:false, so the schema carries most parameter meaning. The description gestures at 'embedding' and MIME types but explains nothing about the two revision parameters, which are the least self-evident fields. Baseline 3 is appropriate when the schema does the heavy lifting.

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 concrete verbs (relinks, embeds, extracts) and a concrete resource (SVG raster images), which is enough to place it against siblings like images_crop, images_trace, or document_import_raster. However, 'embeds' is not actually an action in the schema — it is an 'embedding' parameter value inside the relink variant — so the verb list slightly misrepresents the tool's operation set.

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 when-to-use guidance, no statement of when to pick this over images_crop/images_trace/document_import_raster, and no explanation of when relink is preferable to extract. The description only enumerates capabilities, leaving selection entirely to inference.

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

images_traceA
Destructive

Irreversibly traces one local or embedded raster image through the verified Inkscape object-trace action. Only the bounded default preset is available; no trace parameters, actions, or extensions are accepted.

NameRequiredDescriptionDefault
pathYes
presetNodefault
imageIdYes
workspaceIdYes
expectedRevisionYes
confirmIrreversibleYes

Output Schema

NameRequiredDescription
diffYes
presetYes
rasterYes
imageIdYes
warningYes
revisionYes
backupCreatedYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations only declare destructiveHint=true; the description goes further by emphasizing the operation is irreversible and that the preset is fixed with no configuration accepted, which is valuable behavioral context. It still omits what the trace produces (a new path element?) and whether the source image is modified or retained.

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 with zero filler; the irreversible, bounded nature is front-loaded before the constraint about presets.

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

Completeness3/5

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

An output schema exists so return values need no explanation, and the description adequately conveys the destructive, fixed-preset nature. But for a 5-required-parameter mutation tool, it leaves concurrency behavior (expectedRevision mismatch) and failure/permission conditions undocumented.

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% across 6 parameters, so the description carries the burden. It partially addresses preset ("bounded default preset"), but says nothing about expectedRevision (an optimistic-concurrency token), workspaceId, imageId resolution, or path semantics, leaving key parameters to raw pattern guesses.

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 (traces) on a specific resource (one local or embedded raster image) and names the mechanism (Inkscape object-trace action). This cleanly separates it from vector-oriented siblings like objects_to_paths or paths_flatten and from image siblings like images_crop/images_manage.

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 scopes usage by stating only the bounded default preset is available and no parameters/actions/extensions are accepted, which implies this is a rigid, one-shot operation. However, it never says when to prefer this over alternatives such as images_crop, objects_to_paths, or paths_flatten, nor does it state prerequisites.

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

inkscape_statusA
Read-only

Reports local Inkscape availability, observed capabilities and security posture without exposing filesystem paths.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
inkscapeNo
actionCountYes
workspaceReadyYes
securityPostureYes
diagnosticsCountYes
capabilitiesReadyYes

TDQS

A3.9/5.0
Behavior4/5

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

With only readOnlyHint provided by annotations, the description adds real behavioral context: it reports 'observed capabilities and security posture' and explicitly notes it operates 'without exposing filesystem paths', which tells the agent how the output is sanitized. It stops short of describing freshness, caching, or whether results reflect a live process state.

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 tight sentence with the core purpose front-loaded and no redundant or filler clauses. Every phrase (availability, capabilities, security posture, path-safety) carries distinct information.

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

Completeness4/5

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

For a zero-param read-only status tool, the description covers the key axes an agent cares about, and an output schema exists so return fields need not be explained. The only gap is the absence of any trigger condition telling the agent when this check is warranted.

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 takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a no-param tool is 4. No argument syntax is expected or missing.

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?

States a specific verb ('Reports') plus a concrete resource set: local Inkscape availability, observed capabilities, and security posture. It is clearly distinct from the many document/element manipulation siblings, though it does not name or contrast itself against any of them.

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?

Usage is only implied: an agent can infer this is a readiness/environment check to run before invoking Inkscape-backed operations. There is no explicit when-to-use guidance, no prerequisites, and no routing to alternatives such as document_preflight or path_effects_inspect.

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

job_cancelA

Idempotently requests cancellation of an owner-bound asynchronous export job. No unfinished output is published.

NameRequiredDescriptionDefault
jobIdYes
workspaceIdYes

Output Schema

NameRequiredDescription
idYes
errorNo
resultNo
statusYes
progressNo

TDQS

A3.6/5.0
Behavior4/5

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

Beyond the destructiveHint=false annotation, the description discloses that the operation is idempotent, that it only requests (rather than forces) cancellation, that the job is owner-bound, and that no unfinished output is published. These are meaningful behavioral facts not captured by the annotation. It omits what to do after the request or whether cancellation is immediate.

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 lean sentences, with the primary verb and resource front-loaded and the output-publication caveat as a tight follow-up. 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?

An output schema exists, so return values need not be explained. For a mutation-adjacent tool the description covers idempotency, ownership, and output behavior; only the post-cancellation workflow (e.g., poll job_get) is left unaddressed, which is a minor gap.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must carry parameter meaning, but it only indirectly alludes to them via 'owner-bound' (suggesting workspaceId as the owner scope) and 'export job' (jobId). The names and regex patterns are fairly self-explanatory, so this is adequate but leaves explicit mapping to the tool itself.

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 gives a specific verb (cancel) and resource (asynchronous export job), with scoping qualifiers ('owner-bound', 'asynchronous') that sharpen the meaning. It implicitly contrasts with the read-oriented sibling job_get, though it never names it. An agent can identify the operation without opening the schema.

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 cancel versus checking status with job_get, no preconditions, and no note on what state the job must be in. Usage must be fully inferred from the single sentence.

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

job_getB
Read-only

Returns the owner-bound status, latest monotonic progress and terminal batch result of an asynchronous export job.

NameRequiredDescriptionDefault
jobIdYes
workspaceIdYes

Output Schema

NameRequiredDescription
idYes
errorNo
resultNo
statusYes
progressNo

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the agent knows this is a safe read. The description adds useful behavioral detail: the status is 'owner-bound' (implying access is scoped to the owner), progress is monotonic, and the batch result is terminal. It doesn't cover rate limits, pagination, or what 'owner-bound' means if the caller is not the owner.

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, front-loaded sentence with no filler. Every clause contributes: the operation, the scoping constraint, the progress semantics, and the terminal result.

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 an output schema present, the description needn't explain the return shape, and it does convey the key behavioral traits (owner-bound, monotonic, terminal). The only gap is the absence of usage context relative to siblings, which is minor given the tool's narrow read-only scope.

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 0%, so the description carries some burden. It mentions the job but not the jobId or workspaceId parameters by name or format; the schema provides the regex patterns, and an output schema exists so return values needn't be explained. Baseline 3 is appropriate with the schema supplying the parameter constraints.

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?

States a specific verb (Returns) and resource (asynchronous export job) with the exact data returned: owner-bound status, monotonic progress, and terminal batch result. It is distinguishable from sibling job_cancel (a mutation) by its read nature, though it doesn't explicitly name an alternative.

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 explicit when-to-use or when-not-to-use guidance. The phrase 'asynchronous export job' and 'terminal batch result' imply usage during or after an export, but the description never states when to poll versus cancel, nor names job_cancel as the alternative.

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

markers_manageB
Destructive

Creates, replaces, applies or deletes typed SVG arrow/dot markers without accepting free path data or XML.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
idYes
actionYes
revisionYes
targetIdsNo
backupCreatedYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations supply only destructiveHint=true; the description corroborates this by naming a delete action, and adds a genuine behavioral constraint (no arbitrary path data or XML accepted). However it omits the concurrency semantics implied by expectedRevision, workspace scoping, and any authorization requirements, so the disclosure is partial.

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?

A single, front-loaded sentence that packs the resource, the four supported operations, and the key constraint with no filler. It is efficient, though the density leaves the action-to-verb mapping implicit.

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

Completeness3/5

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

Because an output schema exists, return values need not be described. But for a four-branch oneOf tool with optimistic-concurrency (expectedRevision) and workspace scoping, the one-line description leaves material behavior unexplained, so it is only minimally complete.

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

Parameters3/5

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

With schema description coverage at 100%, the schema already carries the parameter documentation, so the baseline of 3 applies. The description only loosely echoes the action enum via its verb list and adds no syntax or format detail for expectedRevision, workspaceId, spec, or targetIds beyond what the schema encodes.

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 a specific resource ('typed SVG arrow/dot markers') and enumerates the verbs (creates, replaces, applies, deletes) that map cleanly onto the schema's action const values create/update/apply/delete. This distinguishes it from the parallel *_manage siblings like masks_manage and filters_manage by resource alone, though it never explicitly contrasts itself with them.

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 clause 'without accepting free path data or XML' scopes usage (typed markers only) but stops short of saying when to reach for this tool versus an alternative such as path_modify or paths_boolean. No prerequisites or exclusions are stated, so usage is only implied.

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

masks_manageA
Destructive

Creates typed opaque rectangular SVG masks, applies or releases them from explicit elements, and prevents deletion while any SVG or CSS reference remains.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
idNo
actionYes
revisionYes
targetIdsNo
backupCreatedYes

TDQS

A3.6/5.0
Behavior4/5

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

Annotations only carry destructiveHint=true, so the description adds real value: it discloses the reference-safety rule that deletion is blocked while any SVG or CSS reference remains, which an agent cannot infer from the schema. It omits other behavioral facts (concurrency via expectedRevision, what 'typed opaque' means for rendering), keeping it short of a 5.

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?

One dense sentence with no filler, front-loaded on the create action and the resource. The three clauses are tightly packed, which slightly hurts scannability but nothing is wasted.

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

Completeness3/5

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

An output schema exists, so return values need no explanation, and the reference-guard rule is covered. But a four-branch, mutation-heavy tool whose every branch requires expectedRevision should explain that optimistic-concurrency token and confirm that delete is one of the four supported actions, both of which are left to the schema.

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 reported at 100% and the action discriminators are self-documenting via const values, so the schema carries most parameter meaning. The description adds only indirect hints ('rectangular' implying x/y/width/height, 'explicit elements' implying targetIds) and never explains the required expectedRevision concurrency token.

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 specific verbs and resource: creates, applies, releases, and (implicitly) deletes SVG masks, with a distinctive qualifier ('typed opaque rectangular') that separates it from clips/gradients/patterns. It does not, however, distinguish itself from near-siblings such as clips_manage or filters_manage, so the agent still has to infer the boundary.

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 three life-cycle operations are enumerated, which implies when each applies, and 'from explicit elements' hints that apply/release need target IDs rather than being document-wide. There is no explicit statement of when to choose masks over clips or another sibling, and no prerequisites or ordering guidance.

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

mesh_gradients_inspectB
Read-only

Lists preserved SVG mesh gradients and their structural counts without exposing unsupported editing or rewriting their patch geometry.

NameRequiredDescriptionDefault
pathYes
limitNo
workspaceIdYes

Output Schema

NameRequiredDescription
gradientsYes
truncatedYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, and the description usefully adds that mesh gradient editing is unsupported and that patch geometry is never rewritten, which tells the agent this is inspection-only with no fidelity side effects. It stops short of describing pagination, cost, or scope limits beyond that.

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?

A single front-loaded sentence with no filler, stating what is returned before the caveat. The trailing "without exposing unsupported editing or rewriting their patch geometry" clause is slightly dense but still earns its place.

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

Completeness3/5

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

An output schema exists, so return values do not need explanation, and the read-only nature is covered. However, with three undocumented parameters at 0% schema coverage, the definition is not complete enough for an agent to know how to scope the call.

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 schema documents none of the three parameters (path, workspaceId, limit) beyond raw types. The description compensates with nothing — no mention of what path refers to, that workspaceId is required, or how limit bounds the listing.

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 a specific verb ("Lists") and resource ("preserved SVG mesh gradients") plus the return payload concept ("structural counts"). It implicitly separates itself from the mutation-oriented sibling gradients_manage by stressing inspection only, though it never names an alternative explicitly.

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?

Usage is only implied: the clause about not exposing unsupported editing signals that this is a read-only inspection tool and not the path for modifying mesh gradients. There is no explicit when-to-use, when-not-to-use, or pointer to a sibling such as gradients_manage.

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

metadata_manageB
Destructive

Updates SVG document metadata or element accessibility with bounded plain text and no arbitrary RDF/XML.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
idsNo
actionYes
revisionYes
backupCreatedYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations disclose only destructiveHint=true, and the description adds real value by specifying that values are 'bounded plain text' and that arbitrary RDF/XML is rejected — a meaningful constraint on payload content. However, it says nothing about what gets overwritten, whether metadata fields are replaced or merged, or the role of expectedRevision in guarding concurrent edits, which matters for a destructive mutation.

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?

A single front-loaded sentence with no filler; every clause (bounded text, no arbitrary RDF/XML) carries information. It is efficient, though the density leaves a first-time reader needing to consult the schema for the document/elements split.

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

Completeness3/5

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

With an output schema present and 100% parameter description coverage, return values and field shapes are covered. Still missing for a destructive two-mode mutation: the concurrency contract of expectedRevision, workspace scoping expectations, and whether unspecified fields are preserved or cleared.

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

Parameters3/5

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

Schema description coverage is 100%, so the oneOf branches, const actions, patterns and maxLengths are already fully documented in the schema. The description's 'bounded plain text' and 'no arbitrary RDF/XML' loosely corroborate the length caps and restricted content, but add no syntax or format detail beyond the schema — baseline 3.

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?

States a specific verb and resource ('Updates SVG document metadata or element accessibility'), and the two modes map cleanly to the schema's action consts 'document' and 'elements'. It does not differentiate from siblings like accessibility_inspect or document_settings, which handle adjacent concerns.

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 'or' construction implies two usage modes, but there is no explicit when-to-use guidance, no statement of prerequisites (workspace/revision), and no routing away from alternatives such as accessibility_inspect for reads or document_settings for other document-level properties.

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

objects_to_pathsB
Destructive

Irreversibly converts selected basic vector objects or their strokes to SVG paths through Inkscape in a staged copy. The caller must confirm the destructive conversion.

NameRequiredDescriptionDefault
idsYes
modeYes
pathYes
workspaceIdYes
expectedRevisionYes
confirmIrreversibleYes

Output Schema

NameRequiredDescription
diffYes
modeYes
warningYes
revisionYes
convertedIdsYes
backupCreatedYes

TDQS

B3.4/5.0
Behavior4/5

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

The destructiveHint annotation already tells the agent this is a mutation, but the description adds substantial non-obvious context: the conversion is irreversible, it runs 'through Inkscape in a staged copy,' and the caller must explicitly confirm. That is real behavioral value beyond structured data, though it does not discuss revision conflicts or what happens to the original objects.

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?

Two tight sentences with the irreversible nature and staging model front-loaded, and no filler. The second sentence mildly restates the schema's confirmIrreversible const constraint, costing a little efficiency.

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

Completeness3/5

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

An output schema exists so return values need not be described, and the description covers the key risk (irreversibility) and the staging/confirmation model. For a six-parameter destructive mutation with zero schema coverage, though, the expectedRevision and path parameters remain opaque, so an agent could still misconstruct the call.

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% across six required parameters, so the description carries the full explanatory burden. It loosely maps to three of them ('selected' to ids, 'objects or their strokes' to the mode enum, 'must confirm' to confirmIrreversible) but says nothing about path, workspaceId, or the critical expectedRevision concurrency token, leaving half the surface unexplained.

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 gives a specific verb+resource+target ('converts selected basic vector objects or their strokes to SVG paths'), which lets an agent distinguish it from the similarly named text_to_paths without opening the schema. It stops short of explicitly naming or excluding a sibling tool, so it is clear but not maximally 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?

Usage is implied by 'selected basic vector objects or their strokes,' which signals the tool operates on element ids with a mode choice, and the confirmation requirement signals this is a deliberate destructive step. However, there is no explicit when-to-use/when-not guidance versus paths_flatten, paths_combine, or text_to_paths, which are the most likely confusion points.

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

palette_applyA
Destructive

Replaces explicitly mapped local hex paints in attributes, typed inline fill/stroke/stop-color styles, and local CSS variable values without reading global Inkscape palettes.

NameRequiredDescriptionDefault
pathYes
workspaceIdYes
replacementsYes
expectedRevisionYes

Output Schema

NameRequiredDescription
revisionYes
replacementsYes
backupCreatedYes

TDQS

A3.8/5.0
Behavior3/5

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

destructiveHint=true already signals mutation, and "Replaces" is consistent with that. The description adds genuinely useful behavioral scope (which paint carriers are affected, and that global palettes are untouched), but omits the optimistic-concurrency behavior implied by expectedRevision and any scale limit (replacements capped at 128).

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 dense, front-loaded sentence that leads with the action and enumerates the affected paint carriers, then closes with the exclusion. No filler sentences; every clause carries information an agent needs.

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?

An output schema exists, so return values need not be described, and the destructive annotation plus the description's scope statement cover the safety profile. For a four-parameter mutation the description supplies the conceptual framing (hex-in/hex-out replacement with local-only scope), leaving only revision semantics to the schema.

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

Parameters4/5

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

With schema description coverage at 0%, the description has to carry parameter meaning, and it does explain the nature of the mapping (local hex paint "from" -> "to" replacements) that the replacements array encodes. However, it says nothing about expectedRevision (concurrency guard), path, or workspaceId beyond what their names imply, so full compensation is not achieved.

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?

States a specific verb ("Replaces") and a precisely bounded resource: local hex paints in attributes, typed inline fill/stroke/stop-color styles, and local CSS variable values. It even delimits scope against the sibling-ish concept of global Inkscape palettes, so an agent can distinguish it from palette_inspect/color_management_inspect, though it never names those siblings.

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 closing clause "without reading global Inkscape palettes" implies this tool is for local/inline color substitution rather than palette-driven recoloring, which is useful orientation. But there is no explicit when-to-use, when-not-to-use, or named alternative (e.g. palette_inspect for global palettes), leaving the routing to inference.

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

palette_inspectB
Read-only

Lists direct local hex colors in attributes or typed inline paint styles, plus local CSS variable values, without reading global Inkscape palettes.

NameRequiredDescriptionDefault
pathYes
limitNo
workspaceIdYes

Output Schema

NameRequiredDescription
colorsYes
swatchesYes
truncatedYes
cssVariablesYes

TDQS

B3.2/5.0
Behavior3/5

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

readOnlyHint=true already tells the agent this is a safe read. The description adds useful scope disclosure (only direct/local colors and CSS variables, not global palettes), but says nothing about pagination, the limit cap, or what the returned list contains. With annotations carrying the safety profile, this 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?

A single front-loaded sentence with the verb first and no padding; every clause clarifies scope. The only minor cost is the jargon-dense "typed inline paint styles" phrasing.

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

Completeness3/5

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

An output schema exists, so return values need not be described, and the read-only nature is covered by annotations. However, with 3 parameters at 0% schema coverage, the definition leaves an agent without any guidance on required inputs or result limiting, which is a meaningful gap for an inspection 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 coverage is 0%, so the description must carry parameter meaning, yet it never mentions path, workspaceId, or limit. The scope of the path (which document/object) and the limit's role in truncating results are left entirely undocumented.

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?

States a specific verb ("Lists") and resource ("direct local hex colors in attributes or typed inline paint styles, plus local CSS variable values"), and scopes it with "without reading global Inkscape palettes." This lets an agent distinguish it from palette_apply and color_management_inspect at a high level, though it never names a sibling explicitly.

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 "without reading global Inkscape palettes" gives an implicit boundary (a when-not condition), but there is no explicit statement of when to reach for this tool versus palette_apply or a broader inspection tool. Usage is implied rather than spelled out.

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

path_break_apartC
Destructive

Splits a compound SVG path into explicit, caller-supplied IDs. Existing references to the source ID are rejected before mutation.

NameRequiredDescriptionDefault
idYes
pathYes
newIdsYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
idsYes
revisionYes
backupCreatedYes

TDQS

C2.9/5.0
Behavior3/5

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

Annotations carry only destructiveHint=true, so the description must add the behavioral profile. It discloses one valuable guarantee – existing references to the source ID are rejected before any mutation, i.e. fail-before-write – plus that IDs are caller-supplied. It omits what happens to the original element, revision-conflict semantics, and atomicity, so it is useful but incomplete.

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?

Two short sentences, front-loaded with the operation and followed by the safety constraint. No filler, though the second sentence could be tighter.

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?

An output schema exists, so return values need not be explained, but this is a destructive multi-parameter mutation with zero schema documentation and only two sentences of description. Revision handling, ID ordering semantics, and the fate of the source element are all left to inference, which is thin for the tool's complexity.

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% across five required parameters, so the description must compensate. It only illuminates 'id' (source) and 'newIds' (caller-supplied targets), and implies 'path' is SVG path data, leaving 'expectedRevision' and 'workspaceId' entirely undefined and giving no mapping between newIds order and resulting segments.

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?

States a specific verb+resource ('Splits a compound SVG path') and the output shape ('into explicit, caller-supplied IDs'), which cleanly distinguishes it from the inverse sibling paths_combine and from path_modify. It does not name a sibling explicitly, but the operation is unambiguous.

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 when-to-use guidance and no alternatives are named. An agent cannot tell from the description whether to reach for this versus paths_combine, paths_flatten, or path_node_edit, nor what preconditions select it. The rejection clause is a behavior, not usage guidance.

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

path_effects_inspectB
Read-only

Lists preserved local Inkscape path effects and their local path references without editing effect parameters.

NameRequiredDescriptionDefault
pathYes
workspaceIdYes

Output Schema

NameRequiredDescription
effectsYes

TDQS

B3.2/5.0
Behavior3/5

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

The readOnlyHint annotation already establishes the safe-read profile, and 'without editing effect parameters' largely restates it. The qualifier 'preserved local' hints at a scoping rule but is never explained, and nothing is said about whether missing effects error out or return empty.

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?

One sentence, front-loaded with the verb and resource, and the negative constraint is tacked on without padding. Nothing wasted, though brevity here contributes to the under-specification.

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

Completeness3/5

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

An output schema exists, so return values needn't be described. However, the unresolved meaning of 'path' and of 'preserved local' leaves an agent guessing about inputs for a 2-required-parameter 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%, so the description carries the full burden and fails to explain either parameter. Critically, 'path' is ambiguous here – it could be a filesystem path, an SVG path element, or an element reference – and the description's mention of 'local path references' does nothing to disambiguate it.

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?

States a concrete verb ('Lists') and a specific resource (preserved local Inkscape path effects plus their local path references). The phrase 'without editing effect parameters' implicitly contrasts with the path_effects_manage sibling, so an agent can separate read from write, though the contrast is only implied rather than named.

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?

Usage is implied: inspection-only, so editing should go to path_effects_manage. There is no explicit 'use this when / not when' statement, no prerequisite info, and no direct pointer to the alternative tool.

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

path_effects_manageB
Destructive

Detaches explicit local paths from an Inkscape Live Path Effect or deletes an already unreferenced local effect. It never edits effect parameters or invokes GUI-dependent LPE rendering.

NameRequiredDescriptionDefault
pathYes
actionYes
pathIdsNo
effectIdYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
actionYes
effectIdYes
revisionYes
backupCreatedYes
changedPathIdsYes

TDQS

B3.1/5.0
Behavior3/5

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

destructiveHint=true is already declared by annotations, so the safety profile is covered. The description adds value by clarifying the two destructive actions and by explicitly excluding parameter editing and GUI-dependent rendering, but it omits reversibility, what happens to the detached paths, and any concurrency semantics.

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?

Two tight sentences with the functional scope front-loaded and the exclusions trailing. No filler or redundancy, though it is quite terse relative to the tool's complexity.

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?

For a destructive mutation with 6 parameters, 0% schema coverage, and a required revision token, the description is materially incomplete. An output schema exists so return values need no explanation, but the parameter and concurrency mechanics are left entirely to the agent.

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% across 6 parameters (including an expectedRevision optimistic-lock token, workspaceId, effectId, and the action enum), and the description documents none of them. It hints that paths and effect identifiers are involved but adds no syntax, format, or constraint guidance needed to fill these fields.

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 two concrete operations (detaching local paths from an LPE, deleting an unreferenced local effect) with a specific resource, so the agent knows exactly what the tool mutates. It stops short of naming its read-only sibling path_effects_inspect, so sibling differentiation is only implied.

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?

Negative guidance is present ("never edits effect parameters or invokes GUI-dependent LPE rendering"), which helps bound the tool, but there is no positive when-to-use statement and no routing to path_effects_inspect for the read case. Usage is implied rather than stated.

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

path_modifyB
Destructive

Irreversibly simplifies one SVG path through the verified native action in a staged copy. Legacy inset, outset, and offset requests return a recoverable unavailable-capability error on the current baseline.

NameRequiredDescriptionDefault
idYes
pathYes
operationYes
workspaceIdYes
expectedRevisionYes
confirmIrreversibleYes

Output Schema

NameRequiredDescription
idYes
diffYes
renamedYes
warningYes
revisionYes
operationYes
backupCreatedYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations supply only destructiveHint=true, so the description carries most of the burden and does add value: it flags the operation as irreversible, notes work happens in a staged copy, and discloses that legacy inset/outset/offset requests fail with a recoverable error rather than silently doing something else. It stops short of stating permission, revision-conflict, or failure-recovery behavior beyond that.

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?

Two tight sentences, with the supported operation and its irreversibility front-loaded before the unsupported-legacy caveat. Every clause carries information, though 'verified native action' is padding that could be plainer.

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

Completeness3/5

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

With an output schema present, return values need no explanation, and the description covers irreversibility and the failing operations. For a six-parameter destructive mutation with zero schema descriptions, it leaves the revision-precondition and confirmation parameters entirely unexplained, so an agent could not call it correctly from the description alone.

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, yet it names no parameters directly. It does convey that only the 'simplify' value of the operation enum is functional, which is genuinely useful beyond the schema, but confirmIrreversible, expectedRevision, workspaceId, id, and path remain entirely unexplained.

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?

States a specific verb and resource: 'simplifies one SVG path', which separates it from paths_flatten, paths_boolean, and path_node_edit. It further scopes the taool by declaring only the native simplify action is viable on this baseline. The jargon 'verified native action in a staged copy' is vague, but the core purpose is unmistakable.

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 effectively rules out three enum values (inset, outset, offset) by stating they return a recoverable unavailable-capability error, which is usable when-not-to guidance. However, it gives no positive guidance on when to reach for path_modify versus sibling path tools like paths_flatten or path_node_edit, so the routing context is only implied.

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

path_node_editC
Destructive

Edits explicit absolute linear path nodes or opens/closes a subpath by segment index without accepting raw SVG path data.

NameRequiredDescriptionDefault
idYes
pathYes
operationYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
idYes
revisionYes
backupCreatedYes

TDQS

C2.9/5.0
Behavior3/5

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

Annotations declare destructiveHint=true, and the description usefully adds that edits target explicit absolute linear nodes and reject raw SVG path data, which tells the agent about the coordinate model and accepted command set. However, it never mentions the optimistic-concurrency requirement (expectedRevision) whose failure mode will block any edit, nor what is lost on deletes.

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?

A single tight sentence with no filler, and the primary capability (editing nodes) is front-loaded before the secondary subpath operation. It is efficient, though the trailing negative clause could be tightened.

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?

This is a high-complexity mutation tool with a nine-variant operation union and zero schema descriptions; an output schema exists so return values need not be explained, but the description omits the operation vocabulary and the revision-scoping behavior entirely. For a tool of this complexity it leaves too much for the agent to reconstruct from the raw schema.

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% across five required parameters, so the description must compensate and largely does not. It implies a segment 'index' and a path/subpath scope, but says nothing about id, workspaceId, expectedRevision, or the nine distinct operation actions (delete, insert, set_command, expand_smooth, set_quadratic_handle, set_cubic_handles, set_arc_parameters, open/close_subpath).

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 a specific verb and resource (editing path nodes) plus a secondary capability (opening/closing subpaths), which separates it from generic path tools like path_modify or paths_combine. It does not name any sibling explicitly, so differentiation from path_node_move in particular is left to inference.

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 statement of when to choose this over the many path-editing siblings (path_node_move, path_modify, path_break_apart, path_reverse). The clause about 'not accepting raw SVG path data' is a constraint, not a routing rule, and no preconditions or exclusions are given.

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

path_node_moveC
Destructive

Moves one path endpoint by zero-based segment index without accepting raw SVG path data; relative commands are normalized to equivalent absolute SVG.

NameRequiredDescriptionDefault
idYes
pathYes
indexYes
pointYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
idYes
revisionYes
backupCreatedYes

TDQS

C2.9/5.0
Behavior3/5

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

The destructiveHint=true annotation already declares the mutation safety profile, so the bar is lower. The description adds genuinely new behavioral context — relative commands are normalized to absolute SVG — but says nothing about revision conflicts, permission needs, or whether prior geometry is recoverable.

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?

A single dense sentence with the core action front-loaded and no filler. It does omit the delimiter between its two clauses slightly awkwardly, but there is no wasted wording.

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?

An output schema exists, so return values need no explanation, but for a 6-parameter destructive mutation the description is thin: the concurrency-control parameter is unexplained and no sibling differentiation is offered. An agent could invoke it but not confidently choose it over path_node_edit.

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% across 6 required parameters, including a nested point object, so the description must carry the load. It explains only one parameter's semantics ('zero-based segment index') and leaves id, path, point, workspaceId, and especially the opaque expectedRevision token entirely undocumented.

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?

States a specific verb+resource with scope: 'Moves one path endpoint by zero-based segment index,' and clarifies it does not accept raw SVG path data. However, it does not distinguish itself from the closely related sibling path_node_edit, leaving the agent to guess which node-editing tool applies.

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 when-to-use or when-not-to-use guidance and no named alternative. The phrase 'without accepting raw SVG path data' faintly signals a contrast with raw-path tools, but the agent gets no routing rule against path_node_edit, path_modify, or paths_flatten.

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

path_reverseA
Destructive

Reverses line-only SVG path subpaths while retaining the path ID and presentation. Curves and arcs are rejected until their exact reversal is available.

NameRequiredDescriptionDefault
idYes
pathYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
idYes
revisionYes
backupCreatedYes

TDQS

A3.5/5.0
Behavior4/5

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

The only annotation is destructiveHint=true, and the description adds genuinely new behavioral context: mutations retain the path ID and presentation, and curve/arc inputs are rejected rather than silently mishandled. It does not mention the expectedRevision concurrency precondition or any partial-failure behavior, keeping it short of a 5.

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 tightly written sentences with no filler. The core operation is front-loaded and the constraint follows immediately, so a scanning agent gets the essentials first.

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

Completeness3/5

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

An output schema exists, so return values need not be described, and the destructive nature is covered by annotations. However, for a four-parameter mutating tool with zero schema documentation, the description omits the revision-guard and workspace context an agent needs to invoke it correctly.

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% across four required parameters, so the description must carry the load. It only implicitly touches 'id' (path ID) and 'path' (SVG path data); workspaceId and the required expectedRevision are never explained, and no format expectations for the path string are given.

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?

States a concrete verb and resource — 'Reverses line-only SVG path subpaths' — plus an explicit scope constraint ('line-only') and the preservation of path ID and presentation. An agent can distinguish it from path_modify or path_break_apart by the reversal + line-only framing, though it never names a sibling directly.

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 by telling the agent curves and arcs are rejected, but it never states when to reach for this tool versus alternatives (e.g., a node-editing or boolean-path sibling) or what to do when a non-line path must be reversed. Guidance is inferable rather than explicit.

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

paths_booleanA
Destructive

Runs an allowlisted native boolean, division, or cut operation on exactly two safe SVG path IDs in a staged copy, then atomically publishes the sanitized result. For difference, division, and cut, ids[0] is the target and ids[1] is the cutter.

NameRequiredDescriptionDefault
idsYes
pathYes
operationYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
diffYes
renamedYes
revisionYes
operationYes
backupCreatedYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations only supply destructiveHint=true, so the description adds real value by disclosing the transactional behavior: work happens in a staged copy and the sanitized result is published atomically, which tells the agent the operation is all-or-nothing. It stops short of describing failure modes (e.g. what happens on a revision mismatch or an unsanitizable input).

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 with no filler; the operation scope comes first and the ambiguous operand ordering follows. Every clause carries information an agent needs.

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

Completeness3/5

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

An output schema exists, so return values need no explanation, and the destructive/staging semantics are covered. However, for a five-parameter destructive mutation the definition omits the meaning of the required revision token and the document path/workspace addressing, leaving real gaps.

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% across five required parameters, so the description carries the whole burden. It usefully explains the operand roles for ids[0]/ids[1] on difference, division, and cut, but leaves expectedRevision (clearly a concurrency guard), path, workspaceId, and the enum values union/intersection/exclusion entirely unexplained.

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 definition names a specific verb and resource ('Runs an allowlisted native boolean, division, or cut operation on exactly two safe SVG path IDs') and adds a scope qualifier ('native', 'exactly two', 'staged copy') that separates it from the broader paths_combine sibling. An agent can predict the operation without opening the schema.

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 gives operand-ordering guidance for three of six operations, which is genuine usage help, but never states when to pick this tool over paths_combine (both operate on path booleans). No exclusions, prerequisites, or prerequisites around the revision precondition are given.

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

paths_combineB
Destructive

Combines same-parent SVG paths only when their presentation attributes match exactly and removed IDs have no live SVG references.

NameRequiredDescriptionDefault
idsYes
pathYes
workspaceIdYes
expectedRevisionYes

Output Schema

NameRequiredDescription
idYes
revisionYes
removedIdsYes
backupCreatedYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, so the merge-is-destructive nature is covered structurally. The description adds useful behavioral constraints (attribute matching, ID cleanup rules that could otherwise break references), but says nothing about reversibility, permission needs, or the optimistic-concurrency behavior implied by expectedRevision.

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 tightly written sentence that front-loads the action and immediately qualifies it with the governing constraints. No filler, nothing redundant.

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

Completeness3/5

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

The existence of an output schema relieves the description of explaining return values, but for a destructive, four-required-parameter mutation with 0% schema coverage, one conditional sentence is thin. Key operational details (what the expectedRevision guard does, what path targets, resulting element identity) are absent.

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 4 required parameters (ids, path, workspaceId, expectedRevision) are undocumented. The description only indirectly hints that 'ids' are the paths to combine; it never explains path, workspaceId, or that expectedRevision is a concurrency guard, so it fails to compensate for the schema gap.

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?

States a specific verb ('Combines') and resource ('same-parent SVG paths'), plus the exact preconditions under which combining is allowed. It is clearly distinct from siblings like paths_boolean or elements_group, though it never names an alternative sibling explicitly.

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 specifies the conditions that gate the operation (same parent, matching presentation attributes, no live ID references), which implies when it can be used, but gives no guidance on when to prefer this over alternatives such as paths_boolean or elements_group, nor any prerequisites like revision handling.

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

paths_flattenA
Destructive

Irreversibly flattens two to 100 explicitly selected overlapping SVG paths through the verified native Inkscape action in a staged copy.

NameRequiredDescriptionDefault
idsYes
pathYes
workspaceIdYes
expectedRevisionYes
confirmIrreversibleYes

Output Schema

NameRequiredDescription
idsYes
diffYes
renamedYes
warningYes
revisionYes
backupCreatedYes

TDQS

A3.8/5.0
Behavior4/5

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

destructiveHint=true already signals a destructive operation, but the description adds meaningful context beyond the annotation: 'Irreversibly' reinforces non-recoverability, and 'in a staged copy' discloses that the operation is applied to a staged workspace copy rather than the live document. The 'verified native Inkscape action' clause also hints at the execution mechanism. It stops short of stating auth/permission needs or failure behavior.

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

Conciseness5/5

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

A single dense sentence with the critical constraint ('Irreversibly') front-loaded and zero filler. Every clause earns its place.

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

Completeness4/5

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

An output schema exists, so return values need no explanation, and the description adequately conveys the destructive, staged-copy nature of the operation. It is somewhat thin on the optimistic-concurrency semantics of expectedRevision and the meaning of path/workspaceId for a five-required-param destructive tool, but the essentials for correct invocation are present.

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 0% across five required params, so the description must compensate. It partially does: 'two to 100' maps to the ids minItems/maxItems bounds and 'Irreversibly' hints at the confirmIrreversible flag. But expectedRevision (concurrency token), path, and workspaceId are left entirely to the schema, leaving real gaps.

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?

States a specific verb (flattens) and resource (SVG paths) with precise scope: two to 100 overlapping, explicitly selected paths. However, it never distinguishes itself from closely related siblings like paths_combine, paths_boolean, or elements_flatten_transform, leaving the agent to infer why 'flatten' differs from 'combine' or 'boolean'.

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 'two to 100 explicitly selected overlapping SVG paths' implies preconditions (paths must already be selected and must overlap), but there is no explicit when-to-use or when-not-to-use guidance and no named alternative. Usage is implied rather than directed.

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

patterns_manageB
Destructive

Creates, replaces, applies or deletes typed SVG dots/stripes patterns in defs without accepting free XML or CSS.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
idYes
actionYes
revisionYes
targetIdsNo
backupCreatedYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations only declare destructiveHint=true, which the delete action already implies. The description does add genuinely useful behavioral context: patterns are 'typed' and free XML/CSS is rejected, so the agent knows input is schema-validated rather than raw markup. It says nothing about the expectedRevision optimistic-concurrency contract or what apply does to existing target objects.

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 front-loaded sentence that packs the action list, the resource, and the key input constraint with zero filler. Nothing is redundant with the title or needs trimming.

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 four-variant mutating tool the description covers all actions and the input-restriction invariant, and an output schema exists so return values need not be explained. The remaining gap is the expectedRevision concurrency semantics, which an agent calling a destructive write tool would benefit from knowing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema itself carries the parameter burden and baseline is 3. The description only gestures at the action set; it adds no detail on spec fields, paint, targetIds, or the hash-format expectedRevision beyond what the schema already encodes.

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 (typed SVG dots/stripes patterns in defs) and enumerates the verbs (creates, replaces, applies, deletes), which map cleanly onto the schema's create/update/delete/apply oneOf branches. It does not explicitly distinguish itself from sibling managers like filters_manage, gradients_manage, or markers_manage, but the pattern-specific scope is unambiguous.

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 when-to-use or when-not-to-use guidance is provided, and no alternative tool is named. The agent must infer that this is the right tool for pattern work purely from the name and verb list; there is no mention of revision-conflict handling, ordering of apply vs create, or prerequisites.

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

resources_inspect_remoteB
Read-only

Reports remote SVG resources without downloading them, with remediation to replace them using workspace-local linked or embedded image operations.

NameRequiredDescriptionDefault
pathYes
workspaceIdYes

Output Schema

NameRequiredDescription
resourcesYes
remediationYes

TDQS

B3.4/5.0
Behavior4/5

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

readOnlyHint=true already establishes the safety profile, so the description only needs to add non-obvious traits – and it does: it discloses that nothing is fetched over the network, which is a meaningful operational constraint beyond the annotation. It stops short of explaining permissions, remote access behavior, or failure modes for unresolvable URIs.

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?

A single dense sentence with the core action front-loaded and the remediation note trailing. It is efficiently sized, though packing the remediation guidance into a trailing clause makes it slightly harder to parse than a separated second sentence would.

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

Completeness3/5

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

An output schema exists, so return values need no explanation, and the read-only annotation covers safety. Still, the two required parameters are undocumented and there is no statement of where inspection applies (workspace-scoped document only?), leaving an agent to guess at invocation inputs.

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% for two required parameters ('path' and 'workspaceId'), so the description carried the full burden of explaining them and supplies none. It neither clarifies what 'path' points at (document, SVG file, or asset) nor what the workspace scoping means, leaving the only useful hint to the regex in the 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 gives a specific verb ('Reports') and a precise resource ('remote SVG resources'), plus a defining scope constraint: inspection happens 'without downloading them.' It does not name a sibling tool it overlaps with, so an agent must infer its position relative to images_manage or assets_package.

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?

Usage is only implied: the stated purpose (find remote references) plus the mention of 'remediation' suggests it is a pre-replacement audit step. There is no explicit when-to-use/when-not-to-use statement and no named alternative, so the routing decision is left to inference.

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

symbols_manageB
Destructive

Lists, creates or deletes reusable SVG symbols and creates positioned local use clones. Existing cyclic or missing use references are rejected.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
idNo
actionYes
symbolsNo
revisionNo
backupCreatedNo

TDQS

B3.3/5.0
Behavior3/5

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

The single annotation (destructiveHint=true) is consistent with the delete action, and the description adds real behavioral context beyond it: cyclic or missing use references are rejected. However, it omits other important traits — that mutations require a matching expectedRevision, that clones are positioned locally, and any workspace/permission scoping. Useful but incomplete.

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 tightly packed sentences, front-loaded with the operation set and ending with the rejection behavior. No filler, no restatement of the title or name.

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

Completeness3/5

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

For a four-action mutation tool with a complex oneOf schema, an output schema, and revision-based concurrency, the description covers the operation set and one error case but leaves the expectedRevision requirement and the distinction among the four variants unstated. Adequate but with meaningful gaps given the tool's complexity.

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

Parameters3/5

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

Schema description coverage is reported at 100%, so the structured schema carries the burden and a 3 baseline applies. The description names the actions and hints at positioning for clones, but adds nothing about expectedRevision semantics (a revision token for concurrency control) or the required spec fields (id, sourceId, viewBox), which the schema lists without explanation.

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?

States specific verbs and resource: 'Lists, creates or deletes reusable SVG symbols and creates positioned local use clones.' This maps cleanly to the four action variants (list/create/delete/clone) and clearly distinguishes it from neighbors like masks_manage or patterns_manage by naming symbols. It stops short of 5 only because it does not contrast itself against the closest sibling (defs_vacuum, which would remove unused defs).

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 says what happens with invalid references ('cyclic or missing use references are rejected') but gives no when-to-use guidance, no mention of the optimistic-concurrency prerequisite (expectedRevision on create/clone/delete), and no routing to alternatives such as defs_vacuum or patterns_manage. An agent gets no help deciding when this tool is the right choice.

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

text_manageA
Destructive

Edits local SVG text through bounded plain-text segments or explicit multiline tspans, preserving existing structure only when requested.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
idYes
modeYes
revisionYes
backupCreatedYes

TDQS

A3.6/5.0
Behavior3/5

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

destructiveHint=true is the only annotation, and 'Edits' is consistent with it, so no contradiction. The description adds the useful nuance that structure is preserved only in the preserve mode, but says nothing about the expectedRevision optimistic-concurrency requirement, workspace scoping, or that content is replaced rather than appended.

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?

A single front-loaded sentence with no filler, and the verb and resource lead. It is dense with jargon ('bounded plain-text segments') but every clause 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?

Wait—output schema exists so return values need no explanation, and the schema fully documents parameters. What remains missing is concurrency and sibling differentiation, which is a real gap for a destructive mutation tool in a crowded text-tool family.

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 reported at 100%, so the schema itself carries the parameter burden and the baseline of 3 applies. The description adds conceptual context for segments vs. tspans but names no parameters, enums, or formats beyond what the schema defines.

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?

States a specific verb (Edits) and resource (local SVG text) and even names the two editing styles, 'bounded plain-text segments' and 'explicit multiline tspans', which map to the two oneOf modes. It does not, however, differentiate itself from text-adjacent siblings such as text_path_manage, flowed_text_convert, or text_to_paths.

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?

'preserving existing structure only when requested' implies a mode-selection rule but never states it explicitly, and there is no guidance on when to reach for this tool rather than elements_update or the other text tools. Usage is inferable rather than stated.

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

text_path_manageA
Destructive

Attaches text (including tspans) to a local SVG path or detaches it without accepting markup.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
actionYes
textIdYes
revisionYes
backupCreatedYes

TDQS

A3.5/5.0
Behavior3/5

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

With destructiveHint=true already declaring the safety profile, the description adds useful scope detail: only existing text/tspans are bound, no markup payloads are accepted, and only local (not remote) paths are valid. However, it never mentions the required expectedRevision optimistic-concurrency token or revision-conflict behavior, which is material for a mutation 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?

A single front-loaded sentence covering both modes and the input restriction, with zero filler. Nothing in it is redundant with the tool name or schema.

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

Completeness5/5

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

The description is sufficient for the agent to choose and call the tool: it identifies attach/detach modes, qualifying text, and scope limits, while the schema supplies ids, offsets and the required revision token, and the output schema covers results. No critical gap remains.

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 reported at 100%, so the schema carries the parameter burden and 3 is the baseline. The description does add two semantic points beyond the schema — 'including tspans' qualifies textId and 'without accepting markup' clarifies that text is referenced, not supplied inline — but it says nothing about startOffset placement along the path.

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?

Names a specific pair of verbs (attach/detach) on a concrete resource (text, including tspans, bound to a local SVG path), which is enough to separate it from siblings like text_to_paths or text_manage. It never explicitly contrasts itself with those siblings, so an agent must infer the distinction from the name alone.

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 statement of when to attach vs detach, no prerequisites (e.g. that the path and text must already exist in the same workspace), and no named alternatives. The only implicit constraint is 'local SVG path', which hints remote resources are unsupported but is never stated as a rule.

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

text_to_pathsA
Destructive

Irreversibly converts explicit SVG text element IDs to paths through Inkscape in a staged copy. The caller must confirm the destructive conversion.

NameRequiredDescriptionDefault
idsYes
pathYes
workspaceIdYes
expectedRevisionYes
confirmIrreversibleYes

Output Schema

NameRequiredDescription
diffYes
warningYes
revisionYes
convertedIdsYes
backupCreatedYes

TDQS

A3.5/5.0
Behavior4/5

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

Annotations only supply destructiveHint=true, so the description carries the rest and does well: it discloses irreversibility and that work happens on a staged copy, which tells the agent the original document is not mutated in place. It does not mention revision staleness or failure modes.

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, no filler, with the destructive/irreversible constraint front-loaded before the confirmation requirement.

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

Completeness3/5

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

Good on safety and staging, and output schema coverage means return values need not be explained. But for a 5-param destructive tool with zero schema descriptions, the parameter semantics gap leaves an agent without what it needs to populate ids, path, and expectedRevision correctly.

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?

Five required parameters at 0% schema description coverage, and the description glosses only one implicitly ('caller must confirm' maps to confirmIrreversible). 'ids', 'path', 'workspaceId' and especially the optimistic-concurrency 'expectedRevision' token are left unexplained in both the schema and the description.

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?

States a specific verb+resource: converting explicit SVG text element IDs to paths via Inkscape. The 'explicit text element IDs' qualifier distinguishes it from the broader objects_to_paths and text_path_manage siblings, though neither sibling is named for contrast.

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?

Implies the use case (converting live text to outlines) and states a precondition (caller must confirm the destructive conversion), but gives no explicit when-to-use vs objects_to_paths or text_path_manage, and no 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.

workspace_listB
Read-only

Lists authorized workspaces by opaque ID without exposing their filesystem roots.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
workspacesYes

TDQS

B3.3/5.0
Behavior2/5

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

readOnlyHint=true already tells the agent this is a safe read. The description's extra detail is a privacy/security guarantee about not leaking filesystem roots, which adds a little value, but it says nothing about scope, pagination, auth requirements, or the shape of the returned list.

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?

A single front-loaded sentence with no filler. It is appropriately sized for a no-argument list tool, though it could carry one more clause of context without bloat.

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

Completeness3/5

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

For a no-param read tool with an output schema and readOnlyHint, the description only needs to clarify scope and security behavior. It covers the opaque-ID/root-hiding guarantee but leaves callers without any signal about scope, auth, or how the list relates to the rest of the workspace tools.

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 takes zero parameters, which is the baseline for a 4; the schema coverage is 100% vacuously. There is nothing in the description that conflicts, and no missing parameter semantics to compensate for.

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?

States a specific verb (Lists) and resource (authorized workspaces), and adds the distinguishing detail that it returns opaque IDs and never exposes filesystem roots. It doesn't explicitly name a sibling like workspace_list_documents, so it stops just short of 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?

Usage is implied by the name and purpose, but there is no explicit guidance on when to call it versus workspace_list_documents or other workspace-related tools, and no exclusions stated.

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

workspace_list_documentsA
Read-only

Lists allowed SVG/SVGZ document paths within one workspace using an opaque cursor.

NameRequiredDescriptionDefault
cursorNo
pageSizeNo
workspaceIdYes

Output Schema

NameRequiredDescription
documentsYes
nextCursorNo

TDQS

A3.6/5.0
Behavior3/5

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

readOnlyHint=true already declares the safe-read profile, so the bar is lower. The description adds useful context beyond the annotation: results are restricted to 'allowed' documents (implying permission filtering) and pagination is driven by an 'opaque cursor'. It does not say what the cursor's opacity implies for stability or what the response contains, but the output schema covers returns.

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 front-loaded sentence with no filler. Verb, resource, scope, and mechanism all land in one pass with nothing redundant.

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?

An output schema exists, so return values need no explanation, and for a read-only listing the description covers scope and paging. It is nearly complete, missing only explicit guidance on alternatives and on the pageSize 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 description coverage is 0%, so the description must carry parameter meaning. It conveys the two most important semantics, workspace scoping (workspaceId) and the opaque cursor for pagination, but says nothing about pageSize or its default/max bounds, leaving one of three parameters unaddressed.

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?

States a specific verb ('Lists') and resource ('allowed SVG/SVGZ document paths within one workspace'), including the return filter (allowed SVG/SVGZ) and pagination mechanism. It is distinguishable from workspace_list, but never explicitly says how it differs from that sibling, keeping it below 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?

Usage is implied: list documents belonging to a given workspace. There is no explicit when-to-use guidance, no mention of when to prefer workspace_list or document_import_svg, and no prerequisites or exclusions stated.

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. 90 tool updatesv0.1.0
    • Addedaccessibility_inspect
    • Addedartifact_read_chunk
    • Addedassets_package
    • Addedclips_manage
    • Addedcolor_management_inspect
    • Addedconnector_create
    • Addedconnector_retarget
    • Addedconnector_route
    • Addeddefs_vacuum
    • Addeddocument_apply_operations
    • Changeddocument_create2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / pages / items / additionalProperties
        Added value: +false
    • Addeddocument_export
    • Addeddocument_export_batch
    • Addeddocument_export_preset_plan
    • Addeddocument_fit_page
    • Addeddocument_import
    • Addeddocument_import_capabilities
    • Addeddocument_import_emf
    • Addeddocument_import_pdf
    • Addeddocument_import_postscript
    • Addeddocument_import_raster
    • Addeddocument_import_svg
    • Changeddocument_inspect20 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / includeVisualBounds
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / inventoryKinds
        Added value: +{
        +  "items": {
        +    "pattern": "^[A-Za-z][A-Za-z0-9-]{0,127}$",
        +    "type": "string"
        +  },
        +  "maxItems": 100,
        +  "type": "array"
        +}
      • addedInput schema / properties / inventoryLimit
        Added value: +{
        +  "maximum": 1000,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / inventoryOffset
        Added value: +{
        +  "default": 0,
        +  "maximum": 100000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / ambiguousViewport
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / inventory / properties / definitions
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "filters": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "primitiveCount": {
        +            "maximum": 9007199254740991,
        +            "minimum": 0,
        +            "type": "integer"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "primitiveCount"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "gradients": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "kind": {
        +            "enum": [
        +              "linear",
        +              "radial"
        +            ],
        +            "type": "string"
        +          },
        +          "stopCount": {
        +            "maximum": 9007199254740991,
        +            "minimum": 0,
        +            "type": "integer"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "kind",
        +          "stopCount"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "patterns": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "height": {
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "width": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "filters",
        +    "gradients",
        +    "patterns"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / inventory / properties / fontWarnings
        Added value: +{
        +  "prefixItems": [
        +    {
        +      "const": "FONT_RESOLUTION_UNAVAILABLE",
        +      "type": "string"
        +    }
        +  ],
        +  "type": "array"
        +}
      • addedOutput schema / properties / inventory / properties / images / items / properties / display
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "height": {
        +      "type": "string"
        +    },
        +    "width": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / inventory / properties / images / items / properties / intrinsic
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "height": {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    },
        +    "status": {
        +      "enum": [
        +        "available",
        +        "unavailable"
        +      ],
        +      "type": "string"
        +    },
        +    "width": {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / properties / inventory / properties / images / items / required
        Previous value: -[
        -  "kind"
        -]New value: +[
        +  "display",
        +  "intrinsic",
        +  "kind"
        +]
      • addedOutput schema / properties / inventory / properties / nextOffset
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / inventory / properties / offset
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / inventory / properties / totalElementCount
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / inventory / required
        Previous value: -[
        -  "duplicateIds",
        -  "elementCount",
        -  "externalResourceCount",
        -  "fontFamilies",
        -  "fontResolution",
        -  "images",
        -  "ids",
        -  "layers",
        -  "namespaces",
        -  "paintUsage",
        -  "typeCounts",
        -  "truncated",
        -  "unknownNamespaces",
        -  "unresolvedReferences"
        -]New value: +[
        +  "definitions",
        +  "duplicateIds",
        +  "elementCount",
        +  "externalResourceCount",
        +  "fontFamilies",
        +  "fontWarnings",
        +  "fontResolution",
        +  "images",
        +  "ids",
        +  "layers",
        +  "namespaces",
        +  "offset",
        +  "paintUsage",
        +  "totalElementCount",
        +  "typeCounts",
        +  "truncated",
        +  "unknownNamespaces",
        +  "unresolvedReferences"
        +]
      • addedOutput schema / properties / normalization
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "height": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "raw": {
        +          "type": "string"
        +        },
        +        "source": {
        +          "enum": [
        +            "defaulted",
        +            "explicit",
        +            "percentage_fallback"
        +          ],
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "source"
        +      ],
        +      "type": "object"
        +    },
        +    "viewBox": {
        +      "enum": [
        +        "explicit",
        +        "inferred_from_viewport"
        +      ],
        +      "type": "string"
        +    },
        +    "width": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "raw": {
        +          "type": "string"
        +        },
        +        "source": {
        +          "enum": [
        +            "defaulted",
        +            "explicit",
        +            "percentage_fallback"
        +          ],
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "source"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "height",
        +    "viewBox",
        +    "width"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / resources
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "id": {
        +      "pattern": "^doc_[a-f0-9]{32}$",
        +      "type": "string"
        +    },
        +    "metadataUri": {
        +      "pattern": "^inkscape:\\/\\/document\\/doc_[a-f0-9]{32}\\/metadata$",
        +      "type": "string"
        +    },
        +    "summaryUri": {
        +      "pattern": "^inkscape:\\/\\/document\\/doc_[a-f0-9]{32}\\/summary$",
        +      "type": "string"
        +    },
        +    "svgUri": {
        +      "pattern": "^inkscape:\\/\\/document\\/doc_[a-f0-9]{32}\\/svg$",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "metadataUri",
        +    "summaryUri",
        +    "svgUri"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / visualBounds
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "fidelity": {
        +      "const": "partial",
        +      "type": "string"
        +    },
        +    "global": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "height": {
        +          "exclusiveMinimum": 0,
        +          "type": "number"
        +        },
        +        "width": {
        +          "exclusiveMinimum": 0,
        +          "type": "number"
        +        },
        +        "x": {
        +          "type": "number"
        +        },
        +        "y": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "height",
        +        "width",
        +        "x",
        +        "y"
        +      ],
        +      "type": "object"
        +    },
        +    "limitations": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "pages": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "bounds": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "height": {
        +                "exclusiveMinimum": 0,
        +                "type": "number"
        +              },
        +              "width": {
        +                "exclusiveMinimum": 0,
        +                "type": "number"
        +              },
        +              "x": {
        +                "type": "number"
        +              },
        +              "y": {
        +                "type": "number"
        +              }
        +            },
        +            "required": [
        +              "height",
        +              "width",
        +              "x",
        +              "y"
        +            ],
        +            "type": "object"
        +          },
        +          "id": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "source": {
        +      "const": "inkscape-query-all",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "fidelity",
        +    "limitations",
        +    "pages",
        +    "source"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "enum": [
        +      "VIEWBOX_MISSING_INFERRED_FROM_VIEWPORT",
        +      "VIEWPORT_HEIGHT_DEFAULTED",
        +      "VIEWPORT_HEIGHT_PERCENTAGE_UNRESOLVED",
        +      "VIEWPORT_HEIGHT_UNITLESS_NORMALIZED",
        +      "VIEWPORT_WIDTH_DEFAULTED",
        +      "VIEWPORT_WIDTH_PERCENTAGE_UNRESOLVED",
        +      "VIEWPORT_WIDTH_UNITLESS_NORMALIZED"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "height",
        -  "heightUnit",
        -  "inspectionLevel",
        -  "pages",
        -  "revision",
        -  "viewBox",
        -  "width",
        -  "widthUnit"
        -]New value: +[
        +  "ambiguousViewport",
        +  "height",
        +  "heightUnit",
        +  "inspectionLevel",
        +  "normalization",
        +  "pages",
        +  "revision",
        +  "resources",
        +  "viewBox",
        +  "width",
        +  "widthUnit",
        +  "warnings"
        +]
    • Addeddocument_normalize_ids
    • Addeddocument_optimize
    • Addeddocument_page_adjust
    • Addeddocument_page_validate
    • Changeddocument_pages3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / page / additionalProperties
        Added value: +false
      • addedInput schema / properties / patch / additionalProperties
        Added value: +false
    • Changeddocument_preflight3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / bleed
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "behavior": {
        +      "enum": [
        +        "metadata-only",
        +        "expand-temporary-page"
        +      ],
        +      "type": "string"
        +    },
        +    "bottom": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "unit": {
        +          "enum": [
        +            "mm",
        +            "cm",
        +            "in",
        +            "pt",
        +            "pc",
        +            "q"
        +          ],
        +          "type": "string"
        +        },
        +        "value": {
        +          "minimum": 0,
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "unit",
        +        "value"
        +      ],
        +      "type": "object"
        +    },
        +    "left": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "unit": {
        +          "enum": [
        +            "mm",
        +            "cm",
        +            "in",
        +            "pt",
        +            "pc",
        +            "q"
        +          ],
        +          "type": "string"
        +        },
        +        "value": {
        +          "minimum": 0,
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "unit",
        +        "value"
        +      ],
        +      "type": "object"
        +    },
        +    "right": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "unit": {
        +          "enum": [
        +            "mm",
        +            "cm",
        +            "in",
        +            "pt",
        +            "pc",
        +            "q"
        +          ],
        +          "type": "string"
        +        },
        +        "value": {
        +          "minimum": 0,
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "unit",
        +        "value"
        +      ],
        +      "type": "object"
        +    },
        +    "top": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "unit": {
        +          "enum": [
        +            "mm",
        +            "cm",
        +            "in",
        +            "pt",
        +            "pc",
        +            "q"
        +          ],
        +          "type": "string"
        +        },
        +        "value": {
        +          "minimum": 0,
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "unit",
        +        "value"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "behavior",
        +    "bottom",
        +    "left",
        +    "right",
        +    "top"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / print
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "bleed": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "behavior": {
        +          "enum": [
        +            "metadata-only",
        +            "expand-temporary-page"
        +          ],
        +          "type": "string"
        +        },
        +        "missingMm": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "bottom": {
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "left": {
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "right": {
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "top": {
        +              "minimum": 0,
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "bottom",
        +            "left",
        +            "right",
        +            "top"
        +          ],
        +          "type": "object"
        +        },
        +        "presentMm": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "bottom": {
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "left": {
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "right": {
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "top": {
        +              "minimum": 0,
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "bottom",
        +            "left",
        +            "right",
        +            "top"
        +          ],
        +          "type": "object"
        +        },
        +        "requiredMm": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "bottom": {
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "left": {
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "right": {
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "top": {
        +              "minimum": 0,
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "bottom",
        +            "left",
        +            "right",
        +            "top"
        +          ],
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "behavior",
        +        "missingMm",
        +        "presentMm",
        +        "requiredMm"
        +      ],
        +      "type": "object"
        +    },
        +    "images": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "lowDpiCount": {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "measuredCount": {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "unavailableCount": {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "lowDpiCount",
        +        "measuredCount",
        +        "unavailableCount"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "images"
        +  ],
        +  "type": "object"
        +}
    • Addeddocument_render_preview
    • Changeddocument_resize8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / dryRun
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / contentFidelity
        Added value: +{
        +  "enum": [
        +    "exact",
        +    "not_applicable"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / contentLimitations
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / diff
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "addedIds": {
        +      "items": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "afterElementCount": {
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "ambiguousIds": {
        +      "items": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "beforeElementCount": {
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "changedIds": {
        +      "items": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "removedIds": {
        +      "items": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "addedIds",
        +    "afterElementCount",
        +    "ambiguousIds",
        +    "beforeElementCount",
        +    "changedIds",
        +    "removedIds"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / dryRun
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / predicted
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "diff": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "addedIds": {
        +          "items": {
        +            "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "afterElementCount": {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "ambiguousIds": {
        +          "items": {
        +            "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "beforeElementCount": {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "changedIds": {
        +          "items": {
        +            "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "removedIds": {
        +          "items": {
        +            "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "addedIds",
        +        "afterElementCount",
        +        "ambiguousIds",
        +        "beforeElementCount",
        +        "changedIds",
        +        "removedIds"
        +      ],
        +      "type": "object"
        +    },
        +    "page": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "height": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "unit": {
        +              "enum": [
        +                "mm",
        +                "cm",
        +                "in",
        +                "pt",
        +                "pc",
        +                "q",
        +                "px"
        +              ],
        +              "type": "string"
        +            },
        +            "value": {
        +              "exclusiveMinimum": 0,
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "unit",
        +            "value"
        +          ],
        +          "type": "object"
        +        },
        +        "viewBox": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "height": {
        +              "exclusiveMinimum": 0,
        +              "type": "number"
        +            },
        +            "width": {
        +              "exclusiveMinimum": 0,
        +              "type": "number"
        +            },
        +            "x": {
        +              "type": "number"
        +            },
        +            "y": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "height",
        +            "width",
        +            "x",
        +            "y"
        +          ],
        +          "type": "object"
        +        },
        +        "width": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "unit": {
        +              "enum": [
        +                "mm",
        +                "cm",
        +                "in",
        +                "pt",
        +                "pc",
        +                "q",
        +                "px"
        +              ],
        +              "type": "string"
        +            },
        +            "value": {
        +              "exclusiveMinimum": 0,
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "unit",
        +            "value"
        +          ],
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "height",
        +        "viewBox",
        +        "width"
        +      ],
        +      "type": "object"
        +    },
        +    "transform": {
        +      "prefixItems": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "number"
        +        }
        +      ],
        +      "type": "array"
        +    },
        +    "warnings": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "diff",
        +    "page",
        +    "warnings"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "backupCreated",
        -  "revision",
        -  "warnings"
        -]New value: +[
        +  "backupCreated",
        +  "contentFidelity",
        +  "contentLimitations",
        +  "diff",
        +  "dryRun",
        +  "revision",
        +  "warnings"
        +]
    • Addeddocument_restore
    • Changeddocument_settings2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / settings / additionalProperties
        Added value: +false
    • Addeddocument_snapshot
    • Addedelements_align
    • Changedelements_arrange6 fields changed
      • addedInput schema / oneOf
        Added value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "enum": [
        +          "back",
        +          "front",
        +          "lower",
        +          "raise"
        +        ],
        +        "type": "string"
        +      },
        +      "expectedRevision": {
        +        "pattern": "^[a-f0-9]{64}$",
        +        "type": "string"
        +      },
        +      "ids": {
        +        "items": {
        +          "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +          "type": "string"
        +        },
        +        "maxItems": 100,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "path": {
        +        "maxLength": 1024,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "workspaceId": {
        +        "pattern": "^ws_[a-f0-9]{16}$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "expectedRevision",
        +      "ids",
        +      "path",
        +      "workspaceId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "index",
        +        "type": "string"
        +      },
        +      "expectedRevision": {
        +        "pattern": "^[a-f0-9]{64}$",
        +        "type": "string"
        +      },
        +      "ids": {
        +        "items": {
        +          "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +          "type": "string"
        +        },
        +        "maxItems": 100,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "index": {
        +        "maximum": 100000,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "path": {
        +        "maxLength": 1024,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "workspaceId": {
        +        "pattern": "^ws_[a-f0-9]{16}$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "expectedRevision",
        +      "ids",
        +      "index",
        +      "path",
        +      "workspaceId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "enum": [
        +          "before",
        +          "after"
        +        ],
        +        "type": "string"
        +      },
        +      "expectedRevision": {
        +        "pattern": "^[a-f0-9]{64}$",
        +        "type": "string"
        +      },
        +      "ids": {
        +        "items": {
        +          "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +          "type": "string"
        +        },
        +        "maxItems": 100,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "path": {
        +        "maxLength": 1024,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "relativeTo": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "workspaceId": {
        +        "pattern": "^ws_[a-f0-9]{16}$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "expectedRevision",
        +      "ids",
        +      "path",
        +      "relativeTo",
        +      "workspaceId"
        +    ],
        +    "type": "object"
        +  }
        +]
      • removedInput schema / properties
        Removed value: -{
        -  "action": {
        -    "enum": [
        -      "back",
        -      "front",
        -      "lower",
        -      "raise"
        -    ],
        -    "type": "string"
        -  },
        -  "expectedRevision": {
        -    "pattern": "^[a-f0-9]{64}$",
        -    "type": "string"
        -  },
        -  "ids": {
        -    "items": {
        -      "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -      "type": "string"
        -    },
        -    "maxItems": 100,
        -    "minItems": 1,
        -    "type": "array"
        -  },
        -  "path": {
        -    "maxLength": 1024,
        -    "minLength": 1,
        -    "type": "string"
        -  },
        -  "workspaceId": {
        -    "pattern": "^ws_[a-f0-9]{16}$",
        -    "type": "string"
        -  }
        -}
      • removedInput schema / required
        Removed value: -[
        -  "action",
        -  "expectedRevision",
        -  "ids",
        -  "path",
        -  "workspaceId"
        -]
      • changedOutput schema / properties / action / enum
        Previous value: -[
        -  "back",
        -  "front",
        -  "lower",
        -  "raise"
        -]New value: +[
        +  "back",
        +  "front",
        +  "lower",
        +  "raise",
        +  "index",
        +  "before",
        +  "after"
        +]
      • addedOutput schema / properties / index
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / relativeTo
        Added value: +{
        +  "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +  "type": "string"
        +}
    • Changedelements_create2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / elements / items / oneOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "height": {
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "id": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "rect",
        -        "type": "string"
        -      },
        -      "parentId": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "rx": {
        -        "minimum": 0,
        -        "type": "number"
        -      },
        -      "ry": {
        -        "minimum": 0,
        -        "type": "number"
        -      },
        -      "style": {
        -        "properties": {
        -          "fill": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "fontFamily": {
        -            "maxLength": 256,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "fontSize": {
        -            "exclusiveMinimum": 0,
        -            "maximum": 10000,
        -            "type": "number"
        -          },
        -          "fontWeight": {
        -            "enum": [
        -              "normal",
        -              "bold"
        -            ],
        -            "type": "string"
        -          },
        -          "opacity": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "stroke": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "strokeWidth": {
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "textAnchor": {
        -            "enum": [
        -              "start",
        -              "middle",
        -              "end"
        -            ],
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "width": {
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "x": {
        -        "type": "number"
        -      },
        -      "y": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "height",
        -      "kind",
        -      "width",
        -      "x",
        -      "y"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "cx": {
        -        "type": "number"
        -      },
        -      "cy": {
        -        "type": "number"
        -      },
        -      "id": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "circle",
        -        "type": "string"
        -      },
        -      "parentId": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "r": {
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "style": {
        -        "properties": {
        -          "fill": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "fontFamily": {
        -            "maxLength": 256,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "fontSize": {
        -            "exclusiveMinimum": 0,
        -            "maximum": 10000,
        -            "type": "number"
        -          },
        -          "fontWeight": {
        -            "enum": [
        -              "normal",
        -              "bold"
        -            ],
        -            "type": "string"
        -          },
        -          "opacity": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "stroke": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "strokeWidth": {
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "textAnchor": {
        -            "enum": [
        -              "start",
        -              "middle",
        -              "end"
        -            ],
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "cx",
        -      "cy",
        -      "kind",
        -      "r"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "cx": {
        -        "type": "number"
        -      },
        -      "cy": {
        -        "type": "number"
        -      },
        -      "id": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "ellipse",
        -        "type": "string"
        -      },
        -      "parentId": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "rx": {
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "ry": {
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "style": {
        -        "properties": {
        -          "fill": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "fontFamily": {
        -            "maxLength": 256,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "fontSize": {
        -            "exclusiveMinimum": 0,
        -            "maximum": 10000,
        -            "type": "number"
        -          },
        -          "fontWeight": {
        -            "enum": [
        -              "normal",
        -              "bold"
        -            ],
        -            "type": "string"
        -          },
        -          "opacity": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "stroke": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "strokeWidth": {
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "textAnchor": {
        -            "enum": [
        -              "start",
        -              "middle",
        -              "end"
        -            ],
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "cx",
        -      "cy",
        -      "kind",
        -      "rx",
        -      "ry"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "cx": {
        -        "type": "number"
        -      },
        -      "cy": {
        -        "type": "number"
        -      },
        -      "id": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "regular_polygon",
        -        "type": "string"
        -      },
        -      "parentId": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "points": {
        -        "maximum": 1000,
        -        "minimum": 3,
        -        "type": "integer"
        -      },
        -      "r": {
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "rotation": {
        -        "type": "number"
        -      },
        -      "style": {
        -        "properties": {
        -          "fill": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "fontFamily": {
        -            "maxLength": 256,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "fontSize": {
        -            "exclusiveMinimum": 0,
        -            "maximum": 10000,
        -            "type": "number"
        -          },
        -          "fontWeight": {
        -            "enum": [
        -              "normal",
        -              "bold"
        -            ],
        -            "type": "string"
        -          },
        -          "opacity": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "stroke": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "strokeWidth": {
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "textAnchor": {
        -            "enum": [
        -              "start",
        -              "middle",
        -              "end"
        -            ],
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "cx",
        -      "cy",
        -      "kind",
        -      "points",
        -      "r"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "cx": {
        -        "type": "number"
        -      },
        -      "cy": {
        -        "type": "number"
        -      },
        -      "id": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "star",
        -        "type": "string"
        -      },
        -      "parentId": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "points": {
        -        "maximum": 1000,
        -        "minimum": 3,
        -        "type": "integer"
        -      },
        -      "r1": {
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "r2": {
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "rotation": {
        -        "type": "number"
        -      },
        -      "style": {
        -        "properties": {
        -          "fill": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "fontFamily": {
        -            "maxLength": 256,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "fontSize": {
        -            "exclusiveMinimum": 0,
        -            "maximum": 10000,
        -            "type": "number"
        -          },
        -          "fontWeight": {
        -            "enum": [
        -              "normal",
        -              "bold"
        -            ],
        -            "type": "string"
        -          },
        -          "opacity": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "stroke": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "strokeWidth": {
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "textAnchor": {
        -            "enum": [
        -              "start",
        -              "middle",
        -              "end"
        -            ],
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "cx",
        -      "cy",
        -      "kind",
        -      "points",
        -      "r1",
        -      "r2"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "id": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "line",
        -        "type": "string"
        -      },
        -      "parentId": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "style": {
        -        "properties": {
        -          "fill": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "fontFamily": {
        -            "maxLength": 256,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "fontSize": {
        -            "exclusiveMinimum": 0,
        -            "maximum": 10000,
        -            "type": "number"
        -          },
        -          "fontWeight": {
        -            "enum": [
        -              "normal",
        -              "bold"
        -            ],
        -            "type": "string"
        -          },
        -          "opacity": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "stroke": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "strokeWidth": {
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "textAnchor": {
        -            "enum": [
        -              "start",
        -              "middle",
        -              "end"
        -            ],
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "x1": {
        -        "type": "number"
        -      },
        -      "x2": {
        -        "type": "number"
        -      },
        -      "y1": {
        -        "type": "number"
        -      },
        -      "y2": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "x1",
        -      "x2",
        -      "y1",
        -      "y2"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "id": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "polygon",
        -        "type": "string"
        -      },
        -      "parentId": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "points": {
        -        "items": {
        -          "properties": {
        -            "x": {
        -              "type": "number"
        -            },
        -            "y": {
        -              "type": "number"
        -            }
        -          },
        -          "required": [
        -            "x",
        -            "y"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 1000,
        -        "minItems": 2,
        -        "type": "array"
        -      },
        -      "style": {
        -        "properties": {
        -          "fill": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "fontFamily": {
        -            "maxLength": 256,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "fontSize": {
        -            "exclusiveMinimum": 0,
        -            "maximum": 10000,
        -            "type": "number"
        -          },
        -          "fontWeight": {
        -            "enum": [
        -              "normal",
        -              "bold"
        -            ],
        -            "type": "string"
        -          },
        -          "opacity": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "stroke": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "strokeWidth": {
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "textAnchor": {
        -            "enum": [
        -              "start",
        -              "middle",
        -              "end"
        -            ],
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "points"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "id": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "polyline",
        -        "type": "string"
        -      },
        -      "parentId": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "points": {
        -        "items": {
        -          "properties": {
        -            "x": {
        -              "type": "number"
        -            },
        -            "y": {
        -              "type": "number"
        -            }
        -          },
        -          "required": [
        -            "x",
        -            "y"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 1000,
        -        "minItems": 2,
        -        "type": "array"
        -      },
        -      "style": {
        -        "properties": {
        -          "fill": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "fontFamily": {
        -            "maxLength": 256,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "fontSize": {
        -            "exclusiveMinimum": 0,
        -            "maximum": 10000,
        -            "type": "number"
        -          },
        -          "fontWeight": {
        -            "enum": [
        -              "normal",
        -              "bold"
        -            ],
        -            "type": "string"
        -          },
        -          "opacity": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "stroke": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "strokeWidth": {
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "textAnchor": {
        -            "enum": [
        -              "start",
        -              "middle",
        -              "end"
        -            ],
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "points"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "d": {
        -        "maxLength": 100000,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "id": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "path",
        -        "type": "string"
        -      },
        -      "parentId": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "style": {
        -        "properties": {
        -          "fill": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "fontFamily": {
        -            "maxLength": 256,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "fontSize": {
        -            "exclusiveMinimum": 0,
        -            "maximum": 10000,
        -            "type": "number"
        -          },
        -          "fontWeight": {
        -            "enum": [
        -              "normal",
        -              "bold"
        -            ],
        -            "type": "string"
        -          },
        -          "opacity": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "stroke": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "strokeWidth": {
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "textAnchor": {
        -            "enum": [
        -              "start",
        -              "middle",
        -              "end"
        -            ],
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "d"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "id": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "text",
        -        "type": "string"
        -      },
        -      "parentId": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "spans": {
        -        "items": {
        -          "properties": {
        -            "dx": {
        -              "type": "number"
        -            },
        -            "dy": {
        -              "type": "number"
        -            },
        -            "text": {
        -              "maxLength": 10000,
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "text"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 100,
        -        "type": "array"
        -      },
        -      "style": {
        -        "properties": {
        -          "fill": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "fontFamily": {
        -            "maxLength": 256,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "fontSize": {
        -            "exclusiveMinimum": 0,
        -            "maximum": 10000,
        -            "type": "number"
        -          },
        -          "fontWeight": {
        -            "enum": [
        -              "normal",
        -              "bold"
        -            ],
        -            "type": "string"
        -          },
        -          "opacity": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "stroke": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "strokeWidth": {
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "textAnchor": {
        -            "enum": [
        -              "start",
        -              "middle",
        -              "end"
        -            ],
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "text": {
        -        "maxLength": 10000,
        -        "type": "string"
        -      },
        -      "x": {
        -        "type": "number"
        -      },
        -      "y": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "text",
        -      "x",
        -      "y"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "id": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "group",
        -        "type": "string"
        -      },
        -      "parentId": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "style": {
        -        "properties": {
        -          "fill": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "fontFamily": {
        -            "maxLength": 256,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "fontSize": {
        -            "exclusiveMinimum": 0,
        -            "maximum": 10000,
        -            "type": "number"
        -          },
        -          "fontWeight": {
        -            "enum": [
        -              "normal",
        -              "bold"
        -            ],
        -            "type": "string"
        -          },
        -          "opacity": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "stroke": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "strokeWidth": {
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "textAnchor": {
        -            "enum": [
        -              "start",
        -              "middle",
        -              "end"
        -            ],
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "id": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "layer",
        -        "type": "string"
        -      },
        -      "label": {
        -        "maxLength": 256,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "parentId": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "style": {
        -        "properties": {
        -          "fill": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "fontFamily": {
        -            "maxLength": 256,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "fontSize": {
        -            "exclusiveMinimum": 0,
        -            "maximum": 10000,
        -            "type": "number"
        -          },
        -          "fontWeight": {
        -            "enum": [
        -              "normal",
        -              "bold"
        -            ],
        -            "type": "string"
        -          },
        -          "opacity": {
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "stroke": {
        -            "pattern": "^#[a-fA-F0-9]{6}$",
        -            "type": "string"
        -          },
        -          "strokeWidth": {
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "textAnchor": {
        -            "enum": [
        -              "start",
        -              "middle",
        -              "end"
        -            ],
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "kind"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "height": {
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "id": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "rect",
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "rx": {
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "ry": {
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "style": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "classes": {
        +            "items": {
        +              "pattern": "^[A-Za-z_][A-Za-z0-9_-]{0,63}$",
        +              "type": "string"
        +            },
        +            "maxItems": 32,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "display": {
        +            "enum": [
        +              "inline",
        +              "none"
        +            ],
        +            "type": "string"
        +          },
        +          "fill": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "fillOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "fillRule": {
        +            "enum": [
        +              "nonzero",
        +              "evenodd"
        +            ],
        +            "type": "string"
        +          },
        +          "fontFamily": {
        +            "maxLength": 256,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "fontSize": {
        +            "exclusiveMinimum": 0,
        +            "maximum": 10000,
        +            "type": "number"
        +          },
        +          "fontStyle": {
        +            "enum": [
        +              "normal",
        +              "italic",
        +              "oblique"
        +            ],
        +            "type": "string"
        +          },
        +          "fontWeight": {
        +            "anyOf": [
        +              {
        +                "enum": [
        +                  "normal",
        +                  "bold"
        +                ],
        +                "type": "string"
        +              },
        +              {
        +                "maximum": 900,
        +                "minimum": 100,
        +                "type": "integer"
        +              }
        +            ]
        +          },
        +          "letterSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          },
        +          "locked": {
        +            "type": "boolean"
        +          },
        +          "opacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "paintOrder": {
        +            "enum": [
        +              "normal",
        +              "fill stroke markers",
        +              "stroke fill markers"
        +            ],
        +            "type": "string"
        +          },
        +          "stroke": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "strokeDasharray": {
        +            "items": {
        +              "maximum": 100000,
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "maxItems": 32,
        +            "type": "array"
        +          },
        +          "strokeLineCap": {
        +            "enum": [
        +              "butt",
        +              "round",
        +              "square"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeLineJoin": {
        +            "enum": [
        +              "miter",
        +              "round",
        +              "bevel"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeMiterLimit": {
        +            "maximum": 100000,
        +            "minimum": 1,
        +            "type": "number"
        +          },
        +          "strokeOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "strokeWidth": {
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "textAnchor": {
        +            "enum": [
        +              "start",
        +              "middle",
        +              "end"
        +            ],
        +            "type": "string"
        +          },
        +          "visibility": {
        +            "enum": [
        +              "visible",
        +              "hidden"
        +            ],
        +            "type": "string"
        +          },
        +          "wordSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "width": {
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "x": {
        +        "type": "number"
        +      },
        +      "y": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "height",
        +      "kind",
        +      "width",
        +      "x",
        +      "y"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "cx": {
        +        "type": "number"
        +      },
        +      "cy": {
        +        "type": "number"
        +      },
        +      "id": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "circle",
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "r": {
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "style": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "classes": {
        +            "items": {
        +              "pattern": "^[A-Za-z_][A-Za-z0-9_-]{0,63}$",
        +              "type": "string"
        +            },
        +            "maxItems": 32,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "display": {
        +            "enum": [
        +              "inline",
        +              "none"
        +            ],
        +            "type": "string"
        +          },
        +          "fill": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "fillOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "fillRule": {
        +            "enum": [
        +              "nonzero",
        +              "evenodd"
        +            ],
        +            "type": "string"
        +          },
        +          "fontFamily": {
        +            "maxLength": 256,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "fontSize": {
        +            "exclusiveMinimum": 0,
        +            "maximum": 10000,
        +            "type": "number"
        +          },
        +          "fontStyle": {
        +            "enum": [
        +              "normal",
        +              "italic",
        +              "oblique"
        +            ],
        +            "type": "string"
        +          },
        +          "fontWeight": {
        +            "anyOf": [
        +              {
        +                "enum": [
        +                  "normal",
        +                  "bold"
        +                ],
        +                "type": "string"
        +              },
        +              {
        +                "maximum": 900,
        +                "minimum": 100,
        +                "type": "integer"
        +              }
        +            ]
        +          },
        +          "letterSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          },
        +          "locked": {
        +            "type": "boolean"
        +          },
        +          "opacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "paintOrder": {
        +            "enum": [
        +              "normal",
        +              "fill stroke markers",
        +              "stroke fill markers"
        +            ],
        +            "type": "string"
        +          },
        +          "stroke": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "strokeDasharray": {
        +            "items": {
        +              "maximum": 100000,
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "maxItems": 32,
        +            "type": "array"
        +          },
        +          "strokeLineCap": {
        +            "enum": [
        +              "butt",
        +              "round",
        +              "square"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeLineJoin": {
        +            "enum": [
        +              "miter",
        +              "round",
        +              "bevel"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeMiterLimit": {
        +            "maximum": 100000,
        +            "minimum": 1,
        +            "type": "number"
        +          },
        +          "strokeOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "strokeWidth": {
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "textAnchor": {
        +            "enum": [
        +              "start",
        +              "middle",
        +              "end"
        +            ],
        +            "type": "string"
        +          },
        +          "visibility": {
        +            "enum": [
        +              "visible",
        +              "hidden"
        +            ],
        +            "type": "string"
        +          },
        +          "wordSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "cx",
        +      "cy",
        +      "kind",
        +      "r"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "cx": {
        +        "type": "number"
        +      },
        +      "cy": {
        +        "type": "number"
        +      },
        +      "id": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "spiral",
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "r": {
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "rotation": {
        +        "type": "number"
        +      },
        +      "style": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "classes": {
        +            "items": {
        +              "pattern": "^[A-Za-z_][A-Za-z0-9_-]{0,63}$",
        +              "type": "string"
        +            },
        +            "maxItems": 32,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "display": {
        +            "enum": [
        +              "inline",
        +              "none"
        +            ],
        +            "type": "string"
        +          },
        +          "fill": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "fillOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "fillRule": {
        +            "enum": [
        +              "nonzero",
        +              "evenodd"
        +            ],
        +            "type": "string"
        +          },
        +          "fontFamily": {
        +            "maxLength": 256,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "fontSize": {
        +            "exclusiveMinimum": 0,
        +            "maximum": 10000,
        +            "type": "number"
        +          },
        +          "fontStyle": {
        +            "enum": [
        +              "normal",
        +              "italic",
        +              "oblique"
        +            ],
        +            "type": "string"
        +          },
        +          "fontWeight": {
        +            "anyOf": [
        +              {
        +                "enum": [
        +                  "normal",
        +                  "bold"
        +                ],
        +                "type": "string"
        +              },
        +              {
        +                "maximum": 900,
        +                "minimum": 100,
        +                "type": "integer"
        +              }
        +            ]
        +          },
        +          "letterSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          },
        +          "locked": {
        +            "type": "boolean"
        +          },
        +          "opacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "paintOrder": {
        +            "enum": [
        +              "normal",
        +              "fill stroke markers",
        +              "stroke fill markers"
        +            ],
        +            "type": "string"
        +          },
        +          "stroke": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "strokeDasharray": {
        +            "items": {
        +              "maximum": 100000,
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "maxItems": 32,
        +            "type": "array"
        +          },
        +          "strokeLineCap": {
        +            "enum": [
        +              "butt",
        +              "round",
        +              "square"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeLineJoin": {
        +            "enum": [
        +              "miter",
        +              "round",
        +              "bevel"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeMiterLimit": {
        +            "maximum": 100000,
        +            "minimum": 1,
        +            "type": "number"
        +          },
        +          "strokeOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "strokeWidth": {
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "textAnchor": {
        +            "enum": [
        +              "start",
        +              "middle",
        +              "end"
        +            ],
        +            "type": "string"
        +          },
        +          "visibility": {
        +            "enum": [
        +              "visible",
        +              "hidden"
        +            ],
        +            "type": "string"
        +          },
        +          "wordSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "turns": {
        +        "maximum": 100,
        +        "minimum": 0.1,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "cx",
        +      "cy",
        +      "kind",
        +      "r",
        +      "turns"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "cx": {
        +        "type": "number"
        +      },
        +      "cy": {
        +        "type": "number"
        +      },
        +      "id": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "ellipse",
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "rx": {
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "ry": {
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "style": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "classes": {
        +            "items": {
        +              "pattern": "^[A-Za-z_][A-Za-z0-9_-]{0,63}$",
        +              "type": "string"
        +            },
        +            "maxItems": 32,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "display": {
        +            "enum": [
        +              "inline",
        +              "none"
        +            ],
        +            "type": "string"
        +          },
        +          "fill": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "fillOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "fillRule": {
        +            "enum": [
        +              "nonzero",
        +              "evenodd"
        +            ],
        +            "type": "string"
        +          },
        +          "fontFamily": {
        +            "maxLength": 256,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "fontSize": {
        +            "exclusiveMinimum": 0,
        +            "maximum": 10000,
        +            "type": "number"
        +          },
        +          "fontStyle": {
        +            "enum": [
        +              "normal",
        +              "italic",
        +              "oblique"
        +            ],
        +            "type": "string"
        +          },
        +          "fontWeight": {
        +            "anyOf": [
        +              {
        +                "enum": [
        +                  "normal",
        +                  "bold"
        +                ],
        +                "type": "string"
        +              },
        +              {
        +                "maximum": 900,
        +                "minimum": 100,
        +                "type": "integer"
        +              }
        +            ]
        +          },
        +          "letterSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          },
        +          "locked": {
        +            "type": "boolean"
        +          },
        +          "opacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "paintOrder": {
        +            "enum": [
        +              "normal",
        +              "fill stroke markers",
        +              "stroke fill markers"
        +            ],
        +            "type": "string"
        +          },
        +          "stroke": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "strokeDasharray": {
        +            "items": {
        +              "maximum": 100000,
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "maxItems": 32,
        +            "type": "array"
        +          },
        +          "strokeLineCap": {
        +            "enum": [
        +              "butt",
        +              "round",
        +              "square"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeLineJoin": {
        +            "enum": [
        +              "miter",
        +              "round",
        +              "bevel"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeMiterLimit": {
        +            "maximum": 100000,
        +            "minimum": 1,
        +            "type": "number"
        +          },
        +          "strokeOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "strokeWidth": {
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "textAnchor": {
        +            "enum": [
        +              "start",
        +              "middle",
        +              "end"
        +            ],
        +            "type": "string"
        +          },
        +          "visibility": {
        +            "enum": [
        +              "visible",
        +              "hidden"
        +            ],
        +            "type": "string"
        +          },
        +          "wordSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "cx",
        +      "cy",
        +      "kind",
        +      "rx",
        +      "ry"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "cx": {
        +        "type": "number"
        +      },
        +      "cy": {
        +        "type": "number"
        +      },
        +      "id": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "regular_polygon",
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "points": {
        +        "maximum": 1000,
        +        "minimum": 3,
        +        "type": "integer"
        +      },
        +      "r": {
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "rotation": {
        +        "type": "number"
        +      },
        +      "style": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "classes": {
        +            "items": {
        +              "pattern": "^[A-Za-z_][A-Za-z0-9_-]{0,63}$",
        +              "type": "string"
        +            },
        +            "maxItems": 32,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "display": {
        +            "enum": [
        +              "inline",
        +              "none"
        +            ],
        +            "type": "string"
        +          },
        +          "fill": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "fillOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "fillRule": {
        +            "enum": [
        +              "nonzero",
        +              "evenodd"
        +            ],
        +            "type": "string"
        +          },
        +          "fontFamily": {
        +            "maxLength": 256,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "fontSize": {
        +            "exclusiveMinimum": 0,
        +            "maximum": 10000,
        +            "type": "number"
        +          },
        +          "fontStyle": {
        +            "enum": [
        +              "normal",
        +              "italic",
        +              "oblique"
        +            ],
        +            "type": "string"
        +          },
        +          "fontWeight": {
        +            "anyOf": [
        +              {
        +                "enum": [
        +                  "normal",
        +                  "bold"
        +                ],
        +                "type": "string"
        +              },
        +              {
        +                "maximum": 900,
        +                "minimum": 100,
        +                "type": "integer"
        +              }
        +            ]
        +          },
        +          "letterSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          },
        +          "locked": {
        +            "type": "boolean"
        +          },
        +          "opacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "paintOrder": {
        +            "enum": [
        +              "normal",
        +              "fill stroke markers",
        +              "stroke fill markers"
        +            ],
        +            "type": "string"
        +          },
        +          "stroke": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "strokeDasharray": {
        +            "items": {
        +              "maximum": 100000,
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "maxItems": 32,
        +            "type": "array"
        +          },
        +          "strokeLineCap": {
        +            "enum": [
        +              "butt",
        +              "round",
        +              "square"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeLineJoin": {
        +            "enum": [
        +              "miter",
        +              "round",
        +              "bevel"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeMiterLimit": {
        +            "maximum": 100000,
        +            "minimum": 1,
        +            "type": "number"
        +          },
        +          "strokeOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "strokeWidth": {
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "textAnchor": {
        +            "enum": [
        +              "start",
        +              "middle",
        +              "end"
        +            ],
        +            "type": "string"
        +          },
        +          "visibility": {
        +            "enum": [
        +              "visible",
        +              "hidden"
        +            ],
        +            "type": "string"
        +          },
        +          "wordSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "cx",
        +      "cy",
        +      "kind",
        +      "points",
        +      "r"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "cx": {
        +        "type": "number"
        +      },
        +      "cy": {
        +        "type": "number"
        +      },
        +      "id": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "star",
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "points": {
        +        "maximum": 1000,
        +        "minimum": 3,
        +        "type": "integer"
        +      },
        +      "r1": {
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "r2": {
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "rotation": {
        +        "type": "number"
        +      },
        +      "style": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "classes": {
        +            "items": {
        +              "pattern": "^[A-Za-z_][A-Za-z0-9_-]{0,63}$",
        +              "type": "string"
        +            },
        +            "maxItems": 32,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "display": {
        +            "enum": [
        +              "inline",
        +              "none"
        +            ],
        +            "type": "string"
        +          },
        +          "fill": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "fillOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "fillRule": {
        +            "enum": [
        +              "nonzero",
        +              "evenodd"
        +            ],
        +            "type": "string"
        +          },
        +          "fontFamily": {
        +            "maxLength": 256,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "fontSize": {
        +            "exclusiveMinimum": 0,
        +            "maximum": 10000,
        +            "type": "number"
        +          },
        +          "fontStyle": {
        +            "enum": [
        +              "normal",
        +              "italic",
        +              "oblique"
        +            ],
        +            "type": "string"
        +          },
        +          "fontWeight": {
        +            "anyOf": [
        +              {
        +                "enum": [
        +                  "normal",
        +                  "bold"
        +                ],
        +                "type": "string"
        +              },
        +              {
        +                "maximum": 900,
        +                "minimum": 100,
        +                "type": "integer"
        +              }
        +            ]
        +          },
        +          "letterSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          },
        +          "locked": {
        +            "type": "boolean"
        +          },
        +          "opacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "paintOrder": {
        +            "enum": [
        +              "normal",
        +              "fill stroke markers",
        +              "stroke fill markers"
        +            ],
        +            "type": "string"
        +          },
        +          "stroke": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "strokeDasharray": {
        +            "items": {
        +              "maximum": 100000,
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "maxItems": 32,
        +            "type": "array"
        +          },
        +          "strokeLineCap": {
        +            "enum": [
        +              "butt",
        +              "round",
        +              "square"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeLineJoin": {
        +            "enum": [
        +              "miter",
        +              "round",
        +              "bevel"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeMiterLimit": {
        +            "maximum": 100000,
        +            "minimum": 1,
        +            "type": "number"
        +          },
        +          "strokeOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "strokeWidth": {
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "textAnchor": {
        +            "enum": [
        +              "start",
        +              "middle",
        +              "end"
        +            ],
        +            "type": "string"
        +          },
        +          "visibility": {
        +            "enum": [
        +              "visible",
        +              "hidden"
        +            ],
        +            "type": "string"
        +          },
        +          "wordSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "cx",
        +      "cy",
        +      "kind",
        +      "points",
        +      "r1",
        +      "r2"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "id": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "line",
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "style": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "classes": {
        +            "items": {
        +              "pattern": "^[A-Za-z_][A-Za-z0-9_-]{0,63}$",
        +              "type": "string"
        +            },
        +            "maxItems": 32,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "display": {
        +            "enum": [
        +              "inline",
        +              "none"
        +            ],
        +            "type": "string"
        +          },
        +          "fill": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "fillOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "fillRule": {
        +            "enum": [
        +              "nonzero",
        +              "evenodd"
        +            ],
        +            "type": "string"
        +          },
        +          "fontFamily": {
        +            "maxLength": 256,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "fontSize": {
        +            "exclusiveMinimum": 0,
        +            "maximum": 10000,
        +            "type": "number"
        +          },
        +          "fontStyle": {
        +            "enum": [
        +              "normal",
        +              "italic",
        +              "oblique"
        +            ],
        +            "type": "string"
        +          },
        +          "fontWeight": {
        +            "anyOf": [
        +              {
        +                "enum": [
        +                  "normal",
        +                  "bold"
        +                ],
        +                "type": "string"
        +              },
        +              {
        +                "maximum": 900,
        +                "minimum": 100,
        +                "type": "integer"
        +              }
        +            ]
        +          },
        +          "letterSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          },
        +          "locked": {
        +            "type": "boolean"
        +          },
        +          "opacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "paintOrder": {
        +            "enum": [
        +              "normal",
        +              "fill stroke markers",
        +              "stroke fill markers"
        +            ],
        +            "type": "string"
        +          },
        +          "stroke": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "strokeDasharray": {
        +            "items": {
        +              "maximum": 100000,
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "maxItems": 32,
        +            "type": "array"
        +          },
        +          "strokeLineCap": {
        +            "enum": [
        +              "butt",
        +              "round",
        +              "square"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeLineJoin": {
        +            "enum": [
        +              "miter",
        +              "round",
        +              "bevel"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeMiterLimit": {
        +            "maximum": 100000,
        +            "minimum": 1,
        +            "type": "number"
        +          },
        +          "strokeOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "strokeWidth": {
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "textAnchor": {
        +            "enum": [
        +              "start",
        +              "middle",
        +              "end"
        +            ],
        +            "type": "string"
        +          },
        +          "visibility": {
        +            "enum": [
        +              "visible",
        +              "hidden"
        +            ],
        +            "type": "string"
        +          },
        +          "wordSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "x1": {
        +        "type": "number"
        +      },
        +      "x2": {
        +        "type": "number"
        +      },
        +      "y1": {
        +        "type": "number"
        +      },
        +      "y2": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "x1",
        +      "x2",
        +      "y1",
        +      "y2"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "id": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "polygon",
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "points": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "x": {
        +              "type": "number"
        +            },
        +            "y": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "x",
        +            "y"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 1000,
        +        "minItems": 2,
        +        "type": "array"
        +      },
        +      "style": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "classes": {
        +            "items": {
        +              "pattern": "^[A-Za-z_][A-Za-z0-9_-]{0,63}$",
        +              "type": "string"
        +            },
        +            "maxItems": 32,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "display": {
        +            "enum": [
        +              "inline",
        +              "none"
        +            ],
        +            "type": "string"
        +          },
        +          "fill": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "fillOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "fillRule": {
        +            "enum": [
        +              "nonzero",
        +              "evenodd"
        +            ],
        +            "type": "string"
        +          },
        +          "fontFamily": {
        +            "maxLength": 256,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "fontSize": {
        +            "exclusiveMinimum": 0,
        +            "maximum": 10000,
        +            "type": "number"
        +          },
        +          "fontStyle": {
        +            "enum": [
        +              "normal",
        +              "italic",
        +              "oblique"
        +            ],
        +            "type": "string"
        +          },
        +          "fontWeight": {
        +            "anyOf": [
        +              {
        +                "enum": [
        +                  "normal",
        +                  "bold"
        +                ],
        +                "type": "string"
        +              },
        +              {
        +                "maximum": 900,
        +                "minimum": 100,
        +                "type": "integer"
        +              }
        +            ]
        +          },
        +          "letterSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          },
        +          "locked": {
        +            "type": "boolean"
        +          },
        +          "opacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "paintOrder": {
        +            "enum": [
        +              "normal",
        +              "fill stroke markers",
        +              "stroke fill markers"
        +            ],
        +            "type": "string"
        +          },
        +          "stroke": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "strokeDasharray": {
        +            "items": {
        +              "maximum": 100000,
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "maxItems": 32,
        +            "type": "array"
        +          },
        +          "strokeLineCap": {
        +            "enum": [
        +              "butt",
        +              "round",
        +              "square"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeLineJoin": {
        +            "enum": [
        +              "miter",
        +              "round",
        +              "bevel"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeMiterLimit": {
        +            "maximum": 100000,
        +            "minimum": 1,
        +            "type": "number"
        +          },
        +          "strokeOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "strokeWidth": {
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "textAnchor": {
        +            "enum": [
        +              "start",
        +              "middle",
        +              "end"
        +            ],
        +            "type": "string"
        +          },
        +          "visibility": {
        +            "enum": [
        +              "visible",
        +              "hidden"
        +            ],
        +            "type": "string"
        +          },
        +          "wordSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "points"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "id": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "polyline",
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "points": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "x": {
        +              "type": "number"
        +            },
        +            "y": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "x",
        +            "y"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 1000,
        +        "minItems": 2,
        +        "type": "array"
        +      },
        +      "style": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "classes": {
        +            "items": {
        +              "pattern": "^[A-Za-z_][A-Za-z0-9_-]{0,63}$",
        +              "type": "string"
        +            },
        +            "maxItems": 32,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "display": {
        +            "enum": [
        +              "inline",
        +              "none"
        +            ],
        +            "type": "string"
        +          },
        +          "fill": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "fillOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "fillRule": {
        +            "enum": [
        +              "nonzero",
        +              "evenodd"
        +            ],
        +            "type": "string"
        +          },
        +          "fontFamily": {
        +            "maxLength": 256,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "fontSize": {
        +            "exclusiveMinimum": 0,
        +            "maximum": 10000,
        +            "type": "number"
        +          },
        +          "fontStyle": {
        +            "enum": [
        +              "normal",
        +              "italic",
        +              "oblique"
        +            ],
        +            "type": "string"
        +          },
        +          "fontWeight": {
        +            "anyOf": [
        +              {
        +                "enum": [
        +                  "normal",
        +                  "bold"
        +                ],
        +                "type": "string"
        +              },
        +              {
        +                "maximum": 900,
        +                "minimum": 100,
        +                "type": "integer"
        +              }
        +            ]
        +          },
        +          "letterSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          },
        +          "locked": {
        +            "type": "boolean"
        +          },
        +          "opacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "paintOrder": {
        +            "enum": [
        +              "normal",
        +              "fill stroke markers",
        +              "stroke fill markers"
        +            ],
        +            "type": "string"
        +          },
        +          "stroke": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "strokeDasharray": {
        +            "items": {
        +              "maximum": 100000,
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "maxItems": 32,
        +            "type": "array"
        +          },
        +          "strokeLineCap": {
        +            "enum": [
        +              "butt",
        +              "round",
        +              "square"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeLineJoin": {
        +            "enum": [
        +              "miter",
        +              "round",
        +              "bevel"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeMiterLimit": {
        +            "maximum": 100000,
        +            "minimum": 1,
        +            "type": "number"
        +          },
        +          "strokeOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "strokeWidth": {
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "textAnchor": {
        +            "enum": [
        +              "start",
        +              "middle",
        +              "end"
        +            ],
        +            "type": "string"
        +          },
        +          "visibility": {
        +            "enum": [
        +              "visible",
        +              "hidden"
        +            ],
        +            "type": "string"
        +          },
        +          "wordSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "points"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "d": {
        +        "maxLength": 100000,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "id": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "path",
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "style": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "classes": {
        +            "items": {
        +              "pattern": "^[A-Za-z_][A-Za-z0-9_-]{0,63}$",
        +              "type": "string"
        +            },
        +            "maxItems": 32,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "display": {
        +            "enum": [
        +              "inline",
        +              "none"
        +            ],
        +            "type": "string"
        +          },
        +          "fill": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "fillOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "fillRule": {
        +            "enum": [
        +              "nonzero",
        +              "evenodd"
        +            ],
        +            "type": "string"
        +          },
        +          "fontFamily": {
        +            "maxLength": 256,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "fontSize": {
        +            "exclusiveMinimum": 0,
        +            "maximum": 10000,
        +            "type": "number"
        +          },
        +          "fontStyle": {
        +            "enum": [
        +              "normal",
        +              "italic",
        +              "oblique"
        +            ],
        +            "type": "string"
        +          },
        +          "fontWeight": {
        +            "anyOf": [
        +              {
        +                "enum": [
        +                  "normal",
        +                  "bold"
        +                ],
        +                "type": "string"
        +              },
        +              {
        +                "maximum": 900,
        +                "minimum": 100,
        +                "type": "integer"
        +              }
        +            ]
        +          },
        +          "letterSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          },
        +          "locked": {
        +            "type": "boolean"
        +          },
        +          "opacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "paintOrder": {
        +            "enum": [
        +              "normal",
        +              "fill stroke markers",
        +              "stroke fill markers"
        +            ],
        +            "type": "string"
        +          },
        +          "stroke": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "strokeDasharray": {
        +            "items": {
        +              "maximum": 100000,
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "maxItems": 32,
        +            "type": "array"
        +          },
        +          "strokeLineCap": {
        +            "enum": [
        +              "butt",
        +              "round",
        +              "square"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeLineJoin": {
        +            "enum": [
        +              "miter",
        +              "round",
        +              "bevel"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeMiterLimit": {
        +            "maximum": 100000,
        +            "minimum": 1,
        +            "type": "number"
        +          },
        +          "strokeOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "strokeWidth": {
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "textAnchor": {
        +            "enum": [
        +              "start",
        +              "middle",
        +              "end"
        +            ],
        +            "type": "string"
        +          },
        +          "visibility": {
        +            "enum": [
        +              "visible",
        +              "hidden"
        +            ],
        +            "type": "string"
        +          },
        +          "wordSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "d"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "assetPath": {
        +        "maxLength": 1024,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "embedding": {
        +        "default": "link",
        +        "enum": [
        +          "embed",
        +          "link"
        +        ],
        +        "type": "string"
        +      },
        +      "height": {
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "id": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "image",
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "preserveAspectRatio": {
        +        "enum": [
        +          "none",
        +          "xMidYMid meet",
        +          "xMidYMid slice"
        +        ],
        +        "type": "string"
        +      },
        +      "style": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "classes": {
        +            "items": {
        +              "pattern": "^[A-Za-z_][A-Za-z0-9_-]{0,63}$",
        +              "type": "string"
        +            },
        +            "maxItems": 32,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "display": {
        +            "enum": [
        +              "inline",
        +              "none"
        +            ],
        +            "type": "string"
        +          },
        +          "fill": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "fillOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "fillRule": {
        +            "enum": [
        +              "nonzero",
        +              "evenodd"
        +            ],
        +            "type": "string"
        +          },
        +          "fontFamily": {
        +            "maxLength": 256,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "fontSize": {
        +            "exclusiveMinimum": 0,
        +            "maximum": 10000,
        +            "type": "number"
        +          },
        +          "fontStyle": {
        +            "enum": [
        +              "normal",
        +              "italic",
        +              "oblique"
        +            ],
        +            "type": "string"
        +          },
        +          "fontWeight": {
        +            "anyOf": [
        +              {
        +                "enum": [
        +                  "normal",
        +                  "bold"
        +                ],
        +                "type": "string"
        +              },
        +              {
        +                "maximum": 900,
        +                "minimum": 100,
        +                "type": "integer"
        +              }
        +            ]
        +          },
        +          "letterSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          },
        +          "locked": {
        +            "type": "boolean"
        +          },
        +          "opacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "paintOrder": {
        +            "enum": [
        +              "normal",
        +              "fill stroke markers",
        +              "stroke fill markers"
        +            ],
        +            "type": "string"
        +          },
        +          "stroke": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "strokeDasharray": {
        +            "items": {
        +              "maximum": 100000,
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "maxItems": 32,
        +            "type": "array"
        +          },
        +          "strokeLineCap": {
        +            "enum": [
        +              "butt",
        +              "round",
        +              "square"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeLineJoin": {
        +            "enum": [
        +              "miter",
        +              "round",
        +              "bevel"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeMiterLimit": {
        +            "maximum": 100000,
        +            "minimum": 1,
        +            "type": "number"
        +          },
        +          "strokeOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "strokeWidth": {
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "textAnchor": {
        +            "enum": [
        +              "start",
        +              "middle",
        +              "end"
        +            ],
        +            "type": "string"
        +          },
        +          "visibility": {
        +            "enum": [
        +              "visible",
        +              "hidden"
        +            ],
        +            "type": "string"
        +          },
        +          "wordSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "width": {
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "x": {
        +        "type": "number"
        +      },
        +      "y": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "assetPath",
        +      "height",
        +      "kind",
        +      "width",
        +      "x",
        +      "y"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "id": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "text",
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "spans": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "dx": {
        +              "type": "number"
        +            },
        +            "dy": {
        +              "type": "number"
        +            },
        +            "text": {
        +              "maxLength": 10000,
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "text"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 100,
        +        "type": "array"
        +      },
        +      "style": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "classes": {
        +            "items": {
        +              "pattern": "^[A-Za-z_][A-Za-z0-9_-]{0,63}$",
        +              "type": "string"
        +            },
        +            "maxItems": 32,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "display": {
        +            "enum": [
        +              "inline",
        +              "none"
        +            ],
        +            "type": "string"
        +          },
        +          "fill": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "fillOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "fillRule": {
        +            "enum": [
        +              "nonzero",
        +              "evenodd"
        +            ],
        +            "type": "string"
        +          },
        +          "fontFamily": {
        +            "maxLength": 256,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "fontSize": {
        +            "exclusiveMinimum": 0,
        +            "maximum": 10000,
        +            "type": "number"
        +          },
        +          "fontStyle": {
        +            "enum": [
        +              "normal",
        +              "italic",
        +              "oblique"
        +            ],
        +            "type": "string"
        +          },
        +          "fontWeight": {
        +            "anyOf": [
        +              {
        +                "enum": [
        +                  "normal",
        +                  "bold"
        +                ],
        +                "type": "string"
        +              },
        +              {
        +                "maximum": 900,
        +                "minimum": 100,
        +                "type": "integer"
        +              }
        +            ]
        +          },
        +          "letterSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          },
        +          "locked": {
        +            "type": "boolean"
        +          },
        +          "opacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "paintOrder": {
        +            "enum": [
        +              "normal",
        +              "fill stroke markers",
        +              "stroke fill markers"
        +            ],
        +            "type": "string"
        +          },
        +          "stroke": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "strokeDasharray": {
        +            "items": {
        +              "maximum": 100000,
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "maxItems": 32,
        +            "type": "array"
        +          },
        +          "strokeLineCap": {
        +            "enum": [
        +              "butt",
        +              "round",
        +              "square"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeLineJoin": {
        +            "enum": [
        +              "miter",
        +              "round",
        +              "bevel"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeMiterLimit": {
        +            "maximum": 100000,
        +            "minimum": 1,
        +            "type": "number"
        +          },
        +          "strokeOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "strokeWidth": {
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "textAnchor": {
        +            "enum": [
        +              "start",
        +              "middle",
        +              "end"
        +            ],
        +            "type": "string"
        +          },
        +          "visibility": {
        +            "enum": [
        +              "visible",
        +              "hidden"
        +            ],
        +            "type": "string"
        +          },
        +          "wordSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "text": {
        +        "maxLength": 10000,
        +        "type": "string"
        +      },
        +      "x": {
        +        "type": "number"
        +      },
        +      "y": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "text",
        +      "x",
        +      "y"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "id": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "group",
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "style": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "classes": {
        +            "items": {
        +              "pattern": "^[A-Za-z_][A-Za-z0-9_-]{0,63}$",
        +              "type": "string"
        +            },
        +            "maxItems": 32,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "display": {
        +            "enum": [
        +              "inline",
        +              "none"
        +            ],
        +            "type": "string"
        +          },
        +          "fill": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "fillOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "fillRule": {
        +            "enum": [
        +              "nonzero",
        +              "evenodd"
        +            ],
        +            "type": "string"
        +          },
        +          "fontFamily": {
        +            "maxLength": 256,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "fontSize": {
        +            "exclusiveMinimum": 0,
        +            "maximum": 10000,
        +            "type": "number"
        +          },
        +          "fontStyle": {
        +            "enum": [
        +              "normal",
        +              "italic",
        +              "oblique"
        +            ],
        +            "type": "string"
        +          },
        +          "fontWeight": {
        +            "anyOf": [
        +              {
        +                "enum": [
        +                  "normal",
        +                  "bold"
        +                ],
        +                "type": "string"
        +              },
        +              {
        +                "maximum": 900,
        +                "minimum": 100,
        +                "type": "integer"
        +              }
        +            ]
        +          },
        +          "letterSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          },
        +          "locked": {
        +            "type": "boolean"
        +          },
        +          "opacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "paintOrder": {
        +            "enum": [
        +              "normal",
        +              "fill stroke markers",
        +              "stroke fill markers"
        +            ],
        +            "type": "string"
        +          },
        +          "stroke": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "strokeDasharray": {
        +            "items": {
        +              "maximum": 100000,
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "maxItems": 32,
        +            "type": "array"
        +          },
        +          "strokeLineCap": {
        +            "enum": [
        +              "butt",
        +              "round",
        +              "square"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeLineJoin": {
        +            "enum": [
        +              "miter",
        +              "round",
        +              "bevel"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeMiterLimit": {
        +            "maximum": 100000,
        +            "minimum": 1,
        +            "type": "number"
        +          },
        +          "strokeOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "strokeWidth": {
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "textAnchor": {
        +            "enum": [
        +              "start",
        +              "middle",
        +              "end"
        +            ],
        +            "type": "string"
        +          },
        +          "visibility": {
        +            "enum": [
        +              "visible",
        +              "hidden"
        +            ],
        +            "type": "string"
        +          },
        +          "wordSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "id": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "layer",
        +        "type": "string"
        +      },
        +      "label": {
        +        "maxLength": 256,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "parentId": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "style": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "classes": {
        +            "items": {
        +              "pattern": "^[A-Za-z_][A-Za-z0-9_-]{0,63}$",
        +              "type": "string"
        +            },
        +            "maxItems": 32,
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          "display": {
        +            "enum": [
        +              "inline",
        +              "none"
        +            ],
        +            "type": "string"
        +          },
        +          "fill": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "fillOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "fillRule": {
        +            "enum": [
        +              "nonzero",
        +              "evenodd"
        +            ],
        +            "type": "string"
        +          },
        +          "fontFamily": {
        +            "maxLength": 256,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "fontSize": {
        +            "exclusiveMinimum": 0,
        +            "maximum": 10000,
        +            "type": "number"
        +          },
        +          "fontStyle": {
        +            "enum": [
        +              "normal",
        +              "italic",
        +              "oblique"
        +            ],
        +            "type": "string"
        +          },
        +          "fontWeight": {
        +            "anyOf": [
        +              {
        +                "enum": [
        +                  "normal",
        +                  "bold"
        +                ],
        +                "type": "string"
        +              },
        +              {
        +                "maximum": 900,
        +                "minimum": 100,
        +                "type": "integer"
        +              }
        +            ]
        +          },
        +          "letterSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          },
        +          "locked": {
        +            "type": "boolean"
        +          },
        +          "opacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "paintOrder": {
        +            "enum": [
        +              "normal",
        +              "fill stroke markers",
        +              "stroke fill markers"
        +            ],
        +            "type": "string"
        +          },
        +          "stroke": {
        +            "pattern": "^(?:none|#[a-fA-F0-9]{6})$",
        +            "type": "string"
        +          },
        +          "strokeDasharray": {
        +            "items": {
        +              "maximum": 100000,
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "maxItems": 32,
        +            "type": "array"
        +          },
        +          "strokeLineCap": {
        +            "enum": [
        +              "butt",
        +              "round",
        +              "square"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeLineJoin": {
        +            "enum": [
        +              "miter",
        +              "round",
        +              "bevel"
        +            ],
        +            "type": "string"
        +          },
        +          "strokeMiterLimit": {
        +            "maximum": 100000,
        +            "minimum": 1,
        +            "type": "number"
        +          },
        +          "strokeOpacity": {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "strokeWidth": {
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "textAnchor": {
        +            "enum": [
        +              "start",
        +              "middle",
        +              "end"
        +            ],
        +            "type": "string"
        +          },
        +          "visibility": {
        +            "enum": [
        +              "visible",
        +              "hidden"
        +            ],
        +            "type": "string"
        +          },
        +          "wordSpacing": {
        +            "maximum": 10000,
        +            "minimum": -10000,
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "kind"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedelements_delete1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Addedelements_distribute
    • Addedelements_duplicate
    • Addedelements_flatten_transform
    • Changedelements_group1 field changed
      • changedInput schema / oneOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "action": {
        -        "const": "group",
        -        "type": "string"
        -      },
        -      "expectedRevision": {
        -        "pattern": "^[a-f0-9]{64}$",
        -        "type": "string"
        -      },
        -      "groupId": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "ids": {
        -        "items": {
        -          "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -          "type": "string"
        -        },
        -        "maxItems": 100,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "path": {
        -        "maxLength": 1024,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "workspaceId": {
        -        "pattern": "^ws_[a-f0-9]{16}$",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "expectedRevision",
        -      "groupId",
        -      "ids",
        -      "path",
        -      "workspaceId"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "action": {
        -        "const": "ungroup",
        -        "type": "string"
        -      },
        -      "expectedRevision": {
        -        "pattern": "^[a-f0-9]{64}$",
        -        "type": "string"
        -      },
        -      "groupId": {
        -        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        -        "type": "string"
        -      },
        -      "path": {
        -        "maxLength": 1024,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "workspaceId": {
        -        "pattern": "^ws_[a-f0-9]{16}$",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "action",
        -      "expectedRevision",
        -      "groupId",
        -      "path",
        -      "workspaceId"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "group",
        +        "type": "string"
        +      },
        +      "expectedRevision": {
        +        "pattern": "^[a-f0-9]{64}$",
        +        "type": "string"
        +      },
        +      "groupId": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "ids": {
        +        "items": {
        +          "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +          "type": "string"
        +        },
        +        "maxItems": 100,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "path": {
        +        "maxLength": 1024,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "workspaceId": {
        +        "pattern": "^ws_[a-f0-9]{16}$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "expectedRevision",
        +      "groupId",
        +      "ids",
        +      "path",
        +      "workspaceId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "action": {
        +        "const": "ungroup",
        +        "type": "string"
        +      },
        +      "expectedRevision": {
        +        "pattern": "^[a-f0-9]{64}$",
        +        "type": "string"
        +      },
        +      "groupId": {
        +        "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +        "type": "string"
        +      },
        +      "path": {
        +        "maxLength": 1024,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "workspaceId": {
        +        "pattern": "^ws_[a-f0-9]{16}$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "expectedRevision",
        +      "groupId",
        +      "path",
        +      "workspaceId"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedelements_query8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / expectedRevision
        Added value: +{
        +  "pattern": "^[a-f0-9]{64}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / includeBounds
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / includeComputedStyle
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • changedInput schema / properties / kinds / items / enum
        Previous value: -[
        -  "circle",
        -  "ellipse",
        -  "g",
        -  "line",
        -  "polygon",
        -  "polyline",
        -  "rect",
        -  "text"
        -]New value: +[
        +  "circle",
        +  "ellipse",
        +  "g",
        +  "image",
        +  "line",
        +  "path",
        +  "polygon",
        +  "polyline",
        +  "rect",
        +  "text",
        +  "use"
        +]
      • addedInput schema / properties / selector
        Added value: +{
        +  "maxLength": 256,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedOutput schema / properties / elements / items / properties / bounds
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "fidelity": {
        +      "const": "partial",
        +      "type": "string"
        +    },
        +    "height": {
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "kind": {
        +      "const": "visual",
        +      "type": "string"
        +    },
        +    "limitations": {
        +      "prefixItems": [
        +        {
        +          "const": "GEOMETRIC_ENGINE_UNAVAILABLE",
        +          "type": "string"
        +        }
        +      ],
        +      "type": "array"
        +    },
        +    "source": {
        +      "const": "inkscape-query-all",
        +      "type": "string"
        +    },
        +    "width": {
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "x": {
        +      "type": "number"
        +    },
        +    "y": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "fidelity",
        +    "height",
        +    "kind",
        +    "limitations",
        +    "source",
        +    "width",
        +    "x",
        +    "y"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / elements / items / properties / computedStyle
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "fidelity": {
        +      "enum": [
        +        "exact-supported",
        +        "partial"
        +      ],
        +      "type": "string"
        +    },
        +    "limitations": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "properties": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "fidelity",
        +    "limitations",
        +    "properties"
        +  ],
        +  "type": "object"
        +}
    • Addedelements_remove_overlaps
    • Addedelements_reparent
    • Changedelements_transform4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / transform / oneOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "translate",
        -        "type": "string"
        -      },
        -      "x": {
        -        "type": "number"
        -      },
        -      "y": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "x",
        -      "y"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "scale",
        -        "type": "string"
        -      },
        -      "x": {
        -        "type": "number"
        -      },
        -      "y": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "x"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "angle": {
        -        "type": "number"
        -      },
        -      "cx": {
        -        "type": "number"
        -      },
        -      "cy": {
        -        "type": "number"
        -      },
        -      "kind": {
        -        "const": "rotate",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "angle",
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "angle": {
        -        "type": "number"
        -      },
        -      "kind": {
        -        "const": "skew_x",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "angle",
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "angle": {
        -        "type": "number"
        -      },
        -      "kind": {
        -        "const": "skew_y",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "angle",
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "flip_x",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "flip_y",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "a": {
        -        "type": "number"
        -      },
        -      "b": {
        -        "type": "number"
        -      },
        -      "c": {
        -        "type": "number"
        -      },
        -      "d": {
        -        "type": "number"
        -      },
        -      "e": {
        -        "type": "number"
        -      },
        -      "f": {
        -        "type": "number"
        -      },
        -      "kind": {
        -        "const": "matrix",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "a",
        -      "b",
        -      "c",
        -      "d",
        -      "e",
        -      "f",
        -      "kind"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "kind": {
        +        "const": "translate",
        +        "type": "string"
        +      },
        +      "x": {
        +        "type": "number"
        +      },
        +      "y": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "x",
        +      "y"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "kind": {
        +        "const": "scale",
        +        "type": "string"
        +      },
        +      "x": {
        +        "type": "number"
        +      },
        +      "y": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "x"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "angle": {
        +        "type": "number"
        +      },
        +      "cx": {
        +        "type": "number"
        +      },
        +      "cy": {
        +        "type": "number"
        +      },
        +      "kind": {
        +        "const": "rotate",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "angle",
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "angle": {
        +        "type": "number"
        +      },
        +      "kind": {
        +        "const": "skew_x",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "angle",
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "angle": {
        +        "type": "number"
        +      },
        +      "kind": {
        +        "const": "skew_y",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "angle",
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "kind": {
        +        "const": "flip_x",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "kind": {
        +        "const": "flip_y",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "a": {
        +        "type": "number"
        +      },
        +      "b": {
        +        "type": "number"
        +      },
        +      "c": {
        +        "type": "number"
        +      },
        +      "d": {
        +        "type": "number"
        +      },
        +      "e": {
        +        "type": "number"
        +      },
        +      "f": {
        +        "type": "number"
        +      },
        +      "kind": {
        +        "const": "matrix",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "a",
        +      "b",
        +      "c",
        +      "d",
        +      "e",
        +      "f",
        +      "kind"
        +    ],
        +    "type": "object"
        +  }
        +]
      • addedOutput schema / properties / reroutedConnectorIds
        Added value: +{
        +  "items": {
        +    "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "backupCreated",
        -  "ids",
        -  "revision"
        -]New value: +[
        +  "backupCreated",
        +  "ids",
        +  "reroutedConnectorIds",
        +  "revision"
        +]
    • Changedelements_update26 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / elements / items / additionalProperties
        Added value: +false
      • changedInput schema / properties / elements / items / properties / geometry / oneOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "height": {
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "kind": {
        -        "const": "rect",
        -        "type": "string"
        -      },
        -      "rx": {
        -        "minimum": 0,
        -        "type": "number"
        -      },
        -      "ry": {
        -        "minimum": 0,
        -        "type": "number"
        -      },
        -      "width": {
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "x": {
        -        "type": "number"
        -      },
        -      "y": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "cx": {
        -        "type": "number"
        -      },
        -      "cy": {
        -        "type": "number"
        -      },
        -      "kind": {
        -        "const": "circle",
        -        "type": "string"
        -      },
        -      "r": {
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "cx": {
        -        "type": "number"
        -      },
        -      "cy": {
        -        "type": "number"
        -      },
        -      "kind": {
        -        "const": "ellipse",
        -        "type": "string"
        -      },
        -      "rx": {
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "ry": {
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "line",
        -        "type": "string"
        -      },
        -      "x1": {
        -        "type": "number"
        -      },
        -      "x2": {
        -        "type": "number"
        -      },
        -      "y1": {
        -        "type": "number"
        -      },
        -      "y2": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "polygon",
        -        "type": "string"
        -      },
        -      "points": {
        -        "items": {
        -          "properties": {
        -            "x": {
        -              "type": "number"
        -            },
        -            "y": {
        -              "type": "number"
        -            }
        -          },
        -          "required": [
        -            "x",
        -            "y"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 1000,
        -        "minItems": 2,
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "polyline",
        -        "type": "string"
        -      },
        -      "points": {
        -        "items": {
        -          "properties": {
        -            "x": {
        -              "type": "number"
        -            },
        -            "y": {
        -              "type": "number"
        -            }
        -          },
        -          "required": [
        -            "x",
        -            "y"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 1000,
        -        "minItems": 2,
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "text",
        -        "type": "string"
        -      },
        -      "x": {
        -        "type": "number"
        -      },
        -      "y": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "kind"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "height": {
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "kind": {
        +        "const": "rect",
        +        "type": "string"
        +      },
        +      "rx": {
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "ry": {
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "width": {
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "x": {
        +        "type": "number"
        +      },
        +      "y": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "cx": {
        +        "type": "number"
        +      },
        +      "cy": {
        +        "type": "number"
        +      },
        +      "kind": {
        +        "const": "circle",
        +        "type": "string"
        +      },
        +      "r": {
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "cx": {
        +        "type": "number"
        +      },
        +      "cy": {
        +        "type": "number"
        +      },
        +      "kind": {
        +        "const": "ellipse",
        +        "type": "string"
        +      },
        +      "rx": {
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "ry": {
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "kind": {
        +        "const": "line",
        +        "type": "string"
        +      },
        +      "x1": {
        +        "type": "number"
        +      },
        +      "x2": {
        +        "type": "number"
        +      },
        +      "y1": {
        +        "type": "number"
        +      },
        +      "y2": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "kind": {
        +        "const": "polygon",
        +        "type": "string"
        +      },
        +      "points": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "x": {
        +              "type": "number"
        +            },
        +            "y": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "x",
        +            "y"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 1000,
        +        "minItems": 2,
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "kind": {
        +        "const": "polyline",
        +        "type": "string"
        +      },
        +      "points": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "x": {
        +              "type": "number"
        +            },
        +            "y": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "x",
        +            "y"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 1000,
        +        "minItems": 2,
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "kind": {
        +        "const": "text",
        +        "type": "string"
        +      },
        +      "x": {
        +        "type": "number"
        +      },
        +      "y": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "kind"
        +    ],
        +    "type": "object"
        +  }
        +]
      • addedInput schema / properties / elements / items / properties / style / additionalProperties
        Added value: +false
      • addedInput schema / properties / elements / items / properties / style / properties / classes
        Added value: +{
        +  "items": {
        +    "pattern": "^[A-Za-z_][A-Za-z0-9_-]{0,63}$",
        +    "type": "string"
        +  },
        +  "maxItems": 32,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • addedInput schema / properties / elements / items / properties / style / properties / display
        Added value: +{
        +  "enum": [
        +    "inline",
        +    "none"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / elements / items / properties / style / properties / fill / pattern
        Previous value: -"^#[a-fA-F0-9]{6}$"New value: +"^(?:none|#[a-fA-F0-9]{6})$"
      • addedInput schema / properties / elements / items / properties / style / properties / fillOpacity
        Added value: +{
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / elements / items / properties / style / properties / fillRule
        Added value: +{
        +  "enum": [
        +    "nonzero",
        +    "evenodd"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / elements / items / properties / style / properties / fontStyle
        Added value: +{
        +  "enum": [
        +    "normal",
        +    "italic",
        +    "oblique"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / elements / items / properties / style / properties / fontWeight / anyOf
        Added value: +[
        +  {
        +    "enum": [
        +      "normal",
        +      "bold"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "maximum": 900,
        +    "minimum": 100,
        +    "type": "integer"
        +  }
        +]
      • removedInput schema / properties / elements / items / properties / style / properties / fontWeight / enum
        Removed value: -[
        -  "normal",
        -  "bold"
        -]
      • removedInput schema / properties / elements / items / properties / style / properties / fontWeight / type
        Removed value: -"string"
      • addedInput schema / properties / elements / items / properties / style / properties / letterSpacing
        Added value: +{
        +  "maximum": 10000,
        +  "minimum": -10000,
        +  "type": "number"
        +}
      • addedInput schema / properties / elements / items / properties / style / properties / locked
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / elements / items / properties / style / properties / paintOrder
        Added value: +{
        +  "enum": [
        +    "normal",
        +    "fill stroke markers",
        +    "stroke fill markers"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / elements / items / properties / style / properties / stroke / pattern
        Previous value: -"^#[a-fA-F0-9]{6}$"New value: +"^(?:none|#[a-fA-F0-9]{6})$"
      • addedInput schema / properties / elements / items / properties / style / properties / strokeDasharray
        Added value: +{
        +  "items": {
        +    "maximum": 100000,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "maxItems": 32,
        +  "type": "array"
        +}
      • addedInput schema / properties / elements / items / properties / style / properties / strokeLineCap
        Added value: +{
        +  "enum": [
        +    "butt",
        +    "round",
        +    "square"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / elements / items / properties / style / properties / strokeLineJoin
        Added value: +{
        +  "enum": [
        +    "miter",
        +    "round",
        +    "bevel"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / elements / items / properties / style / properties / strokeMiterLimit
        Added value: +{
        +  "maximum": 100000,
        +  "minimum": 1,
        +  "type": "number"
        +}
      • addedInput schema / properties / elements / items / properties / style / properties / strokeOpacity
        Added value: +{
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / elements / items / properties / style / properties / visibility
        Added value: +{
        +  "enum": [
        +    "visible",
        +    "hidden"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / elements / items / properties / style / properties / wordSpacing
        Added value: +{
        +  "maximum": 10000,
        +  "minimum": -10000,
        +  "type": "number"
        +}
      • addedOutput schema / properties / reroutedConnectorIds
        Added value: +{
        +  "items": {
        +    "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "backupCreated",
        -  "ids",
        -  "revision"
        -]New value: +[
        +  "backupCreated",
        +  "ids",
        +  "reroutedConnectorIds",
        +  "revision"
        +]
    • Changedexport_pdf19 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / expectedLatexOutputRevision
        Added value: +{
        +  "pattern": "^[a-f0-9]{64}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / filterDpi
        Added value: +{
        +  "exclusiveMinimum": 0,
        +  "maximum": 10000,
        +  "type": "number"
        +}
      • addedInput schema / properties / filters
        Added value: +{
        +  "default": "preserve",
        +  "enum": [
        +    "ignore",
        +    "preserve"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / latex
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / margin
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "bottom": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "unit": {
        +          "enum": [
        +            "mm",
        +            "cm",
        +            "in",
        +            "pt",
        +            "pc",
        +            "q"
        +          ],
        +          "type": "string"
        +        },
        +        "value": {
        +          "minimum": 0,
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "unit",
        +        "value"
        +      ],
        +      "type": "object"
        +    },
        +    "left": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "unit": {
        +          "enum": [
        +            "mm",
        +            "cm",
        +            "in",
        +            "pt",
        +            "pc",
        +            "q"
        +          ],
        +          "type": "string"
        +        },
        +        "value": {
        +          "minimum": 0,
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "unit",
        +        "value"
        +      ],
        +      "type": "object"
        +    },
        +    "right": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "unit": {
        +          "enum": [
        +            "mm",
        +            "cm",
        +            "in",
        +            "pt",
        +            "pc",
        +            "q"
        +          ],
        +          "type": "string"
        +        },
        +        "value": {
        +          "minimum": 0,
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "unit",
        +        "value"
        +      ],
        +      "type": "object"
        +    },
        +    "top": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "unit": {
        +          "enum": [
        +            "mm",
        +            "cm",
        +            "in",
        +            "pt",
        +            "pc",
        +            "q"
        +          ],
        +          "type": "string"
        +        },
        +        "value": {
        +          "minimum": 0,
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "unit",
        +        "value"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "bottom",
        +    "left",
        +    "right",
        +    "top"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / pageIds
        Added value: +{
        +  "items": {
        +    "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +    "type": "string"
        +  },
        +  "maxItems": 100,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • addedInput schema / properties / textToPath
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / byteLength
        Added value: +{
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / cropBoxes
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "height": {
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "width": {
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "x": {
        +        "type": "number"
        +      },
        +      "y": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "height",
        +      "width",
        +      "x",
        +      "y"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / hash
        Added value: +{
        +  "pattern": "^[a-f0-9]{64}$",
        +  "type": "string"
        +}
      • addedOutput schema / properties / latexSidecar
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "path": {
        +      "maxLength": 1028,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "revision": {
        +      "pattern": "^[a-f0-9]{64}$",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "path",
        +    "revision"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / mediaBoxes / items / properties / x
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / mediaBoxes / items / properties / y
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / properties / mediaBoxes / items / required
        Previous value: -[
        -  "height",
        -  "width"
        -]New value: +[
        +  "height",
        +  "width",
        +  "x",
        +  "y"
        +]
      • addedOutput schema / properties / pageIds
        Added value: +{
        +  "items": {
        +    "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / strategy
        Added value: +{
        +  "enum": [
        +    "full_document",
        +    "prune_subset"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "mediaBoxes",
        -  "pageCount",
        -  "revision",
        -  "version"
        -]New value: +[
        +  "byteLength",
        +  "cropBoxes",
        +  "hash",
        +  "mediaBoxes",
        +  "pageCount",
        +  "revision",
        +  "strategy",
        +  "version",
        +  "warnings"
        +]
    • Addedexport_pdf_pages
    • Changedexport_png19 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / allowDistortion
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / antialias
        Added value: +{
        +  "maximum": 3,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / area / enum
        Previous value: -[
        -  "drawing",
        -  "page"
        -]New value: +[
        +  "custom",
        +  "drawing",
        +  "page",
        +  "selection"
        +]
      • addedInput schema / properties / colorMode
        Added value: +{
        +  "enum": [
        +    "Gray_1",
        +    "Gray_2",
        +    "Gray_4",
        +    "Gray_8",
        +    "Gray_16",
        +    "RGB_8",
        +    "RGB_16",
        +    "GrayAlpha_8",
        +    "GrayAlpha_16",
        +    "RGBA_8",
        +    "RGBA_16"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / compression
        Added value: +{
        +  "maximum": 9,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / customArea
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "height": {
        +      "exclusiveMinimum": 0,
        +      "type": "number"
        +    },
        +    "width": {
        +      "exclusiveMinimum": 0,
        +      "type": "number"
        +    },
        +    "x": {
        +      "type": "number"
        +    },
        +    "y": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "height",
        +    "width",
        +    "x",
        +    "y"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / dithering
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / pageId
        Added value: +{
        +  "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / selectionId
        Added value: +{
        +  "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / snapAreaToPixels
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / area / enum
        Previous value: -[
        -  "drawing",
        -  "page"
        -]New value: +[
        +  "custom",
        +  "drawing",
        +  "page",
        +  "selection"
        +]
      • addedOutput schema / properties / bitDepth
        Added value: +{
        +  "anyOf": [
        +    {
        +      "const": 1,
        +      "type": "number"
        +    },
        +    {
        +      "const": 2,
        +      "type": "number"
        +    },
        +    {
        +      "const": 4,
        +      "type": "number"
        +    },
        +    {
        +      "const": 8,
        +      "type": "number"
        +    },
        +    {
        +      "const": 16,
        +      "type": "number"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / byteLength
        Added value: +{
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / colorType
        Added value: +{
        +  "anyOf": [
        +    {
        +      "const": 0,
        +      "type": "number"
        +    },
        +    {
        +      "const": 2,
        +      "type": "number"
        +    },
        +    {
        +      "const": 3,
        +      "type": "number"
        +    },
        +    {
        +      "const": 4,
        +      "type": "number"
        +    },
        +    {
        +      "const": 6,
        +      "type": "number"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / hash
        Added value: +{
        +  "pattern": "^[a-f0-9]{64}$",
        +  "type": "string"
        +}
      • addedOutput schema / properties / pageId
        Added value: +{
        +  "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +  "type": "string"
        +}
      • addedOutput schema / properties / selectionId
        Added value: +{
        +  "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "area",
        -  "background",
        -  "height",
        -  "revision",
        -  "width"
        -]New value: +[
        +  "area",
        +  "background",
        +  "bitDepth",
        +  "byteLength",
        +  "colorType",
        +  "height",
        +  "hash",
        +  "revision",
        +  "width"
        +]
    • Changedexport_svg7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / selectionIds
        Added value: +{
        +  "items": {
        +    "pattern": "^[A-Za-z_][A-Za-z0-9_.-]{0,127}$",
        +    "type": "string"
        +  },
        +  "maxItems": 100,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • addedOutput schema / properties / assets
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "path": {
        +        "maxLength": 1024,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "revision": {
        +        "pattern": "^[a-f0-9]{64}$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "path",
        +      "revision"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / byteLength
        Added value: +{
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / hash
        Added value: +{
        +  "pattern": "^[a-f0-9]{64}$",
        +  "type": "string"
        +}
      • addedOutput schema / properties / viewBox
        Added value: +{
        +  "maxLength": 256,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "flavor",
        -  "revision",
        -  "warnings"
        -]New value: +[
        +  "assets",
        +  "byteLength",
        +  "flavor",
        +  "hash",
        +  "revision",
        +  "viewBox",
        +  "warnings"
        +]
    • Addedfilters_manage
    • Addedflowed_text_convert
    • Addedflowed_text_inspect
    • Addedfonts_list
    • Addedfonts_preflight
    • Addedgradients_manage
    • Addedguides_grids_manage
    • Addedimages_crop
    • Addedimages_inspect_dpi
    • Addedimages_manage
    • Addedimages_trace
    • Changedinkscape_status10 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / properties / inkscape / properties / pageAdapter
        Added value: +{
        +  "const": "pages_v14",
        +  "type": "string"
        +}
      • addedOutput schema / properties / inkscape / properties / support
        Added value: +{
        +  "enum": [
        +    "experimental",
        +    "stable",
        +    "unsupported"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / inkscape / properties / warnings
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / inkscape / required
        Previous value: -[
        -  "installKind",
        -  "version"
        -]New value: +[
        +  "installKind",
        +  "support",
        +  "version",
        +  "warnings"
        +]
      • addedOutput schema / properties / securityPosture / properties / maximumSanitizeMode
        Added value: +{
        +  "enum": [
        +    "strict",
        +    "preserve-local",
        +    "trusted"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / securityPosture / properties / nativeParserIsolation
        Added value: +{
        +  "const": "none",
        +  "type": "string"
        +}
      • addedOutput schema / properties / securityPosture / properties / residualRisks
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "maxItems": 2,
        +  "minItems": 2,
        +  "type": "array"
        +}
      • addedOutput schema / properties / securityPosture / properties / securityLevel
        Added value: +{
        +  "const": "workspace-guarded-native-unsandboxed",
        +  "type": "string"
        +}
      • changedOutput schema / properties / securityPosture / required
        Previous value: -[
        -  "externalResources",
        -  "nativeInputPolicy",
        -  "overwriteDefault",
        -  "pathsRedacted",
        -  "workspaceReady"
        -]New value: +[
        +  "externalResources",
        +  "maximumSanitizeMode",
        +  "nativeInputPolicy",
        +  "nativeParserIsolation",
        +  "overwriteDefault",
        +  "pathsRedacted",
        +  "residualRisks",
        +  "securityLevel",
        +  "workspaceReady"
        +]
    • Addedjob_cancel
    • Addedjob_get
    • Addedmarkers_manage
    • Addedmasks_manage
    • Addedmesh_gradients_inspect
    • Addedmetadata_manage
    • Addedobjects_to_paths
    • Addedpalette_apply
    • Addedpalette_inspect
    • Addedpath_break_apart
    • Addedpath_effects_inspect
    • Addedpath_effects_manage
    • Addedpath_modify
    • Addedpath_node_edit
    • Addedpath_node_move
    • Addedpath_reverse
    • Addedpaths_boolean
    • Addedpaths_combine
    • Addedpaths_flatten
    • Addedpatterns_manage
    • Addedresources_inspect_remote
    • Addedsymbols_manage
    • Addedtext_manage
    • Addedtext_path_manage
    • Addedtext_to_paths
    • Changedworkspace_list1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedworkspace_list_documents1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
  2. 19 tool updatesv0.0.0
    • First observeddocument_create
    • First observeddocument_inspect
    • First observeddocument_pages
    • First observeddocument_preflight
    • First observeddocument_resize
    • First observeddocument_settings
    • First observedelements_arrange
    • First observedelements_create
    • First observedelements_delete
    • First observedelements_group
    • First observedelements_query
    • First observedelements_transform
    • First observedelements_update
    • First observedexport_pdf
    • First observedexport_png
    • First observedexport_svg
    • First observedinkscape_status
    • First observedworkspace_list
    • First observedworkspace_list_documents

TDQS

C2.8/5.0

Scored across 90 tools

Disambiguation2/5

Many tools target distinct SVG/Inkscape operations, but there are several overlapping clusters: document_import_svg vs document_import vs format-specific imports, document_export vs export_png/pdf/svg, and numerous *_manage / *_inspect pairs. Descriptions add detail, but an agent still faces dozens of similarly named tools and must carefully disambiguate them.

Naming Consistency2/5

Mostly snake_case, but the ordering convention is mixed: many tools use resource_action (elements_create, document_import), while others use verb_noun (export_png, path_modify, text_to_paths), and some lack a resource prefix (inkscape_status, job_get). This inconsistent verb and prefix style makes the large set harder to scan.

Tool Count1/5

90 tools is an extreme mismatch for a typical MCP server, far exceeding the 3-15 range. Many tools are narrow variants or overlapping capabilities, creating severe surface bloat and high cognitive load.

Completeness5/5

The surface appears exceptionally comprehensive for SVG/Inkscape editing: it covers document lifecycle, elements, paths, text, effects, import/export, jobs, accessibility, metadata, and more. Core CRUD and advanced operations are broadly represented with few obvious dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers