mcp-bytesmith
mcp-bytesmith is a local byte-wrangling utility server — all operations are computed locally with no network calls. Here's what you can do:
Encoding & Decoding
encode/decode: Convert bytes/text to/from Base16, Base32, Base45, Base58, Base58check, Base62, Base64, Base64url, ASCII85, Base85, Z85, URL percent-encoding, IDNA, Bech32/Bech32m, hexdump, and EVM bytes32
Hashing
hash: Compute cryptographic (MD5, SHA1/2/3, BLAKE2), CRC (8/16/32/64), xxHash, and FNV1a digestshash_file: Checksum a file on disk and optionally verify against an expected digesthmac: Compute or verify HMAC authentication tags
Number & Byte Manipulation
num_convert: Convert arbitrary-precision integers between hex, decimal, binary, and octalbyte_order: Swap between little-endian, big-endian, host, and network byte ordersbytes_edit: Pad, trim, slice, concatenate, size, or prefix hex byte buffers
Text & Unicode
unicode_normalize: Normalize text to NFC, NFD, NFKC, or NFKD formscharset_transcode: Convert text between character encodings (e.g., Latin-1, CP1252, UTF-8)string_escape/string_unescape: Escape/unescape text for JSON, JS, Python, C, shell, HTML, XML, and morecodepoints: Inspect text character-by-character with Unicode names and UTF-8/16/32 byte views
Time, Data URIs & Random
time_convert: Convert timestamps between ISO 8601, RFC 2822, HTTP date, Unix epoch, and strftime formats across time zonesdata_uri: Build or parse RFC 2397data:URIsrandom: Generate cryptographically secure random bytes, hex/URL-safe tokens, or diceware passphrases
Ethereum/EVM Toolset (optional ethereum extra)
eth_hash: Compute keccak-256, EIP-191 personal_sign, or EIP-712 typed-data hasheseth_selector: Derive 4-byte function selectors or 32-byte event topic0 from Solidity signaturesabi_codec: ABI-encode or ABI-decode call/return/log data (standard and packed modes)rlp_codec: RLP-encode structured data or RLP-decode hex stringseth_storage_slot: Compute storage slots for mapping or dynamic array entrieseth_tx_codec: Serialize/deserialize raw transactionseth_address_case: Apply or verify EIP-55 mixed-case address checksumsens_namehash: Compute EIP-137 namehash and labelhash for ENS names
Serialization Toolset (optional serialize extra)
serialize_codec: Encode/decode structured data in CBOR, MessagePack, bencode, and decode raw protobuf wire format
Discovery
info: Health-check reporting server status, version, Python runtime, MCP SDK version, and active toolsets
Provides tools for Ethereum/EVM operations including keccak-256 hashing, ABI and RLP encoding/decoding, function and event selectors, transaction encoding, storage slot computation, and EIP-55 address checksumming.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-bytesmithhash 'hello world' with sha256"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-bytesmith
A pure-Python Model Context Protocol server, built on the official MCP SDK (FastMCP), exposing a toolbox of byte-wrangling utilities — encoding, hashing, number crunching, and Ethereum primitives — all computed locally and for real, with no network calls or remote APIs.
Distribution name: mcp-bytesmith · import package: mcp_bytesmith.
Tools
mcp-bytesmith ships an always-on core toolset built entirely on the Python
standard library, so it works out of the box with no extra dependencies. This
covers the everyday primitives: encode and decode move data between a wide
set of schemes (hex, the Base64/Base32 family, Base58/Base58check, Base45, and
more), hash computes cryptographic, CRC, and fast non-cryptographic digests,
hash_file checksums a file on disk and soft-verifies it against an expected
digest, hmac computes and verifies keyed-hash authentication tags, and
num_convert translates integers between bases. Rounding out the core are
bytes_edit (pad/trim/slice/concat byte glue), data_uri (build and parse
data: URIs), otpauth_uri (build and parse otpauth:// authenticator
provisioning URIs), unicode_normalize and charset_transcode for text and
character-set work, string_escape/string_unescape for JSON/JS/Python/C
escaping, codepoints for per-scalar Unicode inspection, random for
CSPRNG-backed bytes, tokens, and passphrases, and id_generate for UUIDs
(v1/v4/v5/v7), ULIDs, and nanoids. password_hash turns a password
into a verifiable storage string and checks one back — scrypt and PBKDF2 out of
the box, bcrypt and the argon2 variants with the crypto extra — while
derive_key derives raw key bytes from a password or secret via PBKDF2, scrypt,
or HKDF.
An opt-in Ethereum/EVM toolset (enabled via the ethereum extra) adds the
primitives you reach for when working on-chain: eth_hash for keccak-256,
EIP-191, EIP-712 typed-data, and EIP-7702 authorization hashing,
eth_userop_hash for the ERC-4337 userOpHash (EntryPoint 0.6/0.7/0.8),
abi_codec and rlp_codec for ABI and
RLP encode/decode, eth_selector for function and event selectors,
abi_inspect for converting a contract ABI between its JSON and human-readable
forms and listing every selector and topic0 it declares,
eth_calldata for splitting a call's calldata into named, typed arguments (and
building it back), eth_log_decode for turning a receipt log's topics and data
into named event arguments, eth_revert_decode for turning a failed call's
revert data into a reason (Error(string), Panic(uint256), or a custom error),
eth_bytecode for disassembling deployed bytecode, scraping the selectors out of
its dispatcher, and reading its trailing solc metadata,
eth_tx_codec for transactions, eth_storage_slot
for storage layout — mapping and array slots, plus the well-known constant ones
(EIP-1967 proxy, UUPS, ERC-7201 namespaced, diamond) — eth_address_case for
EIP-55 checksums, ens_namehash for
EIP-137 ENS namehash/labelhash, bip39 for BIP-39 mnemonic generation,
validation, and seed derivation, bip32_derive for BIP-32/44 HD key and address
derivation from a seed, eth_eoa_address for the address and public key behind a
private key, and eth_contract_address for CREATE and CREATE2 deployment
addresses. An always-available info tool reports which toolsets are active
along with version information.
An opt-in serialization toolset (enabled via the serialize extra) adds
serialize_codec, a single tool multiplexed by format. It encodes and decodes
schemaless structured data across CBOR, MessagePack, bencode, and ASN.1 DER/BER
(a tag-length-value tree; the crypto extra's asn1crypto is needed for ASN.1);
it encodes and decodes SSZ (Simple Serialize) driven by an options.schema,
also returning the hash_tree_root; and it decodes raw protobuf wire format
(protobuf is decode-only — without a .proto schema it surfaces field numbers,
wire types, and values rather than field names).
Further toolsets (the rest of crypto, IDs, validation) are on the roadmap — see
TODO.
Related MCP server: mcp-python-bitcoinlib
Development
uv sync # create venv + install (incl. dev extras)
uv run mcp-bytesmith # start the server over stdio
uv run pytest # run the test suiteSponsoring
mcp-bytesmith is free, open-source software developed in my spare time. Sponsorships are what keep the project alive and actively maintained — they fund new toolsets, bug fixes, and ongoing support, and they're a direct signal that the work is worth continuing.
If the project is useful to you, please consider sponsoring it through GitHub Sponsors. Click the Sponsor button at the top of the repository, or visit the link directly, and pick a one-time or recurring tier. Every contribution, large or small, is hugely appreciated and goes straight back into keeping mcp-bytesmith healthy.
License
GPLv3 — see LICENSE.
The bundled passphrase wordlist
(src/mcp_bytesmith/wordlists/eff_large.txt,
used by the random tool's passphrase kind) is the EFF "large" wordlist by the
Electronic Frontier Foundation, licensed
CC BY 3.0 US.
The bundled BIP-39 wordlist
(src/mcp_bytesmith/wordlists/bip39_english.txt,
used by the bip39 tool) is the canonical English wordlist from
BIP-39, which
falls under the MIT License.
Its SHA-256 is 2f5eed53a4727b4bf8880d8f3f199efc90e58503646d9ff8eff3a2ed3b24dbda.
Available Tools
33 toolsabi_codecA
ABI-encode values or ABI-decode call/return/log data.
types is a list of ABI type strings (e.g. ["uint256", "address",
"(uint8,bytes)[]"]); aliases like uint/int/byte are normalized.
action=encode (needs values) -> {encoded, mode}. mode=packed is
abi.encodePacked (tight, no padding) and is encode-only. action=decode
(needs data, standard only) -> {values}; ints are returned as decimal
strings and addresses EIP-55 checksummed.
Example: abi_codec("encode", ["uint256"], [69]) -> encoded="0x00..0045" (the 32-byte word 0x...0045).
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | 0x-prefixed ABI-encoded bytes to decode (required for action=decode). | |
| mode | No | 'standard' head/tail ABI encoding, or 'packed' (abi.encodePacked: tight, no padding/length prefixes) — packed is encode-only as it is not uniquely decodable. | standard |
| types | Yes | List of ABI type strings, e.g. ["uint256","address","(uint8,bytes)[]"]; aliases uint/int/byte are normalized. A stringified JSON array is accepted. | |
| action | Yes | 'encode' values to ABI bytes, or 'decode' ABI bytes. | |
| values | No | Values to encode (required for action=encode), positionally matching `types`; ints accept int/decimal/0x-hex, bytes are 0x-hex, addresses are 0x-hex. A stringified JSON array is accepted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the burden. It discloses output formats for decoding (decimal strings, checksummed addresses) and the fact that packed mode is encode-only. Behavioral traits like error handling or performance are not covered, but key behaviors are explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two short paragraphs and an example. It is front-loaded with the purpose. Some information is repeated from the schema but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 5 parameters and full schema descriptions, the description covers actions, modes, types, and output format. It lacks error handling or constraints but is sufficiently complete for a encoding utility.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with parameter descriptions. The description adds value beyond the schema by explaining value formats, providing an example, and clarifying packed mode limitations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'ABI-encode values or ABI-decode call/return/log data', which clearly defines the tool's functionality and distinguishes it from sibling tools like generic encode/decode or rlp_codec.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use encode vs decode and the packed vs standard mode, but does not explicitly exclude non-ABI use cases. However, the purpose is clear enough for an agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bip32_deriveA
Derive an HD child key and its Ethereum address from a seed along a BIP-32/44 path.
The master key comes from HMAC-SHA512("Bitcoin seed", seed); each path step derives a child via BIP-32 CKDpriv (hardened steps use the parent private key, normal steps its compressed public key). The Ethereum address is the last 20 bytes of keccak256(uncompressed pubkey), EIP-55 checksummed. Returns {path, depth, private_key, public_key, chain_code, address}; the derived child private_key IS returned (it is new output, not the seed), but the input seed is never echoed.
Example: bip32_derive(<64-byte seed hex>, "m/44'/60'/0'/0/0") -> {"address": "0x...", "private_key": "0x...", ...}.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | BIP-32/44 derivation path, e.g. "m/44'/60'/0'/0/0" (the conventional Ethereum account-0 key). Use ' or h to mark a hardened step; "m" (or empty) yields the master key itself. | |
| seed | Yes | BIP-32 seed bytes (typically the 64-byte BIP-39 mnemonic-to-seed output), as hex or base64 per `input_format`. This is a SEED, not a mnemonic — derive the seed from words first. Never echoed back. | |
| input_format | No | How to decode `seed` to bytes: 'hex' (0x optional) or 'base64'. | hex |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must cover all behavioral aspects. It explains the cryptographic derivation process, that the derived private key is returned, the input seed is never echoed, and the return object structure. It does not mention side effects (none expected) but is informative overall.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two paragraphs plus an example, well-structured with clear purpose, algorithm, return values, and a concrete example. Every sentence adds value, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 3 parameters and no output schema, the description covers purpose, algorithm, return object, and example. It is complete enough for an agent to understand what the tool does and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds value beyond schema by explaining the path format (BIP-32/44, hardened steps), that the seed is not echoed, and providing an example. This enhances understanding of parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool derives an HD child key and Ethereum address from a seed along a BIP-32/44 path, specifying the verb, resource, and constraints. It distinguishes from siblings like bip39 (seed generation) and derive_key (general derivation) by focusing on BIP-32 path derivation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes a detailed example and explains the input format, guiding users to provide a seed rather than a mnemonic. However, it lacks explicit when-to-use or when-not-to-use statements compared to sibling tools, though implicit guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bip39A
Generate, validate, or convert a BIP-39 mnemonic to a seed.
action=generate -> {action, mnemonic, word_count, strength}. With entropy the
mnemonic is deterministic; without it, fresh CSPRNG entropy of strength bits.
action=validate -> {action, valid, word_count} plus a reason when invalid — a
bad mnemonic is a soft result, not an error (§2.0.5).
action=to_seed -> {action, seed, word_count}: the 64-byte seed as 0x-hex, ready
for bip32_derive. PBKDF2-HMAC-SHA512(mnemonic, "mnemonic"+passphrase, 2048).
An invalid mnemonic raises here; use action=validate to inspect it first.
Neither the mnemonic, the entropy, nor the passphrase is ever echoed back.
Example: bip39("to_seed", mnemonic="abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about") -> seed="0x5eb00bbd..."
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | 'generate' builds a mnemonic (from `entropy`, or fresh CSPRNG entropy of `strength` bits); 'validate' checks a mnemonic's wordlist membership and checksum; 'to_seed' derives the 64-byte BIP-32 seed from a mnemonic and optional `passphrase`. | |
| entropy | No | Entropy as hex (0x optional) for action=generate: 16, 20, 24, 28, or 32 bytes, giving 12..24 words. Omit to draw fresh CSPRNG entropy of `strength` bits. Never echoed back. | |
| mnemonic | No | The mnemonic sentence (required for validate/to_seed). Casing and extra whitespace are forgiven; it is never echoed back. | |
| strength | No | Entropy bits for action=generate when `entropy` is omitted (128 -> 12 words, 256 -> 24 words). Ignored when `entropy` is given. | |
| passphrase | No | The optional BIP-39 passphrase (the "25th word") for action=to_seed. Any passphrase is valid and yields a DIFFERENT seed, so a wrong one silently opens a different wallet. Never echoed back. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavioral traits: it explains that invalid mnemonics in to_seed raise errors while validate returns a reason, describes the PBKDF2 derivation, and states that sensitive inputs are never echoed back.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with bullet points for each action and includes a concrete example. It is slightly verbose with repeated phrases like 'never echoed back,' but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of 5 parameters and no output schema, the description fully explains return value structure for each action, error handling, and format details (e.g., seed as 0x-hex). It leaves no gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers all parameters with 100% descriptions. The description adds value by explaining determinism with entropy for generate and the security implication of the passphrase (wrong passphrase yields a different seed).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool generates, validates, or converts BIP-39 mnemonics to seeds, with each action's specific output. This distinguishes it from sibling tools like bip32_derive, which operates on seeds rather than mnemonics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance for when to use each action (generate, validate, to_seed) and warns about error behavior for invalid mnemonics. However, it does not explicitly contrast with alternative tools, though the sibling context makes the purpose clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
byte_orderA
Convert a value between host and network byte order (htons/htonl/ntohs/ntohl).
data is decoded via input_format (hex default). from_order/to_order
are little|big|network|host: network is big-endian, host resolves to the
platform's sys.byteorder — so on a little-endian box from_order=host
to_order=network is htonl/htons. width (bytes) sets a fixed field size: a
shorter buffer is left zero-padded up to width, a longer one is split into
width-byte groups each swapped independently (array semantics); omit it to
swap the whole buffer as one field. Differing orders reverse each field; equal
orders only apply the width normalization. Returns {result, from_order,
to_order, width, output_format}; result is rendered via output_format.
Example: byte_order("0x12345678", "little", "big") -> result "78563412"
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Hex byte buffer (0x-prefix optional) to byte-swap, treated as a sequence of fixed-size `width`-byte fields. | |
| width | No | Fixed field size in bytes: a shorter buffer is left zero-padded up to it, a longer one is split into width-byte groups each swapped independently. Default None swaps the whole buffer as one field. | |
| to_order | Yes | Target byte order: little|big|network|host. Differing orders reverse each field; equal orders only apply width normalization. | |
| from_order | Yes | Current byte order of `data`: little|big|network|host (network=big-endian, host=platform's sys.byteorder). | |
| input_format | No | How `data` is decoded to bytes; default 'hex'. | hex |
| output_format | No | How `result` is rendered; default 'hex'. | hex |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: it covers byte swapping logic, width-based grouping and padding, handling of equal orders, and return format. There are no contradictions or omissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (single paragraph) and front-loaded with the core purpose. It could be slightly more structured (e.g., bullet points), but every sentence adds value and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 parameters, byte order conversion), the description is remarkably complete. It explains all parameters, edge cases (different widths, equal orders), and the return format, leaving no gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 100% schema coverage, the description adds significant value beyond the schema: it explains 'host' resolves to sys.byteorder, clarifies width's array semantics, and provides a concrete example, greatly aiding parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Convert a value between host and network byte order' and specifies the resource. It also mentions analogous functions (htons/htonl/ntohs/ntohl) and provides an example, making the purpose highly specific and distinguishable from siblings like decode or hash.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool (byte order conversion) and thoroughly details each parameter's role. However, it does not explicitly state when not to use it or directly compare with alternatives, though siblings are distinct enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bytes_editA
Edit a hex byte-buffer: pad/trim to width, slice, concat, size, or 0x-prefix.
data is hex (a leading 0x is optional). Actions:
pad: widen to
lengthbytes with thefillbyte onside(left=prepend, right=append); never truncates if already wider.trim: strip the
fillbyte (default 00) fromside(left=leading, right=trailing) — the inverse of pad.slice: take
data[start:end](Python indexing; negatives allowed).concat: append each hex buffer in
partstodata.size: report the byte length, buffer unchanged.
prefix: side=left adds a 0x prefix, side=right strips it.
Returns {action, result, size}: result is the 0x-prefixed hex buffer (bare
hex when prefix-stripping), size its byte length.
Example: a 20-byte address -> 32-byte log topic:
bytes_edit("pad", "0x1234", length=4, side="left") -> result "0x00001234"
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Slice end index (Python indexing, negatives allowed); default None means end of buffer. | |
| data | Yes | Input byte-buffer as hex, a leading 0x is optional. | |
| fill | No | The pad/trim byte as one hex byte (0x optional); default '00'. | 00 |
| side | No | Which side acts: pad prepend/append, trim leading/trailing, prefix add/strip 0x. Default 'left'. | left |
| parts | No | Hex buffers to append for action=concat. Default None. | |
| start | No | Slice start index (Python indexing, negatives allowed); default None means 0. | |
| action | Yes | Edit to apply: pad (widen to `length`), trim (strip `fill`), slice (`start`:`end`), concat (append `parts`), size (report byte length), prefix (add/strip 0x). | |
| length | No | Target byte width for action=pad. Default None. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description fully covers behavior: pad never truncates, trim is inverse, slice uses Python indexing, prefix adds/strips 0x. It also describes the return format and provides an example, ensuring transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with a clear list of actions and concise bullet points. Every sentence provides necessary information, and the example is helpful without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters, no output schema, and no annotations, the description thoroughly covers all actions, parameters, and return values. The example addresses a common use case, making it complete for an editing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description adds value by explaining action-specific parameter usage (e.g., fill defaults to '00', side defaults to 'left') and gives context for how parameters interact. The example further clarifies parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it edits a hex byte-buffer with actions like pad, trim, slice, concat, size, and prefix. It distinguishes itself from sibling tools which are for encoding, hashing, etc., by focusing on low-level hex manipulation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each action is described with specific use cases (e.g., pad to widen, trim to strip). It does not explicitly state when not to use, but the sibling tools are very different so context makes it clear. Could be improved with a note about intended vs. unintended inputs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charset_transcodeA
Convert text between character encodings (e.g. latin-1/cp1252 <-> utf-8).
The input is encoded under from_charset to recover its raw bytes, which are
then decoded under to_charset. If the bytes aren't valid to_charset text
they're returned as bare hex with output_format='hex' (otherwise 'text').
errors selects the codec error handler (strict|replace|ignore|…).
Returns {from_charset, to_charset, result, output_format}.
Example: charset_transcode("café", "cp1252", "utf-8") -> result "café"
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to reinterpret across encodings. | |
| errors | No | Codec error handler applied to both legs: strict|replace|ignore|backslashreplace|…. Default 'strict'. | strict |
| to_charset | Yes | Encoding to decode those bytes under, e.g. utf-8. | |
| from_charset | Yes | Encoding to encode `text` under to recover its raw bytes, e.g. cp1252, latin-1, utf-8. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description fully carries burden. Explains the two-step process (encode then decode), fallback behavior (hex output), error handler options, and return format. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is efficient, front-loaded with main purpose, then details. Could be slightly more concise but no fluff. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description lists return fields. Covers all parameters, behavior, and provides an example. Complete for a transformation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description adds value beyond schema by explaining the purpose of each parameter, the encoding/decoding logic, and providing an example. The errors parameter default and options are clarified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states specific verb+resource: 'Convert text between character encodings (e.g. latin-1/cp1252 <-> utf-8)'. Clearly distinguishes from siblings like 'decode' and 'encode' by focusing on charset transcoding.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for use (converting between encodings) but does not explicitly state when not to use or list alternative tools. Implicitly differentiated from siblings by its specific purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codepointsA
Break text into its code points with names and UTF-8/16/32 byte views.
Returns one entry per Unicode scalar (astral characters stay whole): the
char, its codepoint as 'U+XXXX', the Unicode name (or a
placeholder for unnamed control/format/private-use scalars), and big-endian
utf8/utf16/utf32 byte views as hex. count is the code-point length,
which differs from len() only for surrogate-pair-bearing input.
Example: codepoints("é") -> count 1, char "é" at codepoint "U+00E9"
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to break into its constituent Unicode scalars. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors: it returns one entry per Unicode scalar, keeps astral characters whole, and explains the count vs len() difference. Since no annotations are provided, the description carries the burden, and it does so well, though it could mention any assumptions about input handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with a clear purpose statement, detailed output explanation, and a helpful example. Every sentence adds value; no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema), the description fully explains the return value fields and behavior. The example clarifies usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'text' is already described in the schema. The description adds significant value by explaining the output structure and providing an example, exceeding the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool breaks text into code points with names and UTF-8/16/32 byte views. It uses specific verbs and resource details, and distinguishes from sibling tools like 'decode', 'encode', and 'unicode_normalize' which have different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for obtaining detailed code point information, but it does not explicitly state when to use it versus alternatives or when not to use it. No comparison to siblings is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
data_uriA
Build a data: URI from a payload, or parse one into its parts (RFC 2397).
action=build (needs data, read via input_format): wraps it as
data:[media_type][;base64],<payload>; base64=true base64-encodes the
payload, else it is percent-encoded. action=parse (needs uri): returns
media_type (defaulting to text/plain when absent), the ;k=v parameters,
is_base64, and the decoded data rendered via output_format.
Example: data_uri("build", media_type="text/plain", data="hi") -> uri
"data:text/plain;base64,aGk="
| Name | Required | Description | Default |
|---|---|---|---|
| uri | No | The 'data:...' URI to parse (action=parse). Default None. | |
| data | No | Payload to wrap (action=build), decoded via `input_format`. Default None. | |
| action | Yes | 'build' wraps a payload into a data: URI (needs `data`); 'parse' splits a URI into its parts (needs `uri`). | |
| base64 | No | For build: true base64-encodes the payload (adds ';base64'), false percent-encodes it. Default true. | |
| media_type | No | MIME type for build, e.g. 'text/plain' or 'image/png'. Default None omits it. | |
| input_format | No | How build `data` is decoded to bytes; default 'text'. | text |
| output_format | No | How parsed payload is rendered (text=UTF-8 | hex | base64); default 'text'. | text |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It thoroughly describes actions, encoding options (base64 vs percent), defaults, input/output formats, and includes an example. Behavioral traits are well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is front-loaded with main purpose, uses effective line breaks. Every sentence adds value, though some technical detail could be condensed. Overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, so description should detail return values. It describes parse returns (media_type, parameters, is_base64, decoded data) but lacks exact structure. Build returns URI but no format details. Adequate but incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. The description adds value by explaining parameter dependencies (e.g., action determines which params needed), defaults, and provides an example illustrating usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool builds or parses data: URIs per RFC 2397, with specific verbs and resource. It distinguishes between build and parse actions, and the name and description are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use build vs parse and required parameters, but it does not provide guidance on when not to use this tool compared to sibling tools like encode/decode or charset_transcode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
decodeA
Decode a base-N/URL/IDNA/bech32/hexdump string back to bytes or text.
The inverse of encode over the same scheme set. The recovered bytes are
rendered per output_format (text=UTF-8 | hex=bare, no 0x | base64); pick
hex/base64 for binary payloads that are not valid UTF-8. options carries
alphabet for base58/base62. base58/base58check/base45/idna need the
encoding extra.
Returns {scheme, decoded, output_format}; bech32/bech32m additionally return
their hrp.
Example: decode("aGVsbG8=", "base64") -> decoded "hello"
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Encoded string to decode, in `scheme`'s format. | |
| scheme | Yes | Source encoding (same set as `encode`): base16/32/.../64url, ascii85/base85/z85, url/url_form, idna, bech32/bech32m, hexdump, or bytes32. | |
| options | No | Per-scheme options: alphabet (base58/base62). Default None. | |
| output_format | No | How recovered bytes are rendered: text=UTF-8, hex=bare (no 0x), base64. Default 'text'; pick hex/base64 for non-UTF-8 payloads. | text |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must convey behavior. It details return fields, including scheme, decoded, output_format, and hrp for bech32. It mentions per-scheme options and extra requirements for base58/base58check/base45/idna, providing behavioral context beyond a simple decode.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, followed by essential details in a logical order. Every sentence earns its place, including the example. Despite covering many schemes and options, it remains succinct and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (many schemes, no output schema), the description covers return values, options, and output format guidance. It misses explicit error handling or invalid input behavior, but overall it provides sufficient completeness for most use cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions, but the tool description adds significant value: it explains the role of options for base58/base62, clarifies that base58/base58check/base45/idna need the encoding extra, and advises on output_format for binary data. This goes well beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a clear verb and resource: "Decode a base-N/URL/IDNA/bech32/hexdump string back to bytes or text." It distinguishes from the sibling tool 'encode' by stating it is the inverse, leaving no ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage as the inverse of encode, but does not explicitly state when not to use it. It does provide guidance on output_format for binary payloads, which aids appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
derive_keyA
Derive raw key bytes from a password or secret via a KDF (PBKDF2/scrypt/HKDF).
Returns the key rendered per output_format, plus the kdf, length,
salt and params actually used — everything needed to repeat the
derivation. Fully deterministic: the same inputs always give the same key, so
an omitted salt means an empty one rather than a fresh random one. Use
pbkdf2/scrypt to stretch a human password, and hkdf only to expand a secret
that is already high-entropy (a shared secret, another key). To STORE a
password for later checking, use password_hash instead — its output is a
self-describing string built to be compared against.
Example: derive_key("hunter2", kdf="pbkdf2", salt="0011223344556677",
length=32) -> {"key": "a3f1...", "params": {"iterations": 600000, ...}}
| Name | Required | Description | Default |
|---|---|---|---|
| kdf | No | Key-derivation function. 'pbkdf2'/'scrypt' stretch a low-entropy password (slow by design); 'hkdf' (RFC 5869) expands an already-high-entropy secret and is fast — do NOT use it on a password. Default 'pbkdf2'. | pbkdf2 |
| salt | No | Salt as hex. Omitted means NO salt (an empty one), which keeps the derivation reproducible — this tool never invents a random salt, since the key would be unrecoverable. For pbkdf2/scrypt pass a real salt (16 random bytes); for hkdf omitting it is the RFC default. Echoed back as `salt`. | |
| length | No | Derived key length in bytes (1..1024). Default 32. | |
| params | No | KDF parameters overriding the defaults: pbkdf2 {iterations:600000, prf:'sha256'}; scrypt {ln:14, r:8, p:1}; hkdf {hash:'sha256', info:''} where `info` is a UTF-8 context label that binds the key to a purpose. Default None. | |
| password | Yes | The password, secret, or input keying material, read as UTF-8. Never echoed back. | |
| output_format | No | How the key is rendered (bare hex, no 0x); default 'hex'. | hex |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavioral traits: determinism (same inputs always yield same key), omitted salt implies empty salt (not random), password never echoed back, and performance differences between KDFs. This provides essential behavioral context for safe tool use.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concisely written (~150 words) with an effective structure: main purpose first, then details, then an illustrative example. Every sentence adds critical information without redundancy, making it efficient for an AI agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of KDFs and the lack of an output schema, the description covers all essential aspects: purpose, algorithm selection, determinism, return format (key, kdf, length, salt, params), and cross-reference to password_hash. It provides a complete mental model for correct tool invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema covers all 6 parameters (100% coverage), the description adds significant value beyond the schema: explains the default salt behavior, the entropy requirements for kdf, the meaning of output_format ('bare hex, no 0x'), and details the params structure with example overrides. This enhances usability beyond what the schema alone provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'derive' and resource 'raw key bytes from a password or secret via a KDF', and explicitly distinguishes from sibling tool 'password_hash' for password storage. This makes the purpose unambiguous and differentiates it from other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use each KDF variant (pbkdf2/scrypt for passwords, hkdf only for high-entropy secrets), warns against misuse of hkdf on passwords, and directs users to the sibling tool 'password_hash' for password storage. This meets the highest standard of usage clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
encodeA
Encode bytes/text into a string form (base-N, URL, IDNA, bech32, hexdump, bytes32).
data is decoded to bytes via input_format (text|hex|base64). options
is a per-scheme dict: padding (bool, default true — base32/base64 family),
alphabet (custom symbol set — base58/base62), hrp (required for
bech32/bech32m), width (bytes per line — hexdump, default 16). idna and
bytes32 read data as a text string / short string respectively. bytes32 is
a fixed-width 32-byte EVM word: inputs of <32 bytes are right-padded with
0x00; decode returns all 32 bytes (it does NOT strip trailing nulls, so the
round-trip is lossless — rstrip them yourself for a short string).
Returns {scheme, encoded}.
Example: encode("hello", "base64") -> encoded "aGVsbG8="
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Input to encode, decoded to bytes via `input_format` (idna/bytes32 read it as text). | |
| scheme | Yes | Target encoding: base16/32/32hex/32crockford/45/58/58check/62/64/64url, ascii85/base85/z85, url/url_form (percent), idna, bech32/bech32m, hexdump, or bytes32 (32-byte EVM word). | |
| options | No | Per-scheme options: padding (bool, base32/64 family), alphabet (base58/62), hrp (required for bech32/bech32m), width (hexdump, default 16). Default None. | |
| input_format | No | How `data` is decoded to bytes; default 'text'. | text |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description fully discloses behavior: how data is decoded via input_format, per-scheme options, padding, alphabet, hrp, width, and bytes32 padding with round-trip note. It also specifies the return format. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear overall statement, then per-parameter details and an example. It is slightly lengthy (~170 words) but each sentence provides valuable information; could be trimmed slightly but still good.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (20 schemes, multiple options, no output schema), the description is comprehensive. It covers data decoding, scheme-specific options, bytes32 behavior, and return format. Missing only explicit mention of error cases, but schema enums handle validation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% but the description adds significant value: it explains the meaning of each parameter (data, scheme, input_format, options) with specific details (e.g., default for input_format, per-scheme options like padding, hrp, width). It also provides an example, enhancing understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it encodes bytes/text into a string form using various schemes (base-N, URL, IDNA, bech32, hexdump, bytes32). It lists specific schemes and provides an example, making the purpose unambiguous and distinct from sibling tools like decode or hash.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While it doesn't explicitly state when to use versus alternatives, the description gives clear context on how to use each scheme and parameter. The sibling tools are sufficiently different (e.g., decode, hash) that the purpose alone guides selection, but explicit guidance would be better.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ens_namehashA
Compute the EIP-137 namehash (and labelhash) of an ENS name.
The name is hashed exactly as given; EIP-137 expects it already UTS-46 normalized (use unicode_normalize first if needed), and empty labels from a stray dot are rejected. Returns {name, namehash, labelhash}, where labelhash is the keccak of the leftmost label — for a single label that is the .eth registrar token id for that name.
Example: ens_namehash("vitalik.eth") -> namehash="0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835".
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | A dot-separated ENS name, e.g. 'vitalik.eth' (''=the root). EIP-137 expects it ALREADY UTS-46 normalized — run unicode_normalize first if it may contain uppercase/unicode. Empty labels (leading/trailing/double dots) are rejected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: it hashes as given, warns about normalization, rejects empty labels, and describes the output structure including an example. This is comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus a return explanation and example. Purpose is front-loaded, no unnecessary words. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's specificity and lack of output schema, the description covers purpose, input, output, and important edge cases (normalization, empty labels). It's complete for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a detailed description. The description adds context about normalization and empty label rejection, going beyond the schema. A score of 4 reflects this added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool computes EIP-137 namehash and labelhash of an ENS name. It uses a specific verb ('compute') and resource ('ENS name'), and the mention of EIP-137 distinguishes it from generic hash tools like 'hash' or 'eth_hash'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the normalization prerequisite and rejection of empty labels, guiding correct usage. It could be more explicit about when not to use (e.g., for raw keccak256), but it's clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eth_address_caseA
Apply or verify an EIP-55 mixed-case address checksum.
action=encode -> {action, address} with the checksummed (mixed-case) address.
action=verify -> {action, address (checksummed), valid}, plus a reason when
the supplied casing does not match the EIP-55 checksum.
Example: eth_address_case("encode", "0x52908400098527886e0f7030069857d2e4169ee7") -> address="0x52908400098527886E0F7030069857D2E4169EE7".
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | 'encode' applies the EIP-55 checksum casing; 'verify' checks whether the input's casing already matches it. | |
| address | Yes | A 20-byte hex address, 40 hex chars with or without a 0x prefix; any casing is accepted (verify compares the given casing against the EIP-55 checksum). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It details the return structure for both actions, including the reason field for verify. It discloses input acceptance (any casing). It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, starting with a high-level statement, then detailing two actions, and ending with an example. It is concise without missing key info, though slightly verbose in the example.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations or output schema, the description covers the tool's behavior well: inputs, outputs per action, example. It lacks error handling info but is sufficient for a simple utility tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds value by explaining the action enum in context and providing an explicit example showing parameter values and result. This goes beyond the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool applies or verifies EIP-55 checksum. It distinguishes between two specific actions (encode, verify) and describes their outputs, making the purpose precise and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the two actions and provides an example. While it doesn't explicitly compare to sibling tools, the context is unique enough that usage is clear. It could mention when not to use it but is mostly adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eth_contract_addressA
Compute a contract's CREATE or CREATE2 deployment address.
scheme=create -> needs nonce; address = keccak256(rlp([deployer, nonce]))[12:]
scheme=create2 -> needs salt and init_code;
address = keccak256(0xff ++ deployer ++ salt ++
keccak256(init_code))[12:]
Returns {address}, EIP-55 checksummed. Computes only — nothing is deployed.
Example: eth_contract_address("create", "0x6ac7ea33f8831ea9dcc53393aaa88b25a785dbf0", nonce=0) -> address="0xcd234A471b72ba2F1Ccf0A70FCABA648a5eeCD8d".
| Name | Required | Description | Default |
|---|---|---|---|
| salt | No | A 32-byte hex salt chosen by the deployer (required for scheme=create2). | |
| nonce | No | The deployer's transaction nonce for this deploy (required for scheme=create; int, decimal string, or 0x-hex). A contract deployer's nonce starts at 1, an EOA's at 0. | |
| scheme | Yes | 'create' derives from the deployer and its `nonce`; 'create2' (EIP-1014) derives from the deployer, a `salt`, and the `init_code`, so the address is known before deployment. | |
| deployer | Yes | The deploying account's 20-byte hex address (0x optional, any casing) — an EOA for a top-level deploy, or the factory contract. | |
| init_code | No | The full contract creation bytecode as hex — constructor code plus its ABI-encoded arguments, NOT the deployed runtime code (required for scheme=create2). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: it is a pure computation ('Computes only — nothing is deployed'), explains the formula step-by-step, and describes the return type (EIP-55 checksummed address). No destructive side effects, no permissions needed, fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively concise given the complexity—two paragraphs and an example. It front-loads the purpose and then details the two schemes. The formula blocks are necessary but add length. No wasted sentences; every part adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description specifies the return format (address, EIP-55 checksummed). All parameters are covered, including defaults and requirements per scheme. The example provides a concrete test case. The description is complete for this computation-only tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant value beyond the schema: it explains the mathematical role of each parameter (e.g., nonce is the deployer's transaction nonce, init_code is the full creation bytecode), includes a concrete example with expected output, and clarifies the distinction between create and create2 parameters. This goes well beyond the schema's syntactic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool computes CREATE or CREATE2 deployment addresses, with specific verb 'compute' and resource 'contract address'. It distinguishes between the two schemes explicitly, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use each scheme (create needs nonce, create2 needs salt and init_code) and provides a formula. It does not explicitly list alternatives or when not to use, but the context from sibling tools is not needed as this is a standalone computation. The description implies usage by showing required parameters for each scheme.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eth_eoa_addressA
Derive an EOA's Ethereum address and public key from its private key.
The public key is the curve point k*G, serialized uncompressed (0x04 || X || Y);
the address is the last 20 bytes of keccak256(X || Y), EIP-55 checksummed. This
is the externally-owned-account counterpart to eth_contract_address — it
derives, it does not create an account. Returns {address, public_key}; the
private key is never echoed back.
Example: eth_eoa_address( "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80") -> address="0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266".
| Name | Required | Description | Default |
|---|---|---|---|
| private_key | Yes | A 32-byte secp256k1 private key as hex (0x prefix optional). Never echoed back in the result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, but description fully explains behavior: derives address and public key, never echoes private key, returns specific fields, and details public key serialization.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise, well-structured with explanation and example. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with 1 parameter and no output schema, description covers return format, derivation method, and example, making it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and schema description already explains private_key parameter well. Description adds example but does not significantly enhance semantics beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it derives an EOA's Ethereum address and public key from private key, and contrasts with sibling eth_contract_address.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Mentions it is the counterpart to eth_contract_address and that it derives rather than creates an account, providing usage context. Includes an example.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eth_hashA
Compute an Ethereum hash: raw keccak-256, EIP-191, or EIP-712 typed-data.
Returns {kind, hash}. For kind=eip712 the result also carries {domain_separator, struct_hash}, the two EIP-712 component hashes. Note keccak-256 is the pre-NIST Ethereum variant, not hashlib's SHA3-256.
Example: eth_hash("keccak256", "hello", "text") -> hash="0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8".
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Polymorphic: for keccak256/eip191 it is the message bytes decoded per input_format; for eip712 it is the typed-data JSON object (a JSON string or already-parsed dict with types/primaryType/domain/message) and input_format is ignored. | |
| kind | Yes | Hash flavor: 'keccak256' (raw Ethereum keccak-256), 'eip191' (personal_sign prefixed message), or 'eip712' (typed-data digest). | |
| input_format | No | How to decode `data` to bytes for keccak256/eip191 (ignored for eip712); hex is 0x-prefixed or bare. | text |
| output_format | No | Digest encoding: 'hex' is 0x-prefixed, or 'base64'. | hex |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses that for eip712, the result includes additional component hashes, and notes the keccak-256 variant differs from standard SHA3-256. No destructive behavior is relevant. This is good transparency, though it could mention input size limits or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is reasonably concise: 3 sentences plus an example. It front-loads the core purpose and then explains special cases. The example is helpful and earned its place. Could be slightly tighter, but not verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Lacks an output schema, but the description explains the return structure ('{kind, hash}' with extra fields for eip712). For a hash calculation tool, this covers key details. Missing minor aspects like error responses or behavior on invalid input, but overall sufficient given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 4 parameters have descriptions in the input schema (100% coverage). The description adds value by explaining that for eip712, 'input_format' is ignored and 'data' is a JSON object, and provides an example of the output format. This goes beyond the schema without being redundant.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool computes Ethereum hashes with three specific flavors: keccak-256, EIP-191, and EIP-712. This differentiates it from sibling tools like 'hash' or 'ens_namehash', making purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an example but does not explicitly state when to use this tool vs alternatives like 'hash' for non-Ethereum hashes or 'eth_selector' for function selectors. Usage context is implied, but no exclusions or comparative guidance are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eth_selectorA
Derive the 4-byte function selector or 32-byte event topic from a signature.
Returns {kind, signature (canonicalized), selector} for functions, or {kind, signature, topic0} for events.
Example: eth_selector("transfer(address,uint256)") -> selector="0xa9059cbb".
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | 'function' returns the 4-byte selector; 'event' returns the 32-byte topic0 (keccak of the canonical signature). | function |
| signature | Yes | A Solidity function/event signature, e.g. 'transfer(address,uint256)'; parameter names, data locations, and type aliases (uint->uint256) are normalized to canonical ABI form. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral disclosure. It transparently states the return structure (kind, signature, selector/topic0) and mentions canonicalization of signatures. However, it does not cover error cases (e.g., invalid signature) or performance characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is highly concise: two sentences plus an example. It front-loads the core purpose and uses minimal, precise language. Every sentence adds value—introducing functionality, detailing return values, and illustrating with an example.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple derivation tool with no output schema, the description covers purpose, input parameter meaning, and return format. It provides sufficient context for an agent to use the tool correctly. Minor gaps include lack of error handling info, but overall completeness is strong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema provides detailed descriptions for both parameters (signature normalization, kind enum), giving 100% schema description coverage. The description adds value by explaining the return format and providing an example, but does not significantly augment parameter semantics beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool derives a 4-byte function selector or 32-byte event topic from a signature, with specific verb 'derive' and resource 'signature'. It distinguishes between function and event via the kind parameter and provides a concrete example, leaving no ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context (deriving selectors/topics for ABI encoding) but does not explicitly state when to use this tool versus alternatives like eth_hash or abi_codec. No when-not or exclusion criteria are given, leaving the agent to infer applicability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eth_storage_slotA
Compute the storage slot for a mapping/array entry given a layout.
layout: {"kind": "mapping"|"dynamic_array", "slot": , ...}
mapping -> needs key; "key_type" (default uint256). For nested
mappings pass key (and optionally "key_type") as lists.
dynamic_array -> needs index; optional "element_size" in slots (default 1).
Returns {slot, slot_hex}: the slot as a decimal string and a 0x 32-byte word.
Example: eth_storage_slot({"kind":"mapping","slot":1}, "0x0000000000000000000000000000000000000000") -> slot_hex="0xa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49".
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | Mapping key (required for kind=mapping); pass a list of keys outer-to-inner for nested mappings. Ignored for arrays. | |
| index | No | Element index (required for kind=dynamic_array); int/decimal/0x-hex. Ignored for mappings. | |
| layout | Yes | Layout object: {"kind":"mapping"|"dynamic_array", "slot": <declared base slot, int/decimal/0x-hex>, ...}. mapping takes optional "key_type" (default "uint256"; lists for nested mappings); dynamic_array takes optional "element_size" in slots (default 1). A stringified JSON object is accepted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description covers input types (layout, key, index), return format (decimal slot string and 0x-hex 32-byte word), and additional options like 'key_type' and 'element_size'. It does not disclose error behavior or side effects, but for a computation tool this is acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise yet informative, front-loading the main purpose and then detailing parameters and example. It could be slightly more terse, but the structure is well-organized and every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of storage slot computation (nested mappings, key_type, element_size), the description is thorough. It covers both kinds, optional parameters, nested key lists, return format, and includes an example. Since there is no output schema, the description adequately fills that gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value by explaining how the layout object works (kind, slot, key_type, element_size), provides an example, and clarifies nested mapping syntax. This goes beyond what the schema properties alone convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool computes storage slots for mapping/array entries, specifying the two kinds (mapping, dynamic_array) and their required parameters. It distinguishes itself from sibling tools which are unrelated encoding/hash utilities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete usage contexts: mapping requires a 'key', dynamic_array requires an 'index', and notes nested mapping handling. It includes an example. However, it doesn't explicitly state when not to use this tool (but siblings are clearly different domains).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eth_tx_codecA
Serialize signed tx fields into a raw transaction, or decode a raw tx.
action=encode (needs fields) serializes the supplied, already-signed fields
(it does not sign) -> {type, raw:'0x...', hash}. fields is an object; the
type is taken from a type key or inferred from which fields are present
(maxFeePerGas -> 1559, blobVersionedHashes -> 4844, accessList -> 2930, else
legacy). Numbers accept int / decimal / 0x-hex; to/data are 0x-hex.
action=decode (needs data, a 0x-hex raw tx) -> {type, fields, hash, from},
recovering from from the signature; numeric fields come back as decimal
strings, addresses EIP-55 checksummed.
Example: eth_tx_codec("encode", fields={"nonce":0,"gasPrice":"0x09184e72a000", "gasLimit":"0x2710","to":"0x00..00","value":0,"data":"0x"}) -> type=0, raw="0xe5808609184e72a00082271094...808080".
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | 0x-prefixed raw transaction bytes to decode (required for action=decode): a legacy RLP list or an EIP-2718 typed envelope. | |
| action | Yes | 'encode' signed fields into a raw tx, or 'decode' a raw tx. | |
| fields | No | Already-signed tx fields object (required for action=encode); does NOT sign. The type comes from a `type` key or is inferred (maxFeePerGas->1559, blobVersionedHashes->4844, accessList->2930, else legacy). Numbers accept int/decimal/0x-hex; `to`/`data` are 0x-hex. A stringified JSON object is accepted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full disclosure burden. It clearly states that encode does not sign, decode recovers the 'from' address, and specifies number formats and address checksumming. It does not explicitly declare non-destructiveness or statelessness, but the codec nature implies read-only behavior. Additional details about type inference add transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two substantive paragraphs and a concrete example. Every sentence contributes useful information; there is no redundancy or filler. The example illustrates typical usage, aiding understanding without unnecessary length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of output schema and complexity (two actions, field inference, multiple formats), the description provides complete coverage. It explains both actions, return formats for each ({type, raw, hash} for encode, {type, fields, hash, from} for decode), and includes an example. No gaps are apparent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 100% schema coverage, the description adds significant semantic value beyond the schema. It explains how to structure the 'fields' object for encode, the inference rules for transaction type, accepted number formats (int/decimal/0x-hex), and that 'data' is required for decode. This enriches the schema's basic parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Serialize signed tx fields into a raw transaction, or decode a raw tx.' It specifies the two actions (encode/decode) and the resources involved, making it distinct from sibling tools that handle other codec tasks (e.g., abi_codec, rlp_codec).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains how to use the tool with action=encode or decode and the required parameters. However, it does not explicitly state when to use this tool over alternatives like rlp_codec or abi_codec, nor does it provide contraindications. The usage context is implied for Ethereum transactions but lacks direct comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hashA
Compute a cryptographic, CRC, or fast non-crypto digest of bytes.
length (output bytes) is required for shake_*; key keys blake2b/blake2s
(decoded with input_format); seed reseeds xxh*/fnv1a_*.
Returns {algorithm, digest, output_format, bits}; CRC and fast hashes
additionally report their integer value as int.
Example: hash("abc", "sha256") -> digest
"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | Key for blake2b/blake2s only, decoded with `input_format`. Default None. | |
| data | Yes | Input to hash, decoded to bytes via `input_format`. | |
| seed | No | Seed reseeding xxh*/fnv1a_* only. Default None. | |
| length | No | Output length in bytes, required for shake_128/shake_256 and invalid otherwise. Default None. | |
| algorithm | Yes | Digest algorithm: crypto (md5/sha1/sha2/sha3/blake2*), shake_128/shake_256 (need `length`), CRC (crc8/16/32/32c/64), xxhash (xxh32/64/3_64/3_128), or fnv1a_32/fnv1a_64. | |
| input_format | No | How `data` (and `key`) are decoded; default 'text'. | text |
| output_format | No | How the digest is rendered (bare hex, no 0x); default 'hex'. | hex |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
In the absence of annotations, the description discloses the return object structure (algorithm, digest, output_format, bits) and additional int field for CRC/fast hashes. It explains parameter effects (length, key, seed) and algorithm-specific requirements. No side effects or rate limits are mentioned, but these are not expected for a hash function.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, using backticks for parameter names and a compact example. Each sentence adds value: purpose, parameter usage, return format, and example. No fluff, though it could be slightly shorter. Good structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters with 100% schema coverage and no output schema, the description covers return values, parameter usage for algorithm families, and gives an example. It is complete enough for a hash tool, though error handling or default behavior clarification (e.g., output_format default) is not explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3. The description adds significant meaning: it explains which parameters are required for specific algorithms (length for shake_*, key for blake2*, seed for xxh*/fnv1a_*), describes the return value with examples, and clarifies decoding behavior via input_format. This goes beyond schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Compute a cryptographic, CRC, or fast non-crypto digest of bytes,' which is a specific verb-resource pair. It distinguishes from siblings like hash_file (file hashing) and hmac (keyed hashing) by listing algorithm categories and noting parameter requirements for specific algorithms.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description specifies when certain parameters are required (e.g., length for shake_*, key for blake2*, seed for xxh*/fnv1a_*). It does not explicitly state when to use this tool vs siblings like hash_file or hmac, but the context of sibling tools and the clear algorithm list implies usage scope. An example is provided, aiding understanding.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hash_fileA
Checksum a file on disk, optionally verifying it against an expected digest.
Crypto digests stream the file in 1 MiB chunks; CRC/xxh/fnv read it whole.
When expected is supplied, verified reports whether it matches the digest
(compared as bytes, so case/0x/whitespace differences are tolerated).
Returns {algorithm, digest, path, size}, plus verified when expected is
given.
Example: hash_file("/etc/hostname", "sha256") -> {digest, path, size, ...}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Filesystem path of the file to checksum. | |
| expected | No | Expected digest to verify against, in `output_format`; case/`0x`/whitespace tolerated. Default None skips verification. | |
| algorithm | No | Digest algorithm: crypto (md5/sha1/sha2/sha3/blake2*), CRC (crc8/16/32/32c/64), xxhash, or fnv1a_*. shake_* is excluded (no `length` arg). Default 'sha256'. | sha256 |
| output_format | No | How the digest is rendered (bare hex, no 0x); default 'hex'. | hex |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavioral traits: how different algorithms process the file (crypto streams in chunks; CRC/xxh/fnv reads whole), how verification compares digests (as bytes, tolerant to case/0x/whitespace), and the return structure including optional 'verified' field. This provides comprehensive transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with key information front-loaded. It is slightly verbose but every sentence adds value. It could be slightly more concise, but overall it efficiently conveys necessary details without excessive wordiness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking an output schema, the description thoroughly explains the return value structure (algorithm, digest, path, size, and optional verified). It covers all parameters, algorithm categories, verification behavior, and provides an example, making it fully complete for an agent to understand the tool's functionality.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds significant meaning beyond the schema: it explains the streaming vs. whole-file behavior for algorithm categories, details the verification comparison logic, and gives an explicit example. This enhances understanding of parameter usage and behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Checksum a file on disk, optionally verifying it against an expected digest.' It uses a specific verb ('checksum') and resource ('file on disk'), and distinguishes itself from sibling tools like 'hash' by explicitly focusing on disk files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly guides usage by specifying the tool is for files on disk, and it describes behavioral differences between algorithm families (streaming vs. whole-file). However, it does not explicitly state when not to use this tool or mention alternatives (e.g., 'hash' for in-memory hashing), but the context is clear enough for an agent to select appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hmacA
Compute or verify an HMAC authentication tag over data with a secret key.
data and key are decoded with input_format / key_format. When
expected is supplied, valid reports a constant-time comparison against the
computed tag (tolerant of case/0x/whitespace in the expected value).
Returns {algorithm, mac, output_format}, plus valid when expected is given.
Example: hmac("msg", "key") -> mac "2d93cbc1be167bcb1637a4a23cbff01a..."
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Secret key, decoded via `key_format`. | |
| data | Yes | Message to authenticate, decoded via `input_format`. | |
| expected | No | Expected tag to verify against, in `output_format`; case/`0x`/whitespace tolerated, compared constant-time. Default None skips verification. | |
| algorithm | No | Underlying cryptographic hash (HMAC digestmod): md5/sha1/sha2*/sha3*/blake2*. Default 'sha256'. | sha256 |
| key_format | No | How `key` is decoded to bytes; default 'text'. | text |
| input_format | No | How `data` is decoded to bytes; default 'text'. | text |
| output_format | No | How the tag is rendered (bare hex, no 0x); default 'hex'. | hex |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses decoding of data/key, constant-time comparison for verification, tolerance of formatting in expected value, and the returned fields. It is transparent about the main behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with two paragraphs and an example. It front-loads the main purpose and each sentence adds meaningful detail without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite 7 parameters, the description fully explains purpose, parameter roles, behavior (decoding, verification), and return values. No output schema exists, but the description compensates by listing returned fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining decoding, constant-time comparison, and tolerance in expected format, beyond what the schema lists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool computes or verifies an HMAC authentication tag, specifying the verb and resource. It distinguishes from sibling tools like 'hash' and 'hash_file' by focusing on keyed HMAC authentication.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to compute vs verify based on the 'expected' parameter. It does not explicitly mention alternatives, but the name and context imply its specific use for HMAC, which is clear enough for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
id_generateA
Generate one or more identifiers (UUID / ULID / nanoid).
All randomness is drawn from the OS CSPRNG (secrets). kind selects the
family and which args apply. uuid honours version (default 4): v1 is
time-based with a random node ID rather than the host MAC, v4 is 122 random
bits, v5 is the SHA-1 of name within namespace (dns|url|oid|x500 or a
UUID string) and so is deterministic — a count above 1 repeats it — and v7
is a 48-bit millisecond timestamp plus 74 random bits, which sorts by
creation time. ulid is the same clock rendered as 26 Crockford base32
characters, also time-sortable. nanoid draws size (default 21) symbols from
alphabet (default 64 url-safe chars). Returns {kind, ids} plus the resolved
version (uuid) or size (nanoid).
Example: id_generate("uuid", version=5, namespace="dns", name="example.com")
-> ids ["cfbff0d1-9375-5685-968c-48ce8b15ae17"]
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Identifier family: uuid (see `version`), ulid (time-sortable, 26 chars), or nanoid (custom `alphabet`/`size`). | |
| name | No | UUID v5 name hashed within `namespace`, e.g. a hostname. Required with version=5. | |
| size | No | Character count for kind=nanoid; default None means 21. | |
| count | No | How many IDs to generate, 1..1000; default 1. | |
| version | No | UUID version for kind=uuid: 1 (time+random node), 4 (random), 5 (SHA-1 of namespace+name), 7 (time-sortable). Default 4. | |
| alphabet | No | Symbol set for kind=nanoid; default None uses the standard 64-char url-safe alphabet [A-Za-z0-9_-]. | |
| namespace | No | UUID v5 namespace: dns|url|oid|x500, or a UUID string. Required with version=5. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses key behaviors: randomness source (OS CSPRNG), determinism for v5, time-sortability for v7 and ulid, and return format. No destructive actions are implied, and all traits are accurately described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, starting with a clear summary, then breaking down each kind systematically. No redundant sentences; each adds value. The example at the end is efficient and illustrative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, multiple modes) and no output schema, the description covers all necessary context: parameter dependencies, return structure, and example usage. It is fully self-contained for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds substantial meaning beyond schema descriptions, explaining how each parameter affects output (e.g., version effects, default sizes, required combinations). The example further clarifies parameter interplay.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool generates identifiers (UUID/ULID/nanoid) with specific verbs and resource types. It distinguishes between families and versions, providing a precise scope that differentiates from sibling tools like 'random' or 'hash'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While no explicit 'when to use' statement is given, the highly detailed description covers all variants and parameters, enabling an agent to infer appropriate contexts (e.g., deterministic IDs for v5, time-sortable for v7). No sibling tool duplicates this functionality, making usage unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
infoA
Discovery / health-check entrypoint: report availability and enabled toolsets.
Returns six keys: status ("available"), name, version (package version),
python (runtime version), mcp_sdk (MCP SDK version, or "unknown"), and
toolsets (sorted list of live optional toolsets).
Example: {"status":"available","name":"mcp-bytesmith","version":"0.1.0",
"python":"3.12.3","mcp_sdk":"1.2.0","toolsets":["ethereum","serialize"]}
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description fully discloses behavior: it reports system info with no side effects. The example provides concrete output format details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with purpose, and includes a helpful example. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description fully covers the response format, keys, and example, making it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, baseline is 4. The description adds value by explaining the output fields beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool as a discovery/health-check entrypoint, listing the six keys returned. It distinguishes from sibling tools that perform specific data transformations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose is self-evident for a health-check tool; no explicit when-not or alternatives are needed. It implicitly guides use for system availability and version checking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
num_convertA
Convert a big-integer between bases (hex/dec/bin/oct).
Parses value as a from_base integer (a leading 0x/0b/0o and a - sign
are accepted) and renders it in to_base, prefixed for non-decimal output.
pad_bytes zero-fills the output to that byte width (a minimum, never
truncating); it is bit-aligned, so it is rejected for decimal output.
Arbitrary precision — a 32-byte RPC value converts losslessly.
Returns {value, from_base, to_base, result}.
Example: num_convert("255", "dec", "hex") -> result "0xff"
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | Integer to convert, read in `from_base`; a leading 0x/0b/0o radix prefix and a '-' sign are accepted. | |
| to_base | Yes | Base to render the result in; non-decimal output is prefixed 0x/0b/0o. | |
| from_base | Yes | Base of `value`: hex (16), dec (10), bin (2), oct (8). | |
| pad_bytes | No | Zero-fill the output to this byte width (a minimum, never truncating); bit-aligned, so rejected for decimal output. Default None means no padding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the full burden. It explains accepted prefixes, non-decimal output prefixing, pad_bytes behavior (minimum, never truncating, bit-aligned, rejected for decimal), arbitrary precision, and return keys. It lacks error handling details but is otherwise thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise at four sentences, well-structured with purpose first, then details, then example. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description covers input format, bases, padding, precision, and return keys. It includes an example. It could mention error handling but is sufficient for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, providing baseline 3. The description adds significant value by clarifying pad_bytes is a minimum, never truncating, bit-aligned, and rejected for decimal; explains output prefixes; and describes return structure. It goes beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Convert a big-integer between bases (hex/dec/bin/oct)', using a specific verb and resource. It distinguishes itself from sibling tools like byte_order or encode by focusing on base conversion with arbitrary precision and giving an example.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for base conversion but does not explicitly state when to use or avoid this tool compared to alternatives. No guidance on when not to use or mention of sibling differences.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
otpauth_uriA
Build an otpauth:// provisioning URI from parts, or parse one (Key URI Format).
action=build (needs secret): assembles
otpauth://<type>/<label>?secret=...&issuer=... — secret is normalized to
canonical base32, type='hotp' requires counter, and counter/period
must match the type. action=parse (needs uri): returns type, the decoded
label (plus issuer/account split on the first ':'), secret, and the
algorithm/digits/period/counter parameters with their RFC defaults.
This codec never computes OTP codes; the base32 secret is passed through.
Example: otpauth_uri("build", label="alice@example.com", secret="JBSWY3DPEHPK3PXP",
issuer="Example") -> "otpauth://totp/Example:alice@example.com?secret=...&issuer=Example"
| Name | Required | Description | Default |
|---|---|---|---|
| uri | No | The 'otpauth://...' URI to parse (action=parse). Default None. | |
| type | No | OTP kind: 'totp' (time-based, RFC 6238) or 'hotp' (counter-based, RFC 4226). Default 'totp'. | totp |
| label | No | Account label for build, e.g. 'alice@example.com'. If `issuer` is set and the label has no 'issuer:' prefix, one is added. Default None. | |
| action | Yes | 'build' assembles an otpauth:// URI from parts (needs `secret`); 'parse' splits one into its parts (needs `uri`). | |
| digits | No | Number of code digits (commonly 6 or 8). Default None. | |
| issuer | No | Provider name, e.g. 'Example Inc'. Default None. | |
| period | No | TOTP time step in seconds (totp only). Default None. | |
| secret | No | Base32 shared secret (RFC 4648, A-Z2-7) for build; spaces and '=' padding are ignored. Default None. | |
| counter | No | HOTP counter (required for and valid only with type='hotp'). Default None. | |
| algorithm | No | HMAC hash: SHA1 (default when omitted), SHA256, or SHA512. Default None. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses that the tool never computes OTP codes, normalizes secret to base32, and applies RFC defaults. It does not discuss security implications of secret handling, but for a codec tool, it is adequately transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph but is well-structured, front-loading the purpose and splitting into build/parse sections with an example. It is concise given the complexity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having 10 parameters and no output schema, the description explains the two modes, the return values (URI or parsed parts), and key parameter constraints. It is fairly complete for a codec tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining interactions (e.g., label handling with issuer, counter required for hotp) and provides an example. This goes beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool builds or parses otpauth:// URIs, with specific verbs and a resource. It distinguishes between build and parse actions, and the example reinforces the purpose. No confusion with sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use build (needs secret) vs parse (needs uri), and notes constraints like type='hotp' requires counter. It does not explicitly mention when not to use the tool, but the guidance is clear enough for correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
password_hashA
Hash a password into a verifiable storage string, or check one against it.
action=hash (needs scheme) returns encoded, a self-describing string that
carries the scheme, its cost params and the salt: bcrypt's $2b$… and
argon2's PHC string verbatim, and for the stdlib schemes the PHC-shaped
$scrypt$ln=14,r=8,p=1$<salt>$<hash> / $pbkdf2-sha256$i=600000$<salt>$<hash>
(base64 fields, padding stripped). action=verify reads the scheme back out of
encoded and returns {"valid": true|false} — a wrong password is a result,
not an error (§2.0.5); only a malformed encoded raises. The password itself
is never echoed (§2.0.6). bcrypt/argon2* need the crypto extra.
Example: password_hash("hash", "hunter2", scheme="pbkdf2",
params={"iterations": 100000}) -> {"encoded": "$pbkdf2-sha256$i=100000$..."}
| Name | Required | Description | Default |
|---|---|---|---|
| salt | No | Salt as hex, for reproducible hashing (action='hash'). bcrypt needs exactly 16 bytes, argon2 at least 8. Omit — the default — to draw 16 fresh CSPRNG bytes, which is what you want in production. | |
| action | Yes | 'hash' derives a storage string from `password` (needs `scheme`); 'verify' checks `password` against `encoded`. | |
| params | No | Cost parameters overriding the scheme's defaults: bcrypt {rounds:12}; argon2 {time_cost:3, memory_cost:65536 (KiB), parallelism:4, hash_len:32}; scrypt {ln:14, r:8, p:1, dklen:32}; pbkdf2 {iterations:600000, prf:'sha256', dklen:32}. Default None. | |
| scheme | No | Password-hashing scheme (required for action='hash'). bcrypt and the argon2 variants need the `crypto` extra; scrypt and pbkdf2 are stdlib. On action='verify' it is read from `encoded`, and if given must agree with it. Default None. | |
| encoded | No | The stored hash string to check against (action='verify'). Default None. | |
| password | Yes | The password, read as UTF-8. Never echoed back. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Rich disclosure: password never echoed, wrong password is a result not error, malformed encoded raises, encoding format for each scheme, dependency on crypto extra, example output. With no annotations, description carries full burden and exceeds it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with action descriptions, encoding details, and an example. Slightly long but each sentence earns its place. Could be slightly more concise but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Very complete given 6 parameters, no output schema, no annotations. Covers both actions, error handling, encoding format, parameter semantics, dependencies. Output shapes are implied. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions, but description adds significant context: salt explains production defaults, params lists scheme-specific cost defaults, scheme mentions crypto extra, encoded explains self-describing format. Provides example usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource: 'Hash a password into a verifiable storage string, or check one against it.' Specifies two distinct actions (hash and verify) with distinct return values. Distinct from sibling tools like hash (general) and derive_key (KDF).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool vs alternatives like hash or derive_key. Only mentions that bcrypt/argon2 need the crypto extra, which is a dependency note, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
randomA
Generate cryptographically secure random bytes, a token, or a passphrase.
All randomness is drawn from the OS CSPRNG (secrets). kind selects the
shape and which sizing arg applies: bytes|hex|urlsafe draw nbytes (default
32) random bytes — bytes renders them via output_format (hex/base64), hex
is the same bytes as hex, urlsafe is RFC 4648 url-safe base64; token is a
length-character (default 32) alphanumeric [A-Za-z0-9] string; passphrase
joins words (default 6) words with separator (default '-'), drawn from
wordlist or the bundled EFF large diceware list. Returns {kind, value,
entropy_bits}; the value is the only secret and is never logged elsewhere.
Example: random("hex", nbytes=4) -> value "6a08ed95" (8 hex chars, 32 bits)
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Output shape: bytes|hex|urlsafe draw `nbytes` random bytes; token is `length` alphanumeric chars; passphrase joins `words` diceware words. Default 'urlsafe'. | urlsafe |
| words | No | Word count for kind=passphrase; default 6. | |
| length | No | Character count for kind=token; default None means 32. | |
| nbytes | No | Byte count for kind=bytes/hex/urlsafe; default 32. | |
| wordlist | No | Custom passphrase word list; default None uses the bundled EFF large diceware list (7776 words). | |
| separator | No | Joiner between passphrase words; default '-'. | - |
| output_format | No | Rendering for kind=bytes (hex/base64); default 'hex'. | hex |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavioral traits: randomness source (OS CSPRNG via `secrets`), output structure ({kind, value, entropy_bits}), security note that value is never logged, and detailed parameter mappings for each kind. This covers all important behavioral aspects beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but well-structured, front-loading the purpose and then detailing each `kind`. Every sentence is informative, though the example could be slightly more concise. It earns its length given the complexity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters, no output schema, and no annotations, the description is remarkably complete. It explains all parameter interactions, defaults, output format options, and security considerations. No missing information is apparent for correct tool usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining how `kind` selects which sizing parameter applies (e.g., nbytes for bytes/hex/urlsafe, length for token, words for passphrase), default behaviors, and provides an example. This meaningfully extends the schema's descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool generates cryptographically secure random bytes, tokens, or passphrases, with specific verb 'generate' and resource 'random bytes/token/passphrase'. It clearly distinguishes from sibling tools focused on encoding, hashing, or data transformation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use each `kind` (bytes, hex, urlsafe, token, passphrase) and the relevant parameters, providing clear context for selection. However, it does not explicitly state when not to use the tool or mention alternative tools among siblings, though the unique randomness focus makes this less critical.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rlp_codecA
RLP-encode structured data, or RLP-decode a hex string.
Encode data is a recursive structure: a leaf (hex string, or a non-negative
integer stored minimal big-endian) or a JSON array of items (nested allowed);
a JSON-array string is parsed too. action=encode -> {encoded:'0x...'}.
Decode data is a 0x-hex string; action=decode -> {decoded} with leaves as
0x-hex and lists as arrays.
Example: rlp_codec("encode", ["0x636174"]) -> encoded="0xc483636174".
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | On encode: a leaf (0x-hex string or non-negative integer) or a (possibly nested) JSON array of items; a stringified JSON array is parsed. On decode: a 0x-prefixed hex string of the RLP payload. | |
| action | Yes | 'encode' structured data to RLP, or 'decode' a hex RLP. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully explains the tool's behavior: input formats for encode vs decode, output structure ({encoded: '0x...'} for encode, {decoded} with leaves as hex and lists as arrays). It also clarifies that encode accepts recursive structures. No behavioral traits (e.g., side effects, auth needs) are missing for this codec tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the core purpose, and uses efficient sentences. The example is placed at the end without redundancy, earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of a recursive codec tool, the description covers input schemas (both action and data), output format via text, and provides an example. No output schema exists, but the description sufficiently explains return values for both actions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant meaning beyond the schema: it explains the recursive structure for data, the leaf types (hex string, integer), and action's purpose. The example further clarifies the expected format and output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'RLP-encode structured data, or RLP-decode a hex string.' This specific verb+resource combination distinguishes it from sibling tools like abi_codec or decode by explicitly naming RLP.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for usage (encoding structured data or decoding hex strings) and includes an example. However, it does not explicitly state when not to use this tool or mention alternatives among siblings, which would improve guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
string_escapeA
Escape text for a source-code or markup context (JSON/JS/C/shell/HTML/...).
style picks the convention: json|js|python|c|backslash (backslash escapes),
html|xml (entities), unicode_escape (\uXXXX/\xNN), quoted_printable, or
mime_word (=?UTF-8?B?...?=). shell yields a paste-safe single-quoted token.
For URL %-escaping use encode(scheme='url') instead. An unknown style raises
ValueError. Returns {style, result}. Inverse: string_unescape.
Example: string_escape('a"b', "json") -> result 'a"b'
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to escape. | |
| style | Yes | Escaping convention: json|js|python|c|backslash (backslash escapes), html|xml (entities), unicode_escape, quoted_printable, mime_word (=?UTF-8?B?...?=), or shell (paste-safe single-quoted token). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Discloses return value {style, result}, error on unknown style, example output, and shell behavior. Lacks details on edge cases but covers major behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus example, front-loaded with main purpose, no redundant text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description adequately explains output structure, error handling, and provides example. Covers all crucial aspects for a complex tool with multiple styles.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters; description adds value by listing all style options, explaining shell's behavior, and giving a usage example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'Escape text for a source-code or markup context', names multiple styles, provides example, and distinguishes from sibling encode (URL escaping).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use encode instead for URL escaping, mentions that unknown style raises ValueError, and references inverse string_unescape.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
string_unescapeA
Reverse a source-code or markup escaping back to the original text.
Style-for-style inverse of string_escape (json|js|python|c|backslash escape
sequences, html|xml entities, unicode_escape, quoted_printable, mime_word,
and shell). Malformed escape sequences (and an unknown style) raise
ValueError. Returns {style, result}.
Example: string_unescape('a\nb', "json") -> result "ab"
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Escaped text to decode back to its original form. | |
| style | Yes | Escaping convention `text` is in (inverse of string_escape): json|js|python|c|backslash, html|xml, unicode_escape, quoted_printable, mime_word, or shell. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It states malformed sequences and unknown style raise ValueError, and returns {style, result}. It doesn't mention side effects or explicitly state it's read-only, but the behavior is well-covered for a pure function.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences with no waste. First sentence states purpose, second lists styles and errors, third gives an example. Perfect front-loading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given two well-documented parameters, no output schema, and no annotations, the description fully covers behavior, errors, and example. No gaps apparent for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with descriptions. Description adds value by listing all styles and providing an example of use, which clarifies the style parameter beyond the enum list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it reverses escaping back to original text, identifies itself as the inverse of string_escape, and provides an example. It distinguishes from sibling string_escape.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says it's the 'style-for-style inverse of string_escape' and lists supported styles. It implicitly tells when to use (for unescaping) but lacks explicit exclusions or when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
time_convertA
Convert a timestamp between textual formats (ISO 8601/RFC 2822/HTTP/unix/strftime) and time zones.
Parses value per from_format (auto sniffs iso8601/rfc2822/http/unix),
anchors a NAIVE result with from_zone (an input that already carries an
offset ignores it), shifts the instant into to_zone, and renders it as
to_format. Formats: iso8601 (RFC 3339), rfc2822, http (IMF-fixdate, always
GMT), unix/unix_ms/unix_us/unix_ns epoch, and strftime (needs format_pattern
on whichever side uses it). Zones are an IANA name (Europe/Budapest), UTC, or
a ±HH:MM offset. Returns {result, from_format, to_format, zone, unix};
from_format echoes the detected format under auto, unix is the integer
epoch-seconds anchor.
Example: time_convert("1700000000", "iso8601") -> result
"2023-11-14T22:13:20+00:00"
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | Timestamp to convert, parsed per `from_format`. | |
| to_zone | No | Zone to shift the instant into before rendering; IANA name, UTC, or ±HH:MM offset. Default 'UTC'. Ignored for http (always GMT). | UTC |
| from_zone | No | Zone anchoring a naive input (no offset): an IANA name (Europe/Budapest), UTC, or a ±HH:MM offset. Default 'UTC'. Ignored when the input already carries an offset. | UTC |
| to_format | Yes | Output format: iso8601 (RFC 3339), rfc2822, http (IMF-fixdate, always GMT), unix/unix_ms/unix_us/unix_ns epoch, or strftime (needs `format_pattern`). | |
| from_format | No | Format of `value`; default 'auto' sniffs iso8601/rfc2822/http/unix. strftime needs `format_pattern`. | auto |
| format_pattern | No | strptime/strftime pattern, required on whichever side (from_format/to_format) is 'strftime'. Default None. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description fully carries the burden. It details parsing, anchoring naive inputs with from_zone, shifting to to_zone, rendering to_format, and return structure (result, from_format, to_format, zone, unix). It also explains edge cases like offset-carrying inputs and http overriding to_zone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed and well-structured, starting with purpose and then parameter behavior. It is slightly verbose but each sentence adds necessary detail. Could be slightly tighter without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description fully explains the return object format. It covers all parameters, their interactions, and edge cases. The tool's behavior is completely specified for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant value by explaining the processing flow: parsing per from_format, anchoring with from_zone, shifting to to_zone, and rendering. It clarifies when from_zone is ignored and that http overrides to_zone, which goes beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool converts timestamps between textual formats and time zones, listing specific formats (ISO 8601, RFC 2822, HTTP, unix, strftime) and zone handling. It is distinct from sibling tools which are all encoding, hashing, or data transformation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool for timestamp conversion, including nuances like ignoring from_zone for non-naive inputs and http format always using GMT. It does not explicitly mention alternatives, but siblings are unrelated, making the context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unicode_normalizeA
Normalize text to a Unicode normalization form (NFC/NFD/NFKC/NFKD).
NFC/NFD are canonical compose/decompose; NFKC/NFKD also fold compatibility
characters (ligatures, full-width, circled digits) to their plain forms.
changed is true when result differs from the input — i.e. the text was
not already in form. Returns {form, result, changed}.
Example: unicode_normalize("fi", "NFKC") -> result "fi" (fi ligature, ① -> 1)
| Name | Required | Description | Default |
|---|---|---|---|
| form | No | Normalization form: NFC/NFD canonical compose/decompose; NFKC/NFKD also fold compatibility variants (ligatures, full-width, circled digits). Default 'NFC'. | NFC |
| text | Yes | Text to normalize. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains the normalization process, the meaning of `changed`, and the return object. It includes an example demonstrating the transformation. With no annotations, the description carries full burden and does so adequately, though edge cases or errors are not mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, with two paragraphs and an example. Every sentence adds value and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of output schema, the description explains the return object adequately. It covers normalization forms and provides an example. Missing error handling or invalid input cases, but for a simple tool this is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description repeats the schema's parameter descriptions but adds a helpful example. The additional value is moderate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool normalizes text to a Unicode normalization form, lists the four forms, and distinguishes between canonical and compatibility variants. The example clarifies the behavior, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on what the tool does, but does not explicitly state when to use it vs. alternatives. However, the sibling tools are sufficiently different (encoding, hashing), so the lack of explicit exclusion is not critical.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
8 tool updates
v0.4.0- Added
bip32_derive - Added
bip39 - Added
derive_key - Added
eth_contract_address - Added
eth_eoa_address - Added
id_generate - Added
otpauth_uri - Added
password_hash
24 tool updates
v0.3.0- Changed
abi_codec5 fields changed- added
Input schema / properties / action / description"'encode' values to ABI bytes, or 'decode' ABI bytes."
- added
Input schema / properties / data / description"0x-prefixed ABI-encoded bytes to decode (required for action=decode)."
- added
Input schema / properties / mode / description"'standard' head/tail ABI encoding, or 'packed' (abi.encodePacked: tight, no padding/length prefixes) — packed is encode-only as it is not uniquely decodable."
- added
Input schema / properties / types / description"List of ABI type strings, e.g. [\"uint256\",\"address\",\"(uint8,bytes)[]\"]; aliases uint/int/byte are normalized. A stringified JSON array is accepted."
- added
Input schema / properties / values / description"Values to encode (required for action=encode), positionally matching `types`; ints accept int/decimal/0x-hex, bytes are 0x-hex, addresses are 0x-hex. A stringified JSON array is accepted."
- Added
byte_order - Changed
bytes_edit8 fields changed- added
Input schema / properties / action / description"Edit to apply: pad (widen to `length`), trim (strip `fill`), slice (`start`:`end`), concat (append `parts`), size (report byte length), prefix (add/strip 0x)."
- added
Input schema / properties / data / description"Input byte-buffer as hex, a leading 0x is optional."
- added
Input schema / properties / end / description"Slice end index (Python indexing, negatives allowed); default None means end of buffer."
- added
Input schema / properties / fill / description"The pad/trim byte as one hex byte (0x optional); default '00'."
- added
Input schema / properties / length / description"Target byte width for action=pad. Default None."
- added
Input schema / properties / parts / description"Hex buffers to append for action=concat. Default None."
- added
Input schema / properties / side / description"Which side acts: pad prepend/append, trim leading/trailing, prefix add/strip 0x. Default 'left'."
- added
Input schema / properties / start / description"Slice start index (Python indexing, negatives allowed); default None means 0."
- Changed
charset_transcode4 fields changed- added
Input schema / properties / errors / description"Codec error handler applied to both legs: strict|replace|ignore|backslashreplace|…. Default 'strict'."
- added
Input schema / properties / from_charset / description"Encoding to encode `text` under to recover its raw bytes, e.g. cp1252, latin-1, utf-8."
- added
Input schema / properties / text / description"Text to reinterpret across encodings."
- added
Input schema / properties / to_charset / description"Encoding to decode those bytes under, e.g. utf-8."
- Added
codepoints - Changed
data_uri7 fields changed- added
Input schema / properties / action / description"'build' wraps a payload into a data: URI (needs `data`); 'parse' splits a URI into its parts (needs `uri`)."
- added
Input schema / properties / base64 / description"For build: true base64-encodes the payload (adds ';base64'), false percent-encodes it. Default true."
- added
Input schema / properties / data / description"Payload to wrap (action=build), decoded via `input_format`. Default None."
- added
Input schema / properties / input_format / description"How build `data` is decoded to bytes; default 'text'."
- added
Input schema / properties / media_type / description"MIME type for build, e.g. 'text/plain' or 'image/png'. Default None omits it."
- added
Input schema / properties / output_format / description"How parsed payload is rendered (text=UTF-8 | hex | base64); default 'text'."
- added
Input schema / properties / uri / description"The 'data:...' URI to parse (action=parse). Default None."
- Changed
decode4 fields changed- added
Input schema / properties / data / description"Encoded string to decode, in `scheme`'s format."
- added
Input schema / properties / options / description"Per-scheme options: alphabet (base58/base62). Default None."
- added
Input schema / properties / output_format / description"How recovered bytes are rendered: text=UTF-8, hex=bare (no 0x), base64. Default 'text'; pick hex/base64 for non-UTF-8 payloads."
- added
Input schema / properties / scheme / description"Source encoding (same set as `encode`): base16/32/.../64url, ascii85/base85/z85, url/url_form, idna, bech32/bech32m, hexdump, or bytes32."
- Changed
encode4 fields changed- added
Input schema / properties / data / description"Input to encode, decoded to bytes via `input_format` (idna/bytes32 read it as text)."
- added
Input schema / properties / input_format / description"How `data` is decoded to bytes; default 'text'."
- added
Input schema / properties / options / description"Per-scheme options: padding (bool, base32/64 family), alphabet (base58/62), hrp (required for bech32/bech32m), width (hexdump, default 16). Default None."
- added
Input schema / properties / scheme / description"Target encoding: base16/32/32hex/32crockford/45/58/58check/62/64/64url, ascii85/base85/z85, url/url_form (percent), idna, bech32/bech32m, hexdump, or bytes32 (32-byte EVM word)."
- Added
ens_namehash - Changed
eth_address_case2 fields changed- added
Input schema / properties / action / description"'encode' applies the EIP-55 checksum casing; 'verify' checks whether the input's casing already matches it."
- added
Input schema / properties / address / description"A 20-byte hex address, 40 hex chars with or without a 0x prefix; any casing is accepted (verify compares the given casing against the EIP-55 checksum)."
- Changed
eth_hash4 fields changed- added
Input schema / properties / data / description"Polymorphic: for keccak256/eip191 it is the message bytes decoded per input_format; for eip712 it is the typed-data JSON object (a JSON string or already-parsed dict with types/primaryType/domain/message) and input_format is ignored."
- added
Input schema / properties / input_format / description"How to decode `data` to bytes for keccak256/eip191 (ignored for eip712); hex is 0x-prefixed or bare."
- added
Input schema / properties / kind / description"Hash flavor: 'keccak256' (raw Ethereum keccak-256), 'eip191' (personal_sign prefixed message), or 'eip712' (typed-data digest)."
- added
Input schema / properties / output_format / description"Digest encoding: 'hex' is 0x-prefixed, or 'base64'."
- Changed
eth_selector2 fields changed- added
Input schema / properties / kind / description"'function' returns the 4-byte selector; 'event' returns the 32-byte topic0 (keccak of the canonical signature)."
- added
Input schema / properties / signature / description"A Solidity function/event signature, e.g. 'transfer(address,uint256)'; parameter names, data locations, and type aliases (uint->uint256) are normalized to canonical ABI form."
- Changed
eth_storage_slot3 fields changed- added
Input schema / properties / index / description"Element index (required for kind=dynamic_array); int/decimal/0x-hex. Ignored for mappings."
- added
Input schema / properties / key / description"Mapping key (required for kind=mapping); pass a list of keys outer-to-inner for nested mappings. Ignored for arrays."
- added
Input schema / properties / layout / description"Layout object: {\"kind\":\"mapping\"|\"dynamic_array\", \"slot\": <declared base slot, int/decimal/0x-hex>, ...}. mapping takes optional \"key_type\" (default \"uint256\"; lists for nested mappings); dynamic_array takes optional \"element_size\" in slots (default 1). A stringified JSON object is accepted."
- Changed
eth_tx_codec3 fields changed- added
Input schema / properties / action / description"'encode' signed fields into a raw tx, or 'decode' a raw tx."
- added
Input schema / properties / data / description"0x-prefixed raw transaction bytes to decode (required for action=decode): a legacy RLP list or an EIP-2718 typed envelope."
- added
Input schema / properties / fields / description"Already-signed tx fields object (required for action=encode); does NOT sign. The type comes from a `type` key or is inferred (maxFeePerGas->1559, blobVersionedHashes->4844, accessList->2930, else legacy). Numbers accept int/decimal/0x-hex; `to`/`data` are 0x-hex. A stringified JSON object is accepted."
- Changed
hash7 fields changed- added
Input schema / properties / algorithm / description"Digest algorithm: crypto (md5/sha1/sha2/sha3/blake2*), shake_128/shake_256 (need `length`), CRC (crc8/16/32/32c/64), xxhash (xxh32/64/3_64/3_128), or fnv1a_32/fnv1a_64."
- added
Input schema / properties / data / description"Input to hash, decoded to bytes via `input_format`."
- added
Input schema / properties / input_format / description"How `data` (and `key`) are decoded; default 'text'."
- added
Input schema / properties / key / description"Key for blake2b/blake2s only, decoded with `input_format`. Default None."
- added
Input schema / properties / length / description"Output length in bytes, required for shake_128/shake_256 and invalid otherwise. Default None."
- added
Input schema / properties / output_format / description"How the digest is rendered (bare hex, no 0x); default 'hex'."
- added
Input schema / properties / seed / description"Seed reseeding xxh*/fnv1a_* only. Default None."
- Added
hash_file - Added
hmac - Changed
num_convert4 fields changed- added
Input schema / properties / from_base / description"Base of `value`: hex (16), dec (10), bin (2), oct (8)."
- added
Input schema / properties / pad_bytes / description"Zero-fill the output to this byte width (a minimum, never truncating); bit-aligned, so rejected for decimal output. Default None means no padding."
- added
Input schema / properties / to_base / description"Base to render the result in; non-decimal output is prefixed 0x/0b/0o."
- added
Input schema / properties / value / description"Integer to convert, read in `from_base`; a leading 0x/0b/0o radix prefix and a '-' sign are accepted."
- Changed
random7 fields changed- added
Input schema / properties / kind / description"Output shape: bytes|hex|urlsafe draw `nbytes` random bytes; token is `length` alphanumeric chars; passphrase joins `words` diceware words. Default 'urlsafe'."
- added
Input schema / properties / length / description"Character count for kind=token; default None means 32."
- added
Input schema / properties / nbytes / description"Byte count for kind=bytes/hex/urlsafe; default 32."
- added
Input schema / properties / output_format / description"Rendering for kind=bytes (hex/base64); default 'hex'."
- added
Input schema / properties / separator / description"Joiner between passphrase words; default '-'."
- added
Input schema / properties / wordlist / description"Custom passphrase word list; default None uses the bundled EFF large diceware list (7776 words)."
- added
Input schema / properties / words / description"Word count for kind=passphrase; default 6."
- Changed
rlp_codec2 fields changed- added
Input schema / properties / action / description"'encode' structured data to RLP, or 'decode' a hex RLP."
- added
Input schema / properties / data / description"On encode: a leaf (0x-hex string or non-negative integer) or a (possibly nested) JSON array of items; a stringified JSON array is parsed. On decode: a 0x-prefixed hex string of the RLP payload."
- Changed
string_escape2 fields changed- added
Input schema / properties / style / description"Escaping convention: json|js|python|c|backslash (backslash escapes), html|xml (entities), unicode_escape, quoted_printable, mime_word (=?UTF-8?B?...?=), or shell (paste-safe single-quoted token)."
- added
Input schema / properties / text / description"Text to escape."
- Changed
string_unescape2 fields changed- added
Input schema / properties / style / description"Escaping convention `text` is in (inverse of string_escape): json|js|python|c|backslash, html|xml, unicode_escape, quoted_printable, mime_word, or shell."
- added
Input schema / properties / text / description"Escaped text to decode back to its original form."
- Added
time_convert - Changed
unicode_normalize2 fields changed- added
Input schema / properties / form / description"Normalization form: NFC/NFD canonical compose/decompose; NFKC/NFKD also fold compatibility variants (ligatures, full-width, circled digits). Default 'NFC'."
- added
Input schema / properties / text / description"Text to normalize."
19 tool updates
v0.0.1- First observed
abi_codec - First observed
bytes_edit - First observed
charset_transcode - First observed
data_uri - First observed
decode - First observed
encode - First observed
eth_address_case - First observed
eth_hash - First observed
eth_selector - First observed
eth_storage_slot - First observed
eth_tx_codec - First observed
hash - First observed
info - First observed
num_convert - First observed
random - First observed
rlp_codec - First observed
string_escape - First observed
string_unescape - First observed
unicode_normalize
TDQS
Each tool has a clearly distinct purpose, covering areas like encoding, hashing, Ethereum operations, and string manipulation without overlapping functionality. For example, hash, hmac, and password_hash are well-separated.
Tool names follow consistent patterns: Ethereum-specific tools use the 'eth_' prefix, encoding tools use clear verbs like encode/decode, and others use verb_noun or noun_verb (e.g., bip32_derive, time_convert). No mixing of conventions.
33 tools is slightly above the typical ideal range but remains manageable and well-justified given the broad scope of the server, which covers multiple domains like cryptography, Ethereum, and string processing.
The tool set covers a wide range of operations, including encoding, hashing, password management, Ethereum address/contract/tx handling, and time/unicode conversions. Minor gaps exist (e.g., cryptographic signing), but the core workflows are well-supported.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Read-only developer, date, finance, and text utilities. Authless remote MCP server by Clean.tools.
Remote MCP server: 10 developer utilities (base64, JWT, DNS, UUID, URL, JSON, UA, IP lookup).
MCP server for Klever blockchain smart contract development.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceA lightweight, fast MCP server that provides onchain capabilities for the LLMs and Agents.34253MIT
- AlicenseAqualityCmaintenanceAn MCP server that exposes the python-bitcoinlib API. It provides tools for Bitcoin key management, address generation, transaction building, script operations, and cryptography.20MIT
- FlicenseNot gradedqualityCmaintenanceA production-ready MCP server providing file, system, math, and text utilities through a simple CLI client.-
- AlicenseNot gradedqualityCmaintenanceA comprehensive math utility server implementing the Model Context Protocol (MCP) for reverse engineering and general-purpose arithmetic, bitwise, conversion, and encoding tasks via streamable HTTP.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/laszlopere/mcp-bytesmith'
If you have feedback or need assistance with the MCP directory API, please join our Discord server