Skip to main content
Glama

String Utility Belt

CI License: MIT npm: subelt Sponsor on GitHub

stringutilitybelt.com · Usage guide · All utilities · Integrations

Chain string transformations into visual pipelines with live, per-step previews. 246 utilities — encodings, hashes, ciphers, compression, data formats (JSON/YAML/TOML/CSV/XML), line and text operations, analysis, generators, web/dev helpers, numbers, dates and colours — all running client-side, with the same engine available as a CLI, an HTTP API, an MCP server, a browser extension and a VS Code extension.

A Base64 token is pasted into String Utility Belt, then three steps are added: Base64 decode, JSON pretty-print and JSON to YAML. Each step shows its own output as soon as it is added, and the result panel ends on the YAML.

Use it from your agent, terminal or editor

Every utility also runs on your own machine, outside the browser:

# Give Claude Code (or any MCP client) exact hashing, encoding and decoding instead of a guess
claude mcp add subelt -- npx -y @string-utility-belt/mcp

# Pipe text through a pipeline from the shell
echo 'eyJ1c2VyIjoiYWRhIn0=' | npx subelt base64_decode json_pretty

Related MCP server: Utility Belt MCP

Features

  • Pipelines — add, reorder (drag and drop), duplicate, disable/solo steps; undo/redo; per-step previews, diffs, timings and error policies (pass through / stop / empty); conditional steps; parallel branches with concat/zip/json/pick merges; macros (collapse a sub-chain into one step); "run on each" steps (run a sub-chain on every line, delimited piece, JSON array element or object value).

  • Share and save — pipelines (and optionally the input) as compressed #/p/… links, a named pipeline library with JSON import/export, a preset gallery, an embeddable #/embed/… widget.

  • Magic — detects the input's format (base64, JWT, gzip, JSON, …) and suggests or appends the decoding step; "decode until stable" mode.

  • Input/output — file upload (text and binary), fetch-a-URL via the Worker proxy, input history, side-by-side and diff views, hex view for bytes, syntax highlighting, stats bar, smart download names, copy-as (raw / JSON literal / hex / base64).

  • Engine — runs in a Web Worker with cancellation, adaptive debounce, a chunked mode for multi-MB inputs and a preview-first-64 KB option; custom JavaScript steps run in a sandboxed, network-less iframe + worker, and are quarantined when they arrive from someone else's link.

  • App — command palette (Ctrl+K), keyboard shortcuts (?), fuzzy utility search with favourites/recents and type-aware badges, light/dark themes, per-utility doc pages with a live playground, installable PWA with offline support and an OS share target, i18n scaffold.

Using the app

Open stringutilitybelt.com — nothing to install, and every transformation runs in your browser (see the privacy policy for the few features that contact the server). The site sets no cookies and runs no tracking scripts: Cloudflare Web Analytics counts page views without cookies, the site's own server counts clicks on sponsor and tool links by id alone, neither ever receives what you paste, and the site's Content-Security-Policy blocks scripts from anywhere else. The how-to guide lives in the app itself: click Docs in the header, or go to /docs/. Each utility's settings and examples are on its own page, listed at /utilities/.

From a terminal, the same engine is one command away:

echo -n hello | npx subelt trim base64_encode hash   # SHA-256 of the base64

Development

Requires Node.js 20.19+ or 22.12+.

git clone https://github.com/String-Utility-Belt/string-utility-belt.git
cd string-utility-belt
npm ci
npm run dev          # generates the utility manifest, then starts Vite
npm test             # Vitest (unit, component, golden-example and property tests)
npm run lint
npm run typecheck

Command

What it does

npm run gen

Regenerate src/utilities/_generated/* (run automatically before dev/build)

npm run build

Production build of the web app

npm run check:bundle

Enforce the entry-chunk budget in bundle-budget.json

npm run build:seo

Pre-render utility pages, sitemap, RSS and OG images into dist/ (build:seo:fast skips OG images)

npm run build:site

build + build:seo

npm run build:tools

Build packages/* (core, CLI, MCP server, browser extension, VS Code extension)

npm run test:e2e

Playwright end-to-end tests against a production build

npm run bench

Large-input benchmarks (vitest bench)

npm run deploy

build:site, then wrangler deploy (Cloudflare Workers: static assets + /api/*) — releases normally deploy from CI

npm run release -- plan

What a release from HEAD would ship, and at which versions (RELEASING.md)

npm run readme:demo

Re-record this README's demo GIF from the production build (after npm run build; needs ffmpeg)

Other surfaces

Surface

Where

Notes

Core library

packages/core

Framework-free engine + all utilities

CLI

packages/cli

echo -n hello | subelt base64_encode

MCP server

packages/mcp

Utilities and pipelines as agent tools over stdio

HTTP API

worker/

POST /api/run, GET /api/utilities[/:id] (CORS, rate-limited)

Browser extension

packages/extension

MV3; context menu "run on selection"

VS Code extension

packages/vscode

Transform selection, run a share link

Support the project

String Utility Belt is free, open source and has no paid tier. If it saves you time, you can support its development through GitHub Sponsors: it pays for hosting and keeps new utilities, presets and fixes coming. Companies can also sponsor a page on the site.

Contributing

Contributions are welcome — bug reports, utility ideas and pull requests. Start with CONTRIBUTING.md (setup, adding a utility, PR checklist) and the Code of Conduct. CLAUDE.md is the detailed architecture reference.

Found a security issue? Please report it privately — see SECURITY.md.

License

MIT

Available Tools

5 tools
describe_utilityDescribe utilityA
Read-only

Full documentation for one utility: its parameters (kind, default, options/bounds, description), the value types it accepts/produces, tags, aliases, worked examples (input, inputEncoding, params and expected output — byte outputs there use the app's display format, while run_utility returns bytes as base64), and which runtime capabilities it needs. Call this before run_utility to learn the exact parameter names and defaults; skip it for a utility you have already described. id must be an exact, case-sensitive utility id: names and aliases are not resolved, so look those up with list_utilities first. An unknown id returns isError ("unknown utility: "). When unavailable is set, run_utility and run_pipeline refuse the utility.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesUtility id, as returned by list_utilities (e.g. "base64_encode").

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
envYesRuntime capabilities the utility needs (dom, wasm, eval, main).
nameYes
tagsYes
paramsYesParameter name -> spec (kind, label, default, options/bounds, description…).
acceptsYesValue type(s) the utility takes: string, bytes or json.
aliasesYes
categoryYes
examplesYesWorked examples: input, params and expected output.
producesYesValue type(s) the utility returns.
descriptionYes
unavailableNoWhy this server will not run the utility, when it will not.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, but the description adds genuinely non-structured behavior: the exact error shape for an unknown id ("isError ('unknown utility: <id>')"), the effect of the `unavailable` flag on run_utility/run_pipeline, and the byte-format discrepancy between describe output (display format) and run_utility (base64). These are operationally important details an agent cannot infer from annotations or 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?

Information is front-loaded (purpose first, then when-to-call, id semantics, and error/availability notes) and every clause carries weight. The first sentence is a long multi-clause construction with nested parentheticals, which slightly hurts scannability, but there is no filler.

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

Completeness5/5

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

Despite the tool's low complexity, the description covers the prerequisite ordering (list_utilities -> describe_utility -> run_utility), parameter strictness, failure mode, and availability semantics. With an output schema already documenting the return shape, nothing an agent needs to call this correctly is missing.

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

Parameters5/5

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

Although the single-param schema has 100% description coverage, the description goes beyond it by specifying that `id` is exact and case-sensitive, that names/aliases are NOT resolved, that list_utilities must be consulted first, and what a bad id yields. That materially reduces failed calls in a way the schema line ("Utility id, as returned by list_utilities") does not.

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 opens with a specific verb+resource ("Full documentation for one utility") and enumerates exactly what that documentation contains (parameters, types, tags, examples, runtime capabilities). It is identifiable against siblings because it names run_utility, run_pipeline, and list_utilities and the distinct role each plays.

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?

It states the trigger ("Call this before run_utility to learn the exact parameter names and defaults"), the exclusion ("skip it for a utility you have already described"), and routes id discovery to the alternative tool ("look those up with list_utilities first"). This is explicit when/when-not/alternatives guidance.

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

detect_formatDetect formatA
Read-only

Guess what input is — JSON, YAML, TOML, XML, HTML, CSV/TSV, base64/base32/hex, URL-encoding, JWT, UUID, data URI, gzip/zlib, email, URL, IP address, unix timestamp, Markdown, SQL, Morse code, ROT13, plain binary — and return {candidates: [{format, confidence, note}]}, best first, confidence 0-1. Use it when you are handed an opaque or unlabelled value and must pick a utility for it; skip it when the format is already known. It only identifies, never transforms: to decode, search list_utilities for the top format (base64 -> base64_decode, JWT -> jwt_decode) and run that with run_utility. Ambiguous input yields several candidates (all-digit text can be a timestamp, JSON and hex at once); treat anything below about 0.45 as a weak guess. Use inputEncoding "base64"/"hex" only to deliver binary data such as gzip bytes: it is decoded before detection, so a base64 string you want identified must stay "text" (the default). Empty input yields an empty list.

ParametersJSON Schema
NameRequiredDescriptionDefault
inputYesThe value to inspect.
inputEncodingNoHow to decode `input` first. Default "text".

Output Schema

ParametersJSON Schema
NameRequiredDescription
candidatesYesLikely formats, best first; confidence is 0-1. Empty for empty input.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, openWorldHint=false), yet the description still adds real behavior: it identifies but never transforms, ambiguous input returns multiple candidates, low-confidence results are weak guesses, and empty input yields an empty list. That is genuine operational context, though it doesn't discuss cost, size limits, or performance on large inputs.

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?

Purpose and return shape are front-loaded, and the trailing clauses all carry actionable content (threshold, encoding caveat, empty-input case). The long mid-sentence format enumeration is heavier than necessary, but it does set expectation for candidate breadth.

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?

Output schema exists so return values needn't be explained, and the description still previews the candidates/best-first shape. With only two parameters, both annotated in the schema and clarified in prose, nothing an agent needs to invoke this correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description earns extra by clarifying the counterintuitive `inputEncoding` semantics: base64/hex are for delivering binary bytes, not for identifying a base64-looking string, which must stay "text". This is meaning the schema's one-line description does not 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?

States a specific verb (detect/guess) and resource (an opaque `input` value), enumerates the concrete format families it recognizes, and names the sibling tools (list_utilities, run_utility) it hands off to. An agent can distinguish it from all four siblings without opening a schema.

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?

Explicit routing: 'Use it when you are handed an opaque or unlabelled value... skip it when the format is already known,' plus the follow-on workflow (search list_utilities for the top format, then run_utility). Also supplies the confidence threshold (~0.45) that decides whether a candidate is actionable.

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

list_utilitiesList utilitiesA
Read-only

Search the string-transformation utilities this server can run (247 total, across categories like Encoding, Hashing, Ciphers, Compression, Data Formats, Analysis, Generators and more). Returns {items: [{id, name, category, description}], total, categories}, best matches first. Use this first to find an id, then call describe_utility for its exact parameters before run_utility. category and query combine (a utility must match both); omit both to browse the whole catalog. A category that does not exist matches nothing rather than failing, so take one from categories. There is no paging: when total exceeds the items returned, raise limit or narrow the query. Reads the bundled catalog only: no network access and no rate limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default 50, max 500).
queryNoSearch words, matched case-insensitively against id, name, tags, aliases and description; every word must match somewhere, in any order (e.g. "encode url", "sha256", "uppercase").
categoryNoCategory to filter to (case-insensitive), e.g. "Encoding" or "Hashing".

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYesMatching utilities, best first, up to `limit`.
totalYesHow many utilities matched before `limit` was applied.
categoriesYesEvery category name, for filtering.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint=false; the description goes well beyond them, disclosing that it reads a bundled catalog with no network access and no rate limit. It also documents the no-paging behavior and the remedy when `total` exceeds returned items, which is real operational context.

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

Conciseness5/5

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

Front-loads what it searches, then return shape, then the call sequence, then edge cases. It is longer than average but every clause adds a distinct, actionable fact with no restatement of the title or schema.

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?

An output schema exists, yet the description still names the return shape and the paging caveat, and it covers filtering, failure behavior, and follow-up calls. Nothing an agent needs to invoke this correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so per-parameter meaning is already carried by the schema and the baseline is 3. The description adds non-schema value anyway: the AND semantics when `category` and `query` combine, the instruction to source category values from `categories`, and the limit-raising workaround.

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

Purpose5/5

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

States a specific verb and resource ('Search the string-transformation utilities this server can run') plus scale and category coverage, so the agent immediately knows this is a catalog search, not an execution tool. The sibling relationship to describe_utility and run_utility is made explicit in the same breath.

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

Usage Guidelines5/5

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

Gives an explicit call order ('Use this first to find an id, then call describe_utility for its exact parameters before run_utility') and an explicit when-to-omit condition ('omit both to browse the whole catalog'). It even pre-empts a failure mode by telling the agent to take a category from `categories` since unknown categories match nothing.

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

run_pipelineRun pipelineA
Read-only

Run several transformations on input in one call: an ordered list of steps (string-utility-belt v3 schema), each step's output feeding the next. Besides utility steps, a pipeline can hold branches (parallel forks merged back together), macros (named sub-pipelines) and "run on each" steps (a sub-pipeline run on every line, delimited piece, JSON array element or JSON object value). Prefer this to chaining run_utility calls; for a single transformation, run_utility is simpler. Returns {output, outputEncoding?, errors, timings, skipped, halted}: errors maps step id to its error message, timings maps step id to milliseconds. Provide exactly one of steps or share (a #/p/<payload> share link, a full URL containing one, or the bare payload). Untrusted step data is sanitized first, so malformed entries are dropped rather than rejected. Refused outright: pipelines with more than 100 steps (nested steps counted), unknown utility ids, enabled steps with invalid params, and any step that would run arbitrary user JavaScript (e.g. "custom_js") — LLM-driven code execution is out of scope. Input is capped at 1,000,000 bytes, output text past 1,000,000 characters is cut off (flagged truncated, with fullLength), and the call is stopped after 20s.

ParametersJSON Schema
NameRequiredDescriptionDefault
inputYesThe pipeline's source input.
shareNoA share link (or its bare payload) for a previously built pipeline; used instead of `steps`.
stepsNoPipeline steps (v3 schema). Each entry is either a utility step {id, utilityId, params?, enabled?, condition?, onError?}, a fork {type:"branch", id, branches:[[...steps], [...steps]], merge:{mode:"concat"|"zip"|"json"|"pick", ...}}, a sub-pipeline {type:"macro", id, name, steps:[...steps]}, or a map {type:"each", id, split:{mode:"lines"|"json-array"|"json-values"} or {mode:"delimiter", separator}, steps:[...steps], skipEmpty?} that runs `steps` on every item and puts the results back in place (on an each step, `onError` also decides what a failed item becomes). `condition` gates a step on its input ({kind:"always"|"nonEmpty"|"regex"|"type", ...}); `onError` is "passthrough" (default: record the error, pass the input on), "stop" or "empty". Use [] for the identity pipeline; omit when using `share`.
inputEncodingNoHow to decode `input`. Default "text".

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorsYesStep id -> error message, for steps that failed.
haltedYesTrue when a step with onError "stop" failed and ended the pipeline.
outputYesThe result: text as-is, JSON pretty-printed, bytes as base64.
skippedYesStep id -> why it did not run (disabled, condition, halted, aborted).
timingsYesStep id -> milliseconds it took.
truncatedNoTrue when `output` was cut off at the output limit.
fullLengthNoLength `output` would have had untruncated, when `truncated`.
outputEncodingNoPresent when `output` is base64-encoded bytes.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only cover readOnlyHint=true and openWorldHint=false; the description goes far beyond by disclosing sanitization of untrusted step data, outright refusal conditions (100-step cap, unknown utility ids, invalid params, JS execution), an explicit 1,000,000-byte input cap, 1,000,000-char output truncation with `truncated`/`fullLength`, and a 20s timeout. This is unusually complete behavioral disclosure for a computation tool.

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?

Long but information-dense and front-loaded: composition model first, then routing, then constraints. Nearly every sentence carries distinct constraints or semantics, though the single-paragraph density slightly strains readability.

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

Completeness5/5

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

For a complex multi-step computation tool with a rich nested-step schema, the description covers composition forms, refusal conditions, limits, and return shape. With an output schema present, it need not explain returns further, and nothing needed to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: the exactly-one-of constraint between `steps` and `share`, that `share` may be a link, a URL containing one, or the bare payload, and the error/timing map semantics of `errors` and `timings`.

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

Purpose5/5

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

States a specific verb and resource (run several transformations on `input` in one call), explains the ordered-step composition model, and explicitly distinguishes itself from the run_utility sibling. An agent can tell it apart from list_utilities/describe_utility/run_utility without opening any schema.

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 states the selection rule: prefer this to chaining run_utility calls, but for a single transformation run_utility is simpler. It also states when to use `share` vs `steps`, giving both the positive and negative routing conditions.

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

run_utilityRun utilityA
Read-only

Run a single utility on input and return {output, outputEncoding?}. For two or more transformations in a row, make one run_pipeline call instead of chaining run_utility calls; if you do not know the id yet, find it with list_utilities. Plain text output is returned as-is; a JSON-producing utility returns pretty-printed JSON text; a byte-producing utility (e.g. gzip_compress, get_bytes) returns base64 with outputEncoding: "base64". inputEncoding controls how input itself is decoded first: "text" (default) uses it as-is, "base64" or "hex" decode it to raw bytes, "json" parses it. Params are validated against describe_utility's spec; invalid ones are rejected. Input is capped at 1,000,000 bytes, output text past 1,000,000 characters is cut off (flagged truncated, with fullLength), and the call is stopped after 20s. A failing utility returns isError with the error message. Utilities that run arbitrary user JavaScript (e.g. "custom_js") are refused, and the few that need a browser DOM parser (e.g. "xml_to_json", "html_table_to_csv") fail here.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesUtility id (see list_utilities / describe_utility).
inputYesThe value to run the utility on.
paramsNoUtility parameters (see describe_utility for names/kinds); params left out use their declared default.
inputEncodingNoHow to decode `input` before passing it to the utility. Default "text".

Output Schema

ParametersJSON Schema
NameRequiredDescription
outputYesThe result: text as-is, JSON pretty-printed, bytes as base64.
truncatedNoTrue when `output` was cut off at the output limit.
fullLengthNoLength `output` would have had untruncated, when `truncated`.
outputEncodingNoPresent when `output` is base64-encoded bytes.

TDQS

A4.8/5.0
Behavior5/5

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

Far exceeds the annotations (readOnlyHint/openWorldHint): it discloses output encoding rules (plain text as-is, pretty-printed JSON, base64 bytes with `outputEncoding`), hard limits (1,000,000-byte input cap, output truncated past 1,000,000 characters with `truncated`/`fullLength` flags), a 20s timeout, error behavior (isError with message), and outright refusals (custom_js) and documented failures (xml_to_json, html_table_to_csv). This is exactly the behavioral context annotations cannot carry.

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

Conciseness4/5

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

Front-loaded with the core action and the pipeline alternative, and nearly every sentence carries distinct operational information (encoding, limits, errors, refusals). It is dense and longer than typical, but not padded; the only mild cost is that limits/errors/refusals are packed into one long trailing sentence.

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

Completeness5/5

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

For a 4-param tool with an output schema and only two booleans of annotation coverage, the description fills every remaining gap: encoding of both input and output, validation source, caps, timeout, truncation signaling, and known unsupported utilities. Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real semantics beyond the schema: it explains what each `inputEncoding` value actually does ('base64'/'hex' decode to raw bytes, 'json' parses it) and that `params` are validated against describe_utility's spec with invalid ones rejected. The schema's own enum descriptions are thinner than this.

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

Purpose5/5

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

States a specific verb+resource ('Run a single utility on `input`') plus the return shape, and explicitly distinguishes itself from the sibling run_pipeline ('make one run_pipeline call instead of chaining run_utility calls'). An agent can route between the two without opening either schema.

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

Usage Guidelines5/5

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

Gives explicit when-not guidance ('For two or more transformations in a row, make one run_pipeline call instead') and a fallback path when the required `id` is unknown ('find it with list_utilities'). Alternatives and their selecting conditions are both named.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv1.8.0
    • First observeddescribe_utility
    • First observeddetect_format
    • First observedlist_utilities
    • First observedrun_pipeline
    • First observedrun_utility

TDQS

A4.7/5.0

Scored across 5 tools

Disambiguation5/5

Each tool occupies a distinct phase of the workflow: list_utilities discovers ids, describe_utility fetches specs, run_utility executes one, run_pipeline executes many, and detect_format only identifies. The single-vs-multi boundary between run_utility and run_pipeline is explicitly stated, and detect_format is clearly non-overlapping since it never transforms.

Naming Consistency5/5

All five names use consistent snake_case verb_noun form (list_utilities, describe_utility, run_utility, run_pipeline, detect_format). The verbs map cleanly onto the discover/describe/run/detect lifecycle with no stylistic drift.

Tool Count5/5

Five tools is well-scoped for a meta-server fronting a 247-utility catalog; exposing one tool per utility would be absurd, and wrapping the surface as discover/describe/run/pipeline/detect is economical. No redundant or filler tools.

Completeness4/5

The full lifecycle (find id, read spec, execute single, execute chained, identify unknown input) is covered with sensible encoding and error handling. Minor gaps: no dedicated validation/introspection beyond describe_utility and no explicit catalog-listing mode beyond a broad list query, but these are workable.

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    B
    maintenance
    Swiss-army-knife utility MCP server for AI agents. 18 tools for JSON validation/formatting, base64 encode/decode, hash generation, UUID generation, URL parsing, regex testing, markdown↔HTML conversion, text stats, slug generation, datetime conversion, cron parsing, text diffing, CSV↔JSON conversion, and JWT decoding. Zero API Key required
    18
    5
    -
  • A
    license
    A
    quality
    C
    maintenance
    Free, fully-offline MCP utility tools for agents: base64, UUID, JSON validation, SHA hashing, timestamps, URL codec, case conversion, and secure passwords. No API keys, no tracking, works offline - stdlib-only Python stdio server.
    9
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Provides deterministic developer utilities as MCP tools, including UUID/password generation, hashing, encoding, JWT decoding, cron scheduling, regex execution, and text analysis. Runs entirely locally with no network calls, telemetry, or API keys.
    20
    47 npm
    MIT