{"name":"io.github.gripforgeai/mcp","slug":"gripforgeai-mcp","title":"GripForge","description":"Turn prompts into production-ready game assets: animated characters, textures, terrain, VFX, HUD.","url":"https://mcp.market/server/gripforgeai-mcp","rating":null,"grade":"A","score":87,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":37,"stars":1,"forks":0,"downloads_week":176,"last_push_at":"2026-09-20T09:40:03.000Z","license":"MIT"},"uptime":{"percent":100,"checks":5,"ok":5,"last_checked_at":"2026-09-21T10:35:42.719Z","last_ok_at":"2026-09-21T10:35:42.719Z","latency_ms":159},"claimed":false,"transport":"mixed","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/gripforgeai/mcp","website":"https://gripforge.ai","version":"0.1.10","remotes":[{"type":"streamable-http","url":"https://gripforge.ai/mcp","headers":[{"description":"GripForge API key (gf_...) — create one at https://gripforge.ai/account","isRequired":true,"isSecret":true,"name":"x-api-key"}]}],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"@gripforgeai/mcp","version":"0.1.10","transport":{"type":"stdio"},"environmentVariables":[{"description":"GripForge API key (gf_...) — create one at https://gripforge.ai/account","isRequired":true,"isSecret":true,"name":"GRIPFORGE_API_KEY"}]}],"tools":[{"name":"getAttachmentFrame","description":"Return the skeleton frame for a limb. Outward = R_Thigh−L_Thigh (never ask the LLM). Up = Knee→Hip / Ankle→Knee. Match getWearableFrame axes — no Euler.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"character_url":{"type":"string","description":"URL of the rigged character"},"bodyPart":{"type":"string","enum":["right_thigh","left_thigh","right_shin","left_shin"],"description":"Limb to seat"}},"required":["character_url","bodyPart"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"getWearableFrame","description":"Analyze an armor asset once: up, bodyFacing, outward, anchor. Never returns rotate X = 180°.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"asset_url":{"type":"string","description":"URL of the armor piece"},"type":{"type":"string","enum":["thigh","greave"]},"side":{"type":"string","enum":["left","right"]}},"required":["asset_url"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_aim","description":"Aim-offset poses for a Library character/armed bind (0 credits): per hand, two-bone IK + wrist alignment so the WEAPON AXIS (gf_muzzle locator from loadout, else the seat forward) points at every direction of a yaw×pitch grid. Returns bone-local quaternions per pose + rest, and a Three.js/Godot blend snippet. Dual wield ready (independent hands).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"attach_id":{"description":"Armed bind / loadout id (lib_…) — preferred","type":"string"},"character_id":{"description":"Character id if no bind","type":"string"},"hands":{"type":"array","items":{"type":"string","enum":["left","right"]}},"yaws":{"description":"Default [-60,-30,0,30,60]","type":"array","items":{"type":"number"}},"pitches":{"description":"Default [-40,-20,0,20,40]","type":"array","items":{"type":"number"}},"extension":{"description":"Arm extension 0.5–0.98 (default 0.9)","type":"number"}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_animate","description":"Retarget the Universal Animation Library pack onto a Mixamo-named Library character/enemy/armed bind. Base slots + extras (taunt, stinger, knockback, block, jump_start/loop/land, idle_guns, shoot). archetype remaps the base slots: sword (default), claws, heavy, brawler, puppet. Opt-in slots fire_breath (mouth exhalation) and energy_cast (two-hand azure wave) use the Studio VFX character motions. Saves kind=animation. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"character_id":{"type":"string","description":"Library character, enemy, or armed bind id"},"archetype":{"description":"Movement/strike archetype — remaps the base slots (default sword)","type":"string","enum":["sword","claws","heavy","brawler","puppet"]},"slots":{"description":"Subset of clips (default: all)","type":"array","items":{"type":"string","enum":["idle","walk","run","attack1","attack2","attack3","hit","death","dodge","taunt","stinger","knockback","block","jump_start","jump_loop","jump_land","idle_guns","shoot","fire_breath","energy_cast"]}},"name":{"description":"Library name for the animated GLB","type":"string"}},"required":["character_id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_armor_generate","description":"Queue a durable armor-kit job: one shared concept, isolated Imagine references, Meshy PBR models, bounded Blender interior preparation and paired GLB exports, then actual GripForge wearer review. Types: helmet, chest, belt, pauldron, bracer, glove, thigh, greave, boot, upperarm, gorget, tasset, undersuit. coverage=full adds a durable anatomical decomposition of the concept, rejects missing planned roles before mesh generation and records per-instance coverage fits. A piece count alone never proves body coverage. The optional undersuit is a locally manufactured adaptive textile which retains each wearer’s skin weights. Meshy pieces cost 11 credits per canonical type; the textile has no image/mesh charge. A new concept costs 1 credit; mirrors are included. concept_item must be an owned Library image. source_kit + explicit pieces regenerates only those types into a NEW work kit and pins unchanged pieces. Closing the call/page does not cancel. Poll gripforge_generation_read. Success is a work version, never automatic visual approval. The result includes a Grip Studio link, review scene, concepts, source models and Blender source.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":2000},"name":{"type":"string","maxLength":100},"pieces":{"minItems":1,"maxItems":13,"type":"array","items":{"type":"string","enum":["helmet","chest","belt","pauldron","bracer","glove","thigh","greave","boot","upperarm","gorget","tasset","undersuit"]}},"coverage":{"type":"string","enum":["modular","full"]},"textile_color":{"type":"string","pattern":"^#[a-fA-F0-9]{6}$"},"concept_item":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"source_kit":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"character_items":{"maxItems":3,"type":"array","items":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"}},"polycount":{"type":"integer","minimum":3000,"maximum":30000},"idempotency_key":{"type":"string","minLength":8,"maxLength":160},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_armor_read","description":"Read an owned kit manifest, semantic slots and immutable piece revisions. Equipment and instances remain independent. Returns the Grip Studio link. To correct selected types, call gripforge_armor_generate with source_kit and pieces.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_armor_repair","description":"Fork a failed/cancelled armor job into a new work kit. Preserve completed pieces and the exact shared concept; recreate only unfinished types by default. Optional pieces chooses types explicitly. Use prompt for targeted corrections. Original checkpoints and artifacts remain intact. Costs 11 credits per regenerated canonical type (plus a concept credit only if none survived). Use generation_retry instead for a transient provider or worker error to reuse the exact same steps without another charge.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"source_job":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"prompt":{"type":"string","minLength":3,"maxLength":2000},"pieces":{"minItems":1,"maxItems":13,"type":"array","items":{"type":"string","enum":["helmet","chest","belt","pauldron","bracer","glove","thigh","greave","boot","upperarm","gorget","tasset","undersuit"]}},"idempotency_key":{"type":"string","minLength":8,"maxLength":160},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["source_job"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_attach","description":"Attach a prop (sword, shield, gun, staff/scythe…) onto a rigged character. Finds the hand bone across naming schemes, scales the prop to the character, seats the grip, closes the fist, and returns a bind + ready-to-paste Three.js / Unity / Godot snippets. Pass Library ids (character_id / prop_id) or https URLs. attach_id reuses an existing armed bind GLB as the character. prop_id_2 attaches a second held item (off-hand) onto the first result. The bind (+ armed GLB when export_glb) is saved in Library — not a second credit. To write files into an open repo, use the npm MCP package gripforge_library_pull.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"character_url":{"description":"URL of the rigged character (.glb .gltf .fbx .obj)","type":"string"},"prop_url":{"description":"URL of the prop mesh","type":"string"},"character_id":{"description":"Library id of a character (lib_…)","type":"string"},"attach_id":{"description":"Library bind id — armed GLB used as the character (second prop, or continue a kit)","type":"string"},"prop_id":{"description":"Library id of a prop (lib_…)","type":"string"},"prop_id_2":{"description":"Optional second held item (off-hand) attached after the first","type":"string"},"prop_url_2":{"description":"https URL of a second held item (off-hand)","type":"string"},"style":{"description":"Grip style (default: geometric classification)","type":"string","enum":["melee","gun","shield","staff"]},"hand":{"description":"Hand side (default right)","type":"string","enum":["right","left"]},"height_ratio":{"description":"Prop size as a fraction of body height","type":"number","minimum":0.05,"maximum":1.5},"fist":{"description":"Fist closing 0→1 (default 1)","type":"number","minimum":0,"maximum":1},"ai_refine":{"description":"Vision check of the grip (+10-30s)","type":"boolean"},"export_glb":{"description":"Bake attached.glb into Library and return its signed URL","type":"boolean"}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_audio_kit","description":"Search locker + Community audio. Prompt matches name, description, tags and use (gunshot, ui, magic, footsteps, announcer, dinosaure, magie, pas…). Each hit has id, description, use[], pack, file_url. Community hits: clone with /api/v1/community/{id}/clone (1 credit first take) then pull. Free to search.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"description":"What you need, e.g. \"gunshot\", \"ui click\", \"dinosaur roar\", \"magie\", \"annonceur fps\". Omit for a short catalog.","type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_blender_fabricate","description":"Queue a bounded Blender recipe, never arbitrary Python. Saves GLB and .blend in the workspace as an unvalidated work version with a shared Scene Studio link. Read gripforge_scene_schema for recipe fields. Supports original primitive/custom meshes, PBR colors and keyed transforms. Poll gripforge_generation_read; final visual approval must use GripForge rendering, not Blender screenshots.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"recipe":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"idempotency_key":{"type":"string","minLength":8,"maxLength":160},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["recipe"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_boss","description":"Create a playable boss for a game look: stats, phases, attacks bound to anim-pack slots, arena, and Three / Godot / Unity / Unreal snippets. Kit is 0 credits. Reuses a locker enemy when one exists. Pass character_id to bind a Library mesh. Pass generate=true to forge a NEW kind=enemy boss mesh (10 credits, 2–8 min) — only if style_kit / locker is empty. Then gripforge_animate(archetype) + gripforge_hitbox. Name stays text.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":240,"description":"e.g. \"devil may cry like phantom boss\""},"role":{"description":"mini | mid | final (inferred from the prompt)","type":"string","enum":["mini","mid","final"]},"character_id":{"description":"lib_… character/enemy/bind to bind — 0 credits","type":"string"},"generate":{"description":"Forge a new enemy mesh (10 credits). Skip if locker already has one.","type":"boolean"},"name":{"description":"Boss display name","type":"string","maxLength":80},"provider":{"description":"Only used when generate=true (default tripo)","type":"string","enum":["tripo","meshy"]}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_bot_kit","description":"Navmesh bots as server-owned player scenes so spawner/synchronizer/net-kit damage apply unchanged. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":240,"description":"difficulty: easy, normal, hard"}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_build_deploy","description":"Not implemented. Returns 501 until artifact upload exists.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game build id (bld_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_build_get","description":"Read one game build. Upload/deploy of Linux dedicated artifacts is not implemented yet.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game build id (bld_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_build_list","description":"List game_builds (not Godot kit zips at /api/v1/builds).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_build_rollback","description":"Not implemented. Returns 501. Mutating / production-sensitive.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game build id (bld_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_cape","description":"Cape rig v2: generates a 3-column bone grid (gf_cape_c*r*) anchored to the neck/upper-spine bone, skins the cape mesh onto it (vertical blend × gaussian columns), and bakes attached_cape.glb (character + skinned cape). The cape then ANIMATES: run the returned Godot script (spring bones, attach to the Skeleton3D) or the Three.js verlet snippet — the engine simulates, the bind carries structure + suggested spring params. Inputs: Library ids (lib_…) or https URLs of GLBs. CONSUMER RECIPE — (1) call with character_id/cape_id; (2) download the baked glb from library.file_url; (3) drop cape-godot.gd next to it and attach to the Skeleton3D node. 1 credit.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"character_id":{"description":"Library id of a rigged character (lib_…)","type":"string"},"character_url":{"description":"https URL of a rigged character GLB","type":"string"},"cape_id":{"description":"Library id of the cape mesh (lib_…)","type":"string"},"cape_url":{"description":"https URL of the cape GLB (static mesh)","type":"string"},"columns":{"description":"bone columns (default 3)","type":"integer","minimum":2,"maximum":5},"rows":{"description":"bone rows below anchor (default 5)","type":"integer","minimum":2,"maximum":8},"save":{"description":"save attached_cape.glb into Library (default true)","type":"boolean"}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_character_concepts","description":"Three LOOK pictures (3/4, Imagine low 1K) of a named character, enemy or boss BEFORE any 3D. Pass weapon to show it on the looks; 3D later is T-pose empty hands. Pick one, then gripforge_generate_character with concept_item. 1 credit per image (default 3).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":80,"description":"Creation name, stored on each concept"},"prompt":{"type":"string","minLength":3,"maxLength":600,"description":"Look, outfit, silhouette"},"kind":{"description":"Default character","type":"string","enum":["character","enemy","boss"]},"weapon":{"description":"Shown on the looks only; empty hands if omitted","type":"string","maxLength":160},"n":{"description":"Default 3","type":"number","minimum":1,"maximum":4}},"required":["name","prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_concept_correct","description":"Turn a character concept image into a strict T-pose sheet (optional: remove flowing cape/train only — sleeved jacket stays; outfit or sport base). Saves PNG to Library. 1 credit. Hosted MCP takes https file_url.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"file_url":{"type":"string","description":"https URL of the concept image"},"clothes":{"description":"outfit = keep clothes; base = grey athletic sportswear","type":"string","enum":["outfit","base"]},"cape":{"description":"Remove flowing cape/train only; keep sleeved jacket (outfit only, default true)","type":"boolean"},"notes":{"description":"Extra direction","type":"string"},"name":{"description":"Library name","type":"string"}},"required":["file_url"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_flexible_chain","description":"Queue a persistent 240 Hz XPBD simulation using GripForge Scene Engine. Read flexible_chain_schema first. recipe version=1: preset whip|rope|tail, duration<=10s, fps=30|60, physics {length,segments,damping,bendCompliance,gravity,radius,floor,iterations}; choose motion [{time,position,direction,capsules}] OR source {asset:{assetId,revisionId},clip,mount_node,offset,axis,colliders}. Source assets are immutable and workspace-scoped. Returns a job ID; poll generation_read for a new draft skinned-chain GLB, sampled joints, recipe, physics metrics and Character Studio link. This is a neutral physics preview, not a Meshy weapon redesign or automatic rebind of the source weapon. No runtime world collision or seamless loop guarantee. Cancel/retry keeps completed steps. Does not replace or visually validate an existing asset. 0 credits; storage quota applies.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"recipe":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"idempotency_key":{"type":"string","minLength":8,"maxLength":160},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["recipe"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_flexible_chain_schema","description":"Read the bounded recipe schema for the shared FlexibleChain solver. Presets: whip, rope, tail. Input can follow an exact named mount in a pinned GLB animation or sampled world-space motion. Includes units, collision capsules, limits and a runnable example.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_font","description":"Google-font CSS + exact HUD copy for a game look (DMC: Cinzel D–SSS, kart: Teko, CS: Barlow Condensed). Put letters in HTML/Text nodes. Do NOT rasterize ranks, km/h, or HUD numbers with an image model. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":240,"description":"e.g. \"devil may cry like\""}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_formats","description":"List the mesh formats and grip styles GripForge supports.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_fps_animation","description":"Queue a persistent Blender job for paired FPS arms and an articulated pistol: idle, draw, fire, tactical reload and empty reload. Recipe: {version:1,preset:\"pistol\",name:\"Pistol FPS\",tempo:1}; tempo 0.7–1.3. Returns job_id immediately; poll gripforge_generation_read for the private Library asset, .blend source, event markers and Character Studio FPS link. Generated variants are work revisions, never automatically validated. Use gripforge_generation_cancel/retry; completed steps survive closing the page.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"recipe":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"idempotency_key":{"type":"string","minLength":8,"maxLength":160},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["recipe"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_fps_kit","description":"Reusable FPS rules, map and runtime exports for Godot and web: weapons, reload markers, viewmodel, camera, bots, grenades and bomb rounds. Offline bots. Persist changes with gripforge_kit. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"default":"get","type":"string","enum":["get","validate","export"]},"target":{"default":"both","type":"string","enum":["web","godot","both"]},"kit_id":{"type":"string"},"rules":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"map":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"asset_slots":{"type":"array","items":{"type":"string"}}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_game_broadcast","description":"Requires the Unity SDK. Currently returns 501. Never runs a shell on the host.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"message":{"type":"string","maxLength":500},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_game_capabilities","description":"Start here for an existing project. Report the capabilities a Game Kit project provides, what is still missing for a goal (a preset id from gripforge_gamekit_search or a comma-separated list of capabilities) and which catalogue kits would fill each gap. Call this BEFORE gripforge_gamekit_install to pick the next kit. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","minLength":4,"maxLength":80,"description":"Game Kit project id (gkp_…). Not a dedicated-server project (gpj_…) nor a Library item."},"goal":{"description":"Preset id (e.g. from gripforge_gamekit_search presets) or comma-separated capabilities to reach. Default: the project’s own preset.","type":"string","maxLength":400},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["project_id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_game_play_url","description":"Get the browser play URL of a Game Kit project so a human (or a screenshot step) can run its current revision in the web runtime. Reads the project bundle and returns { url, absolute }; absolute is built on the GripForge origin of this key. Call it AFTER gripforge_gamekit_install or gripforge_game_project bind to check the result live. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","minLength":4,"maxLength":80,"description":"Game Kit project id (gkp_…). Not a dedicated-server project (gpj_…) nor a Library item."},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["project_id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_game_project","description":"Manage Game Kit projects (gkp_…): the container holding installed kits, their lockfile, asset bindings and data collections. action=list lists the workspace projects; create needs name and takes a preset (see gripforge_gamekit_search) or an explicit kits map; get returns the full ProjectDetail (installed kits, bindings, capabilities, missing, playUrl); bind maps asset slots to Library items (lib_…, null to clear); data reads a collection or upserts / removes documents validated against the kits’ schemas (replace=true swaps the whole collection); delete needs confirm=true. Call this first to create or pick the project, then gripforge_gamekit_install. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["list","create","get","bind","data","delete"],"description":"list | create | get | bind | data | delete."},"project_id":{"description":"Game Kit project id (gkp_…). Required for get, bind, data and delete.","type":"string","minLength":4,"maxLength":80},"name":{"description":"create: project name.","type":"string","minLength":1,"maxLength":120},"preset":{"description":"create: preset id whose default kits are installed (gripforge_gamekit_search returns presets).","type":"string","maxLength":80},"kits":{"description":"create: explicit kit toggles { \"vehicle.driveable\": true, … } on top of the preset. Unchecking a required kit fails with toggle_requires.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"boolean"}},"target":{"description":"create: engine target. Default web.","type":"string","enum":["web","godot","unity","unreal"]},"bindings":{"description":"bind: { slot: lib_… | null } — Library item per asset slot declared by the installed kits, null clears.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]}},"collection":{"description":"data: collection name declared by an installed kit (e.g. missions, npcs, zones).","type":"string","maxLength":80},"documents":{"description":"data: documents to upsert (each with its id), validated against the kit schema.","maxItems":500,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"remove":{"description":"data: document ids to remove.","maxItems":500,"type":"array","items":{"type":"string","maxLength":120}},"replace":{"description":"data: true to replace the whole collection with documents.","type":"boolean"},"confirm":{"description":"delete: must be true. The project, its revisions and data are removed.","type":"boolean"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["action"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_gamekit_configure","description":"Tune an installed kit: merge config values validated against the kit configSchema (read it with gripforge_gamekit_get), or toggle enabled to switch the kit off without uninstalling it. Returns { kit, project } with the new project revision. Call this AFTER gripforge_gamekit_install. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","minLength":4,"maxLength":80,"description":"Game Kit project id (gkp_…). Not a dedicated-server project (gpj_…) nor a Library item."},"id":{"type":"string","minLength":2,"maxLength":120,"pattern":"^[a-z0-9][a-z0-9._-]*$","description":"Kit id from the catalogue, dotted (e.g. vehicle.driveable, mission.objectives)."},"config":{"description":"Kit config values, validated against the kit configSchema returned by gripforge_gamekit_get. Merged over the current config.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"enabled":{"description":"false to disable the kit at runtime while keeping it installed; true to re-enable.","type":"boolean"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["project_id","id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_gamekit_deliver","description":"Turn catalogue kits, or the enabled kits of a Game Kit project, into engine files: Godot gets GDScript, scenes and config under gripforge/kits/<kit>/, Unity and Unreal get recipes, web needs nothing. Call with dry_run=true FIRST: it returns the plan (files to add / keep / modify / delete, conflicts, dependencies, post-install steps) and never charges. Pass project_state (the current gripforge/gamekits.lock.json, path → sha256 of the files under gripforge/, engineVersion) so updates keep your edits and detect conflicts. Then call without dry_run to get the bundle. The hosted endpoint cannot write into your project: write bundle.files following plan.actions in order (backup, write, writeBin from bundle.binaries, delete with .uid / .import siblings, writeLock with bundle.lock), or use the npm client with project_dir (gripforge_gamekit_deliver_local), or the editor bridge. A blocked plan answers 409 with the plan: force backs up then overwrites edited files, accept_breaking allows a major update. Credits: the first delivery of a kit major version to an engine costs 1 credit per workspace; re-deliveries, updates within a major, dry runs and the web target are free.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"target":{"type":"string","enum":["godot","unity","unreal","web"],"description":"Engine to deliver to: godot (files), unity / unreal (recipes), web (native, nothing to write)."},"kits":{"description":"Kits to deliver (at most 16). Omit to deliver the enabled kits of project_id.","maxItems":16,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":2,"maxLength":120,"pattern":"^[a-z0-9][a-z0-9._-]*$","description":"Kit id from the catalogue, dotted (e.g. vehicle.driveable, mission.objectives)."},"version":{"description":"Exact version; only the latest is deliverable. Default latest.","type":"string","maxLength":40},"config":{"description":"Kit config, validated against its configSchema.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"bindings":{"description":"Asset slot → Library item id (lib_…).","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"required":["id"]}},"project_id":{"description":"Game Kit project (gkp_…) whose enabled kits, config and slot bindings are delivered when kits is omitted.","type":"string","minLength":4,"maxLength":80},"mode":{"description":"install (default), update to the latest catalogue version, or uninstall (needs project_state.lock).","type":"string","enum":["install","update","uninstall"]},"project_state":{"description":"What the engine project contains now. Without it the plan assumes an empty project (add-only).","type":"object","properties":{"engineVersion":{"description":"Engine version, e.g. 4.3.stable.","type":"string","maxLength":80},"lock":{"description":"Current gripforge/gamekits.lock.json content, null when absent.","anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"files":{"description":"path → sha256 hex of every file under gripforge/ and assets/gripforge/ (at most 5000).","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}}},"dry_run":{"description":"true → plan only: no bundle, never charged. Do this first.","type":"boolean"},"force":{"description":"true → back up then overwrite edited managed files and existing seed files.","type":"boolean"},"accept_breaking":{"description":"true → allow a breaking (major) update.","type":"boolean"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["target"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_gamekit_dependencies","description":"Dependency graph of a Game Kit project: nodes (installed kits with version, provides, requires), edges labelled by capability, conflicts and unresolved requirements. Pass project_id for the installed graph; pass a kit id instead to read the declared requires / provides tree of a catalogue kit before installing it. Call this BEFORE gripforge_gamekit_remove with force. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"description":"Game Kit project id (gkp_…). Default: the workspace’s most recently updated project when id is not given.","type":"string","minLength":4,"maxLength":80},"id":{"description":"Catalogue kit id to inspect instead of a project (returns its manifest tree).","type":"string","minLength":2,"maxLength":120,"pattern":"^[a-z0-9][a-z0-9._-]*$"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_gamekit_get","description":"Read one Game Kit: its manifest (provides / requires capabilities, asset slots, data collections, events), README docs, config JSON schema with defaults, and published versions. Pass with_usage=true to also list the workspace projects that have it installed. Call this BEFORE gripforge_gamekit_configure to know which config keys exist. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":2,"maxLength":120,"pattern":"^[a-z0-9][a-z0-9._-]*$","description":"Kit id from the catalogue, dotted (e.g. vehicle.driveable, mission.objectives)."},"version":{"description":"Exact version to read (e.g. 1.0.0). Default: latest.","type":"string","maxLength":40},"with_usage":{"description":"true to include usedBy: the workspace projects where this kit is installed.","type":"boolean"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_gamekit_install","description":"Add a modular gameplay kit to a Game Kit project (gkp_…). Dependencies declared in the kit manifest are resolved and added automatically; the response returns the plan (add / upgrade / keep) and the updated capabilities. Pass dry_run=true to preview without writing. Call gripforge_game_capabilities first to see what the project is missing, gripforge_gamekit_search to find the kit, then gripforge_gamekit_configure to tune it. Legacy genre kits (legacy.*) are not installable here — use gripforge_kit. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","minLength":4,"maxLength":80,"description":"Game Kit project id (gkp_…). Not a dedicated-server project (gpj_…) nor a Library item."},"id":{"type":"string","minLength":2,"maxLength":120,"pattern":"^[a-z0-9][a-z0-9._-]*$","description":"Kit id from the catalogue, dotted (e.g. vehicle.driveable, mission.objectives)."},"range":{"description":"Semver range to satisfy (e.g. ^1.2.0, 1.x). Default: latest compatible version.","type":"string","maxLength":80},"config":{"description":"Kit config values, validated against the kit configSchema returned by gripforge_gamekit_get. Merged over the current config.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"dry_run":{"description":"true to return the install plan without writing the project.","type":"boolean"},"allow_planned":{"description":"true to accept kits still marked planned (0.x, no runtime yet). Default false.","type":"boolean"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["project_id","id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_gamekit_remove","description":"Uninstall a kit from a Game Kit project (gkp_…). Refused with 409 kit_in_use while other installed kits still require one of its capabilities; pass force=true to remove it anyway and prune=true to also drop the dependencies nothing else needs. Returns { removed[], project }. Call gripforge_gamekit_dependencies BEFORE forcing to see who depends on it. 0 credits.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","minLength":4,"maxLength":80,"description":"Game Kit project id (gkp_…). Not a dedicated-server project (gpj_…) nor a Library item."},"id":{"type":"string","minLength":2,"maxLength":120,"pattern":"^[a-z0-9][a-z0-9._-]*$","description":"Kit id from the catalogue, dotted (e.g. vehicle.driveable, mission.objectives)."},"force":{"description":"true to remove even when other kits depend on it (their requirements become unresolved).","type":"boolean"},"prune":{"description":"true to also remove dependencies that no remaining kit requires.","type":"boolean"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["project_id","id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_gamekit_search","description":"Start here. Search the modular Game Kit catalogue (vehicle.driveable, mission.objectives, npc.wanted, …) by free text, capability, tag or engine target. Pass project_id to score kits against that project: each hit then carries state { installed, updateAvailable, compatible, conflicts, reason } and kits that fill one of its missing capabilities rank first. Returns { kits, presets }; legacy genre kits appear as legacy.* and are installed with gripforge_kit, not here. Kart Racing is native: compose world.racetrack + vehicle.driveable + race.kart; edit race_tracks through project data. world.lighting adds shared sun/fill, point lights and spots, presets, bounded light budgets and bloom; edit world_lights through project data. Call this BEFORE gripforge_gamekit_install. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"q":{"description":"Free text matched on id, name, description and tags (e.g. \"drive a car\", \"wanted level\").","type":"string","maxLength":200},"capability":{"description":"Capability the kit must provide (exact id or prefix, e.g. vehicle.drive).","type":"string","maxLength":120},"tag":{"description":"Tag filter (e.g. vehicle, mission, npc, legacy).","type":"string","maxLength":60},"target":{"description":"Engine target the kit must support. Default web.","type":"string","enum":["web","godot","unity","unreal"]},"project_id":{"description":"Game Kit project id (gkp_…) to score results against. Default: the workspace’s most recently updated project.","type":"string","minLength":4,"maxLength":80},"limit":{"description":"Max kits returned (default 20).","type":"integer","minimum":1,"maximum":100},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_gamekit_update","description":"Check or apply kit updates in a Game Kit project. Dry-run by default: returns the plan (from / to version, breaking changes, migrations to run) without writing. Pass apply=true to write the new lockfile and run the migrations; range narrows the target version (e.g. ^1.2.0). Omit id to check every installed kit in one call. Call gripforge_gamekit_get on the target version to read its manifest first. 0 credits.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","minLength":4,"maxLength":80,"description":"Game Kit project id (gkp_…). Not a dedicated-server project (gpj_…) nor a Library item."},"id":{"description":"Installed kit to update. Omit to check every installed kit.","type":"string","minLength":2,"maxLength":120,"pattern":"^[a-z0-9][a-z0-9._-]*$"},"range":{"description":"Semver range to satisfy (e.g. ^1.2.0, 1.x). Default: latest compatible version.","type":"string","maxLength":80},"apply":{"description":"true to apply the update (new lockfile + migrations). Default false = plan only.","type":"boolean"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["project_id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_generate","description":"CREATE any mesh asset and save it to Library — the canonical generation door. kind decides the pipeline: character/enemy/boss are auto-rigged (pass concept_item or file_url for image-to-3D; otherwise text-to-3D), weapon and prop are direct text-to-model (no rig, no concept step). The workspace Style DNA is applied to the prompt. If the look may already exist, call gripforge_style_kit FIRST. Costs 10 credits. Returns a persistent job_id immediately; poll gripforge_generation_read for progress and the Library/Studio result. Closing this call does not cancel it.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":600,"description":"Description of the asset."},"kind":{"type":"string","enum":["character","enemy","boss","weapon","prop"],"description":"What to forge — rigged (character/enemy/boss) or static mesh (weapon/prop)"},"provider":{"description":"Generation provider (default tripo; meshy when concept_item)","type":"string","enum":["tripo","meshy"]},"name":{"description":"Library item name (default: the prompt)","type":"string","maxLength":160},"polycount":{"description":"Target triangles.","type":"number"},"underwear":{"description":"Characters: false = keep the described outfit","type":"boolean"},"concept_item":{"description":"Library concept / T-pose id (lib_…). Image-to-3D — not text-to-3D.","type":"string"},"file_url":{"description":"https URL of a concept or T-pose image. Image-to-3D.","type":"string"}},"required":["prompt","kind"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_generate_character","description":"CREATE a Mixamo T-pose auto-rigged character, enemy or boss and save it to Library.  NEVER describe a handheld weapon, staff or shield in the prompt: characters and enemies are forged empty-handed (the forge enforces it); make the weapon apart with gripforge_generate (kind=weapon) and put it in the hand with gripforge_attach. polycount is honoured (default 8000; keep it at or under 10000 for a mobile game).To sculpt from a picture (image-to-3D): pass concept_item (lib_… from gripforge_concept_correct / character_concepts) or file_url. Without an image this is text-to-3D. If the look may already be in the locker, call gripforge_style_kit FIRST. For knives/guns use gripforge_generate_weapon. Alias of gripforge_generate (the canonical door). Costs 10 credits. Returns a persistent job_id immediately; poll gripforge_generation_read. Closing this call does not cancel it.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":600,"description":"Description. \"Devil May Cry like enemy\" → tagged devil-may-cry, kind=enemy."},"provider":{"description":"Default tripo. Forced meshy when concept_item / file_url is set.","type":"string","enum":["tripo","meshy"]},"name":{"description":"Library item name (default: the prompt)","type":"string","maxLength":160},"kind":{"description":"character | enemy | boss (boss → enemy + meta.boss)","type":"string","enum":["character","enemy","boss"]},"polycount":{"description":"Target triangles. Meshy characters default 8000 (low-poly FPS).","type":"number"},"underwear":{"description":"false = keep the described outfit. Implied false when an image is passed.","type":"boolean"},"concept_item":{"description":"Library concept / T-pose sheet id (lib_…). Image-to-3D from that picture — not text-to-3D.","type":"string"},"file_url":{"description":"https URL of a concept or T-pose image. Image-to-3D.","type":"string"}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_generate_prop","description":"CREATE a game-ready prop GLB (kart, crate, barrel, banana…) and save it to Library as kind=prop. Default Meshy, no T-pose, no biped rig. polycount defaults to 4000. 10 credits.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":600,"description":"e.g. compact orange open-cockpit racing kart, isolated"},"name":{"description":"Library name","type":"string","maxLength":160},"polycount":{"description":"Target triangles (default 4000)","type":"number"},"provider":{"description":"Default meshy","type":"string","enum":["meshy","tripo"]}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_generate_weapon","description":"CREATE a game-ready weapon GLB (knife, gun, sword…) and save it to Library as kind=weapon. Default provider Meshy, no T-pose, no biped rig. polycount defaults to 4000. style=melee|gun is written to meta.style for gripforge_attach. 10 credits. Do NOT write one-off Meshy scripts.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":600,"description":"e.g. \"CS2 default CT combat knife, silver blade, black grip\""},"name":{"description":"Library name (default: prompt)","type":"string","maxLength":160},"polycount":{"description":"Target triangles (default 4000)","type":"number"},"style":{"description":"Grip style for attach (inferred if omitted)","type":"string","enum":["melee","gun","shield","staff"]},"provider":{"description":"Default meshy","type":"string","enum":["meshy","tripo"]}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_generation_cancel","description":"Request worker cancellation while retaining completed steps and artifacts. Closing a page alone does not cancel a job.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_generation_list","description":"List workspace jobs. Jobs and completed steps survive closing the studio or restarting the web server and worker.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_generation_read","description":"Poll a job returned by a generation tool. Includes durable steps, progress, failure/retry state and the resulting work revision with a Studio link. include_preview returns an actual rendered VFX image when available. Success does not mean visual approval or promotion.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"include_preview":{"type":"boolean"},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_generation_retry","description":"Retry a failed or cancelled job, reusing completed steps. An unconfirmed interrupted provider call may be executed again when explicitly retried.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_hitbox","description":"Body capsules (head/torso/limbs) plus weapons[] — one reach capsule per gf_prop_ wrapper on a loadout/armed bind. Pass id of a loadout GLB (or character_id / attach_id). 0 credits. Use weapons[] not the single weapon field for dual-wield.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"character_id":{"description":"Library character/enemy id","type":"string"},"attach_id":{"description":"Library armed bind id","type":"string"},"id":{"description":"Library id of a loadout / bind / character (lib_…)","type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_hud","description":"Generate a ready-to-drop survivor HUD: hud.json (layout/anchors, no pixels), original GripForge cartoon PNGs (hearts full/half/empty, portrait frame, currency chips, empty hex slot), a Godot 4 .tscn (Control with named nodes Health/XP/Portrait/Currencies/Minimap), and Three.js / Unity / Unreal snippets. 1 credit per successful generate. CONSUMER RECIPE — (1) call gripforge_hud; (2) write the PNGs (download the asset URLs) + hud.json (+ hud.tscn) into the game repo, same folder; (3) Godot: instance the tscn, add_child, then get_node(\"Health\").set_health(current, max) and set XP.value; (4) Unreal: the GripForgeHUD plugin must already be in the project (unreal_plugin_url) — point UGFHudWidget::CreateFromFolder at the folder and call BindHealth on your health component. DO NOT redraw the hearts. DO NOT open a UI editor. This hosted endpoint returns file CONTENTS + URLs; pass out_dir only with the npm MCP package, which writes the files for you.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"preset":{"description":"v1: survivor only (default)","type":"string","const":"survivor"},"health_type":{"description":"default hearts","type":"string","enum":["hearts","bar"]},"health_max":{"description":"default 5","type":"integer","minimum":1,"maximum":20},"health_style":{"description":"skin of the health display. For hearts: round, pixel, shield, star, orb, potion, skull, croix, goutte, eclair, feuille, losange, soleil, lune, patte, os, flamme, flocon, trefle, couronne, anneau, pomme, viande, bonbon, oeil, plume, gland, cloche, poing, aile, hexplaque, rune, bougie, champi, bouclier_pique, coeur_gel, coeur_or, coeur_ombre, batterie, retro. For bar: ronde, segments, scifi, pixel_bar, fantasy, tube, fleches, cellules_hex, oblique, double, fine, crantee, crochets, capsule, rivets, retro_rouge, retro_vert, retro_bleu, retro_jaune, gothique, scifi_energie, cartoon_aventure, horreur. Also accepts \"custom:<slug>\" from gripforge_hud_bar. Default: round (hearts) / ronde (bar).","type":"string"},"currencies":{"description":"default [\"gem\",\"mushroom\",\"drop\"] — unknown ids get the empty hex chip","maxItems":6,"type":"array","items":{"type":"string"}},"minimap":{"description":"default false","type":"boolean"},"portrait":{"description":"default true","type":"boolean"},"out_dir":{"description":"Suggested folder (hosted returns contents only; npm writes)","type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_hud_bar","description":"Forge an ORIGINAL themed health-bar style: an image model draws the ornate empty frame (transparent background), the inner trough is located pixel-precisely, and a thematic gradient fill is composed to match — returns an aligned frame+fill PNG pair, same contract as the built-in gripforge_hud bar styles. Describe a THEME (e.g. \"gothic demon-hunter, baroque metal, horn ornaments\"), never a specific game — styles of a genre, not copies. 2 credits. RECIPE: download frame_url + fill_url next to your hud.json ; Godot: TextureProgressBar (texture_under=frame, texture_progress=fill, custom_minimum_size=size) ; Three/Unity: frame behind, fill cropped horizontally to the health percent. Generation has model variance — if the trough is not found, retry with a clearer theme.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"theme":{"type":"string","minLength":3,"maxLength":300,"description":"Visual theme of the frame (genre, materials, ornaments)"},"colors":{"description":"Fill gradient [light, mid, dark] hex — default blood red","minItems":3,"maxItems":3,"type":"array","items":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"}},"name":{"description":"Slug for the saved Library items","type":"string","maxLength":60}},"required":["theme"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_hud_import","description":"Not the survivor generator (that is gripforge_hud): this one READS an existing HUD. action=import {text, filename?, name?} → reads the HUD of the project and saves it as a HUD document of the workspace;  Pass screenshot (a capture of the screen while the game runs) so My HUDs shows the real thing; action shot attaches one to a HUD imported earlier.returns the studio URL to open it. `text` is the engine file as-is: a Godot .tscn scene, a Unity .uxml (UI Toolkit) or a .unity / .prefab (RectTransforms), the Unreal UMG designer clipboard (select the widgets, Ctrl+C — .uasset files are binary), or a GripForge hud.json / hud.v2.json. Read the file yourself and pass its content; `filename` helps detect the format. Controls are recognised by name (health, mana, minimap, ammo, quest…) and type, placed on nine anchors; the report lists what was created and skipped. action=list → HUDs of the workspace. action=get {id} → one HUD document (hud_… id).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["import","list","get","shot"],"description":"import a screen · list the workspace HUDs · get one · shot = attach a capture of the screen in play to an existing HUD (id + screenshot)"},"text":{"description":"import: the engine file content","type":"string","maxLength":6291456},"filename":{"description":"import: original file name (hud.tscn, HUD.prefab, GameHud.uxml, umg.txt…)","type":"string","maxLength":200},"name":{"description":"import: name of the HUD in the studio","type":"string","maxLength":120},"project":{"description":"import: game project name (e.g. the .uproject / project folder) — the studio groups HUDs by project","type":"string","maxLength":80},"level":{"description":"import: the level / map where this screen shows (MainMenu, Desert_Castle…) — the studio groups a project's screens by level; the Unreal bridge /hud/list gives it from the asset registry (widget ← blueprints ← map), otherwise trace which map references the screen","type":"string","maxLength":80},"role":{"description":"import: \"screen\" (a menu, a loading screen, the in-game HUD, a page) or \"widget\" (a component: a bar, a minimap, a button, a damage number); the studio lists a level's screens first and its widgets apart. Inferred from the footprint when omitted: a screen spans ≥ 45 % of the width or ≥ 60 % of the height","type":"string","enum":["screen","widget"]},"textures":{"description":"import: texture name → lib_… id of that picture pushed with gripforge_library_push (kind hud); links the screen's images, buttons and bars to their real art","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"pictures":{"description":"import: texture name → base64 PNG/JPEG of that picture (≤ 6 MB each, 60 max): stored in the Library and linked to the screen's images, buttons and bars — one call gives the screen its real art","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"embeds":{"description":"import (Unreal): the nested Widget Blueprints this screen places (asset name → their T3D export, e.g. { WBP_Menu: \"Begin Object…\" }) so their buttons, bars and texts become elements of the screen instead of an empty box; the Unreal bridge /hud/get returns them as embeds","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"screenshot":{"description":"import / shot: base64 PNG or JPEG (≤ 16 MB, data URL accepted; stored packed to 1080p JPEG) of this screen captured while the game runs — becomes its thumbnail in My HUDs and the backdrop of the editor preview. Capture it in the engine: Unreal bridge GET http://127.0.0.1:8439/shot?play=1&level=/Game/Maps/MainMenu&wait=5 (opens that map, starts Play In Editor, captures with the UI, stops; without play=1 it captures the editor viewport), or an Unreal MCP capture_viewport during PIE; Godot get_viewport().get_texture().get_image().save_png(); Unity ScreenCapture.CaptureScreenshot","type":"string"},"id":{"description":"get / shot: the HUD (hud_…); import: re-import into that existing HUD — its name, level, role and capture stay, its elements are replaced","type":"string"}},"required":["action"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_input_kit","description":"Godot InputMap for an FPS: move_forward/back/left/right bound to WASD AND arrow keys, plus jump/crouch/fire/reload/buy. Write res://gripforge/input.json and autoload GfInput (snippet_godot). Player still uses Input.is_action_pressed(\"move_*\"). Optional third_person=true adds portable character-facing JavaScript and a Three.js adapter: movement-facing, independent camera, aim/fire/build facing. Orientation only, not a physics controller. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":240,"description":"e.g. \"fps\" or \"counter-strike dust2\""},"third_person":{"description":"Include character-facing JavaScript and Three.js usage (default false; existing input map unchanged).","type":"boolean"}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_inspect","description":"THE FEEDBACK LOOP: call this after every generate/attach/rig to SEE and VERIFY what you made, before building on top of it. Deterministic, free, repeatable. Returns (1) a structured report — kind guess, triangles/vertices, materials+textures, skeleton (bones, finger bones per hand, cape grid), animations, size in metres — and (2) QA checks with ok/warn/fail + why: plausible scale, poly budget, normals/UVs, rig skinned, strict T-pose arms, five-finger bones, feet on ground. Also returns a multi-angle render sheet (front/right/back/left by default) so you can look at the asset. Fix warns/fails (regenerate, rest_pose, retarget…) then inspect again.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Library id (lib_…) of a GLB"},"angles":{"description":"yaw angles in degrees (default [0,90,180,270])","maxItems":6,"type":"array","items":{"type":"number"}},"sheet":{"description":"include the multi-angle PNG (default true)","type":"boolean"}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_kit","description":"A game kit IS an engine: its manifest carries asset slots AND GameRules — the genre as a document (movement, camera, world, objective, entities, pickups, ai, hud, audio). action=list → kits of the workspace. action=get {id} → manifest + rules (lib_… id). action=create {style?, name?, rules?, slots?} → new kit, rules default to the style then merge yours. action=patch {id, rules?, slots?, prompts?, name?} → partial update; rules merge section by section, a section set to null resets it. Slot refs inside rules must point at slot ids of the kit (unknown refs are dropped, the renderer falls back to procedural). Compose a NEW genre by writing rules: e.g. movement vehicle-boost + world arena-ring + objective knockout = sumo cars, no code.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["list","get","create","patch"],"description":"what to do"},"id":{"description":"kit id (lib_…) — get/patch","type":"string","maxLength":80},"style":{"description":"create: preset style (arena-car, mario-kart, custom…)","type":"string","maxLength":64},"name":{"type":"string","maxLength":160},"rules":{"description":"GameRules document or partial patch","anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"slots":{"description":"slot assignments","type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":40},"itemId":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}]}},"required":["id","itemId"]}},"prompts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","maxLength":4000}}},"required":["action"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_level","description":"Plan a playable level from a prompt (0 credits): rooms placed in metres (entrance, combat rooms, key/lock, boss room, treasure, secret), connections, critical path, shortcuts, and gameplay spawns (player/packs/boss/rewards). Same seed → same level. Pair with gripforge_scene_kit for dressing props.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","description":"e.g. \"gothic castle dungeon, 3 combat rooms, one boss\""},"seed":{"type":"number"},"combat_rooms":{"type":"number"},"floors":{"type":"number"},"optional_branches":{"type":"number"}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_library_get","description":"Get one Library item (metadata + signed file_url). VFX items also return studio_url to open the editable effect in GripForge, and workspace_id. Pull bytes into a repo with the npm package.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Library id (lib_…)"}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_library_list","description":"List items in the GripForge Library locker (characters, enemies, weapons, props, textures, HUD, binds, vfx). Filter by kind and/or game style id (devil-may-cry, genshin…). Same origin as Studio — not a marketplace.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"kind":{"description":"Filter by kind","type":"string","enum":["character","fps-arms","enemy","weapon","equipment","prop","texture","skybox","loading","hud","button","bind","vfx","animation","audio"]},"q":{"description":"Search name/filename/description/tags","type":"string"},"style":{"description":"Game look id or alias (devil-may-cry, dmc, genshin)","type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_library_pull","description":"Return a signed same-origin file URL for a Library item you own (free). This hosted endpoint cannot write into your agent's working tree — use npx @gripforgeai/mcp gripforge_library_pull for that (that is the sync). First clone of a community asset into your locker costs 1 credit.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Library id (lib_…)"}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_library_push","description":"Upload a file into the Library locker from a URL (or small base64). Local paths need the npm MCP package.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"kind":{"type":"string","enum":["character","fps-arms","enemy","weapon","equipment","prop","texture","skybox","loading","hud","button","bind","vfx","animation","audio"],"description":"Locker kind"},"name":{"type":"string","description":"Display name"},"file_url":{"description":"https URL of the file to store","type":"string"},"filename":{"description":"Original filename","type":"string"},"base64":{"description":"Raw file as base64 (small files only)","type":"string"}},"required":["kind","name"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_library_tag","description":"Add a game look (devil-may-cry, genshin…) to tags so gripforge_style_kit can find the item. Does NOT overwrite grip style melee/gun/shield/staff — that stays on meta.style.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Library id (lib_…)"},"style":{"description":"Game look id or alias (devil-may-cry, dmc, genshin)","type":"string"},"tags":{"description":"Replace tags (canonicalized). Omit to keep existing and just add style.","type":"array","items":{"type":"string"}}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_light_kit","description":"Moon / sun / candle point lights + fog + environment intensity for a game look, plus a Three.js snippet. 0 credits. Does not generate meshes. Pair with scene_kit placements (candle tags match candelabra xyz).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":240,"description":"e.g. \"devil may cry like\""}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_loading_page","description":"Loading overlay for a game look. Returns html/css/js (Three/web) plus engines.three | godot | unity | unreal. Title is text — do not rasterize. Overlay alone is 0 credits. Pass character_id (lib_… character/enemy/bind) to generate a cinematic 16:9 background still of that character (1 credit). No letters in the still.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":240,"description":"e.g. \"devil may cry like\""},"character_id":{"description":"Library character / enemy / loadout bind id — generates background still (1 credit)","type":"string"}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_loadout","description":"Build a multi-weapon character in ONE call: attaches every prop of every set onto the same rig, names each prop node gf_prop_<slug>_<l|r>, stamps glTF extras { gripforge: { prop, set, hand } } and a scene manifest { default, sets }, then retargets the standard clip pack (animate: false to skip). The engine switches weapons by toggling node visibility — the returned Three.js snippet does it. Example sets: { \"sword\": [{\"prop_id\":\"lib_sword\"}], \"guns\": [{\"prop_id\":\"lib_gun\",\"hand\":\"left\",\"style\":\"gun\"}, {\"prop_id\":\"lib_gun\",\"hand\":\"right\",\"style\":\"gun\"}] }. Credits: one attach per prop.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"character_id":{"type":"string","description":"Library character id (lib_…)"},"sets":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"array","items":{"type":"object","properties":{"prop_id":{"type":"string"},"hand":{"type":"string","enum":["left","right"]},"style":{"type":"string","enum":["melee","gun","shield","staff"]}},"required":["prop_id"]}},"description":"set name → props held in that set"},"default":{"description":"Set visible by default (first set otherwise)","type":"string"},"archetype":{"description":"Movement/strike archetype — remaps the base slots (default sword)","type":"string","enum":["sword","claws","heavy","brawler","puppet"]},"name":{"type":"string"},"animate":{"description":"Also retarget the standard clip pack (default true)","type":"boolean"}},"required":["character_id","sets"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_make_seamless","description":"Turn an image into a seamless (tileable) texture: 50% wrap offset, then the seams are cross-faded in a narrow band — the pattern is PRESERVED, nothing is generated or invented. Pass image_url (https) or texture_id (Library id, lib_…). Optional size forces a power of two (512/1024/2048), resampled before the seam fix. The result is saved in your Library as a texture and its download URL is returned. No credit consumed.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"image_url":{"description":"https URL of the image (PNG/JPG)","type":"string"},"texture_id":{"description":"Library id of a texture (lib_…)","type":"string"},"size":{"description":"Force a power-of-two side: 512, 1024, 2048…","type":"number"},"band":{"description":"Blend band as a fraction of the side (default 0.08)","type":"number","minimum":0.02,"maximum":0.25},"name":{"description":"Name for the Library item (default <source>_seamless)","type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_map_concept","description":"gpt-image-2 draws a top-down plan schematic (solid white walls on pure black) + a 3/4 aerial greybox concept render, auto-traces the plan into MapPlan wall boxes and saves both images to the Library. Reuse the traced plan with gripforge_map_plan { item } or https://gripforge.ai/map-plan?item=lib_…&greybox=1. Use when the layout should come from an image instead of the code presets. ~2 images of generation cost.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":400,"description":"e.g. \"moroccan desert village bomb map, tight alleys, two plazas\""},"extent_m":{"description":"Playfield size in metres (default 110)","type":"number","minimum":40,"maximum":300},"threshold":{"description":"Wall luminance threshold (default 110)","type":"number","minimum":30,"maximum":240}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_map_generate","description":"Queue persistent map generation into the common Scene Engine. wizard: style realistic|stylized|lowpoly|handpainted; world open_world|closed_arena|dungeon|linear|battle_map; terrain plains|desert_canyon|forest|snow|island|volcanic; size small|medium|large; boundary fixed|infinite (open edge, finite terrain); spawn single|teams; teams 2|4. Result contains independent terrain, regions, paths, spawn zones and asset instances. Work is not automatically validated. Poll generation_read.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":4000},"wizard":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"seed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"idempotency_key":{"type":"string","minLength":8,"maxLength":160},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["prompt","wizard"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_map_import","description":"Queue a one-time materialization of an owned legacy terrain map into the shared Scene Engine. Preserve the saved spec, seed, resolution, family replacements, placed assets and removed props. Completed jobs return a canonical Studio link; source edits during migration cause a conflict rather than data loss.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_map_look","description":"Reproduce a Dust II still WITHOUT copying pixels. Returns camera (pos/target/fov) + volume/prop/wire ids for that shot. shot=shot21a (A site), shot1a (T yard), shot5a (cat). Official URL is a LINK only — never rehost, never Meshy image-to-3d. Pair with gripforge_map_plan + map_props + map_wires. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":240,"description":"e.g. \"dust2\""},"shot":{"description":"shot21a | a-site | shot1a | catwalk | URL fragment","type":"string","minLength":2,"maxLength":80}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_map_plan","description":"FPS/bomb map in metres. Interprets the overhead as a 3D compound: hollow rooms, corniche/catwalk, A plat + pit, arches/windows, vaulted tunnels, T/CT, sidewalks. Preview: https://gripforge.ai/map-plan?prompt=dust2. Pair gripforge_map_props (crates/cars) + gripforge_map_wires (cables). 0 credits. Not a dungeon — use gripforge_level.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":240,"description":"e.g. \"counter-strike dust2 bomb defusal\""},"item":{"description":"lib_… traced plan from gripforge_map_concept (overrides the preset)","type":"string"},"windows":{"description":"Boundary windows: volets entrouverts (default), grilles bois, ou aucune","type":"string","enum":["shuttered","barred","none"]},"window_density":{"description":"Share of boundary segments that get a window (default 0.25)","type":"number","minimum":0,"maximum":1}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_map_props","description":"Dressing for an FPS map in metres: crates (xbox, A default, goose, B big box), doors (mid, long, B), palms at T spawn, barrels, cars. Matches locker props when tagged. Empty slot → generate that prop. Pair with gripforge_map_plan. 0 credits. Preview https://gripforge.ai/map-plan?prompt=dust2","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":240,"description":"e.g. \"counter-strike dust2\""}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_map_reconstruct","description":"Reconstruct an FPS map: collect official stills (HTTPS LINKS, classified by folder) → MapGraph (callouts/chokes) → footprint greybox (no props) → zone parts → camera match → dress. prompt e.g. \"Reconstruct map: Counter-Strike 2 Dust II\". stage=collect|graph|greybox|zone|validate|capture|dress|all. zone=LONG_A|A_SITE|…. stage=dress keeps greybox volumes and adds original tileable materials + map_props + map_wires (never Valve pixels). Preview /map-plan?prompt=dust2. Dust II is Valve IP — internal greybox benchmark, not a commercial clone. Never Meshy a screenshot, never ingest BSP/VPK. 0 credits. Greybox preview https://gripforge.ai/map-plan?prompt=dust2&greybox=1","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":240,"description":"e.g. \"Reconstruct map: Counter-Strike 2 Dust II\""},"stage":{"description":"collect | graph | greybox | zone | validate | capture | dress | all (default all)","type":"string","enum":["collect","graph","greybox","zone","validate","capture","dress","all"]},"zone":{"description":"LONG_A | A_SITE | CATWALK | T_SPAWN | …","type":"string","minLength":2,"maxLength":40}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_map_refs","description":"Look up official in-game stills for a map (Dust II: A, B, mid, cat, tunnels, T yard). Returns HTTPS URLs (Valve CDN). Reference only — do not rehost, do not send to Meshy image-to-3d. Read materials then generate ORIGINAL locker props. live=true HEAD-checks links. 0 credits. Preview https://gripforge.ai/map-plan?prompt=dust2","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":240,"description":"e.g. \"dust2\""},"live":{"description":"HEAD-check URLs (default false)","type":"boolean"}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_map_wires","description":"Sagging electrical cables for an FPS map: spans with two anchors (metres) + sag + strands. Not a generated mesh — GfMap tessellates cylinders (role=wire). Dust II: T yard, cat (shot5a), mid, A. Pair with gripforge_map_plan. 0 credits. Preview https://gripforge.ai/map-plan?prompt=dust2","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":240,"description":"e.g. \"counter-strike dust2\""}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_match_create","description":"Records match.started. Does not spawn a new process. Mutating.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"map":{"type":"string","maxLength":120},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_match_get","description":"Read one match record.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"match_id":{"type":"string","minLength":4,"maxLength":80,"description":"Match id (mtc_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id","match_id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_match_kit","description":"Party size, teams, maps, ranked flag, join-by-IP. Write res://gripforge/match.json and autoload GfMatch on top of GfNet. GripForge does not host a matchmaking queue. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":240,"description":"e.g. counter-strike, deathmatch, ranked 5v5"}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_match_list","description":"Matches recorded for a server (SDK or API).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_match_stop","description":"Marks the match ended. Mutating.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"match_id":{"type":"string","minLength":4,"maxLength":80,"description":"Match id (mtc_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id","match_id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_menu_kit","description":"Main menu (host/join/quit), lobby listing connected peers where only the host starts, in-game HUD reading replicated state. Pairs with gripforge_net_kit. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":240,"description":"e.g. counter-strike, minimal"}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_navmesh","description":"Walkable XZ AABB + circular holes (pillars) for a scene_kit room. JSON the engine clamps against — not a baked .navmesh. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":240,"description":"e.g. \"devil may cry like\""}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_net_kit","description":"GfNet autoload host/join/spawn with server-side hit validation, gf_round.gd for the round + bomb, MultiplayerSpawner/Synchronizer wiring. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":240,"description":"e.g. counter-strike, deathmatch, fps"}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_performance","description":"Analyze a supplied game performance report, or read the latest instrumented kit capture in your authenticated workspace. Separates frame pacing, measured CPU/GPU work, render counters and stale network snapshots; returns evidence, recommendations and explicit measurement limits. Captures expire after 10 minutes or server restart. Explicit reports are not stored. Does not edit, deploy or automatically fix a game. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"kit_id":{"description":"Optional kit/library id to select a recent capture; omitted selects latest in your workspace.","type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9_.:-]+$"},"report":{"description":"Optional measured report with 1–120 sample windows. Omit to read a recent workspace capture.","type":"object","properties":{"game":{"type":"string","maxLength":80},"version":{"type":"string","maxLength":80},"viewport":{"type":"object","properties":{"width":{"type":"integer","minimum":1,"maximum":32768},"height":{"type":"integer","minimum":1,"maximum":32768}},"required":["width","height"]},"samples":{"minItems":1,"maxItems":120,"type":"array","items":{"type":"object","properties":{"fps":{"type":"number","minimum":0,"maximum":1000},"frameMs":{"type":"number","minimum":0,"maximum":60000},"p95Ms":{"type":"number","minimum":0,"maximum":60000},"pixelRatio":{"type":"number","minimum":0.01,"maximum":8},"quality":{"type":"string","enum":["auto","high","performance"]},"level":{"type":"integer","minimum":0,"maximum":10},"cpuMs":{"type":"number","minimum":0,"maximum":60000},"submitMs":{"type":"number","minimum":0,"maximum":60000},"gpuMs":{"anyOf":[{"type":"number","minimum":0,"maximum":60000},{"type":"null"}]},"drawCalls":{"type":"integer","minimum":0,"maximum":1000000},"triangles":{"type":"integer","minimum":0,"maximum":1000000000},"networkMs":{"anyOf":[{"type":"number","minimum":0,"maximum":60000},{"type":"null"}]},"snapshotAgeMs":{"type":"number","minimum":0,"maximum":60000}}}}},"required":["samples"]}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_player_ban","description":"HIGH IMPACT. Requires the Unity SDK. Currently returns 501. Owner only.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"player_id":{"type":"string","minLength":4,"maxLength":80,"description":"Player session id (ses_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id","player_id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_player_get","description":"Read one player session on a server.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"player_id":{"type":"string","minLength":4,"maxLength":80,"description":"Player session id (ses_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id","player_id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_player_kick","description":"Requires the Unity SDK. Currently returns 501. Mutating.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"player_id":{"type":"string","minLength":4,"maxLength":80,"description":"Player session id (ses_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id","player_id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_players_list","description":"Sessions reported by the Unity SDK. Empty until the SDK calls player.joined.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_project_get","description":"Read a dedicated-server project (gpj_…) in the authenticated workspace. Not a Library asset.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game project id (gpj_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_render","description":"Server-side software preview (PNG) of a Library GLB so the agent can see pose/attach without a browser. Not a path-traced studio shot.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Library id (lib_…)"},"width":{"type":"number"},"height":{"type":"number"}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_rest_pose","description":"Lower the character's arms from T-pose until they would clip THIS mesh (cape/chest/hips), then save an arms-down rest GLB (clip \"idle\"). Armed binds keep attached weapons in the hands. 0 credits. Attach first, then rest_pose on the bind id.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"character_id":{"type":"string","description":"Library character, enemy, or armed bind"},"name":{"type":"string"}},"required":["character_id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_retarget","description":"Convert animation clips from skeleton A (source_id GLB) onto skeleton B (target_id). Bone-name heuristic (Mixamo / UAL / Tripo). Saves kind=animation.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"source_id":{"type":"string","description":"Library GLB that already has clips"},"target_id":{"type":"string","description":"Library character/enemy to drive"},"clip":{"description":"Clip name on the source (default: first clip)","type":"string"},"name":{"type":"string"}},"required":["source_id","target_id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_scene_asset_pin","description":"Archive the owned Library resource bytes and metadata for use in scenes. Returns assetId/revisionId, capabilities, material/animation names and sockets. Repeating for identical content reuses the archive; it consumes workspace storage only once. Prefers the validated version for insertion; choose version=work to test the draft. Does not approve the asset visually.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"assetId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"version":{"default":"current","type":"string","enum":["current","work"]},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["assetId"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_scene_asset_promote","description":"Promote only when the exact work revision has a matching trusted review for the current renderer. Existing scene instances keep their pinned revision.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"assetId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"revisionId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"expectedCurrent":{"anyOf":[{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},{"type":"null"}]},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["assetId","revisionId","expectedCurrent"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_scene_asset_review","description":"Create a shared test scene and queue an independent review of real GripForge captures. Supports meshes, textures and effects. Never promotes automatically.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"assetId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"revisionId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"idempotency_key":{"type":"string","minLength":8,"maxLength":160},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["assetId","revisionId"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_scene_asset_versions","description":"Read immutable asset work/current pointers and the trusted review of work. Does not create a version.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"assetId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["assetId"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_scene_create","description":"Create a draft scene. Pin Library assets first and use returned assetId/revisionId references. The response contains a GripForge Studio link. Exporting a VFX definition must not include this test scene.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"document":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["document"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_scene_kit","description":"Return locker props for a game look plus a suggested layout (metres, Y-up). Call after style_kit. Empty slots mean generate that dressing prop, tag it, retry. Does not generate meshes.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":240,"description":"e.g. \"devil may cry like\", \"genshin plaza\""}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_scene_list","description":"List scenes, work/validated revision pointers and links in the authenticated workspace.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_scene_modify","description":"Queue a scoped edit of saved scene nodes or a region. The server derives the allowed scope and preserves locks, gameplay zones, outside geometry and the last validated revision. Blender may fabricate missing assets. The result is a proposal requiring explicit application, never a silently replaced map.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"expectedRevision":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"nodeIds":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"}},"prompt":{"type":"string","minLength":3,"maxLength":4000},"blendDistance":{"type":"number","exclusiveMinimum":0,"maximum":1000},"idempotency_key":{"type":"string","minLength":8,"maxLength":160},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["id","expectedRevision","nodeIds","prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_scene_patch","description":"Apply insert/remove/transform/replace/update commands atomically. Environment updates can configure shared 3D cloud layers (density, altitude, wind, colour and quality); see gripforge_scene_schema. Replace preserves id, transform, role, materials and attachments, and rejects incompatible named slots. Locked objects cannot be changed. Scope constrains regional edits; read the schema first.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"baseRevision":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"commands":{"minItems":1,"maxItems":20000,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"scope":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["id","baseRevision","commands"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_scene_promote","description":"Explicitly promote the latest work revision only if its trusted visual review matches the exact content, dependencies and current renderer. expectedCurrent must match the existing validated pointer or null. No client-supplied approval report is accepted.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"revision":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"expectedCurrent":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["id","revision","expectedCurrent"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_scene_proposal_apply","description":"Explicitly accept or discard a proposal after inspecting it. Accept requires expectedRevision to match the exact base and current work revision. Atomic: concurrent changes or discard abort the save. Creates work, never promotes validated.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"proposal":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"action":{"type":"string","enum":["accept","discard"]},"expectedRevision":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["id","proposal","action"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_scene_proposal_read","description":"Read the original scene, proposed document and scoped commands. Use the Studio link to inspect actual rendering before applying.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"proposal":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["id","proposal"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_scene_proposals","description":"List persistent proposals and their base revision, status and descriptions.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_scene_read","description":"Read the editable SceneDocument at work, validated, or a numbered revision. Keep work_revision for optimistic writes. Validated can be absent.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"version":{"anyOf":[{"type":"string","enum":["work","validated"]},{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}]},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_scene_review","description":"Queue a persistent render and independent visual review of the exact saved work revision. Poll generation_read. This does not promote or replace the validated version.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"expectedRevision":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"prompt":{"type":"string","maxLength":4000},"idempotency_key":{"type":"string","minLength":8,"maxLength":160},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["id","expectedRevision"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_scene_schema","description":"Start here. Read the shared scene model, kinds, commands, limits and an editable example. Assets are immutable revisions; placed objects are independent instances. Scene saves create work revisions, never automatic visual approval.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_scene_versions","description":"Read work/current pointers, immutable revision history and trusted visual review evidence. A rejected or unavailable review does not change the validated version.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_scene_write","description":"Save a complete SceneDocument. expectedRevision must equal the latest work revision. A 409 is a real conflict: reread before changing it. Does not change the validated revision or source Library assets.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,159}$"},"document":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"expectedRevision":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"workspace_id":{"description":"Workspace authorized by the current key. Returned scene links open this workspace.","type":"string","maxLength":100}},"required":["id","document","expectedRevision"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_server_create","description":"Create a dedicated server record. Implemented: Unity+FishNet (Docker demo) and Godot+ENet (real Godot Linux headless in Docker). Unreal returns unsupported. Does not start the process until deploy.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"engine":{"type":"string","enum":["unity","unreal","godot","custom"]},"networking":{"type":"string","enum":["fishnet","ngo","mirror","photon","enet","custom","unknown"]},"environment":{"type":"string","enum":["production","staging","development"]},"region":{"type":"string","maxLength":40},"maxPlayers":{"type":"integer","minimum":1,"maximum":200},"gamePort":{"type":"integer","minimum":1,"maximum":65535},"sourceKind":{"type":"string","enum":["project","git","upload","docker"]},"image":{"type":"string","maxLength":200},"hints":{"type":"string","maxLength":2000},"demo":{"type":"boolean"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["name"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_server_delete","description":"HIGH IMPACT. Stops the instance and deletes the server. Requires confirm=true. Owner only.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"confirm":{"type":"boolean","const":true,"description":"Must be true. Production-destructive."},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id","confirm"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_server_deploy","description":"Create a Docker instance for this server and start it. Local demo uses a real container (python heartbeat unless a custom image is set). Mutating.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_server_events","description":"Activity feed: server.created, server.ready, player.joined, match.started, …","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_server_get","description":"Read one dedicated server, its instance, engine/networking detection and integration status.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_server_list","description":"List dedicated game servers in the workspace with current status and latest instance.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_server_logs","description":"Stdout/stderr from the runtime provider (Docker logs). Not stored in SQL.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"tail":{"type":"integer","minimum":20,"maximum":2000},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_server_metrics","description":"CPU, memory, network counters and player count from the metrics provider.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_server_restart","description":"Restart the running instance. Mutating.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_server_scale","description":"Update desired max players. Does not resize cloud hardware (Docker provider has no node pool). Mutating.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"maxPlayers":{"type":"integer","minimum":1,"maximum":200},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id","maxPlayers"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_server_start","description":"Start the existing instance. Mutating.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_server_stop","description":"Stop the running instance. Mutating.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_settings","description":"The workspace IS the game: genre (cs, mario-kart, arena-car, dmc…), remappable controls (same InputKit as the Godot input.json AND the web players), match rules (rounds/laps/score/timers/ports) and menu options (title, HUD toggles). Once set, every *-kit route called WITHOUT ?prompt= reads them (explicit prompt always wins), and the web players use the same bindings. Call with no args to READ (settings + resolved defaults). Pass fields to MERGE-SET. Pass a section as null to reset it to the genre preset. Set genre at project start, right after gripforge_style.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"genre":{"description":"game kit style id (cs, mario-kart, arena-car…) — null resets","anyOf":[{"type":"string","maxLength":64},{"type":"null"}]},"controls":{"description":"full InputKit actions (InputBind[]) — null resets to genre preset","anyOf":[{"type":"object","properties":{"kit_id":{"type":"string","maxLength":32},"actions":{"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}},"required":["actions"]},{"type":"null"}]},"match":{"description":"partial match rules — null resets","anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"menu":{"description":"{title, preset, hud:{…}} — null resets","anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_shader_pull","description":"Pull a catalog shader (id or alias like slash_reveal) for godot | unity | three. Returns file contents + assignment snippet (Godot ShaderMaterial / Unity Material / Three ShaderMaterial). This hosted endpoint cannot write into the working tree — use npx @gripforgeai/mcp gripforge_shader_pull with out_dir for that. v1 pull is free (no credit).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Shader id or alias (slash_reveal, …)"},"engine":{"type":"string","enum":["godot","unity","three"],"description":"Target engine"},"out_dir":{"description":"Suggested folder (hosted returns contents only; npm writes)","type":"string"}},"required":["id","engine"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_shaders","description":"List shaders from the GripForge catalog (authorized GodotShaders.com mirror). Returns { id, name, engines }. Search q=slash_reveal. Then pull with gripforge_shader_pull. Free.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"q":{"description":"Search id/name/alias (e.g. slash_reveal)","type":"string"},"type":{"description":"Godot shader_type","type":"string","enum":["canvas_item","spatial","sky","particles","fog"]},"limit":{"description":"Page size (default 50, max 200)","type":"number"},"offset":{"description":"Offset","type":"number"}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_style","description":"The visual identity of the workspace: palette (hex colors), written art direction, and sliders (realism/saturation/edges). Once set, it is AUTOMATICALLY appended to every generation prompt (characters, enemies, props, HUD bars…) so ten assets come out as ONE game — and gripforge_inspect gains a style check flagging assets whose dominant colors drift from the palette. Call with no args to READ the current DNA (+ the compiled prompt block). Pass fields to SET it. Pass extract_from (image lib ids) to auto-build the palette from reference art. clear:true removes it. Set the DNA at the START of a game project, before generating.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"palette":{"description":"2-6 colors, e.g. [{hex:\"#8b1a1a\",name:\"blood red\"}]","maxItems":6,"type":"array","items":{"type":"object","properties":{"hex":{"type":"string"},"name":{"type":"string"}},"required":["hex"]}},"direction":{"description":"art direction, e.g. \"DMC gothic, worn leather, tarnished metal\"","type":"string","maxLength":500},"realism":{"type":"string","enum":["stylized","semi","realistic"]},"saturation":{"type":"string","enum":["muted","balanced","vivid"]},"edges":{"type":"string","enum":["soft","hard"]},"refs":{"description":"pinned reference lib ids","maxItems":5,"type":"array","items":{"type":"string"}},"extract_from":{"description":"image lib ids — extract the palette from them","maxItems":5,"type":"array","items":{"type":"string"}},"clear":{"description":"remove the workspace style","type":"boolean"}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_style_kit","description":"Resolve a prompt like \"Devil May Cry like\" / \"genshin\" to a game-style id, then return the locker kit already tagged with that look: characters, enemies, weapons, props. Call this BEFORE generating when the user wants that game. Reuse the returned Library ids (attach / pull). Only generate if a bucket is empty.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":240,"description":"e.g. \"devil may cry like\", \"un ennemi genshin\", \"elden ring\""}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_texture_prep","description":"Prep a game texture (terrain / props): optional 50% wrap + seam blend, then a faithful lanczos upscale (1× / 2× / 4×, capped at 1024 or 2048). The pattern is PRESERVED — nothing is generated (not Magnific, not an image model). Pass texture_id (Library) or image_url (https). Result is saved as kind=texture and the albedo URL is returned. To write the PNG into an open repo, use the npm package with out_dir. No credit consumed.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"image_url":{"description":"https URL of the image (PNG/JPG/WebP)","type":"string"},"texture_id":{"description":"Library id of a texture (lib_…)","type":"string"},"seamless":{"description":"50% offset + seam blend (default true)","type":"boolean"},"scale":{"description":"Upscale factor (default 1)","anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":4}]},"size":{"description":"Max output side (default 1024)","anyOf":[{"type":"number","const":1024},{"type":"number","const":2048}]},"name":{"description":"Library name (default <source>_tile)","type":"string"},"save":{"description":"Save to Library (default true on hosted MCP)","type":"boolean"}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_vehicle_orient","description":"Yaw so a kart/vehicle GLB nose is local +Z (Meshy often faces +X). Then heading = yawToward(track tangent) = atan2(fx, fz). Pass Library id of the kart prop. Returns meshYaw + Three.js / Godot snippets. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"Library id of the vehicle/kart GLB (lib_…)","type":"string"},"prop_id":{"description":"Same as id","type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_vfx","description":"ADMIN ONLY. Generate + export a 3D slash/thrust/spin VFX parented to an existing attach bind, or a world-space fire meteor (head + ribbon trail + impact). Pass prompt to fill type/style/color/emitters. Returns studio_url (open this link to edit the saved effect in GripForge), workspace_id, GLB, PNG and vfx.json. Refused for non-admin API keys.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","maxLength":80},"emitters":{"description":"Emitters returned by gripforge_vfx_generate.","maxItems":6,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"generation":{"description":"Generation provenance returned by gripforge_vfx_generate.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"attach_id":{"description":"Library bind id (lib_…). Not required for meteor.","type":"string"},"prompt":{"description":"Natural-language VFX prompt. Fills type/style/color/emitters when omitted.","type":"string"},"type":{"description":"Strike type (default slash). portal = standing blood rift / demonic seal (world-space, loops); slam = ground-impact eruption: light pillar + fireball + sparks/debris (world-space, one-shot)","type":"string","enum":["slash","thrust","spin","meteor","beam","swing","claw","charge","shield","portal","slam"]},"style":{"description":"Look (default energy)","type":"string","enum":["energy","metal","magic"]},"look":{"description":"toon: stylized ribbon/lightning; solid: filled beam; crystal: faceted weapon trail; flame: burning crescent; pulse: released electric orb; firejet: flared fire stream with torn tongues and pressure rings; impact: slam-family comic explosion with red telegraph, violet core, ink debris and optional impact frames","type":"string","enum":["toon","solid","crystal","flame","pulse","firejet","impact"]},"color":{"description":"Hex color","type":"string"},"duration":{"description":"Seconds (default 0.25)","type":"number"},"width":{"description":"Ribbon width in metres","type":"number"},"core":{"description":"portal only: shadow-core radius as a fraction of the portal (default 0.09)","type":"number","minimum":0.02,"maximum":0.4}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_vfx_generate","description":"ADMIN ONLY. Text-to-VFX or image-to-VFX: interpret a prompt or reference into an editable animated effect specification. No Library save or credit charge. Pass the resulting type, style, look, color, duration, width, name, emitters and generation to gripforge_vfx to save/export (1 credit). Image mode requires a configured vision provider.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"preset":{"description":"Load a ready-to-play preset instantly, without AI. Supply this field alone.","type":"string","enum":["slash-trail","slash-emerald","slash-steel","slash-fire","slash-ice","slash-nature","arc-pulse","fire-breath","neon-impact"]},"prompt":{"description":"Effect description; optional with an image.","type":"string","maxLength":500},"visual_style":{"type":"string","enum":["realistic","stylized","anime","lowpoly"]},"image_data":{"description":"PNG/JPEG/WebP base64 data URI, up to 8 MB decoded.","type":"string","maxLength":12582912},"image_id":{"description":"Owned Library image id; use instead of image_data.","type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_vfx_preview","description":"ADMIN ONLY. Play/scrub pose of a strike VFX at time t (seconds). t=0 is empty. No credits. Arc reveal / trail length / burst particles. Refused for non-admin keys.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"bind":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Attach bind.json object"},"t":{"description":"Seconds on the timeline (default 0)","type":"number"},"type":{"type":"string","enum":["slash","thrust","spin","meteor","beam","swing","claw","charge","shield"]},"style":{"type":"string","enum":["energy","metal","magic"]},"duration":{"type":"number"}},"required":["bind"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_vfx_project_generate","description":"ADMIN ONLY. Text/image -> durable generation job -> original geometry/shaders -> actual GripForge rendering -> visual critique/correction -> workspace work revision. Returns immediately with job_id, status_url and studio_url. Poll gripforge_generation_read, then open its source_url to inspect the saved source and review. Closing the request does not cancel the job. Completed steps survive worker restart. Pass id + expected_revision to refine; image_id must belong to this workspace. A visually rejected candidate never replaces the validated version.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"idempotency_key":{"type":"string","minLength":8,"maxLength":160},"prompt":{"type":"string","maxLength":2000},"visual_style":{"type":"string","enum":["realistic","stylized","anime","lowpoly"]},"image_mode":{"description":"Default spatial: build a 3D effect. animated-artwork explicitly opts into a flat animated illustration.","type":"string","enum":["spatial","animated-artwork"]},"image_id":{"type":"string","pattern":"^lib_[A-Za-z0-9_-]+$"},"image_data":{"type":"string","maxLength":12582912},"id":{"type":"string","pattern":"^lib_[A-Za-z0-9_-]+$"},"expected_revision":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"workspace_id":{"description":"Explicit workspace id. The key must have access to this workspace; never infer another user’s workspace.","type":"string","maxLength":100}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_vfx_project_promote","description":"ADMIN ONLY. Explicitly promote work after a trusted positive review matching this source, dependencies and renderer. expectedCurrent is the existing validated revision, or null.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^lib_[A-Za-z0-9_-]+$"},"revision":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"expectedCurrent":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"workspace_id":{"description":"Explicit workspace id. The key must have access to this workspace; never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id","revision","expectedCurrent"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_vfx_project_read","description":"ADMIN ONLY. Read a project in the authenticated workspace. Returns project.json, per-layer .vert/.frag source, current revision, recent revision history and a Studio link. Read an older revision to restore it through write with the CURRENT expected_revision. Does not grant access to the server repository or arbitrary user files.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^lib_[A-Za-z0-9_-]+$"},"revision":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"workspace_id":{"description":"Explicit workspace id. The key must have access to this workspace; never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_vfx_project_render","description":"ADMIN ONLY. Queue a durable render of an owned id OR an unsaved project at 1–4 timestamps. Returns job_id immediately. Poll gripforge_generation_read with include_preview for the actual rendered image, coverage, clipping and shader diagnostics. Uses the shared GripForge SceneViewport. Saves preview evidence only, no project revision. Requires workspace write access because the job and preview consume storage. Render timings are not browser FPS.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"idempotency_key":{"type":"string","minLength":8,"maxLength":160},"id":{"type":"string","pattern":"^lib_[A-Za-z0-9_-]+$"},"project":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Complete editable project JSON. Read gripforge_vfx_project_schema for the format and a working example."},"times":{"description":"Render timestamps in seconds. Defaults to anticipation, middle and decay samples.","minItems":1,"maxItems":4,"type":"array","items":{"type":"number","minimum":0,"maximum":12}},"workspace_id":{"description":"Explicit workspace id. The key must have access to this workspace; never infer another user’s workspace.","type":"string","maxLength":100}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_vfx_project_review","description":"ADMIN ONLY. Queue a fresh GripForge capture and independent visual review without writing another source revision. Poll gripforge_generation_read; inspect its preview, then explicitly promote if approved.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^lib_[A-Za-z0-9_-]+$"},"expected_revision":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idempotency_key":{"type":"string","minLength":8,"maxLength":160},"workspace_id":{"description":"Explicit workspace id. The key must have access to this workspace; never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id","expected_revision"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_vfx_project_schema","description":"ADMIN ONLY. Start here to create original VFX beyond presets. Returns the editable source format, shader helpers, geometry budgets and a working example. Workflow: write custom source -> render -> inspect the returned image -> revise -> save. Blender or another modeling tool may supply custom mesh vertices/UVs/indices; no Blender instance is required for procedural effects.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"workspace_id":{"description":"Explicit workspace id. The key must have access to this workspace; never infer another user’s workspace.","type":"string","maxLength":100}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_vfx_project_write","description":"ADMIN ONLY. Create with project, or update id with project OR edits:[{path,content}]. Updates require expected_revision. Returns HTTP 202 job_id and studio_url immediately. Poll gripforge_generation_read; the worker compiles, renders and saves a work revision, then reviews it visually. Completed result includes source_url, preview_url and review. Use generation_read with include_preview to see the actual image. A source conflict fails the job and preserves current work; reread before writing. Validated versions remain unchanged. Editable files are project.json and layers/{id}.vert/.frag.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"idempotency_key":{"type":"string","minLength":8,"maxLength":160},"id":{"type":"string","pattern":"^lib_[A-Za-z0-9_-]+$"},"expected_revision":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"project":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Complete editable project JSON. Read gripforge_vfx_project_schema for the format and a working example."},"edits":{"minItems":1,"maxItems":24,"type":"array","items":{"type":"object","properties":{"path":{"type":"string","maxLength":100},"content":{"type":"string","maxLength":400000}},"required":["path","content"]}},"times":{"description":"Render timestamps in seconds. Defaults to anticipation, middle and decay samples.","minItems":1,"maxItems":4,"type":"array","items":{"type":"number","minimum":0,"maximum":12}},"note":{"type":"string","maxLength":1000},"workspace_id":{"description":"Explicit workspace id. The key must have access to this workspace; never infer another user’s workspace.","type":"string","maxLength":100}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_viewmodel_kit","description":"CS-style first-person arms + gun under Camera3D/Hold. Returns viewmodel.json, gf_viewmodel.gd, clip shader. Pull Mixamo T-pose characters (palms down) into bodies paths. Gun is a sibling under Hold, not the world-body hand bone. Pair with gripforge_input_kit. 0 credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":240,"description":"e.g. \"fps\" or \"counter-strike dust2\""}},"required":["prompt"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_world_backup","description":"Not implemented. Returns 501. Mutating.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_world_deploy","description":"Not implemented. Returns 501.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_world_list","description":"Worlds stored for the workspace or a server’s project. Empty until worlds are implemented.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gripforge_world_restore","description":"HIGH IMPACT. Not implemented. Returns 501.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":4,"maxLength":80,"description":"Game server id (srv_…)"},"workspace_id":{"description":"Workspace authorized by the current key. Never infer another user’s workspace.","type":"string","maxLength":100}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}}],"scan":{"score":87,"grade":"A","scanned_at":"2026-09-20T11:35:47.281Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-20T11:35:47.227Z","components":{"code":{"score":25,"max":25,"notes":["7 source files scanned"]},"reliability":{"score":17,"max":20,"notes":["remote reachable in 2704ms"]},"poisoning":{"score":15,"max":15,"notes":["140 tool descriptions checked"]},"auth":{"score":8,"max":15,"notes":["API key sent as a header"]},"maintenance":{"score":15,"max":15,"notes":["last push 0 days ago"]},"identity":{"score":7,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[],"inputs":{"probes":[{"url":"https://gripforge.ai/mcp","reachable":true,"authRequired":false,"latencyMs":2704,"serverInfo":{"name":"gripforge","version":"0.1.8"}}],"packages":[{"registryType":"npm","identifier":"@gripforgeai/mcp","version":"0.1.10","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":2,"publishedAt":"2026-09-20T08:38:39.832Z","repositoryUrl":"git+https://github.com/gripforgeai/mcp.git","weeklyDownloads":176}],"repo":{"found":true,"owner":"gripforgeai","repo":"mcp","archived":false,"pushedAt":"2026-09-20T09:40:03Z","stars":1,"forks":0,"openIssues":0,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/313422070?v=4","ownerCreatedAt":"2026-08-05T12:47:54Z","license":"MIT"},"icon":{"url":"https://raw.githubusercontent.com/gripforgeai/mcp/main/icon.png","source":"registry","width":512,"height":512},"presence":{"stars":1,"forks":0,"downloadsWeek":176,"license":"MIT","lastPushAt":"2026-09-20T09:40:03.000Z","score":37}}}},"grade_history":[],"reviews":[]}