CoDesign
OfficialCoDesign is an MCP server that gives coding agents a real, headless design engine (CE.SDK) to create, edit, preview, export, and automate fully editable print/social/video designs.
Design creation & editing: run JavaScript against the live engine via
editto build/modify scenes; load skills (handbook, create, resize, localize, brand, judge, etc.) for guided workflows.Preview & review: render pages/blocks to images with
preview; quality-gate designs with thejudgeskill andscorecard.Export deliverables:
exportto PDF, PDF/X (print-ready CMYK/ICC), PNG/JPEG/WebP, SVG, HTML5, or editable.imglyfiles.Import files: bring in
.imgly, PSD, IDML, PPTX, PDF, images, and SVG as new editable designs.Workspace & revision management: list designs, walk history, inspect revision code, detect user browser-editor changes, rename, and register acceptance checklists.
Assets: search asset sources (including workspace uploads and Google Fonts), add local image/font files, and generate images via AI models.
Human collaboration: generate live viewer/editor URLs so users can open and save changes to the same design.
Account & diagnostics: sign in/out with IMG.LY and inspect server status/summary.
Allows creating and editing fully editable Instagram carousel designs, including multi-panel posts, with export to print-ready PDFs and images.
CoDesign
The design layer for the agent era.
CoDesign gives your coding agent a real design engine. Generate, edit, and automate fully editable designs — print, social, and video — straight from the chat, then export print-ready PDFs, images, and more. You steer, the agent edits the same scene, and you keep control of the outcome.
It ships as an MCP server (plus a Claude Code plugin) that hands your agent
IMG.LY's CE.SDK CreativeEngine — the same production engine behind IMG.LY's
commercial SDKs. Every recipe below spawns the published npm package
@imgly/codesign-mcp over stdio; no separate install step — npx fetches it on first
use.
What you can make
Ask your agent, in plain language:
"Design a 3-panel Instagram carousel announcing our launch, on-brand."
"Resize this poster to A4 with print bleed and export a print-ready PDF."
"Localize this flyer into German and re-fit the layout to the new text."
"Generate five color variants of this template so I can pick one."
Related MCP server: Photoshop MCP Server
How it works
Three layers, one product:
The plugin — skills, slash commands, and an embedded design handbook your agent draws on to design well (brand, localize, resize, and quality-check its own output). This is the piece you install.
The MCP server (
@imgly/codesign-mcp) — exposes the design tools (edit,preview,export,list,history, …) over MCP, driven by tool calls from any agent host.The CE.SDK CreativeEngine — IMG.LY's real, headless design engine that does the actual layout, rendering, and export.
Licensing
This repository — the Claude Code and Codex plugins, marketplace manifests,
skills and documentation — is released under the MIT License.
The CoDesign engine itself, distributed as the npm package @imgly/codesign-mcp, is
proprietary software from IMG.LY and free to use locally. The full terms ship
inside the package as LICENSE.md.
Why a real engine matters
Every other design agent draws on a web canvas — a quick fix that breaks on the hard problems. CoDesign commands a production engine matured over years across print, video, and social:
True print & color fidelity — CMYK, bleed, and ICC profiles, not just RGB screen output.
Deterministic output — renders identically everywhere, independent of browser or config.
Native performance — a purpose-built engine that stays fast at scale and under heavy assets.
Full compatibility — imports InDesign, PSD, PDF, and Lottie; exports print-ready PDF, image, video, and HTML.
Requirements & known limitations
Read this first — the failure modes below are silent.
Node.js ≥ 22.15 is required and is not provided. The server runs on your system Node. With no Node (or Node < 22.15) on
PATH, the host reports the server as failed with no useful reason — typicallylocal: 0andMCP error -32000. Install Node 22.15+ first: https://nodejs.org.Pin
@latest— it's in every recipe on purpose. A bare, unpinnednpxcaches the package and goes stale; because each release carries a rolling 30-day trial license, a stale copy eventually stops working.Windows is not supported under bare
npx. Hosts that spawnnpxdirectly hitspawn npx ENOENT(anthropics/claude-code#58510). Use WSL for now; a native Windows launcher is coming.
Install
Claude Code
Install the plugin from the marketplace:
claude plugin marketplace add imgly/codesign
claude plugin install codesign@imgly-codesignOr add the MCP server directly, without the plugin:
claude mcp add codesign -- npx -y @imgly/codesign-mcp@latest stdioCodex
Install the plugin from the marketplace:
codex plugin marketplace add imgly/codesign
codex plugin add codesign@imgly-codesignOr add the MCP server directly, without the plugin:
codex mcp add codesign -- npx -y @imgly/codesign-mcp@latest stdioAntigravity CLI
Clone the repo and install the plugin folder:
git clone https://github.com/imgly/codesign
agy plugin install ./codesign/plugins/codesignOr add the MCP server directly, without the plugin:
agy mcp add codesign -- npx -y @imgly/codesign-mcp@latest stdioGemini CLI
Gemini CLI now serves Gemini Code Assist Standard/Enterprise and API-key accounts; on a personal Google account, use Antigravity CLI above.
Install as an extension straight from the public repo:
gemini extensions install https://github.com/imgly/codesignOr add the server manually to ~/.gemini/settings.json:
{
"mcpServers": {
"codesign": {
"command": "npx",
"args": [
"-y",
"@imgly/codesign-mcp@latest",
"stdio"
]
}
}
}Other MCP hosts
Every other host spawns the same stdio server — only the config file and the top-level key differ. Add this block to the host’s MCP config:
{
"mcpServers": {
"codesign": {
"command": "npx",
"args": [
"-y",
"@imgly/codesign-mcp@latest",
"stdio"
]
}
}
}Host | Config file | Note |
Cursor |
| as-is |
Windsurf |
| as-is |
VS Code |
| use the key |
Zed |
| use the |
VS Code (servers key):
{
"servers": {
"codesign": {
"command": "npx",
"args": [
"-y",
"@imgly/codesign-mcp@latest",
"stdio"
]
}
}
}Zed (context_servers):
{
"context_servers": {
"codesign": {
"command": {
"path": "npx",
"args": [
"-y",
"@imgly/codesign-mcp@latest",
"stdio"
]
}
}
}
}Beyond your machine
CoDesign runs free on your machine today. When you need more — always-on hosting, your own infrastructure (VPC / on-prem), or a fully bundled design agent that lives in the canvas — the same building block graduates by changing config, not vendors. No lock-in. Talk to us: support@img.ly.
Support
Questions or issues: support@img.ly. This distribution is generated from IMG.LY's source repository.
Available Tools
19 toolsasset_addA
Add a local image or font file to the workspace so it can be used in a design. Copies the file bytes into the content-addressed asset store at assets/<sha>.<ext>. The bring-your-own arm of the asset family: asset_search finds an existing asset, asset_generate makes one, asset_add takes one off your disk — all three return a workspace:// uri to embed in edit. (To turn a design FILE into a new design, use import.)
Returns JSON: { uri, httpUrl, mimeType, kind, bytes, note? }. uri (a workspace:// URI) is the durable handle — embed it in a subsequent edit (image fill, or engine.asset.apply; for a font, as both setFont's uri and typeface.fonts[].uri), NEVER httpUrl and NEVER the original file:// path, so the design stays loadable after a restart or rewind. httpUrl is a fetch link for opening the asset now.
Files are classified by content (magic bytes) first, extension second: a misnamed file is stored under its actual type, and note explains any correction, rescue, or unverifiable content.
Make-available only: it never edits a scene and never creates a revision — do the placement in edit.
Source: { path } — an absolute path to a file the server can read. Local-only (this backend shares your disk); on a hosted server this arm is not offered.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it delivers: it explains the side effect (copies bytes), the storage location (assets/<sha>.<ext>), the classification logic (magic bytes first), the fact it never edits a scene or creates a revision, and the local-only constraint. It also warns against using httpUrl or the original file path for embedding, which is critical for durability. This is exemplary transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-organized, with purpose, usage, return format, classification, and constraints in separate paragraphs. Every sentence adds value, though it could be tightened slightly without losing critical information. It is front-loaded with the core purpose and then expands into necessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having only one parameter, a nested source object, no output schema, and no annotations, the description covers everything an agent needs: return format, how to use the uri in edit, classification behavior, and the local-only limitation. It is fully self-sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does: it explains the source object's structure ({ path }), that path must be absolute and readable by the server, and that it is local-only. This adds meaning beyond the schema's terse description and fully clarifies the single parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Add'), resource ('local image or font file'), and purpose ('so it can be used in a design'). It also differentiates itself from siblings by naming asset_search and asset_generate as the alternatives for finding and generating assets, and import for turning design files into designs. This makes the tool's role unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly contrasts with asset_search and asset_generate, and provides a clear when-to-use rule: use this when you have a file on disk. It also states when not to use it (never for placement, use edit) and points to import for a different scenario. This gives the agent unambiguous selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
asset_generateA
Generate images (text-to-image, image-to-image) via the IMG.LY AI gateway.
Call with NO arguments first: returns the model catalog — pick a model, then call again with model + prompt (+ optional format aspect like "16:9").
For image-to-image, pass image_uris with workspace:// URIs (from import or earlier generations).
The first content part is JSON: { uri, httpUrl, mimeType, bytes }. uri (a workspace:// URI) is the durable handle — embed it in subsequent edit calls. httpUrl opens the asset directly. The parts after it are a labeled thumbnail of each generated image — look at them; the JSON alone does not tell you what was drawn.
Multi-output models (layerize-class: decompose an input image into layers) add an assets array to that JSON — one entry per image, { index, uri, httpUrl, mimeType, bytes }, in stack order (residual background first, then cutout layers). The top-level fields mirror assets[0]. Single-output results carry no assets array. Any non-image output the model produced is passed through VERBATIM under metadata — read it, it binds semantics to the assets (layerize, for example, ships a layers list in assets order with names, z order and bounding boxes in source pixels; cutouts are cropped to content, so place them by their bounding box).
Requires a free IMG.LY sign-in (the login tool); all other design tools work without an account.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Model id from the catalog (call with no arguments to list). Required to generate. | |
| format | No | Aspect ratio, e.g. "16:9" or "1:1". | |
| prompt | No | What to generate. Required together with `model`. | |
| image_uris | No | workspace:// image URIs used as inputs (image-to-image models). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full disclosure burden. It covers the no-argument catalog response, the structured first content part, durable workspace URIs, labeled thumbnails, multi-output assets in stack order, verbatim metadata, and the sign-in requirement — substantially more behavioral context than basic operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but warranted by the tool's complexity: invocation pattern, output format, multi-output behavior, and auth are each in their own focused segment. It is front-loaded with the core generation purpose and every sentence adds necessary routing or output semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, this definition covers what an agent needs to call the tool correctly: how to discover models, required parameters, optional format, image inputs, return-content structure, multi-output semantics, and the login prerequisite. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds meaningful operational meaning: model requires first listing the catalog, prompt pairs with model, format is an optional aspect such as 16:9, and image_uris come from import or earlier generations as workspace URIs. This goes beyond the schema's brief parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: 'Generate images (text-to-image, image-to-image) via the IMG.LY AI gateway.' It further distinguishes generation from siblings by describing the no-argument catalog workflow and noting that generation requires login while 'all other design tools work without an account.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit invocation guidance: 'Call with NO arguments first,' then call again with model and prompt, and for image-to-image pass image_uris. It also states the login prerequisite, but it does not explicitly name a when-not-to-use alternative or contrast with sibling tools such as edit or import beyond the mention of embedding URIs in subsequent edit calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
asset_searchA
Discover the asset sources registered on the CreativeEngine and search the assets they contain. Read-only — never creates a revision.
Without sourceId: lists every source id with its supported MIME types.
With sourceId: returns one page of assets as JSON { total, currentPage, nextPage, assets: [{ id, label, groups, uri, thumbUri, width, height, uploadedAt }] }. Typeface assets (e.g. the ly.img.gfonts Google Fonts source) additionally carry a compact typeface: { name, weights, styles } summary. query fuzzy-matches labels and tags.
The ly.img.workspace.images source is this workspace's own image store: every image the agent generated or imported AND every image the human uploaded in the browser editor, newest first. Uploads carry their original filename as label (the human will refer to it — "use logo-final.png" — so search that name), plus groups: ["uploads"] and an uploadedAt timestamp. "The image the user just uploaded" = the uploads-group asset with the newest uploadedAt.
⚠ Asset sources are deployment configuration — where their content lives (IMG.LY CDN, a customer host) is the server's business. NEVER fetch asset manifests (content.json) or hardcode cdn.img.ly URLs yourself; this tool and engine.asset.* are the only correct path. A source missing from the no-arg listing is not available on this server — say so instead of working around it.
To USE a result, apply it inside edit code — re-find it there, then either:
(A) new block: const id = await engine.asset.apply(sourceId, (await engine.asset.findAssets(sourceId, { query, page: 0, perPage: 1 })).assets[0]) — then, if you resize the frame, set engine.block.setContentFillMode(id, "Cover") (resizing does NOT update the crop; without Cover a portrait photo forced into a landscape frame gets squished);
(B) existing block: const fill = engine.block.createFill("image"); engine.block.setString(fill, "fill/image/imageFileURI", asset.meta.uri); engine.block.setFill(blockId, fill); engine.block.setContentFillMode(blockId, "Cover").
(C) fonts: re-find the family inside edit code and pass the payload straight to setFont — const { assets } = await engine.asset.findAssets("ly.img.gfonts", { query: name, page: 0, perPage: 20 }); const tf = assets.map((a) => a?.payload?.typeface).find((t) => t?.name === name); if (!tf) throw new Error("font lookup missed: " + assets.map((a) => a?.payload?.typeface?.name).join(", ")); engine.block.setFont(id, tf.fonts[0].uri, tf); engine.block.setTextFontWeight(id, "normal"). Take the EXACT name out of a page of results — fuzzy ranking can put it behind longer names (query "Lora" returns Explora first), so perPage: 1 fetches the wrong family. And always set the weight: tf.fonts[0] is the family's LIGHTEST declared weight (Thin/100 on Inter, Roboto, …), so setFont alone renders hairline text with no error. Never copy font URIs out of this tool into edit code.
Do NOT use engine.asset.applyToBlock — on this server it silently no-ops (the block keeps its old fill, no error).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page index. Default 0. | |
| query | No | Fuzzy search over asset labels and tags. | |
| perPage | No | Results per page. Default 20, max 50. | |
| sourceId | No | Asset source id. Omit to list all sources. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it delivers extensively. It discloses read-only semantics, pagination response shape, fuzzy matching behavior, upload grouping and ordering, the meaning of 'the image the user just uploaded', missing-source behavior, and the silent no-op of applyToBlock. This far exceeds what the schema or annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but densely informative with clear paragraph boundaries: core behavior, result shape, workspace image specifics, warnings, and usage recipes. Every section earns its place, and the most important read-only/never-creates-a-revision message is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with no annotations and no output schema, this description is remarkably complete. It explains return values, edge cases, font handling, upload semantics, integration code, and failure modes. An agent has everything needed to select and invoke the tool correctly, and to apply its results in edit code.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful usage nuance beyond the schema, especially for perPage in font lookups ('perPage: 1 fetches the wrong family'), query behavior on labels and tags, and sourceId-dependent result shape. It doesn't systematically restate each schema field, but it adds practical semantics where it matters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Discover the asset sources registered on the CreativeEngine and search the assets they contain.' It explicitly states read-only behavior and distinguishes the no-sourceId listing mode from the sourceId search mode, making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use and when-not-to-use guidance: it explains the two invocation modes, warns against fetching asset manifests or hardcoding CDN URLs, prohibits engine.asset.applyToBlock, and provides specific code paths for using results in edit code. It also names the correct alternatives: this tool and engine.asset.* are the only correct path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
changesA
Check whether the user changed a design in the browser editor since you last touched it.
Pass the revision you believe is current — normally the one your last edit returned. The reply says whether it is still the design head and lists what was written since, oldest first, with each revision's diff note and whether it came from the editor (origin: "editor") or from your own edit.
Call this before your first edit of a design whenever the user may have had the view page open: edit REJECTS a parent whose path to the head contains one of the user's editor saves, so this is how you find the parent to build on.
| Name | Required | Description | Default |
|---|---|---|---|
| revision | Yes | Revision you believe is current — normally the one your last `edit` returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It explains the reply: whether the revision is still the design head, what was written since, ordering oldest first, diff notes, and the `origin` field. It does not explicitly state it is non-mutating, but 'check' and the described reply imply a read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose, followed by the reply structure and the critical call timing. Each paragraph earns its place, and the mention of `edit` rejection is essential context rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single required parameter and no output schema or annotations, the description covers everything needed: what the tool checks, what to pass, what the reply contains, and when it should be called. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already says 'Revision you believe is current — normally the one your last `edit` returned.' The description repeats this guidance and adds workflow context, but it does not convey substantially new parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: 'Check whether the user changed a design in the browser editor since you last touched it.' It also names the workflow relationship to `edit` and `view`, distinguishing it from sibling tools like `history` or `inspect`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit trigger: 'Call this before your first `edit` of a design whenever the user may have had the `view` page open.' It explains the consequence of not doing so by noting that `edit` rejects a parent containing editor saves. It does not name an alternative tool, but the condition is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
checklistA
Register the brief's ACCEPTANCE CHECKLIST for a design — the machine-checkable claims that must hold before the work counts as done. Do this right after intake, before the first edit: extract from the brief every required output file, every string of approved copy that must land verbatim, and note the constraints only you can check.
Item kinds:
{ kind: 'output', path } — a file that must exist when the design is delivered (absolute path, e.g. every variant the brief orders exported).
{ kind: 'copy', text } — approved copy that must appear VERBATIM in the design's text (whitespace variants are folded before comparing; wording, case and punctuation are exact).
{ kind: 'note', text } — a self-check the server cannot verify (e.g. "layout structure unchanged from master"). Kept on record; never machine-checked.
Every export verifies the current checklist against the deliverable and lists unmet items in its result — treat an unmet item exactly like a failing test: finish the work, or re-register the checklist without the item if it is genuinely obsolete. Calling checklist again REPLACES the whole list for this design.
Returns: { ok, itemCount, rootRevision } — or the current checklist when called with only revision (no items).
| Name | Required | Description | Default |
|---|---|---|---|
| items | No | The full checklist (max 64 items) — replaces any previously registered list. Omit to read the current checklist instead. | |
| revision | Yes | Any revision id of the design (the checklist attaches to the design's whole lineage). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers richly: it discloses that calling again REPLACES the whole list, that copy comparisons fold whitespace but treat wording/case/punctuation as exact, that note items are never machine-checked, that every export verifies the checklist, and the exact return shape. No behavioral surprise is left undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place. The lead sentence front-loads the core purpose; the item-kind bullets are necessary because the schema cannot convey these semantics; and the export-interaction and replacement warnings are essential operational facts. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description is fully self-sufficient: it covers return values, item-kind semantics, replacement behavior, lifecycle timing, and failure-handling. An agent can invoke this tool correctly on the first attempt with zero information beyond the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description dramatically expands meaning beyond the bare field names: it defines each kind's semantics (output = absolute path that must exist; copy = verbatim with whitespace folding; note = never machine-checked), explains the read mode when only revision is passed, and documents the return object. This far exceeds the baseline-3 bar.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: 'Register the brief's ACCEPTANCE CHECKLIST for a design — the machine-checkable claims that must hold before the work counts as done.' It is immediately distinguishable from siblings like export (which verifies the checklist), scorecard (which presumably grades), and edit/preview (which mutate/view the design).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit timing ('Do this right after intake, before the first edit'), specifies what to extract from the brief (output files, verbatim copy, self-check notes), and explains how unmet items interact with export ('treat an unmet item exactly like a failing test: finish the work, or re-register the checklist without the item'). This is actionable when-to-use guidance that also routes the agent's behavior downstream.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diagnosticsA
Inspect this codesign MCP server: status (default) reports what is running (build id, CE.SDK engine version, non-secret config); summary returns a bounded digest of recent activity (counts, recent errors, slowest calls); open returns a clickable local viewer URL with a Download-ZIP button to send diagnostics to IMG.LY.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | status (default) | summary | open |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It discloses that status reports non-secret config, summary is bounded, and open returns a clickable URL with a Download-ZIP button. However, it doesn't mention side effects (e.g., whether 'open' launches anything or just returns a URL) or any rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences, each covering one action with its output. Front-loaded with the tool's purpose and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, the description covers the main behaviors and outputs. It could mention whether 'open' has side effects or how the viewer URL is delivered, but overall it's sufficient for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum values are described in the schema. The description adds meaningful context for each action value, but since the schema already lists them, the added value is moderate. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as inspecting the codesign MCP server and enumerates three distinct actions (status, summary, open) with specific outputs. It distinguishes itself from siblings by focusing on server diagnostics rather than assets, editing, or auth.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what each action returns and notes that status is the default, giving an agent clear context for choosing an action. It doesn't explicitly state when to use this tool versus alternatives, but the diagnostic scope is clear enough that an agent can infer when it's appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
editA
Edit the CE.SDK canvas by running JavaScript against the live CreativeEngine, then commit the result as a new revision.
⚠ Call skill({ name: 'handbook' }) BEFORE your first edit. It documents the design loop, the typeface schema, and the engine recipes; on cryptic errors, query its quirks.md.
REQUIRED: parent is a revision id (returned by a previous edit), or the JSON null literal (no quotes) to start a new design. Omitting it is an error — there is no implicit 'continue from wherever'. In a fresh conversation, a request for a new design means parent: null — never resume a workspace design the user didn't reference.
Returns: the first content part is JSON { revision, parent, names? } — store revision so you can pass it as parent on the next edit. names lists every named block in the committed scene: those are exactly the strings engine.design.findByName(name) resolves in your NEXT edit, so name what you build and re-find it instead of matching copy. When the edit changed the scene, the result also ends with a downscaled render of the (first) changed page — verify your work from it instead of spending a preview call. preview remains required for full-size judging (the judge loop) and multi-page review; set render: false to skip the image on read-only/diagnostic edits.
code return contract (STRICT): return undefined (no message back), { type: "text", text }, { type: "image", data: "<base64>", mimeType }, or an array of those. Anything else (raw strings, Blobs, plain objects) is rejected.
DIALECT (enforced): mutations go through engine.design (create/build/setProps/…). Code that mutates via engine.block.* is rejected before execution with the equivalent calls; // engine.block: <reason> opts out for calls the facade lacks.
code scope: engine (with engine.design), plus findText(copy) / findAllText(copy) for reaching a block by its text. Use them instead of comparing text strings with === — the copy on the page routinely carries a trailing space or an NBSP (before a €/%), which is what makes hand-rolled lookups throw. Matching folds those space variants and trims; a miss lists the copy actually on the page.
Dirty-on-throw: if your code throws, the engine slot is marked dirty and the next edit pays one engine reload (regardless of parent). Do not catch-and-swallow errors that should propagate — let them throw so this safety contract kicks in.
Optional: title (set on parent=null only — the design's display name) and note (a one-liner describing what this edit accomplished — purely descriptive, helps you re-ground after a rewind).
Refused parents: if the user saved changes in the browser editor between your parent and the design head, this edit would discard them, so it is rejected — call changes to see what they did and which revision to build on.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Async JS body. `engine` is in scope, plus `engine.design` — the preferred nested-props facade; EVERY member returns a Promise (await it): create({ type, name?, props?, children? }, { parent? }), setProps(id, props), getProps(id, select?) — see the api skill. Strict return contract per the handbook. | |
| fork | No | Set true ONLY when the user explicitly asked to discard their own browser-editor changes and branch from an older revision. Without it, `edit` refuses a parent whose path to the head contains a save the user made in the editor. | |
| note | No | Freeform descriptive text — what this edit accomplished. Metadata only; never load-bearing. | |
| title | No | Display name for the design. Set only when parent=null (creating a new design). For mid-chain renames use the `rename` tool. | |
| parent | Yes | Parent revision id from a previous edit (a string). To start a new design root, use the JSON null literal. REQUIRED — there is no implicit default. | |
| render | No | Default true: a mutating edit's result ends with a downscaled render of the (first) changed page. Set false to skip the image on read-only or diagnostic edits where seeing the canvas adds nothing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so thoroughly. It discloses the revision-commit side effect, the exact return JSON shape, the strict `code` return contract, the engine.design dialect enforcement, the dirty-on-throw engine reload consequence, and the refusal behavior when the user saved changes in the browser editor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries operational value, and it is well structured with bolded labels. Critical constraints like the handbook prerequisite, required `parent`, and return contract are front-loaded, while optional parameters and edge cases are grouped at the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description fully compensates by specifying return values, failure modes, parameter constraints, and relationships to sibling tools. The agent has everything needed to call `edit` correctly and recover from common errors such as refused parents or thrown code.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds substantial meaning beyond the schema: `parent` has no implicit default and must be the JSON null literal for new designs, `code` has a strict return contract and scope rules, `title` only applies when parent=null, `note` is purely metadata, and `render` should be disabled only for read-only or diagnostic edits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource: 'Edit the CE.SDK canvas by running JavaScript against the live CreativeEngine, then commit the result as a new revision.' It clearly differentiates this mutation-and-commit tool from siblings like `preview`, `changes`, and `rename` by defining the edit lifecycle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: call `skill({ name: 'handbook' })` before first use, use the returned render instead of `preview` for quick verification, keep `preview` for full-size/multi-page judging, and call `changes` when a parent revision is refused. It also notes that `rename` should be used for mid-chain renames, not `title`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exportA
Export a revision to a final deliverable — format picks it: pdf (print PDF), png/jpeg/webp (image), svg (vector SVG), pdfx (print-ready PDF/X), html (responsive HTML5), imgly (editable design file). Renders blockId — or the whole document when blockId is omitted — and writes the result into the workspace under exports/<shard>/<rev>/ (revision-pinned, deterministic).
Returns JSON: { uri, httpUrl, bytes, format, revision } (plus path when you pass outPath). uri (a workspace:// URI) is the durable handle. httpUrl is a fetch link tied to this process — fetch it to download the bytes to disk, or hand it to the user.
outPath (optional, absolute path including the filename): ALSO write the artifact to that local path — the workspace copy is still written, and the response then carries path. Use it when the file is wanted on disk, and always when your environment cannot fetch localhost URLs (sandboxed harnesses, e.g. Claude Cowork — target your session's outputs folder there).
format=svg is the engine's vector export: text is outlined into paths (renders identically everywhere, but is not editable text in the SVG), and raster images are embedded in the file at source resolution — an SVG of a photo-heavy design can be much larger than its source images.
format=imgly writes a portable, self-contained .imgly design file (scene + all asset bytes bundled) — the inverse of import, and the only format that stays editable. Whole-design only: blockId is not accepted. Every edit already auto-persists to the workspace, so you never need this to keep your work — use it to take an editable copy OUT: hand it to a human, back it up, move it between servers.
format=pdfx runs the print PDF through a PDF/X conversion (Ghostscript): CMYK with an embedded ICC profile and PDF/X conformance markers, ready for a print shop. Tune it via the optional pdfx object — conformance standard (X-4 default / X-3), output profile (fogra39/gracol/srgb/custom), transparency flattening, OutputIntent metadata. Conversion adds a few seconds.
format=html renders ONE page (blockId required — pass a page id) to responsive HTML5. Default is a single self-contained .html (assets inlined; animated designs get a CDN GSAP player injected so the file plays as-is); html: { assets: "external" } delivers html + separate image/font files as one .zip.
| Name | Required | Description | Default |
|---|---|---|---|
| html | No | Options for `format=html` only (invalid with any other format). | |
| pdfx | No | Options for `format=pdfx` only (invalid with any other format). Omit entirely for sensible print defaults: PDF/X-4, fogra39, embedded ICC. | |
| format | Yes | The deliverable: pdf → print PDF; png/jpeg/webp → image; svg → vector SVG; pdfx → print-ready PDF/X; html → HTML5 page; imgly → editable design file. | |
| blockId | No | The page or block to render. Omit to export the whole document — for `format=pdf` a multi-page PDF, for an image format one composite image of all pages. Required for format=html (pass a page id). | |
| outPath | No | Absolute path (including filename) to ALSO write the artifact to — the workspace copy is still written, and the response then carries `path`. Use when you need the file on disk and cannot fetch localhost URLs (sandboxed harnesses). | |
| revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It discloses side effects (writes into workspace under a deterministic revision-pinned path), return shape (JSON with uri, httpUrl, bytes, format, revision, plus path), and format-specific quirks (SVG outlines text, imgly is self-contained, pdfx adds seconds, html injects GSAP). It also notes httpUrl is process-bound and warns about sandboxed harnesses. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured: it front-loads the purpose and format list, then dedicates focused paragraphs to outPath, svg, imgly, pdfx, and html. Every section earns its place given the tool's complexity; no filler. It could be slightly tighter but is appropriately detailed for the scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, nested objects, and no output schema, the description fully covers invocation and behavior: return JSON, workspace path, format nuances, blockId rules, outPath usage, and sandbox limitations. An agent has everything needed to call the tool correctly and handle results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 83%, yet the description adds substantial meaning beyond the schema: it explains the format enum's practical implications (e.g., pdfx print-ready, imgly editable), clarifies blockId omission behavior (whole document), details outPath use cases, and expands on html and pdfx nested options with trade-offs. This goes far beyond the schema's terse descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Export a revision to a final deliverable') and enumerates all supported formats with one-line outcomes (pdf, png/jpeg/webp, svg, pdfx, html, imgly). It distinguishes itself from siblings by framing imgly as the inverse of import and noting that edit auto-persists, so an agent can clearly tell export apart from preview, view, and edit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: when to pass outPath (when file needed on disk, when sandboxed cannot fetch localhost), when to use imgly (to take an editable copy out), when to use pdfx (print shop), and when html is required (single page, blockId mandatory). It also tells the agent when not to use it ('you never need this to keep your work') and contrasts with edit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
historyA
Walk back from revision to the root, returning the chain (root first). Each entry has { revision, parent, note?, origin?, createdAt } — origin: "editor" marks a revision the user saved from the browser editor. Use this to re-ground after a rewind: read the notes, pick the revision you want to continue from, pass it as parent to your next edit. Continue a prior design only when the user asked for it — never because it is the newest entry.
| Name | Required | Description | Default |
|---|---|---|---|
| revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It reveals the return chain ordering (root first), each entry's shape, the special meaning of `origin: "editor"`, and the non-obvious instruction not to prefer the newest revision. This is rich behavioral context well beyond a simple one-liner.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first defines the operation and output ordering, the second documents the entry fields and important origin marker, and the third gives usage guidance and a critical behavioral guardrail. The most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since there is no output schema, the description supplies the return shape, field semantics, and the intended post-rewind workflow. It does not explicitly state that the operation is read-only or what identifies the root (e.g., null parent), but for a history-walk tool these are minor omissions and the agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines `revision` as a required string with 0% coverage, so the description must compensate. It does explain that `revision` is the starting point for the walk and references it indirectly via `parent`, but it never clarifies the expected format, source, or valid values for the revision identifier. It adds some meaning but leaves a meaningful gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('walk back'), a resource ('revision chain'), and a clear output scope ('root first'). It also distinguishes the tool's role from related siblings like edit and changes by framing it as a re-grounding step rather than a mutation or listing operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit when-to-use: 'Use this to re-ground after a rewind' and a clear behavioral rule: 'Continue a prior design only when the user asked for it — never because it is the newest entry.' However, it does not name alternative sibling tools or explicitly state when not to use history in favor of another tool like changes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
importA
Import a design FILE as a NEW design root revision — a native CE.SDK .imgly design file (also the legacy .scene and .zip forms); a foreign design file: Photoshop (.psd/.psb), InDesign (.idml), PowerPoint (.pptx), or PDF; or a plain image (PNG/JPEG/WebP/GIF) or SVG, which becomes a one-page design sized to the image (format: "image"/"svg"). The inverse of export({ format: 'imgly' }). To make a media file (image/font/video/audio) available for use INSIDE a design instead of becoming one, use asset_add.
Source: { url } (http/https), { demo } (a design bundled with this server — ids: "cybernews") or { path } (absolute local file path; Local only). Archives are ingested: bundled asset bytes are extracted into the workspace as content-addressed assets/<sha>.<ext> files, so the loaded design is durable and behaves exactly like a natively-built one.
Returns JSON { revision, title, format } — continue with edit({ parent: revision, … }). Foreign-format imports may add warnings (importer notes about what did not survive — substituted fonts, unsupported features): treat them as your touch-up list — preview the pages, then repair with edit; find replacement fonts via asset_search. Bare scene-file loads (no bundled assets) additionally return assets: a classification of every referenced asset URI by scheme (workspace / external / bundle / transient / other). External URLs are NOT fetched; transient entries WILL be lost on the next save — replace or relocate them before committing further work.
Engine caveat: InDesign and PDF import need the WASM engine (IMGLY_CESDK_ENGINE=wasm) — on the native engine import errors cleanly for those two formats; Photoshop and PowerPoint import work on both.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Display name for the new design. Defaults to the source file's basename. | |
| source | Yes | The design to load. Provide exactly one of `url` (http/https), `demo` (a bundled demo design), `path` (absolute local file path; Local only). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It thoroughly discloses side effects: creates a new root revision, extracts archive assets into `assets/<sha>.<ext>`, does NOT fetch external URLs, may return warnings, and notes that transient assets are lost on next save. The engine caveat is also clearly stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but well-structured and front-loaded: purpose/alternatives first, then sources, return value, warnings, and engine caveats. Every sentence carries meaningful content, though a slightly tighter presentation would improve scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the absence of an output schema, and no annotations, the description is remarkably complete. It covers return shape (`{ revision, title, format }`), warnings, asset classifications, follow-up actions, and engine-specific restrictions — everything an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds useful behavioral context around sources (e.g., external URLs not fetched, demo id, local path) but does not substantively enrich the meaning of the two parameters beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise statement: 'Import a design FILE as a NEW design root revision', lists all supported formats, and explicitly distinguishes itself from `export` (inverse) and `asset_add` (for media inside a design). An agent can immediately tell what this tool does and how it differs from its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing guidance: use `asset_add` for media files meant to be used inside a design, and import is the inverse of `export({ format: 'imgly' })`. It also provides follow-up instructions for foreign-format warnings (preview, repair with edit, find fonts via asset_search) and an engine-specific caveat for InDesign/PDF import.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspectA
Read one revision in full: parent, note, createdAt, title (root only), and the JS code that produced it (when written via edit).
Use this after history when you've picked a revision and want to know HOW it got there — the code is the precise operation; note is the agent's summary.
Returns JSON { revision, parent, note?, origin?, createdAt, title?, code? } — origin: "editor" marks a revision the user saved from the browser editor. code is omitted for revisions not produced by edit (e.g. future import paths).
⚠ Past code reveals the PATTERN of an edit (which APIs were called, what kind of block was targeted), NOT the block ids. Block ids are session-scoped — re-discover them in the current engine; don't replay the literal numeric ids.
| Name | Required | Description | Default |
|---|---|---|---|
| revision | Yes | Revision id to inspect. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals that `code` is omitted for revisions not produced by `edit`, warns that past code contains patterns not block ids (which are session-scoped), and explains the `origin` field. This is substantial behavioral context that helps the agent avoid misuse. It doesn't explicitly state it's read-only, but the nature of 'read' implies no side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the core purpose. It is concise for the amount of information conveyed: purpose, usage, return format, and an important warning about block ids. Each sentence adds value, and the warning is crucial. It is slightly long but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema, no annotations), the description covers all essential aspects: what it does, how to use it, what it returns, and important limitations. It is complete enough for an agent to call it correctly without further assumptions. It could mention error handling or edge cases, but these are not critical for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes the single parameter ('Revision id to inspect.') with 100% coverage. The description adds context by linking it to 'history' (implying the id comes from there) and by explaining what the revision represents. This is enough to meet the baseline for high schema coverage, though it could have elaborated on id format or how to obtain it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Read one revision in full') and the resource (a revision), and enumerates exactly what is returned. It also differentiates itself from the sibling 'history' tool by specifying that it is used after picking a revision from history, making its purpose distinct and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this tool: 'Use this after `history` when you've picked a revision'. It also explains the distinction between the code (precise operation) and note (agent's summary), providing clear context for selection among siblings. It does not explicitly state when not to use it, but the guidance is strong enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listA
List designs in the workspace. Returns an array of { rootRevision, title, latestLeaf, updatedAt, headOrigin?, headNote? } sorted newest-first; the head* fields describe latestLeaf. headOrigin: "editor" means the last hand on that design was the user's, in the browser editor — read headNote (the engine-computed diff of their save) before you change anything, and build from latestLeaf so their work is not discarded. Use when the user asks what designs exist or wants to resume earlier work. Seeing a design here is never by itself a reason to continue it — for a new design request pass parent: null to edit.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it succeeds: it reveals the return type, sort order, optional `head*` fields, and their meaning. It adds actionable warnings about reading `headNote` and building from `latestLeaf` before making changes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact but information-dense, front-loading the core list function before diving into field semantics and usage caveats. Every sentence adds value: return shape, sort order, head-field interpretation, and routing guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite the lack of an output schema, the description documents the return object fields and their significance. It also covers when to use the tool and warns about destructive follow-up behavior, leaving no critical gap for an agent to call or act on this tool safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no schema detail to explain; the baseline for 0-parameter tools is 4. The description instead enriches the call semantics by explaining what the returned fields mean.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List designs in the workspace,' immediately establishing the tool's core function. It also defines the returned shape and ordering, and distinguishes the purpose from sibling mutation tools like `edit`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool ('when the user asks what designs exist or wants to resume earlier work'). It also gives targeted guidance about what not to do—seeing a design is not a reason to continue it—and directs new-design requests to `edit` with `parent: null`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loginA
Sign in with your IMG.LY account (opens the system browser). The session saves automatically once the user finishes in the browser; call login again anytime to confirm — safe to repeat, it does not restart the flow or invalidate the open link. Pass switch_account=true to sign in as a different user.
| Name | Required | Description | Default |
|---|---|---|---|
| switch_account | No | Force a fresh sign-in screen even if a session exists. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral transparency burden and does well: it discloses browser opening, automatic session saving, repeat safety, and that calling again does not restart the flow or invalidate the open link. It does not mention failure behavior or output, but the key side effects are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The main purpose is front-loaded, followed by repeated-use behavior, then the optional parameter. Every sentence contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter and no output schema, the description is nearly complete. It covers the flow, repeat safety, and the parameter meaning. It does not explicitly state what the tool returns, but the 'call again anytime to confirm' hint provides enough practical context for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents switch_account. The description adds 'sign in as a different user', which slightly clarifies intent, but does not add substantial meaning beyond the schema's 'Force a fresh sign-in screen even if a session exists.' Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Sign in with your IMG.LY account') and distinguishes this tool from siblings by noting it opens the system browser. It clearly identifies the resource and the auth flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to call: anytime to confirm a session, and with switch_account=true to sign in as a different user. It does not explicitly mention alternatives like logout or when not to use it, but the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logoutA
Sign out of your IMG.LY account (revokes the session and clears local credentials).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the side effects: revoking the session and clearing local credentials. This is meaningful behavioral context beyond the tool's name, though it doesn't cover potential edge cases like error states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that is immediately understandable, front-loaded with the core action and followed by the behavioral details. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output tool, the description fully covers what an agent needs to know to invoke it correctly. There is no missing information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema is empty. Per the rubric, the baseline is 4. The description doesn't need to add parameter semantics since there are none to describe.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Sign out' and the resource 'your IMG.LY account', and explicitly mentions the consequences (revokes session, clears credentials). It naturally differentiates from the sibling 'login' without needing to name it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the purpose obvious — it is the action to end a session. It doesn't explicitly state when not to use it, but for a simple logout tool this is sufficiently clear and no alternatives need to be excluded.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
previewA
Render blocks (almost always pages) to inline images so you can see the result.
revision is REQUIRED — pass the revision the blocks belong to, the id edit returned. blockIds is a LIST, rendered in the order you give it: [pageId] for one page, [a, b] for a subset, or OMIT it entirely to preview every page of the design in document order.
The given revision is loaded before rendering, so the ids always resolve against the right scene — never against a different design another agent may have loaded on a shared server.
Preview several blocks at once when REVIEWING or capturing a finished design — a whole deck in one call, or just the pages a fix touched. While BUILDING a multi-page design, keep previewing each page right after you build it: batching there does not avoid the bugs, it only delays finding them.
Output is always PNG (lossless — thin lines render exactly). EACH block gets the full 0.25 megapixel budget, adjusted to its own aspect ratio — a square page renders 512×512, a 1:4 page 256×1024. There are no size or format knobs, and at most 10 blocks render per call.
To eyeball fine detail, preview the suspect BLOCK directly — the pixel budget concentrates on it (an effective zoom). For native-resolution certainty, export the page and open its httpUrl.
| Name | Required | Description | Default |
|---|---|---|---|
| blockIds | No | Blocks to render, in the order you want them back — almost always page ids, not the scene root. Omit to preview every page of the design in document order. At most 10 render per call. | |
| revision | Yes | Revision id the blocks belong to (from `edit`). Loaded before rendering so the ids resolve against the right scene. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: output is PNG (lossless), each block gets a 0.25 megapixel budget adjusted to aspect ratio (with examples), at most 10 blocks per call, no size/format knobs, and the revision is loaded before rendering to ensure correct scene resolution on shared servers. This is rich, specific behavioral detail that goes far beyond a simple 'renders pages' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but every paragraph serves a purpose: purpose, parameter semantics, usage guidance, pixel budget, and alternative routing. It front-loads the core purpose in the first sentence and uses code formatting for parameter names. It's not bloated; it's thorough, though slightly verbose for a tool with only two parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description covers everything an agent needs: how to use each parameter, the rendering behavior (PNG, resolution per block), limits (max 10), and when to choose alternatives like `export`. It even addresses edge cases like shared-server state and pixel budget for fine detail. There are no obvious gaps that would prevent correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes both parameters at 100% coverage, but the description adds significant semantics: `blockIds` is a list whose order matters, can be omitted to preview all pages, and has a 10-block cap; `revision` is required and loaded before rendering to resolve ids against the right scene. This adds operational meaning beyond the schema's static field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Render blocks (almost always pages) to inline images so you can see the result.' It clearly distinguishes itself from the sibling `export` by contrasting inline images with native-resolution output and an `httpUrl`. This is not a tautology; it tells the agent exactly what the tool does and how it differs from similar tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use and when-not-to-use guidance: 'Preview several blocks at once when REVIEWING or capturing a finished design... While BUILDING a multi-page design, keep previewing each page right after you build it.' It also directs the agent to alternatives: 'For native-resolution certainty, `export` the page and open its `httpUrl`' and 'To eyeball fine detail, preview the suspect BLOCK directly.' This is comprehensive routing advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
renameA
Rename a design. revision may be any revision in the lineage; the root's title is updated. Use this when the title set at design creation no longer fits.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosing behavior. It adds the non-obvious side effect that 'the root's title is updated' regardless of which revision is passed, which is valuable behavioral context. It does not cover reversibility or permissions, but the key side effect is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no fluff. The action is front-loaded in the first sentence, and the second adds behavioral detail and usage guidance. Every sentence contributes value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter rename tool with no output schema or annotations, the description covers the operation, parameter semantics, and usage context. It does not mention return values or error conditions, but these are less critical given the low complexity and straightforward action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains that 'revision may be any revision in the lineage' and that the root's title changes, giving meaning to both parameters. The title parameter's role is implied as the new name, though not explicitly stated, so a slight deduction applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Rename a design,' which is a specific verb and resource. It further distinguishes the action by noting that any revision in the lineage can be used and that the root's title is updated, clarifying exactly what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states 'Use this when the title set at design creation no longer fits,' giving a clear context for use. However, it does not mention alternatives or exclusions, such as using the 'edit' tool for other properties, so it lacks full sibling differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scorecardA
Record the verdict of a judge loop you have COMPLETED for a revision — the final step of the judge skill. Recording is a claim about work already done: never call this without having scored the axes against actual preview renders of this exact revision's content.
verdict: 'pass' — every applicable axis scored ≥ 8; the design may be delivered. verdict: 'fail' — you are stopping with an axis below 8 (e.g. the user cut remediation short); the failure stays on record.
The latest scorecard is what export checks: delivering a revision it does not cover (content changed since, or no scorecard at all) adds a reminder to its result. Judging again after further edits? Record a new scorecard for the re-judged revision.
| Name | Required | Description | Default |
|---|---|---|---|
| verdict | Yes | 'pass' when every applicable axis scored ≥ 8, 'fail' when stopping below the gate. | |
| revision | Yes | The revision the judge loop scored — the id whose renders you previewed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden and does it well. It discloses that recording is a 'claim about work already done', not the action itself, and explains the side effect on `export` (adds a reminder if revision is not covered). It also clarifies the semantic of pass/fail outcomes. This goes beyond what an annotation could provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Despite being ~140 words, every sentence contributes. The purpose is stated first, followed by verdict semantics, then the export interaction, and a closing note on re-judging. It is structured with paragraphs and clear separation of ideas, front-loads the critical 'never call without' warning, and avoids redundancy. Appropriate length for the behavioral nuance it conveys.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter tool with no output schema, the description covers all necessary context: the action's role in the judge workflow, prerequisites (actual previews), the meaning of each verdict, the interaction with `export`, and the policy for re-judging. An agent has everything it needs to decide to call and to use parameters correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds significant semantic depth. It elaborates the meaning of 'pass' and 'fail' with specific threshold criteria (each axis ≥ 8) and clarifies that `revision` must be the id whose renders were previewed. This explains the purpose of both parameters beyond their schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb-resource pairing: 'Record the verdict of a judge loop you have COMPLETED for a revision.' It explicitly names the tool's role as the final step of the `judge` skill and distinguishes it from siblings by referencing its relationship to `export`. No ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit conditions for use: 'never call this without having scored the axes against actual `preview` renders.' It also instructs when to record a new scorecard ('Judging again after further edits? Record a new scorecard'), and explains the consequence of not covering a revision in `export`. Clear when-to-use and when-to-refrain guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skillA
Load a skill — an instruction document that teaches you how to work with this server. Read the relevant skill BEFORE attempting work it covers. Intended sequence: (1) call with just name to get the entry document — it ends with an index of the bundled files; (2) pass query (a regex, like Grep) to search the bundled files for the rules you need, scoping with path when you know the file; (3) full-read a file via path only when it is small (the index shows line counts) or after a search missed twice — slice large files with offset (skip count: offset=10 starts at line 11) and limit. Entry documents are always returned whole (offset/limit are ignored for them).
Triggered for any task using this server's edit or preview tools.
Authoritative TypeScript signatures for the CE.SDK CreativeEngine. Use this
skill whenever you need the exact signature, parameter types, or return type
of an engine.* method — especially before calling a method you haven't
used yet. This is THE source of truth for signatures: generated from the
.d.ts shipped with the same @cesdk/node package the engine runs, while
prose docs (the guide skill) can drift.
Reading this skill with no path returns the WHOLE edit-code API surface inline — the engine.design facade, the props trees, the attachment unions and the capability matrix. That is one call and it is all edit code needs.
The sub-file "signatures.d.ts" is the same surface plus the upstream CE.SDK core — JSDoc-free signatures with every string-vocabulary type (property names, block types, enum values) flattened to its literal union on the declaring line. It is served a page at a time: search it with query (e.g. query: "saveToArchive"), then slice around the hit with path + offset/limit.
Triggered when you need to verify an engine.block.* or engine.scene.*
signature, look up a parameter type, or confirm an enum/string-property name.
Use when applying a brand kit / brand style to an existing CoDesign / CE.SDK design — a
rules-governed restyle (recolor + refont + logo + treatment by role), not a free-form style
change; when a restyled design reads off-brand (free-chosen colors, wrong accent, a second
colour used as structure, a coloured button the brand forbids, a headline set in a weight the
brand bans, a flat bordered card, or the wrong / recoloured / redrawn logo); when loading a
brand's fonts, wordmark SVG, or signature device into a scene; or when turning an external brand
(a guidelines PDF, a website / URL, a Figma file, or a raw asset dump) into a reusable brand kit.
Use when the user asks to create / generate / make a NEW design from a prompt — a deck
or slides, poster, flyer, social post, business card, or a custom-size canvas. Runs the
guided intake: derive every brief parameter the prompt already answers (class, format,
audience, vibe, brand, content), ask ONLY the missing questions — one round, chip-style
options, "Decide automatically" defaults — then echo the design brief and hand off to the
handbook Loop. A brief given to the /codesign prompt lands here as the stated input.
Canvas-format reference for CoDesign designs — one file per screen/print format (ig-post,
ig-square, ig-story, widescreen, linkedin-post, x-post, deck, poster, flyer, business-card):
exact W×H, aspect, medium, platform safe zones, print bleed/dpi. Use when picking or setting up
a canvas size, checking a platform safe zone, or preparing print dimensions. Re-composing an
existing design into a format is the resize skill; new-design intake is the create skill.
Look up CE.SDK Node.js reference docs, guides, and configuration pages —
prose explanations, recipes, and concept docs for everything the engine can
do (text, fills, colors, export, video, templates, asset sources, …).
Use when you need to understand HOW a CE.SDK feature works or want a code
recipe; also triggered by "IMG.LY", "CreativeEditor", "CE.SDK", or "cesdk"
when the user needs an existing Node.js doc page. For exact TypeScript
signatures use the api skill instead.
The entry document is an index; every doc page is a sub-file — read one with
path (e.g. path: "text/add.md"), or search them all with query.
Use to quality-gate a design before reporting it done — the mandatory step 5 of the
handbook Loop; when the user asks for a design review, score, audit, or QA; or when a
design needs remediation after a failed review. The axes, the gate, the scorecard
format, and the remediation loop are defined in this skill's body — read it before
scoring; do not judge from memory of this description.
Use when creating or fixing translated / localized variants of an existing CoDesign / CE.SDK
design (e.g. de/ja/ru/ar editions); when a localized edition's text blocks or
decorative elements have drifted, re-centered, or resized away from the source layout; when
translated copy is tofu, overflowing, mis-tracked, or the wrong font after a language swap; or
when loading a non-Latin script (Cyrillic / CJK / Arabic RTL / Vietnamese) font into a scene.
Use when the user is new here or asks what this server is / what it
can do ("what is CoDesign", "what can you make", "show me"). A guided, plain-language
introduction for a HUMAN: explain what CoDesign is in everyday terms, put the six
jobs it does on the table, let the user pick one, then run it either on the bundled
demo design or on the user's own idea — closing with the optional (never required)
IMG.LY sign-in and the ways to earn more credits. Not a design manual: the handbook
remains the required read before any edit.
Use when resizing or reformatting a CoDesign / CE.SDK design to a new size or aspect ratio
(ig-post ↔ ig-square ↔ ig-story ↔ widescreen, or a custom W×H); when building the size/format
editions of a design from an existing design or from a brief; or when a reformatted
edition has a dead void / letterboxed empty band, drifted or broken margins, off-canvas or
clipped elements, mis-scaled decoration, or a stretched / squished layout.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Skill to load. | |
| path | No | Optional sub-file within the skill. Defaults to the entry document. | |
| limit | No | Maximum number of lines to return. | |
| query | No | Search the skill instead of reading it: a regular expression matched per line (like Grep). Smart-case: all-lowercase pattern → case-insensitive; any uppercase → case-sensitive. An invalid pattern is an error. Output is grep format — `file:N:` match lines, `file-N-` context lines, blocks headed by `--` with the enclosing markdown headings. Combine with `path` to search one file. Mutually exclusive with offset/limit. | |
| offset | No | Lines to skip before reading (offset=10 starts at line 11). Use with `limit` to slice large files. | |
| context | No | Context lines around each match, like grep -C (default 2; 0 = bare match lines). Only valid with `query`. | |
| maxResults | No | Maximum search matches to return (default 50, max 200). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it discloses non-obvious behavior: entry documents are always returned whole and ignore offset/limit, query acts like Grep, large files should be sliced, and a search should be attempted twice before a full read. It also states the smart-case and invalid-pattern consequences in the schema-backed text, with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The operational guidance is front-loaded and each section has a role, but the available_skills block is lengthy. It is justified because the enum values and triggers must be documented somewhere, and the prose is tightly written given it covers ten skills.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with no output schema and no annotations, the description covers the workflow, how to choose each skill, the search-vs-read strategy, and the entry-document/index hints. An agent can invoke this tool correctly without needing external knowledge.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns one more point by explaining how the parameters chain together (name → query → path → offset/limit) and by adding behavior the schema does not state, such as entry documents ignoring offset/limit. It does not duplicate every field, relying on the rich schema for details like maxResults/context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and object: 'Load a skill — an instruction document...' and goes on to list ten named skills with one-line definitions, making it unmistakable what is loaded. It also separates the skill mechanism from the skills themselves, so an agent can tell 'skill' from content-bearing tools like list or view.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit before/after rule ('Read the relevant skill BEFORE attempting work it covers'), a numbered intended sequence, and per-skill trigger conditions ('Use when...', 'Triggered for any task using...'). It even routes between alternatives within the tool ('For exact TypeScript signatures use the `api` skill instead').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
viewA
Get a URL the human can open to view and edit the design in CE.SDK. Returns the design's stable URL — the viewer keeps it live, re-rendering as you edit, so print it ONCE and don't re-emit a fresh URL every turn. Add pin: true for a frozen permalink to that exact revision (for 'look at exactly this' or comparing revisions). The page is a full editor; when the human clicks 'Save', their edits land as a new revision whose note carries an engine-computed change summary — continue from that revision.
| Name | Required | Description | Default |
|---|---|---|---|
| pin | No | When true, return a frozen permalink to this exact revision instead of the live design URL. | |
| revision | Yes | Any revision in the design; resolved to its root and opened at the design head. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden—and it delivers: it discloses that the URL stays live and re-renders on `edit`, that pinning freezes a revision, and that human saves create new revisions with engine-computed change summaries. It also warns against re-emitting a fresh URL every turn, which is exactly the kind of non-obvious behavior an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: core behavior, the critical 'emit once' instruction, the pin variant, and the downstream save/revision loop. The most important operational guidance is front-loaded, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must explain what is returned—and it does (a stable URL, or a frozen permalink when pinned). It also covers the lifecycle after the human saves, which is essential for the agent to continue from the right revision. Given the tool's moderate complexity, nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it translates `pin: true` into a 'frozen permalink' and ties it to concrete use cases like 'look at exactly this' or comparing revisions. It also clarifies that any revision resolves to its root and opens at the design head.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get a URL the human can open to view and edit the design in CE.SDK.' It clearly distinguishes the tool's core output (a stable, live design URL) from the surrounding editing/management tools and explains the two modes (live vs pinned).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: emit the live URL once, avoid re-emitting every turn, and use `pin: true` for exact revisions or comparisons. It doesn't explicitly name sibling alternatives or state when not to use this tool, but it provides strong operational guidance for the main decision point.
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.
19 tool updates
v0.1.0- First observed
asset_add - First observed
asset_generate - First observed
asset_search - First observed
changes - First observed
checklist - First observed
diagnostics - First observed
edit - First observed
export - First observed
history - First observed
import - First observed
inspect - First observed
list - First observed
login - First observed
logout - First observed
preview - First observed
rename - First observed
scorecard - First observed
skill - First observed
view
TDQS
Scored across 19 tools
Each tool targets a distinct concern: revision lifecycle, asset management, auth, skills, export, or diagnostics. The asset_search/asset_add/asset_generate trio is clearly separated by operation (find/add/generate), and list/history/changes/inspect are differentiated by scope. No two tools appear to overlap in a way that would cause misselection.
Bare verbs (edit, export, preview, import, list, view) coexist with prefixed names (asset_search, asset_add, asset_generate) and noun-only names (skill, history, checklist, scorecard, diagnostics). While the core verbs are recognizable and readable, there is no single predictable pattern across the set.
At 19 tools, the server sits in the 16-25 range that feels heavy. However, the broad scope (design editing, assets, auth, skills, diagnostics, quality gates) justifies most of them, so it is borderline rather than bloated.
The design lifecycle is well covered: create (edit, import), read (inspect, preview, history, list), update (edit, rename), and export, plus asset management and quality gates. The main gap is the absence of delete/remove operations for designs or assets, and asset management lacks update/delete, but agents can work around these.
Maintenance
Related MCP Connectors
Give your AI agents a design superpower. Generate, edit, and publish publication-grade decks, reports, landing pages, resumes, and marketing visuals directly within your agent workflow. Delivering frontier-level design quality at 3× the speed and 53× lower cost -from conversational prompt to live link or vector PDF in minutes.
- OrshotOAuthcom.orshot
Render on-brand images, PDFs and videos from templates. 60+ tools: brand kit, folders, workflows.
Your design, automated endlessly. Design anywhere, Brixa freezes it as a template, publishes forever
Access and maintain design system docs, tokens, components, skills, and contexts across any project.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables Cursor to access Figma design data via MCP, allowing it to fetch simplified layout and styling information to accurately implement designs from Figma files.1,330 npmMIT
- AlicenseBqualityAmaintenanceEnables AI assistants to control Adobe Photoshop programmatically, supporting recipe workflows, state awareness, and generative AI features through natural language commands.81183,798 npm464MIT
- FlicenseNot gradedqualityCmaintenanceLocal MCP server enabling Codex to inspect and edit HWPX documents, Excel spreadsheets, and QGIS QGS/QGZ projects on Windows with safety and fidelity.1-
- AlicenseAqualityAmaintenanceLocal-first visual design workspace for AI assistants. Compose wireframes and branded multi-page HTML/CSS documents with live preview, annotations, brand and asset libraries, typed data collections, layout validation, PDF export, and draft-only Gmail handoff.14127 npm19MIT