R3
Server Details
Build 3D web apps: physics, audio, music, Blender import. Live edits, undo, versions, publishing.
- Status
- Healthy
- Uptime
- 25.9% over 62 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 65 tools
The set contains several explicit alias pairs that do the same thing (e.g. r3_editor_add_component/r3_component_add, r3_editor_code/r3_code_write, r3_editor_create/r3_factory_run), which creates avoidable misselection risk. It also has subtle read-tool overlaps such as r3_component_read vs r3_editor_inspect and r3_project_load vs r3_component_read. The descriptions do clarify live vs saved and older names, but the duplicates and sheer breadth keep boundaries from being clean.
Most tools follow a predictable r3_<domain>_<action> snake_case pattern, e.g. r3_project_create, r3_component_set, r3_texture_apply, r3_release_list. There are minor deviations such as r3_bug_reports_mine and the older editor-prefixed aliases, but the convention remains readable and mostly consistent.
Sixty-five tools is well above a typical well-scoped MCP surface and is inflated by duplicate older-name tools. R3 is a broad platform, so many domains are legitimate, but the count is still heavy enough that agents must navigate a large, partially redundant set.
Coverage is broad: projects, components, code, assets, images, audio, textures, Blender models, publishing, releases, editor control, docs, support and roadmap all have lifecycle operations. Minor gaps exist, such as no dedicated texture-set listing tool and component deletion relying on r3_editor_delete, but agents can generally work around them.
Available Tools
65 toolsr3_asset_deleteDelete an image, model, audio file or Blender modelADestructiveInspect
Delete one of the account's images, models, audio files, Blender models (kind blender: a whole uploaded .blend with every version; its meshes in use stay) or texture sets (kind textureSet: the set and its maps, r3_texture_create made it) — the same reference-guarded delete as the R3 app. With asset:delete:created, only an asset YOU created (this agent key or app connection; today: images made with r3_image_create); with asset:delete:owned, any of the user's assets, and only when the user asked for it: pass owned: true for one you did not create (an app connection is then asked for that right). Two calls, every time: without confirm nothing is deleted, and the answer says what would go and which of the user's projects use it; the same call with confirm: true, when that is what the user wants, deletes it. An asset another user's project uses can never be deleted. A model takes the images only it used with it, an HDR / EXR image its preview image. There is no trash and no undo. Ids come from r3_image_list, r3_audio_list and r3_blender_list.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The asset's id, as the list tools report it. | |
| kind | Yes | What the id names: blender = a Blender model (its blenderModelId), textureSet = a texture set (its setId). | |
| owned | No | true when the asset is one of the user's own, not one you created: it needs asset:delete:owned. Only when the user asked to delete it. Leave out for an asset you created. | |
| confirm | No | Leave out on the first call (it only reports). true deletes — after the user has seen the report. | |
| deleteReleases | No | With confirm: also move the user's non-live, UNPINNED releases that use it to the 7-day trash (needs release:delete; only when the user asked). Without it those releases are kept: for an image, model or audio file they are marked incomplete; for a Blender model they keep their meshes (the meshes they use stay). Pinned releases are never deleted by an agent. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | Yes | |
| name | Yes | |
| size | No | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| deleted | Yes | |
| projects | Yes | |
| releases | No | |
| meshesKept | No | |
| environment | Yes | |
| meshesDeleted | No | |
| previewProject | No | |
| referenceCount | Yes | |
| cascadeImageIds | No | |
| confirmRequired | Yes | |
| releasesDeleted | No | |
| releasesMarkedIncomplete | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description goes well beyond them: the two-call report-then-confirm ritual, the fact that without confirm nothing is deleted, 'There is no trash and no undo', cascade effects (a model takes only-unused images with it, an HDR/EXR takes its preview), per-call permission requirements, and cross-project protection. This is exactly the additional context the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and resource list, and every sentence carries non-redundant information. It is dense, however, with layered parentheticals and em-dash asides that make some clauses hard to parse on first read, slightly diluting 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?
An output schema exists, so return values need no explanation. For a destructive, permission-gated, cascading tool the description covers the confirm protocol, ownership rules, permission scopes, cascade side effects, irreversibility, and id sources — nothing an agent needs to call 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 semantics on top: owned:true is for assets 'you did not create' and triggers an app-connection consent, confirm:true only deletes after the user has seen the report, and deleteReleases is scoped to non-live UNPINNED releases. It stops short of restating deleteReleases' full mechanics, which the schema already carries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening names a specific verb (Delete) and enumerates the exact resources it handles (images, models, audio, Blender models, texture sets), including edge semantics like 'kind blender: a whole uploaded .blend with every version'. It also names the sibling list tools that supply ids, so an agent can distinguish it from the r3_*_list readers 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 when to use it (two calls, confirm only when the user wants deletion) and when not to (an asset another user's project uses 'can never be deleted'; owned:true only when the user asked). It names the alternatives for obtaining ids (r3_image_list, r3_audio_list, r3_blender_list) and the permission scopes gating each path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_assets_unusedList unused images, models and audioARead-onlyIdempotentInspect
The account's images, models and audio files that nothing uses — no project, no entity template, no other user's project — with each one's size and date, biggest first, and the total. The same report as the R3 app's Settings → Storage, by the same rules the deletes use. A model lists the images only it uses, an HDR / EXR image its preview image: they go with it. A texture set nothing uses is one item (kind textureSet) with its maps under it; a map of a set is never listed on its own. Blender (.blend) files are not part of it: they are the user's to keep or delete, listed by r3_blender_list. Pass kind to see one kind, limit for more rows (the totals always cover everything). It only reads; r3_asset_delete deletes an item by its kind and id (a plan, then a confirm), for what the user asked to remove. The scan can take several seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Only this kind: image, model, audio or textureSet. | |
| limit | No | How many items to list (default 50, at most 200). |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| shown | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| totals | Yes | |
| environment | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/open-world safety. The description adds real behavioral context the annotations cannot: the scan 'can take several seconds' (latency), totals always cover everything regardless of limit, and grouping rules (a model carries the images only it uses, a textureSet is one item containing its maps). No permissions/auth notes, so not a full 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?
Inclusion rule is front-loaded, then grouping, then exclusions, then params and sibling routing. Dense and information-rich, though a few clauses (the texture-set/map digression) could be tightened without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need no prose. Combined with annotations and a fully described schema, the description covers everything an agent needs: inclusion/exclusion rules, grouping semantics, latency, param effects and the correct sibling for deletion.
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% (baseline 3), and the description adds a non-obvious semantic: `limit` widens rows but the totals always cover everything, so the agent knows limiting does not truncate the aggregate. `kind`'s role is restated but not enriched beyond the enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource with scope: 'the account's images, models and audio files that nothing uses'. It defines 'unused' precisely (no project, no entity template, no other user's project) and explicitly distinguishes itself from siblings r3_asset_delete, r3_blender_list, r3_image_list and r3_audio_list.
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 routing: use this to see what is unused, use r3_asset_delete to remove an item (with plan-then-confirm), use r3_blender_list for .blend files that are excluded here. Both the when and the when-not are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_audio_listList the audio files on this R3 accountARead-onlyIdempotentInspect
List the audio files this R3 account owns, with the URL to use for each one. That URL is exactly what R3ComponentAudio.url takes, so this is how you find a sound the account already has — a footstep, a drum hit, a music bed — and then point an Audio component at it with r3_component_set.
Search by name rather than paging: search: "kick" is matched against every audio file on the account by the server, not against the page you happen to be holding.
You cannot upload an audio file from here — a tool argument is JSON, this server cannot read your disk, and audio is megabytes. A person uploads those in the R3 app. r3_sound_create makes a new sound effect or seamless loop from a recipe (rendered by R3, listed here afterwards); R3's music components (Transport, Beat, Pattern, DrumGrid) synthesise music that stays editable and in tempo.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many to return (default 25, max 100). | |
| cursor | No | Continue a previous listing: pass the nextCursor it returned, unchanged. Omit for the first page. | |
| search | No | Match this text against the file names, on the server. Omit for everything. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| audios | Yes | |
| search | Yes | |
| hasMore | Yes | |
| nextCursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, so the description does not need to repeat that. It adds meaningful context beyond the annotations: the returned URL is directly assignable to R3ComponentAudio.url, search is matched server-side against every file rather than the current page, and uploads are impossible from this tool. It doesn't discuss rate limits or result ordering, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the key URL detail, then follows with search guidance and limitations. Slightly verbose in the upload explanation ('a tool argument is JSON, this server cannot read your disk, and audio is megabytes'), but every paragraph serves a real agent need.
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 needn't explain return values. It covers the full workflow an agent needs—find by search, get a URL, assign via r3_component_set—and rules out the wrong assumption that this tool can upload. Minor gaps (ordering, pagination mechanics beyond cursor) are already handled by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so limit, cursor, and search are already documented in the schema, including that search matches on the server. The description reinforces search semantics with an example ('kick') and clarifies it isn't page-local, but this is a modest addition over 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?
States a specific verb and resource ('List the audio files this R3 account owns') and immediately says what each item carries (the URL usable as R3ComponentAudio.url). It is clearly distinguishable from siblings like r3_sound_create, r3_image_list, and r3_component_set.
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: find a sound the account already has and point an Audio component at it via r3_component_set. It also explains search-vs-paging, states the upload limitation, and names r3_sound_create and R3 music components as the alternatives for making new audio.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_blender_copiesFind duplicate copies of a Blender model in a projectARead-onlyIdempotentInspect
Does this project hold the same Blender model more than once (two whole imports side by side)? Answers "N copies of : … Keep one?" with each copy (its Entity, entityRef, part count) and its delete plan. It changes nothing: which copy stays is the user's choice, and the other is removed with r3_editor_delete({projectId, componentIds, confirm: {mode: "bundle", planToken}}) once they have chosen.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | The project to look in. | |
| blenderModelId | Yes | The Blender model, from r3_blender_list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| copies | Yes | |
| question | Yes | |
| modelName | Yes | |
| projectId | Yes | |
| environment | Yes | |
| blenderModelId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and non-destructive annotations, the description explicitly says it changes nothing and that choosing which copy stays is the user's decision. It also discloses the exact deletion path, including the required bundle confirm token, which gives the agent critical behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core question and is generally tight. The quoted answer template is slightly cryptic but earns its place by showing what the tool returns.
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, return values need not be fully explained, and the annotations cover the safety profile. The description still adds the key next-step workflow and non-mutation guarantee, leaving nothing important missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both projectId and blenderModelId are already documented in the input schema. The description does not add meaning beyond the schema for these parameters, 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 verb and resource: it determines whether a project holds the same Blender model imported more than once. The 'two whole imports side by side' phrasing distinguishes duplicate detection from nearby siblings such as r3_blender_list or r3_blender_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 makes clear this is a pre-deletion duplicate check and names the follow-up deletion tool with its required arguments. It does not explicitly say when not to use it versus listing tools like r3_blender_list, but the context is sufficiently unambiguous for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_blender_downloadDownload one of your Blender models as a .blendARead-onlyInspect
Get a .blend of one of the user's OWN Blender models (from r3_blender_list) to open in Blender: the current version, or the version fileId names. Answers a one-time download ticket (5 minutes) and the download endpoint (URL, method, Authorization header); the response body is the file. When the current version is the copy R3 made by applying modifiers, the answer says so and names the original upload, with its modifiers intact, to download instead. Another user's model cannot be downloaded.
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | No | A version's sha256 (from this tool's answer, e.g. the original of an applied copy). Leave out for the current version. | |
| blenderModelId | Yes | The Blender model, from r3_blender_list (one of the user's own). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| body | Yes | |
| bytes | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| fileId | Yes | |
| method | Yes | |
| ticket | Yes | |
| headers | Yes | |
| version | Yes | |
| fileName | Yes | |
| maxBytes | Yes | |
| expiresAt | Yes | |
| environment | Yes | |
| blenderModelId | Yes | |
| originalFileId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, non-idempotent), and the description adds genuinely new operational detail beyond them: a one-time download ticket valid for 5 minutes, the returned endpoint (URL, method, Authorization header), and that the response body is the file itself. It also discloses the modifier-copy edge case and how to recover the original.
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 purpose and ownership constraint are front-loaded, and every sentence carries information (version selection, ticket mechanics, modifier nuance). It is somewhat dense with nested clauses, but nothing is 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?
Covers everything an agent needs: ownership scope, version selection, the ephemeral ticket and auth requirements, and the modifier-copy gotcha. An output schema exists, so return-value explanation is not required, and the description still usefully describes the answer shape.
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 the conceptual distinction that fileId selects a specific version (or the original of an applied copy) while omitting it yields the current version. This meaningfully reinforces how the two parameters interact, though the schema already documents the sha256 format.
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: getting a .blend file of the user's OWN Blender model, selectable by current version or version fileId. It names r3_blender_list as the source of model IDs and distinguishes itself from sibling write tools (r3_blender_upload, r3_blender_import) by scoping to download 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?
Gives clear context (to open in Blender, IDs come from r3_blender_list) and a real exclusion: another user's model cannot be downloaded. It even routes the agent to download the original upload instead when the current version is an applied-modifier copy. It stops short of naming a distinct alternative tool or a when-not-to-use scenario beyond the ownership limit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_blender_draft_pushShow your work in progress on the Blender pageAInspect
While you build a model in Blender for the user, push an APPLIED copy of your working .blend after each step (body done, wheels done, materials done): the user's Blender page shows it as a 3D preview they can orbit. A draft is not a saved version: one draft per user, the newest wins, kept 24 hours. Answers a one-time ticket (5 minutes) and the draft endpoint (URL, method, Authorization header; the body is the file's raw bytes); sending it needs file access where the .blend is. The draft is a copy with its modifiers applied and its textures packed; r3_blender_upload saves the real file once the user is happy. Up to 20 MB. Needs the blender:upload right.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | The model's name, as the page shows it: "monster-truck" (the same name you will save it under). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| body | Yes | |
| model | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| method | Yes | |
| ticket | Yes | |
| headers | Yes | |
| maxBytes | Yes | |
| expiresAt | Yes | |
| environment | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile, but the description goes well beyond them: one draft per user, newest-wins, 24-hour retention, 20 MB limit, required blender:upload right, and a one-time ticket (5-minute) plus endpoint/auth mechanics. It also clarifies the copy is modifiers-applied and textures-packed, which matters for what the user sees.
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 each clause carries real information. It is dense and slightly run-on with parenthetical ticket/endpoint detail, but there is little 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?
Covers retention, size limit, auth requirements, the ticket/endpoint delivery, and the contrast with the save path. With an output schema present, return values need not be described, so the definition 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 coverage is 100% and the single 'model' parameter is already fully documented in the schema, so the description carries no additional parameter meaning. Baseline 3 applies 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 (push an applied copy of the working .blend as a draft) and immediately distinguishes it from the sibling r3_blender_upload, which 'saves the real file.' An agent can tell exactly what this does and how it differs from the nearest alternative.
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 when to invoke it ('after each step: body done, wheels done, materials done') and when the sibling is the right choice instead ('r3_blender_upload saves the real file once the user is happy'). 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.
r3_blender_importImport a Blender model into an R3 projectAInspect
Add a Blender model the account has uploaded (its current version) to an existing R3 project — the whole model, or only the meshes you name. Every Blender mesh object becomes an R3 Mesh keeping its own position, rotation, scale and origin, with its geometry, materials and textures wired up; objects sharing one mesh share one geometry; a Blender Empty becomes an R3 Empty, the objects under it keeping their place relative to it. A whole model is one Entity whose parts hang from a <model>_root Empty: move that Empty to move the model. Reports each object's entityRef so you can reach it with r3_component_set or from code. Use r3_blender_list to choose a model. Pass reparse: true to re-read the .blend itself when the import warns that its meshes were placed at the origin; other projects keep the meshes they use (r3_blender_update moves them, if the user wants). Pass camera to frame the model in a NEW project (its first model: refused on a project that already holds a mesh).
| Name | Required | Description | Default |
|---|---|---|---|
| camera | No | Set the project camera to frame the model, for a NEW project's first model only: refused, with nothing added, when the project already holds a mesh (its camera is then the user's). Omit it to keep the camera. | |
| meshes | No | Import only these meshes (by mesh name), each with its own placement. Default: the whole model. | |
| reparse | No | Re-read the .blend instead of using what was stored at upload time. This is R3's Re-parse button. Slow (it re-parses and re-optimises every texture) but it is the only way to recover object placements and flat shading that an older import never captured. Default false. | |
| projectId | Yes | The project to import into, from r3_project_create. | |
| blenderModelId | Yes | Which Blender model, from r3_blender_list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| root | No | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| entity | No | |
| fileId | Yes | |
| status | Yes | |
| objects | No | |
| filename | Yes | |
| reparsed | Yes | |
| warnings | No | |
| cameraSet | No | |
| meshCount | No | |
| projectId | Yes | |
| textureCount | No | |
| materialCount | No | |
| blenderModelId | Yes | |
| componentCount | No | |
| appliedInBlender | No | |
| cameraControlsAdded | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag a non-readonly, non-idempotent, open-world mutation; the description goes well beyond them by explaining the object-to-entity mapping, mesh/geometry sharing, root Empty behavior, the entityRef report, the camera refusal semantics, and reparse's cost ('Slow... re-parses and re-optimises every texture'). The one gap is what a repeated import of the same model does, which matters given idempotentHint=false.
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, then supporting semantics; nearly every clause carries decision-relevant information. It is dense to the point of being one long block, and the mesh/Empty mapping detail is the least essential part, but nothing is redundant 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?
With an output schema present, return values (entityRef per object) need not be spelled out further, and the annotations carry the safety profile. The definition covers mutation effects, failure modes, and prerequisites, leaving only the repeated-import/idempotency question unresolved.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description still adds value by tying meshes to per-object placement and by giving a concrete trigger for reparse ('when the import warns that its meshes were placed at the origin') rather than restating the schema. It does not add syntax detail beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: adds/imports an uploaded Blender model's current version into an existing R3 project, with optional mesh-level scoping. It is clearly distinguishable from r3_blender_upload (which supplies the model) and r3_blender_update (which moves meshes), both of which it names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'Use r3_blender_list to choose a model', r3_blender_update 'moves them, if the user wants', reparse only 'when the import warns that its meshes were placed at the origin', and camera only for a NEW project's first model. Exclusions are stated, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_blender_listList the Blender models on this R3 accountARead-onlyIdempotentInspect
List the Blender models this R3 account has uploaded — one per .blend file name, the current version of each — with what it will produce: how many Blender objects land in the scene, how many meshes and materials, its screenshot, and any PENDING update (a re-upload that changes meshes the user's projects use, waiting for r3_blender_update). An upload with unapplied modifiers is applied in Blender by R3 itself; a model says what was applied, per object. community: true lists everyone's public models instead. Add one (or some of its meshes) to a project with r3_blender_import. A .blend gets here two ways: a person uploads it in the R3 app (Models -> Upload .blend), or you save one you built in Blender with r3_blender_upload (a one-time ticket and an upload endpoint: never a tool argument).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many models to return (default 25, max 100). | |
| cursor | No | Continue a list: the nextCursor of the previous page. | |
| search | No | Only models whose name matches, searched across every model (not the page in hand). | |
| community | No | true lists the PUBLIC models of every user (the Community tab) instead of this account's own. |
Output Schema
| Name | Required | Description |
|---|---|---|
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| filter | Yes | |
| models | Yes | |
| hasMore | Yes | |
| nextCursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/idempotent annotations, it discloses what each result carries (object/mesh/material counts, screenshot, pending-update flag), how R3 applies unapplied modifiers per object, the meaning of a PENDING update, and the important constraint that the upload ticket/endpoint is never a tool argument.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence and every clause is informative, but it is a dense run-on paragraph that partly duplicates the output schema's field list, so it is slightly over-packed rather than maximally tight.
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 present, the description covers scope, entry contents, pagination-adjacent behavior, the community toggle, and how models arrive — everything the agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents limit, cursor, search, and community. The description restates community's public-model behavior but adds nothing beyond the schema on limit, cursor, or search, 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 and resource ('List the Blender models this R3 account has uploaded') with scope and unit of return ('one per .blend file name, the current version of each'). It distinguishes itself from r3_blender_upload, r3_blender_update, and r3_blender_import by naming each and its role.
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 clear context for use and routes the agent to siblings: models get here via the R3 app or r3_blender_upload, pending updates wait for r3_blender_update, and adding to a project uses r3_blender_import. It lacks an explicit 'use this instead of X when Y' exclusion, 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.
r3_blender_updateUpdate projects to a Blender model's current versionADestructiveInspect
A re-uploaded Blender model is always its latest version; the user's projects keep the meshes they have until asked. This tool asks and answers that one question: choice update_projects without reportId shows which projects and entity templates use an older version (or an earlier import of the same file) and what changed; with the reportId and the projectIds / entityTemplateIds the user chose, it moves just those to the current version. Which ones move is the user's choice; "not now" means no call. Parts are matched by Blender OBJECT name: each takes its new mesh and placement; when only its shape changed it keeps the project's materials and the edits made to them in R3, when its materials changed in Blender it takes Blender's materials, and edits made in R3 to its materials are replaced. Objects new in the model are added under the copy's root Empty, parts the model no longer has are kept (removeGone: true removes them). Published releases never change. The plan only reads; moving projects needs the blender:update right.
| Name | Required | Description | Default |
|---|---|---|---|
| choice | Yes | Required: update_projects. There is no default. | |
| reportId | No | The report being answered, from the plan (this tool without reportId). Leave it out to plan. | |
| projectIds | No | With a reportId: the projects to update. | |
| removeGone | No | Also remove the parts the current version no longer has (default false: they are kept and listed). Plan with it and answer that report with it. | |
| blenderModelId | Yes | The Blender model, from r3_blender_list. | |
| entityTemplateIds | No | With a reportId: the entity templates to update. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kept | Yes | |
| live | No | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| choice | Yes | |
| reportId | No | |
| freedRows | Yes | |
| repointed | Yes | |
| duplicates | No | |
| environment | Yes | |
| projectParts | No | |
| currentFileId | Yes | |
| versionNumber | No | |
| blenderModelId | Yes | |
| behindProjectIds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral detail beyond the annotations: it explains matching by Blender OBJECT name, material-preservation rules, handling of new and gone parts, removeGone semantics, and the required blender:update right. It is consistent with destructiveHint=true and readOnlyHint=false by clearly describing the plan as read-only and execution as mutating.
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 but well-structured paragraph that front-loads the core model-update concept and then layers usage, matching behavior, and authorization details. Every sentence contributes operational context for a complex destructive tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given six parameters, a destructive annotation profile, an output schema, and a nontrivial Blender-to-project update workflow, the description covers planning, execution, matching semantics, material handling, removal behavior, and permissions. No additional explanatory sentence is needed for an agent 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?
Although schema coverage is 100%, the description meaningfully explains the conditional relationship between parameters: choice without reportId plans, while reportId plus projectIds/entityTemplateIds executes. It also clarifies removeGone's effect and the choice between planning and answering a report.
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 precise verb and resource (update projects to a Blender model's current version) and immediately distinguishes its planning mode from its execution mode. It also distinguishes the tool's scope from other Blender tools by explaining that published releases never change and that it only moves selected projects/entity templates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: call without reportId to produce a plan, call with reportId and selected IDs to apply changes, and make no call for 'not now'. It also states that published releases are unaffected, removing ambiguity about scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_blender_uploadSave a .blend as a version of a Blender modelAInspect
Save a .blend you made or changed (in Blender, through a Blender MCP) as the newest version of one of the user's Blender models: the model is named by the file name, so "monster-truck.blend" adds a version to the user's monster-truck model, or makes the model. A tool argument cannot carry the file, so this answers a one-time upload ticket (5 minutes) and the upload endpoint: its URL, method, Authorization header and that the body is the file's raw bytes. Sending it needs file access where the .blend is (the R3 sandbox, or the user's own machine); without it, the user uploads on the Blender page. The endpoint's answer names the model, the version number and its sha256; R3 applies unapplied modifiers itself, and when the user's projects use an older version it asks one question (answer it with r3_blender_update). Then r3_blender_import puts the model in a project. Textures travel only when packed (bpy.ops.file.pack_all()). Up to 100 MB. Needs the blender:upload right.
| Name | Required | Description | Default |
|---|---|---|---|
| fileName | Yes | The .blend file name, which names the model: "monster-truck.blend" (".blend" is added when missing). A name only, no folder. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| body | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| method | Yes | |
| ticket | Yes | |
| headers | Yes | |
| fileName | Yes | |
| maxBytes | Yes | |
| expiresAt | Yes | |
| environment | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses a one-time 5-minute upload ticket, the endpoint URL/method/Authorization header and raw-bytes body, the need for file access, the 100 MB limit, the required blender:upload right, and the packed-texture caveat. These are exactly the behavioral details an agent needs and are consistent with openWorldHint=true, idempotentHint=false, and destructiveHint=false.
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 purpose is front-loaded and nearly every sentence carries operational value, including ticket handling, file access, size limit, rights, and follow-up tools. It is dense and somewhat run-on, but the length is justified by the complexity of the upload workflow.
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 one-parameter but multi-step upload workflow with annotations and an output schema, the description covers prerequisites, ticket/endpoint mechanics, file-access alternatives, size limits, rights, texture packing, and follow-up tools. Nothing essential for correct invocation appears to be 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 single fileName parameter is fully documented in the schema, including the 'name only, no folder' constraint and the automatic .blend suffix. The description reinforces the model-naming consequence but adds little beyond the schema, so the high schema coverage sets the baseline at 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 states a specific action (save a .blend) and resource (newest version of a Blender model), and explains the naming convention that links the file to the model. It is easily distinguishable from siblings like r3_blender_import and r3_blender_update because it describes the upload/versioning step.
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 conditions for use: after making or changing a .blend in Blender or a Blender MCP, and it names the fallback when file access is unavailable (user uploads on the Blender page). It also routes the agent to r3_blender_update for an older-version question and to r3_blender_import for placing the model in a project.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_bug_reportFile a bug report about R3AInspect
Send R3 a bug report about R3 ITSELF (the engine, the editor, these tools), in the user's name and naming you (your agent key or app connection). It becomes one of the user's support issues, which only the user and R3's team see. Use it when R3 does something its documentation says it should not, after checking the docs (r3_docs_read) — not for problems in the user's own project, and not for feature wishes (those are r3_roadmap_suggest).
r3_bug_reports_mine lists what the user already reported, so a fault is not filed twice. A useful report says what was done (the tool calls), what was expected and what happened, with what was MEASURED in measurements — the values read back with r3_component_read or r3_editor_inspect, the exact error text. projectId (when it happens in a project) lets R3 open it. The answer carries the report's link for the user. Rate-limited per agent key or app connection (a few an hour). Needs the support:write right.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | One line naming the fault, e.g. "Cuboid collider with halfExtents.z = 0 inverts the contact normal". | |
| projectId | No | The project it happens in (r3_project_list), if any. Only a project the user can open. | |
| description | Yes | What you did, what you expected, what happened instead. | |
| measurements | No | What you measured: values read back, exact error text, timings. Plain text. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| title | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| status | Yes | |
| issueId | Yes | |
| projectId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare write/open-world/non-idempotent; the description adds the substantive behavior: the report becomes a private support issue visible only to the user and R3's team, it is rate-limited per agent key or app connection (a few an hour), it requires the support:write right, the response carries a shareable link, and r3_bug_reports_mine exists to avoid duplicates. That is exactly the context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and identity in the first sentence, then routing/exclusions, then operational detail. The paragraph is dense and long, but each sentence carries a distinct constraint (docs check, dedup, measurements, visibility, rate limit, auth) rather than 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 4-param submission tool with an output schema already covering the return shape, the description supplies everything else an agent needs: prerequisites, exclusions, auth right, rate limit, visibility, dedup path, and expected report content. No material gap remains.
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: `measurements` should carry values read back with r3_component_read or r3_editor_inspect plus exact error text, and `projectId` is what lets R3 open the case. It also prescribes report content (what was done, expected, happened) beyond the terse schema phrasing.
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: send a bug report about R3 ITSELF (engine, editor, these tools), filed in the user's name. It explicitly scopes the subject away from the user's own project and from feature requests, so an agent can separate it from r3_roadmap_suggest or a project-level issue 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 the trigger condition ('when R3 does something its documentation says it should not'), a prerequisite ('after checking the docs (r3_docs_read)'), two explicit exclusions ('not for problems in the user's own project, and not for feature wishes'), and names the sibling to use instead for wishes (r3_roadmap_suggest). 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.
r3_bug_reports_mineList the bug reports the user has filedARead-onlyIdempotentInspect
The user's own support issues — bug reports and questions they or their agents (agent keys and app connections) sent R3 — newest first, with status, date, the project and whether an agent filed it (and which), each with its link. It shows whether a fault is already reported, before r3_bug_report would file it twice. Needs the support:write right.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many to return, newest first (default 20). |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| issues | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds two things annotations cannot: the required 'support:write' right for a read-oriented tool, and the contents/ordering of results (status, date, project, agent-attribution, link, newest first). It stops short of pagination or rate-limit detail.
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, front-loaded with the resource and scope before the alternative-tool routing. The parentheticals (agent keys/app connections, which agent) are dense but each carries a real qualifier; the phrasing around the duplicate-filing point is slightly indirect 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?
An output schema exists, so return values need not be described, yet the description characterizes them anyway alongside the auth requirement and default ordering. Combined with the safety annotations, an agent has what it needs to call this correctly; only pagination/large-result behavior is unaddressed.
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 a single parameter at 100% schema description coverage, the schema already documents 'limit' including its default and maximum. The description mentions ordering but adds nothing about the limit, paging, or what happens when more than 100 exist, so it neither compensates nor detracts.
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 resource (the user's own support issues, including bug reports and questions filed via agent keys/app connections) and states the ordering (newest first). It explicitly distinguishes itself from the sibling that files reports, r3_bug_report, so an agent can route between the two 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?
It gives an explicit usage condition — check here first to see whether a fault is already reported — and names the alternative tool (r3_bug_report) that the agent would otherwise call and duplicate. This is the when-to-use/when-to-prefer-a-sibling 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.
r3_code_readRead the code and event binding of R3 Code componentsARead-onlyIdempotentInspect
Read back what a Code component actually contains — its full JavaScript source and the event it runs on. r3_code_write reports what it wrote; this reports what is there.
Use it before replacing a script, so an edit builds on the real source instead of overwriting it blind, and after a write whose reply you did not see, to confirm what landed. Call it with NO entityRefs to get every Code component in the project — that is how you find a script again when you never received the entityRef for it.
Each script comes back with its codeVersion: pass it as r3_code_write's baseVersion. The event comes back as a NAME (RENDER_BEFORE, KEY_DOWN, …), which is the same form r3_code_write takes, so you can hand it straight back. r3_component_read reports the same field as a raw number and omits any source over 2000 characters; this is the tool for reading code.
A body too large to return is left out WHOLE and reported with its size — never truncated, because a partial script written back would delete the rest of it. An entityRef that does not exist is named and the others are still read.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | The project to read from, from r3_project_create or r3_project_load. | |
| entityRefs | No | Which Code components to read, e.g. ["spin"]. Omit for ALL of them. Up to 50 per call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| projectId | Yes | |
| components | Yes | |
| unreadable | Yes | |
| projectName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only, idempotent profile, but the description adds real behavioral detail beyond them: oversized bodies are omitted WHOLE with their size reported and never truncated, with the reason given (a partial write-back would delete the rest). It also specifies that an invalid entityRef is named while the other refs are still read — non-obvious partial-failure semantics.
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 purpose, then usage, then edge-case behavior; every sentence carries operational information and none is filler. The four-paragraph shape is slightly longer than strictly required for a two-parameter tool, which keeps it just short of top marks.
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 restatement, yet the description still supplies the two things the schema cannot: how to chain codeVersion back into r3_code_write and why truncated bodies are impossible. Combined with the fallback enumeration path and partial-failure behavior, 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 coverage is 100%, so the baseline is 3, but the description adds meaning the schema lacks: omitting entityRefs is framed as the way to enumerate every Code component and to recover a missing ref. It also explains that the returned codeVersion feeds r3_code_write's baseVersion and that the event returns as a NAME in write-compatible form.
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 ('Read back what a Code component actually contains — its full JavaScript source and the event it runs on') and immediately contrasts itself with r3_code_write ('reports what it wrote; this reports what is there'). It also draws a firm line against the same-purpose sibling r3_component_read, so an agent can select correctly 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 explicit when-to-use cases: before replacing a script so an edit builds on the real source, and after a write whose reply was not seen, to confirm what landed. It names alternatives (r3_code_write for writing, r3_component_read for shallow reads) and states the no-entityRefs fallback for recovering a lost entityRef.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_code_writeWrite code that runs in an R3 projectADestructiveInspect
Add or replace a Code component: JavaScript that makes a project DO something. It runs on ONE event you choose (event): RENDER_BEFORE (default) every frame, for movement (held keys: this.keysPressed); KEY_DOWN / KEY_UP once per press / release; MOUSE_CLICK, SWIPE, MUSIC_BEAT, PHYSICS_COLLISION once per click, swipe, beat, collision. A script per event: r3_docs_read("HOWTO_CODE_EVENTS.md"). Kept at once in the live copy every open R3 tab runs, nothing to save (r3_editor_code is the same tool); the answer gives its seq and codeVersion.
r3_project_load names the entityRefs code uses; r3_docs_read("CODE_PATTERNS.md") is the API (a guessed one saves, then silently does nothing).
The code: a function body that RETURNS its hooks:
this.start = function() {
// once, at start
};
this.update = function(data) {
this['mesh_cube_1'].rotation.y += data.delta;
};
return {start: this.start, update: this.update}; // REQUIRED — nothing runs without itReach a component as this['<entityRef>'], infrastructure with this.getProject() / getScene() / getCamera() / getRenderer() / getWorld() / getAudioListener() / getEntityInstance(). Anything else returned is an api other scripts call: this['<entityRef>'].api.<name>(...). Code that creates things (scene objects, timers, listeners) frees them in a returned dispose: R3 calls it on re-save, Stop and delete.
No getComponentByRef, this.state, this.getSibling or R3 global: code using them is REFUSED.
EVENTS (by NAME; default RENDER_BEFORE): RENDER_BEFORE, RENDER_AFTER, KEY_DOWN, KEY_UP, MOUSE_DOWN, MOUSE_UP, MOUSE_MOVE, MOUSE_WHEEL, MOUSE_CLICK, TOUCH_START, TOUCH_MOVE, TOUCH_END, TOUCH_CANCEL, SWIPE, MUSIC_BEAT, MUSIC_BAR, PHYSICS_COLLISION. Their data (mouse: nested, -1..+1): the how-to's table.
Pass entityRef + baseVersion (the codeVersion r3_code_read gave) to REPLACE a script (and its event); name (or neither) to create one. Never merged: a write on an older version is refused with the current code.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The JavaScript. A function body that returns {start, update} — see the description. | |
| name | No | Label for a NEW Code component, e.g. "Spin". Cannot be combined with entityRef. | |
| event | No | Which event runs it, by NAME: RENDER_BEFORE, RENDER_AFTER, KEY_DOWN, KEY_UP, MOUSE_DOWN, MOUSE_UP, MOUSE_MOVE, MOUSE_WHEEL, MOUSE_CLICK, TOUCH_START, TOUCH_MOVE, TOUCH_END, TOUCH_CANCEL, SWIPE, MUSIC_BEAT, MUSIC_BAR, PHYSICS_COLLISION. Default RENDER_BEFORE on create; left unchanged on update. | |
| entityRef | No | The entityRef of an EXISTING Code component to replace, as reported by r3_project_load. Cannot be combined with name. | |
| projectId | Yes | The project to write into, from r3_project_create or r3_project_load. | |
| baseVersion | No | REQUIRED with entityRef: the codeVersion r3_code_read answered for that script. A write on an older version is refused with the current code, never merged. Leave it out when creating. | |
| componentId | No | Or the id of the EXISTING Code component to replace (instead of entityRef). |
Output Schema
| Name | Required | Description |
|---|---|---|
| seq | No | |
| name | Yes | |
| event | Yes | |
| action | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| fileName | Yes | |
| warnings | No | |
| entityRef | Yes | |
| projectId | Yes | |
| codeVersion | Yes | |
| componentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive=true and readOnly=false, and the description goes well beyond them: it discloses that code lives in the live copy every open tab runs with nothing to save, that dispose is called on re-save/Stop/delete, that writes on an older version are refused with the current code and never merged, and that disallowed APIs (getComponentByRef, this.state, this.getSibling, R3 global) cause the code to be REFUSED. These are exactly the side effects an agent needs to avoid silent corruption.
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?
Purpose, constraints and the code contract are front-loaded, and the worked JS example is high-value. It loses a point for duplication: the full event list appears in both the description and the `event` schema property, and the infra-method list is dense prose that could be compressed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, and the description still adds the key return facts (seq and codeVersion). For a 7-parameter, destructive, event-driven write tool it covers execution model, versioning, cleanup obligations, and refusal conditions — 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: the shape of `code` (a function body that must `return {start, update}` or nothing runs), the create-vs-replace semantics of name/entityRef, and the versioning contract for baseVersion. It does not add much beyond the schema for event/componentId, which keeps it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Add or replace a Code component: JavaScript that makes a project DO something") and immediately distinguishes itself from siblings by noting that r3_editor_code is the same tool. An agent can tell what it produces and which event-driven execution model applies 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?
Explicit routing: pass entityRef + baseVersion to REPLACE, name (or neither) to CREATE, and read baseVersion from r3_code_read first. It also points to r3_docs_read("HOWTO_CODE_EVENTS.md") and CODE_PATTERNS.md for the event table and API, and names the alternative alias r3_editor_code. When-to-use and when-not (mutually exclusive name/entityRef) are both stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_component_addAdd ANY component to a saved R3 projectAInspect
Add one component of ANY registered type — a collider, a rigid body, a joint, a light, a material, a geometry … — to a saved R3 project, with its values and references set before it is created. Kept at once in the project's live copy: every R3 tab with the project open shows it now, no editor needed and nothing to save (r3_editor_add_component is the same tool). Use r3_factory_run for a ready-made object (a cube, a physics sphere …).
type is the short type name, e.g. "ColliderCuboid" (an unknown type is refused with the list). values take r3_component_set's shapes: a plain value {"friction": 0.2}; a value component as the keys to set {"halfExtents": {"x": 2, "y": 0.5, "z": 1}}; a reference as the target's entityRef or id {"rigidBody": "rigidbody_dynamic_1"} — a component of THIS project, of a type the slot accepts; "name" names it. A type that cannot exist without an option (an Audio / AudioPositional / Texture's "url") takes it in values too, and is refused without it. A Code component's code is r3_code_write's. A VehicleWheel added with a mesh is measured from it (Configure from Mesh: radius, connectionPoint, axle), and a ColliderCuboid / Sphere / Cylinder / Capsule with a mesh (its own or its rigid body's) is fitted to it (Fit to Mesh: size, and position on the mesh's centre), only the values you did not pass; the answer says what (PHYSICS_USAGE.md → Vehicles).
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | The component type, e.g. "ColliderCuboid", "RigidBodyFixed", "LightPoint". | |
| values | No | Its values, e.g. {"rigidBody": "rigidbody_dynamic_1", "halfExtents": {"x": 2}, "friction": 0.2}. | |
| projectId | Yes | The project to add to (r3_project_list). |
Output Schema
| Name | Required | Description |
|---|---|---|
| seq | No | |
| type | Yes | |
| saved | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| created | Yes | |
| physics | Yes | |
| entityRef | Yes | |
| projectId | Yes | |
| componentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, openWorldHint=true, destructiveHint=false), it discloses real behavioral traits: the component is kept immediately in the project's live copy and visible in every open tab with nothing to save, unknown types are refused with the type list, types requiring a mandatory option are refused without it, and mesh-linked components are auto-fitted only for values not passed.
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?
Purpose is front-loaded, but the body is a long run-on sentence dense with em-dash and parenthetical asides (VehicleWheel/Configure from Mesh, Fit to Mesh, PHYSICS_USAGE.md) that make it hard to scan. The content largely earns its place given the tool's edge cases, but the packaging is heavy and under-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be documented, yet the description still notes 'the answer says what' was auto-fitted. For a 3-parameter mutation tool with nested open-object values, it covers the type format, the value/reference encodings, mandatory-option types, and Code component ownership, leaving no obvious gap.
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 does not: `type` is the short type name and unknown values are rejected with a list, and `values` may be a plain value, a value component, or a reference expressed as the target's entityRef or id, with 'name' naming the component. The exact shape vocabulary is still delegated to r3_component_set rather than defined here.
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 specific verb (add) and resource (component) plus the broad scope ('ANY registered type'), then enumerates examples (collider, rigid body, joint, light, material, geometry). It actively distinguishes itself from siblings by noting r3_editor_add_component is the same tool and routing ready-made objects to r3_factory_run.
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 names an alternative with its selecting condition ('Use r3_factory_run for a ready-made object (a cube, a physics sphere …)') and aliases r3_editor_add_component, which is genuinely useful routing. However it gives no explicit when-not-to-use guidance and never contrasts against the closely related r3_component_set, leaving that boundary to be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_component_boundsMeasure how big a mesh or model isARead-onlyIdempotentInspect
The size and place of meshes and imported models, in R3 units (metres): the world-space box around each (min, max, size, centre), the mesh's scale, rotation and parents applied. Name a Mesh, or the root Empty of a Blender model (r3_blender_import makes one, named "_root"), and the box covers it and every mesh under it, with each part listed. Use it before scaling or placing anything relative to its size: to stand a model on the ground, move it so its min.y is the ground height (r3_terrain_height on a terrain); to make it 2 m long, scale by 2 / size. Each answer also gives the project camera's position and lookAt that show it whole on any screen, a phone held upright included: use it to frame a model. Several in one call (up to 20). Works with no R3 tab open, from the project as it is kept; read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | The project, from r3_project_list or r3_project_create. | |
| entityRefs | Yes | Meshes or model root Empties to measure, by entityRef (r3_project_load lists them) or id, e.g. ["truck_root"]. Up to 20. |
Output Schema
| Name | Required | Description |
|---|---|---|
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| projectId | Yes | |
| components | Yes | |
| unreadable | Yes | |
| projectName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, but the description adds real context: it works with no R3 tab open against the stored project, batches up to 20 entities, and returns each child part of a hierarchy. It stops short of discussing failure modes (e.g. unknown entityRef) or result ordering.
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: the output shape comes first, then accepted inputs, then usage recipes, then constraints (20 per call, no tab needed, read-only). A few parentheticals stack up, but every sentence carries information an 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?
An output schema exists, yet the description still summarises the payload (box, parts, camera framing), names the project source of truth, and states batch limits and the no-tab requirement. An agent can call this correctly without consulting anything else.
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 would be 3, but the description adds meaning beyond the schema: entityRefs may be a Mesh or the root Empty of an imported model (named "<model>_root" by r3_blender_import), and the measured box aggregates the whole subtree. That clarifies accepted input values rather than just repeating types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (measure) and resource (meshes and imported models) and enumerates exactly what the result contains: world-space box min/max/size/centre, scale, rotation and parents applied. It is clearly distinguishable from siblings like r3_component_read or r3_terrain_height.
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 drivers (before scaling or placing anything relative to its size) plus concrete recipes: move so min.y equals ground height using r3_terrain_height, or scale by 2 / size for a 2 m model. It also names the companion use case of framing a model via the returned camera position/lookAt.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_component_readRead the property values of R3 componentsARead-onlyIdempotentInspect
Read back what components actually hold — a material's colour and roughness, a mesh's position, which material it uses. r3_project_load gives you the names; this gives you the values behind them.
Pass SEVERAL entityRefs in one call — telling six similarly-named materials apart is the case this exists for, and it is one round trip rather than six. One component: entityRef: "mesh_cube_1" (r3_component_set's name for it) works too.
What comes back is exactly what r3_component_set takes, so read → change → write needs no translation: value components are expanded inline ({"position": {"x": 0, "y": 2, "z": 0}}), references are the target's entityRef as a string (or null when empty), and lists of references are arrays of entityRefs. Use it before any relative change ("20% brighter", "move it up by one"), and after a write to confirm what landed.
Bulk data — mesh vertex arrays and anything else megabyte-sized — is NOT returned. Every property left out is listed with the reason, so an omission is never silent.
An entityRef that does not exist is reported by name and the rest are still read. Value components (a Vector3, a Color) are not read on their own: ask for the component that owns them.
| Name | Required | Description | Default |
|---|---|---|---|
| entityRef | No | Or one component, e.g. "mesh_cube_1". | |
| projectId | Yes | The project the components are in, from r3_project_create or r3_project_load. | |
| entityRefs | No | Which components to read, as reported by r3_project_load: an ARRAY, e.g. ["mesh_cube_1", "material_cube_1"]. Up to 50 per call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| projectId | Yes | |
| components | Yes | |
| unreadable | Yes | |
| projectName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Read-only and idempotent are already covered by annotations, but the description adds real behavioural detail the annotations cannot: bulk vertex arrays are deliberately excluded and every omission is reported with a reason, and a nonexistent entityRef is reported by name while the rest still resolve. It also documents the return-value shape (expanded inline values, entityRef strings, null for empty references, arrays for reference lists). It stops short of stating pagination/ordering or how the 50-item cap failure surfaces.
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 purpose and organised into short, scannable paragraphs, each addressing a distinct question (batching, return shape, omissions, errors). It is longer than most tool descriptions and the final note on value components could be tighter, but no paragraph is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with an output schema and full annotation coverage, this is complete: it covers what is returned, what is intentionally withheld and how that is signalled, partial-failure behaviour, and the relationship to the write counterpart. An agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description still adds genuine selection semantics beyond the schema: it tells the agent that multiple entityRefs should be preferred in one call, and that the singular entityRef form is an equivalent shorthand for a single component — a distinction the schema text alone leaves thin.
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 with scope: read back the values components hold (colour, roughness, position, material reference). It explicitly contrasts with r3_project_load ("gives you the names; this gives you the values behind them") and with r3_component_set, so the agent can slot it into the read/modify/write cycle without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use cases (use before any relative change like "20% brighter"; use after a write to confirm what landed) and an explicit batching recommendation with the scenario it serves (telling six similarly-named materials apart). It also names the sibling to use for name discovery, so alternatives and exclusions are both present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_component_setChange a property on an R3 componentADestructiveInspect
Set one or more properties on a component that already exists in a project — a material's roughness, a mesh's position, which material a mesh uses. Kept at once in the project's live copy: every R3 tab with the project open shows it now, no editor needed and nothing to save (r3_editor_set is the same tool). The answer says what was kept and its seq.
Components are addressed by entityRef; r3_project_load returns those names.
Properties come in four shapes and the value you pass differs: • plain value — {"roughness": 0.25}, {"visible": false} • value component (position / rotation / scale / color / size …) — pass an OBJECT of just the keys to change: {"position": {"y": 2}} leaves x and z alone. Vector3 has x/y/z, Color has r/g/b/a (0..1), Scalar has value. An EMPTY slot (a rigid body's centerOfMass is empty until set) is made from the fields given: {"centerOfMass": {"z": -0.3, "mass": 8}}; the fields not named keep their defaults. • reference to another component — pass that component's entityRef as a string: {"material": "material_cube_1"}, or null to clear it. • list of references (a mesh's materials) — pass an ARRAY of entityRefs: {"materials": ["mat_a", "mat_b"]}. The array REPLACES the whole list, in the order given — it does NOT append, so name every component you want in it; [] empties the list. The result reports the list before and after, so check that against what you intended.
Several properties in one call is one round trip, and is applied all-or-nothing.
An unknown property name is REFUSED and the valid names are listed, rather than written — so a typo costs a message, not a corrupted project. Renaming (name / entityRef) is refused too: it has to rewrite the code that addresses the component, which only the R3 editor does.
Giving a VehicleWheel its mesh or vehicle measures the wheel from that mesh, as the R3 editor does (Configure from Mesh: radius, connectionPoint, axle); a value named in the same call is kept. Giving a ColliderCuboid / Sphere / Cylinder / Capsule its mesh fits it to that mesh (Fit to Mesh: size, and position on the mesh's centre); giving it only a rigidBody fits the values still at their defaults. The answer says what was measured or fitted and what was kept (PHYSICS_USAGE.md → Vehicles).
Moving or scaling a Mesh keeps what the editor derives from it: a SCALE change re-fits every Cuboid / Sphere / Cylinder / Capsule collider fitted to that mesh (size and offset); moving or scaling a wheel's mesh re-measures the wheel; scaling a vehicle's chassis mesh also carries the wheels' suspensionRestLength and maxSuspensionTravel by the new / old scale on the up axis. The answer lists each.
A Mesh's rotation and quaternion are one orientation held twice: set ONE of them and the other follows (both in one call must agree, or the call is refused).
Changing the parent of a Mesh / Empty / Points / Line ({"parent": "root_empty"}, or null for the scene) keeps it where it is in the world, as the R3 editor's re-parent does: its position, rotation (and quaternion) and scale are rewritten to the values local to the new parent, and the answer lists them. A position, rotation / quaternion or scale given in the SAME call is the new LOCAL value under the new parent, taken as given (as if the parent changed first and that value were set after); the fields not given keep the world place. Under a NON-UNIFORMLY scaled parent a rotated part cannot keep its shape (it would shear): that re-parent is refused unless you give rotation and scale yourself.
| Name | Required | Description | Default |
|---|---|---|---|
| entityRef | No | Which component to change, as reported by r3_project_load, e.g. "mesh_cube_1". | |
| projectId | Yes | The project the component is in, from r3_project_create or r3_project_load. | |
| properties | Yes | What to set: {"roughness": 0.25, "position": {"y": 2}, "material": "material_cube_1"}. | |
| componentId | No | Or its id (r3_project_load) — exactly one of entityRef / componentId. |
Output Schema
| Name | Required | Description |
|---|---|---|
| seq | No | |
| type | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| landed | No | |
| changes | Yes | |
| physics | Yes | |
| entityRef | Yes | |
| keptWorld | No | |
| projectId | Yes | |
| componentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the destructive/non-idempotent annotations: immediate live sync with nothing to save, all-or-nothing multi-property application, typo refusal with valid names listed, physics derivation rules (VehicleWheel measuring, Collider fitting), collider re-fitting on mesh scale, suspension carry-over on chassis scale, and re-parent world-preservation with a shear refusal case. This is exactly the extra context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and live-sync behavior, then organized with bullets for the four value shapes. The length is largely earned by genuine behavioral complexity, though the repeated "The answer says/lists…" phrasing and the live-copy sentence could be tightened.
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, yet the description still summarizes what comes back (what was kept and its seq, list before/after). Given the unconstrained properties bag and the many derived side effects, this is complete enough for an agent to call the tool correctly without opening the editor docs.
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% for the declared parameters, but `properties` is an unconstrained bag whose contents the schema cannot describe. The description supplies the missing semantics in full: the four value shapes, partial-key objects for value components, empty-slot construction, entityRef strings vs. arrays, and the replace-not-append list rule with [] emptying.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (set properties) on a specific resource (a component that already exists in a project), with concrete examples (material roughness, mesh position, which material a mesh uses). It explicitly distinguishes itself from r3_editor_set ("the same tool") and implicitly from r3_component_add by scoping to components that already exist.
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?
Clear context for use (existing component, live project) and explicit when-nots: unknown property names and renames are refused, with renaming routed to the R3 editor. It never explicitly names r3_component_add as the path for creating a new component, leaving that inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_docs_listList the R3 documentationARead-onlyIdempotentInspect
Every R3 document this server can give you, IN READING ORDER, with what each one covers and how big it is. R3's documentation begins here: no model has R3 in its pretraining, and code written from tool descriptions alone saves cleanly and then silently does nothing. r3_docs_read returns one.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| docs | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| apiIndexPath | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so the safety profile is covered structurally. The description adds the reading-order and content/size disclosure, but says nothing about side effects, auth, or limits beyond the annotations, and return content is likely already in the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and scope, then two supporting sentences. The middle sentence is motivational rather than operational, which is slightly at odds with strict economy, but it justifies why the tool exists and 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 an output schema present, return format needn't be re-explained, and the description covers purpose, ordering, and sibling routing. Nothing an agent needs to invoke this zero-param list tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. No parameter semantics are claimed or needed.
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 ('Every R3 document... list') with scope detail ('IN READING ORDER, with what each one covers and how big it is'). It explicitly differentiates from the sibling by noting 'r3_docs_read returns one', so an agent can route between the two 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?
Frames this as the entry point ('R3's documentation begins here') and names the alternative r3_docs_read with its single-document behavior, implying list-first then read-one. There is no explicit when-not or exclusion, so it falls just 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.
r3_docs_readRead one R3 documentARead-onlyIdempotentInspect
Return one R3 document in full, or one API symbol. Paths come from r3_docs_list: r3_docs_read("CODE_PATTERNS.md") how a Code component is written (reading order 1) r3_docs_read("PHYSICS_USAGE.md") colliders, rigid bodies, joints r3_docs_read("HOWTO_PHYSICS.md") one task step by step (how-tos: r3_docs_list) r3_docs_read("api") index of every component, system and event r3_docs_read("api/component/Mesh") one component r3_docs_read("api/system/PhysicsRapier") one system r3_docs_read("api/event/KEY_DOWN") one event, and the data it delivers The API reference is only ever read one symbol at a time — the whole file is too large to serve.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Which document, e.g. "CODE_PATTERNS.md", "api", "api/component/Mesh". From r3_docs_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and closed-world, so safety is covered. The description adds genuinely new behavior: the API reference can only be read one symbol at a time because the whole file is too large to serve, which prevents a futile bulk-read attempt. It does not say what happens on an invalid or stale path, so it stops short of 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?
The core statement and constraint are front-loaded, and each example line earns its place by mapping a path to its content. The table-style indentation is slightly awkward in a plain description and the 'reading order 1' aside is terse, keeping it just below top marks.
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 docs tool with no output schema, everything needed is present: what is returned, how paths are formed, where to get them, and the one-symbol-per-call limit on API reads.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and already gives examples, but the description goes further by enumerating the api/component, api/system and api/event path shapes and what each returns, which the schema does not. This is real added semantic value for constructing a valid path.
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: 'Return one R3 document in full, or one API symbol.' It immediately distinguishes itself from the sibling r3_docs_list, which only supplies paths, and from r3_code_read by being documentation rather than source.
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 r3_docs_list as the source of paths and to r3_docs_list again for how-tos, and even notes a reading order for CODE_PATTERNS.md. The condition for choosing a doc path versus an api/ symbol path is spelled out in the examples.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_editor_add_componentAdd ANY component LIVE to the user's open R3 editorAInspect
The same tool as r3_component_add (this is its older name): add one component of ANY registered type — a collider, a rigid body, a joint, a light, a material, a geometry … — with its values and references set before it is created, kept at once in the project's live copy: every R3 tab with the project open shows it now, no editor needed and nothing to save. Use r3_editor_create for a ready-made object.
type is the short type name, e.g. "ColliderCuboid" (an unknown type is refused with the list). values take r3_component_set's shapes: a plain value {"friction": 0.2}; a value component as the keys to set {"halfExtents": {"x": 2, "y": 0.5, "z": 1}}; a reference as the target's entityRef or id {"rigidBody": "rigidbody_dynamic_1"} — a component of THIS project, of a type the slot accepts. Example — swap a rigid body's collider: add a ColliderCuboid with {"rigidBody": …, "halfExtents": …}, then r3_editor_delete the old collider (mode "one").
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | The component type, e.g. "ColliderCuboid", "RigidBodyFixed", "LightPoint". | |
| values | No | Its values, e.g. {"rigidBody": "rigidbody_dynamic_1", "halfExtents": {"x": 2}, "friction": 0.2}. | |
| projectId | Yes | The project (r3_project_list). |
Output Schema
| Name | Required | Description |
|---|---|---|
| seq | No | |
| live | Yes | |
| type | Yes | |
| saved | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| editor | Yes | |
| created | Yes | |
| entityRef | Yes | |
| projectId | Yes | |
| componentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide safety hints; the description adds the crucial live-sync semantics: the component is kept at once in the project's live copy, every open R3 tab shows it immediately, and nothing needs saving. It also discloses the failure mode for unknown types (refused with the list) and that references must resolve to a component in THIS project of an accepted type.
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 alias identity and live behavior, then parameters, then an example. Slightly dense with backtick-heavy inline detail, but every sentence carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described. The description covers alias identity, live propagation behavior, type/value/reference syntax, refusal behavior, and the follow-up sibling call — complete for a 3-param mutation 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 coverage is 100% (baseline 3), but the description genuinely adds meaning: `type` is the short type name with examples, and `values` accepts three distinct shapes — plain values, value components given as keys to set, and references as entityRef or id. That is detail the schema's free-form object cannot 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?
States a specific verb (add) and resource (one component of ANY registered type) and explicitly identifies the alias relationship to r3_component_add. It distinguishes itself from siblings r3_editor_create (ready-made object) and r3_component_set (values shapes), so an agent can route correctly.
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 alternative (r3_editor_create) and the condition that selects it, and gives an end-to-end example workflow (add ColliderCuboid with rigidBody/halfExtents references, then r3_editor_delete in mode "one"). Explicit when-to-use plus a concrete chained scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_editor_captureTake a picture of the project in the user's open R3 editorARead-onlyInspect
Capture the canvas of a project open in the user's R3 editor — the scene as it looks NOW, running physics included — and LOOK at it: the answer is an image. Call it after a visual change (r3_editor_set, r3_editor_create, r3_editor_code …) to check what you built, and after r3_editor_run to see it move. By default (camera: "editor") it is what the user sees: the editor's view camera, edit aids included. camera: "project" takes it through the project's own camera instead, with no edit aids, as a visitor sees it: use that to check a camera or a camera script. At most 1280 px each way (width, default 1024); a JPEG. Needs project:read.
| Name | Required | Description | Default |
|---|---|---|---|
| width | No | The picture's largest width in px, 64..1280 (default 1024); it keeps the canvas's aspect and is never scaled up. | |
| camera | No | Whose view: "editor" (default) = the editor's view camera the user looks through, edit aids included; "project" = the project's own camera, no edit aids, as a visitor sees it (check a camera script with it). | |
| projectId | Yes | A project open in the user's editor (r3_whoami lists them). |
Output Schema
| Name | Required | Description |
|---|---|---|
| bytes | Yes | |
| width | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| camera | Yes | |
| editor | Yes | |
| height | Yes | |
| mimeType | Yes | |
| projectId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description goes well beyond by disclosing the return type (an image, JPEG), the resolution ceiling (1280 px each way), the default camera semantics, and the project:read permission requirement. That is exactly the kind of context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and outcome, then branches into usage and camera modes. Dense and mostly waste-free, though the parenthetical asides and repeated camera explanations make it longer 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?
With an output schema present, the description need not explain return values, yet it still signals that the answer is an image. Auth needs, default resolution, camera modes, and sequencing with sibling editor tools are all covered, so nothing needed 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 practical meaning: the default behavior of camera:'editor' (user's view, edit aids included) versus 'project' (visitor's view, no edit aids) and the output format/size implications of width. It slightly exceeds what the schema alone conveys.
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 (capture) and resource (the canvas of a project open in the user's R3 editor) with a clear qualifier ('the scene as it looks NOW, running physics included'). It distinguishes itself from siblings like r3_image_create or r3_preview_create by scoping to the live editor viewport.
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 trigger conditions and the sibling tools that precede it: call after a visual change (r3_editor_set, r3_editor_create, r3_editor_code) and after r3_editor_run to see motion. It also gives a targeted use case for the camera:'project' variant (checking a camera or camera script), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_editor_codeRun new code LIVE in the user's open R3 editorADestructiveInspect
The same tool as r3_code_write (this is its older name): replace a Code component's code, kept at once in the project's live copy: every R3 tab with the project open runs the new code now, no editor needed and nothing to save. Name it with componentId or entityRef and pass baseVersion, the codeVersion r3_code_read answered: code is never merged, so on an older version it is refused with the current code and version (apply your change to that and call again). The code is a FUNCTION BODY (a top-level return {start, update};); read r3_docs_read("CODE_PATTERNS.md") for the R3 APIs. A syntax error or an R3 API that does not exist is refused before anything is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The whole new code (a function body). | |
| entityRef | No | Or its entityRef, e.g. "code_spin". | |
| projectId | Yes | The project (r3_project_list). | |
| baseVersion | No | REQUIRED: the codeVersion r3_editor_inspect gave for this Code component (the version your code builds on); null for one never saved (codeVersion null). | |
| componentId | No | The Code component's id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| seq | No | |
| live | Yes | |
| name | Yes | |
| error | Yes | |
| saved | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| editor | Yes | |
| compiled | Yes | |
| warnings | Yes | |
| entityRef | Yes | |
| projectId | Yes | |
| codeVersion | Yes | |
| componentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/openWorld, and the description adds substantial context beyond them: changes apply immediately to all open tabs, code is never merged, a stale baseVersion is refused with the current code and version, and syntax/unknown-API errors are rejected before anything is persisted. This atomicity and conflict-handling detail is exactly the behavioral disclosure the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and most clauses earn their place (conflict handling, function-body format, doc reference). It is a dense run-on sentence with some parenthetical redundancy around the r3_code_write alias, but 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?
With an output schema present, return values need no explanation, and the description still covers naming, versioning, code format, error/refusal behavior, and live semantics. 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 meaning: it explains the componentId/entityRef alternative naming, why baseVersion is required (the version the code builds on), and null for never-saved components. Minor inconsistency: it attributes the codeVersion to r3_code_read while the schema cites r3_editor_inspect.
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 (replace a Code component's code) and resource, plus the exact effect (runs live in every open R3 tab). It explicitly names r3_code_write as the same/older name and r3_code_read as the version source, so an agent can disambiguate 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?
Gives clear context (live application, no editor/save needed) and routes to r3_code_read for the version and r3_docs_read("CODE_PATTERNS.md") for APIs. It does not, however, state when *not* to use it versus r3_code_write or the non-live code path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_editor_createAdd an object LIVE to the user's open R3 editorAInspect
The same tool as r3_factory_run (this is its older name): add an object — a cube, sphere, light, physics body … — kept at once in the project's live copy: every R3 tab with the project open shows it now, no editor needed and nothing to save. r3_factory_list lists the factories and their params.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The name of what you make, e.g. "Leg front left" (r3_factory_run's name). | |
| params | No | Factory options, e.g. {"color": 16711680, "position": {"y": 2}}. Rotation is in RADIANS, color a packed RGB integer. | |
| factory | Yes | Factory name, e.g. "Cube", "Sphere", "PhysicsCube". See r3_factory_list. | |
| projectId | Yes | The project (r3_project_list). |
Output Schema
| Name | Required | Description |
|---|---|---|
| seq | No | |
| live | Yes | |
| roles | Yes | |
| saved | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| editor | Yes | |
| created | Yes | |
| factory | Yes | |
| projectId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, openWorld=true, idempotent=false, so the safety profile is covered. The description adds genuinely new behavioral context: the change is applied immediately, propagates to every R3 tab with the project open, and requires no save step. It does not address calling it twice with the same name (relevant given idempotentHint=false) or whether r3_editor_undo can reverse 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?
A compact two-sentence description with the important live/immediate behavior front-loaded after the alias note. The parenthetical '(this is its older name)' and the trailing factory-list pointer are both useful, though the em-dash/ellipsis phrasing makes the core sentence denser than 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?
For a live-mutation tool with a nested params object and an output schema (so return values need no prose), the description covers what the agent needs: what gets created, that it appears immediately everywhere, and where to get valid factory names. Only edge-case behavior — duplicate names or undoability — is absent.
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 four parameters (name, params, factory, projectId) are already documented with examples and units (radians, packed RGB int). The description only reinforces this by pointing at r3_factory_list for the factory enumeration; it adds no format or constraint detail beyond what the schema supplies, 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 concrete verb and resource ('add an object — a cube, sphere, light, physics body') plus the key scope fact that the object lands in the project's live copy. It explicitly identifies itself as the older name of r3_factory_run, so an agent knows the two are interchangeable, and points at r3_factory_list for the factory vocabulary. It does not distinguish itself from other add-style siblings such as r3_editor_add_component or r3_component_add, which is the remaining 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?
Usage is implied rather than stated: 'no editor needed and nothing to save' tells the agent this takes effect immediately, and r3_factory_list is named as the prerequisite lookup for factory names. There is no explicit when-to-use / when-not guidance and no statement about how this differs from r3_editor_add_component, leaving the agent to infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_editor_deleteDelete components LIVE in the user's open R3 editor (plan, then confirm)ADestructiveInspect
Delete components from the project the user has OPEN in their R3 editor, exactly as the editor's delete dialog asks it — in TWO calls. First call WITHOUT confirm: it returns the plan and changes nothing — the selected components, what only they use (their geometry, material, colliders …), an Entity's members, the modes on offer and a planToken. Then call again with the same componentIds and confirm: {"mode": …, "planToken": …}: "one" deletes only the selection, "with_dependents" also what only it uses, "bundle" (one Entity) the entity with its members. The mode is the user's choice, unless they already said. If the project changes in between, the confirm is refused: plan again. Only when the user asked for it. The confirmed delete is kept at once in the project's live copy (every open R3 tab shows it; no editor is needed); R3 keeps what was deleted in the project's trash. The children of a deleted Empty or Mesh keep their place in the world, as the editor's delete does (their numbers become the scene's; the answer lists them). A project itself is never deleted here. Needs the editor:dispose capability.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Leave out to get the plan; give it to delete what the plan named. | |
| projectId | Yes | The project (r3_project_list). | |
| componentIds | Yes | The ids of the components to delete (r3_editor_inspect / r3_project_load). |
Output Schema
| Name | Required | Description |
|---|---|---|
| seq | No | |
| live | Yes | |
| mode | Yes | |
| modes | Yes | |
| saved | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| editor | Yes | |
| members | Yes | |
| disposed | Yes | |
| selected | Yes | |
| confirmed | Yes | |
| planToken | Yes | |
| projectId | Yes | |
| dependents | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true/idempotentHint=false, but the description adds substantial behavior the annotations cannot: the two-call plan/confirm protocol, that the first call changes nothing, that a stale project refuses the confirm, that the delete is instantly visible in every open tab, that items go to project trash, that Empty/Mesh children retain world position, and the required editor:dispose capability.
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 essential two-call concept and dense with decision-relevant detail, but noticeably long with some redundancy (repeated emphasis on the plan/confirm flow and modes). Each sentence carries information, so it is efficient rather than padded, though it could be tightened.
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, capability-gated, multi-phase tool it covers the full call contract, side effects, failure mode, and capability requirement; output schema exists so return values need not be restated, and it still notes 'the answer lists them' for child handling. 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 earns extra by explaining what the enum modes actually do ('one' vs 'with_dependents' vs 'bundle'), which the schema only names, and by describing planToken provenance and the confirm-vs-omit contract. This adds operational meaning beyond the schema fields.
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 (delete) and resource (components from the project currently OPEN in the R3 editor), and explicitly excludes a nearby confusion: 'A project itself is never deleted here,' which separates it from r3_project_delete and r3_asset_delete. An agent can identify it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when ('Only when the user asked for it'), a when-not ('A project itself is never deleted here'), and the mode-selection rule ('The mode is the user's choice, unless they already said'). It stops short of naming sibling tools to prefer for adjacent tasks (e.g. r3_editor_undo, r3_asset_delete), so it is strong but not fully explicit about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_editor_inspectRead live component values from the user's open R3 editorARead-onlyInspect
Read what components hold RIGHT NOW in an R3 tab that has the project open: runtime values included — a moving body's position while the project runs. Use it to debug live behaviour. It needs a tab with the project open (r3_editor_open opens one). r3_component_read reads the kept values without a tab.
Select with any of: ids (component ids from r3_project_load), type ("Mesh", "RigidBodyDynamic", …) and entityRef; they combine. fields keeps only the properties you name (e.g. ["position", "rotation"]). At most 50 components per call; a larger answer is refused with how to narrow it.
Values are in r3_component_read's shape (value components inline, references as entityRefs), so they can be handed to r3_component_set. The project must be open in the editor (r3_editor_open opens it). Read-only: nothing is changed.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | Component ids to read. | |
| type | No | Only components of this type, e.g. "Mesh" or "R3ComponentMesh". | |
| fields | No | Only these properties, e.g. ["position", "rotation"]. | |
| entityRef | No | Only the component with this entityRef. | |
| projectId | Yes | The project, open in the user's editor. |
Output Schema
| Name | Required | Description |
|---|---|---|
| live | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| editor | Yes | |
| projectId | Yes | |
| components | Yes | |
| unreadable | Yes | |
| projectName | Yes | |
| fieldsNotFound | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses that runtime values are included (a moving body's position while the project runs), that a limit of 50 components per call exists and larger answers are refused with narrowing guidance, and that output shape matches r3_component_read so results can feed r3_component_set. readOnlyHint/destructiveHint are reinforced by 'Read-only: nothing is changed', and the changing live values are consistent with idempotentHint=false.
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 purpose and the live-value distinction, then parameters then constraints. Slightly redundant: the 'project must be open in the editor (r3_editor_open opens it)' requirement is stated twice, once early and once at the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description still flags the output shape and its compatibility with r3_component_set. Prerequisite, limits, filtering semantics, and read-only nature are all covered — nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds semantics the schema does not encode — that ids, type, and entityRef 'combine' (conjunctive filtering) and that fields keeps only the named properties. Examples for fields and type types align with the schema rather than duplicating it verbatim.
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: reading live/runtime component values from a project open in an R3 editor tab. It explicitly contrasts with the nearest siblings, r3_component_read ('kept values without a tab') and r3_editor_open (opens the tab), so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the when ('use it to debug live behaviour'), the prerequisite ('needs a tab with the project open'), the tool that satisfies that prerequisite, and the alternative (r3_component_read) with the condition that selects it. 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.
r3_editor_openShow a project in the user's open R3 editorARead-onlyIdempotentInspect
Open a project in the R3 editor the user has open in their browser (their most recently used R3 tab) and focus it, so they see it. A project already open there is just focused (never reloaded). It is how the user gets to see the project you are working on, and how a tab gets the project r3_editor_inspect reads.
The same access rules as opening it by hand: the user's own projects, their teams', and public ones. The editor holds up to 4 projects; at that limit it refuses. Nothing is saved or changed. When no editor is open, the answer says where the user can open one.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | The project to open, from r3_project_list or r3_project_create. |
Output Schema
| Name | Required | Description |
|---|---|---|
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| editor | Yes | |
| opened | Yes | |
| focused | Yes | |
| projectId | Yes | |
| alreadyOpen | Yes | |
| projectName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, and the description adds real behavior beyond them: an already-open project is focused and never reloaded, the editor refuses at 4 projects, nothing is saved or changed, and the no-editor case returns guidance on where to open one. These are concrete operational traits an agent cannot infer from the 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?
Front-loaded with the core action and its focus-vs-reload nuance; the second paragraph groups access rules, capacity limit, and no-side-effect guarantees. Slightly dense in places (the r3_editor_inspect aside), but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described, and the description still covers the non-obvious cases an agent must handle: nothing persisted, capacity refusal, and the no-open-editor fallback. Complete for a single-parameter 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 coverage is 100% and the projectId property already names its sources (r3_project_list / r3_project_create). The description adds no format, validation, or edge-case semantics for the parameter, so the 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 (open), resource (project), and target surface (the user's currently open R3 editor tab), with the exact behavior of focusing an already-open project. It implicitly distinguishes itself from r3_project_load and r3_editor_create by framing this as 'show the user' rather than load/create.
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?
Explains the reason to call it (it is how the user sees the project, and it is the precondition that r3_editor_inspect reads against) and documents the access rules and the 4-project refusal limit. It does not explicitly exclude or compare against the closest sibling r3_project_load, so it stops short of full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_editor_runRun the project in the user's open R3 editorAIdempotentInspect
Press the Run buttons of the user's open R3 editor: start physics, code, audio and music (all of them, or the ones named in systems), exactly as the user's own click does — a paused simulation resumes. Use it to TEST what you built: run it, then look with r3_editor_capture and read live values with r3_editor_inspect. Changes nothing saved. The systems serve every project open in that editor tab. The scene only moves while that tab is in front: a browser pauses a background tab, and the answer then says the scene is NOT advancing. Needs the editor:run right.
| Name | Required | Description | Default |
|---|---|---|---|
| systems | No | Which of the editor's Run / Stop buttons: physics, code, audio, music. Leave out for all of them. | |
| projectId | Yes | A project open in the user's editor (r3_whoami lists them). |
Output Schema
| Name | Required | Description |
|---|---|---|
| action | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| editor | Yes | |
| systems | Yes | |
| projectId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), and the description adds substantial context beyond them: nothing is persisted, a paused simulation resumes, the browser pauses background tabs so the response may report the scene is NOT advancing, and the editor:run right is required. This is exactly the extra behavioral content annotations cannot express.
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 verb and resource, and virtually every sentence carries distinct value (effect, workflow, persistence, tab caveat, permission). It is dense but not padded; the only minor cost is length and a few fragmentary asides like 'Needs the editor:run right.'
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-style tool with an output schema, the description still covers the things an agent needs: side-effect scope (nothing saved), permission requirement, tab-focus failure mode, resumption semantics, and the intended testing workflow. Nothing material is left to inference.
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 documented in the schema, including the systems enum of subsystems. The description only restates the default ('all of them, or the ones named in systems') without adding syntax or format detail, 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 action (press Run in the user's open R3 editor) plus the exact subsystems affected (physics, code, audio, music). It is immediately distinguishable from r3_editor_stop and from the read-oriented siblings r3_editor_capture / r3_editor_inspect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when: 'Use it to TEST what you built', followed by a concrete workflow naming the follow-up tools (r3_editor_capture, r3_editor_inspect). It also supplies a conditional caveat (scene only advances while the tab is foregrounded). No explicit when-not against r3_editor_stop or r3_factory_run, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_editor_setChange a property LIVE in the user's open R3 editorADestructiveInspect
The same tool as r3_component_set (this is its older name): change properties of a component, kept at once in the project's live copy: every R3 tab with the project open shows it now, no editor needed and nothing to save.
Name the component with componentId or entityRef. values take r3_component_set's shapes: a plain value {"roughness": 0.25}; a value component as an object of the keys to change {"position": {"y": 2}} (an EMPTY slot, e.g. a rigid body's centerOfMass, is made from the fields given: {"centerOfMass": {"z": -0.3, "mass": 8}}); a reference as the target's entityRef {"material": "material_cube_1"} (null clears it); a list of references as an array of entityRefs (it REPLACES the list). All-or-nothing: an unknown name is refused with the valid ones. A Code component's code is r3_editor_code's.
| Name | Required | Description | Default |
|---|---|---|---|
| values | Yes | What to set: {"visible": false, "position": {"y": 2}, "material": "material_cube_1"}. | |
| entityRef | No | Or its entityRef, e.g. "mesh_cube_1". | |
| projectId | Yes | The project (r3_project_list). | |
| componentId | No | The component's id (r3_project_load / r3_editor_inspect). |
Output Schema
| Name | Required | Description |
|---|---|---|
| seq | No | |
| live | Yes | |
| type | Yes | |
| saved | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| editor | Yes | |
| landed | Yes | |
| changes | Yes | |
| entityRef | Yes | |
| projectId | Yes | |
| componentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true, idempotent=false and openWorld=true, so the safety profile is covered. The description adds real behavioral context beyond that: all-or-nothing application, unknown names refused with the valid ones returned, live propagation across tabs, and the null-clears / list-replaces semantics.
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 identity and live-propagation point, then spends the rest on parameter shape detail, which is dense and mostly earns its place. The opening parenthetical about the older name is slightly redundant but sets up the sibling relationship.
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 mutation with an output schema present and full annotation coverage, the description supplies the missing pieces: atomicity, null/list semantics, and code-change routing. It stops short of noting permission or session prerequisites, but the agent otherwise has enough 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?
Although schema coverage is 100%, the description goes well past the schema's thin 'What to set' note by enumerating every accepted values shape: plain value, value-component object, empty-slot construction, entityRef reference, null to clear, and array-of-refs which replaces the list. It also clarifies that componentId and entityRef are interchangeable 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?
States a specific verb and resource (change component properties) and pinpoints scope: the project's live copy, reflected in every open R3 tab. It also explicitly disambiguates from siblings, noting it is the older name for r3_component_set and deferring code changes to r3_editor_code.
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 clear operating context ('live', 'no editor needed, nothing to save') and routes one case to an alternative, telling the agent that a Code component's code belongs to r3_editor_code. It does not, however, explain when to prefer this over its alias r3_component_set, which is a notable gap given it declares them identical.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_editor_set_preview_imageSet the project's share image from the user's open R3 editorADestructiveIdempotentInspect
Use what the project's camera shows NOW, in the user's open R3 editor, as the project's share image: the picture its live page, link previews (social cards) and the showcase show, used when the project is next published (r3_publish_live, or Publish update in the editor). The editor waits until the scene's textures have loaded and takes it without edit aids (no grid, gizmos or outlines), as a visitor sees it; the answer is the picture it set. It is for once the project looks right (r3_editor_capture shows it beforehand), or when the user asks for a new picture. A live page keeps the share image of its live release until that next publish. Needs a tab with the project open and project:write.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | A project open in the user's editor (r3_whoami lists them). |
Output Schema
| Name | Required | Description |
|---|---|---|
| bytes | Yes | |
| saved | Yes | |
| width | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| editor | Yes | |
| height | Yes | |
| mimeType | Yes | |
| projectId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond annotations: it waits for textures to load, excludes edit aids (grid, gizmos, outlines), returns the picture it set, and notes a live page keeps its old share image until the next publish. The overwrite of a previously set share image (which underlies destructiveHint=true) is only implied, not stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every clause carries information, though the first sentence is a long chain of appositives that could be split for readability. No filler or restatement of the 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?
An output schema exists, so return values need not be explained, and the description still covers timing, permissions, and publish coupling. The one missing piece is an explicit statement that an existing share image is replaced, which matters given the destructive annotation.
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 projectId parameter is already documented as 'a project open in the user's editor'. The description only reinforces that an open editor tab is required, adding little 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 a specific verb and resource: use what the camera shows NOW in the open R3 editor as the project's share image, and names exactly where that image surfaces (live page, link previews, showcase). It distinguishes itself from r3_editor_capture (preview beforehand) and ties the result to r3_publish_live.
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 trigger conditions ('once the project looks right', 'when the user asks for a new picture') and names the alternative tool (r3_editor_capture) for checking the view first. The prerequisite of an open editor tab plus project:write is spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_editor_stopStop the project in the user's open R3 editorAIdempotentInspect
Press the Stop buttons of the user's open R3 editor: stop physics, code, audio and music (all of them, or the ones named in systems), exactly as the user's own click does. Stopping physics puts every body back where it was placed. Changes nothing saved. Needs the editor:run right.
| Name | Required | Description | Default |
|---|---|---|---|
| systems | No | Which of the editor's Run / Stop buttons: physics, code, audio, music. Leave out for all of them. | |
| projectId | Yes | A project open in the user's editor (r3_whoami lists them). |
Output Schema
| Name | Required | Description |
|---|---|---|
| action | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| editor | Yes | |
| systems | Yes | |
| projectId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, idempotent and non-destructive, and the description adds context those cannot carry: the physics side effect ('puts every body back where it was placed'), a persistence guarantee ('Changes nothing saved'), and an authorization requirement (editor:run right). It is consistent with, and strictly additive to, the annotation set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action, followed by scope, side effects, persistence and prerequisite in descending order of need. No sentence is redundant padding; the parenthetical qualifier on `systems` earns its space by clarifying the all-vs-named choice.
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 no explanation, and the annotations cover safety. The description supplies the remaining pieces an agent needs: permission requirement, scope selection, side effect on physics bodies, and the guarantee that nothing is persisted.
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. The description restates the `systems` semantics ('all of them, or the ones named in `systems`') without adding new syntax, ordering or default behavior beyond what the schema and its enum-like value list provide. 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 ('Stop') and resource ('the user's open R3 editor'), enumerates exactly what gets stopped (physics, code, audio, music), and is unmistakably the inverse of the sibling r3_editor_run. An agent can tell what it does and what it does not do without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear prerequisite ('Needs the editor:run right') and frames invocation as equivalent to the user's own Stop click, which tells the agent when calling it is appropriate. It never names r3_editor_run as the counterpart in an explicit 'to do X instead, use Y' form, so it stops 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.
r3_editor_undoUndo your own last change to a projectADestructiveInspect
Undo the last change YOU (this agent key or app connection) made to a project: everything one of your tool calls changed is undone together, and the user sees it at once in any R3 tab that has the project open. Use it when your own change was wrong or the user asks you to take it back. It never undoes the user's changes or another agent's: only yours. count undoes your last few changes, newest first.
If someone else changed the same thing after you, that change of yours is SKIPPED: nothing is changed, the answer says who changed what, and that change of yours is dropped from your history (the next call takes the one before it). Their change stands: setting your old value back over theirs is the user's decision, not this tool's.
redo: true puts back what you undid (until you make a new change). Needs project:write (and code:write to undo a change to code).
| Name | Required | Description | Default |
|---|---|---|---|
| redo | No | true: redo what you undid instead of undoing. | |
| count | No | How many of your changes to undo (or redo), newest first (default 1, at most 20). | |
| projectId | Yes | The project (r3_project_list). |
Output Schema
| Name | Required | Description |
|---|---|---|
| left | Yes | |
| steps | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| headSeq | Yes | |
| direction | Yes | |
| projectId | Yes | |
| skippedSteps | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: it explains that all changes from one tool call are undone together, that the user sees the result immediately in open R3 tabs, that conflicting later changes are SKIPPED and dropped from history, and that redo is valid only until a new change is made. It also discloses required permissions (project:write and code:write for code changes), which annotations do not cover.
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 then covers edge cases in a logical order. It is slightly verbose and has some redundancy (e.g., repeating that it only affects the agent's own changes), but every sentence carries useful information for correct invocation.
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 complexity of undo/redo with conflict handling, the description covers scope, skip behavior, redo validity, and permission requirements. An output schema exists so return values need not be explained, and annotations already declare the destructive/non-idempotent profile, making the definition complete for an agent to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters in detail. The description repeats 'newest first' for count and adds only the redo window ('until you make a new change') beyond what the schema provides, so it does not meaningfully extend parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Undo the last change ... made to a project') and scopes it precisely to changes made by this agent key or app connection. It distinguishes itself from siblings like release rollback or project changes by explicitly limiting undo to the agent's own tool calls, so an agent can identify it without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use ('when your own change was wrong or the user asks you to take it back') and when-not-to-use ('It never undoes the user's changes or another agent's: only yours'). It does not name an alternative tool for undoing others' changes, so it falls short of the explicit alternatives criterion for a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_factory_listList what can be built in R3ARead-onlyIdempotentInspect
List the R3 factories available to r3_factory_run, with each one's options, types and defaults. A factory builds a complete, correctly-wired object — a cube is a mesh plus geometry plus material plus colour, already connected. Call this before r3_factory_run if you are unsure of a factory name or its options.
| Name | Required | Description | Default |
|---|---|---|---|
| factory | No | Optional: return only this factory, e.g. "Cube". Omit for all of them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and a closed-world scope, so the safety profile is covered. The description adds genuinely non-structural context: that each entry carries options, types and defaults, and what a 'factory' actually produces. It stops short of describing return shape or pagination, hence not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and followed by usage guidance. The middle explanatory sentence about what a factory builds is slightly verbose but earns its place by grounding the term 'factory'.
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 usefully pre-announces that entries include options, types and defaults, and it covers both purpose and call timing. A little more on the returned structure would make it fully self-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?
Schema description coverage is 100%, so the single optional 'factory' parameter is already fully documented with an example ('Cube'). The description mentions entries have options/types/defaults but adds no syntax or filtering detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (R3 factories), and names the sibling it serves (r3_factory_run) so it is immediately distinguishable from that tool. The additional clause about a factory producing a complete wired object makes the concept concrete rather than abstract.
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 trigger: 'Call this before r3_factory_run if you are unsure of a factory name or its options.' It names the alternative tool and the exact condition that selects this one, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_factory_runAdd something to an R3 projectAInspect
Add an object to an existing R3 project — a cube, sphere, terrain, lighting, a physics body, and so on. Each factory builds a complete, correctly-wired object (mesh + geometry + material + colour, already connected), so you never assemble components by hand. Kept at once in the project's live copy: every R3 tab with the project open shows it now, no editor needed and nothing to save (r3_editor_create is the same tool). The answer says what was kept and its seq. "name" names what you make ("Leg front left" → entityRef leg_front_left): the primary component (a cube's Mesh, a light), unique in the project (a name already used gets _2); its geometry and material take it too (leg_front_left_geometry, leg_front_left_material). Name parts when you make them: renaming later is done in the R3 editor. "StudioLighting" lights a scene the way a photo studio does: one of R3's built-in HDR environments (studio, sunset, sky) as the scene's environment, so metal and glossy materials reflect, plus a key light. Use r3_factory_list to see the factories and their options.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The name of what you make, e.g. "Leg front left" (at most 120 characters). Its entityRef, the name code uses, follows from it (leg_front_left). | |
| params | No | Factory options, e.g. {"color": 16711680, "position": {"y": 2}}. Every option has a default. NOTE: rotation is in RADIANS and color is a packed RGB integer. | |
| factory | Yes | Factory name, e.g. "Cube", "Sphere", "PhysicsCube". See r3_factory_list. | |
| projectId | Yes | The project to add to, from r3_project_create. |
Output Schema
| Name | Required | Description |
|---|---|---|
| seq | No | |
| roles | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| created | Yes | |
| factory | Yes | |
| physics | Yes | |
| projectId | Yes | |
| componentCount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: writes land in the project's live copy, every open R3 tab reflects the change immediately, nothing needs saving, and the response reports what was kept plus its seq. It also discloses the name-collision behavior (a reused name gets _2) and that renaming afterwards must happen in the R3 editor — consistent with destructiveHint=false and idempotentHint=false.
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 correctly — what it does, then the live-copy behavior, then naming — but it is a dense run-on paragraph that packs naming rules, live sync, and a multi-sentence StudioLighting tutorial together. The live-editing point is restated twice ("every R3 tab shows it now" / "no editor needed and nothing to save"), and the studio-lighting digression interrupts the flow.
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 mutating factory tool with four documented params and an output schema, nothing essential is missing: side effects on the live project are covered, naming/identity semantics are covered, option discovery is delegated to r3_factory_list, and return content is summarized rather than re-specified.
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 already 100%, so the baseline is 3, but the description adds real meaning: how "name" propagates to entityRef and to derived geometry/material names, and that collisions are suffix-disambiguated. The lengthy StudioLighting passage effectively explains one factory's params (HDR environment + key light), though it is oddly placed and factory-specific rather than general.
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 ("Add an object to an existing R3 project") plus the concrete object families (cube, sphere, terrain, lighting, physics body). It also distinguishes itself from the component-level siblings by explaining that factories produce fully-wired objects, and explicitly identifies r3_editor_create as the same tool.
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?
Clear routing guidance: "Use r3_factory_list to see the factories and their options" for discovery, and "so you never assemble components by hand" implicitly steers away from r3_component_add/r3_editor_add_component. It never names those siblings explicitly as the alternative, so the exclusion is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_help_writeWrite the project's help overlayADestructiveInspect
Set the instructions that ship WITH a project — controls, what to press, what it does. R3 renders them in a modal behind a floating "?" button and the H key, in the editor and in the live portal alike, so whoever opens your preview link can read them. This is the built-in surface for that, so a Code component needs no overlay of its own.
The body is markdown — headings, bullets, code, links: the controls as a player needs them, e.g. "## Controls\n\n- Space — jump".
A project has ONE help. Call this again and it replaces the text rather than adding a second. REPLACING needs baseVersion, the codeVersion r3_component_read gave for the Help: text is never merged, so a write on an older version is refused with the current text. The first Help needs none. The optional title is the modal's heading ("Controls", "How to play"); leave it out to keep "Help".
Kept at once in the project's live copy: every R3 tab with the project open shows it now. The result gives you the component's entityRef — pass that to r3_component_set to change the trigger key, move or hide the button, or have the help open automatically on load.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Heading shown at the top of the modal, e.g. "Controls". Default "Help". | |
| markdown | Yes | The help text, as markdown. Replaces whatever is there. | |
| projectId | Yes | The project to write into, from r3_project_create or r3_project_load. | |
| baseVersion | No | REQUIRED when the project already has a Help: its codeVersion, from r3_component_read. Leave it out for the first Help. |
Output Schema
| Name | Required | Description |
|---|---|---|
| seq | No | |
| name | Yes | |
| title | Yes | |
| action | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| warnings | No | |
| entityRef | Yes | |
| projectId | Yes | |
| codeVersion | Yes | |
| componentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the replace-not-append semantics, the optimistic-concurrency rule that an older baseVersion is refused with the current text, and that the change is applied at once to the project's live copy. It does not discuss permissions or whether the write is undoable, so it stops just short of full behavioral coverage for a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short paragraphs, purpose front-loaded and each block carrying distinct information. It is longer than strictly necessary and restates the baseVersion requirement that the schema also documents, but there is little filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent write with an output schema, everything an agent needs is present: lifecycle of the single Help entity, concurrency handling, live-propagation behavior, and a pointer to the downstream tool that consumes the returned entityRef.
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: why baseVersion exists and when to omit it, what the title does by default, and a concrete markdown format example for the body. The syntax-level detail the markdown parameter accepts is the main thing left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Set the instructions that ship WITH a project" is a specific verb and resource, and the description immediately distinguishes it from adjacent tools by noting a Code component "needs no overlay of its own" and that trigger/layout changes go to r3_component_set.
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 when to call (setting help text), when baseVersion is required vs. omitted (replace vs. first write), what happens on a stale version, and explicitly routes the agent elsewhere for trigger key/move/hide via r3_component_set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_image_createAdd an image you generated to this R3 accountAInspect
Store a small image YOU generated in this R3 account's image library and get back the URL for it — the value R3ComponentTexture.url takes. This is how you make a checkerboard, a gradient, a test grid or a noise tile and then actually put it on something with r3_component_set.
Pass the image as a base64 data URL (data:image/png;base64,…), up to 1MB decoded. PNG, JPEG, GIF and WebP are stored; PNG is the right choice for a generated pattern.
This is NOT a way to upload an image file you already have. You would have to emit every byte of it as base64, which for a real texture is far more output than a reply can hold — and this server cannot read your disk. A person uploads real artwork in the R3 app, and r3_image_list shows what they have already put there: the account's own artwork, where there is some, beats a generated substitute.
Each call stores a NEW image, so calling it twice with the same bytes leaves two rows. The name you give is what appears in the owner's Images browser, prefixed with "agent-" so they can tell where it came from; a descriptive one says what it is.
For a material's texture set (colour + normal + roughness that tile), use r3_texture_create instead: R3 renders it, so no bytes go through you.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | A short plain-language name, e.g. "checkerboard 512". Stored as agent-checkerboard-512.png and shown to the account owner, so describe what the image IS. | |
| dataUrl | Yes | The image, as data:image/png;base64,… — up to 1MB once decoded. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| imageId | Yes | |
| filename | Yes | |
| mimeType | Yes | |
| sizeBytes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, non-idempotent, non-destructive and open-world; the description adds real behavioural context beyond them: the 1MB decoded limit, accepted formats, PNG as the recommended choice, that each call creates a NEW row even with identical bytes, and that the name is surfaced to the owner with an 'agent-' prefix. This is exactly the kind of consequence-level detail 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 return value, then constraints, then exclusions/alternatives — a sensible order. It is on the long side at four paragraphs and repeats the 1MB/base64 point that the schema also states, but every remaining sentence carries information an 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?
An output schema exists and the description still names the returned value (the URL for R3ComponentTexture.url), so return semantics are covered. Limits, formats, naming side effects, non-idempotency and sibling routing are all present; nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description goes further by stating the exact data-URL form (data:image/png;base64,…), the decoded size ceiling, and the user-visible effect of 'name' (stored as agent-<name>.png and shown in the owner's browser), which the schema only partially conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource ('Store a small image ... in this R3 account's image library and get back the URL') and explicitly frames its role in the workflow with r3_component_set. It is clearly distinguishable from r3_image_list (reading existing art) and r3_texture_create (server-rendered texture sets).
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 negative case ('NOT a way to upload an image file you already have') with the reason (base64 byte cost, no disk access) and routes to alternatives: r3_image_list for existing artwork, r3_texture_create for tiling material sets. The use case (checkerboard, gradient, test grid, noise tile) is spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_image_listList the images on this R3 accountARead-onlyIdempotentInspect
List the images this R3 account owns, with the URL to use for each one. That URL is exactly what R3ComponentTexture.url takes, so this is how you find the account's own artwork — a wood grain, a logo, a skybox — and then point a texture at it with r3_component_set.
Search by name rather than paging: search: "wood" is matched against every image on the account by the server, not against the page you happen to be holding.
Each row says whether it is a "texture" (an ordinary image for a material slot) or an "environment" map (.hdr / .exr). Those two are not interchangeable: an environment map belongs on Scene.environment, Scene.backgroundTexture or MaterialStandard.envMap, and renders as garbage in an ordinary map slot.
You cannot upload an existing image file from here — a tool argument is JSON, this server cannot read your disk, and a real texture is megabytes. A person uploads those in the R3 app. r3_image_create is the one exception: it takes a small image you generated yourself, such as a checkerboard or a gradient.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many to return (default 25, max 100). | |
| cursor | No | Continue a previous listing: pass the nextCursor it returned, unchanged. Omit for the first page. | |
| search | No | Match this text against the file names, on the server. Omit for everything. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| images | Yes | |
| search | Yes | |
| hasMore | Yes | |
| nextCursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: it discloses that each row is typed "texture" vs "environment", that these are not interchangeable and where each belongs, and that the returned URL is directly consumable by R3ComponentTexture.url. That is real operational context an agent cannot get from 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?
Front-loaded with the purpose, and every paragraph carries distinct, non-redundant information (search behavior, asset typing, upload boundary). It is longer than strictly necessary and could be tightened, but no sentence is 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-field documentation is not needed. What an agent needs beyond that — what the URL is for, how the rows differ in kind, the search-vs-paging choice, and the boundary with r3_image_create — is all 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 coverage is 100%, so limit/cursor semantics are already covered and the baseline is 3. The description earns above baseline by clarifying that search is evaluated server-side against every image on the account rather than the currently held page — a behavioral nuance the schema's "on the server" phrasing does not fully explain.
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 the images this R3 account owns") plus the return payload's key field ("the URL to use for each one"). It also implicitly separates itself from siblings that create or delete assets, and explicitly names r3_image_create as the only upload path.
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 ("Search by name rather than paging"), explains why (server-side match across the whole account, not the current page), and names the alternative tool for the adjacent job (r3_image_create). It also states the one thing you cannot do here (upload an existing file) and why.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_preview_createCreate a preview linkADestructiveIdempotentInspect
Create a shareable preview link for a saved R3 project, so a person can open it in a browser and see it running. The link is valid for 7 days and does NOT make the project public; making a new one is free. It is how the user sees what you built. Takes the projectId returned by r3_project_create. When an R3 tab has the project open, the project's picture (its card and the link's image) is refreshed from that tab; when none has, the picture refreshes the next time the project is opened in R3.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | The project id, as returned by r3_project_create. |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| projectId | Yes | |
| previewUrl | Yes | |
| environment | Yes | |
| cameraControls | Yes | |
| expiresInHours | Yes | |
| pictureOutdated | Yes | |
| pictureRefreshed | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover mutation/open-world/idempotent/destructive traits, and the description adds useful non-obvious behavior: 7-day validity, not public, free to recreate, and preview-image refresh behavior depending on whether an R3 tab has the project open. It does not explain why destructiveHint=true applies, but it does not contradict that annotation.
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 purpose is front-loaded and the key constraints (7 days, not public, free) are stated early. The final sentence about preview-image refresh is detailed but still adds useful nuance rather than 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?
With an output schema present and a single fully documented parameter, the description supplies enough context to call the tool correctly, including expiry and privacy behavior. A brief note clarifying the destructive annotation would make it fully 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 coverage is 100%, so the projectId parameter is already fully documented in the input schema. The description only repeats that it comes from r3_project_create and adds no extra syntax or format 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 and resource: create a shareable preview link for a saved R3 project so it can be opened in a browser. This clearly distinguishes it from siblings like r3_preview_remove and r3_publish_live.
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?
Explains the practical use case ("how the user sees what you built") and implicitly distinguishes it from publishing by noting it does NOT make the project public. It stops short of explicitly naming alternatives such as r3_publish_live or r3_preview_remove.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_preview_removeRemove a preview linkADestructiveIdempotentInspect
Remove the preview link of an R3 project: every preview link to it stops working at once (teammates' too). Only when the user asked for it, or when the preview link is what blocks an r3_project_delete the user asked for: a preview link is temporary, so it may then be removed without a separate request, and the user is told it was removed. A live project stays live; a project that was only previewed is no longer published. Deletes nothing: r3_preview_create makes a new link. A project with no open preview link is refused and left as it is. Needs the publish:preview right.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | The project id (r3_project_list). |
Output Schema
| Name | Required | Description |
|---|---|---|
| live | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| projectId | Yes | |
| environment | Yes | |
| previewRemoved | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses the blast radius ('every preview link to it stops working at once (teammates' too)'), the post-state distinction (live project stays live vs. preview-only project becomes unpublished), the no-open-link refusal, and the needed 'publish:preview' right. The 'Deletes nothing' line usefully scopes what destructiveHint=true actually means (link removal, not data loss). Minor deduction only because it's already very close to complete.
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 side effect, and every sentence carries real information (scope, exceptions, refusal, auth). Slightly weakened by colon-heavy run-on sentences that stack multiple clauses, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers everything else an agent needs: side effects on teammates, live-vs-preview post-state, the refusal case, the permission requirement, and the related sibling. Nothing material is missing for a one-parameter 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 100% with a single required projectId already documented as 'The project id (r3_project_list)'. The description adds no format or syntax detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Remove the preview link of an R3 project') and immediately distinguishes itself from siblings by noting it 'Deletes nothing: r3_preview_create makes a new link.' An agent can tell this apart from r3_preview_create and r3_project_delete 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 states when to use it ('Only when the user asked for it') and the one narrow exception (when the preview link 'blocks an r3_project_delete the user asked for'), including why no separate request is needed. This is exactly the when/when-not/alternative 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.
r3_project_changesList what others changed in a projectARead-onlyInspect
What OTHER people changed in a project — the user in any R3 tab, their other agents — oldest first, grouped per author and per thing: properties set, code and help updated (with versions), components added, deleted or restored, the project renamed. Your own changes are never listed. Every answer about a project already ends with a short "Since your last call" line; this is its full list.
Without since: from where you last looked (and moves that mark to now, unless advance: false). The mark belongs to your agent key or app connection, not to the conversation: two conversations on one share it. With since (a seq, e.g. the one the "+N more" line names, or 0 for everything still in the log): from there, without moving anything. Needs project:read.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | At most this many groups, the newest (default 50, at most 200); the rest are counted. | |
| since | No | List from this seq on (the "+N more" line names it; 0 = everything the log still holds). | |
| advance | No | Without since: move your mark to now (default true). false reads without moving it. | |
| projectId | Yes | The project (r3_project_list). |
Output Schema
| Name | Required | Description |
|---|---|---|
| more | Yes | |
| first | Yes | |
| toSeq | Yes | |
| total | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| groups | Yes | |
| unread | Yes | |
| fromSeq | Yes | |
| projectId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing a state side effect the schema can't convey: without `since` the call MOVES the read mark, and the mark belongs to the agent key/app connection so two conversations share it. That is exactly the kind of hidden behavior an agent needs. It falls short of 5 only because it doesn't note the mild tension with readOnlyHint (the cursor is mutated) nor any rate/volume caveats beyond the limit cap.
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 purpose in the first clause and keeps the summary formation/last-call relationship early. The second paragraph is dense but each sentence carries real routing or semantics information; minor cost is that the parentheticals make it harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return values need no explanation, annotations carry the read-only profile, and the description still adds the mark lifecycle, the auth requirement ('Needs project:read'), and the exhaustion behavior. An agent has everything needed to call this correctly on the first try.
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 baseline is 3, but the description adds genuine meaning: it explains what a `seq` is, that `0` means everything still in the log, and — crucially — the interaction between `since` and `advance` (whether the mark moves). That interaction is not derivable from the field descriptions alone.
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?
Names a specific verb and resource — listing what OTHER people changed in a project — and immediately narrows scope with 'oldest first, grouped per author and per thing' plus a concrete enumeration of change types. The line 'Your own changes are never listed' crisply separates it from any self-activity tool among the 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?
Explicitly positions the tool against a known alternative surface: 'Every answer about a project already ends with a short "Since your last call" line; this is its full list.' It then splits usage into the two calling modes (with vs. without `since`) and states the conditions selecting each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_project_createCreate an R3 projectAInspect
Create a new R3 project and save it to the user's account. Produces a complete, openable project — scene, world, camera, renderer, lighting, audio listener, music transport and OrbitControls (anyone who opens it can turn and zoom the view) — ready for components to be added. Pass template for a phone project (mobile-portrait / mobile-landscape) that fills the screen when published. Returns the project id, which every other project tool takes. r3_whoami confirms which account it is created in.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Project name, shown in the user's project list. Defaults to "Untitled Project". Max 120 characters. | |
| camera | No | Where the project's camera starts and what it looks at, e.g. framing a model you add next. Omit it for the default: (0, 5, 10) looking at the origin. | |
| template | No | Start from a project template instead of an Empty Project. "mobile-portrait" — A phone held upright: designed at 390×844 (~19.5:9), fills the screen when published. "mobile-landscape" — A phone held sideways: designed at 844×390 (~19.5:9), fills the screen when published. A template sets the renderer's design size and fullscreen (the canvas fills the screen it runs on; the camera follows the screen's shape, never letterboxed) and the camera's field of view for that orientation. Omit it for an Empty Project, whose renderer also fills the screen (an 800×600 fallback size, the default 75° field of view). |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| template | No | |
| projectId | Yes | |
| environment | Yes | |
| componentCount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say this is a non-read-only, non-idempotent, open-world, non-destructive write. The description goes well beyond that by enumerating exactly what a new project contains (scene, world, camera, renderer, lighting, audio listener, music transport, OrbitControls), what `template` changes about the published result, and what the call returns. That is the kind of context an agent needs before a mutating call with no annotations explaining scope.
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 action and the output, and every clause earns its place. The long parenthetical about OrbitControls is the one patch that could be tightened, and the second sentence is dense with list items.
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, this covers what the agent can't get from structured fields: what a new project contains, what a template does differently, which account it lands in, and what the return id is used for. Nothing needed 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 per field the schema already does the work. The description still adds a reason to pass `template` — that a phone project fills the screen when published — which the enum alone doesn't fully convey. It doesn't add anything about `name` or `camera`, hence 4 rather than 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 and resource ('Create a new R3 project'), plus where it lands ('save it to the user's account'), which immediately separates it from r3_project_load, r3_project_list and r3_project_delete. No sibling could be confused for this one.
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?
Makes the create-new case explicit and routes the agent to `template` for phone projects and to r3_whoami for account verification. It doesn't state a when-not (e.g. 'use r3_project_load for existing projects'), but the context is clear enough to choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_project_deleteDelete an R3 projectADestructiveInspect
Permanently delete an R3 project. With the project:delete:created right (on by default), only a project YOU created (this agent key or app connection) — use it to clean up your own abandoned attempts; the user's own projects and other agents' are refused. With project:delete:owned, any project the user owns, and only when the user asked for it: pass owned: true for a project you did not create (an app connection is then asked for that right). A published project (live, or with an open preview link) is refused: it must be taken offline first. If the refusal is for a preview link (temporary, 7 days), it may be removed without a separate request (r3_preview_remove) and the delete tried again; the user is then told it was removed. If the project is live, other people can open it: it goes offline only once the user has been asked and agreed, never as a step of the delete. This is irreversible: there is no trash and no undo.
| Name | Required | Description | Default |
|---|---|---|---|
| owned | No | true when the project is one of the user's own, not one you created: it needs project:delete:owned. Only when the user asked to delete it. Leave out for a project you created. | |
| projectId | Yes | The project id to delete: one you created, or (with project:delete:owned) any project the user owns. |
Output Schema
| Name | Required | Description |
|---|---|---|
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| deleted | Yes | |
| projectId | Yes | |
| environment | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive=true, but the description goes far beyond them: it discloses the authorization model (project:delete:created vs project:delete:owned), the refusal conditions, the app-connection prompt, and that the operation is irreversible with no trash or undo. It also promises the tool never unpublishes a live project as part of the delete.
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 outcome, then proceeds in priority order through permission conditions, refusals, and irreversibility. The density is justified by the complexity, though a few clauses (preview-link explanation) could be tightened.
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 mutation with a complex permission model, every decision an agent must make is covered: which right applies, what the owned flag does, what gets refused, and recoverability. An output schema exists, so return values need not be described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds context the schema does not: that owned:true carries an authorization consequence, is only valid when the user explicitly asked for the deletion, and triggers an app-connection prompt. This gives the flag semantic weight beyond its type definition.
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 ('Permanently delete an R3 project') and immediately scopes it against the siblings r3_project_create/rename and the preview tool. An agent can tell exactly what this does and does not remove, 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?
Explicit about when to use it (cleaning up your own abandoned attempts) versus when it will be refused (the user's own projects, other agents' projects, live or preview-linked projects). It names the prerequisite right, the alternative tool r3_preview_remove, and the ordering constraint (take offline first).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_project_listList the R3 projects this account can work onARead-onlyIdempotentInspect
List the projects this R3 account can work on — its own and its teams' — last updated first, with the projectId every other project tool takes. It is how a project the user names ("my slot machine") rather than giving an id is found: search for it; its projectId is what r3_project_load takes.
Search by name rather than paging: search: "slot" is matched (case-insensitively, anywhere in the name) against EVERY project by the server, not against the page you are holding. Names are not unique: when more than one project matches, the candidates' name, team and last save tell them apart, and which one is meant is the user's answer.
Each row says whose space it is in (personal, or a team by name), the account's role on it (a viewer cannot save changes), whether it is in the R3 Community, and whether you (this agent key or app connection) created it.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many to return (default 25, max 100). | |
| cursor | No | Continue a previous listing: pass the nextCursor it returned, unchanged. Omit for the first page. | |
| search | No | Match this text against project names, on the server (case-insensitive). Omit for every project. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| search | Yes | |
| hasMore | Yes | |
| projects | Yes | |
| nextCursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open-world), so the bar is lower. The description adds real context beyond that: names are not unique, candidates are disambiguated by name/team/last save, role affects permissions (a viewer cannot save), and search is case-insensitive and server-wide. However it does not describe pagination/nextCursor behavior, so it is solid 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?
Front-loaded with the core purpose and the projectId rationale, then usage, then row contents. Every sentence carries information, but the three-paragraph block is dense and the middle paragraph is verbose; it is appropriately sized rather than maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although an output schema exists (so return values need not be spelled out), the description still characterizes each row (space ownership, account role, R3 Community flag, creator) and covers the non-unique-name edge case. An agent has everything needed to call and interpret 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 baseline is 3. The description adds genuine meaning for `search` (case-insensitive substring match anywhere in the name, executed on the server against all projects rather than the held page), which goes beyond the schema's terse field text. It adds little for limit/cursor, which the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource (list the projects this R3 account can work on, its own and its teams'), scopes it (last updated first, exposes the projectId), and distinguishes it from the sibling that consumes its output (r3_project_load). An agent can tell it apart from r3_project_create/load/delete without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use it (finding a project the user names rather than by id, e.g. "my slot machine") and prescribes search over paging, explaining that search matches server-side against EVERY project, not the current page. It also routes to r3_project_load as the consumer of the returned projectId.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_project_loadSee what is in an R3 projectARead-onlyIdempotentInspect
List the components in an existing R3 project — what it contains and, for each one, its entityRef: the name code addresses it by (this['mesh_cube_1']). Read this before writing any code for a project, and after any tool call whose outcome was reported as unknown, to see what actually landed. Value components (Vector3, Color, Scalar) are not listed individually — reach them through their owner, e.g. mesh.position.x.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | The project to read, from r3_project_create or the R3 app. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| objects | Yes | |
| projectId | Yes | |
| componentCount | Yes | |
| valueComponentCount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered. The description adds genuinely useful behavior beyond them: value components (Vector3, Color, Scalar) are intentionally not listed individually and must be reached through their owner, plus the 'see what actually landed' reconciliation use case. Return-format specifics are left to the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all front-loaded: purpose first, then the entityRef concept, then usage triggers, then the value-component caveat. No filler, and each sentence carries 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?
The tool is simple (one param, output schema present, annotations present), and the description covers purpose, usage timing, and the one non-obvious output nuance. 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?
With schema description coverage at 100% and a single required parameter, the schema already documents projectId (its origin from r3_project_create or the app). The description adds no syntax or format detail beyond that, 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?
States a specific verb (List) and resource (the components in an existing R3 project), and immediately clarifies the key output concept (entityRef, the name code addresses components by). This distinguishes it from r3_project_list (projects) and r3_component_read (a single component) without the agent 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 explicit triggers: read before writing any code for a project, and after any tool call whose outcome was reported as unknown. This is clear when-to-use context, but it names no alternatives or when-not-to-use conditions, so it stops 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.
r3_project_renameRename an R3 projectADestructiveIdempotentInspect
Rename a project: the name shown in the user's project list, the editor's title and the live page. The same change as clicking the title in the R3 editor, kept at once in the project's live copy (every open R3 tab shows it).
The public address does not change: a preview or live link keeps working. Scripts are not affected (they never address the project by name). Renaming a COMPONENT is not this tool: that is done in the R3 editor.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The new name. Leading and trailing spaces are trimmed. Max 120 characters. | |
| projectId | Yes | The project to rename, from r3_project_list or r3_project_create. |
Output Schema
| Name | Required | Description |
|---|---|---|
| seq | No | |
| name | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| changed | Yes | |
| projectId | Yes | |
| previousName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, idempotent, destructive, open-world, so the safety bar is partly pre-filled; the description adds real value beyond that by disclosing the propagation model ('kept at once in the project's live copy', every open tab updates) and the non-effects (public address stable, scripts unaffected). It stays silent on whether a rename can be undone or reverts, which is the one behavioral 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?
Front-loaded with the action and its effects in the first sentence, then a scoped 'what does not change' paragraph, then the sibling exclusion. Parentheticals are short and each sentence carries distinct information; nothing is redundant.
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 scope, propagation, and exclusions for a low-complexity 2-param mutation. The only omitted element is reversibility/undo behavior, a minor gap for a rename.
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%: trimming behavior, 120-char limit, and the projectId provenance (r3_project_list / r3_project_create) are all in the schema. The description contributes nothing additional about the two parameters, 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 (rename) and resource (a project), then enumerates exactly where the change lands: project list, editor title, live page. It also names the near-miss sibling case ('Renaming a COMPONENT is not this tool'), so an agent can separate this from r3_component_set or r3_editor_set without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete equivalence ('the same change as clicking the title in the R3 editor') and an explicit exclusion for component renaming. It does not name a competing project tool by name (e.g., r3_editor_set), so it stops just short of full when/when-not/alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_publish_livePublish a project liveADestructiveInspect
Publish an R3 project live: makes a RELEASE (a frozen copy) of the project as it is now and makes it the one its public live URL shows, for anyone. Only when the user asked for it. Changing the project does NOT change the live site; r3_publish_live does: on a project that is already live this is a publish update (a new release replaces the live one), and the answer names the release number and what changed since the previous live release. note (optional, up to 500 characters) is stored with the release. slug (optional, the first time a project goes live) is the project part of its public address (e.g. "my-game" for …//my-game: letters, numbers and dashes); without it R3 uses a free address (the project's name when free) and the answer says which. Once a project has been live its address never changes. Going live the FIRST time uses one of the live-project slots of the project owner's plan (an update uses none); going live needs a plan. When there is no plan or no room, nothing is published and the answer says how many live projects the plan allows, how many are used and where the user picks a plan. It publishes every change kept so far (yours and the user's: there is nothing to save first). r3_release_list shows the releases, r3_release_rollback makes an older one live again. Needs the publish:live right.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Optional: what this release is, in a few words (up to 500 characters), e.g. "new cue and rules". | |
| slug | No | Optional, first go-live only: the project part of the public address, e.g. "my-game" (letters, numbers and dashes). Without it R3 uses a free address and says which. A project that has been live keeps its address: a different slug is refused. | |
| projectId | Yes | The project id (r3_project_list / r3_project_create). |
Output Schema
| Name | Required | Description |
|---|---|---|
| live | Yes | |
| note | Yes | |
| slug | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| changes | Yes | |
| liveUrl | Yes | |
| embedCode | Yes | |
| projectId | Yes | |
| environment | Yes | |
| firstGoLive | Yes | |
| addressChosen | Yes | |
| releaseNumber | Yes | |
| previousNumber | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructive/openWorld/non-idempotent, and the description adds the real behavioral detail behind them: a new release replaces the live one, first publish consumes a plan slot while updates do not, failure to publish is atomic (nothing is published and the answer explains plan limits), and all kept changes are included. That is far beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and consequence, and the sibling routing and permission note close it out. It is dense but over-long, restating the address-permanence rule and the slug example in two places, and the plan-slot failure path is delivered as a single winding 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?
For a destructive, plan-gated, open-world publish operation, the description covers authorization (publish:live right), slot/plan failure behavior, address permanence, update vs first-publish semantics, and even what the response reports — with an output schema present, 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 note, slug and projectId. The description nonetheless adds operational meaning: `note` is stored with the release, `slug` only applies on first go-live, a different slug is refused later, and the address is permanent once live. Some of this duplicates the schema text rather than extending it, keeping it just below 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 specific verb and resource ("Publish an R3 project live") and immediately defines the mechanism (a frozen RELEASE becoming what the public live URL shows). It distinguishes itself from r3_release_list, r3_release_rollback and implicitly r3_unpublish_live, so an agent can pick correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit gating: "Only when the user asked for it" sets the consent precondition, and it names the sibling tools for inspecting and reverting releases. It also clarifies a common misconception (changing the project does NOT change the live site), which is exactly the when-to-use context an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_publish_settings_readRead a project's publish settingsARead-onlyIdempotentInspect
Read the publish settings of one of the user's own R3 projects in this environment — what the app's Deploy → Settings shows: Works on (keyboard / touch / both / not tested), the SEO title and description that search engines and link previews show, how the live page starts (Start button, first click, on load), its controls and badge. Also answers a SUGGESTION for Works on, from a scan of the project's code for keyboard / touch / pointer handlers — only a suggestion. r3_publish_settings_set changes them. Needs the project:read right.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | The project id (r3_project_list). |
Output Schema
| Name | Required | Description |
|---|---|---|
| live | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| gallery | No | |
| worksOn | Yes | |
| seoTitle | Yes | |
| projectId | Yes | |
| environment | Yes | |
| portalSettings | Yes | |
| seoDescription | Yes | |
| worksOnSuggestion | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and openWorld, so the safety profile is covered; the description adds genuinely non-obvious context — the permission requirement, ownership scoping, and the caveat that the 'Works on' value is only a code-scan SUGGESTION. It does not discuss response shape, but an output schema exists so that burden is elsewhere.
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?
Information is front-loaded with the verb and the core payload first, then the caveat and the alternative tool. The single dense sentence with em-dash and parentheticals is slight over-packing, but every clause carries useful content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety, an output schema covering returns, and a fully documented single parameter, the description still adds permissions, ownership scope, the suggestion caveat, and the write counterpart. An agent has everything needed to decide and invoke 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?
There is a single parameter with 100% schema coverage, and the schema documents projectId as coming from r3_project_list. The description only restates that the project must be one of the user's own, adding ownership constraint but no format or lookup detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read the publish settings') and then enumerates the concrete fields returned (Works on, SEO title/description, start behavior, controls, badge), so an agent knows exactly what this yields. It also names the mutation sibling r3_publish_settings_set, making the read/write split 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 scopes usage to 'one of the user's own R3 projects in this environment' and states the required 'project:read' right, plus points at r3_publish_settings_set for changes. There is no explicit exclusion (e.g., what happens for unpublished or other users' projects), so it stops short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_publish_settings_setChange a project's publish settingsADestructiveIdempotentInspect
Change publish settings of one of the user's own R3 projects in this environment — the app's Deploy → Settings. Only the settings named change (the rest stay as they are). Only when the user asked for it, or approved the text: these settings shape the PUBLIC live page — its title and description in search results and link previews (seoTitle, seoDescription), Works on (keyboard puts a "made for a keyboard" note on phones and a "desktop" badge; touch a "mobile" badge; both, both; untested none — set it only after the user confirmed it or it was tested, never from the code scan alone), how it starts, its controls. Invalid values are refused with every problem named, and nothing is saved. The answer names what changed; open live and preview pages are told (a preview reloads, a live page offers a reload). Takes effect without a new release. Needs the publish:live right. R3 admins only: gallery features, hides or sets the example prompt of a project in the landing gallery (any member's project; send it without settings for a project that is not yours).
| Name | Required | Description | Default |
|---|---|---|---|
| gallery | No | R3 admins only: the landing gallery, e.g. {"featured": true} or {"examplePrompt": "…"}. | |
| settings | No | Only the settings to change, e.g. {"worksOn": "keyboard", "seoDescription": "…"}. | |
| projectId | Yes | The project id (r3_project_list). |
Output Schema
| Name | Required | Description |
|---|---|---|
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| changed | Yes | |
| gallery | No | |
| projectId | Yes | |
| environment | Yes | |
| portalSettings | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: atomic validation ('refused with every problem named, and nothing is saved'), call effects ('open live and preview pages are told...'), 'takes effect without a new release', required 'publish:live' right, and admin-only gallery scope. These are exactly the behavioral traits an agent needs before mutating public-facing state.
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 purpose and is dense with no filler, but it is a single running paragraph heavy on nested parentheticals that would read better as structured clauses. Slightly overpacked, though every element is substantive.
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 mutation tool it covers permissions, atomicity, propagation to live/preview, admin-only branch, and the partial-update rule, while the output schema and rich schema descriptions handle return values and field detail. Nothing essential to a correct call 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?
With 100% schema coverage the baseline is 3, but the description adds meaning the schema doesn't spell out — the partial-update contract and the consequence of worksOn on the public page (badges/notes). It still leaves nested controls/startButton behavior 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?
States a specific verb+resource ('Change publish settings of one of the user's own R3 projects') and pins down the surface it maps to ('Deploy → Settings'). It also clarifies the partial-update semantics ('Only the settings named change'), making it clearly distinct from the read 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?
Gives explicit when-to-use conditions ('Only when the user asked for it, or approved the text') and a strong when-not ('never from the code scan alone') for the risky worksOn field. It does not name the read sibling r3_publish_settings_read as the alternative, but the conditions otherwise leave little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_release_listList a project's releasesARead-onlyInspect
List the releases of an R3 project, newest first: number, date, who made it, note, size, which one is LIVE (what the public URL shows), pinned, and releases in the trash (restorable for 7 days). Also says whether the project has saved changes that are not live yet: saving does NOT change the live site; r3_publish_live does. Read-only. Needs the project:read right.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | The project id (r3_project_list). |
Output Schema
| Name | Required | Description |
|---|---|---|
| live | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| releases | Yes | |
| projectId | Yes | |
| changesNotLive | Yes | |
| liveReleaseNumber | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description reinforces this with 'Read-only.' On top of that it adds behavior annotations don't carry: the required project:read right, the 7-day trash restoration window, and the crucial distinction between saved-but-unpublished changes and the live site. No pagination or rate-limit detail, which keeps it out of 5 territory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the returned fields, then the publishing caveat and permission requirement in a compact first sentence and two short follow-ups. Every clause carries information, though the long enumerated field list makes it slightly dense rather than maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description still frames what the listing surfaces (LIVE marker, pinned, trash). Combined with the auth requirement, the save-vs-publish semantics, and the trash retention window, an agent has everything needed to call and interpret 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?
There is only one parameter and the schema already documents it at 100% coverage, including a pointer to r3_project_list for obtaining the id. The description says only 'Needs the project', adding no format or sourcing detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the releases of an R3 project') plus scope and ordering ('newest first'). It goes further than the title by enumerating exactly what each row contains (number, date, author, note, size, LIVE marker, pinned, trashed), making it unmistakable against siblings like r3_release_restore or r3_release_rollback.
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 clear context for when this listing is useful and explicitly routes the agent to r3_publish_live for the related publishing action ('saving does NOT change the live site; r3_publish_live does'). It does not state when-not-to-use this tool or name a direct alternative lister, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_release_restoreRestore a project to a saved versionADestructiveInspect
Put a project's working copy back the way one of its releases (saved versions) had it: components added since are removed, removed ones come back, values and scripts go back to that version (each script as a new version on top of the current one), and the name. The user sees it at once in any R3 tab that has the project open. Only when the user asked for it.
Two steps: WITHOUT planToken it changes nothing and says what restoring would change, with a planToken; the same call WITH that planToken, once the user has seen the plan and agreed, restores. If the project changed in between, nothing is changed and the new plan comes back.
The whole restore is ONE change of yours: r3_editor_undo takes it back. It never changes which release is LIVE (what the public URL shows): that is r3_release_rollback. The release number comes from r3_release_list. Needs project:write (and code:write when scripts change).
| Name | Required | Description | Default |
|---|---|---|---|
| planToken | No | The planToken the first call answered; only when the user agreed to that plan. | |
| projectId | Yes | The project (r3_project_list). | |
| releaseNumber | Yes | The release to restore the working copy to (r3_release_list). |
Output Schema
| Name | Required | Description |
|---|---|---|
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| headSeq | Yes | |
| opCount | Yes | |
| summary | Yes | |
| restored | Yes | |
| planToken | Yes | |
| projectId | Yes | |
| releaseNumber | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true and idempotent=false, so the safety profile is partly covered, but the description goes further: it specifies what is destroyed and what is restored, that the restore is one atomic undoable change via r3_editor_undo, that the LIVE release is unaffected, that the user sees it immediately, and that it requires project:write plus code:write when scripts change. It does not discuss failure modes beyond plan staleness, but the plan-token gating is unusual and well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: the primary effect comes first, then the safety protocol, then the relationship to undo/rollback and permissions. A stray truncated fragment ('and the name.') and the paragraph length keep it from being a clean 5.
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, confirmation-gated mutation with an output schema and full annotation coverage, the description supplies everything an agent needs: effects, dry-run protocol, undo path, what it does not affect, upstream tools for its inputs, and required scopes. No return-value explanation is needed given the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds real meaning: planToken only works with the plan the user already agreed to, releaseNumber is sourced from r3_release_list, and projectId from r3_project_list. The two-step flow explains why planToken exists at all, which the schema text alone only partially conveys.
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 (restore) and resource (a project's working copy) at a specific granularity, then enumerates the exact effects: components added since are removed, removed ones return, values and scripts revert. It explicitly contrasts itself with r3_release_rollback (LIVE release) and r3_editor_undo (undoing the change), so an agent can separate it from close siblings without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('Only when the user asked for it') and a full two-step protocol: a planToken-less dry run that reports the diff, then the same call with the planToken after user agreement, plus the stale-plan behavior if the project changed. It also names the alternatives (r3_release_rollback for the LIVE pointer, r3_release_list for the release number), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_release_rollbackMake an older release liveADestructiveIdempotentInspect
Make an earlier release of a live R3 project the one its public URL shows again (rollback, or forward again). Only when the user asked for it. The project must be live; this never uses a plan slot. A release in the trash or one marked incomplete is refused. Nothing is deleted: the release that was live stays in the list. Take the number from r3_release_list. Needs the publish:live right.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | The project id (r3_project_list). | |
| releaseNumber | Yes | The release to make live (r3_release_list). |
Output Schema
| Name | Required | Description |
|---|---|---|
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| changed | Yes | |
| projectId | Yes | |
| environment | Yes | |
| releaseNumber | Yes | |
| previousNumber | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past what the annotations declare. The annotations only say readOnly=false, destructive=true, idempotent=true, openWorld=true; the description adds an auth requirement ('publish:live right'), the no-plan-slot resource behavior, the refusal conditions, and the key clarification that no data is destroyed — the previously live release simply stays in the list. The 'nothing is deleted' note resolves the ambiguity the destructiveHint would otherwise leave an agent with, rather than 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?
Front-loads purpose first, then conditions, and every sentence carries load (gating, preconditions, refusals, side-effect model, parameter source, permission). It is slightly clipped into many short fragments, which reads more like a checklist than prose, but nothing is redundant.
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 mutation tool with an output schema already present, the description covers everything the agent still needs: permission, live-project precondition, plan-slot behavior, refusal conditions, and the fact that the prior live release is retained. Return-shape detail is correctly omitted.
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 fields already point at the same source tools ('(r3_project_list)', '(r3_release_list)'). The description's 'Take the number from r3_release_list' merely restates the schema, adding no format or range detail. Baseline 3 for full 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?
States a specific verb and resource with scope: it re-points the public URL at an earlier release of a *live* project, and explicitly frames the two directions (rollback or forward again). This is clearly distinguishable from siblings like r3_publish_live (push something new live), r3_release_list (enumerate) and r3_release_restore (trash recovery), all of which appear in the sibling list.
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 gating condition ('Only when the user asked for it'), preconditions (project must be live; never consumes a plan slot), and refusal cases (release in trash, or marked incomplete). It also routes the agent to r3_release_list to obtain the release number, so there is no guesswork about where the input comes from.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_roadmap_listList R3's public roadmapARead-onlyIdempotentInspect
The public R3 roadmap: what is planned, in progress, proposed by the community and shipped, with each item's vote count and whether the user has voted for it — plus the user's OWN suggestions still awaiting R3's approval, marked pending, and the ones R3 declined, marked declined with R3's reason (only the user sees them; neither is votable); a declined item is not suggested again. It shows whether an item already covers an idea before r3_roadmap_suggest: r3_roadmap_upvote votes for that one instead of a duplicate. Narrow it with search (title and description, any case) and status.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Words to find in the title or description, any case. | |
| status | No | Only items with this status. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| total | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| pending | Yes | |
| declined | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: vote counts, whether the user voted, that pending/declined items are visible only to the user, are non-votable, and that a declined item cannot be suggested again. It does not mention pagination or rate limits, but adds substantial value.
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 purpose is front-loaded, but the body is one long run-on sentence stitched together with em-dashes, a colon and semicolons, making it hard to parse. Most content is relevant, yet the pending/declined/votability clauses could be tightened into cleaner sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained, and the annotations cover the safety profile; the description still usefully characterizes what the list contains (vote counts, user's private suggestions, decline reasons). Together with full schema coverage, an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both params including the enum values and the 'any case' search semantics. The description only restates that search narrows by title/description and status narrows by status, adding essentially nothing beyond the schema. 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 ('The public R3 roadmap') and enumerates its scope (planned, in-progress, proposed, shipped, plus the user's own pending/declined suggestions). It explicitly names and contrasts with siblings r3_roadmap_suggest and r3_roadmap_upvote, so an agent can distinguish it 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?
Explicitly routes the agent: use this to check whether an item already covers an idea before calling r3_roadmap_suggest, and use r3_roadmap_upvote to vote for the existing item instead of creating a duplicate. This gives clear context and named alternatives, though it lacks an explicit 'when not to use' beyond the duplicate case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_roadmap_suggestSuggest a roadmap itemAInspect
Suggest a feature for R3's public roadmap, in the user's name and naming you (your agent key or app connection). It is HELD until R3's team approves it: not public, not votable, until then. r3_roadmap_list shows whether an item already covers it (r3_roadmap_upvote votes for that one instead). A good suggestion says what the feature lets a person do and why (what was being built when it was missed). Something broken rather than missing is r3_bug_report's. Rate-limited per agent key or app connection (a few a day). Needs the roadmap:suggest right.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | One line naming the feature, e.g. "Per-wheel tyre grip in the Inspector". | |
| category | No | Where it belongs; "other" when unsure. | |
| description | Yes | What it lets a person do, and why it is needed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| approved | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the generic profile (not read-only, open-world, non-idempotent, non-destructive). The description adds real operational context the annotations cannot: the item is HELD, not public and not votable until R3's team approves it, it is rate-limited per agent key or app connection, and it requires the roadmap:suggest right. The only missing detail is whether a suggestion can be edited or withdrawn later.
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 action and its held-until-approved consequence, then routing rules. Dense and parenthetical-heavy, but each sentence carries distinct information; nothing is 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 explanation. Between the description, the schema and the annotations, an agent knows the precondition (roadmap:suggest right), the side effects (held, not public), the rate limit, and the sibling tools to check first.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes slightly beyond the schema by prescribing the content of a good suggestion ('what the feature lets a person do and why'), which maps onto the title/description fields and raises the odds of a valid call.
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 ('Suggest a feature for R3's public roadmap') plus the attribution behavior (submitted in the user's name, naming the agent key/app connection). It also explicitly separates itself from r3_roadmap_list, r3_roadmap_upvote and r3_bug_report, so an agent can pick it without opening any sibling 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 exact condition selecting each: use r3_roadmap_list to check for an existing item, r3_roadmap_upvote to vote for one that already exists, and r3_bug_report when the thing is broken rather than missing. It also gives positive guidance on what makes a good suggestion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_roadmap_upvoteUpvote a roadmap itemAIdempotentInspect
Add the user's vote to a public roadmap item (its id from r3_roadmap_list), when the user wants it or it covers what you were about to suggest. One vote per user: an item the user already voted for stays voted, and this never removes a vote. Needs the roadmap:vote right.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The roadmap item id, from r3_roadmap_list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | Yes | |
| voted | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| voteCount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the authorization requirement ('Needs the roadmap:vote right') and the precise vote semantics ('One vote per user', already-voted stays voted, never removes a vote). The annotations already cover idempotency and non-destructiveness, but the auth and duplicate-vote behavior are real added value.
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, front-loaded with the action, then usage condition, then behavioral constraints. Every clause carries information (routing, idempotency, auth) with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with an output schema and rich annotations, the description supplies everything else an agent needs: id source, usage condition, permission requirement, and vote-count semantics. 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 description coverage is 100% and the single 'id' parameter is fully documented in the schema; the description only restates that the id comes from r3_roadmap_list, which the schema already says. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('add the user's vote') and resource ('a public roadmap item'), scoped to public roadmap items and pointing at r3_roadmap_list as the id source. An agent can distinguish this from r3_roadmap_suggest (which creates items) and r3_roadmap_list without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use conditions: 'when the user wants it or it covers what you were about to suggest' — the latter implicitly routes the agent away from r3_roadmap_suggest when the item already exists. However, it never states a when-not case or names the alternative sibling explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_sound_createMake a sound effect or seamless loop from a recipeAInspect
Make a sound (a 48 kHz WAV in the account's audio files) from a recipe that R3 renders: layers of synth / fm / noise / sample sources, each with an envelope and effects (filter, distortion, bitcrush, delay, reverb, compressor, tremolo), and a master stage that can make a seamless LOOP. Nothing is uploaded and it is free (60 sounds an hour for each agent key or app connection).
Start from a preset (laser, coin, jump, explosion, click, whoosh, hit, power-up, helicopter-rotor, engine-hum) with optional overrides {seed, duration, channels}, or pass a full recipe: r3_docs_read("SOUND_RECIPES.md") has the format, every preset's recipe and worked examples. An invalid recipe is refused with the path of the problem.
You cannot hear it: the answer gives numbers (peak / RMS dBFS, clipping, silent tail, the loop seam check, warnings), the url an Audio component takes and a listen link for the user. Pass attachTo {projectId} to also add an Audio component playing it in that project (a loop loops and plays when the project runs; a one-shot is played from code). Names are unique per account.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | What the owner sees in their audio files, e.g. "Helicopter rotor". Unique in the account. | |
| preset | No | A preset: laser, coin, jump, explosion, click, whoosh, hit, power-up, helicopter-rotor, engine-hum. | |
| recipe | No | Or a full recipe (format "r3-sound-recipe", version 1). | |
| attachTo | No | Also add an Audio component playing it: {projectId, name?, volume?, playOnStart?}. | |
| overrides | No | With a preset: {seed, duration, channels} (seed = another variation). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| loop | Yes | |
| name | Yes | |
| stats | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| audioId | Yes | |
| attached | Yes | |
| seamless | Yes | |
| warnings | Yes | |
| listenUrl | Yes | |
| durationMs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already identify a non-read-only, non-idempotent, non-destructive, open-world creation operation. The description adds important behavior beyond annotations: rate limit of 60 sounds/hour, no upload, invalid-recipe rejection with error path, returned audio metrics, listen link, and attachTo side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loads the core purpose, then adds relevant operational details. It is long, but the length is mostly justified by recipe, preset, output, and attachment 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 output schema and annotations cover return structure and safety, while the description fills remaining gaps: recipe documentation pointer, preset examples, overrides, validation behavior, rate limits, unique naming, and attachTo semantics. It is complete for 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?
Schema description coverage is 100%, so the schema already documents parameters. The description still adds meaningful semantics: preset overrides like seed for variation, recipe format guidance via r3_docs_read, and loop-versus-one-shot behavior for attachTo.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it makes a 48 kHz WAV in the account's audio files from a recipe, with presets or full recipes. The scope is clear, but it does not explicitly distinguish itself from sibling tools such as r3_sound_read or r3_sound_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?
Explains the main usage modes: start from a preset with optional overrides, or pass a full recipe, and use attachTo to add an Audio component. It gives clear context but does not explicitly state when not to use this tool or name alternatives for reading/updating sounds.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_sound_readRead a sound's recipeARead-onlyIdempotentInspect
Read the RECIPE a sound was made from (the editable source), with its name, url, duration, whether it loops and the sound it was edited from. The account's own sounds, or anyone's public one; an uploaded file has no recipe. To change a sound, r3_sound_update makes a new version of it.
| Name | Required | Description | Default |
|---|---|---|---|
| audioId | Yes | The sound's id (r3_sound_create or r3_audio_list answer it). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| loop | Yes | |
| name | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| recipe | Yes | |
| audioId | Yes | |
| isOwner | Yes | |
| isPublic | Yes | |
| durationMs | Yes | |
| previousId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world, so the safety profile is covered; the description adds the meaningful behavioral fact that uploaded files lack a recipe and therefore cannot satisfy this call. It does not say what that failure looks like (error vs. empty result), a minor remaining 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?
Two sentences, front-loaded with what is read, followed by eligibility and the alternative. No filler and every clause carries either scope, field, or routing 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 an output schema present and annotations covering safety, the description need only cover scope and edge cases, which it largely does. The only omission is the concrete outcome when a sound has no recipe, which an agent would need to branch on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single audioId parameter already documents itself plus its provenance (r3_sound_create or r3_audio_list). The description adds no further meaning about the id format or scoping, 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 (read) and a precisely-scoped resource (the recipe/editable source a sound was made from), then enumerates the returned fields. It is clearly distinguished from r3_sound_update, which acts on the same resource differently.
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 positive applicability (the account's own sounds or anyone's public one), an exclusion with a reason (an uploaded file has no recipe), and explicitly routes mutation intent to r3_sound_update. An agent can decide use vs. not-use without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_sound_updateChange a sound: make a new version of itAInspect
Change a sound the account owns: overrides {seed, duration, channels} applied to its own recipe, or a whole new recipe (read the current one with r3_sound_read, change it, pass it here; r3_docs_read("SOUND_RECIPES.md") has the format). The sound itself never changes: the change is saved as a new version under the same name (the user's audio list shows the latest), with a new url, and every project and release using an older version keeps it. Give name only to make a separate copy under that name instead. The same recipe as the latest version saves nothing. The answer names the user's projects still on an older version (r3_component_set moves an Audio component's url). An invalid change is refused with the path of the problem. Counts toward the 60 sounds an hour.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Only to make a separate COPY under this name. Default: a new version of the same sound, same name. | |
| recipe | No | Or a whole new recipe (format "r3-sound-recipe", version 1). | |
| audioId | Yes | The sound to change (the account's own). | |
| overrides | No | Changes to its recipe: {seed, duration, channels}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| loop | Yes | |
| name | Yes | |
| stats | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| audioId | Yes | |
| version | Yes | |
| seamless | Yes | |
| warnings | Yes | |
| listenUrl | Yes | |
| unchanged | Yes | |
| durationMs | Yes | |
| previousId | Yes | |
| previousInUse | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare non-read-only, non-idempotent, non-destructive, open-world; the description adds far more: versioning is immutable (older project/release versions keep their copy), the url changes, no-op behavior, quota of 60 sounds per hour, and invalid changes are refused with the offending path. These are operational facts the agent cannot derive from 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?
Front-loaded with the action and the two modes, then the versioning consequence, then the copy/edge cases, then quota. Dense parenthetical asides make sentences long, but virtually every clause carries actionable information; only the quota sentence feels tacked on.
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 nested objects, an output schema, and full annotation coverage, the description covers mode selection, side effects, idempotency edge case, error shape, rate limit, and follow-up actions (moving component urls). Nothing an agent needs before calling is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely adds meaning: `name` is copy-mode only (schema says the same, description makes the consequence explicit), `overrides` mutate the sound's own recipe rather than replacing it, and `recipe` requires the versioned 'r3-sound-recipe' format. Marginal lift beyond the schema, not a rewrite of it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change a sound the account owns') and immediately pins down the two modes: overrides on its own recipe, or a whole new `recipe`. The title reinforces the key distinction from r3_sound_create — the sound identity never changes, only a new version is made.
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: read the current recipe with r3_sound_read, check the format via r3_docs_read("SOUND_RECIPES.md"), pass `name` only to make a separate copy, and use r3_component_set to move a project's Audio component url. It also names the no-op case (same recipe as latest saves nothing), so the agent knows when to skip the call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_terrain_heightRead the ground height of a terrainARead-onlyIdempotentInspect
How high the ground of a heightfield terrain is at the world (x, z) positions you ask, exactly as physics and the drawn terrain have it, plus the terrain's lowest and highest point, centre, size and footprint. Use it to place something ON a terrain: an object stands on the ground at (x, z) when its lowest point is at the returned y (a vehicle: its wheels' bottom); the returned ground normal says how steep it is there. One call takes up to 100 points; with none it describes the terrain only.
terrain is the terrain's Mesh, GeometryHeightfield or ColliderHeightfield (entityRef or id); leave it out when the project has one terrain.
It reads the user's open R3 editor when it has the project (the terrain as on screen, a heightmap image included), else the saved project. A terrain shaped by a heightmap IMAGE needs the project open in R3 (r3_editor_open), because only a browser decodes the image. Read-only: nothing is changed.
| Name | Required | Description | Default |
|---|---|---|---|
| points | No | World positions to sample, e.g. [{"x": 0, "z": 12.5}]. Up to 100. | |
| terrain | No | The terrain: its Mesh, GeometryHeightfield or ColliderHeightfield, by entityRef or id. Optional when the project has one terrain. | |
| projectId | Yes | The project, from r3_project_list or r3_project_create. |
Output Schema
| Name | Required | Description |
|---|---|---|
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| editor | Yes | |
| points | Yes | |
| source | Yes | |
| terrain | Yes | |
| projectId | Yes | |
| projectName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly/idempotent/openWorld/destructive=false) by disclosing the data-source resolution rule (reads the user's open editor when it holds the project, otherwise the saved project), the heightmap-image constraint that only a browser can decode, and the 100-point cap per call. It also confirms 'nothing is changed', consistent with the safety 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?
Front-loaded with the core purpose and return shape, then constraints and parameter notes in a logical order. Dense but every sentence carries information; no filler or tautology. Slightly heavy prose style keeps it from a clean 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained, yet the description still covers purpose, usage, prerequisites, source-of-truth behavior and parameter edge cases. Nothing an agent needs 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 coverage is already 100% (baseline 3), but the description adds genuine meaning: the accepted terrain reference kinds (Mesh, GeometryHeightfield, ColliderHeightfield; entityRef or id), the fact that omitting terrain is allowed when the project has one terrain, and the behavior of omitting points (describe the terrain only) with the 100-point limit.
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?
Starts with a specific verb+resource: reading the ground height of a heightfield terrain at world (x, z) points, and names the full return set (point heights, lowest/highest point, centre, size, footprint). No sibling tool covers terrain-theight sampling, so it is trivially distinguishable from the surrounding list.
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 when-to-use guidance ('use it to place something ON a terrain... an object stands on the ground when its lowest point is at the returned y') plus a hard prerequisite: terrains shaped by a heightmap image require the project open in the R3 editor (r3_editor_open). It does not state an explicit when-not-to-use case, but the selection context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_texture_applyPut a texture set on a materialADestructiveInspect
Wire a texture set to a material in a project: the colour map to map, the normal map to normalMap, the ambient-occlusion / roughness / metalness map to aoMap + roughnessMap + metalnessMap (for a set without metal its blue channel is 0, so a metal map left by an earlier set is replaced and the material's own metalness is kept), the SAME repeat on every map, the material colour white, roughness 1 and metalness 1 for a metallic set (THREE multiplies the colour map by the colour and the roughness map by the roughness: a grey #808080 colour would show the texture at half brightness, the default roughness 0.5 would halve every roughness; the colour's alpha, the opacity, is kept). A Color the material shares with another component is left as it is, and the material gets its own new white Color; the answer says which. Creates one Texture per map, or reuses a Texture of the project already on that image. MaterialStandard / Physical get every map; Lambert / Phong / Toon get map, normalMap and aoMap; Basic is refused (unlit). repeat is how often the tile repeats across the surface (both axes); or give worldSize in metres: a number for a square surface (1000 for a 1 km terrain with 1 m gravel), or {x, y} for its two sides ({"x": 2, "y": 40} for a 2 m × 40 m path), giving repeatX = x / the set's tile size and repeatY = y / it, so a long strip does not stretch the texture. Give neither and the mesh using the material is measured (its own geometry size times its scale, as r3_component_bounds measures; the two largest sides). Kept at once in the project's live copy: every R3 tab with the project open shows it.
| Name | Required | Description | Default |
|---|---|---|---|
| setId | Yes | The texture set (r3_texture_create answers it). | |
| repeat | No | How often the texture repeats across the surface, on both axes and every map. | |
| material | Yes | The material to wire: its entityRef or id (r3_project_load), e.g. "material_ground". | |
| projectId | Yes | The project (r3_project_list). | |
| worldSize | No | Or: the surface size in metres, a number (square) or {x, y} (its two sides, e.g. {"x": 2, "y": 40} for a 2 m × 40 m path); repeatX = x / the set's tile size (1 m for the presets), repeatY = y / it. Neither given: the mesh(es) using the material are measured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| seq | No | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| colour | Yes | |
| repeat | Yes | |
| repeatX | Yes | |
| repeatY | Yes | |
| scalars | Yes | |
| material | Yes | |
| measured | Yes | |
| textures | Yes | |
| projectId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations: it discloses which material types receive which maps, that Basic is refused, that one Texture per map is created or reused, and that shared Color objects are replaced with a new white Color. It also explains destructive side effects (replacing a leftover metal map, forcing the material colour white, preserving metalness), consistent with destructiveHint=true.
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 main action is front-loaded, which is good, but the body is a dense run-on with heavily nested parentheses (the #808080 brightness aside, the alpha-kept clause), making it hard to scan. Most content earns its place, but the structure could be broken into discrete sentences or lines.
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, open-world mutation with an output schema, the description covers material-type behavior, texture reuse, colour/roughness/opacity consequences, repeat computation, and live-sync scope. Combined with the output schema carrying return values, nothing essential for a correct call 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 prose adds conceptual meaning: the repeatX = x / tile-size and repeatY = y / tile-size derivation and the concrete {x:2,y:40} example explain the intent of `worldSize` beyond the schema wording. It also clarifies that omitting both triggers mesh measurement, tying `worldSize` to observable behavior.
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 ('Wire a texture set to a material in a project') and enumerates exactly which map goes to which slot. It is distinguishable from r3_texture_create/update (which make/edit sets) because it describes the wiring action against an existing material.
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 strong guidance on choosing between `repeat` and `worldSize` (including examples like a 1 km terrain and a 2 m × 40 m path), but never explicitly states when to reach for this tool versus siblings such as r3_texture_create or r3_texture_update, nor does it name a 'don't use if' condition. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_texture_createMake a tileable texture set (colour, normal, roughness) from a recipeADestructiveInspect
Make a matching, seamlessly tiling texture SET for a material: a colour map, a normal map and a packed ambient-occlusion / roughness / metalness map, rendered by R3 from a procedural recipe (seeded noise, stones, bricks …). Nothing is uploaded and it is free. The maps are stored as images in the account (the owner sees them in the Images browser as " · albedo.png" …).
Start from a preset (gravel, sand, concrete, bricks, brushedMetal) with optional controls: seed (another variation), scale (an integer: finer pattern), colours (the ramp's "#rrggbb" stops, exactly as many colours as the preset has: gravel 3, sand 2, concrete 3, bricks 3, brushedMetal 3), contrast, bumpiness (normal strength), roughness {min, max} (from the smooth parts to the rough parts), metalness (0 = not metal, 1 = metal; metal looks dark without an environment map in the scene), size (256 / 512 / 1024 / 2048, default 1024), tileWorldSize (metres one tile covers, default 1), height (also store a 16-bit height map). Or pass a full recipe (r3_docs_read("TEXTURE_RECIPES.md") has the format and every preset's recipe). An invalid recipe is refused with the path of the problem.
Pass apply {projectId, material, repeat | worldSize (a number, or {x, y} for a long strip)} to put it on a material in the same call (as r3_texture_apply). You cannot see the texture: the answer gives numbers (mean colour, brightness range, height spread, seam check) and the colour map's url; r3_editor_capture shows it in an open editor. Names are unique per account. Each call makes a NEW set; reuse a set with r3_texture_apply.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | What the owner sees, e.g. "Gravel path". Unique in the account. | |
| size | No | 256, 512, 1024 (default) or 2048 pixels square. | |
| apply | No | Also wire it to a material: {projectId, material, repeat | worldSize}. | |
| preset | No | A preset: gravel, sand, concrete, bricks, brushedMetal. | |
| recipe | No | Or a full recipe (format "r3-texture-recipe", version 1). | |
| controls | No | With a preset: {seed, scale, colours, contrast, bumpiness, roughness: {min, max}, metalness, size, tileWorldSize, height}. colours: exactly the preset's number of "#rrggbb" stops (gravel 3, sand 2, concrete 3, bricks 3, brushedMetal 3). |
Output Schema
| Name | Required | Description |
|---|---|---|
| maps | Yes | |
| name | Yes | |
| size | Yes | |
| setId | Yes | |
| stats | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| applied | Yes | |
| warnings | Yes | |
| tileWorldSize | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: no upload, free, maps persisted as account images, unique names per account, invalid recipes rejected with the failing path, and no visual preview (numbers + url returned, r3_editor_capture to view). What it does not clarify is the destructiveHint=true implication — whether a name collision errors or replaces an existing set — which matters given non-idempotent creation.
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 artifact produced, then presets/controls, then apply, then return-value expectations — a sensible information hierarchy. It is dense and repeats a few schema facts (size values, colour counts per preset), costing some compactness without obscuring the key points.
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 6-parameter, nested-object, open-world creation tool this is thorough: it covers the two input paths, control semantics, the optional apply wiring, the persisted side effects, and error behaviour. Even though an output schema exists, it still sets expectations about what the response contains, which is more than required.
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 already 100%, so the baseline is 3, but the description adds real meaning: seed = another variation, scale = finer pattern, roughness min/max = smooth-to-rough range, metalness 0/1 with the caveat that metal goes dark without an environment map, tileWorldSize = metres per tile, and the worldSize {x, y} long-strip example. It largely restates the enum of sizes and colour counts per preset, which the schema already carries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource and enumerates the concrete artifact: a colour map, normal map, and packed AO/roughness/metalness map generated from a procedural recipe. It immediately distinguishes itself from r3_texture_apply (reuse) and r3_texture_update by being the creation path, and names its inputs (preset or full recipe).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit branching: 'Start from a preset … Or pass a full `recipe`', plus the routing statement 'Each call makes a NEW set; reuse a set with r3_texture_apply.' It also points to r3_docs_read("TEXTURE_RECIPES.md") for the recipe format, so an agent knows exactly which path to take and where to go for detail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_texture_readRead a texture set and the recipe it was made fromARead-onlyIdempotentInspect
Read one texture set: its name, size, tile size, the three map urls, the numbers its render measured, the sets it was edited from, and the full RECIPE (the editable source). The account's own sets, or anyone's public one. To change a set, r3_texture_update makes a new version of it.
| Name | Required | Description | Default |
|---|---|---|---|
| setId | Yes | The set id (r3_texture_create answers it). |
Output Schema
| Name | Required | Description |
|---|---|---|
| set | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description still adds real context beyond them: the access scope ('the account's own sets, or anyone's public one') and the fact that the response includes render measurements and edit lineage, which no annotation conveys.
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 verb and resource, then the payload contents, then the alternative tool — a logical ordering with no filler. The middle enumeration is dense but each item is informative rather than repetitive.
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 are already specified and the description needn't restate their format; it nonetheless signals the notable parts (recipe, render numbers, lineage). Access scope and the read/write boundary are covered, leaving only error and pagination behavior unaddressed.
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?
Only one parameter and schema coverage is 100%, so the schema already documents setId including where it originates (r3_texture_create). The description adds no further meaning about the identifier, 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?
Specific verb (Read) plus resource (one texture set), with the returned contents enumerated: name, size, tile size, three map urls, render numbers, lineage, and the recipe. It also explicitly names the sibling it is not (r3_texture_update), so the agent can separate read from change 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?
Clear when-to-use: reading one set you own or any public one, and it routes write intent to r3_texture_update with the reason ('makes a new version of it'). No explicit exclusions (e.g., how to enumerate many sets, or behavior on a missing id), 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.
r3_texture_updateChange a texture set: make a new version of itAInspect
Change a texture set the account owns: its look (controls: seed, scale, colours, contrast, bumpiness, roughness {min, max}, metalness, size, tileWorldSize, height, applied to the set's own recipe; scale multiplies its pattern, so 2 is twice as fine as now) or a whole new recipe (read the current one with r3_texture_read, change it, pass it here). The set itself never changes: the change is saved as a new version under the same name (the user's lists show the latest), with new maps, and every project and release that uses an older version's maps keeps them. Give name only to make a separate copy under that name instead. The same recipe as the latest version saves nothing. The answer names the user's projects still on an older version; put the new set on a material with r3_texture_apply when the user wants it. An invalid change is refused with the path of the problem. Counts as one render toward your hourly texture budget.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Only to make a separate COPY under this name. Default: a new version of the same set, same name. | |
| setId | Yes | The set to change (r3_texture_create / r3_texture_read answer it). The account's own. | |
| recipe | No | Or a whole new recipe (format "r3-texture-recipe", version 1). | |
| controls | No | Changes to its recipe: {seed, scale, colours, contrast, bumpiness, roughness: {min, max}, metalness, size, tileWorldSize, height}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| maps | Yes | |
| name | Yes | |
| size | Yes | |
| setId | Yes | |
| stats | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| version | Yes | |
| warnings | Yes | |
| unchanged | Yes | |
| previousId | Yes | |
| previousInUse | Yes | |
| tileWorldSize | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: the versioning model (old versions' maps stay with existing projects/releases), the copy-vs-version distinction, error behaviour (invalid change refused with the path of the problem), what the answer contains, and a rate-limit note (one render toward the hourly texture budget). Nothing conflicts with readOnlyHint=false or destructiveHint=false — the described behaviour is additive, not destructive, and the no-op case is disclosed rather than hidden.
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 action and scope, and every sentence carries real information (versioning, copy mode, no-op, error, budget). It loses a point for being one dense run-on paragraph with deeply nested parentheticals, which makes the control list harder to scan than a short bulleted clause would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with four parameters and nested objects, the description covers the state-transition model, side effects on downstream projects, error and budget behaviour. An output schema exists so return structure needn't be spelled out, yet the description still notes the answer lists projects on an older version — more than 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?
Schema coverage is 100%, so the baseline is 3; the description earns more by explaining semantics the schema only enumerates — `scale` multiplies the pattern so 2 is twice as fine as now, roughness is {min, max}, and nested controls are applied to the set's own recipe. The only gap is that `seed`, `colours`, `tileWorldSize`, and `height` get no per-parameter explanation beyond being listed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Change a texture set the account owns") and immediately clarifies the non-obvious semantics: it creates a new version rather than mutating the set. The title's ambiguity ("change") is resolved in the first clause, and it is clearly separable from r3_texture_create (new set) and r3_texture_apply (assign to material).
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: read the current recipe with r3_texture_read then pass it here; put the result on a material with r3_texture_apply; give `name` only when the user wants a separate copy. It also states a no-op condition (same recipe as latest saves nothing), which is exactly the kind of when-not guidance that prevents wasted calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_unpublish_liveTake a live project offlineADestructiveIdempotentInspect
Take a live R3 project offline: its public live URL stops working at once, and the live-project slot it used on the plan is free again. Only when the user asked for it. Other people open a live project, so one that blocks an r3_project_delete goes offline only once the user has been asked and agreed, never as a step of the delete. Deletes nothing: the project, and any preview link, stay; r3_publish_live makes it live again. A project that is not live is refused and left as it is. Needs the publish:live right.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | The project id (r3_project_list). |
Output Schema
| Name | Required | Description |
|---|---|---|
| live | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| projectId | Yes | |
| environment | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by stating the immediate effect (URL stops working at once, slot freed), that nothing is deleted (project and preview link persist), the failure mode for non-live projects ('refused and left as it is'), and the required authorization ('Needs the publish:live right'). The 'Deletes nothing' clarification usefully refines what destructiveHint=true actually means here rather than 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?
Front-loaded with the operational effect before the consent and delete-interaction rules, and each sentence carries distinct information. It is on the dense/long side for a single-parameter tool, but no sentence is 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 not be explained. For a one-parameter mutation the description covers effects, authorization requirement, consent gate, refusal behavior, and sibling interactions — everything an agent needs to invoke it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single projectId parameter is already documented in the schema (including the pointer to r3_project_list). The description adds no additional meaning about the identifier, 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 ('Take a live R3 project offline') and immediately defines the concrete effect: the public live URL stops working and the live-project slot is freed. It also names the inverse sibling r3_publish_live and distinguishes itself from r3_project_delete, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('Only when the user asked for it') and a precise non-use case: it must never run as a step of an r3_project_delete, and only after the user has been asked and agreed. The alternative r3_publish_live is named for the reverse operation, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
r3_whoamiWho am I in R3?ARead-onlyInspect
Report the R3 account you act for, how you are connected (an agent key, or an app connection made with Sign in with R3), what you are allowed to do, the account's plan (its name and how many live projects it allows and uses: going live needs one), and whether the R3 platform is reachable. It verifies the credential end to end and names the capabilities it carries, so it is the call that confirms the account before any other tool. For an account with no project yet it gives the first step.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| plan | Yes | |
| label | Yes | |
| answer | Yes | This answer in words: what was done, what R3 measured, decided or refused, and what to do next. The same text as the result's text block. Read it: the fields beside it are the data, this is the guidance. |
| editor | Yes | |
| agentId | Yes | |
| username | Yes | |
| agentName | Yes | |
| connection | Yes | |
| environment | Yes | |
| apiReachable | Yes | |
| capabilities | Yes | |
| projectsOnFirstPage | Yes | |
| retiredCapabilities | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds real behavioral context beyond that: it verifies the credential 'end to end', names the capabilities the credential carries, checks whether the R3 platform is reachable, and branches behavior for an empty account. It stops short of describing output shape, but an output schema exists to cover that.
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 primary payload (the account you act for) and then the enumerated extras. It is a fairly long single sentence followed by two short context sentences, but each clause corresponds to a distinct piece of returned information, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema documenting return values and annotations covering the read-only/open-world profile, the description fills the remaining gap: what the call confirms, its sequencing role, and the empty-account case. Nothing an agent needs 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?
The tool takes zero parameters, so the baseline is 4; there is no parameter meaning for the description to add or omit.
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 (Report) plus the exact resources it returns: the acting account, connection type, permissions, plan name/live-project allowance, and platform reachability. No sibling tool does anything comparable, so it is trivially distinguishable from the rest of the r3_* family.
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 positions itself as the first call: 'the call that confirms the account before any other tool,' and adds a special case ('for an account with no project yet it gives the first step'). This is direct when-to-use guidance rather than inference.
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.
2 tool updates
- Changed
r3_sound_update4 fields changed- changed
Input schema / properties / name / descriptionPrevious value: -"The new sound's name. Default: the old name with the next number (\"Rotor 2\")."New value: +"Only to make a separate COPY under this name. Default: a new version of the same sound, same name." - added
Output schema / properties / unchangedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / versionAdded value: +{ + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "audioId", - "name", - "url", - "listenUrl", - "durationMs", - "loop", - "seamless", - "stats", - "warnings", - "previousId", - "previousInUse", - "answer" -]New value: +[ + "audioId", + "name", + "url", + "listenUrl", + "durationMs", + "loop", + "seamless", + "stats", + "warnings", + "previousId", + "version", + "unchanged", + "previousInUse", + "answer" +]
- Changed
r3_texture_update4 fields changed- changed
Input schema / properties / name / descriptionPrevious value: -"The new set's name. Default: the old name with the next number (\"Gravel 2\")."New value: +"Only to make a separate COPY under this name. Default: a new version of the same set, same name." - added
Output schema / properties / unchangedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / versionAdded value: +{ + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "setId", - "previousId", - "name", - "size", - "tileWorldSize", - "maps", - "stats", - "warnings", - "previousInUse", - "answer" -]New value: +[ + "setId", + "previousId", + "name", + "size", + "tileWorldSize", + "maps", + "stats", + "warnings", + "version", + "unchanged", + "previousInUse", + "answer" +]
1 tool update
- Changed
r3_publish_live3 fields changed- added
Input schema / properties / slugAdded value: +{ + "description": "Optional, first go-live only: the project part of the public address, e.g. \"my-game\" (letters, numbers and dashes). Without it R3 uses a free address and says which. A project that has been live keeps its address: a different slug is refused.", + "maxLength": 120, + "type": "string" +} - added
Output schema / properties / addressChosenAdded value: +{ + "anyOf": [ + { + "enum": [ + "pinned", + "requested", + "suggested" + ], + "type": "string" + }, + { + "type": "null" + } + ] +} - changed
Output schema / requiredPrevious value: -[ - "projectId", - "liveUrl", - "slug", - "live", - "environment", - "releaseNumber", - "previousNumber", - "firstGoLive", - "note", - "changes", - "embedCode", - "answer" -]New value: +[ + "projectId", + "liveUrl", + "slug", + "live", + "environment", + "releaseNumber", + "previousNumber", + "firstGoLive", + "addressChosen", + "note", + "changes", + "embedCode", + "answer" +]
2 tool updates
- Changed
r3_texture_create2 fields changed- changed
Input schema / properties / controls / descriptionPrevious value: -"With a preset: {seed, scale, colours, contrast, bumpiness, roughness: {min, max}, size, tileWorldSize, height}. colours: exactly the preset's number of \"#rrggbb\" stops (gravel 3, sand 2, concrete 3, bricks 3)."New value: +"With a preset: {seed, scale, colours, contrast, bumpiness, roughness: {min, max}, metalness, size, tileWorldSize, height}. colours: exactly the preset's number of \"#rrggbb\" stops (gravel 3, sand 2, concrete 3, bricks 3, brushedMetal 3)." - changed
Input schema / properties / preset / descriptionPrevious value: -"A preset: gravel, sand, concrete, bricks."New value: +"A preset: gravel, sand, concrete, bricks, brushedMetal."
- Changed
r3_texture_update1 field changed- changed
Input schema / properties / controls / descriptionPrevious value: -"Changes to its recipe: {seed, scale, colours, contrast, bumpiness, roughness: {min, max}, size, tileWorldSize, height}."New value: +"Changes to its recipe: {seed, scale, colours, contrast, bumpiness, roughness: {min, max}, metalness, size, tileWorldSize, height}."
1 tool update
- Changed
r3_component_read3 fields changed- added
Input schema / properties / entityRefAdded value: +{ + "description": "Or one component, e.g. \"mesh_cube_1\".", + "type": "string" +} - changed
Input schema / properties / entityRefs / descriptionPrevious value: -"Which components to read, as reported by r3_project_load, e.g. [\"mesh_cube_1\", \"material_cube_1\"]. Up to 50 per call."New value: +"Which components to read, as reported by r3_project_load: an ARRAY, e.g. [\"mesh_cube_1\", \"material_cube_1\"]. Up to 50 per call." - changed
Input schema / requiredPrevious value: -[ - "projectId", - "entityRefs" -]New value: +[ + "projectId" +]
2 tool updates
- Added
r3_asset_share - Changed
r3_component_set1 field changed- added
Output schema / properties / changes / items / properties / sharedWithAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "entityRef": { + "type": [ + "string", + "null" + ] + }, + "property": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "entityRef", + "type", + "property" + ], + "type": "object" + }, + "type": "array" +}
3 tool updates
- Changed
r3_component_set3 fields changed- added
Output schema / properties / changes / items / properties / changedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / changes / items / properties / heldKeysAdded value: +{ + "additionalProperties": { + "type": [ + "string", + "number", + "boolean", + "null" + ] + }, + "propertyNames": { + "type": "string" + }, + "type": "object" +} - changed
Output schema / properties / changes / items / requiredPrevious value: -[ - "property", - "kind" -]New value: +[ + "property", + "kind", + "changed" +]
- Changed
r3_texture_apply10 fields changed- changed
Input schema / properties / repeat / descriptionPrevious value: -"How often the texture repeats across the surface (the same on every map). Default 1."New value: +"How often the texture repeats across the surface, on both axes and every map." - added
Input schema / properties / worldSize / anyOfAdded value: +[ + { + "type": "number" + }, + { + "properties": { + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + } +] - changed
Input schema / properties / worldSize / descriptionPrevious value: -"Or: the surface size in metres; repeat = worldSize / the set's tile size (1 m for the presets), e.g. 1000 for a 1 km terrain."New value: +"Or: the surface size in metres, a number (square) or {x, y} (its two sides, e.g. {\"x\": 2, \"y\": 40} for a 2 m × 40 m path); repeatX = x / the set's tile size (1 m for the presets), repeatY = y / it. Neither given: the mesh(es) using the material are measured." - removed
Input schema / properties / worldSize / typeRemoved value: -"number" - added
Output schema / properties / colourAdded value: +{ + "additionalProperties": false, + "properties": { + "componentId": { + "type": "string" + }, + "made": { + "type": "boolean" + }, + "sharedWith": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "componentId", + "made", + "sharedWith" + ], + "type": "object" +} - added
Output schema / properties / measuredAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / repeat / typePrevious value: -"number"New value: +[ + "number", + "null" +] - added
Output schema / properties / repeatXAdded value: +{ + "type": "number" +} - added
Output schema / properties / repeatYAdded value: +{ + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "projectId", - "material", - "repeat", - "textures", - "scalars", - "answer" -]New value: +[ + "projectId", + "material", + "repeat", + "repeatX", + "repeatY", + "measured", + "colour", + "textures", + "scalars", + "answer" +]
- Changed
r3_texture_create4 fields changed- changed
Input schema / properties / apply / properties / repeat / descriptionPrevious value: -"How often the texture repeats across the surface (the same on every map). Default 1."New value: +"How often the texture repeats across the surface, on both axes and every map." - added
Input schema / properties / apply / properties / worldSize / anyOfAdded value: +[ + { + "type": "number" + }, + { + "properties": { + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + } +] - changed
Input schema / properties / apply / properties / worldSize / descriptionPrevious value: -"Or: the surface size in metres; repeat = worldSize / the set's tile size (1 m for the presets), e.g. 1000 for a 1 km terrain."New value: +"Or: the surface size in metres, a number (square) or {x, y} (its two sides, e.g. {\"x\": 2, \"y\": 40} for a 2 m × 40 m path); repeatX = x / the set's tile size (1 m for the presets), repeatY = y / it. Neither given: the mesh(es) using the material are measured." - removed
Input schema / properties / apply / properties / worldSize / typeRemoved value: -"number"
2 tool updates
- Changed
r3_publish_settings_read1 field changed- added
Output schema / properties / galleryAdded value: +{ + "additionalProperties": false, + "properties": { + "examplePrompt": { + "type": [ + "string", + "null" + ] + }, + "featured": { + "type": "boolean" + }, + "hidden": { + "type": "boolean" + } + }, + "required": [ + "featured", + "hidden", + "examplePrompt" + ], + "type": "object" +}
- Changed
r3_publish_settings_set3 fields changed- added
Input schema / properties / galleryAdded value: +{ + "additionalProperties": false, + "description": "R3 admins only: the landing gallery, e.g. {\"featured\": true} or {\"examplePrompt\": \"…\"}.", + "properties": { + "examplePrompt": { + "description": "The exact prompt that made this project, shown with a \"Made by R3\" label and a Copy prompt button (up to 500 characters; empty clears it). Only on a project an R3 account owns.", + "maxLength": 500, + "type": "string" + }, + "featured": { + "description": "true pins the project to the top of the landing gallery; false unpins it.", + "type": "boolean" + }, + "hidden": { + "description": "true keeps the project out of the landing gallery (its live page stays); false shows it again.", + "type": "boolean" + } + }, + "type": "object" +} - changed
Input schema / requiredPrevious value: -[ - "projectId", - "settings" -]New value: +[ + "projectId" +] - added
Output schema / properties / galleryAdded value: +{ + "additionalProperties": false, + "properties": { + "examplePrompt": { + "type": [ + "string", + "null" + ] + }, + "featured": { + "type": "boolean" + }, + "hidden": { + "type": "boolean" + } + }, + "required": [ + "featured", + "hidden", + "examplePrompt" + ], + "type": "object" +}
2 tool updates
- Changed
r3_texture_apply1 field changed- changed
Output schema / properties / scalars / additionalProperties / typePrevious value: -"number"New value: +[ + "number", + "string" +]
- Changed
r3_texture_create1 field changed- changed
Input schema / properties / controls / descriptionPrevious value: -"With a preset: {seed, scale, colours, contrast, bumpiness, roughness: {min, max}, size, tileWorldSize, height}."New value: +"With a preset: {seed, scale, colours, contrast, bumpiness, roughness: {min, max}, size, tileWorldSize, height}. colours: exactly the preset's number of \"#rrggbb\" stops (gravel 3, sand 2, concrete 3, bricks 3)."
3 tool updates
- Added
r3_sound_create - Added
r3_sound_read - Added
r3_sound_update
Publisher details
- Operator
- Theunis Johannes Botha · Publisher source
- Operator website
- https://r3js.org · Publisher source
- Vendor relationship
- Not applicable
- Documentation
- https://r3js.org/documentation/mcp · Publisher source
- Trust center
- https://r3js.org/privacy-policy · Publisher source
- Restrictions
- Free R3 account required. Connect with "Sign in with R3" (OAuth, no setup needed) or an R3 agent key. Some actions (deleting, publishing live) need extra permissions you approve when the agent asks. Publishing a project live requires a paid plan. · Publisher source
Related MCP Connectors
Build a real 3D website by chatting: pages, models and text in space, published to a live URL.
Build, publish and update browser games with saves, leaderboards and realtime multiplayer built in.
Publish 3D scans, Gaussian splats and 360 tours as shareable spaces, and build guided tours in them
Turn a story idea into a 3D game that plays in the browser, and get a link that opens it.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI agents to control and manipulate live 3D scenes across frameworks like Three.js, A-Frame, and Babylon.js using a comprehensive set of object and environment tools. It features an integrated in-world chat system that allows for real-time scene modifications directly from within the 3D canvas.3378 npm3MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to inspect a running Three.js scene in the browser and try out live edits to objects, materials, shaders, lights, camera and animation without touching project files. Every change is recorded and can be exported as ready-to-paste vanilla Three.js or React Three Fiber code, alongside performance audits and frame capture.197 npmMIT
- 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.0Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to inspect, debug and edit Three.js scenes in real time from a live browser, covering objects, materials, shaders, textures, lights, animation, and performance. Live preview changes can be audited, reverted, or turned into ready-to-paste vanilla Three.js and React Three Fiber code without modifying the project.197 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.