Sceneplane
Server Details
Cloud Blender for AI agents: build, inspect, render and animate 3D scenes over remote MCP. Keep editable .blend projects and export GLB or STL. Make your first 3D asset free—30 compute minutes per UTC month, no credit card. First 100 eligible Free account owners to use all 30 minutes in one UTC month by December 31, 2026 UTC receive one calendar month of beta free: 4 compute hours per UTC month, 2 concurrent workers per deployment, 2 deployments, 2048×2048 renders at up to 256 samples, and 10 GiB storage. Existing usage counts toward the 4-hour allowance. Limited to 100 rewards; expires January 1, 2027 00:00 UTC. Free resumes afterward without an automatic charge. Examples, eligibility and terms: https://sceneplane.online/launch?utm_source=glama&utm_medium=directory&utm_campaign=first100
- Status
- Healthy
- Uptime
- 37.4% over 61 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 65 tools
Most tools have clearly distinct purposes, and the detailed descriptions provide explicit decision guidance for potentially overlapping areas like scene_apply vs scene_script vs preset_apply and material_from_image vs material_from_maps vs texture_maps_create. A few asset-preview and pipeline tools could be momentarily confused, but the descriptions resolve the boundaries.
Names mostly follow a predictable snake_case entity_action pattern (project_create, job_get, deployments_list). Minor deviations such as singular/plural variants (webhook_test vs webhooks_set, project_get vs projects_list) and noun-noun labels (platform_status, image_prompt_assist) are readable and do not undermine consistency.
With 65 tools, the server far exceeds the typical 3–15 well-scoped range and passes even the 25+ 'too many' threshold into extreme mismatch territory. Even for a broad 3D production platform, this many tools creates unnecessary selection overhead for an agent.
The surface covers project, scene, render, asset, material, texture, audio, vegetation, job, deployment, and webhook lifecycles, with create/read/update/delete and validation/inspection operations throughout. No obvious domain gaps or dead ends are apparent.
Available Tools
65 toolsartifact_getGet artifactARead-onlyIdempotentInspect
Get artifact metadata plus an expiring authorized download URL. The URL is a plain HTTPS GET with the credential in the query string — no headers required — and the response carries the byte count and SHA-256 so a download is verifiable. NOTE on clients: this endpoint answers 401 for a bad or expired token and 404 for a missing artifact, and never 403. A 403 therefore did not come from ScenePlane; it comes from edge protection ahead of it, which rejects some default library User-Agents. Python's urllib sends Python-urllib/3.x and is the known case — a field archive lost an entire 31-artifact download pass to it while curl on the SAME url returned 200. Set an explicit User-Agent, or use curl/httpx.
| Name | Required | Description | Default |
|---|---|---|---|
| artifactId | Yes | Artifact ID returned by a completed job or artifacts_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by explaining the URL mechanics (credential in query string, no headers), verifiable response fields (byte count, SHA-256), precise 401/404/403 semantics, and the edge-protection User-Agent pitfall. This is exactly the kind of behavioral context that 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 description is front-loaded with the core purpose, followed by valuable operational details and a clear error-code warning. The anecdote about the 31-artifact download pass is slightly verbose but reinforces the User-Agent warning; overall every sentence contributes meaningful 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?
With no output schema, the description compensates by naming the key response elements (byte count, SHA-256) and detailing error behavior. It does not state the URL expiration time or the full set of metadata fields, but the essentials for calling and using the result are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for the single parameter, artifactId, so the schema already defines the parameter. The description adds no additional parameter-level meaning, which matches the baseline of 3 for high schema coverage.
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 clear verb and resource: 'Get artifact metadata plus an expiring authorized download URL.' This is much more specific than the title, and the mention of metadata plus a download URL distinguishes it from siblings like artifacts_list. An agent can tell exactly what this tool returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied by the purpose statement, and there is useful client guidance about User-Agent handling and error codes. However, it does not explicitly say when to choose this tool over sibling tools like artifacts_list, nor does it state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
artifacts_listList artifactsARead-onlyIdempotentInspect
List a project's artifacts newest-first (renders, exports, previews, audio), optionally filtered by revision or kind. Every entry carries the revision that produced it, so a lost artifact id is recoverable without walking jobs_list. Download URLs come from artifact_get.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Filter by kind, e.g. "render_png", "export_glb", "glb_preview" | |
| limit | No | Maximum artifacts to return in this page. | |
| cursor | No | Page token from a previous call's nextCursor (a row offset) | |
| projectId | Yes | Stable project ID returned by project_create or projects_list. | |
| revisionId | No | Only artifacts produced from this revision |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| projectId | Yes | Stable project ID returned by project_create or projects_list. |
| nextCursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only, idempotent, and non-destructive. The description adds observable behavior: newest-first ordering, every entry carrying the producing revision, and recovery of lost artifact ids without walking jobs_list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each carrying distinct information: what the tool lists, why revision info matters, and where download URLs live. No filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with an output schema, the description supplies key selection criteria, ordering, filter options, and the sibling relationship. Pagination is left to the schema's cursor field, which is acceptable given the output schema exists.
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 projectId, kind, limit, cursor, and revisionId. The description adds only high-level filter and ordering context, which is useful but not needed to compensate for missing parameter docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('List a project's artifacts'), scopes it to a project, and specifies ordering ('newest-first') and supported artifact kinds. It also distinguishes itself from artifact_get by noting that download URLs live there.
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 artifact_get as the source for download URLs and jobs_list as a heavier alternative for recovering artifact ids, giving an agent clear routing cues. This is explicit enough to choose this tool over siblings without opening their schemas.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
asset_generate_3dGenerate a 3D model from text or an imageAInspect
Start a text/image → 3D generation of ONE freestanding object per task — build ground planes and assemblies from scene operations, and reuse a generated model by duplicating it with scene ops. provider=hyper3d (Rodin) takes prompt only; provider=hunyuan3d and provider=tripo3d take prompt OR imageUrl. Each provider needs its integrations_set token. Poll asset_generate_status, then import with asset_library_import source= slug=.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | No | Description of the object to generate; describe one freestanding asset. | |
| imageUrl | No | Optional reference image URL supported by the chosen provider. | |
| provider | No | Configured 3D-generation provider to use. | hyper3d |
Output Schema
| Name | Required | Description |
|---|---|---|
| provider | Yes | |
| taskUuid | Yes | |
| subscriptionKey | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readonly/destructive/idempotent safety. The description adds useful behavioral context beyond annotations: it is an asynchronous generation workflow requiring polling, provider-specific input constraints, and a required integrations_set token. It stops short of discussing limits, failures, or latency, but the additions are meaningful.
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 packs a high density of useful information into three focused sentences. The primary purpose is front-loaded, and provider constraints and follow-up steps are introduced in a logical order without filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema coverage, output schema, and annotations, the description provides everything an agent needs to invoke the tool correctly: the object scope, the provider differences, the auth prerequisite, and the downstream polling/import steps. The explicit source and slug format for the follow-up import closes the loop.
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 three parameters. The description goes beyond the schema by clarifying which providers accept imageUrl versus prompt-only, and by tying the provider choice to the required integrations_set token and the eventual import source.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Start a text/image → 3D generation') with a clear scope ('ONE freestanding object per task'). It differentiates itself from scene operations and from the later status/import steps, so an agent can distinguish it from sibling tools like asset_generate_status and asset_library_import.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit workflow guidance: generate, then poll asset_generate_status, then import with asset_library_import using source and slug. It also tells the agent not to build ground planes or assemblies with this tool and instead use scene operations, and names the required integration token setup via integrations_set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
asset_generate_statusCheck a 3D generationARead-onlyIdempotentInspect
Poll a generation started by asset_generate_3d (same provider and subscriptionKey). When status=done, import with asset_library_import source= slug=.
| Name | Required | Description | Default |
|---|---|---|---|
| provider | No | Provider that owns the generation request. | hyper3d |
| subscriptionKey | Yes | Generation request key returned by asset_generate_3d. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | Yes | |
| status | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly and idempotent behavior, so the description's extra context about needing the same provider and subscriptionKey and the next import step adds useful behavioral boundary. It accurately reflects a non-destructive polling operation and has no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences deliver the polling purpose, the required identity context, and the success-path next step with zero filler. The content is front-loaded and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, read-only polling tool with a full output schema, the description is complete: it explains what to pass, what to wait for, and what to do after. The agent has all the context needed to call the tool correctly and continue the workflow.
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 description does not need to re-document the parameters. It reinforces that provider and subscriptionKey should match the originating generation request, but this mostly restates the schema's existing descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action, 'Poll a generation', and ties it directly to the output of asset_generate_3d, so an agent knows exactly what this tool is for. It also distinguishes the tool from the generation and import siblings by framing it as the middle polling step of the workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the precondition (generation started by asset_generate_3d with the same provider and subscriptionKey) and gives a clear transition condition to asset_library_import when status=done. It does not explicitly list alternatives or when not to use the tool, but the workflow condition is specific enough to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
asset_importImport assetAInspect
Import a validated uploaded asset into the current project head as a new revision. Use upload_create then upload_complete before this tool; for library slugs or generated provider models use asset_library_import. Stale base revisions reject with REVISION_CONFLICT. Returns an asynchronous job handle; job_wait/job_get reveal success, errors and the committed revision.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Uploaded file format. auto (default) sniffs file bytes; specify gltf or stl explicitly for those formats. font covers supported uploaded font files. | auto |
| assetId | Yes | Validated ast_… asset ID returned by upload_complete; quarantined or rejected uploads cannot be imported. | |
| placement | No | Requested placement policy; currently both values preserve importer-native transforms. Neither recenters the asset or moves it to the scene cursor. | origin |
| projectId | Yes | Stable project ID returned by project_create or projects_list. | |
| unitPolicy | No | Requested unit convention; currently reserved, with importer-native units preserved for either value. Inspect dimensions and scale explicitly after import. | meters |
| baseRevisionId | No | "HEAD" (default) targets the project's current head. Mutations MUST build on the head: passing an older revision is rejected with REVISION_CONFLICT, since history is linear. To continue from an older scene, revision_restore it forward first. | HEAD |
| idempotencyKey | Yes | Stable caller-chosen key for safe retries of this same request. | |
| targetCollection | No | Existing destination collection name or ID, up to 64 characters. If absent or not found, importer collection links are preserved. |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (readOnly=false, destructive=false, openWorld=true), and the description adds genuinely new behavior: asynchronous job handle return, job_wait/job_get for resolving success/errors, REVISION_CONFLICT rejection on stale bases, and that quarantined/rejected uploads cannot be imported. This is rich context beyond the structured fields.
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, each carrying distinct information (purpose, prerequisites/alternative, error condition, return handling). Front-loaded with purpose and prerequisites; only minor density cost from packing routing and error semantics 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?
With an output schema present, the description need not detail return values, yet it still tells the agent the return is a job handle and how to resolve it. Combined with annotations, the error path, prerequisites, and alternative routing, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter semantics by tying baseRevisionId to the REVISION_CONFLICT outcome and the linear-history rule. It does not restate per-parameter detail, but it meaningfully frames how the inputs interact.
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 (Import), resource (validated uploaded asset), and target (current project head as a new revision). It also explicitly names the sibling it is not (asset_library_import), so an agent can distinguish it without opening either 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 an explicit prerequisite chain (upload_create then upload_complete before this tool) and an explicit alternative with its triggering condition (library slugs or generated provider models -> asset_library_import). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
asset_library_importImport a library assetAInspect
Import a library asset into a project as a new revision. Returns a job handle. source=polyhaven (CC0): HDRIs become the world environment, models join the scene, texture sets become a wired PBR material (applyToObjects assigns it). source=sketchfab: slug is the model uid (requires the org's Sketchfab token). source=hyper3d / hunyuan3d / tripo3d: slug is a finished generation taskUuid from asset_generate_3d. Scale generated/Sketchfab models on import with targetSize (largest dimension in meters — chair≈1.0, table≈0.75, car≈4.5, person≈1.7).
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | ||
| type | No | model | |
| source | No | polyhaven | |
| projectId | Yes | Stable project ID returned by project_create or projects_list. | |
| resolution | No | 2k | |
| targetSize | No | ||
| materialName | No | ||
| applyToObjects | No | ||
| baseRevisionId | No | "HEAD" (default) targets the project's current head. Mutations MUST build on the head: passing an older revision is rejected with REVISION_CONFLICT, since history is linear. To continue from an older scene, revision_restore it forward first. | HEAD |
| idempotencyKey | Yes | Stable caller-chosen key for safe retries of this same request. |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors beyond annotations: it returns a job handle (async), explains source-specific transformations (HDRI becomes world environment, texture sets become wired PBR material), and mentions scaling. It also notes the token requirement for Sketchfab. These are valuable details not captured by annotations. It does not contradict the annotations (readOnlyHint false, openWorldHint true, etc.).
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 well-structured, starting with the core purpose and then using clear 'source=' segments to organize source-specific details. Each clause carries necessary information, and the front-loaded main sentence gives immediate context. It is appropriately sized for the 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?
Given the tool's complexity (10 parameters, multiple sources, async job handle) and the presence of an output schema, the description covers the essential behaviors: revision creation, job handle, per-source semantics, token requirement, and scaling guidance. It also ties into asset_generate_3d for generation tasks. The description is thorough and leaves little ambiguous for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage only at 30%, the description adds substantial meaning for parameters like slug (explaining what it means per source), source (enum meaning), targetSize (with real-world examples), and applyToObjects (assignment behavior). This significantly compensates for the low schema coverage and helps agents understand parameter usage without opening 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 clearly states the verb 'import', the resource 'library asset', and the outcome 'into a project as a new revision', plus it returns a job handle. It is specific enough to distinguish from the sibling 'asset_import' by focusing on library sources and revision semantics, even without naming the sibling 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?
The description provides clear context on how to use the tool across different sources (polyhaven, sketchfab, hyper3d/hunyuan3d/tripo3d), including source-specific requirements like the Sketchfab token and taskUuid from asset_generate_3d. It also explains scaling with targetSize. However, it does not explicitly state when not to use this tool versus the sibling 'asset_import', so it lacks a direct exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
asset_previewPreview an asset visuallyARead-onlyIdempotentInspect
See an asset's thumbnail as an inline image before importing it. slug is a Poly Haven slug or Sketchfab uid from assets_search.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Asset slug returned by assets_search. | |
| source | No | Asset provider that returned the slug. | polyhaven |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already communicate that the tool is read-only, idempotent, and non-destructive, so the description does not need to repeat those facts. It adds useful context about slug provenance and provider types, though it does not describe error behavior or output details beyond the inline image.
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 short sentences deliver the core purpose immediately and then pin down the slug/source semantics. There is no filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only preview tool with rich annotations, the description covers what it does, its output form, and its input provenance. Nothing essential is missing for an agent to decide when and how to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides full descriptions for both parameters, including source enum values and defaults. The description reinforces that slug comes from assets_search, but adds no major semantic value 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 ('see'), a concrete resource ('asset's thumbnail as an inline image'), and the associated workflow phase ('before importing it'). This clearly distinguishes asset_preview from import tools without requiring schema inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly frames the tool as a pre-import preview step, giving clear context for when it is appropriate. It does not explicitly list alternative tools, but the 'before importing' wording makes the intended usage evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_categoriesBrowse asset library categoriesARead-onlyIdempotentInspect
List Poly Haven categories for an asset type with per-category counts. Pass a category as the assets_search query to filter.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Asset type whose available categories should be listed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, lowering the burden on the description. The description adds useful behavioral context by mentioning per-category counts and that categories can be passed as search queries, going beyond what the annotation block alone provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: the first states the core action and output characteristic, and the second provides usage guidance for the related sibling tool. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one required enum parameter, full schema coverage, an output schema, and safety annotations, nothing needed to call the tool correctly is missing. The description also covers the likely next step by connecting categories to assets_search.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single 'type' parameter is fully documented in the schema with an enum and a clear description, so the description doesn't need to add much. The phrase 'for an asset type' maps to that parameter but adds no format or value detail 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 action ('List'), a concrete resource ('Poly Haven categories'), and a scope ('for an asset type'), plus a distinguishing detail ('per-category counts'). It also references assets_search, making clear this tool is for browsing the category taxonomy rather than searching assets.
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 a clear follow-up directive: 'Pass a category as the assets_search query to filter,' which tells the agent when to hand off to assets_search. It does not explicitly enumerate exclusion conditions like 'use only when you need categories,' so the guidance is strong but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_searchSearch the asset libraryAInspect
Search free 3D asset sources by keyword; returns slugs for asset_library_import. source=polyhaven (default, CC0 — HDRIs, PBR texture sets, models) needs no setup. source=sketchfab searches downloadable models (type=model only; import requires integrations_set provider=sketchfab; honor each hit's license).
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Kind of library asset to search for. | |
| limit | No | Maximum results to return (1–30). | |
| query | No | Search terms or a Poly Haven category; empty lists popular assets. | |
| source | No | Asset catalog to search; Sketchfab requires a configured token. | polyhaven |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses the return contract (slugs for a downstream tool), default source, CC0 licensing for Poly Haven, and the Sketchfab integration prerequisite. It doesn't mention rate limits or side-effect behavior, and the readOnlyHint=false annotation makes the safety profile slightly ambiguous for a search tool, but there is no direct contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense with the core purpose front-loaded in the first clause. Each sentence adds real value, though the long parentheticals make it slightly harder to parse; a bulleted source breakdown would improve scannability without adding length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the full parameter schema, output schema, and annotations, the description provides the missing operational context: what the returned slugs are for, which source needs setup, which source is restricted, and licensing requirements. Nothing essential is missing for an agent to decide to call this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all four parameters with 100% coverage, so the baseline is 3. The description adds meaning beyond the schema by explaining source-specific behavior: default source, no setup, type=model restriction, integration requirement, and license obligation. It does not add new detail for limit/query, but the schema covers them.
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: 'Search free 3D asset sources by keyword' and clearly states the output ('returns slugs for asset_library_import'). It also distinguishes the two supported catalogs (Poly Haven vs Sketchfab), so an agent can separate it from asset_import, asset_generate_3d, and assets_categories.
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 selection guidance inside the tool: Poly Haven is the default and needs no setup, while Sketchfab requires integrations_set and is limited to type=model with license obligations. It doesn't explicitly name sibling alternatives or state when not to use the tool, but the setup and source-specific conditions are strong practical guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audio_generateGenerate 16-bit game audioAInspect
Synthesize deterministic 16-bit PCM WAV game audio as a job artifact: sfx presets (jump, coin, laser, explosion, powerup, hit, blip, pickup), win/lose jingles, or loopable BGM (exact-bar loops from bpm, bars, root, scaleMode, voice). Same payload + seed always returns identical bytes. The WAV arrives as an audio_wav artifact with a download URL in job_get.
| Name | Required | Description | Default |
|---|---|---|---|
| bpm | No | ||
| bars | No | bgm loop length, 4/4 bars | |
| root | No | C | |
| seed | No | ||
| pitch | No | sfx frequency multiplier | |
| voice | No | square | |
| preset | No | sfx: jump|coin|laser|explosion|powerup|hit|blip|pickup; jingle: win|lose | |
| audioKind | Yes | ||
| projectId | Yes | Stable project ID returned by project_create or projects_list. | |
| scaleMode | No | major | |
| idempotencyKey | Yes | Stable caller-chosen key for safe retries of this same request. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses key non-obvious behavior: output is deterministic given the same payload and seed, and the result is delivered as an audio_wav artifact with a download URL in job_get. Since no output schema exists, this is valuable; annotations only provide generic hints and nothing contradicts the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences front-load the purpose and parameter categories, with no filler. The lists are compact, and each sentence adds a distinct fact: what is generated, determinism, and how the artifact is delivered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, no-output-schema job tool, it covers the typical workflow: artifact and download URL in job_get, parameter scoping by audio kind, and deterministic guarantees. It could say more about the async job lifecycle, but the job_get reference is likely sufficient.
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?
With only 45% schema description coverage, the description compensates by grouping the BGM parameters (bpm, bars, root, scaleMode, voice) and linking presets to sfx/jingles and seed to determinism. It doesn't exhaustively define every enum value, but it clarifies the main parameter relationships.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (synthesize deterministic 16-bit PCM WAV), names the output artifact, and enumerates the three audio kinds: sfx presets, win/lose jingles, and loopable BGM. This clearly distinguishes it from asset_generate_3d and other resource-generating siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete use cases and parameter groupings: sfx presets, jingles, or BGM loops, and notes exact-bar looping. It stops short of explicitly naming when-not-to-use alternatives, but the context is clear enough for an agent to select it for game-audio generation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audio_inspectInspect an audio artifactARead-onlyIdempotentInspect
Measure a checksum-verified owned PCM16 WAV without Blender compute: peak/RMS/DC, clipped samples, quiet frames, loop-boundary differences and bounded waveform. Optional previewSeconds returns up to three seconds as playable MCP audio. This measures samples; it does not listen, judge sound quality, measure LUFS or certify a seamless loop.
| Name | Required | Description | Default |
|---|---|---|---|
| artifactId | Yes | Artifact ID returned by a completed job or artifacts_list. | |
| previewSeconds | No | ||
| previewOffsetSeconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description adds substantial context: ownership/checksum constraints, the exact measurement set, preview audio return behavior, and explicit limitations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: the first front-loads the core action, resource, and measurement list; the second compactly covers preview behavior and non-goals. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, measurements, preview behavior, and non-goals despite having no output schema. The main gaps are the undocumented previewOffsetSeconds parameter and lack of return-structure detail, but for a read-only inspection tool with strong annotations this is nearly complete.
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 only 33%, so the description must compensate. It clarifies previewSeconds ('returns up to three seconds as playable MCP audio') but leaves previewOffsetSeconds entirely unexplained in both the schema and the description, leaving a meaningful parameter without semantic guidance.
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 ('Measure') and resource ('checksum-verified owned PCM16 WAV'), then enumerates concrete metrics such as peak/RMS/DC, clipped samples, and loop-boundary differences. It also explicitly contrasts with non-goals ('does not listen, judge sound quality, measure LUFS or certify a seamless loop'), making it clearly distinguishable from siblings like audio_generate and artifact_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: this tool is for measuring sample-level properties without Blender compute, and it explicitly lists exclusions such as not judging sound quality or measuring LUFS. However, it does not name a specific sibling tool to use instead, so the guidance is strong but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deployment_createCreate deploymentAInspect
Create a new isolated Blender deployment. Requires owner/admin in the target organization; defaults to your only organization when you have exactly one.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable name for the new deployment. | |
| organizationId | No | Organization ID that will own the deployment. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| slug | Yes | |
| deploymentId | Yes | |
| endpointHint | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, so the description doesn't need to restate those. It adds useful behavioral context: the permission requirement (owner/admin) and the organization defaulting behavior. It doesn't mention what the response contains, but an output schema exists, so that burden is reduced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the action and resource, then the two most important usage constraints. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create tool with an output schema and full parameter documentation, the description covers the key non-obvious context: permission requirements and organization defaulting. It doesn't explain what 'isolated' means or what happens on failure, but those are minor given the output schema and annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description adds the organization defaulting behavior, which clarifies when organizationId can be omitted, but it doesn't add much beyond that. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Create') and resource ('new isolated Blender deployment'), and the title reinforces it. It distinguishes from siblings like deployment_update and deployment_delete by focusing on creation, and the 'isolated' qualifier adds specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: requires owner/admin in the target organization, and defaults to your only organization when you have exactly one. It doesn't explicitly name alternatives or when-not-to-use, but the permission and default behavior guidance is strong enough to guide correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deployment_deleteDelete deploymentADestructiveInspect
Delete an EMPTY deployment (owner/admin only). Delete its projects first — a deployment with projects refuses.
| Name | Required | Description | Default |
|---|---|---|---|
| deployment | Yes | deployment slug |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal destructive intent, but the description adds materially more: permission requirements, the empty-deployment precondition, and the refusal behavior when projects still exist. This tells the agent what to expect beyond the binary destructive flag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The most important constraint (EMPTY) is front-loaded, and the precondition/refusal behavior is compressed into the second sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given only one parameter, full schema coverage, an output schema, and annotations that cover destructive behavior, the description covers all necessary operational context: permission, precondition, and failure mode. Nothing essential is missing for an agent to invoke this 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%, with the single deployment parameter fully described as 'deployment slug' in the schema. The description adds no extra parameter details, but for a single self-explanatory parameter, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('Delete') on a specific resource ('deployment') with a critical qualifier ('EMPTY'), making its purpose unmistakable. It distinguishes itself from related deployment operations like deployment_create and deployment_update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit preconditions: only owner/admin, only empty deployments, and that projects must be deleted first. It doesn't explicitly name an alternative tool, but the guidance clearly tells when not to invoke this tool directly and what to do instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deployment_policy_updateUpdate deployment policyADestructiveInspect
Change execution limits, approvals or scripting for an existing deployment; omitted fields remain unchanged. Requires owner/admin and deployments:admin scope for narrowed credentials; only the owner may toggle dangerousScriptingEnabled. May restrict future work or enable arbitrary Blender Python. Validates platform and plan ceilings, records a policy version, and rejects concurrent policy edits. Use deployment_update to rename or enable/disable the workspace, or deployments_list to find its slug. Returns policyVersion and scriptingEnabled.
| Name | Required | Description | Default |
|---|---|---|---|
| deployment | Yes | deployment slug | |
| maxQueuedJobs | No | Maximum queued jobs for this deployment, 1-200, subject to the account plan; a full queue rejects new submissions. | |
| renderMaxWidth | No | Maximum render width in pixels, 16-4096, additionally capped by the account plan. | |
| renderMaxHeight | No | Maximum render height in pixels, 16-4096, additionally capped by the account plan. | |
| renderMaxSamples | No | Maximum render samples, 1-4096, additionally capped by the account plan. | |
| jobTimeoutSeconds | No | Execution timeout per job in seconds, 10-3600, additionally bounded by the account plan. | |
| maxConcurrentJobs | No | Concurrent worker/job limit for this deployment, 1-20, subject to the account plan. Raising this does not bypass shared account quotas. | |
| renderApprovalThreshold | No | width*height*samples above which renders need interactive approval; capped at the plan's renderMaxWidth*renderMaxHeight*renderMaxSamples | |
| maxOperationsPerMutation | No | Maximum scene_apply operations per batch, 1-128. Omit to preserve the current batch limit. | |
| dangerousScriptingEnabled | No | Owner-only switch for scene_script arbitrary Blender Python. True enables scripting; false disables it. Omit to leave the existing security policy unchanged. | |
| approvalRequiredForRestore | No | Whether revision_restore must obtain interactive approval before replacing the current scene head. Omit to preserve the existing setting. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| policyVersion | Yes | |
| scriptingEnabled | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint=true, idempotentHint=false) by disclosing partial-update semantics ('omitted fields remain unchanged'), the owner-only restriction on dangerousScriptingEnabled, plan/platform ceiling validation, policy version recording, and rejection of concurrent edits. This is exactly the behavioral context the annotations cannot carry.
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 core action and the omitted-fields rule, then routing guidance. Dense with no filler, but it packs many clauses into a single long paragraph, which slightly hurts scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 11-param mutation with an output schema, the description covers auth requirements, partial-update behavior, concurrency, validation, and even the return fields (policyVersion, scriptingEnabled). Nothing material 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 schema already documents all 11 parameters and the baseline is 3. The description still adds meaning not in the schema: omitted fields preserve current values, and only the owner may flip dangerousScriptingEnabled. That extra semantic is useful but limited in scope, so a 4 rather than 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?
States a precise verb+resource ('Change execution limits, approvals or scripting for an existing deployment') and explicitly carves out scope against siblings like deployment_update and deployments_list. An agent can distinguish it from the other deployment_* tools 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?
Names the alternatives and the conditions that route elsewhere: 'Use deployment_update to rename or enable/disable the workspace, or deployments_list to find its slug.' Also gives the prerequisite auth (owner/admin and deployments:admin). Explicit when-to-use and when-not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deployments_listList deploymentsARead-onlyIdempotentInspect
List every deployment this account can access. The session is bound to one deployment for project/scene/render tools; switch by adding ?deployment= to the endpoint URL.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| boundSlug | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds useful behavioral context: the result is scoped to the account's accessible deployments, and the active deployment for other tool families can be switched via the ?deployment=<slug> query parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste: the core operation and scope appear first, followed by the session/query guidance. Every sentence earns its place without repeating schema or annotation details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list operation with an output schema and full safety annotations, the description provides the essential extra context: account scope and the deployment-switching mechanism. Nothing needed to invoke the tool 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?
The input schema has zero parameters, so the baseline is high. The description goes further by documenting an actionable URL-level switch, ?deployment=<slug>, which is not represented in the schema and is important for controlling which deployment subsequent tools act on.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete verb and object, 'List every deployment this account can access,' adding account-level scoping to the title. This makes it clearly distinct from deployment_create, deployment_update, and deployment_delete without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It frames the tool as the way to enumerate all accessible deployments and connects this to the session-bound deployment concept, implying this list is used to discover the slug for other tools. It does not explicitly name alternatives, but the context is clear enough for an agent to select this tool appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deployment_updateUpdate deploymentADestructiveInspect
Rename or enable/disable an existing deployment; disabling blocks new work. Requires owner/admin and deployments:admin scope for narrowed credentials. Use deployments_list to find its slug, deployment_policy_update for execution limits or scripting, and deployment_create for a new workspace. Returns the updated slug and ok flag.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New human-readable deployment name, if changing it. | |
| disabled | No | Whether to disable this deployment for new work. | |
| deployment | Yes | deployment slug |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| slug | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, so the safety profile is known; the description adds real value beyond that by naming the required role/scope (owner/admin, deployments:admin for narrowed credentials) and the operational consequence of disabling. It stops short of covering reversibility or how partial updates interact with unmentioned fields, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, purpose front-loaded first, sibling routing second, return values last. Dense but every clause carries information; the permissions clause is slightly compressed ('for narrowed credentials') but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no elaboration, yet the description still summarizes them. Combined with explicit permissions, side effects, and sibling routing, an agent has everything needed 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%, and the description still adds meaning: the `disabled` flag is tied to blocking new work, and the permission caveat hints at credential sensitivity. This is above the baseline 3 for fully documented parameters, though it does not explain the name/slug distinction beyond what the schema states.
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 specific operations (rename, enable/disable) on a specific resource (existing deployment) and immediately scopes the side effect: 'disabling blocks new work'. An agent can distinguish it from deployment_create, deployment_delete, and deployment_policy_update 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 the agent to alternatives with the selecting condition: deployments_list to find the slug, deployment_policy_update for execution limits or scripting, deployment_create for a new workspace. This is textbook when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docs_bpy_lookupLook up Blender Python API docsARead-onlyIdempotentInspect
Verify bpy signatures, properties, and enum values BEFORE writing scene_script code — authoritative reference from Blender's own documentation. Accepts dotted identifiers ("bpy.types.Object", "bpy.ops.mesh", "bpy.types.Object.location", "bmesh.types.BMEdge.is_manifold" or "BMFace.calc_area"), "X." to list a namespace's children, or "" for top-level modules. Unknown names return did-you-mean suggestions. Ask for a NODE TYPE ("ShaderNodeMix", "GeometryNodeTriangulate", "ShaderNodeValToRGB") and the reply also carries that node's real input/output socket names, the exact strings each menu socket accepts, and which sockets are hidden for the current mode — read off the pinned Blender build, because the API reference documents node properties and never lists sockets. That is the detail shader and geometry-node code cannot guess.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | Exact Blender Python API identifier to look up. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| content | No | |
| children | No | |
| sourceUrl | No | |
| identifier | Yes | |
| suggestions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds meaningful behavioral context beyond annotations: it mentions did-you-mean suggestions for unknown names, the extra node socket details, and the fact that it reads from a 'pinned Blender build' because the official API reference omits socket lists. This goes beyond the structured metadata without contradicting it.
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 not bloated. Each sentence contributes: purpose, accepted input formats, unknown-name behavior, node-type special behavior, and the reasoning behind the node detail. The purpose is front-loaded in the first clause. Slightly long, but every part earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has moderate complexity (special node-type handling) but the description fully covers input scenarios and the extra node info. An output schema exists, so return format is presumably documented there. The description doesn't mention authentication or rate limits, but those are not implied as needed. An agent knows exactly when to call and what to expect.
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% (the single 'identifier' param is described simply as 'Exact Blender Python API identifier'). The description massively expands on this by specifying accepted formats (dotted identifiers, wildcards like 'X.*', '*' for top-level, node type names) and what each returns. This is exactly the value the description should add 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: 'Verify bpy signatures, properties, and enum values' — clearly distinguishing it from sibling tools like docs_bpy_search (which likely searches) and docs_manual_get (which fetches manual pages). It also gives concrete input examples ('bpy.types.Object', 'bmesh.types.BMEdge.is_manifold'), making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use it 'BEFORE writing scene_script code', providing a clear workflow context. It also explains the special node-type query path that returns socket names and hidden sockets, which isn't obvious. However, it doesn't explicitly contrast with docs_bpy_search or state when to use that alternative, so it's clear but not fully explicit about when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docs_bpy_searchSearch Blender Python API docsARead-onlyIdempotentInspect
Keyword search over every documented bpy identifier ("subsurf modifier", "shader node emission", "keyframe insert"). Returns ranked identifiers for docs_bpy_lookup. Also matches nodes by their UI label, so "color ramp" finds ShaderNodeValToRGB.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum matching API entries to return. | |
| query | Yes | Search terms for Blender Python API documentation. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior, so the description adds value beyond structured data by disclosing the UI-label alias behavior ('color ramp' finds ShaderNodeValToRGB) and ranking of results. It doesn't introduce any hidden side effects or contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences with no filler. The core purpose and scope are front-loaded, examples are embedded compactly, and the special UI-label behavior is appended as a valuable clarification.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only search tool with a fully documented 2-parameter schema and an output schema, the description covers purpose, query semantics, special matching behavior, and how results relate to a sibling tool. Nothing critical is missing for correct selection and 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 baseline is 3, but the description enriches the query parameter's meaning by showing that matching is not only over identifiers but also over node UI labels. It also implies the query string expects human-readable terms like 'subsurf modifier' rather than raw identifiers.
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: 'Keyword search over every documented bpy identifier'. It distinguishes itself from the sibling docs_bpy_lookup by explicitly positioning itself as the search step that feeds lookup, and from docs_manual_search by limiting scope to bpy API identifiers.
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 clearly indicates this tool should be used to find bpy identifiers, and that results are meant for docs_bpy_lookup. It provides concrete query examples and notes UI-label matching behavior, but it does not explicitly state when not to use it versus the manual search tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docs_manual_getRead a Blender manual pageARead-onlyIdempotentInspect
Fetch one Blender manual page in full by its path (from docs_manual_search). Source: blender.org, CC-BY-SA 4.0.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Manual page path returned by docs_manual_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| title | Yes | |
| content | Yes | |
| truncated | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this tool safe (readOnlyHint=true, idempotentHint=true, destructiveHint=false). The description adds useful behavioral context beyond annotations by stating it retrieves the page 'in full' and by identifying the source and license (blender.org, CC-BY-SA 4.0), which is relevant for reuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single concise sentence contains the verb, resource, scope, and path source, followed by licensing information. No filler or redundancy; every phrase earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only tool with a rich output schema and complete annotations, the description fully covers what an agent needs: what it fetches, how to identify the resource, and the license terms. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the path parameter already documented as 'Manual page path returned by docs_manual_search.' The description reinforces this but adds no new semantic detail beyond what the schema provides. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch'), a precise resource ('one Blender manual page in full'), and the required mechanism ('by its path'). It also references docs_manual_search, which distinguishes it from sibling docs tools like docs_bpy_search and docs_operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies the intended workflow: first use docs_manual_search to obtain a path, then call this tool with that path. It provides clear context but does not explicitly name alternatives or state when not to use it. No exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docs_manual_searchSearch the Blender manualARead-onlyIdempotentInspect
Search the Blender user manual full-text for conceptual questions: how modifiers behave, shading/physics/animation workflows, feature constraints. Returns ranked pages with snippets; read one with docs_manual_get.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum matching manual pages to return. | |
| query | Yes | Search terms for the Blender manual. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds relevant behavioral context beyond that: full-text search, ranked results, snippets, and the recommended next step. There is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with the core action and scope front-loaded, followed by concrete output expectations and a routing instruction. Every sentence earns its place and there is no redundancy or padding.
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 search tool, the description, full schema, and rich annotations cover the main invocation need: what to query, what to expect in return, and how to proceed. It is minimally incomplete only in not explicitly warning that Blender API/symbol lookups belong with docs_bpy_search.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents both query and limit. The description adds no additional parameter-level meaning such as query syntax, ranking behavior, or limit tradeoffs; the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Search the Blender user manual full-text') and narrows the purpose to conceptual questions about modifiers, shading, physics, animation, and constraints. This clearly distinguishes it from API-reference siblings like docs_bpy_search and from the read tool docs_manual_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to use the tool: for conceptual manual questions, and it explicitly instructs the agent to follow up with docs_manual_get to read a result. It does not explicitly name docs_bpy_search as the alternative for API/symbol lookup, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docs_operationsBrowse the scene-operation DSLARead-onlyIdempotentInspect
Enumerate and inspect the validated operations scene_apply accepts — call this BEFORE reaching for scene_script. The DSL is large (mesh editing, booleans, lathe/loft/sweep, curves, UV unwrap, modifiers, materials, lights, cameras, render settings, geometry nodes, batch and query ops), so most modelling does NOT need raw bpy. No args: every namespace with counts. guide=true (or op="guide" for older connector catalogs): full operating guide. namespace="mesh": that namespace's operations. Repeated details are object.radial_array or object.array_along_curve (no "pattern" namespace). Use world.update for the environment; validation is the separate scene_validate tool. search="boolean": ranked matches. op="mesh.bevel": the full JSON Schema with types, ranges and defaults. Schemas are introspected from the validator itself, so they are always exactly what scene_apply will accept. Full schemas are returned once in structuredContent; format="text" returns them in text instead. This tool is READ ONLY and free — it queues no job, spends no compute and changes nothing — so it is always safe to retry, including after a transport-level error.
| Name | Required | Description | Default |
|---|---|---|---|
| op | No | Exact operation name for full parameter detail, e.g. "mesh.bevel"; "guide" reads the operating guide on older clients | |
| guide | No | Read the full onboarding and operating guide | |
| limit | No | Maximum operation matches to return (1–120). | |
| format | No | Return the full schema/guide once: structuredContent by default, or text for consumers without structured results | structured |
| search | No | Keyword search across operation names, parameters, and capabilities | |
| namespace | No | List one namespace, e.g. "mesh", "curve", "camera", "light" |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| guide | No | |
| schema | No | |
| namespaces | No | |
| operations | No | |
| totalOperations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, but the description goes further: it says the tool 'queues no job, spends no compute and changes nothing' and is 'always safe to retry, including after a transport-level error'. It also explains that schemas are introspected from the validator itself, so results exactly match what scene_apply accepts. This is rich behavioral context beyond the annotations and does not contradict 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 description is long but every sentence earns its place: the primary use is front-loaded, alternatives and exclusions are stated early, and each optional parameter's behavior is covered efficiently. The 'READ ONLY and free' safety note is a deliberate closing signal. No filler or redundant restatement of schema fields.
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 six optional parameters, an output schema, and several sibling tools, but the description covers all necessary invocation patterns, special values, result formats, and the caveat about repeated-detail namespaces. It also explains the tool's cost/safety profile, which matters for an agent deciding whether to retry. An agent has everything needed to select and call this tool 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 the baseline is 3, but the description adds meaning the schema lacks: it explains op='guide' compatibility with older catalogs, what namespace='mesh' does, the caveat that repeated details live under object.radial_array rather than a 'pattern' namespace, and that search returns ranked matches. It also clarifies the format parameter's relationship to structuredContent, which adds real value for an agent choosing how to consume 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?
States a specific verb and resource: 'Enumerate and inspect the validated operations scene_apply accepts'. It also distinguishes the tool from siblings by saying 'call this BEFORE reaching for scene_script' and noting most modeling does not need raw bpy, which separates it from the docs_bpy tools. No ambiguity about what the tool is for.
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 names when to use the tool (before scene_script), when not to use raw bpy, and which sibling handles adjacent concerns ('validation is the separate scene_validate tool'). It also gives concrete conditional usage: guide=true for the guide, namespace for a namespace, search for ranked matches, op for a schema. This leaves little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_createCreate exportAInspect
Export a revision to GLB, OBJ, STL, .blend, or the complete editable .ngp document for an ngPlant project. Native ngp is a byte-preserving download with no selection, modifiers, scale, presets or baking. enginePreset applies target-engine conventions and overrides yUp/scaleFactor: unity and godot (GLB, Y-up, meters), print (STL scaled ×1000 AND Z-up, because slicers read raw units as millimeters and orient Z-up — the preset is the whole print convention, not just the scale), unreal (GLB converted by UE on import; OBJ/STL scaled ×100 to centimeters). Selection is resolved against the exported revision before dispatch and the response lists exactly which objects were selected — broken down by type, so a stray curve or empty is visible — and a stale id or an empty match fails loudly instead of silently shipping an incomplete file. Curves with no bevel or extrude carry no surface and are skipped (named in the response) unless you pass them in objectIds. Returns a durable job handle; the file becomes an immutable artifact.
| Name | Required | Description | Default |
|---|---|---|---|
| yUp | No | ||
| format | Yes | ||
| bakeSize | No | ||
| objectIds | No | Platform ids, with selectionPolicy=objects. NOTE: ids are datablock-scoped — deleting and recreating an object mints a NEW id, so a list gathered before an edit can go stale. Prefer objectNamePattern, which is resolved fresh at dispatch. | |
| projectId | Yes | Stable project ID returned by project_create or projects_list. | |
| revisionId | No | "HEAD" (default) uses the project's current head | HEAD |
| scaleFactor | No | ||
| bakeLighting | No | GLB only: bake the full rendered shading, lights included, into UNLIT emissive textures. The trade is view dependence, and it is not subtle: the bake stores one sample of the shading per surface point, so specular highlights stop moving with the camera, reflections and glass stop responding to their surroundings, and anisotropic or clearcoat sheen becomes a fixed painted shape. It looks correct from the baked viewpoint and drifts as the viewer orbits. Right for a dark or rig-driven scene a web viewer cannot relight, WRONG for a turntable of a metal or glass product — use bakeTextures for that, which bakes procedural material values and leaves lighting to the viewer. | |
| bakeOverflow | No | ||
| bakeTextures | No | GLB only: bake procedural (node-driven) materials to textures before export so viewers keep the rendered look. Meshes without UV layers are unwrapped automatically first, which is slow on many-part assemblies (the response says so, and the job reports per-object bake progress). Only procedural, node-driven values are lost when this is off: materials with constant base colour, metallic and roughness export correctly unbaked, so false is the right choice for most hard-surface work. | |
| enginePreset | No | ||
| applyModifiers | No | ||
| idempotencyKey | Yes | Stable caller-chosen key for safe retries of this same request. | |
| bakeObjectLimit | No | ||
| selectionPolicy | No | ||
| excludeObjectIds | No | Drop these specific platform ids. Applied after the other selectors. | |
| objectNamePattern | No | Select by Blender object name with * wildcards, e.g. "Watch_*" or "*_Link". Resolved against this revision at dispatch, so it cannot go stale like objectIds. Combined with selectionPolicy (visible + pattern selects visible matches). | |
| excludeNamePattern | No | Drop objects whose name matches, e.g. "Studio_*". Applied after the other selectors. Omitting one backdrop from a 60-part scene previously meant enumerating 60 explicit ids, which is both tedious and stale-prone. |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | Yes | |
| yUp | Yes | |
| selection | Yes | Resolved runner selection policy; this field is a string, not a selection object. |
| revisionId | Yes | |
| scaleFactor | Yes | |
| selectedCount | Yes | Number of selected objects when the revision summary is available; null means unknown. |
| expectedCounts | Yes | |
| selectedObjectIds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations present, the description adds substantial behavior beyond them: selection is resolved against the exported revision before dispatch, the response enumerates selected objects by type, stale ids or empty matches fail loudly, surface-less curves are skipped and named, and the call returns a durable job handle producing an immutable artifact. This is far richer than the minimal annotation 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?
Core purpose is front-loaded in the first sentence, and the following sentences are information-dense rather than filler. However, the single long paragraph packs many distinct concerns (presets, selection, curves, job lifecycle) and is heavier than strictly necessary.
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 no explanation, and the description covers the mutation semantics, selection resolution, and job/artifact lifecycle for a complex 18-param tool. A few undocumented parameters (bakeSize, bakeObjectLimit, bakeOverflow) leave minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50% across 18 params, but the description compensates well: it explains enginePreset's Y-up/scale behavior per engine (unity/godot/print/unreal), that print is ×1000 AND Z-up as a whole convention, and how selection/id staleness works. It leaves some params (bakeSize, bakeObjectLimit, bakeOverflow, format) unexplained, so shy of 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?
States a specific verb (export) plus the resource (a revision) and enumerates the exact output formats (GLB, OBJ, STL, .blend, .ngp) for an ngPlant project. This cleanly distinguishes it from sibling mutation tools like render_create or asset_generate_3d.
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 routing guidance for parameters: ngp means byte-preserving with no selection/modifiers, enginePreset selects target-engine conventions, and bakeLighting explicitly points to bakeTextures as the alternative for metal/glass turntables. It lacks explicit when-to-use-this-tool-vs-siblings guidance (e.g. vs render_create), so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
image_prompt_assistPrepare an image-generation prompt for 3D workARead-onlyIdempotentInspect
Plan a source image for surfaces, decals, model references, trim sheets, atlases, environments or animation. Returns a prompt and upload/material steps; the harness calls its own available image tool. Does not generate an image or spend Blender compute.
| Name | Required | Description | Default |
|---|---|---|---|
| brief | Yes | The actual desired image, appearance, and constraints. | |
| layout | No | Requested trim bands or atlas grid; verify the manifest against actual output pixels. | |
| target | Yes | ||
| palette | No | ||
| purpose | Yes | ||
| workflow | No | ||
| animation | No | ||
| resolution | No | Requested generator output, not a claim about returned pixels. | |
| aspectRatio | No | Requested width:height ratio; provider support remains a prerequisite. | |
| knownDefects | No | ||
| requiredText | No | ||
| transparency | No | ||
| materialClass | No | ||
| referenceView | No | ||
| spatialTiling | No | none | |
| requestedMapRoles | No | ||
| harnessCapabilities | No | Only capabilities already known to the caller. Omission stays unknown. | |
| physicalCoverageMeters | No | Width and height of the real surface represented by one image. | |
| subjectDimensionsMeters | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is read-only, idempotent, non-destructive and not open-world; the description adds genuine value on top by disclosing that it emits a prompt plus upload/material steps and delegates generation to the harness's own image tool. That clarifies the call has no side effects and no compute cost, though it does not describe the shape of the returned prompt/steps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, no filler. The scope statement comes first, the return/delegation behavior next, and the negative constraint ('does not generate... or spend Blender compute') last, which is the right ordering for an agent deciding whether to call.
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 19-param planning tool with no output schema, the description summarizes the return ('a prompt and upload/material steps') but does not describe its structure, and it leaves most parameters undocumented while coverage is low. It is adequate to understand the tool's role but thin for calling it precisely.
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 only 32% across 19 parameters, so the description carries much of the documentation burden, yet it mentions no parameter at all. The artifact-type list echoes the purpose enum but adds no syntax, format, defaults or interaction guidance (e.g. how layout, resolution and physicalCoverageMeters relate).
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 ('Plan a source image') and enumerates the artifact types it covers (surfaces, decals, trim sheets, atlases, environments, animation). It also carves out a clear boundary against the generation siblings: it returns a prompt and steps, not pixels, and does not 'spend Blender compute.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a usable selection condition: use this when you want a prompt plus upload/material steps rather than an actual generated image or spend. It does not, however, name the concrete alternatives (e.g. texture_maps_create, material_from_image, asset_generate_3d) that a caller would be choosing between.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
integrations_deleteRemove a source integrationADestructiveInspect
Remove this organization's stored credential for a third-party asset/generation provider; subsequent calls requiring it will need setup again. Requires owner/admin with deployments:admin. Use integrations_list to inspect configuration or integrations_set to replace a token. Does not delete imported scene assets or revoke the token at the provider. Returns deleted=false if none was stored.
| Name | Required | Description | Default |
|---|---|---|---|
| provider | Yes | Configured integration to remove. |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true, idempotent=false, readOnly=false, so the safety profile is covered. The description still adds real value beyond that: the required permission scope, the fact that the provider-side token is not revoked, and the deleted=false no-op return. It stops short of full detail (e.g. no mention of partial-failure behavior), so a 4 rather than 5.
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 clauses, front-loaded with the core action and scope, then permission, then alternatives, then exclusions and return. No filler; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the destructive/non-idempotent profile and an output schema present, the description supplies exactly the missing context an agent needs: auth requirement, alternatives, scope of deletion, and the deleted=false edge case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single provider param has an enum plus its own description, so the schema carries parameter meaning. The description adds no syntax or format detail beyond what the schema already provides; 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?
States a precise verb+resource+scope: removing this organization's stored credential for a third-party provider. It is unmistakably distinct from integrations_list and integrations_set, and it clarifies what is NOT deleted (imported scene assets) up front.
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: use integrations_list to inspect configuration or integrations_set to replace a token. It also states the prerequisite (owner/admin with deployments:admin) and the negative consequence (subsequent calls need setup again), which fully frames when and when-not to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
integrations_listList source integrationsARead-onlyIdempotentInspect
List configured third-party source integrations (masked hints only, never tokens).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds context beyond those annotations by disclosing that the tool returns masked hints only, never tokens, and that it lists only configured integrations. This is valuable behavioral information that prevents incorrect assumptions about the output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with zero filler. It front-loads the core action and resource, then immediately provides the security-relevant output constraint ('masked hints only, never tokens'). Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, zero parameters, and annotations that fully cover the safety profile (read-only, idempotent, non-destructive), the description is complete. The masking note clarifies a crucial aspect of the return value, so nothing an agent needs to invoke this tool 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?
The tool has zero parameters, and the input schema is an empty object with coverage effectively at 100%. The baseline for zero-parameter tools is 4, and there are no parameter details to explain. The description's mention of output masking covers what the tool returns, not parameters, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('configured third-party source integrations'), making it immediately clear what this tool does. It also adds a crucial qualifier ('masked hints only, never tokens') that differentiates it from other integration operations and sets expectations about output. This fully distinguishes it from siblings like integrations_set and integrations_delete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states the purpose, which signals when to use the tool: when an agent needs to view configured source integrations. It does not name alternatives, but no sibling tool provides the same listing function (integrations_set and integrations_delete are mutators, not alternatives). Clear context with no exclusions earns a 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
integrations_setConfigure a source integrationADestructiveInspect
Store a third-party source API token for the organization (encrypted at rest). Requires owner/admin. provider=sketchfab: token from sketchfab.com/settings/password (enables model download/import). provider=hyper3d: Rodin key from hyper3d.ai (enables asset_generate_3d). provider=hunyuan3d: Tencent Cloud credentials as "SecretId:SecretKey" (enables Hunyuan text/image→3D). provider=tripo3d: key from platform.tripo3d.ai (enables Tripo text/image→3D).
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Provider-issued API token used for this integration. | |
| provider | Yes | External asset-generation or model-provider integration to configure. |
Output Schema
| Name | Required | Description |
|---|---|---|
| provider | Yes | |
| tokenHint | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true, and the description adds valuable context beyond annotations: tokens are encrypted at rest, owner/admin permission is required, and provider-specific integrations are enabled. It does not explicitly say that setting a token overwrites an existing one, but the destructive hint covers that risk.
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 action and security context, then organized by provider with consistent formatting. Every sentence adds useful information—there is no filler or redundant restatement of the tool name or schema.
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 two-parameter tool with full schema coverage and an output schema, the description is complete: it covers permission requirements, encryption, provider-specific token sources, and downstream effects. An agent has everything needed to call the tool correctly without additional documentation.
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?
While schema coverage is 100%, the description adds significant meaning by mapping each provider enum value to its token source and the feature it enables. This goes well beyond the schema's generic 'Provider-issued API token' and helps the agent construct correct values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Store a third-party source API token') with the resource scope ('for the organization') and encryption detail. It clearly differentiates from sibling tools like integrations_delete and integrations_list by focusing on configuration/setup rather than removal or listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: it requires owner/admin and explains when each provider token should be used by linking providers to enabling specific features. It does not explicitly mention when not to use the tool or name alternatives, but the context is strong enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_cancelCancel jobADestructiveInspect
Request cooperative cancellation when an open job should stop. Work stops at a checkpoint and may still complete; cancellation is rejected for terminal jobs or once result publication starts. Compute already used is still accounted for. Returns current status and cancelRequested/cancelAccepted, not proof of cancellation; poll job_get or job_wait for the terminal state. Use jobs_list to locate a job or job_report for detailed results.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | Durable job ID returned when an asynchronous operation is queued. | |
| reason | No | Optional reason recorded when cancelling the job. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobId | Yes | Durable job ID returned when an asynchronous operation is queued. |
| status | Yes | |
| cancelAccepted | Yes | |
| cancelRequested | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by describing cooperative cancellation semantics, partial completion at checkpoints, rejection conditions, compute accounting, and that the response is not proof of cancellation. This gives the agent rich behavioral context that annotations alone (destructiveHint, idempotentHint, etc.) 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-loads the core purpose, then adds constraints, billing, return semantics, and alternatives in tightly packed but non-redundant sentences. Every sentence contributes distinct 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?
Despite having an output schema, it still usefully clarifies that the response is not proof of cancellation and directs the agent to poll job_get or job_wait. Combined with annotations and schema, nothing needed to invoke the tool 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 description coverage is 100%, so the schema already documents both jobId and reason fully. The description adds no parameter-specific meaning, which is the baseline case when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('cancel' a 'job') and immediately scopes it as cooperative cancellation for open jobs. It clearly distinguishes itself from job_get, job_wait, jobs_list, and job_report by naming their distinct roles.
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 when to use it ('when an open job should stop'), when it will be rejected (terminal jobs or once result publication starts), and which alternatives to use for locating jobs, polling terminal state, or getting detailed results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_getGet jobARead-onlyIdempotentInspect
Get a job's status, progress, ordered events, and — when terminal — results (revision, artifacts with download URLs).
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | Durable job ID returned when an asynchronous operation is queued. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral nuance beyond annotations: events are ordered, and results are only present when the job is terminal, including revision and artifact download 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?
A single sentence packs the core action, the exact queryable data, and the terminal-condition nuance without filler or redundancy. The most important information is front-loaded, and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only, idempotent tool with no output schema, the description is complete. It explains what the endpoint returns, including the terminal-only results qualification, so an agent can correctly invoke it and interpret the response without additional context.
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 jobId parameter is fully documented in the schema. The description adds no independent parameter-level information beyond referring to 'a job', which is acceptable given the schema already explains the durable ID 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 names a specific action ('Get') and resource ('a job'), then enumerates exactly what the tool returns: status, progress, ordered events, and terminal results. This clearly distinguishes it from sibling tools like jobs_list or job_report, which an agent can infer are broader or differently scoped.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: whenever a caller needs a job's status, progress, ordered events, or terminal results. It does not explicitly name alternatives or exclusion cases, but the precise return-value list makes intended usage apparent relative to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_reportRead complete job report pagesARead-onlyIdempotentInspect
Read bounded pages from a completed job's immutable report_json artifact. section=summary returns complete aggregate counts and actual coverage without loading all object details. Default is issues for validation and summary for scene_apply/export. Sections issues, objects (basic evaluated topology), printObjects, operationResults, operationEffects, operationWarnings, exportMaterials, and exportObjects return ordered records: offset counts records, limit caps each page (the byte budget may return fewer). section=report retrieves ALL original JSON as UTF-8 text chunks: offset then counts bytes; concatenate jsonText in order. Follow continuation verbatim, including artifactId, until complete=true for that section. An oversized record returns reportState=truncated with a section=report continuation; no record is silently shortened. Only ready + complete + total=0 means an empty section. Pending, failed, cancelled, missing, incomplete and truncated are distinct and never mean validation passed. The response pins project/revision/artifact identity. artifact_get remains available to download the complete file.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | Durable job ID returned when an asynchronous operation is queued. | |
| limit | No | Maximum records in this report page. | |
| offset | No | Starting offset for the selected report section or byte stream. | |
| filters | No | Issues only. Match severity, any listed object, and any listed code; original issue order is retained. | |
| section | No | Report section to page; report streams the full JSON by byte offset. | |
| filterId | No | Continuation filter identity; follow the returned continuation verbatim. | |
| artifactId | No | Pin continuation to the preceding page's immutable artifactId. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobId | Yes | Durable job ID returned when an asynchronous operation is queued. |
| total | No | |
| offset | Yes | |
| entries | No | |
| section | Yes | |
| complete | Yes | |
| jsonText | No | |
| jobStatus | Yes | |
| projectId | Yes | |
| artifactId | No | Artifact ID returned by a completed job or artifacts_list. |
| nextOffset | No | |
| revisionId | Yes | |
| reportState | Yes | |
| continuation | No | |
| artifactRevisionId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds substantial behavioral context beyond annotations: pagination semantics (offset counts records vs bytes), continuation requirements (follow verbatim until complete=true), truncation behavior (oversized record returns reportState=truncated, no silent shortening), and the meaning of distinct states (pending/failed/etc. never mean validation passed). This is rich, non-obvious behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place. It front-loads the core purpose, then covers section semantics, pagination, continuation, truncation, empty states, and the sibling alternative. It is longer than ideal, but the tool is genuinely complex (10 sections, two pagination modes, continuation protocol), so the length is justified. Minor redundancy: 'no record is silently shortened' restates the truncation behavior already described.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, 10 enum sections, nested filters, output schema present), the description covers everything an agent needs to call it correctly: section selection, pagination units, continuation protocol, truncation handling, empty-section semantics, state interpretation, and the fallback alternative. The output schema exists, so return-value details are already structured. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining how offset/limit behave differently per section (records vs bytes), how filters apply to issues only, and how filterId/artifactId function as continuation pins. It doesn't enumerate every parameter, but the schema already does that; the description clarifies the semantics that the schema leaves implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Read bounded pages from a completed job's immutable report_json artifact.' It then enumerates the distinct sections and their semantics, which clearly differentiates this tool from siblings like artifact_get and job_get. The title 'Read complete job report pages' is reinforced with concrete detail about what each section returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool versus alternatives: 'artifact_get remains available to download the complete file.' It also gives section-specific guidance ('Default is issues for validation and summary for scene_apply/export'), explains continuation semantics, and clarifies empty-section conditions. This is comprehensive routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jobs_listList jobsARead-onlyIdempotentInspect
Find recent jobs in the bound deployment, optionally by project or status, including when you have lost a job ID. Read-only; returns items and an opaque nextCursor. Use job_get for one job's status/result, job_wait to await its terminal state, job_report for complete paged reports, or job_cancel to request a stop. Copy nextCursor verbatim until null.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Rows per page, 1-50. Default 20; values above 50 are rejected. | |
| cursor | No | Opaque token — copy nextCursor VERBATIM from the previous response. NOT a row offset: "50" is rejected. (scene_inspect and artifacts_list do take integer offsets; this tool and projects_list are keyset-paginated and do not.) | |
| status | No | Optional job state to filter the results. | |
| projectId | No | Stable project ID returned by project_create or projects_list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| nextCursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so safety is covered. The description adds concrete behavioral context beyond that: the return shape ('items and an opaque nextCursor') and the pagination contract ('copy nextCursor verbatim until null'). It stops short of noting auth/permission requirements or rate limits, so a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose, then the contract, then the routing to siblings. Every sentence carries load; 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?
An output schema exists so return values need no prose, annotations carry the safety profile, and the param schema is fully documented. Combined with the explicit sibling routing and pagination contract, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains limit, cursor semantics (verbatim, not an offset), status and projectId — including the keyset-vs-offset contrast with sibling tools. The description only restates 'optionally by project or status' and reiterates the cursor rule, so the baseline 3 is correct.
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 ('Find recent jobs in the bound deployment') plus the scoping dimensions (project, status). It even names the failure case it covers — 'including when you have lost a job ID' — which lets an agent distinguish it from the sibling job tools 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 with their selection conditions: job_get for one job's status/result, job_wait to await terminal state, job_report for full paged reports, job_cancel to stop. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_waitWait for a jobARead-onlyIdempotentInspect
Long-poll a job until it reaches a terminal state or the timeout elapses. Default 90s, which is what a cold-starting Blender container usually needs; up to 300s is accepted but read the parameter note first, because a long single call trades round trips for connection risk. Cheaper than a job_get loop; chain calls for longer jobs, or register a webhook (webhooks_set) and stop polling altogether. Validation results include a complete aggregate report summary plus exact job_report continuations; result retains the compatible inline sample. Inspect report.inlineComplete and coverageComplete; truncated details or skipped checks never establish full coverage.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | Durable job ID returned when an asynchronous operation is queued. | |
| timeoutSeconds | No | Seconds to hold the connection open. 90 (default) is deliberately under the ~100s idle timeout common to HTTP proxies; values above that are allowed for direct connections but may return a transport error instead of a result. For jobs that genuinely take minutes, chain 90s calls or use webhooks_set. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobId | Yes | Durable job ID returned when an asynchronous operation is queued. |
| report | Yes | |
| result | Yes | |
| status | Yes | |
| terminal | Yes | |
| waitedMs | Yes | |
| artifacts | Yes | |
| errorCode | Yes | |
| progressPct | Yes | |
| errorMessage | Yes | |
| statusMessage | Yes | |
| resultRevisionId | Yes | |
| resultArtifactIds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior; the description adds meaningful extra context about connection risk, timeout tradeoffs, and the validation-result caveat. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Core behavior and defaults are front-loaded, and every sentence contributes operational value. It is slightly dense with specialized clauses, but not padded.
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 behavior, default, limits, alternatives, risks, and key result conditions. With an output schema already present, 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%, and both parameters are already well documented there. The description adds the cold-start rationale for the 90s default but does not need to carry much parameter burden.
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: long-poll a job until a terminal state or timeout. It also clearly differentiates itself from job_get loops and webhooks, so an agent can select it confidently.
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 this is 'Cheaper than a job_get loop' and instructs chaining calls or using webhooks_set for longer jobs. This gives concrete 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.
material_from_imageGenerate PBR maps from an imageAInspect
Turn ONE uploaded image (e.g. a logo PNG) into a full PBR material — deterministic, no AI. A mask (alpha channel, or bright/dark regions) drives derived roughness (baseRoughness/maskRoughness), embossed normal + height maps, optional metallic, and a base color composited over baseColor. Commits a new revision with the material (applyToObjects assigns it); maps pack into the .blend. Generated maps cap at 2048px on the longest edge — for full-resolution label/print work (4K macro shots), embed the original texture in a GLB and import via asset_import. Flow: upload_create → PUT → upload_complete → material_from_image. Returns a durable job handle. Explicit profile=surface/decal/supplied opts into the version-2 downloadable map workflow with roles and options; legacy mask/emboss arguments apply only when profile is omitted. Decals preserve transparency without implicit relief or metallic.
| Name | Required | Description | Default |
|---|---|---|---|
| roles | No | ||
| emboss | No | ||
| assetId | Yes | ||
| options | No | ||
| profile | No | ||
| baseColor | No | ||
| projectId | Yes | Stable project ID returned by project_create or projects_list. | |
| maskSource | No | alpha | |
| baseMetallic | No | ||
| maskMetallic | No | ||
| materialName | No | Image Material | |
| baseRoughness | No | ||
| maskRoughness | No | ||
| applyToObjects | No | ||
| baseRevisionId | No | "HEAD" (default) targets the project's current head. Mutations MUST build on the head: passing an older revision is rejected with REVISION_CONFLICT, since history is linear. To continue from an older scene, revision_restore it forward first. | HEAD |
| idempotencyKey | Yes | Stable caller-chosen key for safe retries of this same request. |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic write/openWorld/idempotent profile; the description adds substantive behavior: deterministic (no AI), commits a new revision, applyToObjects assigns it, maps pack into the .blend, maps cap at 2048px, decals preserve transparency without implicit relief/metallic, and it returns a durable job handle.
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 core behavior and the 2048px limitation before the pipeline and profile caveats. Dense but nearly every sentence carries operative information; the profile/legacy sentence is long and slightly clotted but earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter, nested-object mutation tool with an output schema, the description covers the important gaps: prerequisite chain, revision commit semantics, size ceiling, profile branching, and job-handle return. It leaves numeric fallback defaults to the schema, which is acceptable given they are documented there.
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?
Raw schema description coverage is 19%, but the nested options object is actually well documented in-schema, so the real gap is the top-level params (emboss, baseRoughness, maskRoughness, baseColor, maskSource, applyToObjects). The description compensates by explaining how the mask drives derived roughness, how base color is composited, and the profile-vs-legacy argument split, though it does not define individual numeric fallbacks.
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 concrete verb+resource+scope: 'Turn ONE uploaded image ... into a full PBR material — deterministic, no AI.' It also names the map outputs (roughness, normal, height, metallic, base color) and the 2048px cap, letting an agent distinguish it from material_from_maps and texture_maps_create 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?
Explicitly states the prerequisite pipeline (upload_create → PUT → upload_complete → material_from_image) and routes full-resolution label/print work to asset_import with a stated reason. It also gives the when-to-use rule for profile vs the legacy mask/emboss arguments, which is exactly the kind of alternative-selection guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
material_from_mapsApply a texture package as a materialADestructiveInspect
Create a scene material from a completed textureJobId or validated role-labeled images. Replaces materials in requested object slots: applyToObjects targets slot zero; assignments targets explicit slots. Commits one revision after all targets validate; existing mesh UVs and earlier revisions are preserved. Use texture_maps_create for downloads without scene changes, material_from_image for one image, or material_recipe for a procedural proposal. Returns a job; job_wait/job_get expose terminal status, revision and map artifacts.
| Name | Required | Description | Default |
|---|---|---|---|
| roles | No | Unique output roles to deliver. With sourceAssetId, defaults include profile convenience maps; with supplied maps or a completed texture job, defaults to its supplied roles. Unsupported missing maps fail rather than being invented. | |
| options | No | Optional processing and material settings. Supplied maps take precedence over fallback generation; a reused texture job preserves its appearance settings unless overridden. | |
| profile | No | Processing intent: surface or supplied defaults a single sourceAssetId to base_color/roughness with opaque alpha; decal to base_color/opacity with blend alpha. Role-labeled map sets default to their supplied roles. Explicit roles/options override these defaults. | surface |
| uvLayer | No | Existing UV layer to use on target meshes. Omit to use their active UV layer; no UV coordinates are generated or rewritten. | |
| uvScale | No | [U, V] texture-coordinate scale, each positive and at most 10000; default [1, 1]. Changes shader mapping, preserving mesh UV coordinates. | |
| projectId | Yes | Existing project in the bound deployment; owns the processing job and its artifacts. | |
| sourceMaps | No | Role-labeled validated images or texture artifacts, one per role and at most 12 unique images. Sources must share an aspect ratio. Do not combine with textureJobId. | |
| assignments | No | Explicit unique object/slot targets, maximum 50. Replaces existing slot assignments; mutually exclusive with nonempty applyToObjects. | |
| materialName | No | Name for the prepared material/package, 1-64 characters; default Image Material. | Image Material |
| textureJobId | No | Completed texture_maps_create job whose version-2 package should be applied. Alternative to sourceAssetId/sourceMaps; prepared map settings are retained unless overridden. | |
| sourceAssetId | No | Validated PNG/JPEG asset supplying base_color. Do not also supply a base_color entry in sourceMaps or combine with textureJobId. | |
| applyToObjects | No | Existing mesh object IDs to assign at slot zero, replacing that slot's material. Empty creates an unassigned material. Use assignments instead for explicit slots; maximum 50 objects. | |
| baseRevisionId | No | Current project head to mutate, or HEAD (default). A stale revision fails with REVISION_CONFLICT; refresh project_get before retrying. | HEAD |
| idempotencyKey | Yes | Stable caller-chosen key for this request. Reuse the same key and arguments for safe retries; change the key when changing inputs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false, so the mutation profile is already conveyed. The description adds real value beyond that: it discloses slot replacement, atomic validation before commit ('commits one revision after all targets validate'), and preservation of UVs and earlier revisions. Return shape is summarized as a job with job_wait/job_get for terminal status, though error/partial-failure semantics are only partially implied.
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 action and input sources, then targeting semantics, then atomicity guarantees, then sibling routing. No filler or repetition of schema text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter mutation tool with nested objects and an output schema, the description covers input alternatives, targeting behavior, atomicity/revision semantics, and the follow-up status tools. Return values are delegated to the output schema, which is appropriate.
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 beyond it by disambiguating two easily-confused targeting parameters — applyToObjects targets slot zero while assignments targets explicit slots — which is genuine routing value an agent needs.
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 ('Create a scene material') and pins the two valid inputs (completed textureJobId or validated role-labeled images). It is clearly distinguishable from material_from_image and material_recipe, which it names directly.
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 the agent to alternatives with conditions: texture_maps_create for downloads without scene changes, material_from_image for one image, material_recipe for a procedural proposal. 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.
material_nodesDiscover supported material nodesARead-onlyIdempotentInspect
Search supported shader aliases/native names in pages of at most 24, or select one node for pinned Blender input/output indices and enum properties. Read-only; no project, job or compute. Use the alias and exact sockets when editing a material_recipe proposal or scene_apply graph.
| Name | Required | Description | Default |
|---|---|---|---|
| node | No | Select one supported alias or native node name for indexed pinned sockets and property enums. | |
| limit | No | ||
| query | No | Search supported DSL aliases, native node names and labels. | |
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description's 'Read-only' is redundant. However, it adds meaningful scope: 'no project, job or compute' and the paging behavior ('pages of at most 24'), which are not present in annotations. These additions give agents a clearer behavioral model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The core function is front-loaded, followed by safety scope and then usage context. Every sentence adds value and the structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of explaining return relevance. It does mention that node selection returns 'pinned Blender input/output indices and enum properties' and that search returns pages, which is useful. It is reasonably complete for a read-only discovery tool, though offset behavior and response structure could be more explicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema describes `node` and `query`, but `limit` and `offset` have no descriptions. The description adds some meaning: 'pages of at most 24' clarifies limit, and 'select one node' clarifies the node parameter. However, `offset` is never explained, and the description does not fully compensate for the 50% schema coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: 'Search supported shader aliases/native names in pages of at most 24, or select one node for pinned Blender input/output indices and enum properties.' It clearly differentiates the two modes (search vs. select) and relates the tool to material_recipe and scene_apply, making its role distinct from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool: 'Use the alias and exact sockets when editing a material_recipe proposal or scene_apply graph.' It also gives exclusions with 'no project, job or compute,' clarifying what the tool is not for. This provides clear guidance without needing to name an alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
material_recipePropose an editable procedural or hybrid materialARead-onlyIdempotentInspect
Propose editable procedural/hybrid shader operations for wood, metal, stone, fabric or image weathering, with prompts and validation checks. Choose this for node-based materials; use material_from_image for one uploaded image, material_from_maps for a prepared map set, or texture_maps_create for downloads without scene changes. Hybrid recipes reuse existing image nodes and aligned color variants. Proposals only: no mutation, provider call, baking or compute. Review the returned operations, inspect sockets with material_nodes, then execute with scene_apply.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| seed | No | ||
| tint | No | Linear RGB surface tint; for image weathering this is the deposit/wear tint. | |
| brief | No | Appearance intent used in bounded prompt enhancement; never sent to an image provider by this tool. | |
| recipe | Yes | ||
| target | No | product | |
| uvLayer | No | Required for image_weathering: existing authored UV layer, verified from the source material. | |
| uvScale | No | ||
| fineBump | No | Procedural fine bump; defaults on for procedural recipes and off for image weathering to avoid adding relief accidentally. | |
| strength | No | Wear and relief amount; zero removes procedural weathering and relief. | |
| uvOffset | No | ||
| roughness | No | ||
| variation | No | Color and finish variation, independent of the deterministic seed. | |
| assignments | No | ||
| imageSource | No | ||
| variantMask | No | noise | |
| normalSource | No | Optional authored tangent-space OpenGL normal image; use a verified linear/non-color source. | |
| preserveAlpha | No | Reuse the approved source alpha. A variant changes color only, not the approved silhouette. | |
| variantFactor | No | Variant blend amount; with noise masking this is the maximum variant contribution. | |
| variantSource | No | Optional second base-color image registered to the approved source; never an independently generated companion PBR map. | |
| imageExtension | No | REPEAT | |
| roughnessSource | No | Optional dedicated scalar roughness image, not a packed ORM image. Its existing data color treatment is preserved; select packed channels with a custom graph. | |
| uvRotationRadians | No | ||
| featureScaleMeters | No | Nominal main feature size in meters, assuming applied object scale and one Blender unit per meter. Fine detail is smaller; verify against the object. | |
| variantAlignmentConfirmed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description reinforces this with the sharpest possible statement ('Proposals only: no mutation, provider call, baking or compute'). It also discloses the intended workflow sequence (review, inspect sockets with material_nodes, execute with scene_apply), which is real context beyond the annotations. It stops short of describing the proposal payload shape or validation-check behavior.
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?
Five tight sentences, none redundant: purpose first, then routing rule, then hybrid detail, then safety contract, then workflow. Zero filler and every clause pays for itself.
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 25-parameter, nested-object tool with no output schema, the description covers routing, safety, sibling boundaries, and the follow-up workflow, which is most of what an agent needs. The gap is parameter-level completeness: roughly half the schema fields are undocumented, and the description does not close that hole.
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?
With 25 parameters at only 48% schema description coverage, the description carries a heavy burden and only partially compensates: it hints that hybrid recipes reuse existing image nodes and aligned color variants, and that weathering uses a deposit/wear tint. It adds no guidance on the mass of undocumented parameters (seed, roughness, uvScale, variation, assignments, extension modes), so many params remain unexplained in both places.
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 (propose) and resource (editable procedural/hybrid shader operations) plus its domain (wood, metal, stone, fabric, image weathering) and explicitly distinguishes itself from its closest siblings by name. An agent can route to this tool 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 an explicit selection rule ('Choose this for node-based materials') and names four alternatives with the exact condition that selects each (material_from_image for one uploaded image, material_from_maps for a prepared map set, texture_maps_create for downloads without scene changes). This is textbook when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
organizations_listList organizationsARead-onlyIdempotentInspect
List the organizations this account belongs to, with your role in each.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds the account-membership scoping and the fact that each entry includes the caller's role, which is useful behavioral information beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single concise sentence that front-loads the action and resource and then adds the key behavioral detail (role in each organization). Every word contributes value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only listing tool with an output schema and strong annotations, the description fully conveys what the agent needs to invoke it correctly. Nothing important 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 has zero parameters, so the schema leaves nothing to document. The description accurately implies that no arguments are needed to call it; there is no parameter information for the description to supplement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact resource ('organizations'), the action ('List'), and the account-scoped membership context, so an agent can distinguish it from the many other list tools in the sibling set. It also adds the 'role in each' detail, which goes beyond the title.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes it clear that this is the tool for enumerating the organizations the current account belongs to. There is no sibling organization tool to contrast with, so the absence of an explicit 'use X instead' statement is acceptable; the resource scope alone routes selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
platform_statusPlatform capabilities & statusARead-onlyIdempotentInspect
Check what the account can do right now: whether Blender execution (renders, scene edits, imports) is available, compute budget usage, open job counts, and the bound deployment's policy limits. Also returns the versioned live snapshotPolicy when cached tool descriptions differ. Call before queueing work to fail fast.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| openJobs | Yes | |
| credential | Yes | |
| environment | Yes | |
| runningJobs | Yes | |
| toolSurface | Yes | |
| computeBudget | Yes | |
| audioAllowance | Yes | |
| blenderVersion | Yes | |
| snapshotPolicy | Yes | |
| boundDeployment | Yes | |
| blenderExecutionAvailable | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds value beyond that by disclosing the live snapshotPolicy behavior ('returns the versioned live snapshotPolicy when cached tool descriptions differ') and the set of metrics it reports. It does not elaborate on error conditions or the exact format, but the annotations and output schema mitigate that gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, with the primary purpose and scope front-loaded in the first sentence, and the key usage instruction in the second. There is no filler; every clause conveys necessary information about capabilities, the snapshotPolicy feature, and the recommended call timing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter status check with an output schema present, the description covers the essential context: what is being checked, why it is useful (fail-fast), and the special snapshotPolicy behavior. The output schema presumably documents the return structure, so the description does not need to duplicate that. Nothing an agent needs to decide to call this 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 has zero parameters, so schema coverage is trivially 100% and there is nothing for the description to explain. The description focuses on what the tool reports rather than inputs, which is appropriate. The baseline for a 0-parameter tool is 4, and no deduction is warranted since the description adds no parameter-related noise.
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 clear verb ('Check') and a specific resource ('what the account can do right now'), then enumerates the concrete things it reports: Blender execution availability, compute budget usage, open job counts, deployment policy limits, and the versioned snapshotPolicy. This makes it unambiguous and distinct from the many sibling tools that target specific resources (e.g., job_get, deployment_policy_update).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit when-to-use instruction: 'Call before queueing work to fail fast.' This tells the agent the precise scenario for invoking the tool and implies it should be used as a preflight check. While it does not name alternatives, its role is unique among siblings, and the directive is actionable and clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preset_applyApply a presetADestructiveInspect
Apply a curated preset as a new revision (compiles to validated scene operations). Material presets create the material (tint via color, assign via applyToObjects); lighting presets add a complete light rig + world; camera presets frame and activate a camera; render presets set the render profile. LIGHTING AND CAMERA PRESETS ARE AUTHORED FOR A 2 m SUBJECT — lights 4-7 m out at 800-1500 W, cameras 4-6 m back. On a small product that is not merely suboptimal, it is a white frame: a 42 mm subject wants roughly 1/50 the distance and 1/2500 the wattage. Pass subjectSizeM and the whole rig is rescaled for you.
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | ||
| preset | Yes | ||
| projectId | Yes | Stable project ID returned by project_create or projects_list. | |
| materialName | No | ||
| subjectSizeM | No | Largest dimension of the subject in METRES (watch 0.042, mug 0.12, chair 1.0, car 4.5). Rescales lighting and camera presets from their 2 m reference: distances linearly, light energy by the square. Ignored by material and render presets. Omit it and the raw 2 m rig is applied unchanged. | |
| applyToObjects | No | ||
| baseRevisionId | No | "HEAD" (default) targets the project's current head. Mutations MUST build on the head: passing an older revision is rejected with REVISION_CONFLICT, since history is linear. To continue from an older scene, revision_restore it forward first. | HEAD |
| idempotencyKey | Yes | Stable caller-chosen key for safe retries of this same request. | |
| generatePreview | No | Render the revision thumbnail (maximum side 384px), using the active camera or scene-bounds fallback. Lit transmission uses low-sample Cycles; other lit scenes use EEVEE. Pass false when another preview is unnecessary; scene_snapshot then inherits the nearest ancestor thumbnail and says so. |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | Yes | |
| operationCount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive=true/non-idempotent, and the description adds real behavioral context beyond them: presets compile to validated scene operations, write a new revision, and that lighting/camera rigs are authored against a 2 m reference at 800-1500 W and 4-6 m. It doesn't explain the destructive/linear-history implication of the write (that is left to the baseRevisionId schema text), so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then organized by preset family, with the highest-risk caveat (small-subject white frame) clearly stated. The vivid 'white frame' line and the 42 mm arithmetic are dense but genuinely load-bearing; the passage is slightly longer than strictly necessary but no sentence is disposable.
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 mutation tool with an output schema and partial annotation coverage, the description supplies the missing context an agent needs: what each preset family changes, the scaling contract for subjectSizeM, and the default state when it is omitted. Return-value behavior is delegated to the output schema, so nothing material 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 only 56%, and the description compensates by mapping otherwise-undocumented parameters to behavior: 'tint via color, assign via applyToObjects' explains two of the bare schema properties. subjectSizeM's rescaling rule is reinforced, but materialName and the interaction of preset type with per-parameter validity remain unaddressed.
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 gives a precise verb+resource ('Apply a curated preset as a new revision') plus a parenthetical on what that produces ('compiles to validated scene operations'). It then enumerates the four preset families and their distinct effects, which lets an agent separate this from scene_apply, material_recipe, or presets_list 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?
The description gives concrete when-to-use guidance for the key parameter ('Pass subjectSizeM and the whole rig is rescaled for you') and an explicit failure mode for omitting it on small subjects. It does not name sibling alternatives (presets_list for discovery, scene_apply for raw ops) or state preconditions, so it falls short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
presets_listList presetsARead-onlyIdempotentInspect
List curated one-call presets for preset_apply: PBR materials (glass, metals, plastics, neon…), lighting rigs (studio three-point, product softbox, sunset…), camera framings (hero three-quarter, top-down, isometric…), and render profiles (draft, production, square).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Optional preset kind to filter the catalog. | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description does not need to restate the safety profile. It adds useful context about what kinds of presets exist, but it does not disclose additional behavioral details such as filtering semantics or output size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with a colon-led enumeration. The main action and scope are front-loaded, and every clause adds useful information without waste.
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 one optional parameter, a rich enum schema, and an output schema present, the description is mostly complete for selecting and invoking the tool. It could slightly improve by explicitly noting when this tool should be used in a preset_apply workflow, but little critical information 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?
Even though schema coverage is 100%, the description enriches the 'kind' parameter by mapping each enum value to concrete examples like PBR materials, studio three-point, hero three-quarter, and draft render profiles. This is meaningful value beyond the schema's fairly terse parameter description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('List') and concrete resource ('curated one-call presets for preset_apply'), then enumerates the four preset kinds. This is specific and clearly distinguishes presets_list from sibling preset_apply and other list-like tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for preset_apply' clearly signals the intended workflow: list available presets before applying one. It provides clear context, though it does not explicitly state when not to use this tool or name alternative tools beyond preset_apply.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_createCreate projectAInspect
Create a project from a template. Choose executionEngine=ngplant for plants and procedural vegetation; use vegetation_create/edit to author its native model, while Blender packages standard previews and exports. Blender is the default for other scenes. Returns a stable liveUrl for signed-in users to watch job progress and completed previews, plus a durable job handle. Share the returned liveUrl with the user immediately as a clickable Markdown link in a progress message, before waiting for initialization or building the scene. Use the exact returned URL and mention that sign-in is required. Do not wait until the final render; an empty project shows progress before its first preview exists. Poll job_get — the first immutable revision exists once the job completes. template=empty skips preview generation by default, because an empty scene's preview is a 132-byte GLB of nothing and a blank thumbnail; generatePreview overrides that in either direction.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable name for the new project. | |
| template | No | Initial scene template; empty starts without geometry. | empty |
| idempotencyKey | Yes | Stable caller-chosen key for safe retries of this same request. | |
| executionEngine | No | Use ngplant for plants/vegetation; Blender packages standard outputs. Default blender preserves ordinary scene authoring. | blender |
| generatePreview | No | Render the preview GLB and 384px thumbnail for the first revision. Defaults to TRUE for templates that place geometry or lights and FALSE for template=empty, whose preview is a 132-byte GLB of nothing plus a blank thumbnail. Pass it explicitly to override either default. |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | Yes | |
| liveUrl | Yes | Stable project preview page. Share this URL with the user immediately as a clickable link; requires sign-in and organization membership. |
| projectId | Yes | Stable project ID returned by project_create or projects_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry the safety profile (not read-only, not idempotent-hinted); the description goes far beyond by disclosing the return contract (stable liveUrl plus durable job handle), the sign-in requirement, the polling path via job_get, and the first-immutable-revision timing. This is exactly the behavioral context that structured fields do not supply.
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?
Dense but front-loaded: purpose first, then engine guidance, then the return/workflow contract. It runs long and mixes invocation guidance with agent workflow instructions, so some sentences could be trimmed, but each carries distinct information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a creation tool with an output schema, annotations, and five enum-heavy parameters, the description covers purpose, alternatives, engine semantics, return values, the required sharing step, and polling. 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, but the description adds real meaning on top: the ngplant-vs-Blender tradeoff for executionEngine and the true/false defaults for generatePreview that depend on the template, plus the rationale for template=empty. It augments rather than repeats 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?
States a specific verb and resource ('Create a project from a template') and immediately frames the engine choice with sibling tools ('vegetation_create/edit to author its native model'). An agent can route this against project_update, scene_apply, and the vegetation tools 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?
Explicit selection rules: executionEngine=ngplant for plants/procedural vegetation, vegetation_create/edit for the native model, Blender as default for other scenes. It also names the when-not condition for preview generation on template=empty. That is genuine when/when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_deleteDelete a projectADestructiveInspect
Soft-delete a project (hidden from listings; revisions retained). Open jobs block deletion — cancel them first with job_cancel.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | must be true — deletion cannot be undone from the API | |
| projectId | Yes | Stable project ID returned by project_create or projects_list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes | |
| projectId | Yes | Stable project ID returned by project_create or projects_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the description adds value by specifying the nuanced behavior: it is a soft-delete, revisions are retained, and open jobs block the operation. This goes beyond the simple destructive flag and informs the agent about consequences and prerequisites.
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 concise sentences front-load the action and its key effects, followed by the critical prerequisite. Every clause carries information without redundancy 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 2-parameter destructive tool with an output schema and annotations, the description covers the main behavioral constraints (soft-delete, blocking condition, cancellation path). It does not mention auth or rate limits, but those are typically outside description scope; the essential call-time knowledge is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (projectId, confirm) are already documented in the schema. The description does not add additional parameter-level meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Soft-delete'), the resource ('a project'), and the behavioral effect ('hidden from listings; revisions retained'). This clearly distinguishes it from other delete tools like deployment_delete or integrations_delete, and clarifies it is not a permanent deletion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit precondition ('Open jobs block deletion') and directs the agent to a sibling tool for the required workaround ('cancel them first with job_cancel'). It implies when to use it (when no open jobs exist) and when not to, with a concrete alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_getGet projectARead-onlyIdempotentInspect
Get project metadata: head revision, recent revisions, active jobs, preview artifact, effective policy limits, and a stable liveUrl where signed-in organization members can watch job progress and completed previews without starting Blender work.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Stable project ID returned by project_create or projects_list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| liveUrl | Yes | Stable project preview page; requires sign-in and organization membership. |
| projectId | Yes | Stable project ID returned by project_create or projects_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as readOnly, idempotent, and non-destructive. The description adds meaningful behavioral context beyond the annotations by enumerating the returned metadata categories and clarifying that the liveUrl lets signed-in organization members watch progress without starting Blender work. This enriches the agent's understanding of what the operation actually returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, dense sentence that front-loads the core action ('Get project metadata') and then uses a colon-delimited list of concrete return items. Every element contributes information, with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has a single required parameter, a full schema for that parameter, an output schema, and safety annotations, the description is nearly complete. It covers the main metadata categories and the special liveUrl behavior. It could be slightly more complete by noting when to prefer this over related read tools, but nothing essential for correct invocation 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?
There is only one parameter, projectId, and the schema describes it fully with 100% coverage. The description adds no additional parameter-level guidance, but since the schema already provides complete meaning, the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('project metadata') and enumerates the concrete data returned: head revision, recent revisions, active jobs, preview artifact, policy limits, and a liveUrl. It is clear what the tool does, though it does not explicitly contrast itself with the sibling projects_list or project_update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is for retrieving detailed metadata for a single project as opposed to listing projects, but it never states when to use project_get versus projects_list, artifact_get, or job_get. No explicit alternatives or exclusions are provided, leaving the usage context to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
projects_listList projectsARead-onlyIdempotentInspect
List the account's projects, newest first, with cursor pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of projects to return in this page (1–50). | |
| cursor | No | Opaque token — copy nextCursor VERBATIM from the previous response. NOT a row offset: "50" is rejected. (scene_inspect and artifacts_list do take integer offsets; this tool and jobs_list are keyset-paginated and do not.) | |
| nameFilter | No | Optional literal project-name substring (ASCII case-insensitive); %, _ and quotes match literally. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| nextCursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior. The description adds useful non-schema behavior: results are ordered newest first and pagination uses a cursor. It does not discuss auth needs or rate limits, but with annotated safety profile this is a solid add.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no wasted words. Ordering and pagination are included without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with an output schema and fully documented parameters, the description covers ordering and pagination adequately. It omits mention of the optional nameFilter, but that is fully specified in the schema and the output schema handles return-value details.
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 all three parameters are fully documented in the schema itself. The description adds no parameter-level meaning beyond what the schema provides, matching the baseline for fully covered schemas.
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 (list projects), scopes it to the account, and adds ordering and pagination details. It is clearly distinguishable from project_get, project_create, project_delete, and project_update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives such as project_get or artifacts_list. Usage is implied by the verb 'list' but no conditions or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_updateRename a projectADestructiveInspect
Rename a project. History, revisions, and jobs are unaffected.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New human-readable project name. | |
| projectId | Yes | Stable project ID returned by project_create or projects_list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| projectId | Yes | Stable project ID returned by project_create or projects_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a destructive/non-read-only operation, and the description adds useful context by explicitly stating that history, revisions, and jobs are unaffected. It goes beyond annotation hints without contradicting them, though it does not detail any other side effects or 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?
Two short sentences front-load the core action and then add the most relevant side-effect clarification. There is no redundant wording or filler, so every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter rename operation with a complete input schema, output schema, and annotations, the description is sufficient. It tells the agent what the operation does and which data is preserved, leaving no critical gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains both 'name' and 'projectId'. The tool description adds no parameter-level semantics beyond what the schema provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource, 'Rename a project', and clarifies scope by stating that history, revisions, and jobs are unaffected. This distinguishes it from destructive siblings like project_delete and from project_create/get/list, making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for renaming and reassures that history, revisions, and jobs are unaffected, which gives some context about safe usage. However, it does not explicitly state when not to use it or mention alternatives such as project_create or project_delete, leaving usage guidance largely implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_animationRender animation to MP4AInspect
Render a frame range to an H.264 MP4. engine=cycles_cpu (default) is photoreal; lit_preview (EEVEE) keeps materials and lights at ~10x less cost and is the right choice for reviewing motion and timing; preview_fast is shape-only. Animate first: keyframe cameras/objects via scene_apply animation.* operations, then render from that revision. One job renders up to 600 frames; for longer sequences fire parallel jobs over contiguous frame ranges and concatenate the MP4 segments (identical encoder settings make them concat-safe). The MP4 becomes an immutable artifact (download via artifact_get). Optional audioTracks mix owned audio_wav artifacts into an AAC soundtrack with startSeconds relative to this output segment, sourceOffsetSeconds, gainDb and looping. Inputs must belong to this project/deployment; PCM16 44.1 kHz mono/stereo only. Clipping is rejected; lower gainDb. Actual output streams/timing are verified. Returns a durable job handle.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | ||
| width | No | ||
| engine | No | cycles_cpu | |
| height | No | ||
| samples | No | ||
| cameraId | No | ||
| frameEnd | Yes | ||
| projectId | Yes | Stable project ID returned by project_create or projects_list. | |
| frameStart | Yes | ||
| revisionId | No | "HEAD" (default) uses the project's current head | HEAD |
| audioTracks | No | ||
| idempotencyKey | Yes | Stable caller-chosen key for safe retries of this same request. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite minimal annotations (all hints false), the description discloses key behaviors: output is an immutable artifact downloadable via artifact_get, inputs must belong to the project/deployment, audio must be PCM16 44.1 kHz mono/stereo, clipping is rejected with a directive to lower gainDb, output streams/timing are verified, and the return is a durable job handle. It also states the 600-frame limit and concat-safety of parallel segments. This goes well beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence in the description adds non-obvious, actionable information: engine tradeoffs, prerequisite ordering, job limits, parallelization strategy, artifact immutability, audio constraints, rejection behavior, verification, and return type. Despite its length, there is no filler or repetition, and it is appropriately front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 12 parameters, no output schema, and minimal annotations, the description is exceptionally complete. It covers prerequisites, engine selection criteria, operational limits, parallel scaling, artifact lifecycle, audio input validation, failure mode, verification, and return contract. The only minor omissions (explicit sibling differentiation, per-parameter detail for resolution/fps) are largely compensated by schema defaults and clear parameter names.
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?
With only 25% schema description coverage, the description carries the burden of explaining parameters. It richly explains the engine enum and audioTracks semantics (startSeconds, sourceOffsetSeconds, gainDb, looping), plus frame-range implications. However, it leaves fps, width, height, samples, and cameraId entirely implicit, relying on parameter names. That partial compensation yields a middle score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific verb and resource: 'Render a frame range to an H.264 MP4.' It also distinguishes internal engine modes, giving it a concrete scope. However, it never explicitly contrasts itself with sibling tools like render_create or render_turntable, so an agent must infer differentiation from the name and context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance for each engine (cycles_cpu for photoreal, lit_preview for review at 10x lower cost, preview_fast for shape-only) and a prerequisite ('Animate first... via scene_apply animation.*'). It also advises splitting long sequences into parallel contiguous ranges. But it doesn't name alternative tools or state when not to use this tool versus a sibling, so it stops short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_createCreate renderAInspect
Render a still PNG from a revision through the active camera. engine=cycles_cpu (default) is photoreal and slow; engine=lit_preview uses the scene materials, lights and world in EEVEE for cheaper look development; its shading can differ, especially for transmission. Use it to judge a material or a light rig, and use Cycles for final appearance or transmission checks. engine=preview_fast (Workbench) ignores materials and lighting entirely and only answers questions about shape and layout. Big renders fan out across parallel containers automatically (horizontal strips, stitched server-side); shards=1 forces one instance. The speedup is bounded by your maxConcurrentJobs — strips beyond it would render one after another and pay a container boot each, so the fan-out width is CLAMPED to that policy and the response tells you when it was reduced. Renders above the approval threshold require an approval round-trip. Cycles renders of 16+ samples are DENOISED with OpenImageDenoise and use adaptive sampling, so the sample count is a ceiling rather than a bill and modest counts look far cleaner than they otherwise would; override with the render_settings.update denoise flag. hideObjectIds/hideNamePattern omit objects from THIS RENDER ONLY, with no revision and nothing to undo — that is how you isolate a suspect ("render it without the crystal") in one job instead of bisecting by guesswork. LIGHTS ARE OBJECTS and can be hidden the same way, so hiding all but one is how you find which light is blowing out a highlight — the standard lighting-debug move, and it needs no separate parameter. Returns a durable job handle; the finished PNG is an immutable artifact. purpose=draft preserves existing behavior. purpose=final requires validationJobId from a completed successful deep scene_validate of the exact resolved project revision before any render is queued. Wait for validation, read the full report with job_report, repair/revalidate if needed, then pass that proof. This never starts validation automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| width | No | ||
| engine | No | cycles_cpu = photoreal final. lit_preview = EEVEE, honours materials/lights/world for look development. preview_fast = Workbench, shape only, ignores all shading. EEVEE transmission depends on the scene settings and does not establish Cycles equivalence. Use cycles_cpu when judging glass or seeing through a surface. | cycles_cpu |
| height | No | ||
| shards | No | Parallel fan-out width. 0 (default) decides from render cost; 1 forces a single instance; 2-8 requests that many strips. Any value here is CLAMPED to maxConcurrentJobs: strips past your concurrency cannot overlap, so they would render one after another and add a container boot each, which is slower than shards=1. The response reports the reduction when it happens. | |
| purpose | No | draft | |
| samples | No | ||
| cameraId | No | ||
| projectId | Yes | Stable project ID returned by project_create or projects_list. | |
| revisionId | No | "HEAD" (default) uses the project's current head | HEAD |
| hideObjectIds | No | ||
| idempotencyKey | Yes | Stable caller-chosen key for safe retries of this same request. | |
| hideNamePattern | No | ||
| validationJobId | No | Required for purpose=final: completed passing deep-validation job for this exact project/revision. Known profiles are accepted; the response states that profile and its coverage. | |
| transparentBackground | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With all four annotations false, the description carries the full behavioral burden and delivers abundantly: fan-out clamping to maxConcurrentJobs, the approval round-trip threshold, OpenImageDenoise with adaptive sampling making samples a ceiling, render-only object hiding with 'no revision and nothing to undo,' the durable job handle and immutable PNG, and the validation precondition for purpose=final. The non-destructive hiding claim aligns with destructiveHint=false; no contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: the one-sentence purpose leads, then organized blocks cover engine selection, fan-out, approval, denoising, hiding, and validation. It is long, and the shards/engine content partially duplicates the schema's parameter descriptions, but each paragraph adds operational context the schema lacks, so the length is largely earned.
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 14-parameter mutation tool with no output schema and neutral annotations, the description covers engine trade-offs, concurrency behavior, approval gating, validation prerequisites, the durable job-handle return value, and the non-destructive hiding idiom. 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 only 43%, and the description compensates for the highest-risk parameters: purpose (draft vs final validation gating), hideObjectIds/hideNamePattern (render-only, no undo, with a concrete debugging example), samples (denoise ceiling behavior), and engine (use-case framing beyond the enum). A few low-risk parameters like transparentBackground and cameraId are left to self-evident schema fields, so it falls just short of a perfect 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?
The opening sentence 'Render a still PNG from a revision through the active camera' names the verb, resource, output format, and camera path in one clause. The word 'still' cleanly differentiates it from siblings render_animation and render_turntable without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance per engine: 'Use it to judge a material or a light rig, and use Cycles for final appearance or transmission checks,' and states preview_fast 'only answers questions about shape and layout.' It also spells out the full purpose=final workflow: wait for validation, read the job_report, repair/revalidate, then pass the proof — including the exclusion that render_create 'never starts validation automatically.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_turntableRender turntable stillsAInspect
Render N evenly spaced orbit views of a revision in ONE job — catch problems a single angle hides. A temporary camera orbits the scene bounds at elevationDeg; pass targetObjectIds, targetNamePattern (e.g. "Watch_*"), or excludeNamePattern (e.g. "Studio_*" — the one that works when an assembly's parts share no prefix) to orbit and frame ONLY those objects (product shots: leaves floors/backdrops out of frame). excludeNamePattern only changes what the orbit FRAMES — excluded objects are still rendered and can still fill the frame; hideNamePattern is what removes them from the image. engine=preview_fast (Workbench, default) is near-instant but ignores materials and lights; lit_preview (EEVEE) honours them at ~10x less cost than cycles_cpu, which is the photoreal final. Each frame becomes a PNG artifact — view inline with scene_snapshot artifactId= from job_get artifacts. Returns a durable job handle and a bounded selection summary; the job retains the full resolved target list.
| Name | Required | Description | Default |
|---|---|---|---|
| views | No | Deprecated alias for angles. Use angles for new calls; do not provide both fields. | |
| width | No | ||
| angles | No | Canonical orbit-view count (2-12). Defaults to 6 when neither angles nor the deprecated views alias is supplied; do not pass both. | |
| engine | No | preview_fast | |
| height | No | ||
| samples | No | ||
| projectId | Yes | Stable project ID returned by project_create or projects_list. | |
| revisionId | No | "HEAD" (default) uses the project's current head | HEAD |
| elevationDeg | No | ||
| hideObjectIds | No | ||
| idempotencyKey | Yes | Stable caller-chosen key for safe retries of this same request. | |
| hideNamePattern | No | HIDES matching objects from every frame of this turntable (no revision, nothing to undo). This is not the framing filter: hiding the subject renders empty frames, and the job is refused if it would hide everything being orbited. | |
| targetObjectIds | No | ||
| targetNamePattern | No | ||
| excludeNamePattern | No | Drop matches from what the orbit FRAMES, e.g. "Studio_*". The excluded objects are STILL RENDERED and can still appear — this only changes the bounds the camera is fitted to. Use hideNamePattern to take them out of the image. | |
| transparentBackground | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description richly discloses behavior beyond annotations: the job runs as a single batch, uses a temporary orbiting camera, writes PNG artifacts, returns a durable job handle, and keeps the full resolved target list. It also clarifies subtle selection behavior such as excludeNamePattern affecting framing only while hideNamePattern removes objects from the image. This is far beyond what the sparse 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?
The description is dense but every sentence earns its place: purpose, camera behavior, targeting semantics, engine selection, artifact workflow, and return behavior. It is front-loaded with the primary purpose, uses concrete examples, and avoids filler or redundant restatements of schema fields.
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 high-complexity tool with 16 parameters, no output schema, and several sibling rendering tools, the description is remarkably complete. It explains what the call returns, how to view artifacts via scene_snapshot, how filtering works, and engine trade-offs, leaving no major operational gap for an agent choosing and invoking the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at only 44%, the description compensates by explaining the most semantically tricky parameters: targetObjectIds/targetNamePattern/excludeNamePattern/hideNamePattern distinctions, engine trade-offs, and angles/views aliasing. It does not add meaning for width, height, samples, or transparentBackground, but those are less ambiguous and partially inferable from names and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Render N evenly spaced orbit views of a revision in ONE job'. This clearly distinguishes turntable stills from render_animation or generic render_create, and the 'catch problems a single angle hides' rationale gives the agent an immediate sense of its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful context like product-shot framing and engine trade-offs, but it never explicitly says when to choose render_turntable over sibling tools such as render_animation or render_create. There is no when-not-to-use guidance or explicit alternative routing, so usage is mostly implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revision_diffSemantic revision diffARead-onlyIdempotentInspect
Compare two revisions before reviewing or undoing scene changes. Read-only: reports objects added/removed and changes to transforms, materials and render settings without changing the project head. Uses a stored parent-to-child diff when available, otherwise compares summaries. Use revision_restore only to replace the current scene with an earlier revision; project_get lists recent revision IDs. Returns diff.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Stable project ID returned by project_create or projects_list. | |
| toRevisionId | Yes | Newer revision ID to compare against. | |
| fromRevisionId | Yes | Older revision ID to compare from. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, but the description still adds meaningful behavior: it does not change the project head, and it prefers a stored parent-to-child diff over comparing summaries. It stops short of describing the response shape beyond 'Returns diff.'
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 core action and scope, then alternatives, then mechanism. Four sentences, little waste; only 'Returns diff.' is nearly redundant, adding minimal 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 read-only comparison tool with no output schema, the description conveys scope, safety, alternatives, and diff strategy. The return value could be fleshed out further, but the essential calling context is present.
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 both revision parameters and projectId are already documented in the schema; the description adds no syntax or ordering detail beyond what is there. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Compare two revisions') and immediately scopes it to reviewing or undoing scene changes, which lets an agent distinguish it from sibling mutation tools like revision_restore.
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 names the alternative and its condition ('Use revision_restore only to replace the current scene with an earlier revision') and points to project_get for obtaining revision IDs, so when-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revision_restoreRestore revisionADestructiveInspect
Replace the current scene contents with a historical revision, creating a new head revision. This changes the active scene and discards later edits from that active view; prior revisions remain available. Use revision_diff to review changes first and project_get to read the exact current head. A stale currentHeadRevisionId rejects with REVISION_CONFLICT; policy may require interactive approval. Returns a restore job; check job_wait/job_get for the actual terminal state and new revision.
| Name | Required | Description | Default |
|---|---|---|---|
| message | No | Short description saved with the restored revision. | |
| projectId | Yes | Stable project ID returned by project_create or projects_list. | |
| idempotencyKey | Yes | Stable caller-chosen key for safe retries of this same request. | |
| sourceRevisionId | Yes | Existing revision whose scene should become the new head. | |
| currentHeadRevisionId | Yes | Current head revision ID used to prevent conflicting restores. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructive=true and idempotent=false; the description adds what is actually destroyed ('discards later edits from that active view'), what survives ('prior revisions remain available'), the failure mode (stale currentHeadRevisionId rejects with REVISION_CONFLICT), the policy gate (interactive approval), and the async nature (returns a restore job, terminal state via job_wait/job_get).
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 dense sentences, front-loaded with the effect and destruction, then prerequisites, then failure/policy behavior, then return semantics. No filler and nothing duplicates the title.
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 async mutation with no output schema, the description covers effect, data loss, siblings to consult first, conflict handling, approval policy, and how to obtain the terminal result. Nothing an agent needs to invoke it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning for currentHeadRevisionId by explaining that a stale value triggers REVISION_CONFLICT, giving the optimistic-concurrency parameter a purpose beyond its schema text.
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 ('Replace the current scene contents with a historical revision, creating a new head revision') and immediately clarifies the resulting state. An agent can distinguish it from sibling revision_diff (review) and scene_apply 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?
Explicitly routes the agent to revision_diff to review changes first and project_get to read the exact current head, which is real when-to-use guidance. It does not, however, contrast with other mutation siblings (scene_apply, preset_apply) that might also alter scene contents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_applyApply scene operationsADestructiveInspect
Apply a batch of validated scene operations to a base revision. Mutating batches commit atomically into one new immutable revision (or nothing); query/select-only batches still execute in Blender and return operationResults, but create no revision and do not move the project head. Returns a durable job handle. Call docs_operations FIRST to see the vocabulary: there are 298 operations covering mesh editing, booleans, lathe/loft/sweep, curves, UV unwrap, modifiers, materials, lights, cameras, render settings, geometry nodes, and batch/query helpers — most modelling needs no scene_script at all. Prefer this over scene_script: operations are validated before dispatch and cost less.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Validate against the ACTUAL scene and report what each operation would touch, without committing, queueing a job, or consuming compute. Free and synchronous. Resolves every id and $ref against the target revision, so stale ids, purged materials and unknown targets surface here instead of failing a whole batch, and checks material.create_node_graph sockets against the pinned Blender build; configured layouts and geometry-node graphs retain explicit advisory limits. Use it to probe an uncertain operation before spending a container on it. What it does NOT do: run any geometry, so it cannot tell you a boolean will miss, a profile will not close, or a bevel will overlap — for those, put the READ ONLY mesh.* checks in the real batch and read operationResults. | |
| message | No | Short description saved with the new revision. | |
| projectId | Yes | Stable project ID returned by project_create or projects_list. | |
| operations | Yes | Ordered batch of validated scene operations; use docs_operations for exact schemas. | |
| baseRevisionId | No | "HEAD" (default) targets the project's current head. Mutations MUST build on the head: passing an older revision is rejected with REVISION_CONFLICT, since history is linear. To continue from an older scene, revision_restore it forward first. | HEAD |
| idempotencyKey | Yes | Stable caller-chosen key for safe retries of this same request. | |
| generatePreview | No | Render a thumbnail for a new revision (default maximum side 384px; previewMaxSidePx can request up to 1024px). Defaults to on for mutating batches. A batch whose operations only READ or SELECT (mesh.get_*, *.analyze_*, mesh.select_*) creates no revision, so this is forced off even when explicitly true. | |
| previewMaxSidePx | No | Opt-in thumbnail maximum side in pixels; default 384, maximum 1024, preserving the active camera aspect ratio. Larger previews spend more compute at the same 16 samples. Has no effect when generatePreview is false or the batch is read-only. scene_snapshot later reads that stored image and cannot resize or regenerate it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| job | No | |
| dryRun | No | |
| problems | No | |
| readOnly | No | |
| warnings | No | |
| declaredRefs | No | |
| readOnlyNote | No | |
| operationCount | No | |
| dimensionChecks | No | |
| generatePreview | No | |
| geometrySimulation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the atomic all-or-nothing commit into an immutable revision, the read-only no-head-move behavior, and the durable job handle, which go beyond the annotations' single destructiveHint. This gives the agent a clear side-effect model without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences front-load the core behavior, then add the return type and usage guidance. The list of operation categories is verbose but earns its place by establishing scope and justifying the preference over scene_script.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a rich schema and output schema, the description covers the essentials: what it applies, revision semantics, read-only behavior, job handle, and where to learn the operation vocabulary. No critical information an agent needs to invoke it safely 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 description does not need to re-document parameters; the baseline is 3. It adds useful orientation by pointing to docs_operations for the operation vocabulary, but offers no per-parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specifically that it applies a batch of validated scene operations to a base revision, and notes atomic revision creation versus read-only execution. It also explicitly differentiates itself from scene_script ('Prefer this over scene_script'), so an agent can pick it apart from the closest sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells the agent to call docs_operations FIRST and says to prefer scene_apply over scene_script because operations are pre-validated and cheap. It does not spell out the exact conditions under which scene_script should be used instead, but gives enough context for the common path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_inspectInspect sceneARead-onlyIdempotentInspect
Read a revision's scene from its stored structured summary — synchronous, no container. detail: summary | objects | materials | render | cameras | lights | stats | full. Use "cameras" to get camera ids for render_create cameraId, "lights" for the rig with energies, and "stats" for per-object vertex/face counts, UV presence and modifier stacks. Filter with objectIds, or with namePattern/excludeNamePattern — namePattern is how you turn the namePattern a copying operation reports (object.radial_array, object.array_along_curve) back into the full list of ids it created. limit/cursor page the requested entity type. In full mode each included collection uses the same offset/limit; nextCursor continues while any collection has more rows. Object filters affect objects, cameras and lights; materialIds independently filters materials. For exact node names, links and packed image bindings request includeNodeGraphs with detail=materials/full and one materialId or limit=1. Graphs are omitted by default; legacy or partial summaries explicitly report availability. All positions and sizes are metres (1 unit = 1000 mm).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum entries returned per requested scene section. | |
| cursor | No | Row offset from nextCursor, e.g. "100". Keep the same revision, detail and filters when paging. | |
| detail | No | Scene section to read; full combines all sections. | summary |
| objectIds | No | Filter by platform id ("obj_…"/"cam_…"/"lgt_…") | |
| projectId | Yes | Stable project ID returned by project_create or projects_list. | |
| revisionId | No | "HEAD" (default) uses the project's current head | HEAD |
| materialIds | No | Filter materials by stable mat_ IDs before pagination, independently of object filters. | |
| namePattern | No | Filter by Blender object NAME with * wildcards, e.g. "Tick_*". This is how you resolve the namePattern a copying operation reports back into ids. | |
| includeNodeGraphs | No | Read stored node graphs with detail=materials/full and exactly one materialId or limit=1. Includes counts and complete/truncated/unavailable status. | |
| excludeNamePattern | No | Drop objects whose name matches, e.g. "Studio_*". Applied after namePattern. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive. The description adds significant behavioral context: 'synchronous, no container' (performance expectation), pagination semantics (nextCursor continues while any collection has more rows), filtering interactions (object filters affect objects, cameras, lights; materialIds independent), node graph omission by default, and explicit unit declaration (metres, 1 unit = 1000 mm). No contradiction with annotations; the description enriches 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 description is long but each sentence adds value. It starts with the core purpose and detail enumeration, then moves to filters, pagination, node graphs, and units. It is densely packed but logically ordered; no fluff. A slightly more scannable format (e.g., bullet lists) would improve, but the prose is efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 10 parameters and no output schema, the description is remarkably complete. It covers every parameter's usage, edge cases (legacy/partial summaries explicitly report availability), pagination continuation, filtering independence, node graph behavior, and units. There are no evident gaps an agent would need to resolve elsewhere. It is self-sufficient and deeply integrated with the surrounding tool ecosystem.
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 parameters. The description goes far beyond: it explains that namePattern is the mechanism to resolve object.radial_array / object.array_along_curve names back to ids, clarifies that objectIds filter cameras/lights too, defines how limit/cursor page each entity type, and specifies that in full mode each collection uses the same offset/limit. It also explains the includeNodeGraphs requirement (one materialId or limit=1). This transforms raw parameter definitions into actionable knowledge.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Read a revision's scene from its stored structured summary.' It immediately lists the eight detail modes, making the scope explicit. This clearly distinguishes it from sibling tools like scene_apply or scene_script, which imply mutation, while this one is read-only.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage instructions: which detail mode to use for camera ids, lights, stats; how to filter with objectIds vs namePattern; how to resolve namePattern from copying operations; pagination rules; and the exact conditions for includeNodeGraphs. It even links to render_create's cameraId, demonstrating cross-tool awareness. Though it doesn't name a specific alternative tool, the usage is so detailed that an agent knows exactly when to use this tool and how.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_scriptRun Blender PythonADestructiveInspect
Run arbitrary Blender Python (bpy) against a base revision and commit the result as a new immutable revision. Policy-gated: an owner must enable scripting on the deployment first. Runs in a credential-free, network-restricted throwaway container; the runner loads the scene before your script and commits it after. Assign a JSON-serializable value to a variable named result to get it back in job_get result.scriptResult with full finite JSON retained in an immutable report up to 8 MiB. Use job_report section=report for complete stored bytes; non-JSON or oversized results are explicitly unavailable. The result variable is not predeclared: no assignment records hasResult=false, while result=None records hasResult=true with JSON null. print() output returns as result.scriptStdoutTail — both are returned in the job_get/job_wait text, so use them for introspection instead of encoding findings into object names. A script that raises commits NOTHING: the revision is only written after the whole script succeeds, so failures leave the base revision untouched. The runner evaluates the depsgraph before your first statement, so world transforms of pre-existing objects are correct on entry; objects your script CREATES keep an identity matrix_world until you call bpy.context.view_layer.update(), so measure world positions only after that call — otherwise obj.matrix_world reads zeros and any floor, bounds or framing number you derive from it is silently wrong. The environment is FIXED (Blender 5.2 LTS) — verify identifiers with docs_bpy_lookup (free, instant) instead of a probe job. Call docs_operations FIRST: the validated DSL already covers 298 operations including booleans, lathe, loft, UV unwrap, modifiers, materials, lights, cameras and render settings, and scene_apply is cheaper and safer for all of them. Reach for scripting only for shader node graphs, novel parametric generators, and computation.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Blender Python script to run in the isolated job; owner-enabled scripting is required. | |
| message | No | Short description saved with the resulting revision. | |
| readOnly | No | Run the script for its ANSWER and commit NOTHING: no revision, no head move, no thumbnail. `result` and print() output still come back. This is the right mode for a probe — measuring, raycasting, reading node state — and it is cheaper because it skips saving and summarising the scene. scene_apply already infers this for a batch that only reads; scripting had no equivalent, so a field build's four-ray occlusion probe committed a revision it did not want. Any scene edits the script makes are DISCARDED in this mode. | |
| projectId | Yes | Stable project ID returned by project_create or projects_list. | |
| baseRevisionId | No | "HEAD" (default) targets the project's current head. Mutations MUST build on the head: passing an older revision is rejected with REVISION_CONFLICT, since history is linear. To continue from an older scene, revision_restore it forward first. | HEAD |
| idempotencyKey | Yes | Stable caller-chosen key for safe retries of this same request. | |
| generatePreview | No | Whether to render a preview of the new revision after the script succeeds. |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses far more than the annotations (destructiveHint=true, etc.). It details failure semantics (scripts that raise commit nothing), the result variable contract (no assignment vs result=None), the depsgraph evaluation behavior and the matrix_world pitfall, the fixed Blender 5.2 environment, and the credential-free/network-restricted container. It even explains the 8 MiB report limit and the unavailability of non-JSON/oversized results. This is a model of behavioral transparency, with no contradiction to annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place. It is front-loaded with the core purpose and then systematically covers policy, runner behavior, result handling, failure semantics, depsgraph caveats, environment, and alternatives. The structure flows logically from invocation to expectations to troubleshooting, with no redundancy or filler. It is appropriately sized for a tool with this 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?
The description is exceptionally complete. Given the tool's complexity (arbitrary Python execution, immutability, failure modes, result retrieval), it covers everything an agent needs to call it correctly: the commit-on-success guarantee, how to get results via job_get, the depsgraph warning, the fixed environment, the readOnly probe mode, and the recommended alternative. It even addresses edge cases like oversized results and identity matrix_world. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description goes beyond the schema by explaining the semantics of key parameters in context. It elaborates on the readOnly parameter's effect (discards edits, returns result/print output), the baseRevisionId behavior (MUST build on HEAD, REVISION_CONFLICT, and revision_restore as a workaround), and the result variable mechanics that interact with the code parameter. It adds meaning that the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise statement of the tool's action: 'Run arbitrary Blender Python (bpy) against a base revision and commit the result as a new immutable revision.' It clearly identifies the verb, resource, and effect, and differentiates from scene_apply by explicitly noting that scene_apply covers 298 DSL operations and is cheaper/safer. This leaves no ambiguity about the tool's role among its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage guidance is explicit and prescriptive: it instructs to call docs_operations FIRST, lists the 298 covered operations, and states 'Reach for scripting only for shader node graphs, novel parametric generators, and computation.' It also explains the readOnly mode for probes and when it is appropriate. This is exemplary when-to-use/when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_snapshotSee the sceneARead-onlyIdempotentInspect
See the scene as an inline image, instantly — no render job. Default: a revision's stored thumbnail (every mutation with generatePreview creates one; omit revisionId for the head; scene_apply previewMaxSidePx can opt into a larger 384..1024px thumbnail). Pass artifactId instead to view any PNG artifact inline (a render_create result or a render_turntable frame). Snapshot after every mutation to verify visually before an expensive render. opticsObjectIds selects existing cached optical measurements; it does not resample the image. For a fresh targeted query without rendering, use scene_apply with scene.analyze_optics. Snapshot policy 2026-09-16: scene_snapshot reads a stored image; it does not render or regenerate it. New thumbnails use the active camera and preserve its aspect ratio with a default maximum side of 384px; scene_apply previewMaxSidePx can request 384..1024px at the same sample setting, with more compute for larger images. Without a camera they frame scene bounds. Lit scenes with transmission use 16-sample Cycles; other lit scenes use EEVEE. Unlit, unreadably dark or failed lit previews may fall back to Workbench for shape and base colour only. Historical thumbnails retain their original engine, size and framing. Read thumbnailEngine, thumbnailFraming, thumbnailSize and thumbnailOptics when available; unknown historical metadata is not inferred from this policy. Use render_create for fine detail, noise and final transmission quality. platform_status and docs_operations guide=true return this deployment's current snapshotPolicy on each call. Prefer those live results over a cached tool description. On connection and release changes, modern subscriptions/listen sends the requested, honored catalog notifications; legacy GET SSE sends tools, prompts and resources list_changed. Private/no-store responses and zero-TTL discovery metadata let compatible hosts rediscover automatically. The server cannot replace schemas retained by a host that ignores freshness signals or never subscribes. The policy version describes new generation behavior, not the age or settings of a stored image.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Required unless artifactId is given — the project whose scene to show | |
| artifactId | No | View any PNG artifact instead; mutually exclusive with projectId | |
| revisionId | No | With projectId; defaults to the project head | |
| opticsObjectIds | No | Filter cached per-object optics by ID; absent measurements remain unavailable. Does not change the image or compute new diagnostics. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only/idempotent, and the description adds substantial behavioral context beyond that: it 'reads a stored image; it does not render or regenerate it,' explains thumbnail fallbacks (Workbench for unlit/dark/failed lit previews), notes historical thumbnails retain original settings, and tells agents to read thumbnailEngine/Framing/Size/Optics metadata. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description front-loads the core purpose well, but then becomes overlong and drifts into unrelated subscription/SSE/discovery metadata: 'On connection and release changes, modern subscriptions/listen sends the requested...' and 'The server cannot replace schemas retained by a host...'. Information about scene_apply's previewMaxSidePx is also repeated. Several sentences do not earn their place for a tool-invocation definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description covers the output expectation ('inline image'), the main parameters and defaults, relevant behavioral policies (camera, lighting, engines, fallback, historical metadata), and sibling alternatives. It is complete enough for an agent to invoke scene_snapshot correctly in most contexts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by noting artifactId 'views any PNG artifact inline (a render_create result or a render_turntable frame)' and clarifying opticsObjectIds 'selects existing cached optical measurements; it does not resample the image.' These nuances go beyond the schema's description, though some parameter details are restated.
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 shows a stored scene or PNG artifact as an inline image, and explicitly contrasts with rendering ('no render job'). It clearly differentiates from siblings like render_create ('Use render_create for fine detail...') and artifact_get by framing this as an inline snapshot viewer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('Snapshot after every mutation to verify visually before an expensive render') and names alternatives with conditions: 'For a fresh targeted query without rendering, use scene_apply with scene.analyze_optics' and 'Use render_create for fine detail, noise and final transmission quality.' No ambiguity remains about when to choose this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_validateValidate sceneAInspect
Validate a revision against a profile; returns issues with codes, severities, and suggested candidate operations. Default: synchronous, from the stored scene summary. deep=true opens the scene in Blender for real mesh analysis (non-manifold, watertight, degenerate, overhangs) and returns a job handle (idempotencyKey required). General deep validation checks evaluated watertightness (open surfaces warn) and zero-area faces/zero-length edges (errors). additionalChecks can add interior_faces and uv_layers. The queued response states requested coverage; completed reports state actual object counts and skipped/partial checks, including pair-budget limits. intersectionMaxPairTriangleWork can raise cumulative pair work from 8 million to at most 64 million; time and memory caps stay fixed. Validation can be scoped with objectNamePattern/excludeNamePattern. intersectionMaxDepthSamples separately raises optional penetration sampling from 32,000 to at most 256,000 within the same time cap. Sampling completion is separate from candidate-pair coverage. resumeFrom with deep=true continues remaining depth samples on the source's exact revision/settings without repeating collision detection. Only the per-job depth sample budget may change; historical reports without checkpoints cannot resume. Repair suggestions can be alternatives: read suggestedOperationsMode and suggestedOperationsNote before applying them. job_get/job_wait return checked totals plus reportArtifactId. Use job_report with this jobId for complete summary totals and ordered issue/object/print-object pages or section=report for all JSON bytes. Inline details may be truncated; profile three_d_print carries a print report (dimensions mm, volume, filament estimate, bed fit). If a deep run does not give you what you need, mesh.analyze_quality is the SECOND route to the same class of measurement: it reports non_manifold, zero_area_faces, degenerate_edges, sharp_angles, stretched_uvs and interior_faces, and it runs INSIDE a scene_apply batch, so you can measure and repair in one job. A build whose deep validation returned nothing downloaded the GLB and wrote its own topology checker instead, because nothing said this existed.
| Name | Required | Description | Default |
|---|---|---|---|
| deep | No | ||
| profile | No | Default general; continuation inherits its source profile. | |
| projectId | Yes | Stable project ID returned by project_create or projects_list. | |
| resumeFrom | No | Completed source validation and immutable report; requires deep=true and a partial resumable depth checkpoint. | |
| revisionId | No | "HEAD" (default) uses the project's current head | |
| idempotencyKey | No | Stable caller-chosen key for safe retries of this same request. | |
| additionalChecks | No | Deep-only checks added to the profile: interior_faces tests faces whose every edge has more than two face users; uv_layers checks UV presence. Interior-face topology is not an exhaustive volumetric self-intersection test. | |
| objectNamePattern | No | Restrict validation to objects whose name matches, e.g. "Watch_*". Without this a studio backdrop is included in the print bounding box, reporting a 42 mm product as 1870 mm and making the three_d_print report unusable. | |
| excludeNamePattern | No | Drop objects whose name matches, e.g. "Studio_*". Applied after objectNamePattern. Use this when the parts you care about share no common prefix — which is the normal case for an assembly (Case_Body, Bezel_Ring, Dial_Plate, Crown…). Include-only filtering left no way to say "everything except the backdrop", so the backdrop's own open shell and its bounding box polluted every report and a field build hand-triaged 51 findings down to the 3 that were real. | |
| intersectionMaxDepthSamples | No | Deep-only optional penetration-depth sample budget, shared across detected pairs. Default 32,000; maximum 256,000. Sampling runs after surface-crossing detection and does not change candidate-pair coverage. The existing 20-second deadline and geometry caps still apply. Inspect depthSamplesComplete and each penetrationDepthStatus; a larger budget does not guarantee a depth witness or an exhaustive maximum. Scope objects with objectNamePattern/excludeNamePattern. When pair detection completed and the report contains a partial depth checkpoint, scene_validate.resumeFrom continues its remaining samples on the pinned revision. Otherwise a new scoped validation repeats the work. | |
| intersectionMaxPairTriangleWork | No | Deep-only cumulative intersection pair work: the sum of both objects' evaluated triangle counts for each checked pair. Default 8,000,000; maximum 64,000,000. A larger budget can complete more pairs using cached trees. The 20-second deadline, tree geometry and candidate storage limits remain fixed; optional depth samples have a separate intersectionMaxDepthSamples budget. The job's execution deadline still applies. Retry with a new idempotencyKey; this reruns the check rather than resuming it. Read actual coverage; raising this limit never guarantees a pass. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all default false, so the description carries the full burden of behavioral disclosure — and it delivers: sync-vs-async semantics, Blender opening for deep mode, idempotencyKey required for deep, queued vs completed report content, pair-budget and time caps, sampling completion separate from candidate-pair coverage, resume limitations ('historical reports without checkpoints cannot resume'), possible inline truncation, and the warning that repair suggestions can be alternatives. No contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long (~450 words) but nearly every sentence carries unique information for an 11-parameter tool with no annotations and no output schema. Purpose is front-loaded, and unlike under-specification, this is dense specification. It loses a point for being a wall of text with structural redundancy (budget figures repeated from the schema) rather than organized sections.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no meaningful annotations, this description must cover sync/async return shapes, how to retrieve complete results (job_get/job_wait, job_report with section=report), truncation caveats, budget limits, resume rules, repair-suggestion caveats, and the alternative route. It covers all of these, plus a 'what not to do' war story showing the failure mode it is designed to prevent. 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 91%, so the baseline is 3, but the description adds value beyond the schema for several parameters: deep=true's meaning (opens Blender, returns job handle), the practical failure modes for objectNamePattern/excludeNamePattern, the semantics of resumeFrom (continues remaining depth samples without repeating collision detection), and profile-specific output for three_d_print. Some restatement of numeric budgets duplicates the schema, but the added interpretive context justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource statement: 'Validate a revision against a profile; returns issues with codes, severities, and suggested candidate operations.' This names the resource (revision), the verb (validate), and the concrete output shape, and it is immediately distinguishable from siblings like scene_apply, scene_inspect, and mesh.analyze_quality, which the description explicitly contrasts with the primary route.
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 when/when-not guidance: default synchronous shallow path vs deep=true for Blender mesh analysis, when resumeFrom applies versus when a new scoped validation must be repeated, and when objectNamePattern/excludeNamePattern is needed (with concrete failure stories: a 42mm product reported as 1870mm; 51 findings hand-triaged to 3). It names an explicit alternative — 'mesh.analyze_quality is the SECOND route to the same class of measurement' — and tells the agent to read suggestedOperationsMode/suggestedOperationsNote before applying repairs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
texture_maps_createPrepare downloadable texture mapsAInspect
Prepare downloadable PBR maps from validated PNG/JPEG images without changing scene materials. Supplied maps win; derived relief/roughness are labeled approximations. Use material_from_maps to apply the completed package, material_from_image for a single-image material, or material_recipe for a procedural proposal. Returns a job: job_wait/job_get track completion; job_get.result.textureMaps contains map, ZIP, repeat-preview and manifest artifact IDs for artifact_get.
| Name | Required | Description | Default |
|---|---|---|---|
| roles | No | Unique output roles to deliver. With sourceAssetId, defaults include profile convenience maps; with supplied maps or a completed texture job, defaults to its supplied roles. Unsupported missing maps fail rather than being invented. | |
| options | No | Optional processing and material settings. Supplied maps take precedence over fallback generation; a reused texture job preserves its appearance settings unless overridden. | |
| profile | No | Processing intent: surface or supplied defaults a single sourceAssetId to base_color/roughness with opaque alpha; decal to base_color/opacity with blend alpha. Role-labeled map sets default to their supplied roles. Explicit roles/options override these defaults. | surface |
| projectId | Yes | Existing project in the bound deployment; owns the processing job and its artifacts. | |
| sourceMaps | No | Role-labeled validated images or texture artifacts, one per role and at most 12 unique images. Sources must share an aspect ratio. Do not combine with textureJobId. | |
| materialName | No | Name for the prepared material/package, 1-64 characters; default Image Material. | Image Material |
| sourceAssetId | No | Validated PNG/JPEG asset supplying base_color. Do not also supply a base_color entry in sourceMaps or combine with textureJobId. | |
| idempotencyKey | Yes | Stable caller-chosen key for this request. Reuse the same key and arguments for safe retries; change the key when changing inputs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly=false, destructive=false, openWorld=false), but the description adds real behavioral context: scene materials are untouched, supplied maps take precedence over derived ones, relief/roughness estimates are labeled approximations, and the result is an async job with map/ZIP/preview/manifest artifacts. One tension: idempotentHint=false while the description implies retry safety via idempotencyKey — mildly inconsistent, though not a flat contradiction of the safety 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?
Four dense sentences, front-loaded with the purpose before the sibling routing and the job/artifact workflow. No filler, though the routing sentence is a compressed list that slightly reduces readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter job-producing tool with nested options, the description covers purpose, routing, precedence rules, and the async completion path. Since an output schema exists, return details need not be enumerated, and the agent has everything required to invoke and follow up correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents every parameter, including defaults, enums, ranges and precedence rules (e.g. 'Supplied maps take precedence'). The description's only added semantic is the general precedence/resume note ('a reused texture job preserves its appearance settings unless overridden'), which the schema largely restates, 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?
States a specific verb+resource+scope: 'Prepare downloadable PBR maps from validated PNG/JPEG images without changing scene materials.' It explicitly distinguishes itself from material_from_maps, material_from_image, and material_recipe, so an agent can route 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?
Names three alternatives with the condition that selects each ('apply the completed package' vs 'single-image material' vs 'procedural proposal'), and describes the downstream job-tracking path. It does not state explicit when-not-to-use conditions beyond the alternative routing, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_completeComplete uploadAInspect
Finalize bytes sent to the signed PUT URL from upload_create: verify size/checksum, quarantine the asset and queue validation. Returns uploadId, assetId and quarantined/validated/rejected status; call again with the same uploadId to check deferred validation. Only validated assets may be used by asset_import or material tools. This does not import into a scene or return a Blender job.
| Name | Required | Description | Default |
|---|---|---|---|
| checksum | No | Expected SHA-256 checksum of the uploaded file, when supplied. | |
| uploadId | Yes | Upload handle returned by upload_create. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| assetId | Yes | |
| uploadId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (non-read-only, non-destructive, non-idempotent), and the description adds real substance beyond them: size/checksum verification, quarantine, deferred validation, and the quarantined/validated/rejected status set. The only slight ambiguity is that 'call again with the same uploadId' reads like a safe polling re-invocation while the annotations declare idempotentHint=false; not a contradiction, but the retry/polling semantics could be stated more sharply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the action and followed by returns and constraints; little waste. It is slightly packed, bundling lifecycle, return values, and exclusions into one breath, but every clause carries information the agent needs.
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 two-parameter mutation tool with rich annotations and an output schema, the description supplies the pipeline context, the status outcomes, and the reuse/polling rule. Nothing needed to invoke 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 description coverage is 100%, so both parameters are already documented and the baseline is 3. The description usefully ties uploadId back to upload_create and frames checksum as the verification input, but adds no format or syntax beyond the schema's SHA-256 pattern.
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 ('finalize bytes sent to the signed PUT URL'), names its predecessor (upload_create), and explicitly contrasts itself with siblings it is not (asset_import, material tools, scene import, Blender jobs). An agent can place it precisely in the upload pipeline without opening another 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 explicit sequencing: call after upload_create, call again with the same uploadId to poll deferred validation, and only use the asset downstream once validated. It also names exclusions ('does not import into a scene or return a Blender job'), which is exactly the when-not guidance that prevents misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_createCreate uploadAInspect
Create a direct upload handle for an asset file. Returns an expiring authorized PUT URL. Allowed: .blend .glb .gltf .obj .stl .png .jpg .jpeg .ttf .otf .woff .woff2. Use purpose=font for a typeface, then asset_import it — the font becomes a datablock this project's text.create/text.set_font can name, which is the only way to get branded lettering onto a dial or a label (the built-in Bfont is otherwise the only option).
| Name | Required | Description | Default |
|---|---|---|---|
| sha256 | No | Optional SHA-256 checksum of the file bytes. | |
| purpose | No | How the validated asset will be used: import, texture, or font. | asset_import |
| byteSize | Yes | Exact file size in bytes before upload. | |
| filename | Yes | Original filename, including a supported extension. | |
| projectId | No | Stable project ID returned by project_create or projects_list. | |
| contentType | Yes | MIME type to send with the raw upload bytes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| method | Yes | |
| headers | Yes | |
| uploadId | Yes | |
| expiresAt | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses key behavior: the URL is expiring and authorized, and the tool only creates a handle rather than performing the upload itself. It also lists allowed extensions. Annotations already indicate non-read-only, but the description adds meaningful context about the expiring URL and the purpose-specific flow.
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 concise and front-loaded with the core behavior. The font explanation is a bit lengthy but earns its place by clarifying a non-obvious workflow. No redundant filler; each sentence contributes distinct 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?
Given an output schema exists (covering return values) and annotations convey the mutation nature, the description covers the essential behavior: creating an expiring PUT URL, allowed extensions, and the font-specific flow. It doesn't mention the subsequent upload_complete step, but that is a workflow detail arguably outside this tool's own description. Overall, it is complete enough 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 parameters are already documented. The description adds semantic value by explaining the purpose=font workflow and explicitly tying it to asset_import, which goes beyond the enum descriptions. It also relates allowed extensions to filename, reinforcing the schema's 'supported extension' 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?
The description clearly states 'Create a direct upload handle' — a specific verb, resource, and target. It also describes the output ('expiring authorized PUT URL'), which distinguishes it from siblings like upload_complete and asset_import. The allowed extensions list further scopes the tool's purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear workflow for fonts ('Use purpose=font for a typeface, then asset_import it') and implies general use cases for other asset types. It doesn't explicitly list when not to use this tool or name alternatives, but the context is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vegetation_createCreate a native plant modelAInspect
Author a procedural plant with ngPlant in an empty ngplant project. Use explicit baseRevisionId, bounded template controls and a stable idempotency key. Blender packages GLB/OBJ/STL/blend outputs. Returns a durable job; poll job_get/job_wait and use vegetation_inspect after commit.
| Name | Required | Description | Default |
|---|---|---|---|
| recipe | Yes | ||
| projectId | Yes | ||
| baseRevisionId | Yes | ||
| idempotencyKey | Yes | Caller-chosen key. Replaying it with IDENTICAL input returns the EXISTING job instead of queueing a second one — a restarted driver adopts its own in-flight work rather than duplicating or orphaning it. Vary the key to force a new job. Full semantics: the same key with DIFFERENT input is rejected with IDEMPOTENCY_CONFLICT (never silently replayed, so a stale result cannot be mistaken for a fresh one). A key is recorded only once a job is actually created, so a request rejected beforehand (validation, APPROVAL_REQUIRED, quota) leaves the key unused and free to reuse. A key bound to a job keeps resolving to that job even after it fails or is cancelled — use a NEW key to genuinely retry cancelled work. Keys live 48 hours and are scoped per principal+deployment+operation, which means they SPAN SESSIONS: a plain descriptive key like "hero-final-1024-v1" will collide with your own run from yesterday and be rejected. Include a project id or a timestamp. This scope used to be stated only in the conflict error, i.e. after the round trip it cost — a field build lost two that way, ~34 hours after unrelated work had taken the same names. | |
| generatePreview | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | Yes | |
| deduped | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give the safety profile (write, non-destructive, non-idempotent, closed-world), and the description adds genuinely new behavior: it returns a durable job rather than a finished asset, Blender packages GLB/OBJ/STL/blend outputs, and idempotency-key replay adopts existing work. The 'stable idempotency key' framing sits slightly at odds with idempotentHint=false, but it reads as scoped idempotency rather than a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, purpose front-loaded, each sentence adding a distinct fact (what it does, what to supply, how to follow up). No filler, though the follow-up sentence packs return-handling and polling together and could be split for 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?
For a complex, async, multi-template creation tool with an output schema present, the description covers the job lifecycle, the output packaging, and the idempotency contract, so an agent can call it and handle the result. The remaining gap is the recipe itself and generatePreview, which is meaningful but not fatal since the schema enumerates them.
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 only 20%, so the description must carry the load, and it compensates for baseRevisionId ('explicit') and the idempotency key ('stable') and gestures at recipe bounds ('bounded template controls'). However it says nothing about the six templateId variants, the seed/color/detail fields, or the generatePreview default, leaving the largest parameter effectively unexplained beyond the raw 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 ('Author a procedural plant with ngPlant') and adds a scoping constraint ('in an empty ngplant project'), which implicitly distinguishes it from vegetation_edit. It does not name any sibling explicitly, so an agent must infer the create-vs-edit split, but the purpose itself is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies a real usage condition ('empty ngplant project') and a post-call workflow ('poll job_get/job_wait and use vegetation_inspect after commit'), which tells the agent how the tool fits between siblings. It stops short of naming when to prefer vegetation_edit or the alternatives, so no explicit exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vegetation_editEdit the saved native plant modelADestructiveInspect
Regenerate an existing saved ngPlant model using its authenticated native .ngp graph. Supported fields come from recipe; branchDepth is fixed by the saved graph. Explicit immutable base revision and stable idempotency key required. Returns a durable job; inspection reports saved effective values.
| Name | Required | Description | Default |
|---|---|---|---|
| recipe | Yes | ||
| projectId | Yes | ||
| baseRevisionId | Yes | ||
| idempotencyKey | Yes | Caller-chosen key. Replaying it with IDENTICAL input returns the EXISTING job instead of queueing a second one — a restarted driver adopts its own in-flight work rather than duplicating or orphaning it. Vary the key to force a new job. Full semantics: the same key with DIFFERENT input is rejected with IDEMPOTENCY_CONFLICT (never silently replayed, so a stale result cannot be mistaken for a fresh one). A key is recorded only once a job is actually created, so a request rejected beforehand (validation, APPROVAL_REQUIRED, quota) leaves the key unused and free to reuse. A key bound to a job keeps resolving to that job even after it fails or is cancelled — use a NEW key to genuinely retry cancelled work. Keys live 48 hours and are scoped per principal+deployment+operation, which means they SPAN SESSIONS: a plain descriptive key like "hero-final-1024-v1" will collide with your own run from yesterday and be rejected. Include a project id or a timestamp. This scope used to be stated only in the conflict error, i.e. after the round trip it cost — a field build lost two that way, ~34 hours after unrelated work had taken the same names. | |
| generatePreview | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | Yes | |
| deduped | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, and the description adds real context beyond them: branchDepth is fixed by the saved graph, supported fields come from the recipe, a durable job is returned, and an immutable base revision plus idempotency key are mandatory. It does not state explicitly what prior model state gets destroyed, and the caller-driven idempotency-key behavior sits at odds with idempotentHint=false, though that hint refers to natural idempotency rather than the key mechanism.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the action and the model being modified, then the constraints, then the return type. Every sentence carries information; nothing is padded.
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 the returned effective values, and it correctly points at inspection for them. Given the complex six-variant recipe schema and the destructive mutation, the description covers the critical operational constraints, though it omits explicit sibling routing.
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 only 20%, so the description must carry weight; it partially does by noting that recipe supplies the supported fields and that branchDepth is fixed, but projectId and generatePreview are never explained and the recipe's six template variants and field ranges are left entirely 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?
Specific verb+resource: 'Regenerate an existing saved ngPlant model using its authenticated native .ngp graph' clearly identifies the operation on a saved model, and 'existing saved' implicitly separates it from vegetation_create. The description is clear but never names or contrasts a sibling tool, so it falls short of the top band.
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 prerequisites (an existing saved model, immutable base revision, idempotency key) but never says when to choose this over vegetation_create, vegetation_inspect, or vegetation_templates. Usage is implied by 'existing saved' rather than explicitly scoped.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vegetation_inspectInspect saved native vegetationARead-onlyIdempotentInspect
Read the immutable committed ngPlant inspection report, verified against saved native document bytes and packaging provenance. Reports effective saved seed/group fields rather than caller recipe. Requires exact revision; no generation or compute.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | ||
| revisionId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| report | Yes | |
| projectId | Yes | |
| revisionId | Yes | |
| engineVersion | Yes | |
| nativeDocument | Yes | |
| executionEngine | Yes | |
| packagingVersion | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds valuable behavior beyond that: the report is immutable and committed, it is verified against saved document bytes and packaging provenance, and it surfaces effective saved seed/group fields rather than caller-supplied recipe values. Only the exact-revision requirement is stated without detail on failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with the core read action and its authoritative-source nature front-loaded. No filler, though 'packaging provenance' and 'effective saved seed/group fields' are compressed enough to be slightly opaque.
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, return values need not be explained, and annotations cover the safety profile. For a two-parameter read tool the description is nearly complete; the only gap is projectId semantics and the exact-revision prerequisite is asserted without stating what happens on a mismatch.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for both parameters, so the description must carry the meaning. It does clarify that revisionId must be an exact committed revision, but projectId is never addressed and no format or identifier semantics are given. Partial compensation caps this at 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?
The description gives a specific verb ('Read') and resource ('immutable committed ngPlant inspection report'), and clarifies it reports saved state rather than a caller recipe, which implicitly separates it from vegetation_create/vegetation_edit. It never names a sibling explicitly, so it does not fully earn a 5, and terms like 'packaging provenance' are jargon-heavy.
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?
'Requires exact revision; no generation or compute' tells the agent a prerequisite and rules out generation behavior, which is genuine usage context. However, it never states when to prefer this over siblings such as vegetation_edit or scene_inspect, leaving the routing decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vegetation_templatesFind procedural vegetation templatesBRead-onlyIdempotentInspect
Discover ngPlant plant/vegetation templates and bounded controls in pages of 1–24. Only broadleaf, shrub and reedlike grass can be qualified for the current production image; conifer/palm/fern remain unavailable. ngPlant authors plants; Blender packages standard previews and outputs.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| entries | Yes | |
| nextOffset | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely new behavioral context: page size bounds of 1–24 and a hard availability constraint (conifer/palm/fern unavailable), plus the division of labor between ngPlant authoring and Blender packaging.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the resource and page bound front-loaded, and no filler. The ngPlant/Blender sentence is the least essential but still adds authoring context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return format need not be described, and annotations carry the safety profile. What remains under-covered is how to actually drive the search — the query and offset parameters get no treatment anywhere, which matters for a three-parameter discovery tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and none of the three parameters (limit, query, offset) are documented in the schema. The description only gestures at pagination ('pages of 1–24'), leaving the meaning and syntax of query and offset unexplained, so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (discover) and resource (ngPlant vegetation templates) and distinguishes itself from the vegetation_create/edit/inspect siblings as a browsing tool. The phrase 'bounded controls' is vague, but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains which template categories are usable for the current production image and which are unavailable, which implies the useful scope of a search. However, it never states when to reach for this tool versus vegetation_create, vegetation_inspect, or assets_search, so the routing guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webhooks_deleteDelete a webhookADestructiveInspect
Delete an organization webhook registration, stopping future deliveries to that registered endpoint. Requires owner/admin with deployments:admin. Use webhooks_list to find the ID, or webhooks_set to register a URL and event selection. Deletion removes the registration; adding it again requires a new registration. Returns deleted=true; a missing ID is an error.
| Name | Required | Description | Default |
|---|---|---|---|
| webhookId | Yes | Webhook ID to remove from this deployment. |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: it specifies permission requirements, operational impact ('stopping future deliveries'), irreversibility ('adding it again requires a new registration'), and error semantics for a missing ID. These details go well beyond the destructive and non-idempotent hints already present in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four compact sentences, front-loads the core action, then covers permissions, alternatives, and consequences. Every sentence adds useful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the destructive annotations, rich output schema, and 100% parameter coverage, the description is complete enough for correct invocation. It covers safety, permissions, alternatives, consequences, and error behavior, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already fully documents the single webhookId parameter. The description mentions finding the ID and missing-ID errors but does not add format, validation, or usage details beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Delete an organization webhook registration'), including its scope and effect. It distinguishes the tool from siblings by naming webhooks_list and webhooks_set as alternatives for related tasks.
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 when-to-use context, prerequisite permissions ('Requires owner/admin with deployments:admin'), and explicit sibling alternatives for finding the ID or registering a webhook. This leaves little for an agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webhooks_listList webhooksARead-onlyIdempotentInspect
List registered webhooks with delivery health (secrets are never returned).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint as false, establishing a safe read operation. The description adds a critical behavioral detail—'secrets are never returned'—which is beyond what annotations provide and is important for security expectations. This enriches the agent's understanding of the tool's guarantees.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly crafted sentence. It front-loads the core action ('List registered webhooks') and then appends the additional useful qualifiers ('with delivery health', 'secrets are never returned') without any fluff. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity—no parameters, no required fields, and an existing output schema—the description is sufficient. It conveys the essential purpose and the key security constraint. Since the output schema exists, the description does not need to detail return structure, and nothing needed to call the tool 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?
The tool accepts zero parameters, so there is nothing to explain. Per the rubric, 0 params yields a baseline score of 4. The description does not need to add parameter semantics since the schema is empty and coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List', the resource 'webhooks', and adds specific context: 'with delivery health' and the security note that secrets are never returned. This distinguishes it from sibling tools like webhooks_set and webhooks_delete without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is given on when to use this tool versus alternatives. It does not mention that webhooks_set is for creating or that webhooks_delete is for removal, nor any situational context. The usage is implied by the verb 'List' but there is no direct comparison or exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webhooks_setRegister a webhookADestructiveInspect
Register an https URL to receive job lifecycle events (job.completed / job.failed / job.cancelled) as HMAC-signed POSTs — push instead of polling. The whsec_ signing secret is returned ONCE; verify sceneplane-signature: t=<ms>,v1=hmac_sha256(secret, "<t>.<body>"). Requires owner/admin.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | HTTPS endpoint that receives signed terminal job events. | |
| events | No | Job event types to deliver to this webhook. |
Output Schema
| Name | Required | Description |
|---|---|---|
| events | Yes | |
| secret | Yes | |
| webhookId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite metadata annotations indicating destructiveness, the description adds valuable behavioral context: the signing secret is returned only once, and it explains the exact signature verification format. It also notes the owner/admin permission, which is beyond what annotations provide. No contradiction with annotations is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no fluff. The primary purpose is stated first, followed by crucial security details and permission context. Every clause delivers specific information, making it efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (not shown) and annotations, the description covers all critical operational aspects: what events are delivered, how the signature is verified, and the one-time secret exposure. It does not explicitly mention potential side effects (e.g., overwriting an existing webhook), but this is partly covered by the destructiveHint annotation. Overall, it is complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are well-documented in the schema itself (url and events with defaults and enums). The tool description only adds a minor clarification (https requirement) and does not meaningfully compensate for any schema gaps, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Register'), a specific resource ('an https URL'), and the exact purpose: receiving job lifecycle events via HMAC-signed POSTs, explicitly contrasting with polling. It clearly distinguishes itself from siblings like webhooks_delete and webhooks_list by describing the action of registration.
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 implicitly communicates when to use this tool ('push instead of polling') and mentions the permission requirement ('Requires owner/admin'). It does not explicitly state when not to use it or name alternatives, but the context is clear enough for an agent to decide between setting a webhook and polling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webhook_testSend a test webhook eventAInspect
POST a signed synthetic event ({event: "webhook.test"}) to a registered webhook and report the receiver's HTTP status. Requires owner/admin.
| Name | Required | Description | Default |
|---|---|---|---|
| webhookId | Yes | Webhook ID returned by webhooks_set or webhooks_list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| delivered | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the description doesn't need to restate those. It adds useful behavioral context: the event is signed, synthetic, and the tool reports the receiver's HTTP status. It also discloses the permission requirement (owner/admin), which is valuable beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, dense sentence that front-loads the action, includes the payload example, and ends with the permission requirement. Every clause earns its place; no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with a full output schema and clear annotations, the description is nearly complete. It covers the action, payload, permission, and outcome. The only minor gap is not describing what happens on failure (e.g., non-2xx status), but the output schema likely covers that.
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 webhookId well. The description adds context by explaining the webhookId is for a registered webhook and that the event is sent to it, but it doesn't need to add more since there's only one parameter and the schema covers it fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (POST a signed synthetic event), the resource (a registered webhook), and the expected outcome (report the receiver's HTTP status). It also includes the event payload shape and permission requirement, making it unambiguous and distinguishable from sibling webhook tools like webhooks_set or webhooks_delete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: to test a registered webhook by sending a synthetic event. It doesn't explicitly name alternatives or exclusions, but the sibling context (webhooks_set, webhooks_list, webhooks_delete) makes the use case clear. A brief 'use this to verify a webhook endpoint' would have made it fully explicit.
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
projects_list1 field changed- changed
Input schema / properties / nameFilter / descriptionPrevious value: -"Optional project-name filter."New value: +"Optional literal project-name substring (ASCII case-insensitive); %, _ and quotes match literally."
6 tool updates
- Changed
export_create12 fields changed- removed
Input schema / properties / applyModifiers / defaultRemoved value: -true - removed
Input schema / properties / bakeLighting / defaultRemoved value: -false - removed
Input schema / properties / bakeObjectLimit / defaultRemoved value: -24 - removed
Input schema / properties / bakeObjectLimit / descriptionRemoved value: -"Maximum eligible GLB objects to bake. Default 24; raise up to 512 for assemblies. The per-job budget is 67,108,864 object texture pixels: 446 objects fit at bakeSize=256." - removed
Input schema / properties / bakeOverflow / defaultRemoved value: -"error" - removed
Input schema / properties / bakeOverflow / descriptionRemoved value: -"When eligible objects exceed bakeObjectLimit, error stops before any bake. partial explicitly permits an incomplete bake while retaining all selected geometry; exportVerification.bakeSummary reports completed and omitted counts." - removed
Input schema / properties / bakeSize / defaultRemoved value: -1024 - removed
Input schema / properties / bakeTextures / defaultRemoved value: -true - changed
Input schema / properties / format / enumPrevious value: -[ - "glb", - "obj", - "stl", - "blend" -]New value: +[ + "glb", + "obj", + "stl", + "blend", + "ngp" +] - removed
Input schema / properties / scaleFactor / defaultRemoved value: -1 - removed
Input schema / properties / selectionPolicy / defaultRemoved value: -"all" - removed
Input schema / properties / yUp / defaultRemoved value: -true
- Changed
project_create1 field changed- added
Input schema / properties / executionEngineAdded value: +{ + "default": "blender", + "description": "Use ngplant for plants/vegetation; Blender packages standard outputs. Default blender preserves ordinary scene authoring.", + "enum": [ + "blender", + "ngplant" + ], + "type": "string" +}
- Added
vegetation_create - Added
vegetation_edit - Added
vegetation_inspect - Added
vegetation_templates
1 tool update
- Changed
project_create1 field changed- changed
Input schema / properties / template / enumPrevious value: -[ - "empty", - "product_studio", - "three_point_lighting", - "low_poly", - "print_ready" -]New value: +[ + "empty", + "product_studio", + "three_point_lighting", + "low_poly", + "print_ready", + "starter_planter", + "starter_crate", + "starter_scale_block" +]
6 tool updates
- Changed
asset_import5 fields changed- added
Input schema / properties / assetId / descriptionAdded value: +"Validated ast_… asset ID returned by upload_complete; quarantined or rejected uploads cannot be imported." - added
Input schema / properties / format / descriptionAdded value: +"Uploaded file format. auto (default) sniffs file bytes; specify gltf or stl explicitly for those formats. font covers supported uploaded font files." - added
Input schema / properties / placement / descriptionAdded value: +"Requested placement policy; currently both values preserve importer-native transforms. Neither recenters the asset or moves it to the scene cursor." - added
Input schema / properties / targetCollection / descriptionAdded value: +"Existing destination collection name or ID, up to 64 characters. If absent or not found, importer collection links are preserved." - added
Input schema / properties / unitPolicy / descriptionAdded value: +"Requested unit convention; currently reserved, with importer-native units preserved for either value. Inspect dimensions and scale explicitly after import."
- Changed
deployment_policy_update9 fields changed- added
Input schema / properties / approvalRequiredForRestore / descriptionAdded value: +"Whether revision_restore must obtain interactive approval before replacing the current scene head. Omit to preserve the existing setting." - added
Input schema / properties / dangerousScriptingEnabled / descriptionAdded value: +"Owner-only switch for scene_script arbitrary Blender Python. True enables scripting; false disables it. Omit to leave the existing security policy unchanged." - added
Input schema / properties / jobTimeoutSeconds / descriptionAdded value: +"Execution timeout per job in seconds, 10-3600, additionally bounded by the account plan." - added
Input schema / properties / maxConcurrentJobs / descriptionAdded value: +"Concurrent worker/job limit for this deployment, 1-20, subject to the account plan. Raising this does not bypass shared account quotas." - added
Input schema / properties / maxOperationsPerMutation / descriptionAdded value: +"Maximum scene_apply operations per batch, 1-128. Omit to preserve the current batch limit." - added
Input schema / properties / maxQueuedJobs / descriptionAdded value: +"Maximum queued jobs for this deployment, 1-200, subject to the account plan; a full queue rejects new submissions." - added
Input schema / properties / renderMaxHeight / descriptionAdded value: +"Maximum render height in pixels, 16-4096, additionally capped by the account plan." - added
Input schema / properties / renderMaxSamples / descriptionAdded value: +"Maximum render samples, 1-4096, additionally capped by the account plan." - added
Input schema / properties / renderMaxWidth / descriptionAdded value: +"Maximum render width in pixels, 16-4096, additionally capped by the account plan."
- Changed
image_prompt_assist1 field changed- added
Input schema / properties / requestedMapRoles / items / descriptionAdded value: +"Semantic map role; use one source per role. Color maps and scalar/vector data maps are interpreted differently."
- Changed
material_from_image23 fields changed- added
Input schema / properties / options / properties / alphaCutoff / descriptionAdded value: +"Mask-mode alpha threshold, 0-1; default 0.5. Ignored by opaque/blend modes." - added
Input schema / properties / options / properties / alphaMode / descriptionAdded value: +"Material opacity behavior. Default opaque, or blend for decal profile; delivered PNG alpha is preserved regardless." - added
Input schema / properties / options / properties / displacementMode / descriptionAdded value: +"How the material uses height: none (default), shader bump, or displacement. A height map must be available; renderer/export support varies." - added
Input schema / properties / options / properties / emissionStrength / descriptionAdded value: +"Material emission multiplier, 0-10000; default 1 when emission is requested, otherwise 0. Requires an emission output to light the material." - added
Input schema / properties / options / properties / heightMidlevel / descriptionAdded value: +"Height value representing zero displacement, 0-1; default 0.5." - added
Input schema / properties / options / properties / heightScale / descriptionAdded value: +"Relief height in meters, 0-1; default 0.001. Used for height-derived normals and material bump/displacement." - added
Input schema / properties / options / properties / heightSource / descriptionAdded value: +"If no height map is supplied, explicitly allow height estimation from base_color luminance or alpha. Default none; estimated relief is labeled heuristic." - added
Input schema / properties / options / properties / maxSize / descriptionAdded value: +"Maximum output side in pixels, 8-4096; default 2048. Sources are aligned at their common aspect ratio without upscaling." - added
Input schema / properties / options / properties / metallic / descriptionAdded value: +"Constant metallic fallback, 0-1; default 0. Supplied metallic maps take precedence; brightness does not establish metalness." - added
Input schema / properties / options / properties / normalConvention / descriptionAdded value: +"Convention of supplied normal maps: OpenGL +Y (default) or DirectX -Y. A change to output convention flips the green channel." - added
Input schema / properties / options / properties / normalStrength / descriptionAdded value: +"Normal intensity multiplier, 0-16; default 1. Applied when converting supplied vectors or deriving normals from height." - added
Input schema / properties / options / properties / outputNormalConvention / descriptionAdded value: +"Convention for delivered normal maps, OpenGL +Y by default or DirectX -Y; the Blender material compensates for the output convention." - added
Input schema / properties / options / properties / packing / descriptionAdded value: +"Optional extra packed PNG: ORM uses red=ambient occlusion, green=roughness, blue=metallic; default none. Missing AO uses a documented white fallback." - added
Input schema / properties / options / properties / physicalCoverageMeters / descriptionAdded value: +"Real dimensions of one UV tile for height-to-normal scaling. If omitted, derived relief normals assume a one-meter UV square." - added
Input schema / properties / options / properties / physicalCoverageMeters / properties / height / descriptionAdded value: +"Physical height in meters represented by one complete texture tile; positive, at most 100000." - added
Input schema / properties / options / properties / physicalCoverageMeters / properties / width / descriptionAdded value: +"Physical width in meters represented by one complete texture tile; positive, at most 100000." - added
Input schema / properties / options / properties / roughness / descriptionAdded value: +"Constant roughness fallback, 0-1; default 0.65. A supplied roughness map or converted gloss map takes precedence." - added
Input schema / properties / options / properties / roughnessMode / descriptionAdded value: +"Fallback roughness generation: constant (default) or an explicitly requested base_color brightness estimate. Image-derived roughness is heuristic, not measured." - added
Input schema / properties / options / properties / roughnessRange / descriptionAdded value: +"[minimum, maximum] roughness for image estimates, increasing within 0-1; default [0.35, 0.85]." - added
Input schema / properties / options / properties / seamMode / descriptionAdded value: +"Analyze edges only (default) or blend edge pixels along tile axes. Blending changes imagery and may cause ghosting; inspect the repeat preview." - added
Input schema / properties / options / properties / specular / descriptionAdded value: +"Constant specular fallback, 0-1; default 0.5. Supplied specular maps take precedence." - added
Input schema / properties / options / properties / tile / descriptionAdded value: +"Texture axes to treat as periodic for relief and seam handling; default none. Does not guarantee perceptually seamless repetition." - added
Input schema / properties / roles / items / descriptionAdded value: +"Semantic map role; use one source per role. Color maps and scalar/vector data maps are interpreted differently."
- Changed
material_from_maps44 fields changed- added
Input schema / properties / applyToObjects / descriptionAdded value: +"Existing mesh object IDs to assign at slot zero, replacing that slot's material. Empty creates an unassigned material. Use assignments instead for explicit slots; maximum 50 objects." - added
Input schema / properties / assignments / descriptionAdded value: +"Explicit unique object/slot targets, maximum 50. Replaces existing slot assignments; mutually exclusive with nonempty applyToObjects." - added
Input schema / properties / assignments / items / properties / objectId / descriptionAdded value: +"Existing mesh object ID from scene_inspect. All targets are validated before any assignment." - added
Input schema / properties / assignments / items / properties / slotIndex / descriptionAdded value: +"Zero-based material slot to replace, 0-255. Slot zero may be created on an object with no materials; other slots must already exist." - added
Input schema / properties / baseRevisionId / descriptionAdded value: +"Current project head to mutate, or HEAD (default). A stale revision fails with REVISION_CONFLICT; refresh project_get before retrying." - changed
Input schema / properties / idempotencyKey / descriptionPrevious value: -"Caller-chosen key. Replaying it with IDENTICAL input returns the EXISTING job instead of queueing a second one — a restarted driver adopts its own in-flight work rather than duplicating or orphaning it. Vary the key to force a new job. Full semantics: the same key with DIFFERENT input is rejected with IDEMPOTENCY_CONFLICT (never silently replayed, so a stale result cannot be mistaken for a fresh one). A key is recorded only once a job is actually created, so a request rejected beforehand (validation, APPROVAL_REQUIRED, quota) leaves the key unused and free to reuse. A key bound to a job keeps resolving to that job even after it fails or is cancelled — use a NEW key to genuinely retry cancelled work. Keys live 48 hours and are scoped per principal+deployment+operation, which means they SPAN SESSIONS: a plain descriptive key like \"hero-final-1024-v1\" will collide with your own run from yesterday and be rejected. Include a project id or a timestamp. This scope used to be stated only in the conflict error, i.e. after the round trip it cost — a field build lost two that way, ~34 hours after unrelated work had taken the same names."New value: +"Stable caller-chosen key for this request. Reuse the same key and arguments for safe retries; change the key when changing inputs." - added
Input schema / properties / materialName / descriptionAdded value: +"Name for the prepared material/package, 1-64 characters; default Image Material." - added
Input schema / properties / options / descriptionAdded value: +"Optional processing and material settings. Supplied maps take precedence over fallback generation; a reused texture job preserves its appearance settings unless overridden." - added
Input schema / properties / options / properties / alphaCutoff / descriptionAdded value: +"Mask-mode alpha threshold, 0-1; default 0.5. Ignored by opaque/blend modes." - added
Input schema / properties / options / properties / alphaMode / descriptionAdded value: +"Material opacity behavior. Default opaque, or blend for decal profile; delivered PNG alpha is preserved regardless." - added
Input schema / properties / options / properties / displacementMode / descriptionAdded value: +"How the material uses height: none (default), shader bump, or displacement. A height map must be available; renderer/export support varies." - added
Input schema / properties / options / properties / emissionStrength / descriptionAdded value: +"Material emission multiplier, 0-10000; default 1 when emission is requested, otherwise 0. Requires an emission output to light the material." - added
Input schema / properties / options / properties / heightMidlevel / descriptionAdded value: +"Height value representing zero displacement, 0-1; default 0.5." - added
Input schema / properties / options / properties / heightScale / descriptionAdded value: +"Relief height in meters, 0-1; default 0.001. Used for height-derived normals and material bump/displacement." - added
Input schema / properties / options / properties / heightSource / descriptionAdded value: +"If no height map is supplied, explicitly allow height estimation from base_color luminance or alpha. Default none; estimated relief is labeled heuristic." - added
Input schema / properties / options / properties / maxSize / descriptionAdded value: +"Maximum output side in pixels, 8-4096; default 2048. Sources are aligned at their common aspect ratio without upscaling." - added
Input schema / properties / options / properties / metallic / descriptionAdded value: +"Constant metallic fallback, 0-1; default 0. Supplied metallic maps take precedence; brightness does not establish metalness." - added
Input schema / properties / options / properties / normalConvention / descriptionAdded value: +"Convention of supplied normal maps: OpenGL +Y (default) or DirectX -Y. A change to output convention flips the green channel." - added
Input schema / properties / options / properties / normalStrength / descriptionAdded value: +"Normal intensity multiplier, 0-16; default 1. Applied when converting supplied vectors or deriving normals from height." - added
Input schema / properties / options / properties / outputNormalConvention / descriptionAdded value: +"Convention for delivered normal maps, OpenGL +Y by default or DirectX -Y; the Blender material compensates for the output convention." - added
Input schema / properties / options / properties / packing / descriptionAdded value: +"Optional extra packed PNG: ORM uses red=ambient occlusion, green=roughness, blue=metallic; default none. Missing AO uses a documented white fallback." - added
Input schema / properties / options / properties / physicalCoverageMeters / descriptionAdded value: +"Real dimensions of one UV tile for height-to-normal scaling. If omitted, derived relief normals assume a one-meter UV square." - added
Input schema / properties / options / properties / physicalCoverageMeters / properties / height / descriptionAdded value: +"Physical height in meters represented by one complete texture tile; positive, at most 100000." - added
Input schema / properties / options / properties / physicalCoverageMeters / properties / width / descriptionAdded value: +"Physical width in meters represented by one complete texture tile; positive, at most 100000." - added
Input schema / properties / options / properties / roughness / descriptionAdded value: +"Constant roughness fallback, 0-1; default 0.65. A supplied roughness map or converted gloss map takes precedence." - added
Input schema / properties / options / properties / roughnessMode / descriptionAdded value: +"Fallback roughness generation: constant (default) or an explicitly requested base_color brightness estimate. Image-derived roughness is heuristic, not measured." - added
Input schema / properties / options / properties / roughnessRange / descriptionAdded value: +"[minimum, maximum] roughness for image estimates, increasing within 0-1; default [0.35, 0.85]." - added
Input schema / properties / options / properties / seamMode / descriptionAdded value: +"Analyze edges only (default) or blend edge pixels along tile axes. Blending changes imagery and may cause ghosting; inspect the repeat preview." - added
Input schema / properties / options / properties / specular / descriptionAdded value: +"Constant specular fallback, 0-1; default 0.5. Supplied specular maps take precedence." - added
Input schema / properties / options / properties / tile / descriptionAdded value: +"Texture axes to treat as periodic for relief and seam handling; default none. Does not guarantee perceptually seamless repetition." - added
Input schema / properties / profile / descriptionAdded value: +"Processing intent: surface or supplied defaults a single sourceAssetId to base_color/roughness with opaque alpha; decal to base_color/opacity with blend alpha. Role-labeled map sets default to their supplied roles. Explicit roles/options override these defaults." - added
Input schema / properties / projectId / descriptionAdded value: +"Existing project in the bound deployment; owns the processing job and its artifacts." - added
Input schema / properties / roles / descriptionAdded value: +"Unique output roles to deliver. With sourceAssetId, defaults include profile convenience maps; with supplied maps or a completed texture job, defaults to its supplied roles. Unsupported missing maps fail rather than being invented." - added
Input schema / properties / roles / items / descriptionAdded value: +"Semantic map role; use one source per role. Color maps and scalar/vector data maps are interpreted differently." - added
Input schema / properties / sourceAssetId / descriptionAdded value: +"Validated PNG/JPEG asset supplying base_color. Do not also supply a base_color entry in sourceMaps or combine with textureJobId." - added
Input schema / properties / sourceMaps / descriptionAdded value: +"Role-labeled validated images or texture artifacts, one per role and at most 12 unique images. Sources must share an aspect ratio. Do not combine with textureJobId." - added
Input schema / properties / sourceMaps / items / properties / channel / descriptionAdded value: +"Channel to extract for a scalar map, for example g for roughness from ORM. Omit for RGB color or normal maps; normal maps reject channel selection." - added
Input schema / properties / sourceMaps / items / properties / colorSpace / descriptionAdded value: +"Input interpretation: auto uses the map role, srgb is encoded color, linear is linear color, and data bypasses color conversion for numeric maps." - added
Input schema / properties / sourceMaps / items / properties / invert / descriptionAdded value: +"Invert scalar values or RGB channels (1 - value), preserving alpha. Omit or false to keep them; use normalConvention for normal-map green-channel conversion." - added
Input schema / properties / sourceMaps / items / properties / role / descriptionAdded value: +"Semantic map role; use one source per role. Color maps and scalar/vector data maps are interpreted differently." - added
Input schema / properties / sourceMaps / items / properties / sourceId / descriptionAdded value: +"Validated PNG/JPEG asset ID (ast_…) or completed texture_map PNG artifact ID (art_…); not a file path or URL." - added
Input schema / properties / textureJobId / descriptionAdded value: +"Completed texture_maps_create job whose version-2 package should be applied. Alternative to sourceAssetId/sourceMaps; prepared map settings are retained unless overridden." - added
Input schema / properties / uvLayer / descriptionAdded value: +"Existing UV layer to use on target meshes. Omit to use their active UV layer; no UV coordinates are generated or rewritten." - added
Input schema / properties / uvScale / descriptionAdded value: +"[U, V] texture-coordinate scale, each positive and at most 10000; default [1, 1]. Changes shader mapping, preserving mesh UV coordinates."
- Changed
texture_maps_create36 fields changed- changed
Input schema / properties / idempotencyKey / descriptionPrevious value: -"Caller-chosen key. Replaying it with IDENTICAL input returns the EXISTING job instead of queueing a second one — a restarted driver adopts its own in-flight work rather than duplicating or orphaning it. Vary the key to force a new job. Full semantics: the same key with DIFFERENT input is rejected with IDEMPOTENCY_CONFLICT (never silently replayed, so a stale result cannot be mistaken for a fresh one). A key is recorded only once a job is actually created, so a request rejected beforehand (validation, APPROVAL_REQUIRED, quota) leaves the key unused and free to reuse. A key bound to a job keeps resolving to that job even after it fails or is cancelled — use a NEW key to genuinely retry cancelled work. Keys live 48 hours and are scoped per principal+deployment+operation, which means they SPAN SESSIONS: a plain descriptive key like \"hero-final-1024-v1\" will collide with your own run from yesterday and be rejected. Include a project id or a timestamp. This scope used to be stated only in the conflict error, i.e. after the round trip it cost — a field build lost two that way, ~34 hours after unrelated work had taken the same names."New value: +"Stable caller-chosen key for this request. Reuse the same key and arguments for safe retries; change the key when changing inputs." - added
Input schema / properties / materialName / descriptionAdded value: +"Name for the prepared material/package, 1-64 characters; default Image Material." - added
Input schema / properties / options / descriptionAdded value: +"Optional processing and material settings. Supplied maps take precedence over fallback generation; a reused texture job preserves its appearance settings unless overridden." - added
Input schema / properties / options / properties / alphaCutoff / descriptionAdded value: +"Mask-mode alpha threshold, 0-1; default 0.5. Ignored by opaque/blend modes." - added
Input schema / properties / options / properties / alphaMode / descriptionAdded value: +"Material opacity behavior. Default opaque, or blend for decal profile; delivered PNG alpha is preserved regardless." - added
Input schema / properties / options / properties / displacementMode / descriptionAdded value: +"How the material uses height: none (default), shader bump, or displacement. A height map must be available; renderer/export support varies." - added
Input schema / properties / options / properties / emissionStrength / descriptionAdded value: +"Material emission multiplier, 0-10000; default 1 when emission is requested, otherwise 0. Requires an emission output to light the material." - added
Input schema / properties / options / properties / heightMidlevel / descriptionAdded value: +"Height value representing zero displacement, 0-1; default 0.5." - added
Input schema / properties / options / properties / heightScale / descriptionAdded value: +"Relief height in meters, 0-1; default 0.001. Used for height-derived normals and material bump/displacement." - added
Input schema / properties / options / properties / heightSource / descriptionAdded value: +"If no height map is supplied, explicitly allow height estimation from base_color luminance or alpha. Default none; estimated relief is labeled heuristic." - added
Input schema / properties / options / properties / maxSize / descriptionAdded value: +"Maximum output side in pixels, 8-4096; default 2048. Sources are aligned at their common aspect ratio without upscaling." - added
Input schema / properties / options / properties / metallic / descriptionAdded value: +"Constant metallic fallback, 0-1; default 0. Supplied metallic maps take precedence; brightness does not establish metalness." - added
Input schema / properties / options / properties / normalConvention / descriptionAdded value: +"Convention of supplied normal maps: OpenGL +Y (default) or DirectX -Y. A change to output convention flips the green channel." - added
Input schema / properties / options / properties / normalStrength / descriptionAdded value: +"Normal intensity multiplier, 0-16; default 1. Applied when converting supplied vectors or deriving normals from height." - added
Input schema / properties / options / properties / outputNormalConvention / descriptionAdded value: +"Convention for delivered normal maps, OpenGL +Y by default or DirectX -Y; the Blender material compensates for the output convention." - added
Input schema / properties / options / properties / packing / descriptionAdded value: +"Optional extra packed PNG: ORM uses red=ambient occlusion, green=roughness, blue=metallic; default none. Missing AO uses a documented white fallback." - added
Input schema / properties / options / properties / physicalCoverageMeters / descriptionAdded value: +"Real dimensions of one UV tile for height-to-normal scaling. If omitted, derived relief normals assume a one-meter UV square." - added
Input schema / properties / options / properties / physicalCoverageMeters / properties / height / descriptionAdded value: +"Physical height in meters represented by one complete texture tile; positive, at most 100000." - added
Input schema / properties / options / properties / physicalCoverageMeters / properties / width / descriptionAdded value: +"Physical width in meters represented by one complete texture tile; positive, at most 100000." - added
Input schema / properties / options / properties / roughness / descriptionAdded value: +"Constant roughness fallback, 0-1; default 0.65. A supplied roughness map or converted gloss map takes precedence." - added
Input schema / properties / options / properties / roughnessMode / descriptionAdded value: +"Fallback roughness generation: constant (default) or an explicitly requested base_color brightness estimate. Image-derived roughness is heuristic, not measured." - added
Input schema / properties / options / properties / roughnessRange / descriptionAdded value: +"[minimum, maximum] roughness for image estimates, increasing within 0-1; default [0.35, 0.85]." - added
Input schema / properties / options / properties / seamMode / descriptionAdded value: +"Analyze edges only (default) or blend edge pixels along tile axes. Blending changes imagery and may cause ghosting; inspect the repeat preview." - added
Input schema / properties / options / properties / specular / descriptionAdded value: +"Constant specular fallback, 0-1; default 0.5. Supplied specular maps take precedence." - added
Input schema / properties / options / properties / tile / descriptionAdded value: +"Texture axes to treat as periodic for relief and seam handling; default none. Does not guarantee perceptually seamless repetition." - added
Input schema / properties / profile / descriptionAdded value: +"Processing intent: surface or supplied defaults a single sourceAssetId to base_color/roughness with opaque alpha; decal to base_color/opacity with blend alpha. Role-labeled map sets default to their supplied roles. Explicit roles/options override these defaults." - added
Input schema / properties / projectId / descriptionAdded value: +"Existing project in the bound deployment; owns the processing job and its artifacts." - added
Input schema / properties / roles / descriptionAdded value: +"Unique output roles to deliver. With sourceAssetId, defaults include profile convenience maps; with supplied maps or a completed texture job, defaults to its supplied roles. Unsupported missing maps fail rather than being invented." - added
Input schema / properties / roles / items / descriptionAdded value: +"Semantic map role; use one source per role. Color maps and scalar/vector data maps are interpreted differently." - added
Input schema / properties / sourceAssetId / descriptionAdded value: +"Validated PNG/JPEG asset supplying base_color. Do not also supply a base_color entry in sourceMaps or combine with textureJobId." - added
Input schema / properties / sourceMaps / descriptionAdded value: +"Role-labeled validated images or texture artifacts, one per role and at most 12 unique images. Sources must share an aspect ratio. Do not combine with textureJobId." - added
Input schema / properties / sourceMaps / items / properties / channel / descriptionAdded value: +"Channel to extract for a scalar map, for example g for roughness from ORM. Omit for RGB color or normal maps; normal maps reject channel selection." - added
Input schema / properties / sourceMaps / items / properties / colorSpace / descriptionAdded value: +"Input interpretation: auto uses the map role, srgb is encoded color, linear is linear color, and data bypasses color conversion for numeric maps." - added
Input schema / properties / sourceMaps / items / properties / invert / descriptionAdded value: +"Invert scalar values or RGB channels (1 - value), preserving alpha. Omit or false to keep them; use normalConvention for normal-map green-channel conversion." - added
Input schema / properties / sourceMaps / items / properties / role / descriptionAdded value: +"Semantic map role; use one source per role. Color maps and scalar/vector data maps are interpreted differently." - added
Input schema / properties / sourceMaps / items / properties / sourceId / descriptionAdded value: +"Validated PNG/JPEG asset ID (ast_…) or completed texture_map PNG artifact ID (art_…); not a file path or URL."
5 tool updates
- Changed
material_from_image8 fields changed- added
Input schema / properties / baseColor / itemsAdded value: +{ + "maximum": 1, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / baseColor / maxItemsAdded value: +4 - added
Input schema / properties / baseColor / minItemsAdded value: +4 - removed
Input schema / properties / baseColor / prefixItemsRemoved value: -[ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "maximum": 1, - "minimum": 0, - "type": "number" - } -] - added
Input schema / properties / options / properties / roughnessRange / itemsAdded value: +{ + "maximum": 1, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / options / properties / roughnessRange / maxItemsAdded value: +2 - added
Input schema / properties / options / properties / roughnessRange / minItemsAdded value: +2 - removed
Input schema / properties / options / properties / roughnessRange / prefixItemsRemoved value: -[ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "maximum": 1, - "minimum": 0, - "type": "number" - } -]
- Changed
material_from_maps8 fields changed- added
Input schema / properties / options / properties / roughnessRange / itemsAdded value: +{ + "maximum": 1, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / options / properties / roughnessRange / maxItemsAdded value: +2 - added
Input schema / properties / options / properties / roughnessRange / minItemsAdded value: +2 - removed
Input schema / properties / options / properties / roughnessRange / prefixItemsRemoved value: -[ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "maximum": 1, - "minimum": 0, - "type": "number" - } -] - added
Input schema / properties / uvScale / itemsAdded value: +{ + "exclusiveMinimum": 0, + "maximum": 10000, + "type": "number" +} - added
Input schema / properties / uvScale / maxItemsAdded value: +2 - added
Input schema / properties / uvScale / minItemsAdded value: +2 - removed
Input schema / properties / uvScale / prefixItemsRemoved value: -[ - { - "exclusiveMinimum": 0, - "maximum": 10000, - "type": "number" - }, - { - "exclusiveMinimum": 0, - "maximum": 10000, - "type": "number" - } -]
- Changed
material_recipe12 fields changed- added
Input schema / properties / tint / itemsAdded value: +{ + "maximum": 1, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / tint / maxItemsAdded value: +3 - added
Input schema / properties / tint / minItemsAdded value: +3 - removed
Input schema / properties / tint / prefixItemsRemoved value: -[ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "maximum": 1, - "minimum": 0, - "type": "number" - } -] - added
Input schema / properties / uvOffset / itemsAdded value: +{ + "maximum": 10000, + "minimum": -10000, + "type": "number" +} - added
Input schema / properties / uvOffset / maxItemsAdded value: +2 - added
Input schema / properties / uvOffset / minItemsAdded value: +2 - removed
Input schema / properties / uvOffset / prefixItemsRemoved value: -[ - { - "maximum": 10000, - "minimum": -10000, - "type": "number" - }, - { - "maximum": 10000, - "minimum": -10000, - "type": "number" - } -] - added
Input schema / properties / uvScale / itemsAdded value: +{ + "exclusiveMinimum": 0, + "maximum": 10000, + "type": "number" +} - added
Input schema / properties / uvScale / maxItemsAdded value: +2 - added
Input schema / properties / uvScale / minItemsAdded value: +2 - removed
Input schema / properties / uvScale / prefixItemsRemoved value: -[ - { - "exclusiveMinimum": 0, - "maximum": 10000, - "type": "number" - }, - { - "exclusiveMinimum": 0, - "maximum": 10000, - "type": "number" - } -]
- Changed
preset_apply4 fields changed- added
Input schema / properties / color / itemsAdded value: +{ + "maximum": 1, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / color / maxItemsAdded value: +3 - added
Input schema / properties / color / minItemsAdded value: +3 - removed
Input schema / properties / color / prefixItemsRemoved value: -[ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "maximum": 1, - "minimum": 0, - "type": "number" - } -]
- Changed
texture_maps_create4 fields changed- added
Input schema / properties / options / properties / roughnessRange / itemsAdded value: +{ + "maximum": 1, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / options / properties / roughnessRange / maxItemsAdded value: +2 - added
Input schema / properties / options / properties / roughnessRange / minItemsAdded value: +2 - removed
Input schema / properties / options / properties / roughnessRange / prefixItemsRemoved value: -[ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "maximum": 1, - "minimum": 0, - "type": "number" - } -]
Publisher details
- Operator
- Sceneplane · Publisher source
- Operator website
- https://sceneplane.online · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://sceneplane.online/docs · Publisher source
- Trust center
- Not available
- Restrictions
- A Sceneplane account is required. Free includes 30 compute minutes per UTC month; no credit card or paid Sceneplane plan is needed to connect. Use a remote Streamable HTTP MCP client with OAuth, or a client that supports an Authorization bearer API key. Client subscriptions and organization admin policies may restrict custom connectors. Quotas depend on the Sceneplane plan. Arbitrary Blender Python is disabled by default and requires the organization owner to enable it. Optional third-party model generators require your own provider keys and may charge separately. Sceneplane operates this endpoint; it is not affiliated with or endorsed by the Blender Foundation. · Publisher source
Related MCP Connectors
Blender and GLB/FBX/USD/STL rendered on cloud GPUs for AI agents: product shots, turntables, MP4
Free text/image → 3D: generate, rig, avatar-ify, and refine GLB models. No auth, no payment.
Build 3D web apps: physics, audio, music, Blender import. Live edits, undo, versions, publishing.
Blender-as-a-service for agents: search 3D assets, run Blender Python, or brief the studio agent.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to model, sculpt, rig, animate and bake particle effects by editing a semantic scene document, with built-in software rendering, measurable critics that flag floating or broken geometry, and game-ready glTF export. It exposes templates, atomic edit batches, motion and effect previews, undo history, and no GPU, browser, or Blender required.23 npmApache 2.0
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to fully control Blender through 50+ tools for 3D modeling, animation, materials, and scene management via HTTP endpoints.-
- FlicenseNot gradedqualityDmaintenanceEnables natural language control of Blender 3D through local AI models, allowing MCP clients to create, modify, and render scenes, apply materials, and execute Python code in Blender.-
- AlicenseNot gradedqualityDmaintenanceEnables AI-powered 3D content creation in Blender through natural language, including text-to-3D, image-to-3D, animation, rigging, rendering, and export.3MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.