[{"data":1,"prerenderedAt":384},["ShallowReactive",2],{"navigation_docs":3,"-guide-agents":44,"-guide-agents-surround":379},[4,24],{"title":5,"path":6,"stem":7,"children":8,"icon":23},"Guide","\u002Fguide","1.guide\u002F01.index",[9,11,15,19],{"title":10,"path":6,"stem":7},"Getting started",{"title":12,"path":13,"stem":14},"CLI","\u002Fguide\u002Fcli","1.guide\u002F02.cli",{"title":16,"path":17,"stem":18},"Agents","\u002Fguide\u002Fagents","1.guide\u002F03.agents",{"title":20,"path":21,"stem":22},"Playground","\u002Fguide\u002Fplayground","1.guide\u002F04.playground","i-lucide-book-open",{"title":25,"path":26,"stem":27,"children":28,"icon":43},"Math","\u002Fmath","2.math\u002F00.index",[29,31,35,39],{"title":30,"path":26,"stem":27},"Overview",{"title":32,"path":33,"stem":34},"Curves and points","\u002Fmath\u002Fcurves","2.math\u002F01.curves",{"title":36,"path":37,"stem":38},"Orders and logs","\u002Fmath\u002Fgroups","2.math\u002F02.groups",{"title":40,"path":41,"stem":42},"secp256k1","\u002Fmath\u002Fsecp256k1","2.math\u002F03.secp256k1","i-lucide-sigma",{"id":45,"title":16,"body":46,"description":371,"extension":372,"links":373,"meta":374,"navigation":376,"path":17,"seo":377,"stem":18,"__hash__":378},"docs\u002F1.guide\u002F03.agents.md",{"type":47,"value":48,"toc":364},"minimark",[49,54,63,151,155,191,194,269,276,280,283,291,302,308,314,318,345,351,355,360],[50,51,53],"h2",{"id":52},"same-tools-every-host","Same tools, every host",[55,56,57,58,62],"p",{},"The MCP server, the Pi and OMP extensions and ",[59,60,61],"code",{},"@agntn\u002Fcurves\u002Fai"," all call the same executors. Same arguments, same checks, same text back. This site runs them too, so every full response on it is exactly what a model reads.",[64,65,66,82],"table",{},[67,68,69],"thead",{},[70,71,72,76,79],"tr",{},[73,74,75],"th",{},"Tool",[73,77,78],{},"Does",[73,80,81],{},"Arguments",[83,84,85,125],"tbody",{},[70,86,87,93,96],{},[88,89,90],"td",{},[59,91,92],{},"curves_compute",[88,94,95],{},"Arithmetic on y² = x³ + ax + b over a prime you give",[88,97,98,101,102,101,105,101,108,101,110,101,113,101,116,101,119,101,122],{},[59,99,100],{},"operation",", ",[59,103,104],{},"a",[59,106,107],{},"b",[59,109,55],{},[59,111,112],{},"point",[59,114,115],{},"other",[59,117,118],{},"scalar",[59,120,121],{},"order",[59,123,124],{},"limit",[70,126,127,132,135],{},[88,128,129],{},[59,130,131],{},"curves_secp256k1_compute",[88,133,134],{},"Point math on secp256k1 with SEC1 hex",[88,136,137,101,139,101,141,101,143,101,145,101,148],{},[59,138,100],{},[59,140,112],{},[59,142,115],{},[59,144,118],{},[59,146,147],{},"x",[59,149,150],{},"compressed",[50,152,154],{"id":153},"install","Install",[156,157,162],"pre",{"className":158,"code":159,"language":160,"meta":161,"style":161},"language-bash shiki shiki-themes compressions compressions compressions","pi install npm:@agntn\u002Fcurves\nomp install @agntn\u002Fcurves\n","bash","",[59,163,164,180],{"__ignoreMap":161},[165,166,169,173,177],"span",{"class":167,"line":168},"line",1,[165,170,172],{"class":171},"sK71F","pi",[165,174,176],{"class":175},"shU9J"," install",[165,178,179],{"class":175}," npm:@agntn\u002Fcurves\n",[165,181,183,186,188],{"class":167,"line":182},2,[165,184,185],{"class":171},"omp",[165,187,176],{"class":175},[165,189,190],{"class":175}," @agntn\u002Fcurves\n",[55,192,193],{},"Any other MCP client takes the stdio server:",[156,195,199],{"className":196,"code":197,"language":198,"meta":161,"style":161},"language-json shiki shiki-themes compressions compressions compressions","{\n  \"mcpServers\": {\n    \"curves\": { \"command\": \"npx\", \"args\": [\"-y\", \"@agntn\u002Fcurves\", \"mcp\"] }\n  }\n}\n","json",[59,200,201,207,215,257,263],{"__ignoreMap":161},[165,202,203],{"class":167,"line":168},[165,204,206],{"class":205},"s38Sx","{\n",[165,208,209,212],{"class":167,"line":182},[165,210,211],{"class":171},"  \"mcpServers\"",[165,213,214],{"class":205},": {\n",[165,216,218,221,224,227,230,233,235,238,241,244,246,249,251,254],{"class":167,"line":217},3,[165,219,220],{"class":171},"    \"curves\"",[165,222,223],{"class":205},": { ",[165,225,226],{"class":171},"\"command\"",[165,228,229],{"class":205},": ",[165,231,232],{"class":175},"\"npx\"",[165,234,101],{"class":205},[165,236,237],{"class":171},"\"args\"",[165,239,240],{"class":205},": [",[165,242,243],{"class":175},"\"-y\"",[165,245,101],{"class":205},[165,247,248],{"class":175},"\"@agntn\u002Fcurves\"",[165,250,101],{"class":205},[165,252,253],{"class":175},"\"mcp\"",[165,255,256],{"class":205},"] }\n",[165,258,260],{"class":167,"line":259},4,[165,261,262],{"class":205},"  }\n",[165,264,266],{"class":167,"line":265},5,[165,267,268],{"class":205},"}\n",[55,270,271,272,275],{},"No Node at hand? ",[59,273,274],{},"claude mcp add --transport http curves https:\u002F\u002Fcurves.agntn.dev\u002Fmcp"," gets the same two tools from this site, next to its page tools. The arithmetic runs on a Cloudflare worker then, so the public points you send ride along.",[50,277,279],{"id":278},"what-a-model-reads","What a model reads",[55,281,282],{},"One line of JSON, the same object the harness gets as details:",[156,284,289],{"className":285,"code":287,"language":288,"meta":161},[286],"language-text","{\"operation\":\"log\",\"order\":\"19\",\"scalar\":\"13\"}\n","text",[59,290,287],{"__ignoreMap":161},[55,292,293,294,297,298,301],{},"Why strings for numbers? JSON has no bigint, and a model would round a 77 digit integer without blinking. Integers go in as decimal or ",[59,295,296],{},"0x"," hex and come out as decimal. The point at infinity comes out as ",[59,299,300],{},"\"infinity\"",".",[55,303,304,307],{},[59,305,306],{},"points"," says how many there are and whether it stopped short:",[156,309,312],{"className":310,"code":311,"language":288,"meta":161},[286],"{\"operation\":\"points\",\"total\":\"18\",\"points\":[{\"x\":\"0\",\"y\":\"6\"},{\"x\":\"0\",\"y\":\"11\"},{\"x\":\"3\",\"y\":\"1\"}],\"truncated\":true}\n",[59,313,311],{"__ignoreMap":161},[50,315,317],{"id":316},"what-it-refuses","What it refuses",[319,320,321,332,335,342],"ul",{},[322,323,324,325,328,329,331],"li",{},"An argument the operation doesn't take. ",[59,326,327],{},"count"," with a ",[59,330,118],{}," is an error, not a shrug.",[322,333,334],{},"A point off the curve, a p that isn't prime, a singular curve.",[322,336,337,338,341],{},"Work past the limits in ",[104,339,36],{"href":340},"\u002Fmath\u002Fgroups#limits",". The error names the limit.",[322,343,344],{},"On secp256k1, a sum that lands on infinity. SEC1 has no form for it.",[55,346,347,348,301],{},"A blank optional string counts as missing. OMP fills every field, and a model loves an empty ",[59,349,350],{},"\"\"",[50,352,354],{"id":353},"the-scalar-is-in-the-transcript","The scalar is in the transcript",[55,356,357,359],{},[59,358,131],{}," multiplies a point by a scalar. Multiply G by a private key and you get its public key. Fine for a puzzle. But the key is now in the chat log, so pass public tweaks or keys you'd happily burn.",[361,362,363],"style",{},"html pre.shiki code .sK71F, html code.shiki .sK71F{--shiki-light:var(--shiki-token-function);--shiki-default:var(--shiki-token-function);--shiki-dark:var(--shiki-token-function)}html pre.shiki code .shU9J, html code.shiki .shU9J{--shiki-light:var(--shiki-token-string);--shiki-default:var(--shiki-token-string);--shiki-dark:var(--shiki-token-string)}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s38Sx, html code.shiki .s38Sx{--shiki-light:var(--ui-text-highlighted);--shiki-default:var(--ui-text-highlighted);--shiki-dark:var(--ui-text-highlighted)}",{"title":161,"searchDepth":182,"depth":182,"links":365},[366,367,368,369,370],{"id":52,"depth":182,"text":53},{"id":153,"depth":182,"text":154},{"id":278,"depth":182,"text":279},{"id":316,"depth":182,"text":317},{"id":353,"depth":182,"text":354},"Both tools over local or remote MCP and Pi and OMP and the AI SDK. What they take and what the model reads back","md",null,{"icon":375},"i-lucide-bot",true,{"title":16,"description":371},"dhyUYT_qE23zDW4joO1Xm4hfxYHT6_mbpG8yqFzc9YA",[380,382],{"title":12,"path":13,"stem":14,"description":381,"children":-1},"The curves command runs both tools from a terminal and prints the same JSON a model gets",{"title":20,"path":21,"stem":22,"description":383,"children":-1},"Both tools in the browser with every state in the URL",1791293523357]