{
  "schemaVersion": 1,
  "siteUrl": "https://toolcore.dev",
  "manifestUrl": "https://toolcore.dev/mcp-tools.json",
  "llmSystemPrompt": "You can help the user use Toolcore (https://toolcore.dev), a static site. This manifest lists **non-AIGC** tools only (browser-local or documented operations). For AIGC-assisted tools (e.g. natural language → regex), use https://toolcore.dev/agent-tools.json. There is no general private transform API for arbitrary payloads beyond those documented per tool.\n\nHuman-readable integration overview (same site): https://toolcore.dev/ai-agents\n\nHow to proceed:\n1. Fetch the machine-readable manifest: GET https://toolcore.dev/mcp-tools.json\n2. Read `siteUrl`, `integration`, `conventions` (`q` = percent-encoded UTF-8 text; `qb` = Base64 of UTF-8 bytes for long or awkward payloads), and each item in `tools`.\n3. For a chosen tool, build an HTTPS URL: `siteUrl + path`, then append a query string using the keys described in that tool’s `prefill` object. Omit tools whose `prefill.kind` is `none` when the user needs to paste or upload locally—they still work, but URLs cannot prefill them.\n4. Give the user the final URL (or open it in an embedded browser if your environment allows). Do not claim you executed the tool server-side.\n\nWhen unsure which keys apply, prefer the manifest over guessing.",
  "integration": {
    "pattern": "url_manifest",
    "summary": "Agents integrate by fetching this JSON and building HTTPS tool URLs with query-string prefill. This is not a private JSON transform API: main work runs in the visitor’s browser (unless a specific page documents otherwise).",
    "rationaleForAgents": "Prefer returning a Toolcore URL with prefill instead of simulating formatters, encoders, crypto, or large diffs in the model. That reduces token use and compute on the agent side and avoids subtle mistakes—the site UI performs the operation.",
    "urls": {
      "thisManifest": "https://toolcore.dev/mcp-tools.json",
      "alternateManifest": "https://toolcore.dev/agent-tools.json",
      "humanGuide": "https://toolcore.dev/ai-agents",
      "llmPrompt": "https://toolcore.dev/llm-prompt.txt",
      "pseudoCli": "https://toolcore.dev/tools/cli"
    },
    "alternateManifestNote": "Use /agent-tools.json for the full catalog including AIGC tools when the site is configured for them."
  },
  "conventions": {
    "q": "UTF-8 string in the query string (percent-encoded).",
    "qb": "Standard Base64 encoding of UTF-8 bytes; use when payloads are long or awkward to percent-encode."
  },
  "tools": [
    {
      "id": "image",
      "path": "/tools/image-convert",
      "title": "Image tools",
      "description": "Convert, enhance (tone & sharpen), resize, read EXIF & export clean—WebP, JPEG, PNG in browser.",
      "prefill": {
        "kind": "none",
        "notes": "Local file upload only—no URL prefill. Agents should link to the page without query."
      }
    },
    {
      "id": "image-resize",
      "path": "/tools/image-resize",
      "title": "Image resize",
      "description": "Max width or height, keep aspect ratio, export WebP/JPEG/PNG—local only.",
      "prefill": {
        "kind": "none",
        "notes": "Local file upload only—no URL prefill."
      }
    },
    {
      "id": "qr",
      "path": "/tools/qr",
      "title": "QR code generator",
      "description": "Wi‑Fi & vCard builders, templates—custom colors, optional logo, PNG/SVG—local only.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "color-convert",
      "path": "/tools/color/convert",
      "title": "Color converter",
      "description": "HEX, RGB, HSL, OKLCH, named colors—paste a CSS color or use harmonic palette hints.",
      "prefill": {
        "kind": "color",
        "keys": [
          "color",
          "colorb",
          "q",
          "qb"
        ],
        "notes": "Prefer `color` / `colorb` for a CSS color string; `q` / `qb` are aliases."
      }
    },
    {
      "id": "color-web-safe",
      "path": "/tools/color/web-safe",
      "title": "Web-safe colors",
      "description": "216 swatches from the 6×6×6 cube; copy HEX, RGB, or RGBA in one click.",
      "prefill": {
        "kind": "none",
        "notes": "Palette grid only—no primary paste field."
      }
    },
    {
      "id": "color-contrast",
      "path": "/tools/color/contrast",
      "title": "WCAG contrast checker",
      "description": "Foreground vs background: contrast ratio and WCAG AA/AAA for normal and large text.",
      "prefill": {
        "kind": "contrast-colors",
        "keys": [
          "fg",
          "fgb",
          "bg",
          "bgb"
        ],
        "notes": "Foreground and background CSS color strings: `fg`/`fgb` (text) and `bg`/`bgb` (surface)."
      }
    },
    {
      "id": "json-format",
      "path": "/tools/json/format",
      "title": "JSON formatter",
      "description": "JSON format online: pretty-print, minify, validate, escape, download .json.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-string-helpers",
      "path": "/tools/json/string-helpers",
      "title": "JSON string & Unicode",
      "description": "Minify, escape quotes, Unicode escapes, CJK punctuation in values.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-compare",
      "path": "/tools/json/compare",
      "title": "JSON compare",
      "description": "Side-by-side diff paths; sample pre-filled.",
      "prefill": {
        "kind": "dual-json",
        "keys": [
          "left",
          "leftqb",
          "right",
          "rightqb"
        ]
      }
    },
    {
      "id": "json-xml",
      "path": "/tools/json/xml",
      "title": "JSON ↔ XML",
      "description": "Bidirectional convert; format or minify XML locally.",
      "prefill": {
        "kind": "json-xml",
        "keys": [
          "json",
          "jsonb",
          "xml",
          "xmlb"
        ]
      }
    },
    {
      "id": "json-yaml",
      "path": "/tools/json/yaml",
      "title": "YAML ↔ JSON",
      "description": "YAML to JSON and JSON to YAML online—format, validate, convert locally.",
      "prefill": {
        "kind": "yaml-json",
        "keys": [
          "yaml",
          "yamlb",
          "json",
          "jsonb"
        ],
        "notes": "Same keys as JSON ↔ XML but YAML side uses `yaml` / `yamlb`; `json` / `jsonb` for JSON panel."
      }
    },
    {
      "id": "json-msgpack",
      "path": "/tools/json/msgpack",
      "title": "JSON ↔ MessagePack / CBOR",
      "description": "Encode JSON to MessagePack or CBOR and decode binary (Base64) back—compact APIs and IoT payloads in the browser.",
      "prefill": {
        "kind": "binary-json",
        "keys": [
          "json",
          "jsonb",
          "bin",
          "binb"
        ],
        "notes": "`json` / `jsonb` for JSON text; `bin` = Base64 text of the payload, or `binb` = standard Base64 of raw binary bytes. Optional `mode` = `msgpack` | `cbor` (default MessagePack)."
      }
    },
    {
      "id": "json-csv",
      "path": "/tools/json/csv",
      "title": "CSV ↔ JSON",
      "description": "Paste a table or JSON array of objects—convert both ways, choose delimiter, client-side.",
      "prefill": {
        "kind": "csv-json",
        "keys": [
          "csv",
          "csvb",
          "json",
          "jsonb"
        ],
        "notes": "`csv` / `csvb` for the CSV panel; `json` / `jsonb` for JSON. Optional UI: delimiter and header row are not in the URL."
      }
    },
    {
      "id": "json-ndjson",
      "path": "/tools/json/ndjson",
      "title": "NDJSON / JSON Lines",
      "description": "Newline-delimited JSON: lines to array, array to lines, validate, minify—client-side.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "Primary NDJSON / JSON Lines text (one JSON value per line); `q` / `qb` fill the left panel."
      }
    },
    {
      "id": "json-sort-keys",
      "path": "/tools/json/sort-keys",
      "title": "JSON sort keys",
      "description": "Recursively sort object keys for stable JSON text—pretty or minify, client-side.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-canonical-jcs",
      "path": "/tools/json/canonical-jcs",
      "title": "JSON canonicalization (JCS)",
      "description": "RFC 8785 JCS: deterministic canonical JSON string and SHA-256—signing and hashing, client-side.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "JSON text to canonicalize (RFC 8785 JCS); `q` / `qb` fill the input panel."
      }
    },
    {
      "id": "json-csharp",
      "path": "/tools/json/to-csharp",
      "title": "JSON → C# classes",
      "description": "POCOs from sample JSON with JsonPropertyName.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-java",
      "path": "/tools/json/to-java",
      "title": "JSON → Java classes",
      "description": "POJO-style fields and List types from JSON.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-typescript",
      "path": "/tools/json/to-typescript",
      "title": "JSON → TypeScript interfaces",
      "description": "Interfaces from sample JSON—nested types and arrays inferred in the browser.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-to-python",
      "path": "/tools/json/to-python",
      "title": "JSON → Python TypedDict",
      "description": "TypedDict scaffolding from sample JSON—nested shapes inferred in the browser.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-to-rust",
      "path": "/tools/json/to-rust",
      "title": "JSON → Rust structs (serde)",
      "description": "Serde structs with JSON renames from sample data—local only.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-toml",
      "path": "/tools/json/toml",
      "title": "TOML ↔ JSON",
      "description": "TOML to JSON and JSON to TOML online—format, validate, convert locally.",
      "prefill": {
        "kind": "toml-json",
        "keys": [
          "toml",
          "tomlb",
          "json",
          "jsonb"
        ],
        "notes": "Same keys as YAML ↔ JSON but TOML side uses `toml` / `tomlb`; `json` / `jsonb` for JSON panel."
      }
    },
    {
      "id": "json-schema",
      "path": "/tools/json/schema",
      "title": "JSON Schema validate",
      "description": "Validate JSON against a schema, infer draft-07 schema from data—Ajv in browser.",
      "prefill": {
        "kind": "dual-json",
        "keys": [
          "left",
          "leftqb",
          "right",
          "rightqb"
        ],
        "notes": "Left panel JSON Schema; right panel JSON instance to validate (same keys as JSON compare)."
      }
    },
    {
      "id": "json-pointer-patch",
      "path": "/tools/json/pointer-patch",
      "title": "JSON Pointer & Patch",
      "description": "RFC 6901 pointers, apply RFC 6902 patches, generate diff patches—client-side.",
      "prefill": {
        "kind": "none",
        "notes": "Multi-tab: `q`/`qb` document, `pointer` path, `patch`/`patchb` patch array, `left`/`right` for generate patch, `tab`=resolve|apply|generate."
      }
    },
    {
      "id": "json-json5",
      "path": "/tools/json/json5",
      "title": "JSON5 / JSONC → JSON",
      "description": "Parse JSON5 and JSON with comments—output strict JSON, pretty or minify in browser.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-merge-patch",
      "path": "/tools/json/merge-patch",
      "title": "JSON Merge Patch",
      "description": "RFC 7396 merge patch against a base document—recursive merge, null removes keys.",
      "prefill": {
        "kind": "dual-json",
        "keys": [
          "left",
          "leftqb",
          "right",
          "rightqb"
        ],
        "notes": "Left: base JSON document; right: merge patch object (RFC 7396)."
      }
    },
    {
      "id": "json-to-go",
      "path": "/tools/json/to-go",
      "title": "JSON → Go structs",
      "description": "Go structs with json tags from sample JSON—inferred in the browser.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-to-kotlin",
      "path": "/tools/json/to-kotlin",
      "title": "JSON → Kotlin data classes",
      "description": "Kotlin data classes from sample JSON—nested types from one example, local only.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-to-swift",
      "path": "/tools/json/to-swift",
      "title": "JSON → Swift structs (Codable)",
      "description": "Swift structs with Codable and CodingKeys from sample JSON—local only.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-to-php",
      "path": "/tools/json/to-php",
      "title": "JSON → PHP classes",
      "description": "PHP 8+ typed classes from sample JSON—strict_types and list phpdoc, local only.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-to-ruby",
      "path": "/tools/json/to-ruby",
      "title": "JSON → Ruby classes",
      "description": "Ruby classes with attr_accessor from sample JSON—snake_case symbols, local only.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-to-dart",
      "path": "/tools/json/to-dart",
      "title": "JSON → Dart classes",
      "description": "Dart classes with final fields from sample JSON—Flutter-friendly scaffold, local only.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-query",
      "path": "/tools/json/query",
      "title": "JSONPath & JMESPath",
      "description": "Query large JSON with JSONPath or JMESPath—results panel, runs in your tab.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-flatten",
      "path": "/tools/json/flatten",
      "title": "JSON flatten / unflatten",
      "description": "Nested JSON ↔ dot paths for configs and i18n—round-trip in the browser.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-properties",
      "path": "/tools/json/properties",
      "title": "JSON ↔ Properties",
      "description": "Java-style .properties lines ↔ nested JSON—comments skipped, client-side.",
      "prefill": {
        "kind": "dual-json",
        "keys": [
          "left",
          "leftqb",
          "right",
          "rightqb"
        ],
        "notes": "Left JSON, right `.properties` text (same keys as YAML ↔ JSON but right side is properties)."
      }
    },
    {
      "id": "json-html-table",
      "path": "/tools/json/html-table",
      "title": "JSON ↔ HTML table",
      "description": "Edit an array of objects as a table, export JSON—useful for quick data entry.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-big-numbers",
      "path": "/tools/json/big-numbers",
      "title": "JSON big integers",
      "description": "Compare standard parse vs bigint-safe parse for integers beyond 2^53—local only.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-base64-preview",
      "path": "/tools/json/base64-preview",
      "title": "Base64 in JSON",
      "description": "Find string fields that look like Base64 and preview UTF-8 decoded text—local only.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-stats",
      "path": "/tools/json/stats",
      "title": "JSON statistics",
      "description": "Depth, key counts, object/array totals, and value-type breakdown—local only.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-to-sql",
      "path": "/tools/json/to-sql",
      "title": "JSON → SQL INSERT",
      "description": "INSERT statements from a JSON array of objects—escaped strings, local only.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-to-url-query",
      "path": "/tools/json/to-url-query",
      "title": "JSON → URL query string",
      "description": "Flat JSON object to application/x-www-form-urlencoded—local only.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-from-url-query",
      "path": "/tools/json/from-url-query",
      "title": "URL query string → JSON",
      "description": "Parse query strings into flat JSON—coerce numbers and booleans, local only.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-deep-merge",
      "path": "/tools/json/deep-merge",
      "title": "JSON deep merge",
      "description": "Merge two objects recursively—right overlays left; dual JSON prefill.",
      "prefill": {
        "kind": "dual-json",
        "keys": [
          "left",
          "leftqb",
          "right",
          "rightqb"
        ],
        "notes": "Left: base JSON; right: overlay JSON (merged into base)."
      }
    },
    {
      "id": "json-to-env",
      "path": "/tools/json/to-env",
      "title": "JSON → .env lines",
      "description": "Flatten nested JSON to KEY=value dot keys—strings quoted when needed, local only.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-from-env",
      "path": "/tools/json/from-env",
      "title": ".env lines → JSON",
      "description": "Parse KEY=value text into nested JSON—dot keys, coercion, local only.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-paths",
      "path": "/tools/json/paths",
      "title": "JSON path list",
      "description": "Enumerate paths to each leaf—$ and dot/bracket segments; local only.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-redact",
      "path": "/tools/json/redact",
      "title": "JSON redact keys",
      "description": "Mask values by key name recursively—case-insensitive; local only.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "json-to-curl",
      "path": "/tools/json/to-curl",
      "title": "JSON → curl command",
      "description": "Build a curl line with a JSON body and Content-Type—copy locally for API repro.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "Primary JSON body for curl --data; URL and method are edited in the UI."
      }
    },
    {
      "id": "json-to-openapi",
      "path": "/tools/json/to-openapi",
      "title": "JSON → OpenAPI draft",
      "description": "Turn sample JSON into a minimal OpenAPI 3 paths entry with an inferred schema—YAML or JSON output.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "Sample JSON for schema inference; path, HTTP method, API title, and request vs response are edited in the UI."
      }
    },
    {
      "id": "encoding",
      "path": "/tools/encoding",
      "title": "Encoding tools",
      "description": "Base64 and URL on this page; hub lists hex, HTML entities, JWT, JSON helpers, crypto, and tokens.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "data-url",
      "path": "/tools/data-url",
      "title": "Data URL encoder & decoder",
      "description": "Build data: URLs from UTF-8 text or small files; decode and preview images or text locally.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "Fills the **encode text** field (UTF-8). MIME type is not in the URL—set in the UI if needed."
      }
    },
    {
      "id": "crypto",
      "path": "/tools/crypto",
      "title": "Encrypt & decrypt",
      "description": "Encrypt, decrypt, hash (AES, DES, RC4, Rabbit, TripleDES, MD5, SHA) and Base64—client-side.",
      "prefill": {
        "kind": "crypto",
        "keys": [
          "tab",
          "q",
          "qb"
        ],
        "tabValues": [
          "aes",
          "des",
          "rc4",
          "rabbit",
          "tripledes",
          "md5",
          "base64",
          "hash"
        ],
        "notes": "Optional `tab` selects the workspace; `q` / `qb` set the main input text."
      }
    },
    {
      "id": "file-checksum",
      "path": "/tools/file-checksum",
      "title": "File checksum & hash",
      "description": "SHA-256, SHA-512, MD5, CRC-32, and more for a local file—verify downloads without uploading.",
      "prefill": {
        "kind": "none",
        "notes": "Local file upload only—no URL prefill. Link without query."
      }
    },
    {
      "id": "compress",
      "path": "/tools/compress",
      "title": "Compress & minify",
      "description": "HTML, JS, CSS, XML, SQL, JSON minify; batch JPEG/WebP image compression.",
      "prefill": {
        "kind": "compress",
        "keys": [
          "mode",
          "q",
          "qb"
        ],
        "modeValues": [
          "html",
          "js",
          "css",
          "xml",
          "sql",
          "json",
          "images"
        ],
        "notes": "`mode` selects the minify tab; for text modes, `q` / `qb` replace that tab’s draft. Images tab has no text prefill."
      }
    },
    {
      "id": "regex",
      "path": "/tools/regex",
      "title": "Regex generator & tester",
      "description": "Presets (US/NANP & E.164 phones, email, URL), JS snippet, local test.",
      "prefill": {
        "kind": "regex",
        "keys": [
          "tab",
          "pattern",
          "patternb",
          "flags",
          "tpattern",
          "tpatternb",
          "tflags",
          "tstr",
          "tstrb"
        ],
        "notes": "`tab` = generate | test. Generate: `pattern`, `patternb`, `flags`. Test: `tpattern`, `tpatternb`, `tflags`, `tstr`, `tstrb`."
      }
    },
    {
      "id": "timestamp",
      "path": "/tools/timestamp",
      "title": "Unix timestamp converter",
      "description": "Epoch to date: seconds, milliseconds, ISO-8601, UTC and local time—in browser.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "`q` / `qb` set the main input (Unix seconds, milliseconds, or ISO-8601)."
      }
    },
    {
      "id": "uuid",
      "path": "/tools/uuid",
      "title": "UUID / GUID generator",
      "description": "Random UUID v4 values—batch generate, copy, uppercase GUID style, local only.",
      "prefill": {
        "kind": "none",
        "notes": "Generate-only output—no primary paste field; link without query for agents."
      }
    },
    {
      "id": "jwt-decode",
      "path": "/tools/jwt-decode",
      "title": "JWT decode",
      "description": "Inspect JWT header and payload as JSON in browser; signature not verified.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "JWT string (header.payload.signature); decoded in the browser only."
      }
    },
    {
      "id": "html-entities",
      "path": "/tools/html-entities",
      "title": "HTML entity encode / decode",
      "description": "Escape or decode HTML entities—ampersands, tags, quotes—client-side.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "Primary text to encode or decode in the HTML entities workspace."
      }
    },
    {
      "id": "text-diff",
      "path": "/tools/text-diff",
      "title": "Plain text diff",
      "description": "Compare two text drafts side by side—unified view, sample pre-filled, client-side.",
      "prefill": {
        "kind": "dual-json",
        "keys": [
          "left",
          "leftqb",
          "right",
          "rightqb"
        ],
        "notes": "Plain text on both sides (not JSON-specific)."
      }
    },
    {
      "id": "hex-encode",
      "path": "/tools/hex",
      "title": "Hex encode & decode",
      "description": "UTF-8 text to hex and hex to text—strip spaces, local only.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ]
      }
    },
    {
      "id": "password-gen",
      "path": "/tools/password",
      "title": "Password generator",
      "description": "Random passwords with length and character sets—generated in your browser.",
      "prefill": {
        "kind": "none",
        "notes": "Random output only—no URL prefill; link without query."
      }
    },
    {
      "id": "random-string",
      "path": "/tools/random-string",
      "title": "Random string generator",
      "description": "Random alphanumeric, hex, Base64 URL-safe, or custom tokens—entropy hint, local only.",
      "prefill": {
        "kind": "none",
        "notes": "Random output only (presets and length in the UI)—no URL prefill; link without query."
      }
    },
    {
      "id": "data-units",
      "path": "/tools/data-units",
      "title": "Data size units",
      "description": "Convert bytes, KB, MB, GB, TB (binary)—paste an amount, see all units.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "Primary paste field for an amount with unit (e.g. `1 MB`, `4096 B`)."
      }
    },
    {
      "id": "calc-sales-tax",
      "path": "/tools/calculators/sales-tax",
      "title": "Sales tax calculator",
      "description": "Enter price and a combined sales tax rate—see tax owed and total, client-side (US-style).",
      "prefill": {
        "kind": "none",
        "notes": "Multi-field sales tax form (price and rate)—link without query; agents open the page."
      }
    },
    {
      "id": "calc-percentage",
      "path": "/tools/calculators/percentage",
      "title": "Percentage calculator",
      "description": "Percent of a value, ratio to percent, and percent change—no server round-trip.",
      "prefill": {
        "kind": "none",
        "notes": "Multi-mode percentage workspace—link without query."
      }
    },
    {
      "id": "calc-age",
      "path": "/tools/calculators/age",
      "title": "Age calculator",
      "description": "Birth date to age in years, months, and days—as of today or a date you pick.",
      "prefill": {
        "kind": "none",
        "notes": "Birth date and optional as-of date—link without query."
      }
    },
    {
      "id": "calc-discount",
      "path": "/tools/calculators/discount",
      "title": "Discount calculator",
      "description": "Original price and discount percent—savings and final price in your browser.",
      "prefill": {
        "kind": "none",
        "notes": "Original price and discount percent—link without query."
      }
    },
    {
      "id": "calc-tip",
      "path": "/tools/calculators/tip",
      "title": "Tip calculator",
      "description": "Check subtotal, tip percent, optional sales tax on food, and split—common U.S. restaurant math.",
      "prefill": {
        "kind": "none",
        "notes": "Subtotal, tip %, optional tax %, party size—link without query."
      }
    },
    {
      "id": "calc-loan",
      "path": "/tools/calculators/loan",
      "title": "Loan payment calculator",
      "description": "Principal, APR, and term in months—estimated monthly payment and total interest.",
      "prefill": {
        "kind": "none",
        "notes": "Principal, APR, and term (loan payment)—link without query."
      }
    },
    {
      "id": "calc-compound-interest",
      "path": "/tools/calculators/compound-interest",
      "title": "Compound interest calculator",
      "description": "Principal, APR, and compounding—future value, interest earned, and APY for savings-style growth.",
      "prefill": {
        "kind": "none",
        "notes": "Principal, APR, years, and compounding frequency—link without query."
      }
    },
    {
      "id": "calc-profit-margin",
      "path": "/tools/calculators/profit-margin",
      "title": "Profit margin calculator",
      "description": "Revenue and cost—gross profit, margin %, and markup %, calculated locally.",
      "prefill": {
        "kind": "none",
        "notes": "Revenue and cost fields—link without query."
      }
    },
    {
      "id": "calc-date-diff",
      "path": "/tools/calculators/date-difference",
      "title": "Date difference",
      "description": "Calendar days between two dates—pair with the timestamp or unit tools as needed.",
      "prefill": {
        "kind": "none",
        "notes": "Two date pickers—link without query."
      }
    },
    {
      "id": "unit-converter",
      "path": "/tools/unit-converter",
      "title": "Unit converter (length, temperature, weight)",
      "description": "Length (metric & US customary), temperature (°C, °F, K), and weight (mg to lb)—paste one value, see every column.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "Primary field: amount with unit (e.g. `5 ft`, `100 cm`, `32 °F`, `1 lb`). Optional `cat` = `length` | `temp` | `weight` to select the tab (default length)."
      }
    },
    {
      "id": "lorem",
      "path": "/tools/lorem",
      "title": "Lorem ipsum generator",
      "description": "Placeholder paragraphs for mockups—copy in one click, client-side.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "Optional `q` / `qb` as paragraph count (digits only)."
      }
    },
    {
      "id": "cron",
      "path": "/tools/cron",
      "title": "Cron expression helper",
      "description": "Human-readable schedule, next run times—standard 5-field cron in your browser.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "Cron expression (5 fields) to parse and list next runs."
      }
    },
    {
      "id": "timezone-converter",
      "path": "/tools/timezone",
      "title": "World clock & time zones",
      "description": "Compare IANA time zones side by side with the same instant—no server round-trip.",
      "prefill": {
        "kind": "none",
        "notes": "Time zone pickers and comparison—link without query; agents open the page."
      }
    },
    {
      "id": "cidr-calculator",
      "path": "/tools/cidr",
      "title": "CIDR calculator (IPv4 & IPv6)",
      "description": "IPv4 or IPv6 CIDR: network, range, mask or prefix size—computed locally in your browser.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "IPv4 CIDR (e.g. 192.168.1.0/24) or IPv6 CIDR (e.g. 2001:db8::/32); colon in q selects IPv6 tab."
      }
    },
    {
      "id": "sql-format",
      "path": "/tools/sql-format",
      "title": "SQL formatter",
      "description": "Pretty-print SQL with dialect presets—pair with SQL minify on the compress page.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "SQL text to format with optional dialect in the UI."
      }
    },
    {
      "id": "string-case",
      "path": "/tools/string-case",
      "title": "String case converter",
      "description": "camelCase, snake_case, kebab-case, PascalCase, CONST_CASE from one paste—client-side.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "Source string to convert between naming cases."
      }
    },
    {
      "id": "markdown-preview",
      "path": "/tools/markdown-preview",
      "title": "Markdown preview",
      "description": "Render Markdown to sanitized HTML in your browser—paste notes or README drafts.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "Markdown source to render."
      }
    },
    {
      "id": "user-agent-parser",
      "path": "/tools/user-agent",
      "title": "User-Agent parser",
      "description": "Browser, OS, and device from a UA string—useful for logs and debugging.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "User-Agent string from a browser or log line."
      }
    },
    {
      "id": "http-status-codes",
      "path": "/tools/http-status",
      "title": "HTTP status codes",
      "description": "HTTP response status reference: search 1xx–5xx, short meanings, copy status lines—client-side.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "Filter text: numeric code (e.g. 404) or keyword (e.g. rate, redirect, gateway)."
      }
    },
    {
      "id": "ulid",
      "path": "/tools/ulid",
      "title": "ULID generator",
      "description": "Sortable identifiers with millisecond timestamp—batch generate and copy locally.",
      "prefill": {
        "kind": "none",
        "notes": "Generate-only ULIDs—no primary paste field; link without query."
      }
    },
    {
      "id": "pem-cert",
      "path": "/tools/pem-cert",
      "title": "PEM / X.509 viewer",
      "description": "Decode PEM certificates in the browser—subject, issuer, validity; paste only what you trust.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "PEM certificate block (-----BEGIN CERTIFICATE-----)."
      }
    },
    {
      "id": "word-count",
      "path": "/tools/word-count",
      "title": "Word & character count",
      "description": "Words, characters, lines, and reading time—paste any text, all client-side.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "Plain text for word and character statistics."
      }
    },
    {
      "id": "og-preview",
      "path": "/tools/og-preview",
      "title": "Open Graph preview",
      "description": "Paste HTML head or og: meta lines—see title, description, and image URL fields.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "HTML fragment or pasted og:/twitter: meta lines."
      }
    },
    {
      "id": "robots-sitemap",
      "path": "/tools/robots-sitemap",
      "title": "Robots.txt & sitemap preview",
      "description": "Paste robots.txt or sitemap XML—see User-agent groups, rules, and URL list in your browser.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "Primary paste: robots.txt (`q` / `qb`); opens the robots panel. Sitemap XML is edited in the UI."
      }
    },
    {
      "id": "mime-types",
      "path": "/tools/mime-types",
      "title": "MIME types & file extensions",
      "description": "Look up common MIME types from extensions (and vice versa)—filterable table, copy Content-Type—client-side.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "Filter: extension (e.g. webp, pdf) or MIME substring (e.g. application/json, image/)."
      }
    },
    {
      "id": "semver",
      "path": "/tools/semver",
      "title": "SemVer compare & sort",
      "description": "Compare two versions or sort a list—Semantic Versioning 2.0.0, prerelease order—client-side.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "Two lines: version A then B (compare). Three or more non-empty lines: sort. One line: fills version A only."
      }
    },
    {
      "id": "http-methods",
      "path": "/tools/http-methods",
      "title": "HTTP methods",
      "description": "GET, POST, PUT, PATCH, DELETE—safe, idempotent, body usage—quick reference for APIs, client-side.",
      "prefill": {
        "kind": "single",
        "keys": [
          "q",
          "qb"
        ],
        "notes": "Filter: method name (GET, POST) or keyword (safe, idempotent, body, tunnel)."
      }
    },
    {
      "id": "pseudo-cli",
      "path": "/tools/cli",
      "title": "Pseudo-CLI",
      "description": "Terminal-style commands in the browser—open catalog tools with optional -q prefill; same pages as the GUI.",
      "prefill": {
        "kind": "none",
        "notes": "In-page shell navigates to other tools; no external URL prefill for the CLI itself—link without query."
      }
    },
    {
      "id": "tarot",
      "path": "/tools/fun/tarot",
      "title": "Tarot spread",
      "description": "Three-card Major Arcana draw with an interactive 3D scene—for entertainment only.",
      "prefill": {
        "kind": "none",
        "notes": "Interactive entertainment draw—no URL prefill; link to the page without query."
      }
    },
    {
      "id": "zodiac",
      "path": "/tools/fun/zodiac",
      "title": "Zodiac snapshot",
      "description": "Sun sign from your date plus a playful daily line—purely for fun.",
      "prefill": {
        "kind": "none",
        "notes": "Birthday picker and playful copy—no URL prefill; link without query."
      }
    },
    {
      "id": "mbti",
      "path": "/tools/fun/mbti",
      "title": "MBTI-style quiz",
      "description": "Short personality-style quiz with a four-letter result—entertainment only, not a professional assessment.",
      "prefill": {
        "kind": "none",
        "notes": "Interactive MBTI-style quiz—no URL prefill; link without query."
      }
    }
  ]
}
