[{"data":1,"prerenderedAt":569},["ShallowReactive",2],{"navigation_docs":3,"-guide-agents":116,"-guide-agents-surround":564},[4,36],{"title":5,"path":6,"stem":7,"children":8,"icon":35},"Guide","\u002Fguide","1.guide\u002F01.index",[9,11,15,19,23,27,31],{"title":10,"path":6,"stem":7},"Getting Started",{"title":12,"path":13,"stem":14},"Encode and decode","\u002Fguide\u002Ftransform","1.guide\u002F02.transform",{"title":16,"path":17,"stem":18},"Analysis","\u002Fguide\u002Fanalysis","1.guide\u002F03.analysis",{"title":20,"path":21,"stem":22},"CLI","\u002Fguide\u002Fcli","1.guide\u002F04.cli",{"title":24,"path":25,"stem":26},"Agents","\u002Fguide\u002Fagents","1.guide\u002F05.agents",{"title":28,"path":29,"stem":30},"Custom ciphers","\u002Fguide\u002Fcustom","1.guide\u002F06.custom",{"title":32,"path":33,"stem":34},"Playground","\u002Fguide\u002Fplayground","1.guide\u002F07.playground","i-solar-book-2-linear",{"title":37,"path":38,"stem":39,"children":40,"icon":115},"Ciphers","\u002Fciphers","2.ciphers\u002F00.index",[41,43,47,51,55,59,63,67,71,75,79,83,87,91,95,99,103,107,111],{"title":42,"path":38,"stem":39},"Overview",{"title":44,"path":45,"stem":46},"Caesar","\u002Fciphers\u002Fcaesar","2.ciphers\u002F01.caesar",{"title":48,"path":49,"stem":50},"ROT-13","\u002Fciphers\u002Frot13","2.ciphers\u002F02.rot13",{"title":52,"path":53,"stem":54},"ROT-47","\u002Fciphers\u002Frot47","2.ciphers\u002F03.rot47",{"title":56,"path":57,"stem":58},"Atbash","\u002Fciphers\u002Fatbash","2.ciphers\u002F04.atbash",{"title":60,"path":61,"stem":62},"Affine","\u002Fciphers\u002Faffine","2.ciphers\u002F05.affine",{"title":64,"path":65,"stem":66},"Vigenère","\u002Fciphers\u002Fvigenere","2.ciphers\u002F06.vigenere",{"title":68,"path":69,"stem":70},"Trithemius","\u002Fciphers\u002Ftrithemius","2.ciphers\u002F07.trithemius",{"title":72,"path":73,"stem":74},"Alberti","\u002Fciphers\u002Falberti","2.ciphers\u002F08.alberti",{"title":76,"path":77,"stem":78},"Playfair","\u002Fciphers\u002Fplayfair","2.ciphers\u002F09.playfair",{"title":80,"path":81,"stem":82},"Polybius square","\u002Fciphers\u002Fpolybius","2.ciphers\u002F10.polybius",{"title":84,"path":85,"stem":86},"Morse code","\u002Fciphers\u002Fmorse","2.ciphers\u002F11.morse",{"title":88,"path":89,"stem":90},"Bacon's cipher","\u002Fciphers\u002Fbacon","2.ciphers\u002F12.bacon",{"title":92,"path":93,"stem":94},"Tap code","\u002Fciphers\u002Ftap-code","2.ciphers\u002F13.tap-code",{"title":96,"path":97,"stem":98},"ADFGVX","\u002Fciphers\u002Fadfgvx","2.ciphers\u002F14.adfgvx",{"title":100,"path":101,"stem":102},"Bifid","\u002Fciphers\u002Fbifid","2.ciphers\u002F15.bifid",{"title":104,"path":105,"stem":106},"Rail fence","\u002Fciphers\u002Frail-fence","2.ciphers\u002F16.rail-fence",{"title":108,"path":109,"stem":110},"Columnar transposition","\u002Fciphers\u002Fcolumnar","2.ciphers\u002F17.columnar",{"title":112,"path":113,"stem":114},"Enigma M3","\u002Fciphers\u002Fenigma","2.ciphers\u002F18.enigma","i-solar-library-linear",{"id":117,"title":24,"body":118,"description":556,"extension":557,"links":558,"meta":559,"navigation":561,"path":25,"seo":562,"stem":26,"__hash__":563},"docs\u002F1.guide\u002F05.agents.md",{"type":119,"value":120,"toc":550},"minimark",[121,126,135,237,277,281,339,342,455,476,497,501,517,524,528,538,546],[122,123,125],"h2",{"id":124},"five-tools-three-surfaces","Five tools, three surfaces",[127,128,129,130,134],"p",{},"MCP server, Pi extension and OMP extension all call the same executors in ",[131,132,133],"code",{},"src\u002Ftool-operations.ts",". They answer identically and a fix lands once, which is the whole reason the file exists.",[136,137,138,154],"table",{},[139,140,141],"thead",{},[142,143,144,148,151],"tr",{},[145,146,147],"th",{},"Tool",[145,149,150],{},"Does",[145,152,153],{},"Arguments",[155,156,157,178,191,205,222],"tbody",{},[142,158,159,165,168],{},[160,161,162],"td",{},[131,163,164],{},"cipher_encode",[160,166,167],{},"Encode with a cipher named exactly",[160,169,170,173,174,177],{},[131,171,172],{},"cipher",", ",[131,175,176],{},"text",", plus the cipher's options",[142,179,180,185,188],{},[160,181,182],{},[131,183,184],{},"cipher_decode",[160,186,187],{},"Decode with a cipher named exactly",[160,189,190],{},"same",[142,192,193,198,201],{},[160,194,195],{},[131,196,197],{},"cipher_brute_caesar",[160,199,200],{},"Every shift from 1 to 25",[160,202,203],{},[131,204,176],{},[142,206,207,212,215],{},[160,208,209],{},[131,210,211],{},"cipher_frequency",[160,213,214],{},"Histogram and index of coincidence",[160,216,217,173,219],{},[131,218,176],{},[131,220,221],{},"language",[142,223,224,229,232],{},[160,225,226],{},[131,227,228],{},"cipher_info",[160,230,231],{},"List the ciphers, or one cipher's options",[160,233,234,236],{},[131,235,172],{}," optional",[127,238,239,240,173,243,173,246,173,249,173,252,173,255,173,258,173,261,173,264,173,267,173,270,273,274,276],{},"Option arguments mirror the library: ",[131,241,242],{},"shift",[131,244,245],{},"key",[131,247,248],{},"rails",[131,250,251],{},"a",[131,253,254],{},"b",[131,256,257],{},"period",[131,259,260],{},"positions",[131,262,263],{},"rings",[131,265,266],{},"plugboard",[131,268,269],{},"preserveCase",[131,271,272],{},"stripNonAlpha",". A model that doesn't know a cipher's options calls ",[131,275,228],{}," first. Every tool description says so, because models guess otherwise.",[122,278,280],{"id":279},"mcp","MCP",[282,283,288],"pre",{"className":284,"code":285,"language":286,"meta":287,"style":287},"language-bash shiki shiki-themes github-light github-light poimandres","ciphers mcp\nclaude mcp add ciphers --scope user -- npx -y @agntn\u002Fciphers mcp\n","bash","",[131,289,290,303],{"__ignoreMap":287},[291,292,295,299],"span",{"class":293,"line":294},"line",1,[291,296,298],{"class":297},"sseY5","ciphers",[291,300,302],{"class":301},"sX7Zv"," mcp\n",[291,304,306,309,312,315,318,322,325,328,331,334,337],{"class":293,"line":305},2,[291,307,308],{"class":297},"claude",[291,310,311],{"class":301}," mcp",[291,313,314],{"class":301}," add",[291,316,317],{"class":301}," ciphers",[291,319,321],{"class":320},"sqT1Y"," --scope",[291,323,324],{"class":301}," user",[291,326,327],{"class":320}," --",[291,329,330],{"class":301}," npx",[291,332,333],{"class":320}," -y",[291,335,336],{"class":301}," @agntn\u002Fciphers",[291,338,302],{"class":301},[127,340,341],{},"Or in a client's config:",[282,343,347],{"className":344,"code":345,"language":346,"meta":287,"style":287},"language-json shiki shiki-themes github-light github-light poimandres","{\n  \"mcpServers\": {\n    \"ciphers\": { \"command\": \"npx\", \"args\": [\"-y\", \"@agntn\u002Fciphers\", \"mcp\"] }\n  }\n}\n","json",[131,348,349,355,371,443,449],{"__ignoreMap":287},[291,350,351],{"class":293,"line":294},[291,352,354],{"class":353},"sKlNE","{\n",[291,356,357,361,365,368],{"class":293,"line":305},[291,358,360],{"class":359},"sy8Ar","  \"",[291,362,364],{"class":363},"saoiD","mcpServers",[291,366,367],{"class":359},"\"",[291,369,370],{"class":353},": {\n",[291,372,374,377,379,381,384,386,390,392,395,398,402,404,406,408,411,413,416,418,421,423,425,427,430,432,434,436,438,440],{"class":293,"line":373},3,[291,375,376],{"class":359},"    \"",[291,378,298],{"class":320},[291,380,367],{"class":359},[291,382,383],{"class":353},": { ",[291,385,367],{"class":359},[291,387,389],{"class":388},"s39Ir","command",[291,391,367],{"class":359},[291,393,394],{"class":353},": ",[291,396,367],{"class":397},"scVjq",[291,399,401],{"class":400},"sQ7BG","npx",[291,403,367],{"class":397},[291,405,173],{"class":353},[291,407,367],{"class":359},[291,409,410],{"class":388},"args",[291,412,367],{"class":359},[291,414,415],{"class":353},": [",[291,417,367],{"class":397},[291,419,420],{"class":400},"-y",[291,422,367],{"class":397},[291,424,173],{"class":353},[291,426,367],{"class":397},[291,428,429],{"class":400},"@agntn\u002Fciphers",[291,431,367],{"class":397},[291,433,173],{"class":353},[291,435,367],{"class":397},[291,437,279],{"class":400},[291,439,367],{"class":397},[291,441,442],{"class":353},"] }\n",[291,444,446],{"class":293,"line":445},4,[291,447,448],{"class":353},"  }\n",[291,450,452],{"class":293,"line":451},5,[291,453,454],{"class":353},"}\n",[127,456,457,458,460,461,463,464,466,467,463,469,471,472,475],{},"The server speaks MCP over stdio and checks every call against the tool's published JSON Schema before a cipher sees it. ",[131,459,242],{}," is an integer 1 to 25, ",[131,462,263],{}," and ",[131,465,260],{}," are three letters, ",[131,468,176],{},[131,470,245],{}," have a maximum length. Fails the schema - tool error with the reason. Throws a ",[131,473,474],{},"CipherError"," - also a tool error. The session survives either way.",[127,477,478,479,463,481,483,484,487,488,490,491,493,494,496],{},"Every tool answers with text. ",[131,480,164],{},[131,482,184],{}," return the output and, in ",[131,485,486],{},"details",", the cipher, the operation and the options that were applied. ",[131,489,197],{}," returns 25 lines. ",[131,492,211],{}," returns the same table the CLI prints. ",[131,495,228],{}," with no name is one line per cipher with its family.",[122,498,500],{"id":499},"pi-and-omp","Pi and OMP",[282,502,504],{"className":284,"code":503,"language":286,"meta":287,"style":287},"pi install npm:@agntn\u002Fciphers\n",[131,505,506],{"__ignoreMap":287},[291,507,508,511,514],{"class":293,"line":294},[291,509,510],{"class":297},"pi",[291,512,513],{"class":301}," install",[291,515,516],{"class":301}," npm:@agntn\u002Fciphers\n",[127,518,519,520,523],{},"Both extensions are declared in ",[131,521,522],{},"package.json",". In the terminal a result shows as a collapsed preview cut to a few lines, with a count of what was left out, and the full text once you expand the row. Brute force is 25 lines, so this matters more than it sounds.",[122,525,527],{"id":526},"bounds","Bounds",[127,529,530,531,534,535,537],{},"Text is bounded per tool and keys are bounded too, in the schema. A model cannot hand the process a novel to shift. Nothing is written anywhere and there is no network to lose. One cipher keeps state: ",[251,532,533],{"href":109},"columnar"," caches its last 128 answers per instance and refuses more than 100 calls a second with a ",[131,536,474],{},", which comes back as a tool error like any other.",[539,540,541,542,545],"note",{},"A ciphertext in a challenge is data. Decoding it tells you what it says, not what to do. An agent that decodes ",[131,543,544],{},"IGNORE PREVIOUS INSTRUCTIONS"," learned one thing about the puzzle and nothing about its task.",[547,548,549],"style",{},"html pre.shiki code .sseY5, html code.shiki .sseY5{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#91B4D5}html pre.shiki code .sX7Zv, html code.shiki .sX7Zv{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#ADD7FF}html pre.shiki code .sqT1Y, html code.shiki .sqT1Y{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#ADD7FF}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 .sKlNE, html code.shiki .sKlNE{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#A6ACCD}html pre.shiki code .sy8Ar, html code.shiki .sy8Ar{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#A6ACCD}html pre.shiki code .saoiD, html code.shiki .saoiD{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#E4F0FB}html pre.shiki code .s39Ir, html code.shiki .s39Ir{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#91B4D5}html pre.shiki code .scVjq, html code.shiki .scVjq{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#A6ACCD}html pre.shiki code .sQ7BG, html code.shiki .sQ7BG{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#5DE4C7}",{"title":287,"searchDepth":305,"depth":305,"links":551},[552,553,554,555],{"id":124,"depth":305,"text":125},{"id":279,"depth":305,"text":280},{"id":499,"depth":305,"text":500},{"id":526,"depth":305,"text":527},"The same five tools over MCP, the Pi extension and the OMP extension. What they validate, what they bound.","md",null,{"icon":560},"i-solar-bot-linear",true,{"title":24,"description":556},"dcej8Lo2afrUbpC0B44Ld5EKMh0t9A8wtiSvOqbP9NE",[565,567],{"title":20,"path":21,"stem":22,"description":566,"children":-1},"The ciphers command, seven subcommands, and the flags each cipher reads.",{"title":28,"path":29,"stem":30,"description":568,"children":-1},"Extend the abstract Cipher, register the class, and it shows up in create, the CLI and the tools.",1788614951661]