accueil / serveurs / Médias / org.r3js/r3
org.r3js/r3
serveur MCP (Model Context Protocol) · r3 3.73.0
Référencé dans l'annuaire. Seul le pentest comportemental fait foi, et il n'a pas encore été exécuté sur ce serveur.
Est-ce que org.r3js/r3 est sûr ?
Au dernier audit MCP Hub, le serveur MCP « org.r3js/r3 » est classé « Non encore testé ». Référencé dans l'annuaire. Seul le pentest comportemental fait foi, et il n'a pas encore été exécuté sur ce serveur. Le verdict est réévalué en continu ; consultez la fiche pour l'état à jour.
Méthode : MCP Hub analyse la description de chaque outil (couche 1) et, pour le verdict fort, exécute le serveur dans une micro-VM isolée avec leurres et réseau bloqué (couche 2). On publie des noms et des compteurs, jamais le contenu brut renvoyé par un outil.
Les 61 outils
- r3_asset_delete≈ 1146 tokens
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.
Paramètres, retour & exemple (5)
Paramètresid· string · requis
The asset's id, as the list tools report it.kind· string · requis · image | model | audio | blender | textureSet
What the id names: blender = a Blender model (its blenderModelId), textureSet = a texture set (its setId).owned· boolean · optionnel
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· boolean · optionnel
Leave out on the first call (it only reports). true deletes — after the user has seen the report.deleteReleases· boolean · optionnel
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.
Exemple d'appel{"name": "r3_asset_delete", "arguments": {"id": "texte", "kind": "image"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"id": "texte", "kind": "texte", "name": "texte", "size": 1, "answer": "texte", "deleted": true, "projects": [], "releases": [], "meshesKept": 1, "environment": "texte", "meshesDeleted": 1, "previewProject": "texte"}} - r3_assets_unused≈ 750 tokens
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.
Paramètres, retour & exemple (2)
Paramètreskind· string · optionnel · image | model | audio | textureSet
Only this kind: image, model, audio or textureSet.limit· integer · optionnel
How many items to list (default 50, at most 200).
Exemple d'appel{"name": "r3_assets_unused", "arguments": {"kind": "image", "limit": 1}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"items": [], "shown": 1, "answer": "texte", "totals": {}, "environment": "texte"}} - r3_audio_list≈ 663 tokens
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. There is no tool that generates audio either: R3 synthesises sound with its music components (Transport, Beat, Pattern, DrumGrid), which stay editable and in tempo: they are how a project gets sound without a recorded file.
Paramètres, retour & exemple (3)
Paramètreslimit· integer · optionnel
How many to return (default 25, max 100).cursor· string · optionnel
Continue a previous listing: pass the nextCursor it returned, unchanged. Omit for the first page.search· string · optionnel
Match this text against the file names, on the server. Omit for everything.
Exemple d'appel{"name": "r3_audio_list", "arguments": {"limit": 1, "cursor": "texte", "search": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"limit": 1, "answer": "texte", "audios": [], "search": "texte", "hasMore": true, "nextCursor": "texte"}} - r3_blender_download≈ 575 tokens
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.
Paramètres, retour & exemple (2)
ParamètresfileId· string · optionnel
A version's sha256 (from this tool's answer, e.g. the original of an applied copy). Leave out for the current version.blenderModelId· string · requis
The Blender model, from r3_blender_list (one of the user's own).
Exemple d'appel{"name": "r3_blender_download", "arguments": {"blenderModelId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"url": "texte", "body": "texte", "bytes": 1, "answer": "texte", "fileId": "texte", "method": "texte", "ticket": "texte", "headers": {}, "version": 1, "fileName": "texte", "maxBytes": 1, "expiresAt": "texte"}} - r3_blender_draft_push≈ 514 tokens
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.
Paramètres, retour & exemple (1)
Paramètresmodel· string · requis
The model's name, as the page shows it: "monster-truck" (the same name you will save it under).
Exemple d'appel{"name": "r3_blender_draft_push", "arguments": {"model": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"url": "texte", "body": "texte", "model": "texte", "answer": "texte", "method": "texte", "ticket": "texte", "headers": {}, "maxBytes": 1, "expiresAt": "texte", "environment": "texte"}} - r3_blender_import≈ 1122 tokens
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).
Paramètres, retour & exemple (4)
Paramètresmeshes· array · optionnel
Import only these meshes (by mesh name), each with its own placement. Default: the whole model.reparse· boolean · optionnel
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· string · requis
The project to import into, from r3_project_create.blenderModelId· string · requis
Which Blender model, from r3_blender_list.
Exemple d'appel{"name": "r3_blender_import", "arguments": {"projectId": "texte", "blenderModelId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"root": "texte", "answer": "texte", "entity": "texte", "fileId": "texte", "status": "imported", "objects": [], "filename": "texte", "reparsed": true, "warnings": [], "meshCount": 1, "projectId": "texte", "textureCount": 1}} - r3_blender_list≈ 1510 tokens
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).
Paramètres, retour & exemple (4)
Paramètreslimit· integer · optionnel
How many models to return (default 25, max 100).cursor· string · optionnel
Continue a list: the nextCursor of the previous page.search· string · optionnel
Only models whose name matches, searched across every model (not the page in hand).community· boolean · optionnel
true lists the PUBLIC models of every user (the Community tab) instead of this account's own.
Exemple d'appel{"name": "r3_blender_list", "arguments": {"limit": 1, "cursor": "texte", "search": "texte", "community": true}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"answer": "texte", "filter": "texte", "models": [], "hasMore": true, "nextCursor": "texte"}} - r3_blender_update≈ 628 tokens
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. Only the mesh shapes and materials change; each project keeps its own placement, and published releases never change. Needs the blender:update right.
Paramètres, retour & exemple (5)
Paramètreschoice· string · requis · update_projects
Required: update_projects. There is no default.reportId· string · optionnel
The report being answered, from the plan (this tool without reportId). Leave it out to plan.projectIds· array · optionnel
With a reportId: the projects to update.blenderModelId· string · requis
The Blender model, from r3_blender_list.entityTemplateIds· array · optionnel
With a reportId: the entity templates to update.
Exemple d'appel{"name": "r3_blender_update", "arguments": {"choice": "update_projects", "blenderModelId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"kept": [], "live": true, "answer": "texte", "choice": "texte", "reportId": "texte", "freedRows": 1, "repointed": [], "environment": "texte", "currentFileId": "texte", "blenderModelId": "texte"}} - r3_blender_upload≈ 604 tokens
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.
Paramètres, retour & exemple (1)
ParamètresfileName· string · requis
The .blend file name, which names the model: "monster-truck.blend" (".blend" is added when missing). A name only, no folder.
Exemple d'appel{"name": "r3_blender_upload", "arguments": {"fileName": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"url": "texte", "body": "texte", "answer": "texte", "method": "texte", "ticket": "texte", "headers": {}, "fileName": "texte", "maxBytes": 1, "expiresAt": "texte", "environment": "texte"}} - r3_bug_report≈ 626 tokens
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.
Paramètres, retour & exemple (4)
Paramètrestitle· string · requis
One line naming the fault, e.g. "Cuboid collider with halfExtents.z = 0 inverts the contact normal".projectId· string · optionnel
The project it happens in (r3_project_list), if any. Only a project the user can open.description· string · requis
What you did, what you expected, what happened instead.measurements· string · optionnel
What you measured: values read back, exact error text, timings. Plain text.
Exemple d'appel{"name": "r3_bug_report", "arguments": {"title": "texte", "description": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"url": "texte", "title": "texte", "answer": "texte", "status": "texte", "issueId": "texte", "projectId": "texte"}} - r3_bug_reports_mine≈ 460 tokens
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.
Paramètres, retour & exemple (1)
Paramètreslimit· integer · optionnel
How many to return, newest first (default 20).
Exemple d'appel{"name": "r3_bug_reports_mine", "arguments": {"limit": 1}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"total": 1, "answer": "texte", "issues": []}} - r3_code_read≈ 813 tokens
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.
Paramètres, retour & exemple (2)
ParamètresprojectId· string · requis
The project to read from, from r3_project_create or r3_project_load.entityRefs· array · optionnel
Which Code components to read, e.g. ["spin"]. Omit for ALL of them. Up to 50 per call.
Exemple d'appel{"name": "r3_code_read", "arguments": {"projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"answer": "texte", "projectId": "texte", "components": [], "unreadable": [], "projectName": "texte"}} - r3_code_write≈ 1173 tokens
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: ```js 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 it ``` Reach 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.
Paramètres, retour & exemple (7)
Paramètrescode· string · requis
The JavaScript. A function body that returns {start, update} — see the description.name· string · optionnel
Label for a NEW Code component, e.g. "Spin". Cannot be combined with entityRef.event· string · optionnel
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· string · optionnel
The entityRef of an EXISTING Code component to replace, as reported by r3_project_load. Cannot be combined with name.projectId· string · requis
The project to write into, from r3_project_create or r3_project_load.baseVersion· integer · optionnel
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· string · optionnel
Or the id of the EXISTING Code component to replace (instead of entityRef).
Exemple d'appel{"name": "r3_code_write", "arguments": {"code": "texte", "projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"seq": "texte", "name": "texte", "event": "texte", "action": "created", "answer": "texte", "fileName": "texte", "warnings": [], "entityRef": "texte", "projectId": "texte", "codeVersion": 1, "componentId": "texte"}} - r3_component_add≈ 831 tokens
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).
Paramètres, retour & exemple (3)
Paramètrestype· string · requis
The component type, e.g. "ColliderCuboid", "RigidBodyFixed", "LightPoint".values· object · optionnel
Its values, e.g. {"rigidBody": "rigidbody_dynamic_1", "halfExtents": {"x": 2}, "friction": 0.2}.projectId· string · requis
The project to add to (r3_project_list).
Exemple d'appel{"name": "r3_component_add", "arguments": {"type": "texte", "projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"seq": "texte", "type": "texte", "saved": true, "answer": "texte", "created": 1, "physics": [], "entityRef": "texte", "projectId": "texte", "componentId": "texte"}} - r3_component_bounds≈ 1117 tokens
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 "<model>_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. Several in one call (up to 20). Works with no R3 tab open, from the project as it is kept; read-only.
Paramètres, retour & exemple (2)
ParamètresprojectId· string · requis
The project, from r3_project_list or r3_project_create.entityRefs· array · requis
Meshes or model root Empties to measure, by entityRef (r3_project_load lists them) or id, e.g. ["truck_root"]. Up to 20.
Exemple d'appel{"name": "r3_component_bounds", "arguments": {"projectId": "texte", "entityRefs": []}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"answer": "texte", "projectId": "texte", "components": [], "unreadable": [], "projectName": "texte"}} - r3_component_read≈ 860 tokens
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. 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.
Paramètres, retour & exemple (2)
ParamètresprojectId· string · requis
The project the components are in, from r3_project_create or r3_project_load.entityRefs· array · requis
Which components to read, as reported by r3_project_load, e.g. ["mesh_cube_1", "material_cube_1"]. Up to 50 per call.
Exemple d'appel{"name": "r3_component_read", "arguments": {"projectId": "texte", "entityRefs": []}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"answer": "texte", "projectId": "texte", "components": [], "unreadable": [], "projectName": "texte"}} - r3_component_set≈ 1814 tokens
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.
Paramètres, retour & exemple (4)
ParamètresentityRef· string · optionnel
Which component to change, as reported by r3_project_load, e.g. "mesh_cube_1".projectId· string · requis
The project the component is in, from r3_project_create or r3_project_load.properties· object · requis
What to set: {"roughness": 0.25, "position": {"y": 2}, "material": "material_cube_1"}.componentId· string · optionnel
Or its id (r3_project_load) — exactly one of entityRef / componentId.
Exemple d'appel{"name": "r3_component_set", "arguments": {"projectId": "texte", "properties": {}}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"seq": "texte", "type": "texte", "answer": "texte", "landed": [], "changes": [], "physics": [], "entityRef": "texte", "keptWorld": {}, "projectId": "texte", "componentId": "texte"}} - r3_docs_list≈ 349 tokens
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.
Paramètres, retour & exemple (0)
Exemple d'appel{"name": "r3_docs_list", "arguments": {}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"docs": [], "answer": "texte", "apiIndexPath": "texte"}} - r3_docs_read≈ 290 tokens
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 ~246KB.
Paramètres, retour & exemple (1)
Paramètrespath· string · requis
Which document, e.g. "CODE_PATTERNS.md", "api", "api/component/Mesh". From r3_docs_list.
Exemple d'appel{"name": "r3_docs_read", "arguments": {"path": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}]} - r3_editor_add_component≈ 867 tokens
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").
Paramètres, retour & exemple (3)
Paramètrestype· string · requis
The component type, e.g. "ColliderCuboid", "RigidBodyFixed", "LightPoint".values· object · optionnel
Its values, e.g. {"rigidBody": "rigidbody_dynamic_1", "halfExtents": {"x": 2}, "friction": 0.2}.projectId· string · requis
The project (r3_project_list).
Exemple d'appel{"name": "r3_editor_add_component", "arguments": {"type": "texte", "projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"seq": "texte", "live": true, "type": "texte", "saved": true, "answer": "texte", "editor": "texte", "created": 1, "entityRef": "texte", "projectId": "texte", "componentId": "texte"}} - r3_editor_capture≈ 767 tokens
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.
Paramètres, retour & exemple (3)
Paramètreswidth· number · optionnel
The picture's largest width in px, 64..1280 (default 1024); it keeps the canvas's aspect and is never scaled up.camera· string · optionnel · editor | project
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· string · requis
A project open in the user's editor (r3_whoami lists them).
Exemple d'appel{"name": "r3_editor_capture", "arguments": {"projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"bytes": 1, "width": 1, "answer": "texte", "camera": "editor", "editor": "texte", "height": 1, "mimeType": "texte", "projectId": "texte"}} - r3_editor_code≈ 902 tokens
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.
Paramètres, retour & exemple (5)
Paramètrescode· string · requis
The whole new code (a function body).entityRef· string · optionnel
Or its entityRef, e.g. "code_spin".projectId· string · requis
The project (r3_project_list).baseVersion· ? · optionnel
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· string · optionnel
The Code component's id.
Exemple d'appel{"name": "r3_editor_code", "arguments": {"code": "texte", "projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"seq": "texte", "live": true, "name": "texte", "error": "texte", "saved": true, "answer": "texte", "editor": "texte", "compiled": true, "warnings": [], "entityRef": "texte", "projectId": "texte", "codeVersion": "texte"}} - r3_editor_create≈ 741 tokens
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.
Paramètres, retour & exemple (3)
Paramètresparams· object · optionnel
Factory options, e.g. {"color": 16711680, "position": {"y": 2}}. Rotation is in RADIANS, color a packed RGB integer.factory· string · requis
Factory name, e.g. "Cube", "Sphere", "PhysicsCube". See r3_factory_list.projectId· string · requis
The project (r3_project_list).
Exemple d'appel{"name": "r3_editor_create", "arguments": {"factory": "texte", "projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"seq": "texte", "live": true, "roles": {}, "saved": true, "answer": "texte", "editor": "texte", "created": 1, "factory": "texte", "projectId": "texte"}} - r3_editor_delete≈ 1192 tokens
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.
Paramètres, retour & exemple (3)
Paramètresconfirm· object · optionnel
Leave out to get the plan; give it to delete what the plan named.projectId· string · requis
The project (r3_project_list).componentIds· array · requis
The ids of the components to delete (r3_editor_inspect / r3_project_load).
Exemple d'appel{"name": "r3_editor_delete", "arguments": {"projectId": "texte", "componentIds": []}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"seq": "texte", "live": true, "mode": "texte", "modes": [], "saved": true, "answer": "texte", "editor": "texte", "members": [], "disposed": [], "selected": [], "confirmed": true, "planToken": "texte"}} - r3_editor_inspect≈ 1086 tokens
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.
Paramètres, retour & exemple (5)
Paramètresids· array · optionnel
Component ids to read.type· string · optionnel
Only components of this type, e.g. "Mesh" or "R3ComponentMesh".fields· array · optionnel
Only these properties, e.g. ["position", "rotation"].entityRef· string · optionnel
Only the component with this entityRef.projectId· string · requis
The project, open in the user's editor.
Exemple d'appel{"name": "r3_editor_inspect", "arguments": {"projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"live": true, "answer": "texte", "editor": "texte", "projectId": "texte", "components": [], "unreadable": [], "projectName": "texte", "fieldsNotFound": []}} - r3_editor_open≈ 636 tokens
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.
Paramètres, retour & exemple (1)
ParamètresprojectId· string · requis
The project to open, from r3_project_list or r3_project_create.
Exemple d'appel{"name": "r3_editor_open", "arguments": {"projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"answer": "texte", "editor": "texte", "opened": true, "focused": true, "projectId": "texte", "alreadyOpen": true, "projectName": "texte"}} - r3_editor_run≈ 734 tokens
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.
Paramètres, retour & exemple (2)
Paramètressystems· array · optionnel
Which of the editor's Run / Stop buttons: physics, code, audio, music. Leave out for all of them.projectId· string · requis
A project open in the user's editor (r3_whoami lists them).
Exemple d'appel{"name": "r3_editor_run", "arguments": {"projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"action": "texte", "answer": "texte", "editor": "texte", "systems": [], "projectId": "texte"}} - r3_editor_save≈ 676 tokens
Save a VERSION of a project, like the editor's Save version (Ctrl+S): a named, frozen copy of the project as it is now (a release that does NOT go live). Nothing needs saving to be kept — every change is kept as it is made — so a version is for when the user asks for one (or a milestone they are told about). `name` is the version's name ("before the physics rework"). Nothing changed since the newest version: that version stands, no new one is made. r3_release_list lists the versions; r3_publish_live makes the project live. No editor is needed.
Paramètres, retour & exemple (2)
Paramètresname· string · optionnel
The version's name, a few words (up to 500 characters).projectId· string · requis
The project (r3_project_list).
Exemple d'appel{"name": "r3_editor_save", "arguments": {"projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"saved": true, "answer": "texte", "editor": "texte", "reused": true, "message": "texte", "version": 1, "warning": true, "projectId": "texte", "projectName": "texte"}} - r3_editor_set≈ 959 tokens
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.
Paramètres, retour & exemple (4)
Paramètresvalues· object · requis
What to set: {"visible": false, "position": {"y": 2}, "material": "material_cube_1"}.entityRef· string · optionnel
Or its entityRef, e.g. "mesh_cube_1".projectId· string · requis
The project (r3_project_list).componentId· string · optionnel
The component's id (r3_project_load / r3_editor_inspect).
Exemple d'appel{"name": "r3_editor_set", "arguments": {"values": {}, "projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"seq": "texte", "live": true, "type": "texte", "saved": true, "answer": "texte", "editor": "texte", "landed": [], "changes": [], "entityRef": "texte", "projectId": "texte", "componentId": "texte"}} - r3_editor_set_preview_image≈ 644 tokens
Use what the project's camera shows NOW, in the user's open R3 editor, as the project's picture: the image on its Projects card and on its preview link. 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 picture of its live release until the next publish. Needs a tab with the project open and project:write.
Paramètres, retour & exemple (1)
ParamètresprojectId· string · requis
A project open in the user's editor (r3_whoami lists them).
Exemple d'appel{"name": "r3_editor_set_preview_image", "arguments": {"projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"bytes": 1, "saved": true, "width": 1, "answer": "texte", "editor": "texte", "height": 1, "mimeType": "texte", "projectId": "texte"}} - r3_editor_stop≈ 664 tokens
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.
Paramètres, retour & exemple (2)
Paramètressystems· array · optionnel
Which of the editor's Run / Stop buttons: physics, code, audio, music. Leave out for all of them.projectId· string · requis
A project open in the user's editor (r3_whoami lists them).
Exemple d'appel{"name": "r3_editor_stop", "arguments": {"projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"action": "texte", "answer": "texte", "editor": "texte", "systems": [], "projectId": "texte"}} - r3_editor_undo≈ 704 tokens
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).
Paramètres, retour & exemple (3)
Paramètresredo· boolean · optionnel
true: redo what you undid instead of undoing.count· integer · optionnel
How many of your changes to undo (or redo), newest first (default 1, at most 20).projectId· string · requis
The project (r3_project_list).
Exemple d'appel{"name": "r3_editor_undo", "arguments": {"projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"left": {}, "steps": [], "answer": "texte", "headSeq": 1, "direction": "undo", "projectId": "texte", "skippedSteps": []}} - r3_factory_list≈ 178 tokens
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.
Paramètres, retour & exemple (1)
Paramètresfactory· string · optionnel
Optional: return only this factory, e.g. "Cube". Omit for all of them.
Exemple d'appel{"name": "r3_factory_list", "arguments": {"factory": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}]} - r3_factory_run≈ 713 tokens
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. Use r3_factory_list to see the factories and their options.
Paramètres, retour & exemple (3)
Paramètresparams· object · optionnel
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· string · requis
Factory name, e.g. "Cube", "Sphere", "PhysicsCube". See r3_factory_list.projectId· string · requis
The project to add to, from r3_project_create.
Exemple d'appel{"name": "r3_factory_run", "arguments": {"factory": "texte", "projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"seq": "texte", "roles": {}, "answer": "texte", "created": 1, "factory": "texte", "physics": [], "projectId": "texte", "componentCount": 1}} - r3_help_write≈ 763 tokens
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.
Paramètres, retour & exemple (4)
Paramètrestitle· string · optionnel
Heading shown at the top of the modal, e.g. "Controls". Default "Help".markdown· string · requis
The help text, as markdown. Replaces whatever is there.projectId· string · requis
The project to write into, from r3_project_create or r3_project_load.baseVersion· integer · optionnel
REQUIRED when the project already has a Help: its codeVersion, from r3_component_read. Leave it out for the first Help.
Exemple d'appel{"name": "r3_help_write", "arguments": {"markdown": "texte", "projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"seq": "texte", "name": "texte", "title": "texte", "action": "created", "answer": "texte", "warnings": [], "entityRef": "texte", "projectId": "texte", "codeVersion": 1, "componentId": "texte"}} - r3_image_create≈ 640 tokens
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.
Paramètres, retour & exemple (2)
Paramètresname· string · requis
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· string · requis
The image, as data:image/png;base64,… — up to 1MB once decoded.
Exemple d'appel{"name": "r3_image_create", "arguments": {"name": "texte", "dataUrl": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"url": "texte", "answer": "texte", "imageId": "texte", "filename": "texte", "mimeType": "texte", "sizeBytes": 1}} - r3_image_list≈ 735 tokens
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.
Paramètres, retour & exemple (3)
Paramètreslimit· integer · optionnel
How many to return (default 25, max 100).cursor· string · optionnel
Continue a previous listing: pass the nextCursor it returned, unchanged. Omit for the first page.search· string · optionnel
Match this text against the file names, on the server. Omit for everything.
Exemple d'appel{"name": "r3_image_list", "arguments": {"limit": 1, "cursor": "texte", "search": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"limit": 1, "answer": "texte", "images": [], "search": "texte", "hasMore": true, "nextCursor": "texte"}} - r3_preview_create≈ 388 tokens
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.
Paramètres, retour & exemple (1)
ParamètresprojectId· string · requis
The project id, as returned by r3_project_create.
Exemple d'appel{"name": "r3_preview_create", "arguments": {"projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"slug": "texte", "answer": "texte", "projectId": "texte", "previewUrl": "texte", "environment": "texte", "expiresInHours": 1, "pictureRefreshed": true}} - r3_preview_remove≈ 398 tokens
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.
Paramètres, retour & exemple (1)
ParamètresprojectId· string · requis
The project id (r3_project_list).
Exemple d'appel{"name": "r3_preview_remove", "arguments": {"projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"live": true, "answer": "texte", "projectId": "texte", "environment": "texte", "previewRemoved": true}} - r3_project_changes≈ 706 tokens
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.
Paramètres, retour & exemple (4)
Paramètreslimit· integer · optionnel
At most this many groups, the newest (default 50, at most 200); the rest are counted.since· integer · optionnel
List from this seq on (the "+N more" line names it; 0 = everything the log still holds).advance· boolean · optionnel
Without since: move your mark to now (default true). false reads without moving it.projectId· string · requis
The project (r3_project_list).
Exemple d'appel{"name": "r3_project_changes", "arguments": {"projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"more": 1, "first": true, "toSeq": 1, "total": 1, "answer": "texte", "groups": [], "unread": 1, "fromSeq": 1, "projectId": "texte"}} - r3_project_create≈ 562 tokens
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 and music transport — 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.
Paramètres, retour & exemple (2)
Paramètresname· string · optionnel
Project name, shown in the user's project list. Defaults to "Untitled Project". Max 120 characters.template· string · optionnel · mobile-portrait | mobile-landscape
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).
Exemple d'appel{"name": "r3_project_create", "arguments": {"name": "texte", "template": "mobile-portrait"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"name": "texte", "answer": "texte", "template": "texte", "projectId": "texte", "environment": "texte", "componentCount": 1}} - r3_project_delete≈ 546 tokens
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.
Paramètres, retour & exemple (2)
Paramètresowned· boolean · optionnel
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· string · requis
The project id to delete: one you created, or (with project:delete:owned) any project the user owns.
Exemple d'appel{"name": "r3_project_delete", "arguments": {"projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"answer": "texte", "deleted": true, "projectId": "texte", "environment": "texte"}} - r3_project_list≈ 725 tokens
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.
Paramètres, retour & exemple (3)
Paramètreslimit· integer · optionnel
How many to return (default 25, max 100).cursor· string · optionnel
Continue a previous listing: pass the nextCursor it returned, unchanged. Omit for the first page.search· string · optionnel
Match this text against project names, on the server (case-insensitive). Omit for every project.
Exemple d'appel{"name": "r3_project_list", "arguments": {"limit": 1, "cursor": "texte", "search": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"limit": 1, "answer": "texte", "search": "texte", "hasMore": true, "projects": [], "nextCursor": "texte"}} - r3_project_load≈ 441 tokens
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`.
Paramètres, retour & exemple (1)
ParamètresprojectId· string · requis
The project to read, from r3_project_create or the R3 app.
Exemple d'appel{"name": "r3_project_load", "arguments": {"projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"name": "texte", "answer": "texte", "objects": [], "projectId": "texte", "componentCount": 1, "valueComponentCount": 1}} - r3_project_rename≈ 436 tokens
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.
Paramètres, retour & exemple (2)
Paramètresname· string · requis
The new name. Leading and trailing spaces are trimmed. Max 120 characters.projectId· string · requis
The project to rename, from r3_project_list or r3_project_create.
Exemple d'appel{"name": "r3_project_rename", "arguments": {"name": "texte", "projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"seq": "texte", "name": "texte", "answer": "texte", "changed": true, "projectId": "texte", "previousName": "texte"}} - r3_publish_live≈ 629 tokens
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. 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.
Paramètres, retour & exemple (2)
Paramètresnote· string · optionnel
Optional: what this release is, in a few words (up to 500 characters), e.g. "new cue and rules".projectId· string · requis
The project id (r3_project_list / r3_project_create).
Exemple d'appel{"name": "r3_publish_live", "arguments": {"projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"live": true, "note": "texte", "slug": "texte", "answer": "texte", "changes": "texte", "liveUrl": "texte", "projectId": "texte", "environment": "texte", "firstGoLive": true, "releaseNumber": 1, "previousNumber": 1}} - r3_publish_settings_read≈ 473 tokens
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, and what Save does for a live project. 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.
Paramètres, retour & exemple (1)
ParamètresprojectId· string · requis
The project id (r3_project_list).
Exemple d'appel{"name": "r3_publish_settings_read", "arguments": {"projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"live": true, "answer": "texte", "worksOn": "texte", "seoTitle": "texte", "projectId": "texte", "environment": "texte", "portalSettings": {}, "seoDescription": "texte", "worksOnSuggestion": "texte"}} - r3_publish_settings_set≈ 1358 tokens
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.
Paramètres, retour & exemple (2)
Paramètressettings· object · requis
Only the settings to change, e.g. {"worksOn": "keyboard", "seoDescription": "…"}.projectId· string · requis
The project id (r3_project_list).
Exemple d'appel{"name": "r3_publish_settings_set", "arguments": {"settings": {}, "projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"answer": "texte", "changed": [], "projectId": "texte", "environment": "texte", "portalSettings": {}}} - r3_release_list≈ 517 tokens
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.
Paramètres, retour & exemple (1)
ParamètresprojectId· string · requis
The project id (r3_project_list).
Exemple d'appel{"name": "r3_release_list", "arguments": {"projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"live": true, "answer": "texte", "releases": [], "projectId": "texte", "changesNotLive": true, "liveReleaseNumber": 1}} - r3_release_restore≈ 628 tokens
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).
Paramètres, retour & exemple (3)
ParamètresplanToken· string · optionnel
The planToken the first call answered; only when the user agreed to that plan.projectId· string · requis
The project (r3_project_list).releaseNumber· number · requis
The release to restore the working copy to (r3_release_list).
Exemple d'appel{"name": "r3_release_restore", "arguments": {"projectId": "texte", "releaseNumber": 1}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"answer": "texte", "headSeq": 1, "opCount": 1, "summary": {}, "restored": true, "planToken": "texte", "projectId": "texte", "releaseNumber": 1}} - r3_release_rollback≈ 399 tokens
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.
Paramètres, retour & exemple (2)
ParamètresprojectId· string · requis
The project id (r3_project_list).releaseNumber· number · requis
The release to make live (r3_release_list).
Exemple d'appel{"name": "r3_release_rollback", "arguments": {"projectId": "texte", "releaseNumber": 1}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"answer": "texte", "changed": true, "projectId": "texte", "environment": "texte", "releaseNumber": 1, "previousNumber": 1}} - r3_roadmap_list≈ 588 tokens
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`.
Paramètres, retour & exemple (2)
Paramètressearch· string · optionnel
Words to find in the title or description, any case.status· string · optionnel · proposed | planned | in-progress | shipped
Only items with this status.
Exemple d'appel{"name": "r3_roadmap_list", "arguments": {"search": "texte", "status": "proposed"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"items": [], "total": 1, "answer": "texte", "pending": 1, "declined": 1}} - r3_roadmap_suggest≈ 460 tokens
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.
Paramètres, retour & exemple (3)
Paramètrestitle· string · requis
One line naming the feature, e.g. "Per-wheel tyre grip in the Inspector".category· string · optionnel · core | graphics | physics | audio | editor | other
Where it belongs; "other" when unsure.description· string · requis
What it lets a person do, and why it is needed.
Exemple d'appel{"name": "r3_roadmap_suggest", "arguments": {"title": "texte", "description": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"id": "texte", "title": "texte", "answer": "texte", "approved": true}} - r3_roadmap_upvote≈ 312 tokens
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.
Paramètres, retour & exemple (1)
Paramètresid· string · requis
The roadmap item id, from r3_roadmap_list.
Exemple d'appel{"name": "r3_roadmap_upvote", "arguments": {"id": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"id": "texte", "title": "texte", "voted": true, "answer": "texte", "voteCount": 1}} - r3_terrain_height≈ 1242 tokens
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.
Paramètres, retour & exemple (3)
Paramètrespoints· array · optionnel
World positions to sample, e.g. [{"x": 0, "z": 12.5}]. Up to 100.terrain· string · optionnel
The terrain: its Mesh, GeometryHeightfield or ColliderHeightfield, by entityRef or id. Optional when the project has one terrain.projectId· string · requis
The project, from r3_project_list or r3_project_create.
Exemple d'appel{"name": "r3_terrain_height", "arguments": {"projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"answer": "texte", "editor": "texte", "points": [], "source": "editor", "terrain": {}, "projectId": "texte", "projectName": "texte"}} - r3_texture_apply≈ 702 tokens
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` when the set is metallic), the SAME repeat on every map, and roughness 1 (THREE multiplies the roughness map by the material's roughness; the default 0.5 would halve it). 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; or give `worldSize` in metres (repeat = worldSize / the set's tile size), e.g. 1000 for a 1 km terrain with 1 m gravel. Kept at once in the project's live copy: every R3 tab with the project open shows it.
Paramètres, retour & exemple (5)
ParamètressetId· string · requis
The texture set (r3_texture_create answers it).repeat· number · optionnel
How often the texture repeats across the surface (the same on every map). Default 1.material· string · requis
The material to wire: its entityRef or id (r3_project_load), e.g. "material_ground".projectId· string · requis
The project (r3_project_list).worldSize· number · optionnel
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.
Exemple d'appel{"name": "r3_texture_apply", "arguments": {"setId": "texte", "material": "texte", "projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"seq": "texte", "answer": "texte", "repeat": 1, "scalars": {}, "material": {}, "textures": [], "projectId": "texte"}} - r3_texture_create≈ 1080 tokens
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 "<name> · albedo.png" …). Start from a preset (gravel, sand, concrete, bricks) with optional controls: seed (another variation), scale (an integer: finer pattern), colours (the ramp's "#rrggbb" stops), contrast, bumpiness (normal strength), roughness {min, max}, 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} 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.
Paramètres, retour & exemple (6)
Paramètresname· string · requis
What the owner sees, e.g. "Gravel path". Unique in the account.size· integer · optionnel
256, 512, 1024 (default) or 2048 pixels square.apply· object · optionnel
Also wire it to a material: {projectId, material, repeat | worldSize}.preset· string · optionnel
A preset: gravel, sand, concrete, bricks.recipe· object · optionnel
Or a full recipe (format "r3-texture-recipe", version 1).controls· object · optionnel
With a preset: {seed, scale, colours, contrast, bumpiness, roughness: {min, max}, size, tileWorldSize, height}.
Exemple d'appel{"name": "r3_texture_create", "arguments": {"name": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"maps": {}, "name": "texte", "size": 1, "setId": "texte", "stats": {}, "answer": "texte", "applied": "texte", "warnings": [], "tileWorldSize": 1}} - r3_texture_read≈ 308 tokens
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.
Paramètres, retour & exemple (1)
ParamètressetId· string · requis
The set id (r3_texture_create answers it).
Exemple d'appel{"name": "r3_texture_read", "arguments": {"setId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"set": {}, "answer": "texte"}} - r3_texture_update≈ 762 tokens
Change a texture set the account owns: its look (controls: seed, scale, colours, contrast, bumpiness, roughness {min, max}, 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 set ("Gravel" → "Gravel 2", or the `name` you give) that links back to it, and every project and release that uses the old maps keeps them. The answer names the user's projects still on the old maps; 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.
Paramètres, retour & exemple (4)
Paramètresname· string · optionnel
The new set's name. Default: the old name with the next number ("Gravel 2").setId· string · requis
The set to change (r3_texture_create / r3_texture_read answer it). The account's own.recipe· object · optionnel
Or a whole new recipe (format "r3-texture-recipe", version 1).controls· object · optionnel
Changes to its recipe: {seed, scale, colours, contrast, bumpiness, roughness: {min, max}, size, tileWorldSize, height}.
Exemple d'appel{"name": "r3_texture_update", "arguments": {"setId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"maps": {}, "name": "texte", "size": 1, "setId": "texte", "stats": {}, "answer": "texte", "warnings": [], "previousId": "texte", "previousInUse": "texte", "tileWorldSize": 1}} - r3_unpublish_live≈ 369 tokens
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.
Paramètres, retour & exemple (1)
ParamètresprojectId· string · requis
The project id (r3_project_list).
Exemple d'appel{"name": "r3_unpublish_live", "arguments": {"projectId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"live": true, "answer": "texte", "projectId": "texte", "environment": "texte"}} - r3_whoami≈ 1004 tokens
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.
Paramètres, retour & exemple (0)
Exemple d'appel{"name": "r3_whoami", "arguments": {}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"plan": {}, "label": "texte", "answer": "texte", "editor": {}, "agentId": "texte", "username": "texte", "agentName": "texte", "connection": "key", "environment": "texte", "apiReachable": true, "capabilities": [], "projectsOnFirstPage": 1}}
C'est votre serveur ?
Revendiquez-le sur l'espace créateur (preuve GitHub, domaine ou npm) pour afficher le badge « propriétaire vérifié » et lancer un pentest comportemental à la demande afin d'obtenir le badge « Vérifié ».