[{"data":1,"prerenderedAt":616},["ShallowReactive",2],{"navigation_docs":3,"-guide-agents":168,"-guide-agents-surround":611},[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":167},"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],{"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","i-lucide-link",{"id":169,"title":32,"body":170,"description":603,"extension":604,"links":605,"meta":606,"navigation":608,"path":33,"seo":609,"stem":34,"__hash__":610},"docs\u002F1.guide\u002F07.agents.md",{"type":171,"value":172,"toc":596},"minimark",[173,178,187,273,283,287,345,348,461,481,485,491,499,506,512,516,536,539,543,559,577,588,592],[174,175,177],"h2",{"id":176},"four-tools-three-surfaces","Four tools, three surfaces",[179,180,181,182,186],"p",{},"MCP server, Pi extension and OMP extension all call the same executors in ",[183,184,185],"code",{},"src\u002Ftool-operations.ts",". They answer identically and a fix lands once.",[188,189,190,206],"table",{},[191,192,193],"thead",{},[194,195,196,200,203],"tr",{},[197,198,199],"th",{},"Tool",[197,201,202],{},"Does",[197,204,205],{},"Arguments",[207,208,209,225,243,257],"tbody",{},[194,210,211,217,220],{},[212,213,214],"td",{},[183,215,216],{},"chains_lookup",[212,218,219],{},"Resolve a chain and return its metadata",[212,221,222],{},[183,223,224],{},"chain",[194,226,227,232,235],{},[212,228,229],{},[183,230,231],{},"chains_validate_address",[212,233,234],{},"Check an address against one chain's format",[212,236,237,239,240],{},[183,238,224],{},", ",[183,241,242],{},"address",[194,244,245,250,253],{},[212,246,247],{},[183,248,249],{},"chains_identify_address",[212,251,252],{},"Run an address through every validator",[212,254,255],{},[183,256,242],{},[194,258,259,264,267],{},[212,260,261],{},[183,262,263],{},"chains_list",[212,265,266],{},"The registry, optionally one family",[212,268,269,272],{},[183,270,271],{},"family"," optional",[179,274,275,277,278,282],{},[183,276,224],{}," is a key, name, symbol or alias, the same thing ",[279,280,281],"a",{"href":13},"getChain"," takes. Every tool is annotated read only, idempotent and closed world, because none of them touches anything outside the process.",[174,284,286],{"id":285},"mcp","MCP",[288,289,294],"pre",{"className":290,"code":291,"language":292,"meta":293,"style":293},"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","",[183,295,296,309],{"__ignoreMap":293},[297,298,301,305],"span",{"class":299,"line":300},"line",1,[297,302,304],{"class":303},"sseY5","chains",[297,306,308],{"class":307},"sX7Zv"," mcp\n",[297,310,312,315,318,321,324,328,331,334,337,340,343],{"class":299,"line":311},2,[297,313,314],{"class":303},"claude",[297,316,317],{"class":307}," mcp",[297,319,320],{"class":307}," add",[297,322,323],{"class":307}," chains",[297,325,327],{"class":326},"sqT1Y"," --scope",[297,329,330],{"class":307}," user",[297,332,333],{"class":326}," --",[297,335,336],{"class":307}," npx",[297,338,339],{"class":326}," -y",[297,341,342],{"class":307}," @agntn\u002Fchains",[297,344,308],{"class":307},[179,346,347],{},"Or in a client's config:",[288,349,353],{"className":350,"code":351,"language":352,"meta":293,"style":293},"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",[183,354,355,361,377,449,455],{"__ignoreMap":293},[297,356,357],{"class":299,"line":300},[297,358,360],{"class":359},"sKlNE","{\n",[297,362,363,367,371,374],{"class":299,"line":311},[297,364,366],{"class":365},"sy8Ar","  \"",[297,368,370],{"class":369},"saoiD","mcpServers",[297,372,373],{"class":365},"\"",[297,375,376],{"class":359},": {\n",[297,378,380,383,385,387,390,392,396,398,401,404,408,410,412,414,417,419,422,424,427,429,431,433,436,438,440,442,444,446],{"class":299,"line":379},3,[297,381,382],{"class":365},"    \"",[297,384,304],{"class":326},[297,386,373],{"class":365},[297,388,389],{"class":359},": { ",[297,391,373],{"class":365},[297,393,395],{"class":394},"s39Ir","command",[297,397,373],{"class":365},[297,399,400],{"class":359},": ",[297,402,373],{"class":403},"scVjq",[297,405,407],{"class":406},"sQ7BG","npx",[297,409,373],{"class":403},[297,411,239],{"class":359},[297,413,373],{"class":365},[297,415,416],{"class":394},"args",[297,418,373],{"class":365},[297,420,421],{"class":359},": [",[297,423,373],{"class":403},[297,425,426],{"class":406},"-y",[297,428,373],{"class":403},[297,430,239],{"class":359},[297,432,373],{"class":403},[297,434,435],{"class":406},"@agntn\u002Fchains",[297,437,373],{"class":403},[297,439,239],{"class":359},[297,441,373],{"class":403},[297,443,285],{"class":406},[297,445,373],{"class":403},[297,447,448],{"class":359},"] }\n",[297,450,452],{"class":299,"line":451},4,[297,453,454],{"class":359},"  }\n",[297,456,458],{"class":299,"line":457},5,[297,459,460],{"class":359},"}\n",[179,462,463,464,466,467,469,470,472,473,476,477,480],{},"The server speaks MCP over stdio and checks every call against the tool's JSON Schema before an executor sees it: ",[183,465,224],{}," is 1 to 64 characters, ",[183,468,242],{}," 1 to 256, ",[183,471,271],{}," 1 to 32. A model can't hand the process a novel to decode. ",[183,474,475],{},"createMcpServer()"," is exported from ",[183,478,479],{},"@agntn\u002Fchains\u002Fmcp"," for hosts that bring their own transport.",[174,482,484],{"id":483},"what-the-text-carries","What the text carries",[179,486,487,488,490],{},"An MCP client sees the text a tool returns and nothing else, so the text carries the whole answer. ",[183,489,216],{}," prints every metadata field on a hit:",[288,492,497],{"className":493,"code":495,"language":496,"meta":293},[494],"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",[183,498,495],{"__ignoreMap":293},[179,500,501,502,505],{},"Absent fields say so out loud, ",[183,503,504],{},"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.",[179,507,508,509,511],{},"When resolution fails the text names the registered keys, so the next call has somewhere to go. ",[183,510,263],{}," 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.",[174,513,515],{"id":514},"what-sets-iserror","What sets isError",[179,517,518,519,521,522,525,526,529,530,532,533,535],{},"A rejected address is an answer, not a tool error. ",[183,520,231],{}," on a bad address returns ",[183,523,524],{},"Invalid Bitcoin (bitcoin) address: \"…\""," with ",[183,527,528],{},"isError"," unset. Only an unresolvable chain or a chain with no validator sets ",[183,531,528],{},", because then nothing was checked. ",[183,534,249],{}," never sets it, a miss everywhere is still an answer.",[179,537,538],{},"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.",[174,540,542],{"id":541},"pi-and-omp","Pi and OMP",[288,544,546],{"className":290,"code":545,"language":292,"meta":293,"style":293},"pi install npm:@agntn\u002Fchains\n",[183,547,548],{"__ignoreMap":293},[297,549,550,553,556],{"class":299,"line":300},[297,551,552],{"class":303},"pi",[297,554,555],{"class":307}," install",[297,557,558],{"class":307}," npm:@agntn\u002Fchains\n",[179,560,561,562,565,566,569,570,573,574,576],{},"Both extensions are declared in ",[183,563,564],{},"package.json",". They add ",[183,567,568],{},"details"," next to the text, the structured object the harness renders: the metadata for a lookup, ",[183,571,572],{},"{ chain, address, valid, reason }"," for a check, the two key arrays for identify. MCP drops ",[183,575,568],{}," and keeps the text.",[179,578,579,580,583,584,587],{},"The extensions prefer the built executors in ",[183,581,582],{},"dist\u002F"," and fall back to source only when it's missing. Without ",[183,585,586],{},"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.",[589,590,591],"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 thirteen EVM chains is thirteen possibilities, not a chain name.",[593,594,595],"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":293,"searchDepth":311,"depth":311,"links":597},[598,599,600,601,602],{"id":176,"depth":311,"text":177},{"id":285,"depth":311,"text":286},{"id":483,"depth":311,"text":484},{"id":514,"depth":311,"text":515},{"id":541,"depth":311,"text":542},"The same four 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":607},"i-lucide-bot",true,{"title":32,"description":603},"0soe2JslvfBYd67rO92dzyanKXy9K7uw-8quNZeXQ3I",[612,614],{"title":28,"path":29,"stem":30,"description":613,"children":-1},"The chains command. Six subcommands and what each prints. Which ones exit 1.",{"title":36,"path":37,"stem":38,"description":615,"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.",1789393739618]