{"serverId":"mcp-registry/com.formatho/runtime","tools":[{"name":"base64.decode","fixed":{"name":"base64_decode","description":"Base64-decode to text. [data · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["base64"],"properties":{"base64":{"type":"string","minLength":1}},"additionalProperties":false},"title":"base64.decode"},"changes":[{"kind":"name","detail":"Renamed \"base64.decode\" → \"base64_decode\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":87,"tokensAfter":87},{"name":"base64.encode","fixed":{"name":"base64_encode","description":"Base64-encode text (standard alphabet). [data · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["text"],"properties":{"text":{"type":"string"}},"additionalProperties":false},"title":"base64.encode"},"changes":[{"kind":"name","detail":"Renamed \"base64.encode\" → \"base64_encode\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":87,"tokensAfter":87},{"name":"case.convert","fixed":{"name":"case_convert","description":"Convert an identifier between camelCase, snake_case, kebab-case, CONSTANT_CASE, and Title Case. [dev · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["text"],"properties":{"to":{"enum":["camel","snake","kebab","constant","title"],"type":"string","default":"snake"},"text":{"type":"string","minLength":1}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"case.convert"},"changes":[{"kind":"name","detail":"Renamed \"case.convert\" → \"case_convert\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":132,"tokensAfter":132},{"name":"erc4626.math","fixed":{"name":"erc4626_math","description":"Exact EIP-4626 vault math in BigInt: convert assets to shares (round down) and shares to assets (round down), with optional virtual offsets. [defi · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["totalAssets","totalSupply","amount"],"properties":{"amount":{"type":"string","pattern":"^\\d+$"},"direction":{"enum":["assetsToShares","sharesToAssets"],"type":"string","default":"assetsToShares"},"totalAssets":{"type":"string","pattern":"^\\d+$"},"totalSupply":{"type":"string","pattern":"^\\d+$"},"virtualAssets":{"type":"string","default":"0","pattern":"^\\d+$"},"virtualShares":{"type":"string","default":"0","pattern":"^\\d+$"}},"additionalProperties":false},"title":"erc4626.math"},"changes":[{"kind":"name","detail":"Renamed \"erc4626.math\" → \"erc4626_math\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":222,"tokensAfter":222},{"name":"evm.checksum_address","fixed":{"name":"evm_checksum_address","description":"EIP-55 checksum an Ethereum address, or verify a checksummed one. [web3 · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["address"],"properties":{"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"evm.checksum_address"},"changes":[{"kind":"name","detail":"Renamed \"evm.checksum_address\" → \"evm_checksum_address\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":107,"tokensAfter":107},{"name":"evm.create2_address","fixed":{"name":"evm_create2_address","description":"Compute the deterministic CREATE2 address: keccak256(0xff ‖ factory ‖ salt ‖ initCodeHash)[12:]. [web3 · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["factory","salt","initCodeHash"],"properties":{"salt":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,64}$"},"factory":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"initCodeHash":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"evm.create2_address"},"changes":[{"kind":"name","detail":"Renamed \"evm.create2_address\" → \"evm_create2_address\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":155,"tokensAfter":155},{"name":"evm.decode_calldata","fixed":{"name":"evm_decode_calldata","description":"Extract the 4-byte selector from raw calldata, match it against common signatures, and decode static (word-based) arguments: address, uint256, int256, bytes32, bool. [web3 · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["calldata"],"properties":{"calldata":{"type":"string","pattern":"^0x[0-9a-fA-F]+$"}},"additionalProperties":false},"title":"evm.decode_calldata"},"changes":[{"kind":"name","detail":"Renamed \"evm.decode_calldata\" → \"evm_decode_calldata\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":134,"tokensAfter":134},{"name":"evm.function_selector","fixed":{"name":"evm_function_selector","description":"Compute the 4-byte function selector from a canonical signature, with reverse lookup against common signatures. [web3 · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"selector":{"type":"string","pattern":"^0x[0-9a-fA-F]{8}$"},"signature":{"type":"string","minLength":3}},"additionalProperties":false},"title":"evm.function_selector"},"changes":[{"kind":"name","detail":"Renamed \"evm.function_selector\" → \"evm_function_selector\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":125,"tokensAfter":125},{"name":"evm.keccak256","fixed":{"name":"evm_keccak256","description":"Keccak-256 (Ethereum flavor, NOT NIST SHA3-256) of arbitrary hex or text. [web3 · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["data"],"properties":{"data":{"type":"string","minLength":1},"encoding":{"enum":["hex","utf8"],"type":"string","default":"utf8"}},"additionalProperties":false},"title":"evm.keccak256"},"changes":[{"kind":"name","detail":"Renamed \"evm.keccak256\" → \"evm_keccak256\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":119,"tokensAfter":119},{"name":"evm.storage_slot","fixed":{"name":"evm_storage_slot","description":"Compute Solidity storage slots: simple variables, mapping values (keccak(key ‖ p)), and dynamic array elements (keccak(p) + index). [web3 · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["baseSlot"],"properties":{"kind":{"enum":["simple","mapping","array"],"type":"string","default":"mapping"},"keyHex":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,64}$"},"baseSlot":{"type":"integer","minimum":0},"arrayIndex":{"type":"integer","minimum":0}},"additionalProperties":false},"title":"evm.storage_slot"},"changes":[{"kind":"name","detail":"Renamed \"evm.storage_slot\" → \"evm_storage_slot\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":171,"tokensAfter":171},{"name":"evm.unit_convert","fixed":{"name":"evm_unit_convert","description":"Convert EVM amounts between wei, gwei, and ether with exact BigInt math. [web3 · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["value"],"properties":{"to":{"enum":["wei","gwei","ether"],"type":"string","default":"wei"},"from":{"enum":["wei","gwei","ether"],"type":"string","default":"ether"},"value":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"evm.unit_convert"},"changes":[{"kind":"name","detail":"Renamed \"evm.unit_convert\" → \"evm_unit_convert\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":145,"tokensAfter":145},{"name":"evm.v4_hook_permissions","fixed":{"name":"evm_v4_hook_permissions","description":"Uniswap v4 hook permissions: compute the 14-bit permission field from hook-call names, or decode the field from a hook address (bits live in the LOW 14 bits: address & 0x3FFF). [web3 · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"calls":{"type":"array","items":{"enum":["beforeInitialize","afterInitialize","beforeAddLiquidity","afterAddLiquidity","beforeRemoveLiquidity","afterRemoveLiquidity","beforeSwap","afterSwap","beforeDonate","afterDonate","beforeSwapReturnsDelta","afterSwapReturnsDelta","afterAddLiquidityReturnsDelta","afterRemoveLiquidityReturnsDelta"],"type":"string"}},"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"}},"additionalProperties":false},"title":"evm.v4_hook_permissions"},"changes":[{"kind":"name","detail":"Renamed \"evm.v4_hook_permissions\" → \"evm_v4_hook_permissions\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":230,"tokensAfter":230},{"name":"formatho.registry","fixed":{"name":"formatho_registry","description":"List every registered Formatho tool with version, category, deterministic flag, permissions, and Formatho Verified status. [meta · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"title":"formatho.registry"},"changes":[{"kind":"name","detail":"Renamed \"formatho.registry\" → \"formatho_registry\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":91,"tokensAfter":91},{"name":"hash.text","fixed":{"name":"hash_text","description":"Hash text with md5/sha1/sha256/sha384/sha512 (hex output). MD5/SHA1 are for compatibility checks only, not security. [security · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["text"],"properties":{"text":{"type":"string"},"algorithm":{"enum":["md5","sha1","sha256","sha384","sha512"],"type":"string","default":"sha256"}},"additionalProperties":false},"title":"hash.text"},"changes":[{"kind":"name","detail":"Renamed \"hash.text\" → \"hash_text\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":135,"tokensAfter":135},{"name":"hex.encode","fixed":{"name":"hex_encode","description":"Encode text to hex, or decode hex (with or without 0x) to text. [data · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"hex":{"type":"string"},"text":{"type":"string"}},"additionalProperties":false},"title":"hex.encode"},"changes":[{"kind":"name","detail":"Renamed \"hex.encode\" → \"hex_encode\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":94,"tokensAfter":94},{"name":"json.format","fixed":{"name":"json_format","description":"Validate and pretty-print JSON with a configurable indent level. [data · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["json"],"properties":{"json":{"type":"string","minLength":1},"indent":{"type":"integer","default":2,"maximum":8,"minimum":0}},"additionalProperties":false},"title":"json.format"},"changes":[{"kind":"name","detail":"Renamed \"json.format\" → \"json_format\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":115,"tokensAfter":115},{"name":"json.minify","fixed":{"name":"json_minify","description":"Validate JSON and strip all insignificant whitespace. [data · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["json"],"properties":{"json":{"type":"string","minLength":1}},"additionalProperties":false},"title":"json.minify"},"changes":[{"kind":"name","detail":"Renamed \"json.minify\" → \"json_minify\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":94,"tokensAfter":94},{"name":"json.validate","fixed":{"name":"json_validate","description":"Validate JSON and report the parse error position if invalid. [data · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["json"],"properties":{"json":{"type":"string","minLength":1}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"json.validate"},"changes":[{"kind":"name","detail":"Renamed \"json.validate\" → \"json_validate\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":97,"tokensAfter":97},{"name":"jwt.decode","fixed":{"name":"jwt_decode","description":"Decode a JWT (JWS compact serialization) header and claims WITHOUT verifying the signature. Reports expiry status from the exp claim. [security · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["token"],"properties":{"token":{"type":"string","minLength":10}},"additionalProperties":false},"title":"jwt.decode"},"changes":[{"kind":"name","detail":"Renamed \"jwt.decode\" → \"jwt_decode\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":118,"tokensAfter":118},{"name":"random.string","fixed":{"name":"random_string","description":"Generate a cryptographically random alphanumeric string. [security · v1.0.0 · deterministic: false · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"length":{"type":"integer","default":32,"maximum":512,"minimum":8}},"additionalProperties":false},"title":"random.string"},"changes":[{"kind":"name","detail":"Renamed \"random.string\" → \"random_string\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":99,"tokensAfter":99},{"name":"regex.test","fixed":{"name":"regex_test","description":"Test a regular expression against text: match result plus all capture groups. [dev · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["pattern","text"],"properties":{"text":{"type":"string"},"flags":{"type":"string","default":"","maxLength":8},"pattern":{"type":"string","minLength":1}},"additionalProperties":false},"title":"regex.test"},"changes":[{"kind":"name","detail":"Renamed \"regex.test\" → \"regex_test\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":125,"tokensAfter":125},{"name":"slug.generate","fixed":{"name":"slug_generate","description":"Convert text to a URL-safe kebab-case slug. [dev · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["text"],"properties":{"text":{"type":"string","minLength":1}},"additionalProperties":false},"title":"slug.generate"},"changes":[{"kind":"name","detail":"Renamed \"slug.generate\" → \"slug_generate\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":92,"tokensAfter":92},{"name":"timestamp.convert","fixed":{"name":"timestamp_convert","description":"Convert Unix seconds/milliseconds to ISO 8601 (UTC) and back. [dev · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"iso":{"type":"string"},"value":{"type":["string","number"]}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"timestamp.convert"},"changes":[{"kind":"name","detail":"Renamed \"timestamp.convert\" → \"timestamp_convert\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":98,"tokensAfter":98},{"name":"url.decode","fixed":{"name":"url_decode","description":"Decode percent-encoded text. [network · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["text"],"properties":{"text":{"type":"string"}},"additionalProperties":false},"title":"url.decode"},"changes":[{"kind":"name","detail":"Renamed \"url.decode\" → \"url_decode\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":84,"tokensAfter":84},{"name":"url.encode","fixed":{"name":"url_encode","description":"Percent-encode text (component encoding). [network · v1.0.0 · deterministic: true · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["text"],"properties":{"text":{"type":"string"}},"additionalProperties":false},"title":"url.encode"},"changes":[{"kind":"name","detail":"Renamed \"url.encode\" → \"url_encode\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":87,"tokensAfter":87},{"name":"uuid.v4","fixed":{"name":"uuid_v4","description":"Generate random UUID v4 values. [security · v1.0.0 · deterministic: false · permissions: none]","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"count":{"type":"integer","default":1,"maximum":100,"minimum":1}},"additionalProperties":false},"title":"uuid.v4"},"changes":[{"kind":"name","detail":"Renamed \"uuid.v4\" → \"uuid_v4\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":90,"tokensAfter":90}],"toolsChanged":26,"tokensSaved":0,"todo":[{"tool":"base64_decode","params":["base64"]},{"tool":"base64_encode","params":["text"]},{"tool":"case_convert","params":["to","text"]},{"tool":"erc4626_math","params":["amount","direction","totalAssets","totalSupply","virtualAssets","virtualShares"]},{"tool":"evm_checksum_address","params":["address"]},{"tool":"evm_create2_address","params":["salt","factory","initCodeHash"]},{"tool":"evm_decode_calldata","params":["calldata"]},{"tool":"evm_function_selector","params":["selector","signature"]},{"tool":"evm_keccak256","params":["data","encoding"]},{"tool":"evm_storage_slot","params":["kind","keyHex","baseSlot","arrayIndex"]},{"tool":"evm_unit_convert","params":["to","from","value"]},{"tool":"evm_v4_hook_permissions","params":["calls","address"]},{"tool":"hash_text","params":["text","algorithm"]},{"tool":"hex_encode","params":["hex","text"]},{"tool":"json_format","params":["json","indent"]},{"tool":"json_minify","params":["json"]},{"tool":"json_validate","params":["json"]},{"tool":"jwt_decode","params":["token"]},{"tool":"random_string","params":["length"]},{"tool":"regex_test","params":["text","flags","pattern"]},{"tool":"slug_generate","params":["text"]},{"tool":"timestamp_convert","params":["iso","value"]},{"tool":"url_decode","params":["text"]},{"tool":"url_encode","params":["text"]},{"tool":"uuid_v4","params":["count"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}