{"serverId":"mcp-registry/dev.polyfork/polyfork","tools":[{"name":"buy_plan","fixed":{"name":"buy_plan","description":"Buy a Polyfork plan: Pro (monthly or yearly) or a one-payment lifetime seat. This tool NEVER charges anything itself. It returns a Stripe Checkout link and the exact amount; the payment happens on that page (cards and Link), and only with the user's approval of the amount. Call it with no arguments to see what is on sale and at what price. Use it when a download needs a plan the user does not have and they say they want it, rather than sending them off to find the pricing page. It works with or ","inputSchema":{"type":"object","properties":{"plan":{"enum":["pro_month","pro_year","lifetime"],"type":"string","description":"what to buy; omit to list what is on sale, with prices"},"confirm":{"type":"string","description":"the checkout_id from an earlier call, WHOLE (starts with cs_, and may carry a second part after a dot): reports whether it has been paid and activates the plan if so"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":259,"tokensAfter":259},{"name":"find_matching","fixed":{"name":"find_matching","description":"Given one asset, return assets that BELONG IN A SCENE WITH IT: same kit first, then shared palette, then compatible real-world scale, spread across classes so you get a house, a tree and a barrel rather than eight houses. Use this to turn a single pick into a scene. Returns a ready preview URL.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"free":{"type":"boolean","description":"only free assets"},"limit":{"type":"integer","description":"default 8, max 30"},"max_triangles":{"type":"integer","description":"triangle budget ceiling; applies to the preview scene as well"},"min_triangles":{"type":"integer"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":193,"tokensAfter":193},{"name":"get_asset","fixed":{"name":"get_asset","description":"Full detail for one asset: real-world size in metres, triangle count, palette, animatable parts, renders you can open to SEE it, and the correct download URLs for the caller. A model with has_ik true also returns a measured `gait` or `arm` block: segment lengths, foot offsets, phase order, step length, reach. That is everything needed to make it walk or reach in any engine, and /cdn/walk.mjs already does it for three.js. If the asset is paid and this connection does not own it, the reply carries","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"asset id, e.g. windmill-3aad49"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":187,"tokensAfter":187},{"name":"get_help","fixed":{"name":"get_help","description":"How to use this server: what the metadata means, the rules that are easy to get wrong (real-world metres, one material, never rescale to fake a fit), and worked recipes for building a scene. Call it when a tool did not behave as you expected, or before a multi-step build, instead of guessing.","inputSchema":{"type":"object","properties":{"topic":{"enum":["overview","metadata","scenes","remixing","night","downloads"],"type":"string","description":"omit for the overview"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":142,"tokensAfter":142},{"name":"get_kit","fixed":{"name":"get_kit","description":"Every published part of one kit, with the same detail get_asset gives, so you can compose a whole scene from one call. Works on a kit that is still FILLING UP: you get the parts that exist today. NO kit is sold as a bundle, at any status, so recommend its parts rather than the kit — the free ones need no account and the rest come with Pro. A kit may also carry `look` and `terrain`. `look` is the shader it is presented under — the Coral Reef is composed, photographed and filmed through 2.5 m of w","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"kit id, from list_kits or an asset's `kit` field"},"compact":{"type":"boolean","description":"shortlisting rows instead of full detail. A 45-part kit at full detail is a large result; use this when you are surveying rather than building."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":244,"tokensAfter":244},{"name":"get_terrain","fixed":{"name":"get_terrain","description":"AT WHAT HEIGHT DO I PLACE THIS, and where can I build. Every kit ships a procedural TERRAIN program for its own ground, and the ground is no longer flat, so a y of 0 is wrong almost everywhere. Pass `at` with the x/z you want to place at and you get the ground height there; set position.y to it. `flat_areas` are the level building sites: square footprints whose ground barely varies, largest first, none overlapping, with the height to place at. Use it before laying out a town, a farm or a depot, ","inputSchema":{"type":"object","required":["id"],"properties":{"at":{"type":"string","description":"x,z;x,z;… — AT WHAT HEIGHT DO I PLACE THIS. Returns the ground height and slope under each point; set the object's position.y to the y you get back and it rests on the terrain. Use this for anything that is not going on one of the level sites. Up to 64 points."},"id":{"type":"string","description":"terrain asset id. Omit to list every kit that has one."},"span":{"type":"integer","description":"block size in 64m chunks, 1 to 4. Bigger blocks have more room and more sites."},"flats":{"type":"integer","description":"how many level sites to return (default 12, max 40)"},"erosion":{"type":"number","description":"0 to 1. Weathers the landforms: valleys smooth out, crests stay sharp. Changes where the level sites are, so ask with the same value you intend to build with."},"flatten":{"type":"number","description":"0 to 1. Clears a level area in the MIDDLE of the block for a settlement, leaving the landscape around it. Raise it when the natural sites are too small for what you are placing."},"profile":{"type":"string","description":"x0,z0,x1,z1[,steps] — the ground along a straight line, for a road, a wall or a bridge"},"scatter":{"type":"integer","description":"n placement points the terrain picks itself, already on the ground and already filtered to slopes gentle enough to stand on, each with a random yaw. For rocks, trees and dressing."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":555,"tokensAfter":555},{"name":"get_variant","fixed":{"name":"get_variant","description":"Turn a plain-words request (\"oak cask\", \"taller\", \"five sails\") into a ready call. `want` is matched against this asset's KNOB NAMES and OPTION VALUES, not against colour vocabulary: use the words from its -params.json into a ready createAsset() call for a remixable asset, plus a GLB URL of that exact variant. Check the returned confidence: on anything below high, tell the user what was actually applied instead of presenting it as exact.","inputSchema":{"type":"object","required":["id","want"],"properties":{"id":{"type":"string"},"look":{"type":"object","properties":{"smooth":{"enum":["soft","round","full"],"type":"string"},"palette":{"enum":["reduced","gameboy","pico8","cga","mono"],"type":"string"},"shading":{"enum":["toon","unlit"],"type":"string"}},"description":"Restyle the mesh, independently of any knob. Deliverable families: palette = reduced|gameboy|pico8|cga|mono; smooth = soft|round|full; shading = toon|unlit. Example {\"palette\":\"gameboy\",\"shading\":\"toon\"}. Underwater, Dither, Wobble, Outline, Wireframe and Pixelate exist in the store too but are SHADERS: no glTF can carry one, so they are not offered here. If the user wants those, send them to the asset page."},"want":{"type":"string","description":"the change in the user's own words"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":367,"tokensAfter":367},{"name":"list_kits","fixed":{"name":"list_kits","description":"Kits are coherent sets built to one palette and one grid. Reach for a kit when the user is building a whole environment rather than looking for one object. Each carries a status: \"published\" means every planned part is built, \"filling-up\" means parts are still landing — and the parts of a filling-up kit are usable TODAY. NO kit is sold as a bundle: price_usd is null and for_sale false on all of them, so never quote a kit price and never use those fields to tell the statuses apart. The parts come","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":164,"tokensAfter":164},{"name":"preview_scene","fixed":{"name":"preview_scene","description":"Compose assets into a scene and return a URL the user can OPEN and orbit. Use it instead of handing over a block of three.js the user cannot run. Works with paid assets too: they render from a public preview, so the scene looks finished whether or not the user owns them. The result says what the scene would cost and where to buy; pass that on rather than letting a 404 be the first sign of a price.","inputSchema":{"type":"object","required":["ids"],"properties":{"ids":{"type":"array","items":{"type":"string"},"description":"asset ids, in any order; up to 24"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":169,"tokensAfter":169},{"name":"search_assets","fixed":{"name":"search_assets","description":"Search the Polyfork catalogue of low-poly 3D assets for three.js. Use this whenever the user needs a model for a scene, game or site. Filter by triangle budget when the target is mobile or performance-sensitive. Results mix FREE and PRO assets: each carries `free` and `plan`. Paid assets are not sold individually — they come with Pro or the one-time Founders plan — so quote the plan, never a per-asset price. you should say which is which when recommending one, rather than letting the user discov","inputSchema":{"type":"object","properties":{"q":{"type":"string","description":"what to look for, e.g. \"windmill\" or \"sports car\""},"ik":{"enum":["1","legs","arm"],"type":"string","description":"only models that SOLVE rather than pose: \"legs\" walks with its feet finding your ground and staying planted, \"arm\" is a rooted boom whose tip you can aim, \"1\" is either. Use it when the user asks for something that walks, crawls, digs or lifts"},"kit":{"type":"string","description":"restrict to one kit id"},"free":{"type":"boolean","description":"only free assets"},"sort":{"enum":["latest","tris","price"],"type":"string"},"class":{"enum":["prop","building","vehicle","character","animal","ultra","attachment","terrain","hand"],"type":"string"},"limit":{"type":"integer","description":"default 20, max 50"},"compact":{"type":"boolean","description":"shortlisting rows only (id, title, class, triangles, size_m, capability flags). Use this whenever you are surveying rather than choosing — a full-detail result at limit 50 is large enough that some clients refuse it. get_asset has the rest."},"max_price_usd":{"type":"integer","description":"DEPRECATED, per-asset prices are retired. Use free=1 for free-only"},"max_triangles":{"type":"integer","description":"triangle budget ceiling; the usual constraint for mobile"},"min_triangles":{"type":"integer"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":530,"tokensAfter":530}],"toolsChanged":10,"tokensSaved":0,"todo":[{"tool":"find_matching","params":["id","min_triangles"]},{"tool":"get_variant","params":["id"]},{"tool":"search_assets","params":["sort","class","min_triangles"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}