Skip to main content
Glama
laszlopere

mcp-bytesmith

by laszlopere

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 (FastMCP), exposing a toolbox of byte-wrangling utilities — encoding, hashing, number crunching, and Ethereum primitives — all computed locally and for real, with no network calls or remote APIs.

Distribution name: mcp-bytesmith · import package: mcp_bytesmith.

Tools

mcp-bytesmith ships an always-on core toolset built entirely on the Python standard library, so it works out of the box with no extra dependencies. This covers the everyday primitives: encode and decode move data between a wide set of schemes (hex, the Base64/Base32 family, Base58/Base58check, Base45, and more), hash computes cryptographic, CRC, and fast non-cryptographic digests, hash_file checksums a file on disk and soft-verifies it against an expected digest, hmac computes and verifies keyed-hash authentication tags, and num_convert translates integers between bases. Rounding out the core are bytes_edit (pad/trim/slice/concat byte glue), data_uri (build and parse data: URIs), otpauth_uri (build and parse otpauth:// authenticator provisioning URIs), unicode_normalize and charset_transcode for text and character-set work, string_escape/string_unescape for JSON/JS/Python/C escaping, codepoints for per-scalar Unicode inspection, random for CSPRNG-backed bytes, tokens, and passphrases, and id_generate for UUIDs (v1/v4/v5/v7), ULIDs, and nanoids. password_hash turns a password into a verifiable storage string and checks one back — scrypt and PBKDF2 out of the box, bcrypt and the argon2 variants with the crypto extra — while derive_key derives raw key bytes from a password or secret via PBKDF2, scrypt, or HKDF.

An opt-in Ethereum/EVM toolset (enabled via the ethereum extra) adds the primitives you reach for when working on-chain: eth_hash for keccak-256, EIP-191, EIP-712 typed-data, and EIP-7702 authorization hashing, eth_userop_hash for the ERC-4337 userOpHash (EntryPoint 0.6/0.7/0.8), abi_codec and rlp_codec for ABI and RLP encode/decode, eth_selector for function and event selectors, abi_inspect for converting a contract ABI between its JSON and human-readable forms and listing every selector and topic0 it declares, eth_calldata for splitting a call's calldata into named, typed arguments (and building it back), eth_log_decode for turning a receipt log's topics and data into named event arguments, eth_revert_decode for turning a failed call's revert data into a reason (Error(string), Panic(uint256), or a custom error), eth_bytecode for disassembling deployed bytecode, scraping the selectors out of its dispatcher, and reading its trailing solc metadata, eth_tx_codec for transactions, eth_storage_slot for storage layout — mapping and array slots, plus the well-known constant ones (EIP-1967 proxy, UUPS, ERC-7201 namespaced, diamond) — eth_address_case for EIP-55 checksums, ens_namehash for EIP-137 ENS namehash/labelhash, bip39 for BIP-39 mnemonic generation, validation, and seed derivation, bip32_derive for BIP-32/44 HD key and address derivation from a seed, eth_eoa_address for the address and public key behind a private key, and eth_contract_address for CREATE and CREATE2 deployment addresses. An always-available info tool reports which toolsets are active along with version information.

An opt-in serialization toolset (enabled via the serialize extra) adds serialize_codec, a single tool multiplexed by format. It encodes and decodes schemaless structured data across CBOR, MessagePack, bencode, and ASN.1 DER/BER (a tag-length-value tree; the crypto extra's asn1crypto is needed for ASN.1); it encodes and decodes SSZ (Simple Serialize) driven by an options.schema, also returning the hash_tree_root; and it decodes raw protobuf wire format (protobuf is decode-only — without a .proto schema it surfaces field numbers, wire types, and values rather than field names).

Further toolsets (the rest of crypto, IDs, validation) are on the roadmap — see TODO.

Related MCP server: mcp-python-bitcoinlib

Development

uv sync                 # create venv + install (incl. dev extras)
uv run mcp-bytesmith    # start the server over stdio
uv run pytest           # run the test 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

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

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
private_keyYesA 32-byte secp256k1 private key as hex (0x prefix optional). Never echoed back in the result.

TDQS

A4.5/5.0
Behavior5/5

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

No annotations, but description fully explains behavior: derives address and public key, never echoes private key, returns specific fields, and details public key serialization.

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

Conciseness5/5

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

Concise, well-structured with explanation and example. Every sentence adds value.

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

Completeness5/5

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

For a simple tool with 1 parameter and no output schema, description covers return format, derivation method, and example, making it complete.

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

Parameters3/5

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

Schema coverage is 100% and schema description already explains private_key parameter well. Description adds example but does not significantly enhance semantics beyond schema.

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

Purpose5/5

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

Clearly states it derives an EOA's Ethereum address and public key from private key, and contrasts with sibling eth_contract_address.

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

Usage Guidelines4/5

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

Mentions it is the counterpart to eth_contract_address and that it derives rather than creates an account, providing usage context. Includes an example.

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

eth_hashA

Compute an Ethereum hash: raw keccak-256, EIP-191, or EIP-712 typed-data.

Returns {kind, hash}. For kind=eip712 the result also carries {domain_separator, struct_hash}, the two EIP-712 component hashes. Note keccak-256 is the pre-NIST Ethereum variant, not hashlib's SHA3-256.

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

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.
kindYesHash flavor: 'keccak256' (raw Ethereum keccak-256), 'eip191' (personal_sign prefixed message), or 'eip712' (typed-data digest).
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.1/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 for eip712, the result includes additional component hashes, and notes the keccak-256 variant differs from standard SHA3-256. No destructive behavior is relevant. This is good transparency, though it could mention input size limits or error handling.

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

Conciseness4/5

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

Description is reasonably concise: 3 sentences plus an example. It front-loads the core purpose and then explains special cases. The example is helpful and earned its place. Could be slightly tighter, but not verbose.

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

Completeness4/5

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

Lacks an output schema, but the description explains the return structure ('{kind, hash}' with extra fields for eip712). For a hash calculation tool, this covers key details. Missing minor aspects like error responses or behavior on invalid input, but overall sufficient given the tool's simplicity.

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

Parameters4/5

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

All 4 parameters have descriptions in the input schema (100% coverage). The description adds value by explaining that for eip712, 'input_format' is ignored and 'data' is a JSON object, and provides an example of the output format. This goes beyond the schema without being redundant.

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

Purpose5/5

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

Description clearly states the tool computes Ethereum hashes with three specific flavors: keccak-256, EIP-191, and EIP-712. This differentiates it from sibling tools like 'hash' or 'ens_namehash', making purpose unambiguous.

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

Usage Guidelines3/5

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

Provides an example but does not explicitly state when to use this tool vs alternatives like 'hash' for non-Ethereum hashes or 'eth_selector' for function selectors. Usage context is implied, but no exclusions or comparative guidance are given.

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

eth_selectorA

Derive the 4-byte function selector or 32-byte event topic from a signature.

Returns {kind, signature (canonicalized), selector} for functions, or {kind, signature, topic0} for events.

Example: eth_selector("transfer(address,uint256)") -> selector="0xa9059cbb".

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_storage_slotA

Compute the storage slot for a mapping/array entry given a layout.

layout: {"kind": "mapping"|"dynamic_array", "slot": , ...} mapping -> needs key; "key_type" (default uint256). For nested mappings pass key (and optionally "key_type") as lists. dynamic_array -> needs index; optional "element_size" in slots (default 1). Returns {slot, slot_hex}: the slot as a decimal string and a 0x 32-byte word.

Example: eth_storage_slot({"kind":"mapping","slot":1}, "0x0000000000000000000000000000000000000000") -> slot_hex="0xa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49".

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoMapping key (required for kind=mapping); pass a list of keys outer-to-inner for nested mappings. Ignored for arrays.
indexNoElement index (required for kind=dynamic_array); int/decimal/0x-hex. Ignored for mappings.
layoutYesLayout object: {"kind":"mapping"|"dynamic_array", "slot": <declared base slot, int/decimal/0x-hex>, ...}. mapping takes optional "key_type" (default "uint256"; lists for nested mappings); dynamic_array takes optional "element_size" in slots (default 1). A stringified JSON object is accepted.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description covers input types (layout, key, index), return format (decimal slot string and 0x-hex 32-byte word), and additional options like 'key_type' and 'element_size'. It does not disclose error behavior or side effects, but for a computation tool this is acceptable.

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

Conciseness4/5

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

The description is concise yet informative, front-loading the main purpose and then detailing parameters and example. It could be slightly more terse, but the structure is well-organized and every sentence adds value.

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

Completeness5/5

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

Given the complexity of storage slot computation (nested mappings, key_type, element_size), the description is thorough. It covers both kinds, optional parameters, nested key lists, return format, and includes an example. Since there is no output schema, the description adequately fills that gap.

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

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. The description adds value by explaining how the layout object works (kind, slot, key_type, element_size), provides an example, and clarifies nested mapping syntax. This goes beyond what the schema properties alone convey.

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

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 storage slots for mapping/array entries, specifying the two kinds (mapping, dynamic_array) and their required parameters. It distinguishes itself from sibling tools which are unrelated encoding/hash utilities.

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

Usage Guidelines4/5

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

The description provides concrete usage contexts: mapping requires a 'key', dynamic_array requires an 'index', and notes nested mapping handling. It includes an example. However, it doesn't explicitly state when not to use this tool (but siblings are clearly different domains).

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

eth_tx_codecA

Serialize signed tx fields into a raw transaction, or decode a raw tx.

action=encode (needs fields) serializes the supplied, already-signed fields (it does not sign) -> {type, raw:'0x...', hash}. fields is an object; the type is taken from a type key or inferred from which fields are present (maxFeePerGas -> 1559, blobVersionedHashes -> 4844, accessList -> 2930, else legacy). Numbers accept int / decimal / 0x-hex; to/data are 0x-hex. action=decode (needs data, a 0x-hex raw tx) -> {type, fields, hash, from}, recovering from from the signature; numeric fields come back as decimal strings, addresses EIP-55 checksummed.

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

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.
fieldsNoAlready-signed tx fields object (required for action=encode); does NOT sign. The type comes from a `type` key or is inferred (maxFeePerGas->1559, blobVersionedHashes->4844, accessList->2930, else legacy). Numbers accept int/decimal/0x-hex; `to`/`data` are 0x-hex. A stringified JSON object is accepted.

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries full disclosure burden. It clearly states that encode does not sign, decode recovers the 'from' address, and specifies number formats and address checksumming. It does not explicitly declare non-destructiveness or statelessness, but the codec nature implies read-only behavior. Additional details about type inference add transparency.

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

Conciseness4/5

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

The description is concise with two substantive paragraphs and a concrete example. Every sentence contributes useful information; there is no redundancy or filler. The example illustrates typical usage, aiding understanding without unnecessary length.

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

Completeness5/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 and complexity (two actions, field inference, multiple formats), the description provides complete coverage. It explains both actions, return formats for each ({type, raw, hash} for encode, {type, fields, hash, from} for decode), and includes an example. No gaps are apparent.

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

Parameters4/5

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

Despite 100% schema coverage, the description adds significant semantic value beyond the schema. It explains how to structure the 'fields' object for encode, the inference rules for transaction type, accepted number formats (int/decimal/0x-hex), and that 'data' is required for decode. This enriches the schema's basic parameter descriptions.

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

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: 'Serialize signed tx fields into a raw transaction, or decode a raw tx.' It specifies the two actions (encode/decode) and the resources involved, making it distinct from sibling tools that handle other codec tasks (e.g., abi_codec, rlp_codec).

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

Usage Guidelines3/5

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

The description explains how to use the tool with action=encode or decode and the required parameters. However, it does not explicitly state when to use this tool over alternatives like rlp_codec or abi_codec, nor does it provide contraindications. The usage context is implied for Ethereum transactions but lacks direct comparison.

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

hashA

Compute a cryptographic, CRC, or fast non-crypto digest of bytes.

length (output bytes) is required for shake_*; key keys blake2b/blake2s (decoded with input_format); seed reseeds xxh*/fnv1a_*. Returns {algorithm, digest, output_format, bits}; CRC and fast hashes additionally report their integer value as int. Example: hash("abc", "sha256") -> digest "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"

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. Dates show when Glama detected each change.

  1. 8 tool updatesv0.4.0
    • Addedbip32_derive
    • Addedbip39
    • Addedderive_key
    • Addedeth_contract_address
    • Addedeth_eoa_address
    • Addedid_generate
    • Addedotpauth_uri
    • Addedpassword_hash
  2. 24 tool updatesv0.3.0
    • Changedabi_codec5 fields changed
      • addedInput schema / properties / action / description
        "'encode' values to ABI bytes, or 'decode' ABI bytes."
      • addedInput schema / properties / data / description
        "0x-prefixed ABI-encoded bytes to decode (required for action=decode)."
      • addedInput schema / properties / mode / description
        "'standard' head/tail ABI encoding, or 'packed' (abi.encodePacked: tight, no padding/length prefixes) — packed is encode-only as it is not uniquely decodable."
      • addedInput schema / properties / types / description
        "List of ABI type strings, e.g. [\"uint256\",\"address\",\"(uint8,bytes)[]\"]; aliases uint/int/byte are normalized. A stringified JSON array is accepted."
      • addedInput schema / properties / values / description
        "Values to encode (required for action=encode), positionally matching `types`; ints accept int/decimal/0x-hex, bytes are 0x-hex, addresses are 0x-hex. A stringified JSON array is accepted."
    • Addedbyte_order
    • Changedbytes_edit8 fields changed
      • addedInput schema / properties / action / description
        "Edit to apply: pad (widen to `length`), trim (strip `fill`), slice (`start`:`end`), concat (append `parts`), size (report byte length), prefix (add/strip 0x)."
      • addedInput schema / properties / data / description
        "Input byte-buffer as hex, a leading 0x is optional."
      • addedInput schema / properties / end / description
        "Slice end index (Python indexing, negatives allowed); default None means end of buffer."
      • addedInput schema / properties / fill / description
        "The pad/trim byte as one hex byte (0x optional); default '00'."
      • addedInput schema / properties / length / description
        "Target byte width for action=pad. Default None."
      • addedInput schema / properties / parts / description
        "Hex buffers to append for action=concat. Default None."
      • addedInput schema / properties / side / description
        "Which side acts: pad prepend/append, trim leading/trailing, prefix add/strip 0x. Default 'left'."
      • addedInput schema / properties / start / description
        "Slice start index (Python indexing, negatives allowed); default None means 0."
    • Changedcharset_transcode4 fields changed
      • addedInput schema / properties / errors / description
        "Codec error handler applied to both legs: strict|replace|ignore|backslashreplace|…. Default 'strict'."
      • addedInput schema / properties / from_charset / description
        "Encoding to encode `text` under to recover its raw bytes, e.g. cp1252, latin-1, utf-8."
      • addedInput schema / properties / text / description
        "Text to reinterpret across encodings."
      • addedInput schema / properties / to_charset / description
        "Encoding to decode those bytes under, e.g. utf-8."
    • Addedcodepoints
    • Changeddata_uri7 fields changed
      • addedInput schema / properties / action / description
        "'build' wraps a payload into a data: URI (needs `data`); 'parse' splits a URI into its parts (needs `uri`)."
      • addedInput schema / properties / base64 / description
        "For build: true base64-encodes the payload (adds ';base64'), false percent-encodes it. Default true."
      • addedInput schema / properties / data / description
        "Payload to wrap (action=build), decoded via `input_format`. Default None."
      • addedInput schema / properties / input_format / description
        "How build `data` is decoded to bytes; default 'text'."
      • addedInput schema / properties / media_type / description
        "MIME type for build, e.g. 'text/plain' or 'image/png'. Default None omits it."
      • addedInput schema / properties / output_format / description
        "How parsed payload is rendered (text=UTF-8 | hex | base64); default 'text'."
      • addedInput schema / properties / uri / description
        "The 'data:...' URI to parse (action=parse). Default None."
    • Changeddecode4 fields changed
      • addedInput schema / properties / data / description
        "Encoded string to decode, in `scheme`'s format."
      • addedInput schema / properties / options / description
        "Per-scheme options: alphabet (base58/base62). Default None."
      • addedInput schema / properties / output_format / description
        "How recovered bytes are rendered: text=UTF-8, hex=bare (no 0x), base64. Default 'text'; pick hex/base64 for non-UTF-8 payloads."
      • addedInput schema / properties / scheme / description
        "Source encoding (same set as `encode`): base16/32/.../64url, ascii85/base85/z85, url/url_form, idna, bech32/bech32m, hexdump, or bytes32."
    • Changedencode4 fields changed
      • addedInput schema / properties / data / description
        "Input to encode, decoded to bytes via `input_format` (idna/bytes32 read it as text)."
      • addedInput schema / properties / input_format / description
        "How `data` is decoded to bytes; default 'text'."
      • addedInput schema / properties / options / description
        "Per-scheme options: padding (bool, base32/64 family), alphabet (base58/62), hrp (required for bech32/bech32m), width (hexdump, default 16). Default None."
      • addedInput schema / properties / scheme / description
        "Target encoding: base16/32/32hex/32crockford/45/58/58check/62/64/64url, ascii85/base85/z85, url/url_form (percent), idna, bech32/bech32m, hexdump, or bytes32 (32-byte EVM word)."
    • Addedens_namehash
    • Changedeth_address_case2 fields changed
      • addedInput schema / properties / action / description
        "'encode' applies the EIP-55 checksum casing; 'verify' checks whether the input's casing already matches it."
      • addedInput schema / properties / address / description
        "A 20-byte hex address, 40 hex chars with or without a 0x prefix; any casing is accepted (verify compares the given casing against the EIP-55 checksum)."
    • Changedeth_hash4 fields changed
      • addedInput schema / properties / data / description
        "Polymorphic: for keccak256/eip191 it is the message bytes decoded per input_format; for eip712 it is the typed-data JSON object (a JSON string or already-parsed dict with types/primaryType/domain/message) and input_format is ignored."
      • addedInput schema / properties / input_format / description
        "How to decode `data` to bytes for keccak256/eip191 (ignored for eip712); hex is 0x-prefixed or bare."
      • addedInput schema / properties / kind / description
        "Hash flavor: 'keccak256' (raw Ethereum keccak-256), 'eip191' (personal_sign prefixed message), or 'eip712' (typed-data digest)."
      • addedInput schema / properties / output_format / description
        "Digest encoding: 'hex' is 0x-prefixed, or 'base64'."
    • Changedeth_selector2 fields changed
      • addedInput schema / properties / kind / description
        "'function' returns the 4-byte selector; 'event' returns the 32-byte topic0 (keccak of the canonical signature)."
      • addedInput schema / properties / signature / description
        "A Solidity function/event signature, e.g. 'transfer(address,uint256)'; parameter names, data locations, and type aliases (uint->uint256) are normalized to canonical ABI form."
    • Changedeth_storage_slot3 fields changed
      • addedInput schema / properties / index / description
        "Element index (required for kind=dynamic_array); int/decimal/0x-hex. Ignored for mappings."
      • addedInput schema / properties / key / description
        "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
        "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
        "'encode' signed fields into a raw tx, or 'decode' a raw tx."
      • addedInput schema / properties / data / description
        "0x-prefixed raw transaction bytes to decode (required for action=decode): a legacy RLP list or an EIP-2718 typed envelope."
      • addedInput schema / properties / fields / description
        "Already-signed tx fields object (required for action=encode); does NOT sign. The type comes from a `type` key or is inferred (maxFeePerGas->1559, blobVersionedHashes->4844, accessList->2930, else legacy). Numbers accept int/decimal/0x-hex; `to`/`data` are 0x-hex. A stringified JSON object is accepted."
    • Changedhash7 fields changed
      • addedInput schema / properties / algorithm / description
        "Digest algorithm: crypto (md5/sha1/sha2/sha3/blake2*), shake_128/shake_256 (need `length`), CRC (crc8/16/32/32c/64), xxhash (xxh32/64/3_64/3_128), or fnv1a_32/fnv1a_64."
      • addedInput schema / properties / data / description
        "Input to hash, decoded to bytes via `input_format`."
      • addedInput schema / properties / input_format / description
        "How `data` (and `key`) are decoded; default 'text'."
      • addedInput schema / properties / key / description
        "Key for blake2b/blake2s only, decoded with `input_format`. Default None."
      • addedInput schema / properties / length / description
        "Output length in bytes, required for shake_128/shake_256 and invalid otherwise. Default None."
      • addedInput schema / properties / output_format / description
        "How the digest is rendered (bare hex, no 0x); default 'hex'."
      • addedInput schema / properties / seed / description
        "Seed reseeding xxh*/fnv1a_* only. Default None."
    • Addedhash_file
    • Addedhmac
    • Changednum_convert4 fields changed
      • addedInput schema / properties / from_base / description
        "Base of `value`: hex (16), dec (10), bin (2), oct (8)."
      • addedInput schema / properties / pad_bytes / description
        "Zero-fill the output to this byte width (a minimum, never truncating); bit-aligned, so rejected for decimal output. Default None means no padding."
      • addedInput schema / properties / to_base / description
        "Base to render the result in; non-decimal output is prefixed 0x/0b/0o."
      • addedInput schema / properties / value / description
        "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
        "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
        "Character count for kind=token; default None means 32."
      • addedInput schema / properties / nbytes / description
        "Byte count for kind=bytes/hex/urlsafe; default 32."
      • addedInput schema / properties / output_format / description
        "Rendering for kind=bytes (hex/base64); default 'hex'."
      • addedInput schema / properties / separator / description
        "Joiner between passphrase words; default '-'."
      • addedInput schema / properties / wordlist / description
        "Custom passphrase word list; default None uses the bundled EFF large diceware list (7776 words)."
      • addedInput schema / properties / words / description
        "Word count for kind=passphrase; default 6."
    • Changedrlp_codec2 fields changed
      • addedInput schema / properties / action / description
        "'encode' structured data to RLP, or 'decode' a hex RLP."
      • addedInput schema / properties / data / description
        "On encode: a leaf (0x-hex string or non-negative integer) or a (possibly nested) JSON array of items; a stringified JSON array is parsed. On decode: a 0x-prefixed hex string of the RLP payload."
    • Changedstring_escape2 fields changed
      • addedInput schema / properties / style / description
        "Escaping convention: json|js|python|c|backslash (backslash escapes), html|xml (entities), unicode_escape, quoted_printable, mime_word (=?UTF-8?B?...?=), or shell (paste-safe single-quoted token)."
      • addedInput schema / properties / text / description
        "Text to escape."
    • Changedstring_unescape2 fields changed
      • addedInput schema / properties / style / description
        "Escaping convention `text` is in (inverse of string_escape): json|js|python|c|backslash, html|xml, unicode_escape, quoted_printable, mime_word, or shell."
      • addedInput schema / properties / text / description
        "Escaped text to decode back to its original form."
    • Addedtime_convert
    • Changedunicode_normalize2 fields changed
      • addedInput schema / properties / form / description
        "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
        "Text to normalize."
  3. 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.4/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose, covering areas like encoding, hashing, Ethereum operations, and string manipulation without overlapping functionality. For example, hash, hmac, and password_hash are well-separated.

Naming Consistency5/5

Tool names follow consistent patterns: Ethereum-specific tools use the 'eth_' prefix, encoding tools use clear verbs like encode/decode, and others use verb_noun or noun_verb (e.g., bip32_derive, time_convert). No mixing of conventions.

Tool Count4/5

33 tools is slightly above the typical ideal range but remains manageable and well-justified given the broad scope of the server, which covers multiple domains like cryptography, Ethereum, and string processing.

Completeness4/5

The tool set covers a wide range of operations, including encoding, hashing, password management, Ethereum address/contract/tx handling, and time/unicode conversions. Minor gaps exist (e.g., cryptographic signing), but the core workflows are well-supported.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

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
    MIT
  • A
    license
    Not graded
    quality
    C
    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

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/laszlopere/mcp-bytesmith'

If you have feedback or need assistance with the MCP directory API, please join our Discord server