Skip to main content
Glama
laszlopere

mcp-bytesmith

mcp-bytesmith

CI PyPI Python 3.10+ License: GPLv3 Sponsor mcp-bytesmith MCP server Ruff Checked with mypy Last commit

A pure-Python Model Context Protocol server, built on the official MCP SDK (MCPServer), 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 and the hash their sender signs, 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 (passed inline, or read from a file so the key stays out of the conversation), eth_contract_address for CREATE and CREATE2 deployment addresses, and eth_sign for secp256k1 signatures over a 32-byte hash — signing with a key the server reads from a file (there is no inline key argument), plus verifying, recovering the signer, and converting between r/s/v, 65-byte, and EIP-2098 compact forms. 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 suite

Sponsoring

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

40 tools
abi_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).

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNo0x-prefixed ABI-encoded bytes to decode (required for action=decode).
modeNo'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
typesYesList of ABI type strings, e.g. ["uint256","address","(uint8,bytes)[]"]; aliases uint/int/byte are normalized. A stringified JSON array is accepted.
actionYes'encode' values to ABI bytes, or 'decode' ABI bytes.
valuesNoValues 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

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

abi_inspectA

List an ABI's entries with their canonical signatures and selectors.

Accepts a JSON ABI or human-readable declarations and returns BOTH forms for every entry, so it converts in either direction. Returns {count, entries, selectors, topics}: entries carries {type, name, signature (canonical), human, inputs, outputs} per entry plus selector for functions and errors, topic0 and anonymous for events, and stateMutability when known; inputs/outputs are JSON ABI shape, so feeding human-readable text in and reading them out is the human -> JSON ABI direction, and human is the reverse. selectors maps every 4-byte selector to its canonical signature and topics every topic0 — the lookup table eth_calldata, eth_log_decode and eth_revert_decode take as input. collisions is added only if two distinct signatures share a selector. constructor/fallback/receive entries carry no signature or selector, having none.

Example: abi_inspect("function transfer(address to, uint256 amount)") -> selectors={"0xa9059cbb": "transfer(address,uint256)"}.

ParametersJSON Schema
NameRequiredDescriptionDefault
abiYesA contract ABI in either representation: a JSON ABI (array of entries, or one entry object), or human-readable Solidity declarations (one string, or an array of them) such as 'function transfer(address to, uint256 amount)'. A stringified JSON array or object is accepted.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so richly: it enumerates the return shape ({count, entries, selectors, topics}), the per-entry fields, the conditional `collisions` key, and the edge case that constructor/fallback/receive entries carry no signature or selector. This is exactly the disclosure a pure read-only tool needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence front-loads the purpose, and subsequent sentences are dense with return-shape detail that earns its place given there is no output schema. It is somewhat long and packed, but not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must document returns, and it does so completely — top-level keys, per-entry fields, conditional fields, edge cases, and a worked example. An agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it clarifies the tool converts in either direction and illustrates acceptance of human-readable and JSON forms, reinforced by a concrete example call.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource up front: 'List an ABI's entries with their canonical signatures and selectors.' It goes further to explain the bidirectional conversion, which clearly distinguishes it from siblings like abi_codec, eth_selector, and eth_calldata.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for use: accepts either ABI representation and returns both, and names eth_calldata, eth_log_decode, and eth_revert_decode as consumers of its `selectors`/`topics` output. However, it offers no explicit when-not guidance or direct routing against the most similar sibling (abi_codec).

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...", ...}.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesBIP-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.
seedYesBIP-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_formatNoHow to decode `seed` to bytes: 'hex' (0x optional) or 'base64'.hex

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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..."

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes'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`.
entropyNoEntropy 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.
mnemonicNoThe mnemonic sentence (required for validate/to_seed). Casing and extra whitespace are forgiven; it is never echoed back.
strengthNoEntropy bits for action=generate when `entropy` is omitted (128 -> 12 words, 256 -> 24 words). Ignored when `entropy` is given.
passphraseNoThe 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

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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"

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesHex byte buffer (0x-prefix optional) to byte-swap, treated as a sequence of fixed-size `width`-byte fields.
widthNoFixed 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_orderYesTarget byte order: little|big|network|host. Differing orders reverse each field; equal orders only apply width normalization.
from_orderYesCurrent byte order of `data`: little|big|network|host (network=big-endian, host=platform's sys.byteorder).
input_formatNoHow `data` is decoded to bytes; default 'hex'.hex
output_formatNoHow `result` is rendered; default 'hex'.hex

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 length bytes with the fill byte on side (left=prepend, right=append); never truncates if already wider.

  • trim: strip the fill byte (default 00) from side (left=leading, right=trailing) — the inverse of pad.

  • slice: take data[start:end] (Python indexing; negatives allowed).

  • concat: append each hex buffer in parts to data.

  • 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"

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoSlice end index (Python indexing, negatives allowed); default None means end of buffer.
dataYesInput byte-buffer as hex, a leading 0x is optional.
fillNoThe pad/trim byte as one hex byte (0x optional); default '00'.00
sideNoWhich side acts: pad prepend/append, trim leading/trailing, prefix add/strip 0x. Default 'left'.left
partsNoHex buffers to append for action=concat. Default None.
startNoSlice start index (Python indexing, negatives allowed); default None means 0.
actionYesEdit to apply: pad (widen to `length`), trim (strip `fill`), slice (`start`:`end`), concat (append `parts`), size (report byte length), prefix (add/strip 0x).
lengthNoTarget byte width for action=pad. Default None.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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é"

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesText to reinterpret across encodings.
errorsNoCodec error handler applied to both legs: strict|replace|ignore|backslashreplace|…. Default 'strict'.strict
to_charsetYesEncoding to decode those bytes under, e.g. utf-8.
from_charsetYesEncoding to encode `text` under to recover its raw bytes, e.g. cp1252, latin-1, utf-8.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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"

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesText to break into its constituent Unicode scalars.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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="

ParametersJSON Schema
NameRequiredDescriptionDefault
uriNoThe 'data:...' URI to parse (action=parse). Default None.
dataNoPayload to wrap (action=build), decoded via `input_format`. Default None.
actionYes'build' wraps a payload into a data: URI (needs `data`); 'parse' splits a URI into its parts (needs `uri`).
base64NoFor build: true base64-encodes the payload (adds ';base64'), false percent-encodes it. Default true.
media_typeNoMIME type for build, e.g. 'text/plain' or 'image/png'. Default None omits it.
input_formatNoHow build `data` is decoded to bytes; default 'text'.text
output_formatNoHow parsed payload is rendered (text=UTF-8 | hex | base64); default 'text'.text

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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"

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesEncoded string to decode, in `scheme`'s format.
schemeYesSource encoding (same set as `encode`): base16/32/.../64url, ascii85/base85/z85, url/url_form, idna, bech32/bech32m, hexdump, or bytes32.
optionsNoPer-scheme options: alphabet (base58/base62). Default None.
output_formatNoHow recovered bytes are rendered: text=UTF-8, hex=bare (no 0x), base64. Default 'text'; pick hex/base64 for non-UTF-8 payloads.text

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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, ...}}

ParametersJSON Schema
NameRequiredDescriptionDefault
kdfNoKey-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
saltNoSalt 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`.
lengthNoDerived key length in bytes (1..1024). Default 32.
paramsNoKDF 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.
passwordYesThe password, secret, or input keying material, read as UTF-8. Never echoed back.
output_formatNoHow the key is rendered (bare hex, no 0x); default 'hex'.hex

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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="

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesInput to encode, decoded to bytes via `input_format` (idna/bytes32 read it as text).
schemeYesTarget 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).
optionsNoPer-scheme options: padding (bool, base32/64 family), alphabet (base58/62), hrp (required for bech32/bech32m), width (hexdump, default 16). Default None.
input_formatNoHow `data` is decoded to bytes; default 'text'.text

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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".

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesA 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

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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".

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes'encode' applies the EIP-55 checksum casing; 'verify' checks whether the input's casing already matches it.
addressYesA 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

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_bytecodeA

Disassemble EVM bytecode, scrape its selectors, or read its solc metadata.

code is hex runtime bytecode. The trailing solc CBOR metadata is data, not code, so it is excluded from both the disassembly and the selector scrape and reported as metadata_offset instead. action=disassemble -> {size, code_size, count, offset, instructions} with each instruction {pc, opcode, name} plus push_data for PUSH1..PUSH32; an unassigned byte has name null and unknown, and code ending mid-immediate is flagged truncated. Output is capped at limit instructions, which adds {truncated, next_offset} — page with offset, or pass limit=0 for all. action=selectors -> {count, selectors, sites}: every PUSH4 the dispatcher then compares (EQ, or GT/LT in solc's binary-search dispatcher), decoded rather than grepped, so a PUSH4 pattern inside another push's immediate cannot masquerade as one. sites gives the {selector, pc, op} of each comparison. This is a heuristic on unstructured code: an ERC-165 interface id is a PUSH4 compared with EQ and is indistinguishable from a selector here, and an unconventional dispatcher may hide one. Feed the results to abi_inspect's selectors map (or a 4-byte database) to name them. action=metadata -> {present, offset, length, cbor, metadata} plus solc_version and, when the hash is an IPFS CIDv0 multihash, ipfs_cid. Code compiled with metadata stripped returns present=false, not an error.

Example: eth_bytecode("selectors", "0x6080...") -> selectors=["0xa9059cbb", "0x70a08231"].

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesContract bytecode as hex (0x prefix optional) — the DEPLOYED runtime code, as returned by eth_getCode. Creation bytecode also decodes, but its constructor carries the runtime code as an inline blob, so the tail disassembles as data.
limitNoaction=disassemble only: how many instructions to return; 0 removes the cap and returns all of them.
actionYes'disassemble' decodes the code into instructions; 'selectors' scrapes the function selectors out of its dispatcher; 'metadata' parses the trailing solc CBOR metadata.
offsetNoaction=disassemble only: index of the first instruction to return (not a byte offset), for paging through a large contract.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and delivers: it discloses that CBOR metadata is excluded and reported as metadata_offset, that output is capped with truncated/next_offset paging flags, that an ERC-165 interface id is indistinguishable from a selector, that unconventional dispatchers may hide selectors, and that stripped metadata returns present=false rather than erroring.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with a one-line purpose, then a short note on the `code` input, then a per-action block for each of the three modes. Despite its length, every sentence carries technical payload (edge cases, return shapes, caveats) rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description fully documents the return shape for all three actions, including edge cases and a worked example. For a complex multi-mode tool, an agent has everything needed to call and interpret it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining how parameters interact — paging via `offset` when a result is truncated, and limit=0 removing the cap — plus clarifying that `code` is runtime (not creation) bytecode and why the creation tail decodes as data.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific three-part verb+resource statement: disassemble EVM bytecode, scrape its selectors, read its solc metadata. This clearly distinguishes the tool from siblings like eth_selector and abi_inspect, and the per-action breakdown removes any ambiguity about scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context for each action and explicitly routes downstream work to `abi_inspect`'s `selectors` map (or a 4-byte database). It does not, however, state when to prefer this tool's selector scrape over the sibling `eth_selector`, nor any explicit when-not conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eth_calldataA

Split calldata into named, typed arguments — or build calldata from them.

signature is human-readable, e.g. "transfer(address to, uint256 amount)"; parameter names are optional and come back as args[].name (null when the signature declares none), with args[].components naming a struct's members. action=encode (needs values) -> {action, signature (canonical), selector, calldata, args}; values may be omitted for a zero-argument signature. action=decode (needs data) -> {action, signature, selector, selector_matches, args}; ints are decimal strings and addresses EIP-55 checksummed. When the calldata's leading 4 bytes are not this signature's selector the arguments are still decoded, but selector_matches is false and data_selector + reason report the mismatch — the values are then almost certainly meaningless.

Example: eth_calldata("decode", "transfer(address to, uint256 amount)", "0xa9059cbb...") -> args=[{name="to", ...}, {name="amount", ...}].

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNo0x-prefixed calldata to decode: the 4-byte selector followed by the encoded arguments (required for action=decode).
actionYes'encode' a call's arguments into calldata, or 'decode' calldata into named arguments.
valuesNoArgument values to encode, positionally matching the signature's parameters; ints accept int/decimal/0x-hex, bytes are 0x-hex, tuples and arrays are nested lists. A stringified JSON array is accepted. Omit for a zero-argument signature.
signatureYesA human-readable Solidity function signature, e.g. 'transfer(address to, uint256 amount)'. Parameter names are optional and are reported back; data locations, aliases (uint->uint256) and a trailing 'external returns (...)' clause are normalized away.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it discloses int-as-decimal-string and EIP-55 address formatting, the selector-mismatch behavior (still decodes but sets selector_matches=false, reports data_selector/reason, values likely meaningless), and the canonicalized output shape for both modes. These are exactly the behavioral traits an agent needs 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first line, then mode-specific output shapes and an end-to-end example follow in a logical order with no filler. The dense inline-code styling makes the middle passage slightly harder to parse than it needs to be, but every element earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must document returns itself, and it does: it specifies the returned fields for both encode and decode, the canonical signature/selector, checksum/decimal formatting, and the failure-mode fields. For a two-mode codec this is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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, but the description adds cross-parameter meaning: it ties `values` to encode and `data` to decode, notes names come back as args[].name and struct members as args[].components, and explains signature normalization. This goes modestly beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a precise bidirectional verb+resource: split calldata into named typed arguments, or build calldata from them. An agent immediately knows this is a calldata<->args codec. It never explicitly contrasts itself with the closely-related sibling abi_codec, so sibling differentiation is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly explains the internal action selection: action=encode needs `values`, action=decode needs `data`, and `values` may be omitted for a zero-argument signature. That is strong context for choosing a mode, but there is no guidance on when to pick this tool over an alternative like abi_codec.

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".

ParametersJSON Schema
NameRequiredDescriptionDefault
saltNoA 32-byte hex salt chosen by the deployer (required for scheme=create2).
nonceNoThe 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.
schemeYes'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.
deployerYesThe deploying account's 20-byte hex address (0x optional, any casing) — an EOA for a top-level deploy, or the factory contract.
init_codeNoThe full contract creation bytecode as hex — constructor code plus its ABI-encoded arguments, NOT the deployed runtime code (required for scheme=create2).

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

Exactly one of private_key (inline hex) or private_key_file (a path the server reads, which keeps the key out of the conversation) is required.

Example: eth_eoa_address( "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80") -> address="0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266".

ParametersJSON Schema
NameRequiredDescriptionDefault
private_keyNoA 32-byte secp256k1 private key as hex (0x prefix optional). Never echoed back in the result. Give this or `private_key_file`.
private_key_fileNoPath of a file holding the private key as 64 hex digits (0x and surrounding whitespace optional) or as 32 raw bytes; `~` is expanded. The server reads the file itself, so the key appears in neither the call nor the result, and no error quotes the file's contents. Give this or `private_key`.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the load and does so well: it discloses the return shape ({address, public_key}), guarantees the private key is never echoed back, and notes that file-based keys appear in neither call nor result and are never quoted in errors. It could still mention error behavior for invalid keys, but the security-relevant traits are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then derivation detail, sibling comparison, and an example. It is on the longer side but each sentence carries distinct value; no obvious filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description specifies the return object, the key-exclusion guarantee, the exact-one-of parameter constraint, and a worked example — everything an agent needs to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline is 3; the description adds the mutual-exclusivity rule ('Exactly one of private_key or private_key_file is required') plus the rationale for the file variant (keeps the key out of the conversation), which goes beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource: 'Derive an EOA's Ethereum address and public key from its private key.' It explicitly distinguishes itself from the sibling `eth_contract_address` as the EOA counterpart, so an agent can pick between them without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context ('derives, it does not create an account') and names the sibling it parallels, which helps route selection. It stops short of an explicit when-to-use/when-not statement against a concrete alternative scenario, so it is not a full 5.

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: keccak-256, EIP-191, EIP-712, or EIP-7702.

Returns {kind, hash}. For kind=eip712 the result also carries {domain_separator, struct_hash}, the two EIP-712 component hashes. For kind=eip7702 data is the authorization tuple {chainId, address, nonce} and the result carries the preimage that was hashed, 0x05 || rlp([chain_id, address, nonce]) — the 0x05 keeps a signed authorization from ever being replayed as a transaction. A chainId of 0 is not a missing value there: it authorizes the delegation on every chain. Note keccak-256 is the pre-NIST Ethereum variant, not hashlib's SHA3-256.

Example: eth_hash("keccak256", "hello", "text") -> hash="0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8".

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesPolymorphic: 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; for eip7702 it is the authorization object {chainId, address, nonce}.
kindYesHash flavor: 'keccak256' (raw Ethereum keccak-256), 'eip191' (personal_sign prefixed message), 'eip712' (typed-data digest), or 'eip7702' (delegation authorization tuple).
input_formatNoHow to decode `data` to bytes for keccak256/eip191 (ignored for eip712); hex is 0x-prefixed or bare.text
output_formatNoDigest encoding: 'hex' is 0x-prefixed, or 'base64'.hex

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations and no output schema, the description carries the full burden and does so well: it spells out the return shape ({kind, hash}, plus {domain_separator, struct_hash} for eip712 and `preimage` for eip7702), explains the 0x05 replay-protection prefix, and clarifies the chainId=0 meaning. It does not cover error/edge-case behavior (e.g. malformed typed data or non-hex input), keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first line, followed by return shape, per-kind semantics, and a concrete example. It is dense but every clause carries information; the preimage/replay explanation is the only part that leans verbose for an invocation-time description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter, 4-variant computation tool with no output schema, the description supplies the return structure for every kind, the key non-obvious gotchas, and a worked example, so an agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is already 100%, so the baseline is 3. The description adds genuine meaning on top: it notes that `input_format` is ignored for eip712/eip7702, that `data` is a parsed-JSON/dict or authorization tuple for those kinds, and what the chainId field means — beyond what the schema literally states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb (compute) and resource (Ethereum hash) and enumerates the exact four supported flavors (keccak-256, EIP-191, EIP-712, EIP-7702), which cleanly separates it from generic siblings like `hash`/`hmac` and from Ethereum signing/decoding tools such as `eth_sign` or `eth_userop_hash`.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The text characterizes each `kind` well enough to imply when each applies, and it warns that keccak-256 is not SHA3-256, but it never states when to prefer a sibling (e.g. `hash`, `eth_sign`, `eth_userop_hash`) or any when-not-to-use rule. Guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eth_log_decodeA

Turn a receipt log's topics and data into named event arguments.

signature is human-readable, e.g. "Transfer(address indexed from, address indexed to, uint256 value)"; indexed is what splits the arguments between topics and data. Returns {signature (canonical), anonymous, topic0, topic0_matches, args}; topic0 and topic0_matches are omitted for an anonymous event, which carries no topic0 to check. args lists EVERY argument in declaration order — indexed and not, interleaved — as {name (null when undeclared), type, value, indexed}, plus components on tuple args. Only a value type (uintN/intN/bool/address/bytesN) survives in a topic: every array, every struct, and bytes/string are keccak-hashed into it, so those come back with value null plus {hashed: true, hash} — enough to match against keccak of a candidate, never the value itself. A topics[0] that is not this signature's topic0 is soft (topic0_matches false, plus log_topic0 and reason), but a topic COUNT that contradicts the signature raises: ERC-20 and ERC-721 Transfer share a topic0 and differ only there.

Example: eth_log_decode("Transfer(address indexed from, address indexed to, uint256 value)", [topic0, from_word, to_word], "0x..0de0b6b3a7640000") -> args=[{name="from", ...}, {name="to", ...}, {name="value", ...}].

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNo0x-prefixed log data: the standard ABI encoding of the NON-indexed arguments. Omit (or pass '0x') when every argument is indexed.
topicsYesThe log's topics as 32-byte hex words (0x prefix optional): topic0 (the event's keccak signature hash) first, then one word per indexed argument. An anonymous event has no topic0. A stringified JSON array is accepted.
anonymousNoTrue when the event is declared `anonymous` in Solidity — its log carries no topic0, so indexed arguments start at topics[0] and up to 4 are allowed.
signatureYesA human-readable Solidity event signature, e.g. 'Transfer(address indexed from, address indexed to, uint256 value)'. The `indexed` modifier is what splits the arguments between `topics` and `data`; parameter names are optional and are reported back, and aliases (uint->uint256) are normalized away.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations the description carries the full burden, and it discloses error vs soft-failure semantics precisely: a mismatched topics[0] is soft (topic0_matches false plus log_topic0/reason), while a topic COUNT contradiction raises. It also explains hashed-value behavior (arrays/structs/bytes/string return value null with {hashed, hash}) and return-shape fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-sentence purpose followed by tightly packed detail, ending with a concrete example. Dense and mostly waste-free, though the run-on elaboration of return fields is heavier than strictly necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must explain return values — and it does comprehensively (signature, anonymous, topic0, topic0_matches, args with name/type/value/indexed/components). Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema: the human-readable signature example, the fact that `indexed` is what splits args between topics and data, and that parameter names are reported back and aliases (uint->uint256) are normalized.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Turn a receipt log's topics and data into named event arguments.' Clear enough to distinguish from siblings like eth_revert_decode or eth_tx_codec, which operate on different inputs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The behavior is described thoroughly, implying the decode-a-log use case, but there is no explicit 'use this when / not when' or reference to alternatives such as eth_revert_decode or eth_calldata. Usage is inferred rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eth_revert_decodeA

Decode a failed call's revert data into a human-readable reason.

Returns {kind, ...} where kind selects the rest of the payload: 'empty' (no revert data at all) -> {reason}; 'error' (Error(string), the require/revert message) -> {selector, signature, reason}; 'panic' (Panic(uint256), a compiler check) -> {selector, signature, code, meaning}; 'custom' (a user-declared error, needs signature) -> {selector, signature, selector_matches, args} with args as {name, type, value} exactly as eth_calldata reports them; 'unknown' (an unrecognized selector and no signature given) -> {selector, reason}. A signature whose selector is not the one in data still decodes, but selector_matches is false and reason says so.

Example: eth_revert_decode("0x08c379a0...") -> kind="error", reason="ERC20: transfer amount exceeds balance".

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesThe 0x-prefixed revert data returned by a failed call: a 4-byte error selector followed by its ABI-encoded arguments. An empty '0x' is a revert that carried no reason.
signatureNoA custom error's human-readable signature, e.g. 'InsufficientBalance(uint256 available, uint256 required)'. Only needed for user-declared errors — Error(string) and Panic(uint256) are recognized without it.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does it well: it discloses every result branch (empty/error/panic/custom/unknown), the selector-mismatch behavior where decoding still succeeds but selector_matches is false, and a worked example. It does not say how malformed or non-hex input is handled, which is the remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose, then a structured kind-by-kind breakdown, then a concrete example. Dense but well organized; a few phrases (e.g. 'exactly as eth_calldata reports them') are slightly redundant, but nothing is wasted wholesale.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must specify the return shape — and it does so exhaustively for all five kinds plus the selector-mismatch case, which is everything an agent needs to interpret results from a pure decode tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 mostly reiterates the schema's account of `signature` (needed only for custom errors) and `data`, adding only marginal detail about the signature/selector relationship, so it does not meaningfully exceed the structured fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (decode a failed call's revert data) and immediately enumerates the discriminated result kinds, making it distinguishable from siblings like eth_calldata and eth_log_decode. An agent can tell what this tool does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the task-domain scoping (revert data from a failed call) and by the note that `signature` is needed for user-declared errors. It never explicitly states when to reach for this versus eth_calldata or abi_codec, nor any preconditions for obtaining the revert data.

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".

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNo'function' returns the 4-byte selector; 'event' returns the 32-byte topic0 (keccak of the canonical signature).function
signatureYesA 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

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_signA

Sign, verify, ecrecover, or reformat a secp256k1 signature over a 32-byte hash.

This signs a raw digest — unlike the JSON-RPC eth_sign/personal_sign, it adds no "\x19Ethereum Signed Message" prefix. Hash a message first with eth_hash (kind=eip191 for personal_sign, eip712 for typed data), or pass a transaction's signing hash (eth_tx_codec's signing_hash) or a user operation's hash (eth_userop_hash).

action=sign (message_hash, private_key_file) -> {signature (65-byte, v=27/28), r, s, v, yParity, eip2098, address}. The nonce is RFC 6979, so the result is deterministic and matches eth_account/ethers; s is always low (EIP-2). address is the signer's, to confirm the right key was used. The key is never echoed. action=verify (message_hash, signature, address) -> {valid, recovered, low_s}; a signature that recovers no key is soft: valid false plus reason. action=recover (message_hash, signature) -> {address, low_s}. action=convert (signature, signature_format) -> {format, result, low_s}. low_s is false for a malleable high-s signature: the ecrecover precompile accepts it, but Ethereum transactions and OpenZeppelin's ECDSA reject it.

Example: eth_sign("sign", message_hash="0x…32 bytes…", private_key_file="~/keys/dev.key") -> {signature: "0x…1b", r, s, v: 27, …}.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes'sign' a digest with the key in `private_key_file`; 'verify' a signature against an expected `address`; 'recover' the signer address (ecrecover); 'convert' a signature between forms.
addressNoaction=verify: the expected signer's 20-byte address (any casing).
signatureNoFor verify/recover/convert: a 65-byte r || s || v hex string (v 27/28 or 0/1), a 64-byte EIP-2098 compact hex string, or an object {r, s, v} / {r, s, yParity} (ints as int, decimal, or 0x-hex).
message_hashNoThe 32-byte digest to sign or check, as hex (0x optional) — signed exactly as given, with no prefix added. Required for sign, verify, and recover.
private_key_fileNoaction=sign only: path of a file holding the private key as 64 hex digits (0x and surrounding whitespace optional) or as 32 raw bytes; `~` is expanded. The server reads it itself, so the key never appears in the call or the result, and no error quotes the file's contents. There is deliberately no inline key argument.
signature_formatNoaction=convert: the form to produce — 'rsv' (object {r, s, v, yParity}), 'packed65' (65-byte r || s || v, v=27/28), or 'eip2098' (64-byte compact; low-s signatures only). Default packed65.packed65

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: RFC 6979 deterministic nonces matching eth_account/ethers, always-low-s (EIP-2), the key is read from a file by the server and never echoed or leaked in errors, and recovery failure is a soft error (valid false plus reason) rather than an exception. It stops short of stating global preconditions such as file-permission requirements or whether the tool is read-only across actions, so a 5 is not warranted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: capability and the key semantic caveat (no EIP-191 prefix) come first, then per-action contracts, with a concrete example at the end. The block is long relative to a typical tool, but nearly every sentence carries a distinct constraint (determinism, low-s, no key echo, soft failure), so little is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates by specifying the return shape for every action ({signature, r, s, v, yParity, eip2098, address}, {valid, recovered, low_s}, {address, low_s}, {format, result, low_s}). Together with the parameter-to-action mapping and the low_s caveat, an agent has everything needed to call and interpret results correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the 3 baseline is met by the schema alone; the description goes beyond it by tying each parameter to an action, documenting the low_s distinction on the returned signature, and explaining why there is deliberately no inline key argument. It adds genuine interpretation rather than restating the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb set (sign, verify, ecrecover, reformat) over a named resource (secp256k1 signature over a 32-byte hash), then enumerates the four actions with their inputs and outputs. It explicitly distinguishes itself from the nearest name-collision sibling, the JSON-RPC eth_sign/personal_sign, by noting the absence of the \x19Ethereum Signed Message prefix.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing: hash first with eth_hash (naming kind=eip191 for personal_sign, eip712 for typed data), or pass eth_tx_codec's signing_hash or eth_userop_hash. Each action's required parameters are stated inline, so an agent can pick sign vs verify vs recover vs convert without opening the schema.

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 a storage slot: a mapping/array entry, or a well-known layout's root.

layout: {"kind": …} — the first two describe a layout you declared, the rest are the standard constant slots, which need no "slot" of their own: mapping -> needs "slot" and key; "key_type" (default uint256). For nested mappings pass key (and "key_type") as lists. dynamic_array -> needs "slot" and index; optional "element_size" (slots). eip1967 -> the proxy slots, keccak256(label) - 1. Optional "name": implementation (default), admin, beacon, or rollback. eip1822 -> UUPS proxiableUUID, keccak256("PROXIABLE") — no -1. erc7201 -> namespaced storage root for "namespace", keccak256(abi.encode(keccak256(ns) - 1)) & ~0xff. An erc7201: annotation prefix on the namespace is stripped. diamond -> EIP-2535 diamond storage, plain keccak256("namespace"). Returns {slot, slot_hex}: the slot as a decimal string and a 0x 32-byte word, plus formula (and name/namespace) for the constant layouts. Every constant is derived by keccak here, not pasted from the EIP. The results compose: feed a namespaced root back in as another layout's "slot" to reach a mapping or array declared inside that struct, and use index to step to a later member of it.

Example: eth_storage_slot({"kind":"eip1967"}) -> slot_hex="0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc".

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoMapping key (required for kind=mapping); pass a list of keys outer-to-inner for nested mappings. Ignored otherwise.
indexNoElement index (required for kind=dynamic_array); int/decimal/0x-hex. For erc7201/diamond it is the optional slot offset of a member within the struct that starts at the root. Ignored otherwise.
layoutYesLayout object: {"kind": ..., ...}. Declared layouts take a "slot" (int/decimal/0x-hex): "mapping" (+ optional "key_type", default "uint256", or a list for nested mappings) and "dynamic_array" (+ optional "element_size" in slots, default 1). Well-known constant layouts take no slot: "eip1967" (+ "name": implementation|admin|beacon|rollback), "eip1822" (aka uups), "erc7201" and "diamond" (+ a "namespace" string). A stringified JSON object is accepted.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and mostly meets it: it discloses the return shape ({slot, slot_hex}, plus formula/name/namespace), that every constant is derived by keccak rather than pasted from the EIP, and a specific preprocessing rule (the 'erc7201:' annotation prefix is stripped). It never explicitly asserts side-effect freedom or authorization, though 'Compute' plus the deterministic formula list make purity inferable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first line states purpose, then a well-formatted per-layout block, then returns, then composition, then a concrete example. Long, but nearly every token is load-bearing formula or constraint, and it is front-loaded. Minor redundancy exists between the layout bullets and the equally detailed schema 'layout' description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must document the return value itself — and it does ({slot, slot_hex}, formula, name/namespace). For a tool with a nested, polymorphic object parameter and three branching layout families, the per-kind requirements, formatting rules for hex/decimal/int, and a worked example together leave nothing an agent needs in order to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is already 100%, so the baseline is 3. The description goes beyond the schema by giving the derivation rationale behind each parameter's role in the formulas (key_type default uint256, nested mapping key lists, element_size in slots, index doubling as a struct offset for erc7201/diamond) and by explaining how a returned slot composes back into the 'slot' field. That compositional semantics is not present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource: 'Compute a storage slot: a mapping/array entry, or a well-known layout's root.' The two modes of operation are named up front, so an agent can immediately distinguish this from siblings like eth_hash or eth_selector. No sibling names are used, but the domain-specificity is high enough that misselection against the keccak-family tools is unlikely.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The layout enumeration effectively acts as a routing table: each kind states what it needs ('mapping -> needs "slot" and `key`', 'dynamic_array -> needs "slot" and `index`') and which are constant and need no slot. It also explains the composition workflow (feed a namespaced root back in as another layout's slot). What it lacks is any explicit statement of when to reach for this tool over eth_hash or abi_codec when a raw hash might suffice.

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 tx fields into a raw transaction, or decode a raw tx.

action=encode (needs fields) serializes the supplied fields (it does not sign) -> {type, raw:'0x...', hash, signing_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, signing_hash, from}, recovering from from the signature; numeric fields come back as decimal strings, addresses EIP-55 checksummed.

signing_hash is the digest the sender signs: keccak256 of the payload without the signature (typed: type_byte || rlp(fields minus yParity/r/s); legacy EIP-155: rlp(fields[:6] + [chainId, 0, 0]); pre-EIP-155: rlp(fields[:6])). hash is the tx hash, which covers the signature too, so it is only meaningful once signed. To sign: encode the unsigned fields, sign signing_hash with eth_sign, then encode again with r, s and yParity — legacy instead takes v = chainId*2 + 35 + yParity (27 + yParity pre-EIP-155).

Example: eth_tx_codec("encode", fields={"nonce":0,"gasPrice":"0x09184e72a000", "gasLimit":"0x2710","to":"0x00..00","value":0,"data":"0x"}) -> type=0, raw="0xe5808609184e72a00082271094...808080".

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNo0x-prefixed raw transaction bytes to decode (required for action=decode): a legacy RLP list or an EIP-2718 typed envelope.
actionYes'encode' signed fields into a raw tx, or 'decode' a raw tx.
fieldsNoTx fields object (required for action=encode); does NOT sign. Omit v/yParity/r/s for an unsigned tx, whose `signing_hash` is what to sign; a legacy tx's `chainId` makes it EIP-155 (it is carried in v, so a signed legacy v must encode it). 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

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden and does so well: it discloses that encode does NOT sign, that `hash` is only meaningful once signed, how `signing_hash` is derived per tx type (typed, EIP-155, pre-EIP-155), and the exact v-computation for legacy signatures. This is exactly the behavioral context an agent needs to avoid producing an invalid transaction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the two actions and their required inputs, with a worked example at the end. It is dense but largely earns its length, though the type-inference mapping and numeric-format notes are restated from the schema, adding some redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by specifying the return shape for both actions (type/raw/hash/signing_hash for encode; type/fields/hash/signing_hash/from for decode) plus formatting details like decimal strings and EIP-55 checksumming. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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, but the description goes beyond the schema by tying parameters together: the type-inference mapping, the rule that omitting v/yParity/r/s yields an unsigned tx, and that a legacy `chainId` is carried in v. That relational guidance is not expressible in per-field schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource pair ('Serialize tx fields into a raw transaction, or decode a raw tx') and immediately splits the two modes by action. An agent can distinguish this from rlp_codec, abi_codec, or eth_calldata from the first sentence alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly states which inputs each action requires (encode needs `fields`, decode needs `data`) and walks through the encode→sign→re-encode workflow for signing. It stops short of naming alternative sibling tools (e.g. rlp_codec for raw RLP), so it is clear context without explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eth_userop_hashA

Compute the ERC-4337 userOpHash: an operation's id and signing digest.

The hash binds the operation to entry_point and chain_id, so the same operation cannot be replayed against another EntryPoint or another chain. version decides the rule and defaults to reading it off the canonical EntryPoint address (0.6 0x5FF1…2789, 0.7 0x0000000071727De2…da032, 0.8 0x4337084d…f108, the same on every chain); pass it explicitly for a custom deployment. v0.6 encodes six separate gas fields; v0.7 packs verificationGasLimit/callGasLimit and maxPriorityFeePerGas/maxFeePerGas into one word each (16 bytes apiece, high half first); v0.8 hashes that same packed struct as EIP-712 typed data. The unpacked eth_sendUserOperation JSON is accepted for v0.7/v0.8 and packed here, which is the fiddly half. Returns {version, entry_point, chain_id, user_op_hash} plus the intermediate values — op_hash for 0.6/0.7, domain_separator and struct_hash for 0.8 — and packed (the words that were hashed) for 0.7/0.8. signature is never read: it signs this hash, so it cannot be part of it.

Example: eth_userop_hash(user_op, "0x0000000071727De22E5E9d8BAf0edAc6f37da032",

  1. -> version="0.7", user_op_hash="0x…".

ParametersJSON Schema
NameRequiredDescriptionDefault
user_opYesThe ERC-4337 user operation as JSON, in the shape a bundler speaks. v0.7/v0.8 accept either the packed form (accountGasLimits/gasFees/initCode/paymasterAndData) or the unpacked eth_sendUserOperation form (factory+factoryData, verificationGasLimit+callGasLimit, maxPriorityFeePerGas+maxFeePerGas, paymaster+paymasterVerificationGasLimit+paymasterPostOpGasLimit+paymasterData). camelCase and snake_case keys are both understood; `signature` is ignored, being what signs this hash. A stringified JSON object is accepted.
versionNoEntryPoint version, which decides the hashing rule. 'auto' reads it off a canonical EntryPoint address.auto
chain_idYesThe chain id the operation is valid on (int, decimal string, or 0x-hex); part of the hash.
entry_pointYesThe EntryPoint contract address the operation is sent to — part of the hash, so the operation cannot be replayed against a different one. Also selects the version when `version` is 'auto'.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so richly: it explains the replay-protection binding to entry_point/chain_id, the per-version encoding rules (six gas fields vs packed 16-byte words vs EIP-712), and the critical behavioral fact that `signature` is never read because it signs this hash.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded, leading with the purpose and following with version rules, return shape, and a worked example. Nearly every sentence carries technical weight, though the version-address enumeration is long and could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, nested-object tool with no output schema and no annotations, the description is complete: it enumerates return fields (op_hash, domain_separator, struct_hash, packed), covers input-form flexibility, and supplies a concrete example.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (baseline 3), and the description still adds meaning: `version`'s auto-detection from the canonical EntryPoint addresses, and `entry_point`'s dual role as both a hash input and the version selector. It clarifies semantics the schema only gestures at.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a precise verb+resource: 'Compute the ERC-4337 userOpHash: an operation's id and signing digest.' This clearly distinguishes it from siblings like eth_hash, eth_sign, and eth_tx_codec, and an agent can tell immediately what the tool produces.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives strong internal guidance: version defaults to reading the EntryPoint address, pass it explicitly for custom deployments, and v0.7/v0.8 accept the unpacked eth_sendUserOperation JSON which gets packed here. It does not explicitly route against sibling tools (e.g. when to prefer eth_hash or eth_sign), so it falls just short of the top band.

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"

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoKey for blake2b/blake2s only, decoded with `input_format`. Default None.
dataYesInput to hash, decoded to bytes via `input_format`.
seedNoSeed reseeding xxh*/fnv1a_* only. Default None.
lengthNoOutput length in bytes, required for shake_128/shake_256 and invalid otherwise. Default None.
algorithmYesDigest 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_formatNoHow `data` (and `key`) are decoded; default 'text'.text
output_formatNoHow the digest is rendered (bare hex, no 0x); default 'hex'.hex

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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, ...}

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFilesystem path of the file to checksum.
expectedNoExpected digest to verify against, in `output_format`; case/`0x`/whitespace tolerated. Default None skips verification.
algorithmNoDigest 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_formatNoHow the digest is rendered (bare hex, no 0x); default 'hex'.hex

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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..."

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesSecret key, decoded via `key_format`.
dataYesMessage to authenticate, decoded via `input_format`.
expectedNoExpected tag to verify against, in `output_format`; case/`0x`/whitespace tolerated, compared constant-time. Default None skips verification.
algorithmNoUnderlying cryptographic hash (HMAC digestmod): md5/sha1/sha2*/sha3*/blake2*. Default 'sha256'.sha256
key_formatNoHow `key` is decoded to bytes; default 'text'.text
input_formatNoHow `data` is decoded to bytes; default 'text'.text
output_formatNoHow the tag is rendered (bare hex, no 0x); default 'hex'.hex

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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"]

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesIdentifier family: uuid (see `version`), ulid (time-sortable, 26 chars), or nanoid (custom `alphabet`/`size`).
nameNoUUID v5 name hashed within `namespace`, e.g. a hostname. Required with version=5.
sizeNoCharacter count for kind=nanoid; default None means 21.
countNoHow many IDs to generate, 1..1000; default 1.
versionNoUUID version for kind=uuid: 1 (time+random node), 4 (random), 5 (SHA-1 of namespace+name), 7 (time-sortable). Default 4.
alphabetNoSymbol set for kind=nanoid; default None uses the standard 64-char url-safe alphabet [A-Za-z0-9_-].
namespaceNoUUID v5 namespace: dns|url|oid|x500, or a UUID string. Required with version=5.

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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"]}

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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"

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesInteger to convert, read in `from_base`; a leading 0x/0b/0o radix prefix and a '-' sign are accepted.
to_baseYesBase to render the result in; non-decimal output is prefixed 0x/0b/0o.
from_baseYesBase of `value`: hex (16), dec (10), bin (2), oct (8).
pad_bytesNoZero-fill the output to this byte width (a minimum, never truncating); bit-aligned, so rejected for decimal output. Default None means no padding.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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"

ParametersJSON Schema
NameRequiredDescriptionDefault
uriNoThe 'otpauth://...' URI to parse (action=parse). Default None.
typeNoOTP kind: 'totp' (time-based, RFC 6238) or 'hotp' (counter-based, RFC 4226). Default 'totp'.totp
labelNoAccount label for build, e.g. 'alice@example.com'. If `issuer` is set and the label has no 'issuer:' prefix, one is added. Default None.
actionYes'build' assembles an otpauth:// URI from parts (needs `secret`); 'parse' splits one into its parts (needs `uri`).
digitsNoNumber of code digits (commonly 6 or 8). Default None.
issuerNoProvider name, e.g. 'Example Inc'. Default None.
periodNoTOTP time step in seconds (totp only). Default None.
secretNoBase32 shared secret (RFC 4648, A-Z2-7) for build; spaces and '=' padding are ignored. Default None.
counterNoHOTP counter (required for and valid only with type='hotp'). Default None.
algorithmNoHMAC hash: SHA1 (default when omitted), SHA256, or SHA512. Default None.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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$..."}

ParametersJSON Schema
NameRequiredDescriptionDefault
saltNoSalt 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.
actionYes'hash' derives a storage string from `password` (needs `scheme`); 'verify' checks `password` against `encoded`.
paramsNoCost 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.
schemeNoPassword-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.
encodedNoThe stored hash string to check against (action='verify'). Default None.
passwordYesThe password, read as UTF-8. Never echoed back.

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoOutput shape: bytes|hex|urlsafe draw `nbytes` random bytes; token is `length` alphanumeric chars; passphrase joins `words` diceware words. Default 'urlsafe'.urlsafe
wordsNoWord count for kind=passphrase; default 6.
lengthNoCharacter count for kind=token; default None means 32.
nbytesNoByte count for kind=bytes/hex/urlsafe; default 32.
wordlistNoCustom passphrase word list; default None uses the bundled EFF large diceware list (7776 words).
separatorNoJoiner between passphrase words; default '-'.-
output_formatNoRendering for kind=bytes (hex/base64); default 'hex'.hex

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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".

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesOn 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.
actionYes'encode' structured data to RLP, or 'decode' a hex RLP.

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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'

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesText to escape.
styleYesEscaping 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

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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"

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesEscaped text to decode back to its original form.
styleYesEscaping convention `text` is in (inverse of string_escape): json|js|python|c|backslash, html|xml, unicode_escape, quoted_printable, mime_word, or shell.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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"

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesTimestamp to convert, parsed per `from_format`.
to_zoneNoZone to shift the instant into before rendering; IANA name, UTC, or ±HH:MM offset. Default 'UTC'. Ignored for http (always GMT).UTC
from_zoneNoZone 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_formatYesOutput format: iso8601 (RFC 3339), rfc2822, http (IMF-fixdate, always GMT), unix/unix_ms/unix_us/unix_ns epoch, or strftime (needs `format_pattern`).
from_formatNoFormat of `value`; default 'auto' sniffs iso8601/rfc2822/http/unix. strftime needs `format_pattern`.auto
format_patternNostrptime/strftime pattern, required on whichever side (from_format/to_format) is 'strftime'. Default None.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
formNoNormalization form: NFC/NFD canonical compose/decompose; NFKC/NFKD also fold compatibility variants (ligatures, full-width, circled digits). Default 'NFC'.NFC
textYesText to normalize.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 11 tool updatesv0.4.1
    • Addedabi_inspect
    • Addedeth_bytecode
    • Addedeth_calldata
    • Changedeth_eoa_address6 fields changed
      • addedInput schema / properties / private_key / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / private_key / default
        Added value: +null
      • changedInput schema / properties / private_key / description
        Previous value: -"A 32-byte secp256k1 private key as hex (0x prefix optional). Never echoed back in the result."New value: +"A 32-byte secp256k1 private key as hex (0x prefix optional). Never echoed back in the result. Give this or `private_key_file`."
      • removedInput schema / properties / private_key / type
        Removed value: -"string"
      • addedInput schema / properties / private_key_file
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Path of a file holding the private key as 64 hex digits (0x and surrounding whitespace optional) or as 32 raw bytes; `~` is expanded. The server reads the file itself, so the key appears in neither the call nor the result, and no error quotes the file's contents. Give this or `private_key`.",
        +  "title": "Private Key File"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "private_key"
        -]
    • Changedeth_hash3 fields changed
      • changedInput schema / properties / data / description
        Previous value: -"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."New value: +"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; for eip7702 it is the authorization object {chainId, address, nonce}."
      • changedInput schema / properties / kind / description
        Previous value: -"Hash flavor: 'keccak256' (raw Ethereum keccak-256), 'eip191' (personal_sign prefixed message), or 'eip712' (typed-data digest)."New value: +"Hash flavor: 'keccak256' (raw Ethereum keccak-256), 'eip191' (personal_sign prefixed message), 'eip712' (typed-data digest), or 'eip7702' (delegation authorization tuple)."
      • changedInput schema / properties / kind / enum
        Previous value: -[
        -  "keccak256",
        -  "eip191",
        -  "eip712"
        -]New value: +[
        +  "keccak256",
        +  "eip191",
        +  "eip712",
        +  "eip7702"
        +]
    • Addedeth_log_decode
    • Addedeth_revert_decode
    • Addedeth_sign
    • Changedeth_storage_slot3 fields changed
      • changedInput schema / properties / index / description
        Previous value: -"Element index (required for kind=dynamic_array); int/decimal/0x-hex. Ignored for mappings."New value: +"Element index (required for kind=dynamic_array); int/decimal/0x-hex. For erc7201/diamond it is the optional slot offset of a member within the struct that starts at the root. Ignored otherwise."
      • changedInput schema / properties / key / description
        Previous value: -"Mapping key (required for kind=mapping); pass a list of keys outer-to-inner for nested mappings. Ignored for arrays."New value: +"Mapping key (required for kind=mapping); pass a list of keys outer-to-inner for nested mappings. Ignored otherwise."
      • changedInput schema / properties / layout / description
        Previous value: -"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."New value: +"Layout object: {\"kind\": ..., ...}. Declared layouts take a \"slot\" (int/decimal/0x-hex): \"mapping\" (+ optional \"key_type\", default \"uint256\", or a list for nested mappings) and \"dynamic_array\" (+ optional \"element_size\" in slots, default 1). Well-known constant layouts take no slot: \"eip1967\" (+ \"name\": implementation|admin|beacon|rollback), \"eip1822\" (aka uups), \"erc7201\" and \"diamond\" (+ a \"namespace\" string). A stringified JSON object is accepted."
    • Changedeth_tx_codec1 field changed
      • changedInput schema / properties / fields / description
        Previous value: -"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."New value: +"Tx fields object (required for action=encode); does NOT sign. Omit v/yParity/r/s for an unsigned tx, whose `signing_hash` is what to sign; a legacy tx's `chainId` makes it EIP-155 (it is carried in v, so a signed legacy v must encode it). 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."
    • Addedeth_userop_hash
  2. 8 tool updatesv0.4.0
    • Addedbip32_derive
    • Addedbip39
    • Addedderive_key
    • Addedeth_contract_address
    • Addedeth_eoa_address
    • Addedid_generate
    • Addedotpauth_uri
    • Addedpassword_hash
  3. 24 tool updatesv0.3.0
    • Changedabi_codec5 fields changed
      • addedInput schema / properties / action / description
        Added value: +"'encode' values to ABI bytes, or 'decode' ABI bytes."
      • addedInput schema / properties / data / description
        Added value: +"0x-prefixed ABI-encoded bytes to decode (required for action=decode)."
      • addedInput schema / properties / mode / description
        Added value: +"'standard' head/tail ABI encoding, or 'packed' (abi.encodePacked: tight, no padding/length prefixes) — packed is encode-only as it is not uniquely decodable."
      • addedInput schema / properties / types / description
        Added value: +"List of ABI type strings, e.g. [\"uint256\",\"address\",\"(uint8,bytes)[]\"]; aliases uint/int/byte are normalized. A stringified JSON array is accepted."
      • addedInput schema / properties / values / description
        Added value: +"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."
    • Addedbyte_order
    • Changedbytes_edit8 fields changed
      • addedInput schema / properties / action / description
        Added value: +"Edit to apply: pad (widen to `length`), trim (strip `fill`), slice (`start`:`end`), concat (append `parts`), size (report byte length), prefix (add/strip 0x)."
      • addedInput schema / properties / data / description
        Added value: +"Input byte-buffer as hex, a leading 0x is optional."
      • addedInput schema / properties / end / description
        Added value: +"Slice end index (Python indexing, negatives allowed); default None means end of buffer."
      • addedInput schema / properties / fill / description
        Added value: +"The pad/trim byte as one hex byte (0x optional); default '00'."
      • addedInput schema / properties / length / description
        Added value: +"Target byte width for action=pad. Default None."
      • addedInput schema / properties / parts / description
        Added value: +"Hex buffers to append for action=concat. Default None."
      • addedInput schema / properties / side / description
        Added value: +"Which side acts: pad prepend/append, trim leading/trailing, prefix add/strip 0x. Default 'left'."
      • addedInput schema / properties / start / description
        Added value: +"Slice start index (Python indexing, negatives allowed); default None means 0."
    • Changedcharset_transcode4 fields changed
      • addedInput schema / properties / errors / description
        Added value: +"Codec error handler applied to both legs: strict|replace|ignore|backslashreplace|…. Default 'strict'."
      • addedInput schema / properties / from_charset / description
        Added value: +"Encoding to encode `text` under to recover its raw bytes, e.g. cp1252, latin-1, utf-8."
      • addedInput schema / properties / text / description
        Added value: +"Text to reinterpret across encodings."
      • addedInput schema / properties / to_charset / description
        Added value: +"Encoding to decode those bytes under, e.g. utf-8."
    • Addedcodepoints
    • Changeddata_uri7 fields changed
      • addedInput schema / properties / action / description
        Added value: +"'build' wraps a payload into a data: URI (needs `data`); 'parse' splits a URI into its parts (needs `uri`)."
      • addedInput schema / properties / base64 / description
        Added value: +"For build: true base64-encodes the payload (adds ';base64'), false percent-encodes it. Default true."
      • addedInput schema / properties / data / description
        Added value: +"Payload to wrap (action=build), decoded via `input_format`. Default None."
      • addedInput schema / properties / input_format / description
        Added value: +"How build `data` is decoded to bytes; default 'text'."
      • addedInput schema / properties / media_type / description
        Added value: +"MIME type for build, e.g. 'text/plain' or 'image/png'. Default None omits it."
      • addedInput schema / properties / output_format / description
        Added value: +"How parsed payload is rendered (text=UTF-8 | hex | base64); default 'text'."
      • addedInput schema / properties / uri / description
        Added value: +"The 'data:...' URI to parse (action=parse). Default None."
    • Changeddecode4 fields changed
      • addedInput schema / properties / data / description
        Added value: +"Encoded string to decode, in `scheme`'s format."
      • addedInput schema / properties / options / description
        Added value: +"Per-scheme options: alphabet (base58/base62). Default None."
      • addedInput schema / properties / output_format / description
        Added value: +"How recovered bytes are rendered: text=UTF-8, hex=bare (no 0x), base64. Default 'text'; pick hex/base64 for non-UTF-8 payloads."
      • addedInput schema / properties / scheme / description
        Added value: +"Source encoding (same set as `encode`): base16/32/.../64url, ascii85/base85/z85, url/url_form, idna, bech32/bech32m, hexdump, or bytes32."
    • Changedencode4 fields changed
      • addedInput schema / properties / data / description
        Added value: +"Input to encode, decoded to bytes via `input_format` (idna/bytes32 read it as text)."
      • addedInput schema / properties / input_format / description
        Added value: +"How `data` is decoded to bytes; default 'text'."
      • addedInput schema / properties / options / description
        Added value: +"Per-scheme options: padding (bool, base32/64 family), alphabet (base58/62), hrp (required for bech32/bech32m), width (hexdump, default 16). Default None."
      • addedInput schema / properties / scheme / description
        Added value: +"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)."
    • Addedens_namehash
    • Changedeth_address_case2 fields changed
      • addedInput schema / properties / action / description
        Added value: +"'encode' applies the EIP-55 checksum casing; 'verify' checks whether the input's casing already matches it."
      • addedInput schema / properties / address / description
        Added value: +"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)."
    • Changedeth_hash4 fields changed
      • addedInput schema / properties / data / description
        Added value: +"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."
      • addedInput schema / properties / input_format / description
        Added value: +"How to decode `data` to bytes for keccak256/eip191 (ignored for eip712); hex is 0x-prefixed or bare."
      • addedInput schema / properties / kind / description
        Added value: +"Hash flavor: 'keccak256' (raw Ethereum keccak-256), 'eip191' (personal_sign prefixed message), or 'eip712' (typed-data digest)."
      • addedInput schema / properties / output_format / description
        Added value: +"Digest encoding: 'hex' is 0x-prefixed, or 'base64'."
    • Changedeth_selector2 fields changed
      • addedInput schema / properties / kind / description
        Added value: +"'function' returns the 4-byte selector; 'event' returns the 32-byte topic0 (keccak of the canonical signature)."
      • addedInput schema / properties / signature / description
        Added value: +"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."
    • Changedeth_storage_slot3 fields changed
      • addedInput schema / properties / index / description
        Added value: +"Element index (required for kind=dynamic_array); int/decimal/0x-hex. Ignored for mappings."
      • addedInput schema / properties / key / description
        Added value: +"Mapping key (required for kind=mapping); pass a list of keys outer-to-inner for nested mappings. Ignored for arrays."
      • addedInput schema / properties / layout / description
        Added value: +"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."
    • Changedeth_tx_codec3 fields changed
      • addedInput schema / properties / action / description
        Added value: +"'encode' signed fields into a raw tx, or 'decode' a raw tx."
      • addedInput schema / properties / data / description
        Added value: +"0x-prefixed raw transaction bytes to decode (required for action=decode): a legacy RLP list or an EIP-2718 typed envelope."
      • addedInput schema / properties / fields / description
        Added value: +"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."
    • Changedhash7 fields changed
      • addedInput schema / properties / algorithm / description
        Added value: +"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."
      • addedInput schema / properties / data / description
        Added value: +"Input to hash, decoded to bytes via `input_format`."
      • addedInput schema / properties / input_format / description
        Added value: +"How `data` (and `key`) are decoded; default 'text'."
      • addedInput schema / properties / key / description
        Added value: +"Key for blake2b/blake2s only, decoded with `input_format`. Default None."
      • addedInput schema / properties / length / description
        Added value: +"Output length in bytes, required for shake_128/shake_256 and invalid otherwise. Default None."
      • addedInput schema / properties / output_format / description
        Added value: +"How the digest is rendered (bare hex, no 0x); default 'hex'."
      • addedInput schema / properties / seed / description
        Added value: +"Seed reseeding xxh*/fnv1a_* only. Default None."
    • Addedhash_file
    • Addedhmac
    • Changednum_convert4 fields changed
      • addedInput schema / properties / from_base / description
        Added value: +"Base of `value`: hex (16), dec (10), bin (2), oct (8)."
      • addedInput schema / properties / pad_bytes / description
        Added value: +"Zero-fill the output to this byte width (a minimum, never truncating); bit-aligned, so rejected for decimal output. Default None means no padding."
      • addedInput schema / properties / to_base / description
        Added value: +"Base to render the result in; non-decimal output is prefixed 0x/0b/0o."
      • addedInput schema / properties / value / description
        Added value: +"Integer to convert, read in `from_base`; a leading 0x/0b/0o radix prefix and a '-' sign are accepted."
    • Changedrandom7 fields changed
      • addedInput schema / properties / kind / description
        Added value: +"Output shape: bytes|hex|urlsafe draw `nbytes` random bytes; token is `length` alphanumeric chars; passphrase joins `words` diceware words. Default 'urlsafe'."
      • addedInput schema / properties / length / description
        Added value: +"Character count for kind=token; default None means 32."
      • addedInput schema / properties / nbytes / description
        Added value: +"Byte count for kind=bytes/hex/urlsafe; default 32."
      • addedInput schema / properties / output_format / description
        Added value: +"Rendering for kind=bytes (hex/base64); default 'hex'."
      • addedInput schema / properties / separator / description
        Added value: +"Joiner between passphrase words; default '-'."
      • addedInput schema / properties / wordlist / description
        Added value: +"Custom passphrase word list; default None uses the bundled EFF large diceware list (7776 words)."
      • addedInput schema / properties / words / description
        Added value: +"Word count for kind=passphrase; default 6."
    • Changedrlp_codec2 fields changed
      • addedInput schema / properties / action / description
        Added value: +"'encode' structured data to RLP, or 'decode' a hex RLP."
      • addedInput schema / properties / data / description
        Added value: +"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."
    • Changedstring_escape2 fields changed
      • addedInput schema / properties / style / description
        Added value: +"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)."
      • addedInput schema / properties / text / description
        Added value: +"Text to escape."
    • Changedstring_unescape2 fields changed
      • addedInput schema / properties / style / description
        Added value: +"Escaping convention `text` is in (inverse of string_escape): json|js|python|c|backslash, html|xml, unicode_escape, quoted_printable, mime_word, or shell."
      • addedInput schema / properties / text / description
        Added value: +"Escaped text to decode back to its original form."
    • Addedtime_convert
    • Changedunicode_normalize2 fields changed
      • addedInput schema / properties / form / description
        Added value: +"Normalization form: NFC/NFD canonical compose/decompose; NFKC/NFKD also fold compatibility variants (ligatures, full-width, circled digits). Default 'NFC'."
      • addedInput schema / properties / text / description
        Added value: +"Text to normalize."
  4. 19 tool updatesv0.0.1
    • First observedabi_codec
    • First observedbytes_edit
    • First observedcharset_transcode
    • First observeddata_uri
    • First observeddecode
    • First observedencode
    • First observedeth_address_case
    • First observedeth_hash
    • First observedeth_selector
    • First observedeth_storage_slot
    • First observedeth_tx_codec
    • First observedhash
    • First observedinfo
    • First observednum_convert
    • First observedrandom
    • First observedrlp_codec
    • First observedstring_escape
    • First observedstring_unescape
    • First observedunicode_normalize

TDQS

A4.1/5.0

Scored across 40 tools

Disambiguation4/5

Most tools target clearly different operations, and descriptions cross-reference likely alternatives, e.g. encode vs. string_escape, hash vs. hash_file/hmac, and password_hash vs. derive_key. Some overlaps remain, notably abi_codec vs. eth_calldata for ABI encoding/decoding and the broader hash/eth_hash/hmac cluster, but context in the descriptions usually resolves them.

Naming Consistency4/5

Names are uniformly snake_case and use good domain prefixes such as eth_*, bip*, and abi_*, plus clear inverse pairs like encode/decode and string_escape/string_unescape. Minor deviations are single-word or noun-phrase names such as random, hash, info, codepoints, and bip39 rather than a strict verb_noun pattern throughout.

Tool Count2/5

At 40 tools, this is well above the practical 3-15 range and crosses the 25-tool threshold that typically signals an overloaded surface. The broad domain partly justifies the breadth, but the selection burden for an agent is high and the server would benefit from consolidation or clearer grouping into toolsets.

Completeness4/5

The surface covers an unusually wide range: encoding/decoding, hashing/HMAC, KDFs/password hashing, Ethereum ABI/calldata/logs/tx/signing/storage/addresses, BIP-32/39, ENS, time, IDs, and Unicode. A few minor gaps exist, such as no explicit private-key generation and no OTP code computation, but core workflows are covered end-to-end.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    An MCP server that exposes the python-bitcoinlib API. It provides tools for Bitcoin key management, address generation, transaction building, script operations, and cryptography.
    20
    24 PyPI
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A 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