[{"data":1,"prerenderedAt":1970},["ShallowReactive",2],{"ai-schema-driven-interfaces-for-humans-and-ais":3},{"id":4,"title":5,"author":6,"body":7,"date":1947,"description":1948,"extension":1949,"keywords":1950,"meta":1960,"navigation":1961,"path":1962,"published":1961,"seo":1963,"stem":1964,"tags":1965,"__hash__":1969},"ai\u002Fai\u002Fschema-driven-interfaces-for-humans-and-ais.md","Schema-Driven Interfaces for Humans and AIs","Žiga Sajovic",{"type":8,"value":9,"toc":1934},"minimark",[10,14,22,27,30,36,39,42,46,49,53,56,59,62,602,609,613,659,662,666,669,673,680,685,691,1095,1105,1120,1124,1130,1133,1374,1381,1683,1686,1690,1695,1858,1861,1865,1874,1880,1884,1890,1905,1909,1913,1919,1922,1926,1930],[11,12,13],"p",{},"Integrating AI into an application usually means building a second interface — an API wrapper, a set of MCP tools, a function-calling layer. This second interface reimplements validation, drifts out of sync with the UI, and burns thousands of tokens on static schemas before the model even begins to reason.",[11,15,16,21],{},[17,18,20],"a",{"href":19},"\u002Flunar","Lunar"," — a geometry workbench with 45+ operations — treats each interface as a rendering of the same schema. This architecture reduces AI context overhead by over 95% at scale compared to traditional tool enumeration. The UI renders controls. MCP renders tool descriptions. Both feed one executor.",[23,24,26],"h2",{"id":25},"the-mcp-problem","The MCP problem",[11,28,29],{},"The standard approach to MCP integration is one tool per operation. This creates problems at scale.",[31,32],"data-table",{":headers":33,":highlight":34,":rows":35},"[\"MCP server\",\"Tools exposed\",\"Schema tokens\"]","0","[[\"GitHub\",\"51+\",\"~25,000\"],[\"Playwright\",\"~25\",\"~15,000\"],[\"Filesystem\",\"14\",\"~5,000\"],[\"Typical 3-server setup\",\"~90\",\"~45,000\"],[\"Lunar\",\"3\",\"~1,200\"]]",[11,37,38],{},"Each tool schema consumes 400–800 tokens. A standard three-server setup burns ~45,000 tokens of context before the agent starts working. Cursor hard-caps at 40 MCP tools total — anything beyond is silently dropped.",[11,40,41],{},"The problems compound:",[31,43],{":headers":44,":highlight":34,":rows":45},"[\"Problem\",\"Effect\"]","[[\"Context pollution\",\"Tool schemas consume tokens that should go to reasoning\"],[\"Tool confusion\",\"Models misfire on similar-sounding tools (get_status, fetch_status, query_status)\"],[\"Resource support gap\",\"Under half of MCP clients support resources — tools-only is the practical reality\"],[\"Schema staleness\",\"Tool descriptions are static — adding an operation requires redeploying the MCP server\"],[\"Maintenance burden\",\"The AI interface is a separate codebase that must track the product\"]]",[11,47,48],{},"The workarounds — deferred loading, RAG-based tool selection, toolset flags — address symptoms. The root cause is architectural: operations are coupled to their interface.",[23,50,52],{"id":51},"operations-as-schemas-interfaces-as-renderers","Operations as schemas, interfaces as renderers",[11,54,55],{},"Most applications define operations inside their interface. The UI handler IS the boolean operation. The API endpoint IS the boolean operation. The MCP tool IS the boolean operation. Three implementations of the same thing.",[11,57,58],{},"Lunar defines operations independently — as typed schemas. Interfaces are renderers: they read the schema, present it in their format, gather inputs, and pass them to a shared executor. The operation doesn't know what rendered it.",[60,61],"ai-interface-diagram",{},[63,64,69],"pre",{"className":65,"code":66,"language":67,"meta":68,"style":68},"language-typescript shiki shiki-themes dark-plus","operators.register({\n  id: 'tf.boolean',\n  label: 'Boolean',\n  description: 'Perform a boolean operation (union, intersection, or difference) on two meshes.',\n  category: 'cut',\n  tags: ['boolean', 'csg', 'union', 'intersection', 'difference', 'subtract', 'combine'],\n  docsUrl: 'https:\u002F\u002Ftrueform.polydera.com\u002Fts\u002Fmodules\u002Fcut#boolean-operations',\n  inputs: [\n    { name: 'meshA', label: 'Mesh A', type: 'mesh', description: 'First mesh' },\n    { name: 'meshB', label: 'Mesh B', type: 'mesh', description: 'Second mesh' },\n    { name: 'operation', label: 'Operation', type: 'string',\n      description: 'Boolean operation type',\n      enum: ['union', 'intersection', 'difference'], default: 'union' },\n    { name: 'returnCurves', label: 'Return Curves', type: 'boolean',\n      description: 'Include intersection curves', optional: true, default: false }\n  ],\n  outputs: [\n    { name: 'mesh', label: 'Result', type: 'mesh',\n      description: 'Boolean result mesh', primary: true },\n    { name: 'labels', label: 'Labels', type: 'ndarray',\n      description: 'Per-face region labels' },\n    { name: 'curves', label: 'Curves', type: 'curves',\n      description: 'Intersection curves',\n      condition: { input: 'returnCurves', value: true } }\n  ],\n  async: async ({ meshA, meshB, operation, returnCurves }) => { \u002F* dispatch *\u002F }\n})\n","typescript","",[70,71,72,92,105,116,127,138,184,195,204,243,275,301,312,341,367,394,400,408,432,449,475,485,510,520,544,549,596],"code",{"__ignoreMap":68},[73,74,77,81,85,89],"span",{"class":75,"line":76},"line",1,[73,78,80],{"class":79},"s3F5K","operators",[73,82,84],{"class":83},"sTNBD",".",[73,86,88],{"class":87},"sCudf","register",[73,90,91],{"class":83},"({\n",[73,93,95,98,102],{"class":75,"line":94},2,[73,96,97],{"class":79},"  id:",[73,99,101],{"class":100},"sKc5r"," 'tf.boolean'",[73,103,104],{"class":83},",\n",[73,106,108,111,114],{"class":75,"line":107},3,[73,109,110],{"class":79},"  label:",[73,112,113],{"class":100}," 'Boolean'",[73,115,104],{"class":83},[73,117,119,122,125],{"class":75,"line":118},4,[73,120,121],{"class":79},"  description:",[73,123,124],{"class":100}," 'Perform a boolean operation (union, intersection, or difference) on two meshes.'",[73,126,104],{"class":83},[73,128,130,133,136],{"class":75,"line":129},5,[73,131,132],{"class":79},"  category:",[73,134,135],{"class":100}," 'cut'",[73,137,104],{"class":83},[73,139,141,144,147,150,153,156,158,161,163,166,168,171,173,176,178,181],{"class":75,"line":140},6,[73,142,143],{"class":79},"  tags:",[73,145,146],{"class":83}," [",[73,148,149],{"class":100},"'boolean'",[73,151,152],{"class":83},", ",[73,154,155],{"class":100},"'csg'",[73,157,152],{"class":83},[73,159,160],{"class":100},"'union'",[73,162,152],{"class":83},[73,164,165],{"class":100},"'intersection'",[73,167,152],{"class":83},[73,169,170],{"class":100},"'difference'",[73,172,152],{"class":83},[73,174,175],{"class":100},"'subtract'",[73,177,152],{"class":83},[73,179,180],{"class":100},"'combine'",[73,182,183],{"class":83},"],\n",[73,185,187,190,193],{"class":75,"line":186},7,[73,188,189],{"class":79},"  docsUrl:",[73,191,192],{"class":100}," 'https:\u002F\u002Ftrueform.polydera.com\u002Fts\u002Fmodules\u002Fcut#boolean-operations'",[73,194,104],{"class":83},[73,196,198,201],{"class":75,"line":197},8,[73,199,200],{"class":79},"  inputs:",[73,202,203],{"class":83}," [\n",[73,205,207,210,213,216,218,221,224,226,229,232,234,237,240],{"class":75,"line":206},9,[73,208,209],{"class":83},"    { ",[73,211,212],{"class":79},"name:",[73,214,215],{"class":100}," 'meshA'",[73,217,152],{"class":83},[73,219,220],{"class":79},"label:",[73,222,223],{"class":100}," 'Mesh A'",[73,225,152],{"class":83},[73,227,228],{"class":79},"type:",[73,230,231],{"class":100}," 'mesh'",[73,233,152],{"class":83},[73,235,236],{"class":79},"description:",[73,238,239],{"class":100}," 'First mesh'",[73,241,242],{"class":83}," },\n",[73,244,246,248,250,253,255,257,260,262,264,266,268,270,273],{"class":75,"line":245},10,[73,247,209],{"class":83},[73,249,212],{"class":79},[73,251,252],{"class":100}," 'meshB'",[73,254,152],{"class":83},[73,256,220],{"class":79},[73,258,259],{"class":100}," 'Mesh B'",[73,261,152],{"class":83},[73,263,228],{"class":79},[73,265,231],{"class":100},[73,267,152],{"class":83},[73,269,236],{"class":79},[73,271,272],{"class":100}," 'Second mesh'",[73,274,242],{"class":83},[73,276,278,280,282,285,287,289,292,294,296,299],{"class":75,"line":277},11,[73,279,209],{"class":83},[73,281,212],{"class":79},[73,283,284],{"class":100}," 'operation'",[73,286,152],{"class":83},[73,288,220],{"class":79},[73,290,291],{"class":100}," 'Operation'",[73,293,152],{"class":83},[73,295,228],{"class":79},[73,297,298],{"class":100}," 'string'",[73,300,104],{"class":83},[73,302,304,307,310],{"class":75,"line":303},12,[73,305,306],{"class":79},"      description:",[73,308,309],{"class":100}," 'Boolean operation type'",[73,311,104],{"class":83},[73,313,315,318,320,322,324,326,328,330,333,336,339],{"class":75,"line":314},13,[73,316,317],{"class":79},"      enum:",[73,319,146],{"class":83},[73,321,160],{"class":100},[73,323,152],{"class":83},[73,325,165],{"class":100},[73,327,152],{"class":83},[73,329,170],{"class":100},[73,331,332],{"class":83},"], ",[73,334,335],{"class":79},"default:",[73,337,338],{"class":100}," 'union'",[73,340,242],{"class":83},[73,342,344,346,348,351,353,355,358,360,362,365],{"class":75,"line":343},14,[73,345,209],{"class":83},[73,347,212],{"class":79},[73,349,350],{"class":100}," 'returnCurves'",[73,352,152],{"class":83},[73,354,220],{"class":79},[73,356,357],{"class":100}," 'Return Curves'",[73,359,152],{"class":83},[73,361,228],{"class":79},[73,363,364],{"class":100}," 'boolean'",[73,366,104],{"class":83},[73,368,370,372,375,377,380,384,386,388,391],{"class":75,"line":369},15,[73,371,306],{"class":79},[73,373,374],{"class":100}," 'Include intersection curves'",[73,376,152],{"class":83},[73,378,379],{"class":79},"optional:",[73,381,383],{"class":382},"scz_3"," true",[73,385,152],{"class":83},[73,387,335],{"class":79},[73,389,390],{"class":382}," false",[73,392,393],{"class":83}," }\n",[73,395,397],{"class":75,"line":396},16,[73,398,399],{"class":83},"  ],\n",[73,401,403,406],{"class":75,"line":402},17,[73,404,405],{"class":79},"  outputs:",[73,407,203],{"class":83},[73,409,411,413,415,417,419,421,424,426,428,430],{"class":75,"line":410},18,[73,412,209],{"class":83},[73,414,212],{"class":79},[73,416,231],{"class":100},[73,418,152],{"class":83},[73,420,220],{"class":79},[73,422,423],{"class":100}," 'Result'",[73,425,152],{"class":83},[73,427,228],{"class":79},[73,429,231],{"class":100},[73,431,104],{"class":83},[73,433,435,437,440,442,445,447],{"class":75,"line":434},19,[73,436,306],{"class":79},[73,438,439],{"class":100}," 'Boolean result mesh'",[73,441,152],{"class":83},[73,443,444],{"class":79},"primary:",[73,446,383],{"class":382},[73,448,242],{"class":83},[73,450,452,454,456,459,461,463,466,468,470,473],{"class":75,"line":451},20,[73,453,209],{"class":83},[73,455,212],{"class":79},[73,457,458],{"class":100}," 'labels'",[73,460,152],{"class":83},[73,462,220],{"class":79},[73,464,465],{"class":100}," 'Labels'",[73,467,152],{"class":83},[73,469,228],{"class":79},[73,471,472],{"class":100}," 'ndarray'",[73,474,104],{"class":83},[73,476,478,480,483],{"class":75,"line":477},21,[73,479,306],{"class":79},[73,481,482],{"class":100}," 'Per-face region labels'",[73,484,242],{"class":83},[73,486,488,490,492,495,497,499,502,504,506,508],{"class":75,"line":487},22,[73,489,209],{"class":83},[73,491,212],{"class":79},[73,493,494],{"class":100}," 'curves'",[73,496,152],{"class":83},[73,498,220],{"class":79},[73,500,501],{"class":100}," 'Curves'",[73,503,152],{"class":83},[73,505,228],{"class":79},[73,507,494],{"class":100},[73,509,104],{"class":83},[73,511,513,515,518],{"class":75,"line":512},23,[73,514,306],{"class":79},[73,516,517],{"class":100}," 'Intersection curves'",[73,519,104],{"class":83},[73,521,523,526,529,532,534,536,539,541],{"class":75,"line":522},24,[73,524,525],{"class":79},"      condition:",[73,527,528],{"class":83}," { ",[73,530,531],{"class":79},"input:",[73,533,350],{"class":100},[73,535,152],{"class":83},[73,537,538],{"class":79},"value:",[73,540,383],{"class":382},[73,542,543],{"class":83}," } }\n",[73,545,547],{"class":75,"line":546},25,[73,548,399],{"class":83},[73,550,552,555,558,561,564,567,569,572,574,577,579,582,585,588,590,594],{"class":75,"line":551},26,[73,553,554],{"class":87},"  async",[73,556,557],{"class":79},":",[73,559,560],{"class":382}," async",[73,562,563],{"class":83}," ({ ",[73,565,566],{"class":79},"meshA",[73,568,152],{"class":83},[73,570,571],{"class":79},"meshB",[73,573,152],{"class":83},[73,575,576],{"class":79},"operation",[73,578,152],{"class":83},[73,580,581],{"class":79},"returnCurves",[73,583,584],{"class":83}," }) ",[73,586,587],{"class":382},"=>",[73,589,528],{"class":83},[73,591,593],{"class":592},"sOLPB","\u002F* dispatch *\u002F",[73,595,393],{"class":83},[73,597,599],{"class":75,"line":598},27,[73,600,601],{"class":83},"})\n",[11,603,604,605,608],{},"This definition carries everything a renderer needs: typed inputs with labels, constraints, and defaults. Outputs with conditions. Tags for search. A docs URL for linking. The ",[70,606,607],{},"async"," function is used by the executor to dispatch the task to the engine. Each interface reads the same definition and renders it in its own format — the operation itself is written once.",[23,610,612],{"id":611},"the-human-interface","The human interface",[11,614,615,616,619,620,623,624,627,628,631,632,635,636,623,639,642,643,646,647,650,651,654,655,658],{},"The schema drives every element of the UI. ",[70,617,618],{},"type"," maps to widget: ",[70,621,622],{},"number"," with ",[70,625,626],{},"min","\u002F",[70,629,630],{},"max"," → slider, ",[70,633,634],{},"boolean"," → toggle, ",[70,637,638],{},"string",[70,640,641],{},"enum"," → dropdown. ",[70,644,645],{},"category"," places the operator in the sidebar. ",[70,648,649],{},"tags"," feed Cmd+K search — typing \"csg\" finds Boolean. ",[70,652,653],{},"label"," titles each control. ",[70,656,657],{},"docsUrl"," links the help icon to documentation. Operand inputs come from scene selection — the user selects nodes, the panel fills in operand slots by type.",[11,660,661],{},"No UI code per operation. Adding an operator to the registry adds it to the sidebar, makes it searchable, generates its control panel, and connects its help link. The panel renderer reads the schema and builds the interface.",[23,663,665],{"id":664},"the-model-interface","The model interface",[11,667,668],{},"An AI model receives three tools:",[31,670],{":headers":671,":highlight":34,":rows":672},"[\"Tool\",\"Purpose\",\"Analogy\"]","[[\"discover()\",\"Browse operator catalog, get schemas on demand\",\"Human browses categories, opens Cmd+K\"],[\"world_state()\",\"Read scene — same data that drives UI panels, stats, bounding boxes\",\"Human looks at the viewport\"],[\"run({ operations })\",\"Execute one or more operations in batch\",\"Human clicks Run\"]]",[11,674,675,676,679],{},"Three tools, ~1,200 tokens of schema. The model discovers 45+ operations dynamically through ",[70,677,678],{},"discover()"," — they are not loaded at connection time.",[681,682,684],"h3",{"id":683},"compact-catalog","Compact catalog",[11,686,687,688,690],{},"The first ",[70,689,678],{}," call returns a compact listing:",[63,692,696],{"className":693,"code":694,"language":695,"meta":68,"style":68},"language-json shiki shiki-themes dark-plus","{\n  \"cut\": [\n    { \"id\": \"tf.boolean\",    \"l\": \"Boolean\", \"n\": 2, \"p\": [\"operation\"] },\n    { \"id\": \"tf.meshArrangements\", \"l\": \"Mesh Arrangements\", \"n\": \"N\" },\n    ...\n  ],\n  \"geometry\": [\n    { \"id\": \"tf.sphereMesh\", \"l\": \"Sphere\", \"p\": [\"radius\", \"stacks\"] },\n    { \"id\": \"tf.boxMesh\",    \"l\": \"Box\",    \"p\": [\"width\", \"height\", \"depth\"] },\n    ...\n  ],\n  \"scene\": [\n    { \"id\": \"scene.add_mesh\",   \"l\": \"Add Mesh\",   \"p\": [\"label\", \"points\", \"faces\"] },\n    { \"id\": \"scene.add_curves\", \"l\": \"Add Curves\",  \"p\": [\"label\", \"points\", \"paths\", \"offsets\"] },\n    { \"id\": \"scene.screenshot\", \"l\": \"Screenshot\" },\n    ...\n  ],\n  \"camera\": [\n    { \"id\": \"camera.describe\",  \"l\": \"Describe Camera\" },\n    { \"id\": \"camera.fit_to_nodes\", \"l\": \"Fit to Nodes\", \"p\": [\"nodeIds\"] },\n    ...\n  ],\n  ...\n}\n","json",[70,697,698,703,711,760,791,797,801,808,844,885,889,893,900,942,987,1009,1013,1017,1024,1046,1077,1081,1085,1090],{"__ignoreMap":68},[73,699,700],{"class":75,"line":76},[73,701,702],{"class":83},"{\n",[73,704,705,708],{"class":75,"line":94},[73,706,707],{"class":79},"  \"cut\"",[73,709,710],{"class":83},": [\n",[73,712,713,715,718,721,724,727,730,732,735,737,740,742,746,748,751,754,757],{"class":75,"line":107},[73,714,209],{"class":83},[73,716,717],{"class":79},"\"id\"",[73,719,720],{"class":83},": ",[73,722,723],{"class":100},"\"tf.boolean\"",[73,725,726],{"class":83},",    ",[73,728,729],{"class":79},"\"l\"",[73,731,720],{"class":83},[73,733,734],{"class":100},"\"Boolean\"",[73,736,152],{"class":83},[73,738,739],{"class":79},"\"n\"",[73,741,720],{"class":83},[73,743,745],{"class":744},"sDGX8","2",[73,747,152],{"class":83},[73,749,750],{"class":79},"\"p\"",[73,752,753],{"class":83},": [",[73,755,756],{"class":100},"\"operation\"",[73,758,759],{"class":83},"] },\n",[73,761,762,764,766,768,771,773,775,777,780,782,784,786,789],{"class":75,"line":118},[73,763,209],{"class":83},[73,765,717],{"class":79},[73,767,720],{"class":83},[73,769,770],{"class":100},"\"tf.meshArrangements\"",[73,772,152],{"class":83},[73,774,729],{"class":79},[73,776,720],{"class":83},[73,778,779],{"class":100},"\"Mesh Arrangements\"",[73,781,152],{"class":83},[73,783,739],{"class":79},[73,785,720],{"class":83},[73,787,788],{"class":100},"\"N\"",[73,790,242],{"class":83},[73,792,793],{"class":75,"line":129},[73,794,796],{"class":795},"sHkYM","    ...\n",[73,798,799],{"class":75,"line":140},[73,800,399],{"class":83},[73,802,803,806],{"class":75,"line":186},[73,804,805],{"class":79},"  \"geometry\"",[73,807,710],{"class":83},[73,809,810,812,814,816,819,821,823,825,828,830,832,834,837,839,842],{"class":75,"line":197},[73,811,209],{"class":83},[73,813,717],{"class":79},[73,815,720],{"class":83},[73,817,818],{"class":100},"\"tf.sphereMesh\"",[73,820,152],{"class":83},[73,822,729],{"class":79},[73,824,720],{"class":83},[73,826,827],{"class":100},"\"Sphere\"",[73,829,152],{"class":83},[73,831,750],{"class":79},[73,833,753],{"class":83},[73,835,836],{"class":100},"\"radius\"",[73,838,152],{"class":83},[73,840,841],{"class":100},"\"stacks\"",[73,843,759],{"class":83},[73,845,846,848,850,852,855,857,859,861,864,866,868,870,873,875,878,880,883],{"class":75,"line":206},[73,847,209],{"class":83},[73,849,717],{"class":79},[73,851,720],{"class":83},[73,853,854],{"class":100},"\"tf.boxMesh\"",[73,856,726],{"class":83},[73,858,729],{"class":79},[73,860,720],{"class":83},[73,862,863],{"class":100},"\"Box\"",[73,865,726],{"class":83},[73,867,750],{"class":79},[73,869,753],{"class":83},[73,871,872],{"class":100},"\"width\"",[73,874,152],{"class":83},[73,876,877],{"class":100},"\"height\"",[73,879,152],{"class":83},[73,881,882],{"class":100},"\"depth\"",[73,884,759],{"class":83},[73,886,887],{"class":75,"line":245},[73,888,796],{"class":795},[73,890,891],{"class":75,"line":277},[73,892,399],{"class":83},[73,894,895,898],{"class":75,"line":303},[73,896,897],{"class":79},"  \"scene\"",[73,899,710],{"class":83},[73,901,902,904,906,908,911,914,916,918,921,923,925,927,930,932,935,937,940],{"class":75,"line":314},[73,903,209],{"class":83},[73,905,717],{"class":79},[73,907,720],{"class":83},[73,909,910],{"class":100},"\"scene.add_mesh\"",[73,912,913],{"class":83},",   ",[73,915,729],{"class":79},[73,917,720],{"class":83},[73,919,920],{"class":100},"\"Add Mesh\"",[73,922,913],{"class":83},[73,924,750],{"class":79},[73,926,753],{"class":83},[73,928,929],{"class":100},"\"label\"",[73,931,152],{"class":83},[73,933,934],{"class":100},"\"points\"",[73,936,152],{"class":83},[73,938,939],{"class":100},"\"faces\"",[73,941,759],{"class":83},[73,943,944,946,948,950,953,955,957,959,962,965,967,969,971,973,975,977,980,982,985],{"class":75,"line":343},[73,945,209],{"class":83},[73,947,717],{"class":79},[73,949,720],{"class":83},[73,951,952],{"class":100},"\"scene.add_curves\"",[73,954,152],{"class":83},[73,956,729],{"class":79},[73,958,720],{"class":83},[73,960,961],{"class":100},"\"Add Curves\"",[73,963,964],{"class":83},",  ",[73,966,750],{"class":79},[73,968,753],{"class":83},[73,970,929],{"class":100},[73,972,152],{"class":83},[73,974,934],{"class":100},[73,976,152],{"class":83},[73,978,979],{"class":100},"\"paths\"",[73,981,152],{"class":83},[73,983,984],{"class":100},"\"offsets\"",[73,986,759],{"class":83},[73,988,989,991,993,995,998,1000,1002,1004,1007],{"class":75,"line":369},[73,990,209],{"class":83},[73,992,717],{"class":79},[73,994,720],{"class":83},[73,996,997],{"class":100},"\"scene.screenshot\"",[73,999,152],{"class":83},[73,1001,729],{"class":79},[73,1003,720],{"class":83},[73,1005,1006],{"class":100},"\"Screenshot\"",[73,1008,242],{"class":83},[73,1010,1011],{"class":75,"line":396},[73,1012,796],{"class":795},[73,1014,1015],{"class":75,"line":402},[73,1016,399],{"class":83},[73,1018,1019,1022],{"class":75,"line":410},[73,1020,1021],{"class":79},"  \"camera\"",[73,1023,710],{"class":83},[73,1025,1026,1028,1030,1032,1035,1037,1039,1041,1044],{"class":75,"line":434},[73,1027,209],{"class":83},[73,1029,717],{"class":79},[73,1031,720],{"class":83},[73,1033,1034],{"class":100},"\"camera.describe\"",[73,1036,964],{"class":83},[73,1038,729],{"class":79},[73,1040,720],{"class":83},[73,1042,1043],{"class":100},"\"Describe Camera\"",[73,1045,242],{"class":83},[73,1047,1048,1050,1052,1054,1057,1059,1061,1063,1066,1068,1070,1072,1075],{"class":75,"line":451},[73,1049,209],{"class":83},[73,1051,717],{"class":79},[73,1053,720],{"class":83},[73,1055,1056],{"class":100},"\"camera.fit_to_nodes\"",[73,1058,152],{"class":83},[73,1060,729],{"class":79},[73,1062,720],{"class":83},[73,1064,1065],{"class":100},"\"Fit to Nodes\"",[73,1067,152],{"class":83},[73,1069,750],{"class":79},[73,1071,753],{"class":83},[73,1073,1074],{"class":100},"\"nodeIds\"",[73,1076,759],{"class":83},[73,1078,1079],{"class":75,"line":477},[73,1080,796],{"class":795},[73,1082,1083],{"class":75,"line":487},[73,1084,399],{"class":83},[73,1086,1087],{"class":75,"line":512},[73,1088,1089],{"class":795},"  ...\n",[73,1091,1092],{"class":75,"line":522},[73,1093,1094],{"class":83},"}\n",[11,1096,1097,1098,1101,1102,1104],{},"Organized by category. ",[70,1099,1100],{},"n"," = how many operands to pass. ",[70,1103,11],{}," = parameter names. The model sees the full catalog in one response without consuming context for 45+ full schemas.",[11,1106,1107,1108,1111,1112,1115,1116,1119],{},"When it needs to use an operator, it calls ",[70,1109,1110],{},"discover({ operatorIds: [...] })"," for full schemas — types, constraints, defaults, and an ",[70,1113,1114],{},"_example"," showing the exact ",[70,1117,1118],{},"run()"," call. On-demand, not upfront.",[681,1121,1123],{"id":1122},"world-state","World state",[11,1125,1126,1129],{},[70,1127,1128],{},"world_state()"," is how the model observes the scene — the equivalent of the human looking at the viewport and the properties panel.",[11,1131,1132],{},"Called without arguments, it returns a compact overview:",[63,1134,1136],{"className":693,"code":1135,"language":695,"meta":68,"style":68},"{\n  \"summary\": \"2 meshes, 550319 faces, 1 selected\",\n  \"nodes\": [\n    { \"id\": \"Stanford Dragon-1\", \"label\": \"Stanford Dragon\",\n      \"type\": \"mesh\", \"visible\": true, \"center\": [-1.14, 1.39, 0.26],\n      \"children\": [\"shape-index-1\"] },\n    { \"id\": \"shape-index-1\", \"label\": \"Shape Index\",\n      \"type\": \"ndarray\", \"visible\": true, \"parentId\": \"Stanford Dragon-1\" },\n    { \"id\": \"Stanford Bunny-1\", \"label\": \"Stanford Bunny\",\n      \"type\": \"mesh\", \"visible\": true, \"center\": [12.24, 1.26, 0.00],\n      \"children\": [\"shape-index-2\", \"boundary-edges-1\"] },\n    ...\n  ]\n}\n",[70,1137,1138,1142,1154,1161,1183,1225,1237,1258,1286,1308,1345,1361,1365,1370],{"__ignoreMap":68},[73,1139,1140],{"class":75,"line":76},[73,1141,702],{"class":83},[73,1143,1144,1147,1149,1152],{"class":75,"line":94},[73,1145,1146],{"class":79},"  \"summary\"",[73,1148,720],{"class":83},[73,1150,1151],{"class":100},"\"2 meshes, 550319 faces, 1 selected\"",[73,1153,104],{"class":83},[73,1155,1156,1159],{"class":75,"line":107},[73,1157,1158],{"class":79},"  \"nodes\"",[73,1160,710],{"class":83},[73,1162,1163,1165,1167,1169,1172,1174,1176,1178,1181],{"class":75,"line":118},[73,1164,209],{"class":83},[73,1166,717],{"class":79},[73,1168,720],{"class":83},[73,1170,1171],{"class":100},"\"Stanford Dragon-1\"",[73,1173,152],{"class":83},[73,1175,929],{"class":79},[73,1177,720],{"class":83},[73,1179,1180],{"class":100},"\"Stanford Dragon\"",[73,1182,104],{"class":83},[73,1184,1185,1188,1190,1193,1195,1198,1200,1203,1205,1208,1210,1213,1215,1218,1220,1223],{"class":75,"line":129},[73,1186,1187],{"class":79},"      \"type\"",[73,1189,720],{"class":83},[73,1191,1192],{"class":100},"\"mesh\"",[73,1194,152],{"class":83},[73,1196,1197],{"class":79},"\"visible\"",[73,1199,720],{"class":83},[73,1201,1202],{"class":382},"true",[73,1204,152],{"class":83},[73,1206,1207],{"class":79},"\"center\"",[73,1209,753],{"class":83},[73,1211,1212],{"class":744},"-1.14",[73,1214,152],{"class":83},[73,1216,1217],{"class":744},"1.39",[73,1219,152],{"class":83},[73,1221,1222],{"class":744},"0.26",[73,1224,183],{"class":83},[73,1226,1227,1230,1232,1235],{"class":75,"line":140},[73,1228,1229],{"class":79},"      \"children\"",[73,1231,753],{"class":83},[73,1233,1234],{"class":100},"\"shape-index-1\"",[73,1236,759],{"class":83},[73,1238,1239,1241,1243,1245,1247,1249,1251,1253,1256],{"class":75,"line":186},[73,1240,209],{"class":83},[73,1242,717],{"class":79},[73,1244,720],{"class":83},[73,1246,1234],{"class":100},[73,1248,152],{"class":83},[73,1250,929],{"class":79},[73,1252,720],{"class":83},[73,1254,1255],{"class":100},"\"Shape Index\"",[73,1257,104],{"class":83},[73,1259,1260,1262,1264,1267,1269,1271,1273,1275,1277,1280,1282,1284],{"class":75,"line":197},[73,1261,1187],{"class":79},[73,1263,720],{"class":83},[73,1265,1266],{"class":100},"\"ndarray\"",[73,1268,152],{"class":83},[73,1270,1197],{"class":79},[73,1272,720],{"class":83},[73,1274,1202],{"class":382},[73,1276,152],{"class":83},[73,1278,1279],{"class":79},"\"parentId\"",[73,1281,720],{"class":83},[73,1283,1171],{"class":100},[73,1285,242],{"class":83},[73,1287,1288,1290,1292,1294,1297,1299,1301,1303,1306],{"class":75,"line":206},[73,1289,209],{"class":83},[73,1291,717],{"class":79},[73,1293,720],{"class":83},[73,1295,1296],{"class":100},"\"Stanford Bunny-1\"",[73,1298,152],{"class":83},[73,1300,929],{"class":79},[73,1302,720],{"class":83},[73,1304,1305],{"class":100},"\"Stanford Bunny\"",[73,1307,104],{"class":83},[73,1309,1310,1312,1314,1316,1318,1320,1322,1324,1326,1328,1330,1333,1335,1338,1340,1343],{"class":75,"line":245},[73,1311,1187],{"class":79},[73,1313,720],{"class":83},[73,1315,1192],{"class":100},[73,1317,152],{"class":83},[73,1319,1197],{"class":79},[73,1321,720],{"class":83},[73,1323,1202],{"class":382},[73,1325,152],{"class":83},[73,1327,1207],{"class":79},[73,1329,753],{"class":83},[73,1331,1332],{"class":744},"12.24",[73,1334,152],{"class":83},[73,1336,1337],{"class":744},"1.26",[73,1339,152],{"class":83},[73,1341,1342],{"class":744},"0.00",[73,1344,183],{"class":83},[73,1346,1347,1349,1351,1354,1356,1359],{"class":75,"line":277},[73,1348,1229],{"class":79},[73,1350,753],{"class":83},[73,1352,1353],{"class":100},"\"shape-index-2\"",[73,1355,152],{"class":83},[73,1357,1358],{"class":100},"\"boundary-edges-1\"",[73,1360,759],{"class":83},[73,1362,1363],{"class":75,"line":303},[73,1364,796],{"class":795},[73,1366,1367],{"class":75,"line":314},[73,1368,1369],{"class":83},"  ]\n",[73,1371,1372],{"class":75,"line":343},[73,1373,1094],{"class":83},[11,1375,1376,1377,1380],{},"Called with ",[70,1378,1379],{},"nodeIds",", it returns full detail — the same data that drives the properties inspector:",[63,1382,1384],{"className":693,"code":1383,"language":695,"meta":68,"style":68},"{\n  \"nodes\": [\n    { \"id\": \"Stanford Dragon-1\", \"type\": \"mesh\",\n      \"children\": [\"shape-index-1\"],\n      \"properties\": {\n        \"faces\": 480868, \"vertices\": 240428,\n        \"aabb\": { \"min\": [-9.06, -4.20, -3.28], \"max\": [6.78, 6.98, 3.80] },\n        \"obb\": { \"center\": [-1.81, 0.46, -0.25], \"axes\": [...], \"extent\": [16.14, 12.54, 6.88] }\n      }\n    },\n    { \"id\": \"shape-index-1\", \"type\": \"ndarray\", \"parentId\": \"Stanford Dragon-1\",\n      \"properties\": {\n        \"shape\": [240428], \"dtype\": \"float32\",\n        \"min\": -0.999, \"max\": 0.997, \"mean\": 0.171, \"std\": 0.482\n      }\n    }\n  ]\n}\n",[70,1385,1386,1390,1396,1417,1427,1435,1457,1505,1562,1567,1572,1600,1606,1627,1666,1670,1675,1679],{"__ignoreMap":68},[73,1387,1388],{"class":75,"line":76},[73,1389,702],{"class":83},[73,1391,1392,1394],{"class":75,"line":94},[73,1393,1158],{"class":79},[73,1395,710],{"class":83},[73,1397,1398,1400,1402,1404,1406,1408,1411,1413,1415],{"class":75,"line":107},[73,1399,209],{"class":83},[73,1401,717],{"class":79},[73,1403,720],{"class":83},[73,1405,1171],{"class":100},[73,1407,152],{"class":83},[73,1409,1410],{"class":79},"\"type\"",[73,1412,720],{"class":83},[73,1414,1192],{"class":100},[73,1416,104],{"class":83},[73,1418,1419,1421,1423,1425],{"class":75,"line":118},[73,1420,1229],{"class":79},[73,1422,753],{"class":83},[73,1424,1234],{"class":100},[73,1426,183],{"class":83},[73,1428,1429,1432],{"class":75,"line":129},[73,1430,1431],{"class":79},"      \"properties\"",[73,1433,1434],{"class":83},": {\n",[73,1436,1437,1440,1442,1445,1447,1450,1452,1455],{"class":75,"line":140},[73,1438,1439],{"class":79},"        \"faces\"",[73,1441,720],{"class":83},[73,1443,1444],{"class":744},"480868",[73,1446,152],{"class":83},[73,1448,1449],{"class":79},"\"vertices\"",[73,1451,720],{"class":83},[73,1453,1454],{"class":744},"240428",[73,1456,104],{"class":83},[73,1458,1459,1462,1465,1468,1470,1473,1475,1478,1480,1483,1485,1488,1490,1493,1495,1498,1500,1503],{"class":75,"line":186},[73,1460,1461],{"class":79},"        \"aabb\"",[73,1463,1464],{"class":83},": { ",[73,1466,1467],{"class":79},"\"min\"",[73,1469,753],{"class":83},[73,1471,1472],{"class":744},"-9.06",[73,1474,152],{"class":83},[73,1476,1477],{"class":744},"-4.20",[73,1479,152],{"class":83},[73,1481,1482],{"class":744},"-3.28",[73,1484,332],{"class":83},[73,1486,1487],{"class":79},"\"max\"",[73,1489,753],{"class":83},[73,1491,1492],{"class":744},"6.78",[73,1494,152],{"class":83},[73,1496,1497],{"class":744},"6.98",[73,1499,152],{"class":83},[73,1501,1502],{"class":744},"3.80",[73,1504,759],{"class":83},[73,1506,1507,1510,1512,1514,1516,1519,1521,1524,1526,1529,1531,1534,1536,1539,1541,1544,1546,1549,1551,1554,1556,1559],{"class":75,"line":197},[73,1508,1509],{"class":79},"        \"obb\"",[73,1511,1464],{"class":83},[73,1513,1207],{"class":79},[73,1515,753],{"class":83},[73,1517,1518],{"class":744},"-1.81",[73,1520,152],{"class":83},[73,1522,1523],{"class":744},"0.46",[73,1525,152],{"class":83},[73,1527,1528],{"class":744},"-0.25",[73,1530,332],{"class":83},[73,1532,1533],{"class":79},"\"axes\"",[73,1535,753],{"class":83},[73,1537,1538],{"class":795},"...",[73,1540,332],{"class":83},[73,1542,1543],{"class":79},"\"extent\"",[73,1545,753],{"class":83},[73,1547,1548],{"class":744},"16.14",[73,1550,152],{"class":83},[73,1552,1553],{"class":744},"12.54",[73,1555,152],{"class":83},[73,1557,1558],{"class":744},"6.88",[73,1560,1561],{"class":83},"] }\n",[73,1563,1564],{"class":75,"line":206},[73,1565,1566],{"class":83},"      }\n",[73,1568,1569],{"class":75,"line":245},[73,1570,1571],{"class":83},"    },\n",[73,1573,1574,1576,1578,1580,1582,1584,1586,1588,1590,1592,1594,1596,1598],{"class":75,"line":277},[73,1575,209],{"class":83},[73,1577,717],{"class":79},[73,1579,720],{"class":83},[73,1581,1234],{"class":100},[73,1583,152],{"class":83},[73,1585,1410],{"class":79},[73,1587,720],{"class":83},[73,1589,1266],{"class":100},[73,1591,152],{"class":83},[73,1593,1279],{"class":79},[73,1595,720],{"class":83},[73,1597,1171],{"class":100},[73,1599,104],{"class":83},[73,1601,1602,1604],{"class":75,"line":303},[73,1603,1431],{"class":79},[73,1605,1434],{"class":83},[73,1607,1608,1611,1613,1615,1617,1620,1622,1625],{"class":75,"line":314},[73,1609,1610],{"class":79},"        \"shape\"",[73,1612,753],{"class":83},[73,1614,1454],{"class":744},[73,1616,332],{"class":83},[73,1618,1619],{"class":79},"\"dtype\"",[73,1621,720],{"class":83},[73,1623,1624],{"class":100},"\"float32\"",[73,1626,104],{"class":83},[73,1628,1629,1632,1634,1637,1639,1641,1643,1646,1648,1651,1653,1656,1658,1661,1663],{"class":75,"line":343},[73,1630,1631],{"class":79},"        \"min\"",[73,1633,720],{"class":83},[73,1635,1636],{"class":744},"-0.999",[73,1638,152],{"class":83},[73,1640,1487],{"class":79},[73,1642,720],{"class":83},[73,1644,1645],{"class":744},"0.997",[73,1647,152],{"class":83},[73,1649,1650],{"class":79},"\"mean\"",[73,1652,720],{"class":83},[73,1654,1655],{"class":744},"0.171",[73,1657,152],{"class":83},[73,1659,1660],{"class":79},"\"std\"",[73,1662,720],{"class":83},[73,1664,1665],{"class":744},"0.482\n",[73,1667,1668],{"class":75,"line":369},[73,1669,1566],{"class":83},[73,1671,1672],{"class":75,"line":396},[73,1673,1674],{"class":83},"    }\n",[73,1676,1677],{"class":75,"line":402},[73,1678,1369],{"class":83},[73,1680,1681],{"class":75,"line":410},[73,1682,1094],{"class":83},[11,1684,1685],{},"Derived data — curvature fields, boundary edges, distance maps — lives as children of the mesh that produced it. The model sees the same scene graph the human sees: nodes, parent-child relationships, spatial properties. Two levels of detail — compact for orientation, detailed for spatial reasoning.",[681,1687,1689],{"id":1688},"running-operations","Running operations",[11,1691,1692,1694],{},[70,1693,1118],{}," accepts an array of operations. Create a sphere, position it, boolean it — one tool call:",[63,1696,1698],{"className":693,"code":1697,"language":695,"meta":68,"style":68},"{\n  \"operations\": [\n    {\n      \"operatorId\": \"tf.sphereMesh\",\n      \"params\": { \"radius\": 3 }\n    },\n    {\n      \"operatorId\": \"scene.set_position\",\n      \"nodeIds\": [\"sphere-1\"],\n      \"params\": { \"xyz\": [2, 4, 0] }\n    },\n    {\n      \"operatorId\": \"tf.boolean\",\n      \"nodeIds\": [\"dragon-1\", \"sphere-1\"],\n      \"params\": { \"operation\": \"difference\" }\n    }\n  ]\n}\n",[70,1699,1700,1704,1711,1716,1727,1743,1747,1751,1762,1774,1798,1802,1806,1816,1831,1846,1850,1854],{"__ignoreMap":68},[73,1701,1702],{"class":75,"line":76},[73,1703,702],{"class":83},[73,1705,1706,1709],{"class":75,"line":94},[73,1707,1708],{"class":79},"  \"operations\"",[73,1710,710],{"class":83},[73,1712,1713],{"class":75,"line":107},[73,1714,1715],{"class":83},"    {\n",[73,1717,1718,1721,1723,1725],{"class":75,"line":118},[73,1719,1720],{"class":79},"      \"operatorId\"",[73,1722,720],{"class":83},[73,1724,818],{"class":100},[73,1726,104],{"class":83},[73,1728,1729,1732,1734,1736,1738,1741],{"class":75,"line":129},[73,1730,1731],{"class":79},"      \"params\"",[73,1733,1464],{"class":83},[73,1735,836],{"class":79},[73,1737,720],{"class":83},[73,1739,1740],{"class":744},"3",[73,1742,393],{"class":83},[73,1744,1745],{"class":75,"line":140},[73,1746,1571],{"class":83},[73,1748,1749],{"class":75,"line":186},[73,1750,1715],{"class":83},[73,1752,1753,1755,1757,1760],{"class":75,"line":197},[73,1754,1720],{"class":79},[73,1756,720],{"class":83},[73,1758,1759],{"class":100},"\"scene.set_position\"",[73,1761,104],{"class":83},[73,1763,1764,1767,1769,1772],{"class":75,"line":206},[73,1765,1766],{"class":79},"      \"nodeIds\"",[73,1768,753],{"class":83},[73,1770,1771],{"class":100},"\"sphere-1\"",[73,1773,183],{"class":83},[73,1775,1776,1778,1780,1783,1785,1787,1789,1792,1794,1796],{"class":75,"line":245},[73,1777,1731],{"class":79},[73,1779,1464],{"class":83},[73,1781,1782],{"class":79},"\"xyz\"",[73,1784,753],{"class":83},[73,1786,745],{"class":744},[73,1788,152],{"class":83},[73,1790,1791],{"class":744},"4",[73,1793,152],{"class":83},[73,1795,34],{"class":744},[73,1797,1561],{"class":83},[73,1799,1800],{"class":75,"line":277},[73,1801,1571],{"class":83},[73,1803,1804],{"class":75,"line":303},[73,1805,1715],{"class":83},[73,1807,1808,1810,1812,1814],{"class":75,"line":314},[73,1809,1720],{"class":79},[73,1811,720],{"class":83},[73,1813,723],{"class":100},[73,1815,104],{"class":83},[73,1817,1818,1820,1822,1825,1827,1829],{"class":75,"line":343},[73,1819,1766],{"class":79},[73,1821,753],{"class":83},[73,1823,1824],{"class":100},"\"dragon-1\"",[73,1826,152],{"class":83},[73,1828,1771],{"class":100},[73,1830,183],{"class":83},[73,1832,1833,1835,1837,1839,1841,1844],{"class":75,"line":369},[73,1834,1731],{"class":79},[73,1836,1464],{"class":83},[73,1838,756],{"class":79},[73,1840,720],{"class":83},[73,1842,1843],{"class":100},"\"difference\"",[73,1845,393],{"class":83},[73,1847,1848],{"class":75,"line":396},[73,1849,1674],{"class":83},[73,1851,1852],{"class":75,"line":402},[73,1853,1369],{"class":83},[73,1855,1856],{"class":75,"line":410},[73,1857,1094],{"class":83},[11,1859,1860],{},"Operations execute sequentially — each can reference nodes created by the previous. Fewer round-trips, fewer tokens, faster workflows.",[681,1862,1864],{"id":1863},"dynamic-catalog","Dynamic catalog",[11,1866,1867,1868,1870,1871,1873],{},"Because ",[70,1869,678],{}," is a tool call — not a static schema — the catalog updates as the application evolves. Add an operation to the registry, and the next ",[70,1872,678],{}," call includes it. No MCP server redeployment. No schema versioning. No stale descriptions.",[11,1875,1876,1877,1879],{},"The same applies to ",[70,1878,1128],{}," — scene state is read via a tool call, not MCP resources. This avoids the resource support gap: tools work across all clients.",[23,1881,1883],{"id":1882},"one-executor-one-application","One executor, one application",[11,1885,1886,1887,1889],{},"The human interface gathers inputs from UI widgets and scene selection. The model interface gathers inputs from the ",[70,1888,1118],{}," request. Both produce the same shape — a params dict and a list of nodeIds — and from there, the path is identical. One executor resolves operands, validates against the schema, runs the operation, places outputs into the scene. If validation fails, the same error propagates back through whichever interface initiated it. One validation path, written once.",[11,1891,1892,1893,1896,1897,1900,1901,1904],{},"All actions — geometry, scene manipulation, camera control, data injection — are operations in the same registry. ",[70,1894,1895],{},"camera.describe"," returns the viewport's coordinate mapping. ",[70,1898,1899],{},"scene.screenshot"," captures what the human sees. ",[70,1902,1903],{},"scene.add_mesh"," injects raw vertex arrays into the scene. All discovered and executed the same way. There is one application. The model doesn't get a separate API. It gets the application.",[23,1906,1908],{"id":1907},"maintainability","Maintainability",[31,1910],{":headers":1911,":highlight":745,":rows":1912},"[\"Action\",\"Traditional MCP\",\"Schema-driven\"]","[[\"Add an operation\",\"Register tool + write handler + update docs\",\"One register() call\"],[\"Change a parameter\",\"Update tool schema + handler + UI + validation\",\"Change the schema\"],[\"Add a constraint\",\"Update validation in UI + API + wrapper\",\"Add min\u002Fmax to the input\"],[\"Remove an operation\",\"Remove tool + handler + update docs + deprecation\",\"Remove the register() call\"],[\"Test\",\"Test UI + test API + test wrapper\",\"Test the operator\"]]",[11,1914,1915,1916,1918],{},"No wrapper code. The schema is the documentation — ",[70,1917,678],{}," serves it directly.",[11,1920,1921],{},"If MCP is replaced by a different protocol, the application doesn't change — you implement a new renderer for the schema. The logic, the validation, the execution path all stay. The interface layer is disposable by design.",[1923,1924],"article-cta",{":buttons":1925},"[{\"label\":\"Open Lunar\",\"to\":\"https:\u002F\u002Flunar.polydera.com\",\"icon\":\"i-lucide-moon\"}]",[1927,1928],"cite-as",{"author":1929,"title":5},"Sajovic, {\\v{Z}}iga",[1931,1932,1933],"style",{},"html pre.shiki code .s3F5K, html code.shiki .s3F5K{--shiki-default:#9CDCFE}html pre.shiki code .sTNBD, html code.shiki .sTNBD{--shiki-default:#D4D4D4}html pre.shiki code .sCudf, html code.shiki .sCudf{--shiki-default:#DCDCAA}html pre.shiki code .sKc5r, html code.shiki .sKc5r{--shiki-default:#CE9178}html pre.shiki code .scz_3, html code.shiki .scz_3{--shiki-default:#569CD6}html pre.shiki code .sOLPB, html code.shiki .sOLPB{--shiki-default:#6A9955}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sDGX8, html code.shiki .sDGX8{--shiki-default:#B5CEA8}html pre.shiki code .sHkYM, html code.shiki .sHkYM{--shiki-default:#F44747}",{"title":68,"searchDepth":94,"depth":94,"links":1935},[1936,1937,1938,1939,1945,1946],{"id":25,"depth":94,"text":26},{"id":51,"depth":94,"text":52},{"id":611,"depth":94,"text":612},{"id":664,"depth":94,"text":665,"children":1940},[1941,1942,1943,1944],{"id":683,"depth":107,"text":684},{"id":1122,"depth":107,"text":1123},{"id":1688,"depth":107,"text":1689},{"id":1863,"depth":107,"text":1864},{"id":1882,"depth":94,"text":1883},{"id":1907,"depth":94,"text":1908},"2026-04-20","When operations are defined as typed schemas, each interface is just a rendering of the same source — UI controls for humans, tool descriptions for models. Adding a new interface is implementing a new renderer. Through dynamic discovery, this architecture eliminates maintenance drift and reduces AI context overhead by over 95% at scale.","md",[1951,1952,1953,1954,1955,1956,1957,1958,1959],"MCP context window","schema-driven MCP","AI geometry processing","MCP server design","AI integration architecture","AI CAD","AI 3D modeling","AI geometry","MCP dynamic tool discovery",{},true,"\u002Fai\u002Fschema-driven-interfaces-for-humans-and-ais",{"title":5,"description":1948},"ai\u002Fschema-driven-interfaces-for-humans-and-ais",[1966,1967,80,1968],"architecture","mcp","lunar","x2yts-kJaPZbiDOsX6KBLVw86xZ4SqFrCgwdGFoV0nE",1776780745121]