Kalpana Batch
Server Details
Generate ad creatives and product images in bulk from a spreadsheet, for every product or campaign.
- Status
- Healthy
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 17 tools
Despite several tools operating on the same resources, each description explicitly states its boundary and redirects to the sibling (cancel_batch vs cancel_job, get_batch vs get_batch_jobs vs get_batch_outputs, update_batch vs update_job, validate_batch vs create_batch). The overlap is intentional layering, not confusion, so an agent can pick reliably.
All 17 names follow a strict verb_noun snake_case pattern (create_batch, get_batch_jobs, cancel_job, search_templates, upload_images). Compound nouns like get_batch_outputs and get_template_inputs stay predictable and readable.
17 tools is slightly above the ideal band, but each covers a distinct facet (batch lifecycle, job editing, template input discovery, asset search/upload, image inspection, workspace context). No obvious filler tools, though the get_batch family could arguably be consolidated.
The batch lifecycle is well covered end to end: validate, create, run, update, cancel, poll, and fetch outputs, plus template and asset discovery. Gaps are minor: there is no archive/delete_batch tool even though archived batches are referenced, and no dedicated retry-failed-jobs operation (only update_batch/update_job resetting).
Available Tools
17 toolscancel_batchCancel a batch's unfinished jobsADestructiveIdempotentInspect
Stops a whole batch: every job still pending or processing becomes cancelled. Cancelled jobs are not charged and are final; a render already under way may finish, but its result is discarded. Jobs that already rendered keep their output and their charge. A finished batch, or a second call, changes nothing. An unknown batchId, or one from another workspace, returns Batch not found. To stop one job and let the rest render, use cancel_job; to render cancelled rows later, create_batch a new batch with them. Needs batches:create on the connection and renders:create in the user's workspace role.
| Name | Required | Description | Default |
|---|---|---|---|
| batchId | Yes | Batch ID returned by create_batch or list_batches |
Output Schema
| Name | Required | Description |
|---|---|---|
| cancelled | Yes | Jobs this call cancelled; 0 when they had all finished |
| stoppedMessages | Yes | Queued renders removed before they started |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructive/idempotent annotations: cancelled jobs are not charged and are final, an in-flight render may finish but its result is discarded, already-rendered jobs keep output and charge. It also documents the 'Batch not found' failure path and the required scopes, none of which the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
What happens is front-loaded in the first sentence, followed by effects, idempotency, errors, alternatives, and permissions in a logical order. Dense but every clause carries distinct information; 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?
Mutation semantics, finality, billing consequences, idempotency, error behavior, sibling routing, and required permissions are all covered; an output schema exists so return values need no explanation. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the batchId format and origin are already documented. The description still adds meaning the schema lacks: an unknown batchId or one from another workspace fails with 'Batch not found', which tells the agent about cross-workspace scoping of the identifier.
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?
Opens with a specific verb and resource ('Stops a whole batch') and immediately scopes it to unfinished jobs ('every job still pending or processing becomes cancelled'). It is clearly distinguishable from the sibling cancel_job, which is named explicitly later.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes between alternatives: 'To stop one job and let the rest render, use cancel_job; to render cancelled rows later, create_batch a new batch with them.' It also states when the call is a no-op (finished batch, second call), giving the agent both selection and precondition rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_jobCancel one unfinished jobADestructiveIdempotentInspect
Stops one job that is pending or processing: it becomes cancelled, is not charged, and cannot be resumed; a render already under way may finish, but its result is discarded. A job that already finished is left as it is. Other jobs in its batch keep rendering; to stop them all use cancel_batch. A jobId that is not in this workspace returns Job not found. Needs batches:create on the connection and renders:create in the user's workspace role.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | Job ID from get_batch_jobs |
Output Schema
| Name | Required | Description |
|---|---|---|
| cancelled | Yes | Jobs this call cancelled; 0 when they had all finished |
| stoppedMessages | Yes | Queued renders removed before they started |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description explains that the job becomes cancelled, is not charged, cannot be resumed, and that an in-progress render may finish with its result discarded. It also covers the no-op behavior for finished jobs, the fact that sibling jobs keep rendering, the not-found error, and the required permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core effect and then efficiently layers edge cases, sibling behavior, errors, and permissions. Every sentence adds actionable information without repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, idempotent mutation with a simple single-parameter schema and an output schema, the description covers side effects, irreversibility, edge cases, error behavior, and authorization requirements. Nothing material is missing 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 coverage is 100%, so the jobId parameter and its UUID format are already fully documented in the schema. The description adds only that an unknown workspace jobId returns 'Job not found,' which is useful but does not substantially deepen parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: stopping one pending or processing job. It clearly scopes the operation to a single job and explicitly distinguishes it from cancel_batch, which stops all jobs in a batch.
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 explains exactly when to use this tool: for a job that is pending or processing but not one already finished. It also names the alternative cancel_batch for stopping the whole batch, giving the agent explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_batchCreate a draft batchAInspect
Saves a new draft batch in the template's workspace with one pending job per row for each page or flow: an image, or a video when outputFormat is mp4, gif, webm or mov. Nothing renders and no credits are spent until run_batch. The result's creditCost is the exact number of credits run_batch will spend on these jobs. Every call creates a separate batch, so repeating a call duplicates it. To change an existing draft use update_batch. Rows are checked as in validate_batch, and one invalid row rejects the whole request with nothing saved. An animated template renders each image at one moment of its motion: stillTime, else the page's own still time, else the last frame; a video renders all of it and takes no stillTime. Needs templates:read and batches:create.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Batch name shown in Kalpana and used in output filenames, 1 to 200 characters | |
| rows | Yes | 1 to 500 rows. Each keys a layer by its name (case aside) or id, the key get_template_inputs gives, to a plain value: text as a string, an image as an asset id or file name, or { asset, fit, zoom, panX, panY } and { text, visible } when framing or visibility changes. rowExample in get_template_inputs is a ready row. With columns, a row is instead an array of cells in column order, which keeps large batches small. null leaves a layer at the template's own value. Layers left out keep the template's value, or the one in defaults. | |
| columns | No | For array rows: the layer key of each cell, in order, like a spreadsheet header | |
| flowIds | No | Instead of pageIds: this template's flows (get_template_inputs flows), each a video joining some of its pages, that every row renders as, one video per row per flow, with a video outputFormat. A name fills every layer with it across a video's pages. | |
| pageIds | No | This template's pages (get_template_inputs pages) every row renders on, in order: one id for one file per row, several for one file per row per page, such as a carousel's slides. The first page when omitted. A row may carry keys of any of these pages; each page takes the keys it has. | |
| defaults | No | Values every row gets unless it gives its own, such as a logo or call to action shared by all rows | |
| stillTime | No | Animated templates only: the second of the motion that each image shows. Omit it to use the page's own still time (get_template_inputs stillTime), else the last frame. If the page has no still time, ask the user, because an outro or a loop can make the last frame a bad image. | |
| templateId | Yes | The whole template, from search_templates. Not a page or flow id. | |
| outputFormat | No | Output format. png, jpeg and webp render one image per row and pdf one vector page; mp4 and gif render each row's whole motion as a video, and webm (VP9) and mov (ProRes 4444) as a transparent video for overlaying on other footage. Video needs an animated template (get_template_inputs isAnimated) and costs more credits per row | png |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | batchId for run_batch and the other batch tools |
| jobCount | No | Jobs created: one per row per page or flow |
| rowCount | Yes | Rows given |
| warnings | No | Not errors: pass these on to the user, such as a flow longer than a video renders |
| creditCost | Yes | Actual credit cost to run every job in this batch. |
| workspaceId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as non-readonly and non-idempotent; the description adds that repeated calls duplicate the batch, that one invalid row rejects the whole request with nothing saved, that creditCost previews run_batch spend, and that templates:read and batches:create are required. It also explains animated-template stillTime behavior, which is substantive context beyond the annotations and is consistent with them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and draft/no-spend behavior are front-loaded, followed by alternatives, validation, animation rules, and auth needs. The paragraph is dense but every sentence carries operational information, and the length is justified by the tool's complexity.
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?
An output schema exists and the annotations cover the safety profile, but the description still supplies the credit, duplication, validation, update-alternative, animation, and authorization details needed to call the tool correctly. It is complete for this complex draft-creation operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all nine parameters and the baseline would be 3. The description adds meaningful cross-parameter semantics: outputFormat determines whether rows become images or videos, stillTime applies only to animated templates, and rows create jobs per page or flow. It does not restate every schema detail, but it adds enough operational meaning to exceed the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it saves a new draft batch, creating one pending job per row for each page or flow, with image or video output depending on outputFormat. It clearly distinguishes draft creation from run_batch and update_batch, so an agent can tell what this tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says nothing renders and no credits are spent until run_batch, and directs the agent to update_batch to change an existing draft. It also notes validation behavior and says rows are checked as in validate_batch, giving clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_batchCheck batch progressARead-onlyIdempotentInspect
Returns one batch's status with its total, completed, failed and processing job counts. Rendering after run_batch happens in the background, so call it again until processing reaches 0. An unknown batchId, or one from another workspace, returns Batch not found. For many batches at once use list_batches; for per-job values and render errors get_batch_jobs; for download URLs get_batch_outputs. Needs batches:read.
| Name | Required | Description | Default |
|---|---|---|---|
| batchId | Yes | Batch ID returned by create_batch or list_batches |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| total | Yes | Jobs in the batch |
| failed | Yes | Jobs that failed |
| status | Yes | processing while any job renders; pending while jobs wait for run_batch; once every job has finished: completed when all rendered, partial when some rendered and others failed or were cancelled, failed when none rendered and at least one failed, cancelled when none rendered, none failed and at least one was cancelled. The counts carry the detail |
| cancelled | No | Jobs cancelled |
| completed | Yes | Jobs rendered |
| createdAt | Yes | Creation time, ISO 8601 |
| processing | Yes | Jobs rendering now |
| workspaceId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, and the description adds genuinely new behavior: the asynchronous render/polling loop, the error contract ('Batch not found' for unknown or cross-workspace IDs), and the required scope (batches:read). Only a note on throttling/rate limits is missing, so it falls just short of the top.
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?
Four tight sentences, front-loaded with the return shape, then the polling rule, then the error contract, then sibling routing. No repetition of annotations or schema, and every sentence carries actionable 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 single-parameter read tool with an output schema, the description covers everything an agent needs: what comes back, that polling is required, what the auth scope is, and how unknown IDs fail. Return-value detail is correctly deferred to the output schema.
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 already documents batchId with format and origin, so the baseline is 3; the description adds meaning beyond the schema by explaining that a batchId from another workspace fails with 'Batch not found', clarifying the ID's workspace scoping.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns one batch's status') plus the exact fields returned (total, completed, failed, processing counts), and explicitly distinguishes itself from list_batches, get_batch_jobs and get_batch_outputs. An agent can pick this tool over its siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage guidance: poll repeatedly 'until processing reaches 0' because rendering runs in the background, and names three alternatives with the conditions that select them (many batches, per-job values, download URLs). Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_batch_jobsList jobs in a batchARead-onlyIdempotentInspect
Lists a batch's jobs in row order, one page at a time (page from 1, up to 20 jobs a page; a page past the end is empty), with each job's ID, template, current row (keyed and shaped as rows are written), status, render error, and whether it can still be edited. These job IDs and values are the input for update_batch and update_job, and error explains why a render failed. Download URLs are not included (get_batch_outputs has them), and get_batch is lighter for overall progress. Needs batches:read.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, starting at 1 | |
| limit | No | Results per page (default 10); values above 20 are capped at 20 | |
| batchId | Yes | Batch ID returned by create_batch or list_batches |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| items | Yes | |
| limit | Yes | Page size actually applied |
| total | Yes | Count of all matches across every page |
| batchStatus | Yes | draft until run_batch first succeeds; update_batch adds and removes jobs only in drafts |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses pagination edge-case behavior ('a page past the end is empty'), the permission prerequisite ('Needs batches:read'), and what 'error' actually means. These are operational facts the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and payload, then alternatives, then the permission note — a sensible ordering. It is one dense multi-clause sentence, though every clause (pagination cap, empty page, error meaning, auth scope) carries information, so nothing is 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?
Output schema covers return shape, annotations cover the safety profile, and the description still fills the remaining gaps: pagination limits, empty-page behavior, auth requirement, and where the returned IDs are consumed downstream. An agent has everything needed 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%, so page/limit/batchId are already documented, but the description adds the non-obvious outcome of an out-of-range page and reinforces the 20-item cap for limit. Marginal added value over the schema rather than full compensation, so slightly above the baseline 3.
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?
Opens with a specific verb+resource+ordering ('Lists a batch's jobs in row order') and enumerates the exact payload fields the caller receives. It is immediately distinguishable from get_batch (progress) and get_batch_outputs (download URLs), which it names explicitly.
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?
Gives forward routing ('these job IDs and values are the input for update_batch and update_job') and two explicit exclusions with the sibling that covers each case: get_batch_outputs for download URLs, get_batch for lighter overall progress. No inference is required to choose among the three.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_batch_outputsGet rendered imagesARead-onlyIdempotentInspect
Returns the download URLs of a batch's rendered images, one page of jobs at a time (page from 1, up to 20 jobs a page; a page past the end is empty), with each job's status and format; downloadUrl is null until that job has rendered. URLs are temporary, so a later call returns fresh ones. Row values and render errors are not included (get_batch_jobs has them), and get_batch is lighter for checking progress. inspect_image can view a downloadUrl. Needs batches:read, renders:read, and creatives:read.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, starting at 1 | |
| limit | No | Results per page (default 10); values above 20 are capped at 20 | |
| batchId | Yes | Batch ID returned by create_batch or list_batches |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| items | Yes | |
| limit | Yes | Page size actually applied |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent safety profile, and the description adds substantial non-obvious behavior: page-past-the-end returns empty, downloadUrl is null until rendering completes, and URLs are temporary so repeat calls yield fresh ones. It also lists the required scopes (batches:read, renders:read, creatives:read), which annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what is returned and how pagination works, then alternatives, then permissions — a sensible order with no filler. It is dense and parenthetical-heavy, which slightly hurts readability but every clause carries 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?
Covers pagination, null-until-rendered semantics, URL expiry, exclusions relative to siblings, and auth scopes; an output schema exists so return shapes need no elaboration. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already documented. The description still adds value by stating the 20-job page ceiling and the empty-page behavior for out-of-range pages, which the schema only partially implies via its cap note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns the download URLs of a batch's rendered images') plus the scope ('one page of jobs at a time'). It explicitly separates itself from get_batch_jobs, get_batch, and inspect_image, so an agent can distinguish it from siblings without reading schemas.
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?
Gives explicit routing: use get_batch_jobs when row values and render errors are needed, get_batch for lighter progress checks, and inspect_image to view a downloadUrl. Both the use case and the alternatives are named, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_template_inputsDescribe a template's fillable inputsARead-onlyIdempotentInspect
Returns the inputs of one template page that batch rows can fill; pageId picks a page other than the first, since each page has its own inputs. For each input: its id, label, text or image type, whether it is required, its default (a text input's value, an image input's asset and preview), image slot size and fit, the key rows use for it (its name, or its id when two layers share the name), a text input's styles (s1, s2, ...) when it has several, and a valueExample. rowExample is a whole ready row. These keys and values are what validate_batch, create_batch, update_batch and update_job accept. Inputs the author turned off or put on hidden layers are left out unless includeDisabled or includeHidden asks for them; omittedInputs names them. Their template text still renders, so check them (dates, terms, links) when the copy changes theme; a row can still fill them by key. An animated template also gives its duration and its stillTime. The layout is not returned: to see the template use inspect_image on its previewUrl, and to find templates search_templates. Needs templates:read.
| Name | Required | Description | Default |
|---|---|---|---|
| flowId | No | One video of the template (from flows) instead of a page: its inputs, one per layer name across its pages | |
| pageId | No | One page of the template (the designer connection's page_id), for its inputs. A template's pages are separate designs, each with its own inputs; the first page when omitted. | |
| templateId | Yes | The whole template, from search_templates. Not a page or flow id. | |
| includeHidden | No | Also return inputs on layers hidden in the template | |
| includeDisabled | No | Also return inputs the template author turned off |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| flows | No | The template's videos, each joining its own pages with transitions. Pass an id as flowId here for its inputs, and in flowIds to the batch tools to render it |
| pages | No | The template's pages; each is a separate design with its own inputs |
| width | Yes | Width in pixels; null if unknown |
| flowId | No | The video these inputs are from, when flowId was given |
| height | Yes | Height in pixels; null if unknown |
| inputs | Yes | |
| pageId | No | The page these inputs are from (pass it in pageIds to the batch tools) |
| openUrl | Yes | Link that opens the template in the Kalpana app |
| duration | No | An animated template's timeline length in seconds |
| stillTime | No | The second the page's still image shows, set by its designer. Images use it unless create_batch gives stillTime; without either, they show the last frame |
| isAnimated | No | True when the template moves; each image shows one moment of the motion |
| rowExample | No | A row filling every input, keyed and shaped as rows are: copy and edit it |
| description | Yes | |
| omittedInputs | No | Inputs left out of `inputs`. Their template text renders as designed unless a row fills them by key; check them when the copy changes theme (dates, terms, links) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds context they don't carry: the templates:read scope requirement, that disabled and hidden-layer inputs are silently omitted and listed in omittedInputs, that their template text still renders and can still be filled by key, and that animated templates add duration and stillTime. These are non-obvious behaviors an agent would otherwise get wrong.
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 critical scoping fact and the primary use case are front-loaded, and every clause carries content. It is dense, though — a long enumerative sentence describing return fields that the output schema already covers could be trimmed without losing decision 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 read tool with full annotations and an output schema, the description covers everything the agent needs: required scope, ID selection semantics, omission behavior, the link to batch validation/creation, and pointers to sibling tools for layout and discovery.
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 templateId/pageId/flowId/includeHidden/includeDisabled are already documented, including the pageId-omitted default and the flowId cross-page behavior. The description restates the pageId semantics ('pageId picks a page other than the first') without adding format, precedence, or error behavior beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource — returns the fillable inputs of one template page — and immediately scopes it to rows produced by batch tools. An agent can distinguish it from search_templates (finding templates) and inspect_image (seeing layout) without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to alternatives: 'to see the template use inspect_image on its previewUrl, and to find templates search_templates.' It also states when to set includeDisabled/includeHidden and when the returned keys apply (validate_batch, create_batch, update_batch, update_job), so when-to-use is fully determined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workspaceThe connected workspaceARead-onlyIdempotentInspect
Returns the Kalpana workspace this connection covers, chosen when the user connected: its ID, name and slug, the user's role and what it allows here (permission codes, and in plain words whether it can render batches), and allowedImageDomains, the hosts upload_images will fetch an image URL from. Every other tool works in this workspace and takes no workspace ID. Call it to explain a 403 from another tool (run_batch needs renders:create, for example), or before passing image URLs to upload_images: a URL on another host is refused until an admin adds the domain in Workspace Settings > Domain Whitelisting. Working in another workspace needs a reconnect that chooses it. Needs workspaces:read.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| role | Yes | The user's role in this workspace |
| slug | Yes | |
| permissions | Yes | Permissions both the role and this connection grant here, and the tools they open: templates:read for search_templates, get_template_inputs, and validate_batch; assets:read for search_assets; assets:create for upload_images; batches:read for get_batch, list_batches, and get_batch_jobs; templates:read with batches:create for create_batch, update_batch, and update_job; batches:create with renders:create for run_batch; batches:read, renders:read, and creatives:read together for get_batch_outputs |
| allowedImageDomains | No | Hosts an image URL for upload_images may come from, subdomains included; an admin adds others in Workspace Settings > Domain Whitelisting |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already mark this as a safe, idempotent read, the description adds important behavioral context beyond them: it requires workspaces:read, it explains domain whitelisting enforcement before upload_images, and it clarifies that a 403 may reflect missing permission on a sibling tool. These details materially help an agent interpret errors and avoid invalid image URLs.
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 return shape and scoped behavior. Despite being a single dense paragraph, every sentence carries operational value: return fields, workspace-wide implicit scoping, error diagnosis, domain checks, reconnect alternative, and required permission.
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?
Even though an output schema exists, the description goes further by explaining the security and usage context: permission requirements, 403 diagnosis, domain whitelisting, and the reconnect path for other workspaces. Nothing an agent needs in order to call or interpret this zero-parameter tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no parameter semantics to document and the baseline of 4 applies. The description correctly focuses on return values and usage rather than inventing parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Returns the Kalpana workspace this connection covers') and enumerates exactly what is returned: ID, name, slug, role, permission codes, batch-rendering permission, and allowedImageDomains. It also distinguishes this tool from all siblings by noting that every other tool operates implicitly in this workspace and takes no workspace ID.
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 when-to-use guidance: call it to explain a 403 from another tool, such as run_batch needing renders:create, or before passing image URLs to upload_images to check allowedImageDomains. It also states the alternative for working in another workspace: a reconnect that chooses it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_imageView an imageARead-onlyIdempotentInspect
Fetches one PNG, JPEG, or WebP image from a Kalpana URL (a template or asset previewUrl, or a downloadUrl from get_batch_outputs) and returns it as image content with its content type and byte size. Other hosts, other file types, and files over 5 MB are rejected, and a fetch gives up after 15 seconds. It shows one image per call; it does not build contact sheets or render templates, whose look comes from their previewUrl.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | previewUrl or downloadUrl returned by another Kalpana tool |
Output Schema
| Name | Required | Description |
|---|---|---|
| sizeBytes | Yes | |
| contentType | Yes | MIME type of the returned image |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, closed-world), and the description adds the constraints an agent actually needs: a 5 MB size ceiling, a 15-second timeout, host restriction to Kalpana, and one image per call. These are non-obvious failure modes that the annotations say nothing about.
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 dense sentences, front-loaded with what is fetched and from where, then constraints, then exclusions. No filler and every clause carries operative 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 single-URL read tool with annotations and an output schema, the description covers accepted formats, provenance of the URL, rejection rules, timeout, and scope limits. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes slightly beyond by tying the url to concrete producers (template/asset previewUrl, downloadUrl from get_batch_outputs), which helps an agent source the value. It does not add format or encoding detail beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('fetches one PNG, JPEG, or WebP image') plus the exact accepted URL sources, immediately separating it from siblings like search_assets or get_batch_outputs. It also names what the tool does not do ('does not build contact sheets or render templates'), so an agent can disambiguate without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit positive case (previewUrl or downloadUrl from Kalpana tools), explicit negative cases (other hosts, other file types, >5 MB), and explicit alternatives ('whose look comes from their previewUrl'). An agent knows exactly when to call this and when to call something else.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_batchesList batchesARead-onlyIdempotentInspect
Lists the workspace's batches, newest first, one page at a time, with each batch's ID, name, status, and total, completed, failed, and processing job counts; total counts every match, so it also answers how many batches exist. search matches part of a batch name, ignoring case, and templateId keeps one template's batches. For one known batch ID, get_batch returns the same counts, and job details are in get_batch_jobs. Needs batches:read.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, starting at 1 | |
| limit | No | Results per page (default 10); values above 20 are capped at 20 | |
| search | No | Text matched against batch names | |
| templateId | No | Only batches with jobs for this template |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| items | Yes | |
| limit | Yes | Page size actually applied |
| total | Yes | Count of all matches across every page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/non-destructive annotations, the description discloses ordering ('newest first'), paging behavior, included count fields, the meaning of `total`, case-insensitive partial matching for `search`, filtering via `templateId`, and the required `batches:read` permission. These details materially improve invocation confidence for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded: it starts with what the tool lists and returns, then moves to filtering behavior, sibling alternatives, and the required permission. Every sentence contributes useful information without 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?
For a low-complexity read-only listing tool with full schema descriptions and an output schema, the description covers purpose, behavior, filters, sibling alternatives, and auth requirements. Nothing essential is missing for correct selection or 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 coverage is 100%, so page and limit are already well documented in the schema. The description adds semantic meaning for `search` ('matches part of a batch name, ignoring case') and `templateId` ('keeps one template's batches'), though it does not elaborate on pagination parameters beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Lists the workspace's batches'), specifies ordering and pagination, and enumerates the returned batch fields. It also distinguishes the tool from get_batch by noting that get_batch should be used for one known batch ID.
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 explains the tool's purpose for listing, filtering, and counting batches, and explicitly routes the agent to get_batch for a single known ID and to get_batch_jobs for job details. This is clear when-to-use and alternative guidance with no misleading exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_batchRender a batch (spends credits)ADestructiveIdempotentInspect
Renders a batch: every pending job is queued, and the call returns once they are queued. Images render in the background; track them with get_batch and collect them with get_batch_outputs. It spends the workspace organization's credits for the pending jobs: create_batch's creditCost, unless jobs were added or removed since. When the balance is too low nothing is queued, the error says not enough credits, and the batch stays a draft. A successful run publishes the draft, after which update_batch can no longer add or remove jobs; an archived batch returns an error, and a batch with a pending job on a deleted template returns Template not found and queues nothing. Jobs reset to pending by update_batch or update_job render on the next call. If the workspace has webhook endpoints, they receive the results unless webhooks is false. Run it only after the user agrees to the cost; check rows first with validate_batch. Needs batches:create on the connection and renders:create in the user's workspace role.
| Name | Required | Description | Default |
|---|---|---|---|
| batchId | Yes | Batch ID returned by create_batch or list_batches | |
| webhooks | No | Whether this run sends its results (batch.completed, job.completed) to the workspace's webhook endpoints. Omit to keep the batch's setting, which is on; pass false only when the user asks not to notify their endpoints |
Output Schema
| Name | Required | Description |
|---|---|---|
| failed | Yes | Jobs that could not be queued |
| message | Yes | |
| dispatched | Yes | Pending jobs queued by this call; 0 on a repeat call |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint, idempotentHint), the description discloses the credit-spend model, all three named failure modes (insufficient credits, archived batch, 'Template not found'), and the state transition where a successful run publishes the draft and permanently blocks add/remove. It also explains that reset jobs re-render on the next call and that webhooks fire by default, which the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and its return timing are front-loaded, and each subsequent sentence carries distinct information about costs, failures, or state. It is a dense single paragraph, though, and the trailing sentence packs cost consent and two permission requirements together, slightly hurting scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and it instead covers everything else an agent needs: side effects (credit spend), failure conditions, post-run mutability, async tracking, and required permissions ('batches:create' on the connection, 'renders:create' in the workspace role).
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 both parameters are already documented, but the description adds causal meaning to webhooks ('If the workspace has webhook endpoints, they receive the results unless webhooks is false') that clarifies the default behavior in context. It adds little for batchId beyond what the schema says, keeping it just above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource ('Renders a batch') and immediately defines the scope of work ('every pending job is queued, and the call returns once they are queued'), which differentiates it from create_batch, validate_batch, and the get_* readers. An agent can pick this tool out of the sibling list without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states an explicit precondition ('Run it only after the user agrees to the cost'), points to the correct preparatory alternative ('check rows first with validate_batch'), and routes follow-up work to get_batch and get_batch_outputs. It also explains when the webhooks override should be used ('pass false only when the user asks not to notify their endpoints').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_assetsFind image assetsARead-onlyIdempotentInspect
Finds images to put into template image inputs: the ready PNG, JPEG and WebP files under 5 MB in the workspace, one page at a time, each with a previewUrl. With no filters it lists the most recently updated images and also names every image collection (named groups of images) with its ID and image count. collection keeps one collection's images, given by its name (ignoring case) or ID: when the user says where their images are ("the Diwali photos"), pass that name. query matches file names, and both combine. A collection name that matches none is refused with the workspace's collection names. Each image comes with its pixel width and height when known. An asset's id is what an image input takes in batch rows. inspect_image shows a previewUrl, and upload_images adds the user's own files. Needs assets:read.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, starting at 1 | |
| limit | No | Results per page (default 8); values above 12 are capped at 12 | |
| query | No | Filename text to search for, 2 to 100 characters; omit to browse | |
| collection | No | A collection's name (ignoring case) or ID; limits results to it |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| items | Yes | |
| limit | Yes | Page size actually applied |
| total | Yes | Count of all matches across every page |
| collections | No | Every image collection, when no filter is given (most recently updated first) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses the eligibility constraints (ready files, under 5 MB), pagination ("one page at a time"), the default ordering, the previewUrl and pixel dimensions returned, and the error behavior when a collection name matches nothing (refusal listing workspace collection names). It also states the required scope, assets:read.
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?
Front-loaded with purpose and default behavior, and nearly every sentence carries distinct information. It is a dense single paragraph, though, and the filter semantics could be broken out for faster scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers everything needed to call it correctly: default behavior, filter semantics, pagination, error handling, required scope, and the returned identifiers used by image inputs in batch rows. An output schema exists, yet the description still surfaces the fields an agent must act on.
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: `collection` accepts a user-spoken name (case-insensitive) or ID and how to source it from conversation, `query` matches file names, and the two filters combine. It does not add anything for `page`/`limit` beyond the schema, keeping it short of a 5.
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?
Opens with a specific verb+resource plus its purpose: "Finds images to put into template image inputs", narrowed to ready PNG/JPEG/WebP files under 5 MB. That framing makes it clearly distinct from siblings like inspect_image and upload_images, which it also names.
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?
States the no-filter default (most recently updated images plus collection listing), when to pass `collection` ("when the user says where their images are"), and that `query` and `collection` combine. It also routes to inspect_image for previews and upload_images for adding files, so alternatives are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_templatesFind templatesARead-onlyIdempotentInspect
Finds the workspace's templates to fill with data, one page at a time. Each comes with its ID, pixel size, input count, previewUrl and a link that opens it in Kalpana. Without query it lists the most recently updated templates. query matches an exact template ID, or words in a name, description or campaign topic; the size and preview filters narrow further. Animated templates are included and marked isAnimated: their images show one moment of the motion. The fillable inputs are not included: get_template_inputs returns them for one ID, and inspect_image shows a previewUrl. Needs templates:read.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, starting at 1 | |
| limit | No | Results per page (default 10); values above 20 are capped at 20 | |
| query | No | Exact template UUID or name, description, or campaign topic; at least 3 characters. Omit to browse. | |
| width | No | Exact template width in pixels | |
| height | No | Exact template height in pixels | |
| hasPreview | No | Set true to exclude templates without a preview URL |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| items | Yes | |
| limit | Yes | Page size actually applied |
| total | Yes | Count of all matches across every page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only and idempotent annotations, it discloses pagination, default ordering, animated-template behavior, image preview limitations, excluded fillable inputs, and the templates:read permission requirement. These are exactly the behavioral details an agent needs before calling the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and pagination, then adds query behavior, caveats, exclusions, and permissions in a compact sequence. Every sentence earns its place and no filler is present.
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 paginated search/list tool with an output schema and full input schema coverage, the description still covers scope, default behavior, filters, return caveats, excluded data, alternative tools, and required permission. Nothing material is missing 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 coverage is 100%, so the schema already documents the six parameters. The description adds useful semantics beyond the schema: omitting query lists recently updated templates, query matches words in names/descriptions/campaign topics, and size/preview filters narrow results.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it finds the workspace's templates, one page at a time. It also distinguishes this tool from get_template_inputs and inspect_image by explaining which related data it does and does not return.
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 conditions for browsing without a query, searching with a query, and narrowing with size and preview filters. It also routes the agent to get_template_inputs and inspect_image for data this tool omits, though it does not explicitly compare against search_assets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_batchEdit a draft batchADestructiveInspect
Renames a batch and, while it is a draft (until run_batch first succeeds), changes, adds, or removes its editable jobs (pending, or failed with no output) in one request. update merges the given fields into each listed job's values and resets it to pending; unlisted jobs are untouched. remove deletes those jobs permanently, and each add creates new jobs, so repeating a request with add duplicates them. Processing and rendered jobs cannot change. Nothing renders until run_batch, and adding or removing jobs changes what it costs. One pending job in a batch that is no longer a draft is update_job's case. Needs templates:read and batches:create.
| Name | Required | Description | Default |
|---|---|---|---|
| add | No | New jobs to append, up to 500 | |
| name | No | New batch name, 1 to 200 characters; omit to keep it | |
| remove | No | IDs of editable jobs to delete permanently | |
| update | No | Jobs to change, up to 500 | |
| batchId | Yes | Batch ID returned by create_batch or list_batches |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| deleted | Yes | Jobs removed |
| updated | Yes | Jobs changed |
| inserted | Yes | Jobs added |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true and idempotent=false, but the description earns credit by explaining why and how: remove deletes permanently, repeating a request with add duplicates jobs, update merges and resets the job to pending, unlisted jobs are untouched, and nothing renders or costs credits until run_batch. That is real behavioral context beyond the structured hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries information — draft scope, merge/delete/duplicate semantics, rendering and cost consequences, scopes — and the draft restriction is front-loaded. It is dense, with several clauses packed into long sentences, which costs a little readability but not correctness.
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 destructive, non-idempotent mutation with an output schema, the description covers the draft-only window, permanence of deletion, duplication risk, deferred rendering, cost impact, and required permissions. Nothing an agent needs before calling 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 baseline is 3, but the description adds merge semantics that the schema does not state: update merges given fields into each job's values and resets it to pending, while unlisted jobs are untouched. It stops short of per-parameter detail on add/remove caps, which the schema already carries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb set (rename/change/add/remove) on a specific resource (draft batch and its editable jobs) and names the sibling boundary explicitly: 'One pending job in a batch that is no longer a draft is update_job's case.' An agent can distinguish this from update_job, create_batch and run_batch without opening a schema.
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?
Gives a hard precondition ('while it is a draft (until run_batch first succeeds)'), an explicit exclusion ('Processing and rendered jobs cannot change'), and routes the out-of-scope case to update_job. Required scopes (templates:read, batches:create) are also named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_jobEdit one pending jobADestructiveIdempotentInspect
Changes one pending job that has no output yet, in any batch, including batches that are no longer drafts. The given fields replace their previous values and the rest stay, so repeating the same request gives the same result. Switching outputFormat to mp4, gif, webm or mov makes it a video job, which costs credits by its length and size when it renders. Failed, processing and rendered jobs are rejected; a failed job in a draft can still change through update_batch. Nothing renders until run_batch. For several jobs at once, or to add and remove jobs, use update_batch. Needs templates:read and batches:create.
| Name | Required | Description | Default |
|---|---|---|---|
| row | Yes | Only the layers to change, keyed and valued as create_batch rows are | |
| jobId | Yes | Pending job ID from get_batch_jobs | |
| outputFormat | No | New output format; omit to keep the job's format. mp4, gif, webm or mov makes it a video, which needs an animated template and costs more credits. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| status | Yes | pending waits for run_batch, processing is rendering, success has rendered, failed has a render error, cancelled was stopped by cancel_batch or cancel_job (final, not charged) |
| batchId | Yes | |
| creditCost | Yes | Credits run_batch spends on this job |
| outputKind | Yes | image for still renders (png, jpeg, webp, pdf); video for mp4, gif, webm or mov |
| outputFormat | Yes | File format the job renders to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: it discloses that unmentioned fields are preserved (merge semantics), that repeating a request is a no-op, that switching to a video format changes credit cost by length and size, that rendering is deferred to run_batch, and which scopes are required (templates:read, batches:create). Annotations only give the coarse destructive/idempotent hints; the description supplies the operational consequences.
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?
Front-loaded with the scope constraint, then rejection rules, alternatives, and prerequisites in descending order of importance. Dense throughout with no filler, though the rejection/alternative sentence packs two distinct ideas together.
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 destructive, nested-parameter mutation with an output schema present, the description covers everything an agent needs: eligibility of the target, merge behavior, cost implications, deferred rendering, authorization scopes, and the sibling to use for other cases. Return values are correctly left to the output schema.
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 baseline is 3. The description adds genuine meaning on top: it clarifies the merge semantics of row (given fields replace, the rest stay) and explains the behavioral consequence of outputFormat switching to a video format, which the schema only hints at.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Changes one pending job that has no output yet, in any batch') with explicit scope, and immediately separates it from update_batch for multi-job edits. An agent can tell it apart from cancel_job and update_batch without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the conditions for use and non-use explicitly: pending only, rejected for failed/processing/rendered, failed-in-draft goes through update_batch, several jobs go through update_batch, and nothing renders until run_batch. Alternatives are named with the selector condition for each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_imagesAdd the user's imagesAIdempotentInspect
Brings the user's own images (PNG, JPEG, or WebP, up to 5 MB each) into the workspace, optionally into a collection, which is made when no collection has that name. Without files it returns a link to the workspace's Images page (the collection's page with collection) for the user to drop the images into; after they say they are done, search_assets finds them. Images already online, such as product photos from a store, go in urls: Kalpana fetches each one (up to 20 a call, 5 MB each) and returns it recorded, with no upload step; a URL's host has to be on the workspace's domain whitelist (cdn.shopify.com is on it by default, and an admin adds others in Workspace Settings), and a URL that fails is listed in failed while the rest are stored, with a link to the settings page when its host is not whitelisted. An agent that has the files (a shell, files on disk) works in three steps: call with files (each one's SHA-256 hash, content type and size) to get one uploadUrl per file; PUT each file's bytes to its uploadUrl with that Content-Type header; then call again with done (each hash and file name) to record them. The recorded images come back with their id, the asset_id of an image input in batch rows. Image data is not accepted inline as base64. To look at an image already uploaded use inspect_image, and to find one search_assets. Needs assets:create.
| Name | Required | Description | Default |
|---|---|---|---|
| done | No | Files you uploaded, to record them | |
| urls | No | Images for Kalpana to fetch from the web, instead of files and done | |
| files | No | Files you will upload yourself | |
| collection | No | Collection to put the images in, by name |
Output Schema
| Name | Required | Description |
|---|---|---|
| link | No | The workspace's Images page for the user |
| step | Yes | link: give the user the link; uploads: PUT each file, then call with done; done: the images are recorded |
| failed | No | |
| images | No | |
| uploads | No | |
| collection | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write/idempotent/open-world profile, but the description adds substantial behavior beyond them: per-file and per-call size/format limits, domain-whitelist requirements with the default cdn.shopify.com entry, partial-failure semantics ('a URL that fails is listed in failed while the rest are stored'), the settings-page link on whitelist failure, and the recorded-image return including id and asset_id. It also rules out base64 inline data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded and nearly every clause carries operational information (limits, whitelist, partial failure, permission). However, it is delivered as one dense run-on paragraph with nested asides such as the Shopify example, which makes the three-step flow harder to scan than a short ordered list would be.
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?
An output schema exists, so return values need not be spelled out, and everything else an agent needs for this multi-modal, two-phase upload is present: formats, size caps, whitelist behavior, failure handling, the sequential PUT step, and the mandate to use inspect_image/search_assets afterward.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning the schema cannot express: the files → PUT → done sequencing, the requirement that done carries each hash plus file name, that collection is auto-created when no name matches, and that urls fetches at most 20 per call. Slight deduction only because per-field details like the sha256 hex format and name defaulting are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('brings the user's own images ... into the workspace') and enumerates all three intake modes: local files via the two-step files/done flow, remote images via urls, and the no-argument link fallback. It explicitly routes the agent away from inspect_image and search_assets for viewing and finding, so the tool is distinguishable from its siblings without opening a schema.
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?
Each mode carries an explicit when-to-use rule: images already online go in urls, an agent holding files follows the three-step upload, and a bare call returns a drop page for the user. It also names the alternatives for other intents ('To look at an image already uploaded use inspect_image, and to find one search_assets') and states the assets:create prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_batchCheck rows before creating a batchARead-onlyIdempotentInspect
Checks batch rows against a template and reports every problem by row index and field, without saving anything or spending credits. It runs the same row checks as create_batch, so rows that pass here are accepted there, while create_batch saves nothing if any row fails. Each row comes back as the server understood it (layer keys, text, and each image resolved to its asset id and file name), so a misread value shows before any credits are spent. A layer name two layers share is refused with their ids: fill each by id and tell the user, who can rename one. It does not measure text, so copy longer than the template's sample can still overflow its box. Needs templates:read.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | Yes | 1 to 500 rows. Each keys a layer by its name (case aside) or id, the key get_template_inputs gives, to a plain value: text as a string, an image as an asset id or file name, or { asset, fit, zoom, panX, panY } and { text, visible } when framing or visibility changes. rowExample in get_template_inputs is a ready row. With columns, a row is instead an array of cells in column order, which keeps large batches small. null leaves a layer at the template's own value. Layers left out keep the template's value, or the one in defaults. | |
| columns | No | For array rows: the layer key of each cell, in order, like a spreadsheet header | |
| flowIds | No | Instead of pageIds: this template's flows (get_template_inputs flows), each a video joining some of its pages, that every row renders as, one video per row per flow, with a video outputFormat. A name fills every layer with it across a video's pages. | |
| pageIds | No | This template's pages (get_template_inputs pages) every row renders on, in order: one id for one file per row, several for one file per row per page, such as a carousel's slides. The first page when omitted. A row may carry keys of any of these pages; each page takes the keys it has. | |
| defaults | No | Values every row gets unless it gives its own, such as a logo or call to action shared by all rows | |
| templateId | Yes | The whole template, from search_templates. Not a page or flow id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | No | Each row as the server understood it, keyed by layer key, images as { asset, name } |
| valid | Yes | True when every row passes |
| issues | Yes | Every problem found; empty when valid |
| rowCount | Yes | |
| warnings | No | Not errors: pass these on to the user, such as a flow longer than a video renders |
| validRows | Yes | |
| invalidRows | Yes | |
| sharedNames | No | Layer names more than one layer has; rows key those layers by id. Mention them to the user. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only and non-destructive annotations, the description discloses that no credits are spent, returned rows reflect the server's interpretation, duplicate layer names are refused with ids, text measurement is not performed, and templates:read is required. These are meaningful operational traits an agent would not get from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and the no-save/no-credit guarantee are front-loaded, followed by the create_batch relationship, output interpretation, duplicate-layer handling, limitation, and permission. The wording is dense but 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?
The tool has a complex nested schema and an output schema, but the schema descriptions are complete and the description covers the remaining behavioral context: validation scope, no side effects, duplicate-layer errors, text overflow limitation, and required permission. Nothing important for correct invocation appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents rows, columns, pageIds, flowIds, defaults, and templateId in detail. The description adds only a narrow parameter-related nuance: ambiguous duplicate layer names should be filled by id; otherwise it relies on the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'Checks batch rows against a template and reports every problem by row index and field.' It also distinguishes the tool from create_batch by emphasizing that nothing is saved or spent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names create_batch as the alternative and explains the relationship: the same row checks run here, rows that pass are accepted there, and create_batch saves nothing if any row fails. Combined with 'without saving anything or spending credits,' the when-to-use condition is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
get_template_inputs1 field changed- changed
Output schema / properties / inputs / items / properties / key / descriptionPrevious value: -"What batch rows key this input by: the layer's name, or its id when another layer has the same name"New value: +"What batch rows key this input by: the layer's name, or its id when another layer has the same name. A video's inputs are keyed by page, as page2@title; a plain title fills every page without its own."
3 tool updates
- Changed
create_batch1 field changed- changed
Output schema / properties / jobCount / descriptionPrevious value: -"Jobs created: one per row per page"New value: +"Jobs created: one per row per page or flow"
- Changed
get_batch_jobs1 field changed- changed
Output schema / properties / items / items / properties / rowIndex / descriptionPrevious value: -"The job's row in the batch, from 0, in the order rows were given"New value: +"The job's row in the batch, from 0, in the order rows were given. One row's jobs across pages or flows share it"
- Changed
get_batch_outputs2 fields changed- added
Output schema / properties / items / items / properties / flowIdAdded value: +{ + "anyOf": [ + { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The flow this job renders as a video, if any" +} - changed
Output schema / properties / items / items / properties / rowIndex / descriptionPrevious value: -"The job's row in the batch, from 0, in the order rows were given"New value: +"The job's row in the batch, from 0, in the order rows were given. One row's jobs across pages or flows share it"
5 tool updates
- Changed
create_batch6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / flowIdsAdded value: +{ + "description": "Instead of pageIds: this template's flows (get_template_inputs flows), each a video joining some of its pages, that every row renders as, one video per row per flow, with a video outputFormat. A name fills every layer with it across a video's pages.", + "items": { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" +} - removed
Input schema / properties / pageIdRemoved value: -{ - "description": "One page of the template (the designer connection's page_id). A template's pages are separate designs, each with its own inputs; the first page when omitted.", - "format": "uuid", - "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$", - "type": "string" -} - changed
Input schema / properties / pageIds / descriptionPrevious value: -"Instead of pageId: pages every row renders on, one image per row per page, such as a carousel's slides in order. A row may carry keys of any of these pages; each page takes the keys it has."New value: +"This template's pages (get_template_inputs pages) every row renders on, in order: one id for one file per row, several for one file per row per page, such as a carousel's slides. The first page when omitted. A row may carry keys of any of these pages; each page takes the keys it has." - changed
Input schema / properties / templateId / descriptionPrevious value: -"Template ID returned by search_templates"New value: +"The whole template, from search_templates. Not a page or flow id." - added
Output schema / properties / warningsAdded value: +{ + "description": "Not errors: pass these on to the user, such as a flow longer than a video renders", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
get_batch_jobs1 field changed- added
Output schema / properties / items / items / properties / flowIdAdded value: +{ + "anyOf": [ + { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The flow this job renders as a video, if any" +}
- Changed
get_template_inputs6 fields changed- added
Input schema / properties / flowIdAdded value: +{ + "description": "One video of the template (from flows) instead of a page: its inputs, one per layer name across its pages", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$", + "type": "string" +} - changed
Input schema / properties / pageId / descriptionPrevious value: -"One page of the template (the designer connection's page_id). A template's pages are separate designs, each with its own inputs; the first page when omitted."New value: +"One page of the template (the designer connection's page_id), for its inputs. A template's pages are separate designs, each with its own inputs; the first page when omitted." - changed
Input schema / properties / templateId / descriptionPrevious value: -"Template ID returned by search_templates"New value: +"The whole template, from search_templates. Not a page or flow id." - added
Output schema / properties / flowIdAdded value: +{ + "description": "The video these inputs are from, when flowId was given", + "type": "string" +} - added
Output schema / properties / flowsAdded value: +{ + "description": "The template's videos, each joining its own pages with transitions. Pass an id as flowId here for its inputs, and in flowIds to the batch tools to render it", + "items": { + "additionalProperties": false, + "properties": { + "description": { + "type": [ + "string", + "null" + ] + }, + "duration": { + "description": "Seconds", + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "pageIds": { + "description": "The pages it visits, in order", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "id", + "name", + "description", + "duration", + "pageIds" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / pageId / descriptionPrevious value: -"The page these inputs are from (pass it as pageId to the batch tools)"New value: +"The page these inputs are from (pass it in pageIds to the batch tools)"
- Changed
update_batch1 field changed- added
Input schema / properties / add / items / properties / flowIdAdded value: +{ + "description": "A flow of that template (get_template_inputs flows): the job renders it as a video, with a video outputFormat", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$", + "type": "string" +}
- Changed
validate_batch6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / flowIdsAdded value: +{ + "description": "Instead of pageIds: this template's flows (get_template_inputs flows), each a video joining some of its pages, that every row renders as, one video per row per flow, with a video outputFormat. A name fills every layer with it across a video's pages.", + "items": { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" +} - removed
Input schema / properties / pageIdRemoved value: -{ - "description": "One page of the template (the designer connection's page_id). A template's pages are separate designs, each with its own inputs; the first page when omitted.", - "format": "uuid", - "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$", - "type": "string" -} - changed
Input schema / properties / pageIds / descriptionPrevious value: -"Instead of pageId: pages every row renders on, one image per row per page, such as a carousel's slides in order. A row may carry keys of any of these pages; each page takes the keys it has."New value: +"This template's pages (get_template_inputs pages) every row renders on, in order: one id for one file per row, several for one file per row per page, such as a carousel's slides. The first page when omitted. A row may carry keys of any of these pages; each page takes the keys it has." - changed
Input schema / properties / templateId / descriptionPrevious value: -"Template ID returned by search_templates"New value: +"The whole template, from search_templates. Not a page or flow id." - added
Output schema / properties / warningsAdded value: +{ + "description": "Not errors: pass these on to the user, such as a flow longer than a video renders", + "items": { + "type": "string" + }, + "type": "array" +}
16 tool updates
- Changed
cancel_batch4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / batchId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Output schema / properties / cancelled / maximumAdded value: +9007199254740991 - added
Output schema / properties / stoppedMessages / maximumAdded value: +9007199254740991
- Changed
cancel_job4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / jobId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Output schema / properties / cancelled / maximumAdded value: +9007199254740991 - added
Output schema / properties / stoppedMessages / maximumAdded value: +9007199254740991
- Changed
create_batch13 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / defaults / additionalProperties / $refRemoved value: -"#/properties/rows/items/anyOf/0/additionalProperties/anyOf/0" - added
Input schema / properties / defaults / additionalProperties / anyOfAdded value: +[ + { + "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name", + "type": "string" + }, + { + "additionalProperties": {}, + "description": "A text layer's text and visibility", + "properties": { + "text": { + "description": "The layer's new text, tagged like a string value", + "type": "string" + }, + "visible": { + "description": "false hides the layer; layout closes the gap", + "type": "boolean" + } + }, + "type": "object" + }, + { + "additionalProperties": {}, + "description": "An image layer's image and framing", + "properties": { + "asset": { + "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.", + "type": "string" + }, + "fit": { + "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain", + "enum": [ + "cover", + "contain", + "stretch", + "fill", + "fit" + ], + "type": "string" + }, + "panX": { + "description": "Moves the image by this fraction of the slot width; positive = right", + "maximum": 1, + "minimum": -1, + "type": "number" + }, + "panY": { + "description": "Moves the image by this fraction of the slot height; positive = down", + "maximum": 1, + "minimum": -1, + "type": "number" + }, + "visible": { + "description": "false hides the layer", + "type": "boolean" + }, + "zoom": { + "description": "Zoom about the slot centre; 1 = none", + "maximum": 4, + "minimum": 0.2, + "type": "number" + } + }, + "type": "object" + } +] - added
Input schema / properties / defaults / propertyNamesAdded value: +{ + "type": "string" +} - added
Input schema / properties / pageId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Input schema / properties / pageIdsAdded value: +{ + "description": "Instead of pageId: pages every row renders on, one image per row per page, such as a carousel's slides in order. A row may carry keys of any of these pages; each page takes the keys it has.", + "items": { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" +} - changed
Input schema / properties / rows / items / anyOfPrevious value: -[ - { - "additionalProperties": { - "anyOf": [ - { - "anyOf": [ - { - "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name", - "type": "string" - }, - { - "additionalProperties": true, - "description": "A text layer's text and visibility", - "properties": { - "text": { - "description": "The layer's new text, tagged like a string value", - "type": "string" - }, - "visible": { - "description": "false hides the layer; layout closes the gap", - "type": "boolean" - } - }, - "type": "object" - }, - { - "additionalProperties": true, - "description": "An image layer's image and framing", - "properties": { - "asset": { - "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.", - "type": "string" - }, - "fit": { - "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain", - "enum": [ - "cover", - "contain", - "stretch", - "fill", - "fit" - ], - "type": "string" - }, - "panX": { - "description": "Moves the image by this fraction of the slot width; positive = right", - "maximum": 1, - "minimum": -1, - "type": "number" - }, - "panY": { - "description": "Moves the image by this fraction of the slot height; positive = down", - "maximum": 1, - "minimum": -1, - "type": "number" - }, - "visible": { - "description": "false hides the layer", - "type": "boolean" - }, - "zoom": { - "description": "Zoom about the slot centre; 1 = none", - "maximum": 4, - "minimum": 0.2, - "type": "number" - } - }, - "type": "object" - } - ] - }, - { - "type": "null" - } - ] - }, - "type": "object" - }, - { - "items": { - "anyOf": [ - { - "$ref": "#/properties/rows/items/anyOf/0/additionalProperties/anyOf/0" - }, - { - "type": "null" - } - ] - }, - "type": "array" - } -]New value: +[ + { + "additionalProperties": { + "anyOf": [ + { + "anyOf": [ + { + "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name", + "type": "string" + }, + { + "additionalProperties": {}, + "description": "A text layer's text and visibility", + "properties": { + "text": { + "description": "The layer's new text, tagged like a string value", + "type": "string" + }, + "visible": { + "description": "false hides the layer; layout closes the gap", + "type": "boolean" + } + }, + "type": "object" + }, + { + "additionalProperties": {}, + "description": "An image layer's image and framing", + "properties": { + "asset": { + "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.", + "type": "string" + }, + "fit": { + "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain", + "enum": [ + "cover", + "contain", + "stretch", + "fill", + "fit" + ], + "type": "string" + }, + "panX": { + "description": "Moves the image by this fraction of the slot width; positive = right", + "maximum": 1, + "minimum": -1, + "type": "number" + }, + "panY": { + "description": "Moves the image by this fraction of the slot height; positive = down", + "maximum": 1, + "minimum": -1, + "type": "number" + }, + "visible": { + "description": "false hides the layer", + "type": "boolean" + }, + "zoom": { + "description": "Zoom about the slot centre; 1 = none", + "maximum": 4, + "minimum": 0.2, + "type": "number" + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "items": { + "anyOf": [ + { + "anyOf": [ + { + "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name", + "type": "string" + }, + { + "additionalProperties": {}, + "description": "A text layer's text and visibility", + "properties": { + "text": { + "description": "The layer's new text, tagged like a string value", + "type": "string" + }, + "visible": { + "description": "false hides the layer; layout closes the gap", + "type": "boolean" + } + }, + "type": "object" + }, + { + "additionalProperties": {}, + "description": "An image layer's image and framing", + "properties": { + "asset": { + "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.", + "type": "string" + }, + "fit": { + "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain", + "enum": [ + "cover", + "contain", + "stretch", + "fill", + "fit" + ], + "type": "string" + }, + "panX": { + "description": "Moves the image by this fraction of the slot width; positive = right", + "maximum": 1, + "minimum": -1, + "type": "number" + }, + "panY": { + "description": "Moves the image by this fraction of the slot height; positive = down", + "maximum": 1, + "minimum": -1, + "type": "number" + }, + "visible": { + "description": "false hides the layer", + "type": "boolean" + }, + "zoom": { + "description": "Zoom about the slot centre; 1 = none", + "maximum": 4, + "minimum": 0.2, + "type": "number" + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } +] - added
Input schema / properties / templateId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Output schema / properties / creditCost / maximumAdded value: +9007199254740991 - added
Output schema / properties / id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Output schema / properties / jobCountAdded value: +{ + "description": "Jobs created: one per row per page", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Output schema / properties / rowCount / descriptionPrevious value: -"Jobs created, one per row"New value: +"Rows given" - added
Output schema / properties / rowCount / maximumAdded value: +9007199254740991
- Changed
get_batch8 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / batchId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Output schema / properties / cancelled / maximumAdded value: +9007199254740991 - added
Output schema / properties / completed / maximumAdded value: +9007199254740991 - added
Output schema / properties / failed / maximumAdded value: +9007199254740991 - added
Output schema / properties / id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Output schema / properties / processing / maximumAdded value: +9007199254740991 - added
Output schema / properties / total / maximumAdded value: +9007199254740991
- Changed
get_batch_jobs11 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / batchId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Input schema / properties / limit / maximumAdded value: +9007199254740991 - added
Input schema / properties / page / maximumAdded value: +9007199254740991 - added
Output schema / properties / items / items / properties / id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Output schema / properties / items / items / properties / row / propertyNamesAdded value: +{ + "type": "string" +} - added
Output schema / properties / items / items / properties / rowIndex / maximumAdded value: +9007199254740991 - changed
Output schema / properties / items / items / properties / templateId / anyOfPrevious value: -[ - { - "format": "uuid", - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$", + "type": "string" + }, + { + "type": "null" + } +] - added
Output schema / properties / limit / maximumAdded value: +9007199254740991 - added
Output schema / properties / page / maximumAdded value: +9007199254740991 - added
Output schema / properties / total / maximumAdded value: +9007199254740991
- Changed
get_batch_outputs8 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / batchId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Input schema / properties / limit / maximumAdded value: +9007199254740991 - added
Input schema / properties / page / maximumAdded value: +9007199254740991 - added
Output schema / properties / items / items / properties / id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Output schema / properties / items / items / properties / rowIndex / maximumAdded value: +9007199254740991 - added
Output schema / properties / limit / maximumAdded value: +9007199254740991 - added
Output schema / properties / page / maximumAdded value: +9007199254740991
- Changed
get_template_inputs8 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / pageId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Input schema / properties / templateId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Output schema / properties / id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Output schema / properties / inputs / items / properties / dimensions / properties / height / maximumAdded value: +9007199254740991 - added
Output schema / properties / inputs / items / properties / dimensions / properties / width / maximumAdded value: +9007199254740991 - added
Output schema / properties / inputs / items / properties / styles / propertyNamesAdded value: +{ + "type": "string" +} - added
Output schema / properties / rowExample / propertyNamesAdded value: +{ + "type": "string" +}
- Changed
inspect_image2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Output schema / properties / sizeBytes / maximumAdded value: +9007199254740991
- Changed
list_batches13 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / limit / maximumAdded value: +9007199254740991 - added
Input schema / properties / page / maximumAdded value: +9007199254740991 - added
Input schema / properties / templateId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Output schema / properties / items / items / properties / cancelledRows / maximumAdded value: +9007199254740991 - added
Output schema / properties / items / items / properties / completedRows / maximumAdded value: +9007199254740991 - added
Output schema / properties / items / items / properties / failedRows / maximumAdded value: +9007199254740991 - added
Output schema / properties / items / items / properties / id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Output schema / properties / items / items / properties / processingRows / maximumAdded value: +9007199254740991 - added
Output schema / properties / items / items / properties / totalRows / maximumAdded value: +9007199254740991 - added
Output schema / properties / limit / maximumAdded value: +9007199254740991 - added
Output schema / properties / page / maximumAdded value: +9007199254740991 - added
Output schema / properties / total / maximumAdded value: +9007199254740991
- Changed
run_batch4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / batchId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Output schema / properties / dispatched / maximumAdded value: +9007199254740991 - added
Output schema / properties / failed / maximumAdded value: +9007199254740991
- Changed
search_assets15 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / limit / maximumAdded value: +9007199254740991 - added
Input schema / properties / page / maximumAdded value: +9007199254740991 - removed
Output schema / properties / collections / items / properties / createdAt / $refRemoved value: -"#/properties/items/items/properties/createdAt" - added
Output schema / properties / collections / items / properties / createdAt / descriptionAdded value: +"Creation time, ISO 8601" - added
Output schema / properties / collections / items / properties / createdAt / typeAdded value: +"string" - added
Output schema / properties / collections / items / properties / id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Output schema / properties / collections / items / properties / itemCount / maximumAdded value: +9007199254740991 - added
Output schema / properties / items / items / properties / height / maximumAdded value: +9007199254740991 - added
Output schema / properties / items / items / properties / id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Output schema / properties / items / items / properties / sizeBytes / maximumAdded value: +9007199254740991 - added
Output schema / properties / items / items / properties / width / maximumAdded value: +9007199254740991 - added
Output schema / properties / limit / maximumAdded value: +9007199254740991 - added
Output schema / properties / page / maximumAdded value: +9007199254740991 - added
Output schema / properties / total / maximumAdded value: +9007199254740991
- Changed
search_templates10 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / height / maximumAdded value: +9007199254740991 - added
Input schema / properties / limit / maximumAdded value: +9007199254740991 - added
Input schema / properties / page / maximumAdded value: +9007199254740991 - added
Input schema / properties / width / maximumAdded value: +9007199254740991 - added
Output schema / properties / items / items / properties / id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Output schema / properties / items / items / properties / variableCount / maximumAdded value: +9007199254740991 - added
Output schema / properties / limit / maximumAdded value: +9007199254740991 - added
Output schema / properties / page / maximumAdded value: +9007199254740991 - added
Output schema / properties / total / maximumAdded value: +9007199254740991
- Changed
update_batch19 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / add / items / additionalPropertiesRemoved value: -false - removed
Input schema / properties / add / items / properties / outputFormat / $refRemoved value: -"#/properties/update/items/properties/outputFormat" - added
Input schema / properties / add / items / properties / outputFormat / enumAdded value: +[ + "png", + "jpeg", + "webp", + "pdf", + "mp4", + "gif", + "webm", + "mov" +] - added
Input schema / properties / add / items / properties / outputFormat / typeAdded value: +"string" - removed
Input schema / properties / add / items / properties / row / additionalProperties / $refRemoved value: -"#/properties/update/items/properties/row/additionalProperties" - added
Input schema / properties / add / items / properties / row / additionalProperties / anyOfAdded value: +[ + { + "anyOf": [ + { + "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name", + "type": "string" + }, + { + "additionalProperties": {}, + "description": "A text layer's text and visibility", + "properties": { + "text": { + "description": "The layer's new text, tagged like a string value", + "type": "string" + }, + "visible": { + "description": "false hides the layer; layout closes the gap", + "type": "boolean" + } + }, + "type": "object" + }, + { + "additionalProperties": {}, + "description": "An image layer's image and framing", + "properties": { + "asset": { + "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.", + "type": "string" + }, + "fit": { + "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain", + "enum": [ + "cover", + "contain", + "stretch", + "fill", + "fit" + ], + "type": "string" + }, + "panX": { + "description": "Moves the image by this fraction of the slot width; positive = right", + "maximum": 1, + "minimum": -1, + "type": "number" + }, + "panY": { + "description": "Moves the image by this fraction of the slot height; positive = down", + "maximum": 1, + "minimum": -1, + "type": "number" + }, + "visible": { + "description": "false hides the layer", + "type": "boolean" + }, + "zoom": { + "description": "Zoom about the slot centre; 1 = none", + "maximum": 4, + "minimum": 0.2, + "type": "number" + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } +] - added
Input schema / properties / add / items / properties / row / propertyNamesAdded value: +{ + "type": "string" +} - added
Input schema / properties / add / items / properties / templateId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Input schema / properties / batchId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Input schema / properties / remove / items / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - removed
Input schema / properties / update / items / additionalPropertiesRemoved value: -false - added
Input schema / properties / update / items / properties / jobId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - changed
Input schema / properties / update / items / properties / row / additionalProperties / anyOfPrevious value: -[ - { - "anyOf": [ - { - "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name", - "type": "string" - }, - { - "additionalProperties": true, - "description": "A text layer's text and visibility", - "properties": { - "text": { - "description": "The layer's new text, tagged like a string value", - "type": "string" - }, - "visible": { - "description": "false hides the layer; layout closes the gap", - "type": "boolean" - } - }, - "type": "object" - }, - { - "additionalProperties": true, - "description": "An image layer's image and framing", - "properties": { - "asset": { - "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.", - "type": "string" - }, - "fit": { - "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain", - "enum": [ - "cover", - "contain", - "stretch", - "fill", - "fit" - ], - "type": "string" - }, - "panX": { - "description": "Moves the image by this fraction of the slot width; positive = right", - "maximum": 1, - "minimum": -1, - "type": "number" - }, - "panY": { - "description": "Moves the image by this fraction of the slot height; positive = down", - "maximum": 1, - "minimum": -1, - "type": "number" - }, - "visible": { - "description": "false hides the layer", - "type": "boolean" - }, - "zoom": { - "description": "Zoom about the slot centre; 1 = none", - "maximum": 4, - "minimum": 0.2, - "type": "number" - } - }, - "type": "object" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name", + "type": "string" + }, + { + "additionalProperties": {}, + "description": "A text layer's text and visibility", + "properties": { + "text": { + "description": "The layer's new text, tagged like a string value", + "type": "string" + }, + "visible": { + "description": "false hides the layer; layout closes the gap", + "type": "boolean" + } + }, + "type": "object" + }, + { + "additionalProperties": {}, + "description": "An image layer's image and framing", + "properties": { + "asset": { + "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.", + "type": "string" + }, + "fit": { + "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain", + "enum": [ + "cover", + "contain", + "stretch", + "fill", + "fit" + ], + "type": "string" + }, + "panX": { + "description": "Moves the image by this fraction of the slot width; positive = right", + "maximum": 1, + "minimum": -1, + "type": "number" + }, + "panY": { + "description": "Moves the image by this fraction of the slot height; positive = down", + "maximum": 1, + "minimum": -1, + "type": "number" + }, + "visible": { + "description": "false hides the layer", + "type": "boolean" + }, + "zoom": { + "description": "Zoom about the slot centre; 1 = none", + "maximum": 4, + "minimum": 0.2, + "type": "number" + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } +] - added
Input schema / properties / update / items / properties / row / propertyNamesAdded value: +{ + "type": "string" +} - added
Output schema / properties / deleted / maximumAdded value: +9007199254740991 - added
Output schema / properties / id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Output schema / properties / inserted / maximumAdded value: +9007199254740991 - added
Output schema / properties / updated / maximumAdded value: +9007199254740991
- Changed
update_job7 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / jobId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - changed
Input schema / properties / row / additionalProperties / anyOfPrevious value: -[ - { - "anyOf": [ - { - "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name", - "type": "string" - }, - { - "additionalProperties": true, - "description": "A text layer's text and visibility", - "properties": { - "text": { - "description": "The layer's new text, tagged like a string value", - "type": "string" - }, - "visible": { - "description": "false hides the layer; layout closes the gap", - "type": "boolean" - } - }, - "type": "object" - }, - { - "additionalProperties": true, - "description": "An image layer's image and framing", - "properties": { - "asset": { - "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.", - "type": "string" - }, - "fit": { - "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain", - "enum": [ - "cover", - "contain", - "stretch", - "fill", - "fit" - ], - "type": "string" - }, - "panX": { - "description": "Moves the image by this fraction of the slot width; positive = right", - "maximum": 1, - "minimum": -1, - "type": "number" - }, - "panY": { - "description": "Moves the image by this fraction of the slot height; positive = down", - "maximum": 1, - "minimum": -1, - "type": "number" - }, - "visible": { - "description": "false hides the layer", - "type": "boolean" - }, - "zoom": { - "description": "Zoom about the slot centre; 1 = none", - "maximum": 4, - "minimum": 0.2, - "type": "number" - } - }, - "type": "object" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name", + "type": "string" + }, + { + "additionalProperties": {}, + "description": "A text layer's text and visibility", + "properties": { + "text": { + "description": "The layer's new text, tagged like a string value", + "type": "string" + }, + "visible": { + "description": "false hides the layer; layout closes the gap", + "type": "boolean" + } + }, + "type": "object" + }, + { + "additionalProperties": {}, + "description": "An image layer's image and framing", + "properties": { + "asset": { + "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.", + "type": "string" + }, + "fit": { + "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain", + "enum": [ + "cover", + "contain", + "stretch", + "fill", + "fit" + ], + "type": "string" + }, + "panX": { + "description": "Moves the image by this fraction of the slot width; positive = right", + "maximum": 1, + "minimum": -1, + "type": "number" + }, + "panY": { + "description": "Moves the image by this fraction of the slot height; positive = down", + "maximum": 1, + "minimum": -1, + "type": "number" + }, + "visible": { + "description": "false hides the layer", + "type": "boolean" + }, + "zoom": { + "description": "Zoom about the slot centre; 1 = none", + "maximum": 4, + "minimum": 0.2, + "type": "number" + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } +] - added
Input schema / properties / row / propertyNamesAdded value: +{ + "type": "string" +} - changed
Output schema / properties / batchId / anyOfPrevious value: -[ - { - "format": "uuid", - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$", + "type": "string" + }, + { + "type": "null" + } +] - added
Output schema / properties / creditCost / maximumAdded value: +9007199254740991 - added
Output schema / properties / id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
- Changed
upload_images7 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / done / items / additionalPropertiesRemoved value: -false - removed
Input schema / properties / files / items / additionalPropertiesRemoved value: -false - removed
Input schema / properties / urls / items / additionalPropertiesRemoved value: -false - added
Output schema / properties / images / items / properties / height / maximumAdded value: +9007199254740991 - added
Output schema / properties / images / items / properties / id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Output schema / properties / images / items / properties / width / maximumAdded value: +9007199254740991
- Changed
validate_batch13 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / defaults / additionalProperties / $refRemoved value: -"#/properties/rows/items/anyOf/0/additionalProperties/anyOf/0" - added
Input schema / properties / defaults / additionalProperties / anyOfAdded value: +[ + { + "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name", + "type": "string" + }, + { + "additionalProperties": {}, + "description": "A text layer's text and visibility", + "properties": { + "text": { + "description": "The layer's new text, tagged like a string value", + "type": "string" + }, + "visible": { + "description": "false hides the layer; layout closes the gap", + "type": "boolean" + } + }, + "type": "object" + }, + { + "additionalProperties": {}, + "description": "An image layer's image and framing", + "properties": { + "asset": { + "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.", + "type": "string" + }, + "fit": { + "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain", + "enum": [ + "cover", + "contain", + "stretch", + "fill", + "fit" + ], + "type": "string" + }, + "panX": { + "description": "Moves the image by this fraction of the slot width; positive = right", + "maximum": 1, + "minimum": -1, + "type": "number" + }, + "panY": { + "description": "Moves the image by this fraction of the slot height; positive = down", + "maximum": 1, + "minimum": -1, + "type": "number" + }, + "visible": { + "description": "false hides the layer", + "type": "boolean" + }, + "zoom": { + "description": "Zoom about the slot centre; 1 = none", + "maximum": 4, + "minimum": 0.2, + "type": "number" + } + }, + "type": "object" + } +] - added
Input schema / properties / defaults / propertyNamesAdded value: +{ + "type": "string" +} - added
Input schema / properties / pageId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Input schema / properties / pageIdsAdded value: +{ + "description": "Instead of pageId: pages every row renders on, one image per row per page, such as a carousel's slides in order. A row may carry keys of any of these pages; each page takes the keys it has.", + "items": { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" +} - changed
Input schema / properties / rows / items / anyOfPrevious value: -[ - { - "additionalProperties": { - "anyOf": [ - { - "anyOf": [ - { - "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name", - "type": "string" - }, - { - "additionalProperties": true, - "description": "A text layer's text and visibility", - "properties": { - "text": { - "description": "The layer's new text, tagged like a string value", - "type": "string" - }, - "visible": { - "description": "false hides the layer; layout closes the gap", - "type": "boolean" - } - }, - "type": "object" - }, - { - "additionalProperties": true, - "description": "An image layer's image and framing", - "properties": { - "asset": { - "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.", - "type": "string" - }, - "fit": { - "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain", - "enum": [ - "cover", - "contain", - "stretch", - "fill", - "fit" - ], - "type": "string" - }, - "panX": { - "description": "Moves the image by this fraction of the slot width; positive = right", - "maximum": 1, - "minimum": -1, - "type": "number" - }, - "panY": { - "description": "Moves the image by this fraction of the slot height; positive = down", - "maximum": 1, - "minimum": -1, - "type": "number" - }, - "visible": { - "description": "false hides the layer", - "type": "boolean" - }, - "zoom": { - "description": "Zoom about the slot centre; 1 = none", - "maximum": 4, - "minimum": 0.2, - "type": "number" - } - }, - "type": "object" - } - ] - }, - { - "type": "null" - } - ] - }, - "type": "object" - }, - { - "items": { - "anyOf": [ - { - "$ref": "#/properties/rows/items/anyOf/0/additionalProperties/anyOf/0" - }, - { - "type": "null" - } - ] - }, - "type": "array" - } -]New value: +[ + { + "additionalProperties": { + "anyOf": [ + { + "anyOf": [ + { + "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name", + "type": "string" + }, + { + "additionalProperties": {}, + "description": "A text layer's text and visibility", + "properties": { + "text": { + "description": "The layer's new text, tagged like a string value", + "type": "string" + }, + "visible": { + "description": "false hides the layer; layout closes the gap", + "type": "boolean" + } + }, + "type": "object" + }, + { + "additionalProperties": {}, + "description": "An image layer's image and framing", + "properties": { + "asset": { + "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.", + "type": "string" + }, + "fit": { + "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain", + "enum": [ + "cover", + "contain", + "stretch", + "fill", + "fit" + ], + "type": "string" + }, + "panX": { + "description": "Moves the image by this fraction of the slot width; positive = right", + "maximum": 1, + "minimum": -1, + "type": "number" + }, + "panY": { + "description": "Moves the image by this fraction of the slot height; positive = down", + "maximum": 1, + "minimum": -1, + "type": "number" + }, + "visible": { + "description": "false hides the layer", + "type": "boolean" + }, + "zoom": { + "description": "Zoom about the slot centre; 1 = none", + "maximum": 4, + "minimum": 0.2, + "type": "number" + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "items": { + "anyOf": [ + { + "anyOf": [ + { + "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name", + "type": "string" + }, + { + "additionalProperties": {}, + "description": "A text layer's text and visibility", + "properties": { + "text": { + "description": "The layer's new text, tagged like a string value", + "type": "string" + }, + "visible": { + "description": "false hides the layer; layout closes the gap", + "type": "boolean" + } + }, + "type": "object" + }, + { + "additionalProperties": {}, + "description": "An image layer's image and framing", + "properties": { + "asset": { + "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.", + "type": "string" + }, + "fit": { + "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain", + "enum": [ + "cover", + "contain", + "stretch", + "fill", + "fit" + ], + "type": "string" + }, + "panX": { + "description": "Moves the image by this fraction of the slot width; positive = right", + "maximum": 1, + "minimum": -1, + "type": "number" + }, + "panY": { + "description": "Moves the image by this fraction of the slot height; positive = down", + "maximum": 1, + "minimum": -1, + "type": "number" + }, + "visible": { + "description": "false hides the layer", + "type": "boolean" + }, + "zoom": { + "description": "Zoom about the slot centre; 1 = none", + "maximum": 4, + "minimum": 0.2, + "type": "number" + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } +] - added
Input schema / properties / templateId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" - added
Output schema / properties / invalidRows / maximumAdded value: +9007199254740991 - added
Output schema / properties / issues / items / properties / rowIndex / maximumAdded value: +9007199254740991 - added
Output schema / properties / rowCount / maximumAdded value: +9007199254740991 - added
Output schema / properties / rows / items / propertyNamesAdded value: +{ + "type": "string" +} - added
Output schema / properties / validRows / maximumAdded value: +9007199254740991
1 tool update
- Changed
search_assets2 fields changed- added
Output schema / properties / items / items / properties / heightAdded value: +{ + "description": "Pixel height", + "exclusiveMinimum": 0, + "type": "integer" +} - added
Output schema / properties / items / items / properties / widthAdded value: +{ + "description": "Pixel width; left out when the file does not say", + "exclusiveMinimum": 0, + "type": "integer" +}
5 tool updates
- Added
get_workspace - Removed
list_asset_collections - Removed
list_workspaces - Changed
search_assets3 fields changed- added
Input schema / properties / collectionAdded value: +{ + "description": "A collection's name (ignoring case) or ID; limits results to it", + "maxLength": 200, + "minLength": 1, + "type": "string" +} - removed
Input schema / properties / collectionIdRemoved value: -{ - "description": "Collection ID from list_asset_collections; limits results to that collection", - "format": "uuid", - "type": "string" -} - added
Output schema / properties / collectionsAdded value: +{ + "description": "Every image collection, when no filter is given (most recently updated first)", + "items": { + "additionalProperties": false, + "properties": { + "createdAt": { + "$ref": "#/properties/items/items/properties/createdAt" + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "id": { + "description": "collectionId for search_assets", + "format": "uuid", + "type": "string" + }, + "itemCount": { + "description": "Number of images in the collection", + "minimum": 0, + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "description", + "itemCount", + "createdAt" + ], + "type": "object" + }, + "type": "array" +}
- Changed
upload_images3 fields changed- added
Input schema / properties / urlsAdded value: +{ + "description": "Images for Kalpana to fetch from the web, instead of files and done", + "items": { + "additionalProperties": false, + "properties": { + "name": { + "description": "File name; defaults to the URL's last segment", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "url": { + "description": "A public image URL on the workspace's whitelist", + "format": "uri", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" +} - added
Output schema / properties / failed / items / properties / urlAdded value: +{ + "type": "string" +} - changed
Output schema / properties / failed / items / requiredPrevious value: -[ - "contentHash", - "message" -]New value: +[ + "message" +]
18 tool updates
- First observed
cancel_batch - First observed
cancel_job - First observed
create_batch - First observed
get_batch - First observed
get_batch_jobs - First observed
get_batch_outputs - First observed
get_template_inputs - First observed
inspect_image - First observed
list_asset_collections - First observed
list_batches - First observed
list_workspaces - First observed
run_batch - First observed
search_assets - First observed
search_templates - First observed
update_batch - First observed
update_job - First observed
upload_images - First observed
validate_batch
Publisher details
- Operator
- Shreekaram Technologies · Publisher source
- Operator website
- https://kalpana.one · Publisher source
- Vendor relationship
- First-party
- Documentation
- https://docs.kalpana.one/mcp/quickstart
- Trust center
- Not applicable
- Restrictions
- Free Kalpana account at app.kalpana.one. Rendering batches spends render credits. Each connection covers one workspace chosen at sign-in, within the user’s role there. · Publisher source
Related MCP Connectors
On-brand ad creative generation: teach it your brand once, generate images and video forever.
Generate product images, posters, reels, and videos from your photos.
Ready-to-publish ad creatives from an AI assistant: campaigns, image/video/UGC ads, brands, edits.
Turn product pages and creative briefs into finished video and image ads from your AI chat.
Related MCP Servers
- AlicenseAqualityCmaintenanceGenerate production-ready images from text prompts. AI-powered design API with 50+ templates for social posts, banners, OG images, and more.82 npmMIT

Canvora MCPofficial
AlicenseAqualityCmaintenanceEnables AI agents to generate on-brand visuals from ideas, URLs, documents, or PDFs in over 100 formats and 150+ languages, with consistent brand kits.16192 npm1MIT- AlicenseAqualityDmaintenanceIt generates blogpost images, thumbnails, social post images just from the title.32 npmMIT
- FlicenseNot gradedqualityBmaintenanceEnables launching and managing Meta ads from AI assistants by building ads from templates, bulk creating campaigns, duplicating posts to preserve social proof, uploading media, and previewing changes before launch.1-
Glama MCP Gateway
Add one secure layer between your agents and this server.