[{"data":1,"prerenderedAt":659},["ShallowReactive",2],{"navigation_docs":3,"-guide-agents":180,"-guide-agents-surround":654},[4,44],{"title":5,"path":6,"stem":7,"children":8,"icon":43},"Guide","\u002Fguide","1.guide\u002F01.index",[9,11,15,19,23,27,31,35,39],{"title":10,"path":6,"stem":7},"Getting Started",{"title":12,"path":13,"stem":14},"Registry and aliases","\u002Fguide\u002Fregistry","1.guide\u002F02.registry",{"title":16,"path":17,"stem":18},"Address validation","\u002Fguide\u002Fvalidation","1.guide\u002F03.validation",{"title":20,"path":21,"stem":22},"Identify","\u002Fguide\u002Fidentify","1.guide\u002F04.identify",{"title":24,"path":25,"stem":26},"Metadata","\u002Fguide\u002Fmetadata","1.guide\u002F05.metadata",{"title":28,"path":29,"stem":30},"CLI","\u002Fguide\u002Fcli","1.guide\u002F06.cli",{"title":32,"path":33,"stem":34},"Agents","\u002Fguide\u002Fagents","1.guide\u002F07.agents",{"title":36,"path":37,"stem":38},"Custom chains","\u002Fguide\u002Fcustom","1.guide\u002F08.custom",{"title":40,"path":41,"stem":42},"Playground","\u002Fguide\u002Fplayground","1.guide\u002F09.playground","i-lucide-book-open",{"title":45,"path":46,"stem":47,"children":48,"icon":179},"Chains","\u002Fchains","2.chains\u002F00.index",[49,51,55,59,63,67,71,75,79,83,87,91,95,99,103,107,111,115,119,123,127,131,135,139,143,147,151,155,159,163,167,171,175],{"title":50,"path":46,"stem":47},"Overview",{"title":52,"path":53,"stem":54},"Ethereum","\u002Fchains\u002Fethereum","2.chains\u002F01.ethereum",{"title":56,"path":57,"stem":58},"Base","\u002Fchains\u002Fbase","2.chains\u002F02.base",{"title":60,"path":61,"stem":62},"Arbitrum One","\u002Fchains\u002Farbitrum","2.chains\u002F03.arbitrum",{"title":64,"path":65,"stem":66},"Optimism","\u002Fchains\u002Foptimism","2.chains\u002F04.optimism",{"title":68,"path":69,"stem":70},"Polygon PoS","\u002Fchains\u002Fpolygon","2.chains\u002F05.polygon",{"title":72,"path":73,"stem":74},"BNB Chain","\u002Fchains\u002Fbsc","2.chains\u002F06.bsc",{"title":76,"path":77,"stem":78},"Avalanche C-Chain","\u002Fchains\u002Favalanche","2.chains\u002F07.avalanche",{"title":80,"path":81,"stem":82},"Fantom Opera","\u002Fchains\u002Ffantom","2.chains\u002F08.fantom",{"title":84,"path":85,"stem":86},"Gnosis Chain","\u002Fchains\u002Fgnosis","2.chains\u002F09.gnosis",{"title":88,"path":89,"stem":90},"Linea","\u002Fchains\u002Flinea","2.chains\u002F10.linea",{"title":92,"path":93,"stem":94},"zkSync Era","\u002Fchains\u002Fzksync","2.chains\u002F11.zksync",{"title":96,"path":97,"stem":98},"Scroll","\u002Fchains\u002Fscroll","2.chains\u002F12.scroll",{"title":100,"path":101,"stem":102},"Berachain","\u002Fchains\u002Fberachain","2.chains\u002F13.berachain",{"title":104,"path":105,"stem":106},"Bitcoin","\u002Fchains\u002Fbitcoin","2.chains\u002F14.bitcoin",{"title":108,"path":109,"stem":110},"Litecoin","\u002Fchains\u002Flitecoin","2.chains\u002F15.litecoin",{"title":112,"path":113,"stem":114},"Pepecoin","\u002Fchains\u002Fpepecoin","2.chains\u002F16.pepecoin",{"title":116,"path":117,"stem":118},"eCash","\u002Fchains\u002Fecash","2.chains\u002F17.ecash",{"title":120,"path":121,"stem":122},"Cardano","\u002Fchains\u002Fcardano","2.chains\u002F18.cardano",{"title":124,"path":125,"stem":126},"Solana","\u002Fchains\u002Fsolana","2.chains\u002F19.solana",{"title":128,"path":129,"stem":130},"Stellar","\u002Fchains\u002Fstellar","2.chains\u002F20.stellar",{"title":132,"path":133,"stem":134},"XRP Ledger","\u002Fchains\u002Fxrpl","2.chains\u002F21.xrpl",{"title":136,"path":137,"stem":138},"Aptos","\u002Fchains\u002Faptos","2.chains\u002F22.aptos",{"title":140,"path":141,"stem":142},"Sui","\u002Fchains\u002Fsui","2.chains\u002F23.sui",{"title":144,"path":145,"stem":146},"TON (The Open Network)","\u002Fchains\u002Fton","2.chains\u002F24.ton",{"title":148,"path":149,"stem":150},"TRON","\u002Fchains\u002Ftron","2.chains\u002F25.tron",{"title":152,"path":153,"stem":154},"Octra","\u002Fchains\u002Foctra","2.chains\u002F26.octra",{"title":156,"path":157,"stem":158},"Arweave","\u002Fchains\u002Farweave","2.chains\u002F27.arweave",{"title":160,"path":161,"stem":162},"Monero","\u002Fchains\u002Fmonero","2.chains\u002F28.monero",{"title":164,"path":165,"stem":166},"Decred","\u002Fchains\u002Fdecred","2.chains\u002F29.decred",{"title":168,"path":169,"stem":170},"Arc","\u002Fchains\u002Farc","2.chains\u002F30.arc",{"title":172,"path":173,"stem":174},"Dogecoin","\u002Fchains\u002Fdogecoin","2.chains\u002F31.dogecoin",{"title":176,"path":177,"stem":178},"Bitcoin Cash","\u002Fchains\u002Fbitcoincash","2.chains\u002F32.bitcoincash","i-lucide-link",{"id":181,"title":32,"body":182,"description":646,"extension":647,"links":648,"meta":649,"navigation":651,"path":33,"seo":652,"stem":34,"__hash__":653},"docs\u002F1.guide\u002F07.agents.md",{"type":183,"value":184,"toc":639},"minimark",[185,190,199,302,312,316,374,377,490,513,517,523,531,538,544,548,575,578,582,598,620,631,635],[186,187,189],"h2",{"id":188},"five-tools-three-surfaces","Five tools, three surfaces",[191,192,193,194,198],"p",{},"MCP server, Pi extension and OMP extension all call the same executors in ",[195,196,197],"code",{},"src\u002Ftool-operations.ts",". They answer identically and a fix lands once.",[200,201,202,218],"table",{},[203,204,205],"thead",{},[206,207,208,212,215],"tr",{},[209,210,211],"th",{},"Tool",[209,213,214],{},"Does",[209,216,217],{},"Arguments",[219,220,221,237,255,272,286],"tbody",{},[206,222,223,229,232],{},[224,225,226],"td",{},[195,227,228],{},"chains_lookup",[224,230,231],{},"Resolve a chain and return its metadata",[224,233,234],{},[195,235,236],{},"chain",[206,238,239,244,247],{},[224,240,241],{},[195,242,243],{},"chains_validate_address",[224,245,246],{},"Check an address against one chain's format",[224,248,249,251,252],{},[195,250,236],{},", ",[195,253,254],{},"address",[206,256,257,262,265],{},[224,258,259],{},[195,260,261],{},"chains_validate_txid",[224,263,264],{},"Check a transaction id against one chain's format",[224,266,267,251,269],{},[195,268,236],{},[195,270,271],{},"txid",[206,273,274,279,282],{},[224,275,276],{},[195,277,278],{},"chains_identify_address",[224,280,281],{},"Run an address through every validator",[224,283,284],{},[195,285,254],{},[206,287,288,293,296],{},[224,289,290],{},[195,291,292],{},"chains_list",[224,294,295],{},"The registry, optionally one family",[224,297,298,301],{},[195,299,300],{},"family"," optional",[191,303,304,306,307,311],{},[195,305,236],{}," is a key, name, symbol or alias, the same thing ",[308,309,310],"a",{"href":13},"getChain"," takes. Every tool is annotated read only, idempotent and closed world, because none of them touches anything outside the process.",[186,313,315],{"id":314},"mcp","MCP",[317,318,323],"pre",{"className":319,"code":320,"language":321,"meta":322,"style":322},"language-bash shiki shiki-themes github-light github-light poimandres","chains mcp\nclaude mcp add chains --scope user -- npx -y @agntn\u002Fchains mcp\n","bash","",[195,324,325,338],{"__ignoreMap":322},[326,327,330,334],"span",{"class":328,"line":329},"line",1,[326,331,333],{"class":332},"sseY5","chains",[326,335,337],{"class":336},"sX7Zv"," mcp\n",[326,339,341,344,347,350,353,357,360,363,366,369,372],{"class":328,"line":340},2,[326,342,343],{"class":332},"claude",[326,345,346],{"class":336}," mcp",[326,348,349],{"class":336}," add",[326,351,352],{"class":336}," chains",[326,354,356],{"class":355},"sqT1Y"," --scope",[326,358,359],{"class":336}," user",[326,361,362],{"class":355}," --",[326,364,365],{"class":336}," npx",[326,367,368],{"class":355}," -y",[326,370,371],{"class":336}," @agntn\u002Fchains",[326,373,337],{"class":336},[191,375,376],{},"Or in a client's config:",[317,378,382],{"className":379,"code":380,"language":381,"meta":322,"style":322},"language-json shiki shiki-themes github-light github-light poimandres","{\n  \"mcpServers\": {\n    \"chains\": { \"command\": \"npx\", \"args\": [\"-y\", \"@agntn\u002Fchains\", \"mcp\"] }\n  }\n}\n","json",[195,383,384,390,406,478,484],{"__ignoreMap":322},[326,385,386],{"class":328,"line":329},[326,387,389],{"class":388},"sKlNE","{\n",[326,391,392,396,400,403],{"class":328,"line":340},[326,393,395],{"class":394},"sy8Ar","  \"",[326,397,399],{"class":398},"saoiD","mcpServers",[326,401,402],{"class":394},"\"",[326,404,405],{"class":388},": {\n",[326,407,409,412,414,416,419,421,425,427,430,433,437,439,441,443,446,448,451,453,456,458,460,462,465,467,469,471,473,475],{"class":328,"line":408},3,[326,410,411],{"class":394},"    \"",[326,413,333],{"class":355},[326,415,402],{"class":394},[326,417,418],{"class":388},": { ",[326,420,402],{"class":394},[326,422,424],{"class":423},"s39Ir","command",[326,426,402],{"class":394},[326,428,429],{"class":388},": ",[326,431,402],{"class":432},"scVjq",[326,434,436],{"class":435},"sQ7BG","npx",[326,438,402],{"class":432},[326,440,251],{"class":388},[326,442,402],{"class":394},[326,444,445],{"class":423},"args",[326,447,402],{"class":394},[326,449,450],{"class":388},": [",[326,452,402],{"class":432},[326,454,455],{"class":435},"-y",[326,457,402],{"class":432},[326,459,251],{"class":388},[326,461,402],{"class":432},[326,463,464],{"class":435},"@agntn\u002Fchains",[326,466,402],{"class":432},[326,468,251],{"class":388},[326,470,402],{"class":432},[326,472,314],{"class":435},[326,474,402],{"class":432},[326,476,477],{"class":388},"] }\n",[326,479,481],{"class":328,"line":480},4,[326,482,483],{"class":388},"  }\n",[326,485,487],{"class":328,"line":486},5,[326,488,489],{"class":388},"}\n",[191,491,492,493,495,496,498,499,501,502,504,505,508,509,512],{},"The server speaks MCP over stdio and checks every call against the tool's JSON Schema before an executor sees it: ",[195,494,236],{}," is 1 to 64 characters, ",[195,497,254],{}," and ",[195,500,271],{}," 1 to 256, ",[195,503,300],{}," 1 to 32. A model can't hand the process a novel to decode. ",[195,506,507],{},"createMcpServer()"," is exported from ",[195,510,511],{},"@agntn\u002Fchains\u002Fmcp"," for hosts that bring their own transport.",[186,514,516],{"id":515},"what-the-text-carries","What the text carries",[191,518,519,520,522],{},"An MCP client sees the text a tool returns and nothing else, so the text carries the whole answer. ",[195,521,228],{}," prints every metadata field on a hit:",[317,524,529],{"className":525,"code":527,"language":528,"meta":322},[526],"language-text","Polygon PoS (polygon)\nsymbol: POL\ndecimals: 18\ntype: evm\nchainId: 0x89\ncaip2: eip155:137\nbip44: 60\nexplorer: https:\u002F\u002Fpolygonscan.com\nrpc: https:\u002F\u002Fpolygon-bor-rpc.publicnode.com\n","text",[195,530,527],{"__ignoreMap":322},[191,532,533,534,537],{},"Absent fields say so out loud, ",[195,535,536],{},"bip44: none (no registered SLIP-0044 coin type)",", rather than vanishing, because a missing coin type reads as \"not shown\" and invites the caller to supply one from memory. A derivation path on an invented coin type silently produces the wrong addresses.",[191,539,540,541,543],{},"When resolution fails the text names the registered keys, so the next call has somewhere to go. ",[195,542,292],{}," exists for the same reason: without it the only way to learn what the registry holds is to send a value you expect to fail.",[186,545,547],{"id":546},"what-sets-iserror","What sets isError",[191,549,550,551,553,554,557,558,561,562,564,565,567,568,571,572,574],{},"A rejected address is an answer, not a tool error. ",[195,552,243],{}," on a bad address returns ",[195,555,556],{},"Invalid Bitcoin (bitcoin) address: \"…\""," with ",[195,559,560],{},"isError"," unset. Only an unresolvable chain or a chain with no validator sets ",[195,563,560],{},", because then nothing was checked. ",[195,566,261],{}," works the same way. Every chain that ships checks txids, so the missing validator is only ever a custom chain that skipped ",[195,569,570],{},"assertTxid",", and a call against it is a tool error, not a rejection. ",[195,573,278],{}," never sets it, a miss everywhere is still an answer.",[191,576,577],{},"The address in an answer comes back quoted. It arrives from whatever the caller was reading, and a newline inside one would otherwise write its own line, so a rejected address could read as a match on the chain about to be funded.",[186,579,581],{"id":580},"pi-and-omp","Pi and OMP",[317,583,585],{"className":319,"code":584,"language":321,"meta":322,"style":322},"pi install npm:@agntn\u002Fchains\n",[195,586,587],{"__ignoreMap":322},[326,588,589,592,595],{"class":328,"line":329},[326,590,591],{"class":332},"pi",[326,593,594],{"class":336}," install",[326,596,597],{"class":336}," npm:@agntn\u002Fchains\n",[191,599,600,601,604,605,608,609,612,613,616,617,619],{},"Both extensions are declared in ",[195,602,603],{},"package.json",". They add ",[195,606,607],{},"details"," next to the text, the structured object the harness renders: the metadata for a lookup, ",[195,610,611],{},"{ chain, address, valid, reason }"," for an address check and ",[195,614,615],{},"{ chain, txid, valid, reason }"," for a txid, the two key arrays for identify. MCP drops ",[195,618,607],{}," and keeps the text.",[191,621,622,623,626,627,630],{},"The extensions prefer the built executors in ",[195,624,625],{},"dist\u002F"," and fall back to source only when it's missing. Without ",[195,628,629],{},"pnpm build"," the tools still register and the first call dies with a module resolution error, which is the kind of thing worth knowing before a demo.",[632,633,634],"note",{},"An address in a prompt is data. Validating it tells you whether it fits a format, not what to do with it. And a match on fourteen EVM chains is fourteen possibilities, not a chain name.",[636,637,638],"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":322,"searchDepth":340,"depth":340,"links":640},[641,642,643,644,645],{"id":188,"depth":340,"text":189},{"id":314,"depth":340,"text":315},{"id":515,"depth":340,"text":516},{"id":546,"depth":340,"text":547},{"id":580,"depth":340,"text":581},"The same five tools over MCP and the Pi and OMP extensions. What the text carries and what sets isError. What a model can't hand the process.","md",null,{"icon":650},"i-lucide-bot",true,{"title":32,"description":646},"pLYA9i9CknRXUlLonDOv8wMCvQQU8dXHFCfIh7KdRW0",[655,657],{"title":28,"path":29,"stem":30,"description":656,"children":-1},"The chains command. Six subcommands and what each prints. Which ones exit 1.",{"title":36,"path":37,"stem":38,"description":658,"children":-1},"Extend the abstract Chain with a key and a validator and register the class. From then on the registry treats it like a built-in.",1790261451460]