{"openapi":"3.1.0","info":{"title":"BEAD API","version":"1.0.0","description":"Programmatic access to BEAD's deterministic utility tools. Every tool listed here is the same code that powers https://b-e-a-d.com — no hosted compute beyond what's strictly needed for the call.","contact":{"url":"https://b-e-a-d.com"},"license":{"name":"MIT"}},"servers":[{"url":"https://api.b-e-a-d.com","description":"Production"},{"url":"https://b-e-a-d.com/api/v1","description":"Same-origin path under the main site"}],"paths":{"/api/v1/tools":{"get":{"summary":"List every registered tool","tags":["meta"],"responses":{"200":{"description":"Array of tool metadata.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/tools/{slug}":{"get":{"summary":"Get a single tool's metadata, including input/output JSON Schemas","tags":["meta"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Tool metadata."},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/openapi.json":{"get":{"summary":"Self-describing OpenAPI 3.1 document","tags":["meta"],"responses":{"200":{"description":"This document."}}}},"/api/v1/health":{"get":{"summary":"Liveness probe","tags":["meta"],"responses":{"200":{"description":"OK."}}}},"/api/v1/tools/address-formatter/run":{"post":{"summary":"Address Formatter","description":"Format a postal address according to local conventions for 27+ countries (US/CA/UK/EU/JP/CN/KR/BR/etc.). Returns lines, the full mailing label, and a single-line form for CSVs/forms. Unknown country codes fall back to a generic format.","tags":["text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressFormatterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/AddressFormatterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Address Formatter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["text"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/AddressFormatterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/aes-encrypt-decrypt/run":{"post":{"summary":"AES-GCM Encrypt / Decrypt","description":"Symmetric AES-256-GCM encrypt/decrypt with a passphrase. Key derived via PBKDF2-SHA-256 (600k iterations) from a per-message random 16-byte salt; 12-byte IV per message. Encrypt is non-deterministic (random salt+IV); the same plaintext yields a different ciphertext each call.","tags":["crypto"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AesEncryptDecryptInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/AesEncryptDecryptOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"AES-GCM Encrypt / Decrypt (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["crypto"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/AesEncryptDecryptOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/age-calculator/run":{"post":{"summary":"Age Calculator","description":"Compute an exact age in years/months/days between a birthdate and a reference date, plus totals (days, weeks, hours, minutes), day-of-the-week born, and next birthday. All dates interpreted as local-midnight; the year/month/day diff handles short months correctly.","tags":["datetime"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgeCalculatorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/AgeCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Age Calculator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["datetime"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/AgeCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/ansi-stripper/run":{"post":{"summary":"ANSI Stripper","description":"Strip ANSI color/style escape sequences from text (CSI, OSC, single-char ESC). Optionally also strips literal text-encoded escapes like `\\e[31m` that show up in log files. Removes stray C0 control characters while preserving tab/LF/CR.","tags":["text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnsiStripperInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/AnsiStripperOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"ANSI Stripper (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["text"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/AnsiStripperOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/area-code-lookup/run":{"post":{"summary":"NANP Area Code Lookup","description":"North American Numbering Plan area-code reference (US, Canada, Caribbean). `lookup` by 3-digit code, `search` by substring across code/region/notes, or `list` everything. Static snapshot of NANPA assignments — overlay relationships may not be fully reflected.","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AreaCodeLookupInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/AreaCodeLookupOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"NANP Area Code Lookup (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/AreaCodeLookupOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/aspect-ratio-calculator/run":{"post":{"summary":"Aspect Ratio Calculator","description":"Given a ratio (e.g. 16:9) and either a width or height, compute the other dimension. Returns the dimensions, the original ratio string, and a GCD-simplified form.","tags":["design"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AspectRatioCalculatorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/AspectRatioCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Aspect Ratio Calculator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["design"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/AspectRatioCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/base64/run":{"post":{"summary":"Base64 Encoder / Decoder","description":"Encode UTF-8 text to Base64 or decode Base64 back to text. URL-safe mode replaces + and / with - and _ and strips padding (used in JWTs and URL fragments).","tags":["encoding"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Base64Input"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/Base64Output"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Base64 Encoder / Decoder (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["encoding"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/Base64Output"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/base-converter/run":{"post":{"summary":"Base Converter","description":"Convert an integer between numeric bases (2-36) using arbitrary-precision arithmetic (no 64-bit overflow). If `toBase` is omitted, returns binary/octal/decimal/hex at once.","tags":["encoding"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseConverterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/BaseConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Base Converter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["encoding"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/BaseConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/bitwise-calculator/run":{"post":{"summary":"Bitwise Calculator","description":"Compute AND, OR, XOR, NOT, SHL, SHR on integers at 8/16/32/64-bit widths using BigInt (no JS 32-bit overflow). Result returned in decimal, hex, and padded binary.","tags":["encoding"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BitwiseCalculatorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/BitwiseCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Bitwise Calculator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["encoding"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/BitwiseCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/bom-tool/run":{"post":{"summary":"BOM Tool","description":"Detect, add, or strip a UTF-8 Byte Order Mark (U+FEFF, `EF BB BF`). Excel still requires a BOM at the top of UTF-8 CSV files to recognise non-ASCII characters; most other tooling does not want one.","tags":["encoding"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BomToolInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/BomToolOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"BOM Tool (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["encoding"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/BomToolOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/border-radius-generator/run":{"post":{"summary":"Border Radius Generator","description":"Build a CSS `border-radius` value from per-corner radii. Each corner may be a number (circular) or [horizontal, vertical] pair (elliptical). Returns both the raw value and a full declaration.","tags":["design"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BorderRadiusGeneratorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/BorderRadiusGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Border Radius Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["design"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/BorderRadiusGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/box-shadow-generator/run":{"post":{"summary":"Box Shadow Generator","description":"Build a CSS `box-shadow` value from one or more layers, each with x/y/blur/spread/color/alpha and an optional inset flag. Returns both the raw value and a full declaration.","tags":["design"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoxShadowGeneratorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/BoxShadowGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Box Shadow Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["design"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/BoxShadowGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/business-days-calculator/run":{"post":{"summary":"Business Days Calculator","description":"Count business days between two dates, or add/subtract a number of business days to a start date. Optional US Federal or UK Bank Holiday calendars. Both modes treat weekends + matched holidays as non-business; range mode returns the holidays hit in-window.","tags":["datetime"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessDaysCalculatorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/BusinessDaysCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Business Days Calculator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["datetime"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/BusinessDaysCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/cache-control-builder/run":{"post":{"summary":"Cache-Control Builder","description":"Build an HTTP `Cache-Control` header value from structured options. Common combinations: static asset (`public, max-age=31536000, immutable`), HTML (`private, no-cache`), API SWR (`public, max-age=60, stale-while-revalidate=600`). `noStore` short-circuits to just `no-store`.","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CacheControlBuilderInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CacheControlBuilderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Cache-Control Builder (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CacheControlBuilderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/cargo-toml-parser/run":{"post":{"summary":"Cargo.toml Parser","description":"Parse a Rust `Cargo.toml` manifest and return structured package metadata, dependency lists (with versions, features, flags, source), workspace members, and features table. Lightweight TOML subset — handles inline tables, arrays, comments, and continuation lines but not all edge cases.","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CargoTomlParserInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CargoTomlParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Cargo.toml Parser (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CargoTomlParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/case-converter/run":{"post":{"summary":"Case Converter","description":"Convert a string between case styles: upper, lower, Title, Sentence, camelCase, PascalCase, snake_case, CONSTANT_CASE, kebab-case, dot.case, path/case. Pass a `case` to get a single value, omit it to get all variants.","tags":["text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseConverterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CaseConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Case Converter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["text"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CaseConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/certificate-decoder/run":{"post":{"summary":"Certificate Decoder","description":"Parse a PEM-encoded X.509 certificate (offline, no fetch) and return subject/issuer/validity/SANs/fingerprints/extensions. `daysRemaining` is negative for expired certs. Does NOT verify the chain or revocation.","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CertificateDecoderInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CertificateDecoderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Certificate Decoder (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CertificateDecoderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/chmod-calculator/run":{"post":{"summary":"chmod Calculator","description":"Convert Unix file-permission bits between octal (e.g. `755`), symbolic (`rwxr-xr-x`), and per-class booleans. Supports setuid/setgid/sticky bits. Use `from-octal` to parse a string or `from-perms` for fields.","tags":["system"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChmodCalculatorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/ChmodCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"chmod Calculator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["system"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/ChmodCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/cidr-calculator/run":{"post":{"summary":"CIDR Calculator","description":"Compute network details for an IPv4 CIDR block: network/broadcast/first-host/last-host, subnet mask, wildcard, next adjacent block, total and usable host counts, classfulness, and visibility (private/loopback/multicast/public).","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CidrCalculatorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CidrCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"CIDR Calculator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CidrCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/color-converter/run":{"post":{"summary":"Color Converter","description":"Convert a color between hex, RGB, HSL, HSV, and CMYK. Accepts any of those formats as input and returns all of them. Hex output is uppercase 6-digit.","tags":["design"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColorConverterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/ColorConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Color Converter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["design"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/ColorConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/comment-style-converter/run":{"post":{"summary":"Comment Style Converter","description":"Convert source-code comments between styles: `//`, `#`, `--`, `;`, `%`, `/* */`, `<!-- -->`, `{- -}`, `(* *)`. Non-comment lines are passed through unchanged. Set `stripOnly: true` to remove markers without rewrapping.","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentStyleConverterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CommentStyleConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Comment Style Converter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CommentStyleConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/composer-json-validator/run":{"post":{"summary":"composer.json Validator","description":"Validate a PHP `composer.json` against common constraints: vendor/package name pattern, version syntax, require/require-dev constraint shape, recognized type/stability/license. Issues are split into errors (spec violations) and warnings (style / unusual values).","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComposerJsonValidatorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/ComposerJsonValidatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"composer.json Validator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/ComposerJsonValidatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/compound-interest/run":{"post":{"summary":"Compound Interest Calculator","description":"Project the future value of a starting principal plus recurring contributions at a given annual rate, with configurable compounding (daily through annual) and contribution frequency (weekly/monthly/annual). Returns total FV, principal/contribution breakdown, interest earned, and per-year balance table.","tags":["finance"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompoundInterestInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CompoundInterestOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Compound Interest Calculator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["finance"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CompoundInterestOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/cookie-builder/run":{"post":{"summary":"Cookie Builder","description":"Build a `Set-Cookie` header value from structured attributes, or parse one into name/value/attrs. Build mode also returns sanity warnings (e.g. `SameSite=None requires Secure`, `__Host-` prefix rules).","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CookieBuilderInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CookieBuilderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Cookie Builder (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CookieBuilderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/coordinates-tool/run":{"post":{"summary":"Coordinates Tool","description":"Parse a lat/lon coordinate (decimal `37.7749, -122.4194` or DMS `37°46'30\"N, 122°25'10\"W`), normalise to both formats, and produce a Google Maps URL. Pass a second point `b` to also compute great-circle distance (km/mi/nmi) and initial bearing (degrees + compass).","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoordinatesToolInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CoordinatesToolOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Coordinates Tool (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CoordinatesToolOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/country-code-lookup/run":{"post":{"summary":"Country Code Lookup","description":"ISO 3166 country reference: name, alpha-2, alpha-3, E.164 phone code, ISO 4217 currency, ccTLD. `lookup` by `a2`/`a3`/`name`, `search` by substring across every field, or `list` everything.","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountryCodeLookupInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CountryCodeLookupOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Country Code Lookup (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CountryCodeLookupOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/cron-explainer/run":{"post":{"summary":"Cron Explainer","description":"Translate a 5-field cron expression to plain English (via cronstrue) and compute the next N firing times. Handles `,` lists, `-` ranges, `/` steps, `*`/`?` wildcards, and 3-letter month/day names. Approximates POSIX DOM/DOW behaviour (requires both — common case is one is wildcard).","tags":["datetime"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CronExplainerInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CronExplainerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Cron Explainer (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["datetime"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CronExplainerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/csp-builder/run":{"post":{"summary":"Content Security Policy Builder","description":"Build a `Content-Security-Policy` header value from per-directive source lists. Returns the raw value, the full HTTP header, and an equivalent <meta> tag. Use to lock down which origins your site can load scripts/styles/images from.","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CspBuilderInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CspBuilderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Content Security Policy Builder (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CspBuilderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/css-specificity/run":{"post":{"summary":"CSS Specificity","description":"Compute CSS-selector specificity as (a, b, c). Handles `:is()` / `:not()` / `:has()` / `:matches()` (max of arguments), `:where()` (always 0), pseudo-elements (single- or double-colon), attribute selectors, namespaces. Comma-separated selectors on one line score independently.","tags":["design"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CssSpecificityInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CssSpecificityOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"CSS Specificity (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["design"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CssSpecificityOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/css-unit-converter/run":{"post":{"summary":"CSS Unit Converter","description":"Convert a value between px, rem, em, pt, and percent. Provide `base` (root font size) for rem, `parent` (parent font size) for em, and `container` (container size) for percent. Defaults are 16/16/1280.","tags":["design"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CssUnitConverterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CssUnitConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"CSS Unit Converter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["design"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CssUnitConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/csv-json/run":{"post":{"summary":"CSV ↔ JSON Converter","description":"Convert CSV with a header row into a JSON array of objects, or flatten a JSON array of objects back into CSV. Quoted fields and embedded delimiters are handled.","tags":["csv"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CsvJsonInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CsvJsonOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"CSV ↔ JSON Converter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["csv"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CsvJsonOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/curl-builder/run":{"post":{"summary":"cURL Builder","description":"Build a properly quoted `curl` command from structured fields (method, URL, headers, body, auth, flags). Use to script API calls reproducibly. Body modes: `raw`, `json` (adds Content-Type), `form` (URL-encodes per line). Does not execute the command.","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CurlBuilderInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CurlBuilderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"cURL Builder (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CurlBuilderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/curl-converter/run":{"post":{"summary":"cURL Converter","description":"Parse a `curl` command and emit equivalent code in another language: JavaScript fetch, Node https, Python requests, Ruby Net::HTTP, Go net/http, PowerShell, HTTPie, or wget. Pass `lang` for a single output; omit it for every language.","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CurlConverterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CurlConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"cURL Converter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CurlConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/csv-cleaner/run":{"post":{"summary":"CSV Cleaner","description":"Tidy a CSV: auto-detect delimiter (`,`, `;`, tab, `|`), trim/collapse whitespace, drop empty rows, deduplicate body rows, optionally lowercase the header. Re-emits as RFC 4180-style quoted CSV in the resolved delimiter.","tags":["data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CsvCleanerInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CsvCleanerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"CSV Cleaner (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["data"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/CsvCleanerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/data-size-converter/run":{"post":{"summary":"Data Size Converter","description":"Convert a data size between bits, bytes, SI units (KB/MB/GB/TB/PB, 1000-based), and binary units (KiB/MiB/GiB/TiB/PiB, 1024-based). Pass `to` for a single conversion or omit it to get every unit at once.","tags":["encoding"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataSizeConverterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/DataSizeConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Data Size Converter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["encoding"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/DataSizeConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/diff-checker/run":{"post":{"summary":"Text Diff","description":"Line-level diff between two text blobs using the LCS algorithm. Returns hunks (with line numbers), totals, and a unified-diff string. Optional case- and whitespace-insensitive comparison. Inputs capped at 5000 lines per side.","tags":["text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiffCheckerInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/DiffCheckerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Text Diff (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["text"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/DiffCheckerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/discount-calculator/run":{"post":{"summary":"Discount Calculator","description":"Compute the final price after one or more stacked percentage discounts, plus optional sales tax. Discounts are applied in order (so `[20, 10]` is 20% off, then another 10% off the result — not 30% total). Tax is calculated on the post-discount price by default.","tags":["finance"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscountCalculatorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/DiscountCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Discount Calculator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["finance"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/DiscountCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/dns-record-types/run":{"post":{"summary":"DNS Record Types","description":"Static reference for the DNS record types you actually meet in the wild: A/AAAA, CNAME/ALIAS, MX, TXT, NS/SOA, PTR, SRV, CAA, DNSSEC (DS/DNSKEY/RRSIG/NSEC), DANE TLSA, SSHFP, SVCB/HTTPS, NAPTR, plus TXT-carried SPF/DKIM/DMARC/BIMI. `lookup` by type, `search` by substring, or `list` everything.","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsRecordTypesInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/DnsRecordTypesOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"DNS Record Types (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/DnsRecordTypesOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/docker-compose-validator/run":{"post":{"summary":"docker-compose Validator","description":"Validate a `docker-compose.yml` against common-sense rules: known top-level keys, every service has `image` or `build`, recognized restart policies, depends_on points at real services, no host-port conflicts. Errors block; warnings nudge.","tags":["devops"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockerComposeValidatorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/DockerComposeValidatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"docker-compose Validator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["devops"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/DockerComposeValidatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/dockerfile-starter/run":{"post":{"summary":"Dockerfile Starter","description":"Generate a multi-stage Dockerfile and matching .dockerignore for a chosen ecosystem (node-alpine, python-slim, go-distroless, etc.). Starters only — review before shipping.","tags":["devops"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockerfileStarterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/DockerfileStarterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Dockerfile Starter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["devops"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/DockerfileStarterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/email-auth-parser/run":{"post":{"summary":"Email Auth Parser","description":"Parse and explain SPF / DKIM / DMARC TXT records. SPF mechanisms get qualifier translations and a DNS-lookup count check (RFC 7208 limit of 10). DMARC/DKIM tags get per-tag explanations.","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailAuthParserInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/EmailAuthParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Email Auth Parser (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/EmailAuthParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/email-list-parser/run":{"post":{"summary":"Email List Parser","description":"Parse a messy list of email addresses into structured records. Splits on `,`/`;`/newline (quote- and angle-bracket aware), strips `(comments)`, extracts display names from `Name <addr>` form, classifies each as valid/invalid, optionally deduplicates, and bins by domain.","tags":["text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailListParserInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/EmailListParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Email List Parser (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["text"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/EmailListParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/env-parser/run":{"post":{"summary":".env Parser","description":"Parse a `.env` file into structured entries. Honours `export `, double-quoted values with `\\n`/`\\t`/`\\\"` escapes, single-quoted values with `''` literal quotes, multi-line quoted values, and trailing comments. Returns entries with line numbers, warnings for malformed entries, and a `{ key: value }` map for direct use.","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvParserInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/EnvParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":".env Parser (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/EnvParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/escape-unescape/run":{"post":{"summary":"Escape / Unescape","description":"Escape or unescape text for JSON strings, JavaScript string literals, HTML, XML, or SQL string literals. JSON unescape uses JSON.parse semantics; HTML unescape covers the standard short entity list (no full HTML5 table).","tags":["text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EscapeUnescapeInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/EscapeUnescapeOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Escape / Unescape (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["text"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/EscapeUnescapeOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/exif-viewer/run":{"post":{"summary":"EXIF Viewer","description":"Read EXIF / IPTC / XMP metadata from an image (JPEG/PNG/WebP/HEIC/TIFF). Accepts base64-encoded bytes. Flags privacy-sensitive tags (GPS coords, timestamps, serial numbers, camera model). Does NOT strip metadata — use an image re-encode for that.","tags":["image"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExifViewerInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/ExifViewerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"EXIF Viewer (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["image"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/ExifViewerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/find-replace/run":{"post":{"summary":"Find & Replace","description":"Find and replace text with optional regex, case-insensitivity, whole-word matching, and multi-line mode. Returns the modified text and the replacement count. Always replaces all matches.","tags":["text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindReplaceInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/FindReplaceOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Find & Replace (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["text"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/FindReplaceOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/gemfile-parser/run":{"post":{"summary":"Gemfile Parser","description":"Parse a Ruby `Gemfile` into structured form: sources, Ruby version, gem list with version requirement, the group it belongs to (default if outside a `group … do`), and any options (`require: false`, `git: …`, etc.). Lightweight — doesn't execute Ruby code.","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GemfileParserInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/GemfileParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Gemfile Parser (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/GemfileParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/gh-actions-starter/run":{"post":{"summary":"GitHub Actions Starter","description":"Generate a GitHub Actions workflow YAML for common pipelines (node-ci, python-ci, etc.). Customizable branch and matrix. Starters only — review before merging.","tags":["devops"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GhActionsStarterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/GhActionsStarterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"GitHub Actions Starter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["devops"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/GhActionsStarterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/gitignore-builder/run":{"post":{"summary":".gitignore Builder","description":"Merge one or more language/framework/editor templates into a single .gitignore. Deduplicates lines across templates while preserving section headers. Templates list available via `available` in the response.","tags":["devops"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitignoreBuilderInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/GitignoreBuilderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":".gitignore Builder (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["devops"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/GitignoreBuilderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/go-mod-parser/run":{"post":{"summary":"go.mod Parser","description":"Parse a Go `go.mod` file and return module path, Go version, toolchain, require list (with indirect flag), replace/exclude/retract directives. Handles both block (`require ( … )`) and single-line forms.","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoModParserInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/GoModParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"go.mod Parser (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/GoModParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/gradient-generator/run":{"post":{"summary":"CSS Gradient Generator","description":"Build a CSS gradient function (linear, radial, or conic) from a list of color stops. Returns both the raw gradient value and a complete `background:` declaration.","tags":["design"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GradientGeneratorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/GradientGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"CSS Gradient Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["design"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/GradientGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/hash-generator/run":{"post":{"summary":"Hash Generator","description":"Compute SHA-1, SHA-256, SHA-384, and SHA-512 hex digests of a UTF-8 string (or base64-decoded bytes). Useful for checksums and content fingerprints. Do NOT use SHA-1 for security; prefer SHA-256+ for trust decisions.","tags":["crypto"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HashGeneratorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HashGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Hash Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["crypto"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HashGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/hash-snippet-generator/run":{"post":{"summary":"Hash Snippet Generator","description":"Emit ready-to-paste hash code in Node, browser Web Crypto, Python, PHP, Ruby, Go, Rust, or shell. Supports MD5, SHA-1, SHA-256, SHA-512, and HMAC-SHA-256. Pass `lang` for a single snippet, omit for all.","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HashSnippetGeneratorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HashSnippetGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Hash Snippet Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HashSnippetGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/headline-analyzer/run":{"post":{"summary":"Headline Analyzer","description":"Score a headline on length, word count, number presence, power words, emotional words, headline type (how-to / list / question / statement), and capitalisation. Heuristic — useful for blog / marketing copy A/B comparison. Output is opinionated, not authoritative.","tags":["content"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeadlineAnalyzerInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HeadlineAnalyzerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Headline Analyzer (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["content"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HeadlineAnalyzerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/hmac-calculator/run":{"post":{"summary":"HMAC Calculator","description":"Compute an HMAC signature over a message using a shared secret. Returns both hex and base64 forms. Use to verify webhook signatures, sign API requests, or generate one-time tokens. SHA-256 by default.","tags":["crypto"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HmacCalculatorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HmacCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"HMAC Calculator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["crypto"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HmacCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/hreflang-generator/run":{"post":{"summary":"Hreflang Generator","description":"Emit `<link rel=\"alternate\" hreflang>` tags for an SEO multi-region/multi-language site. Pass a list of `{ lang, url }` pairs; remember to include an `x-default` entry. Attribute values are HTML-escaped.","tags":["marketing"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HreflangGeneratorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HreflangGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Hreflang Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["marketing"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HreflangGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/html-css-formatter/run":{"post":{"summary":"HTML / CSS Formatter & Minifier","description":"Pretty-print or minify HTML and CSS. Formatting uses js-beautify; minification strips comments (preserves IE conditional comments) and collapses whitespace.","tags":["web"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HtmlCssFormatterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HtmlCssFormatterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"HTML / CSS Formatter & Minifier (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["web"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HtmlCssFormatterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/html-entities/run":{"post":{"summary":"HTML Entities Encode / Decode","description":"Encode & < > \" ' as HTML entities for safe embedding, or decode entities back to characters. Decoding supports the common ~30 named entities plus all numeric and hex character references.","tags":["encoding"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HtmlEntitiesInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HtmlEntitiesOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"HTML Entities Encode / Decode (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["encoding"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HtmlEntitiesOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/html-table-generator/run":{"post":{"summary":"HTML Table Generator","description":"Convert CSV (or TSV / SSV) to a plain `<table>`, a Tailwind-styled `<table>`, or a Markdown pipe table. Quote-aware CSV parsing, HTML-escapes cell contents, optional header row.","tags":["web"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HtmlTableGeneratorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HtmlTableGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"HTML Table Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["web"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HtmlTableGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/http-message-parser/run":{"post":{"summary":"HTTP Message Parser","description":"Parse a raw HTTP request, raw HTTP response, or bare header block into a structured object. Handles header line folding (continuation lines), distinguishes start lines from headers, and separates the body at the first blank line.","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpMessageParserInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HttpMessageParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"HTTP Message Parser (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HttpMessageParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/http-status-codes/run":{"post":{"summary":"HTTP Status Codes","description":"Look up an HTTP status code by number, search across name/description, or list all codes in a class (1xx/2xx/3xx/4xx/5xx). Static reference — covers RFC-defined codes plus the common WebDAV/IANA additions.","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpStatusCodesInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HttpStatusCodesOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"HTTP Status Codes (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/HttpStatusCodesOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/ip-classifier/run":{"post":{"summary":"IP Classifier","description":"Classify an IPv4 or IPv6 address into a category (public, private, loopback, link-local, multicast, documentation, CGNAT, ULA, etc.) with the RFC reference. Auto-detects family.","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IpClassifierInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/IpClassifierOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"IP Classifier (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/IpClassifierOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/ip-converter/run":{"post":{"summary":"IP Converter","description":"Convert an IP address between notations. IPv4: dotted-quad ↔ integer ↔ hex ↔ binary. IPv6: any notation → expanded, compressed (RFC 5952), 128-bit hex, plus the embedded IPv4 if any. Auto-detects family from the input.","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IpConverterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/IpConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"IP Converter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/IpConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/js-ast-viewer/run":{"post":{"summary":"JavaScript AST Viewer","description":"Parse JavaScript / TypeScript-flavoured source code to an ESTree AST via Acorn. Optional `jsx: true` strips JSX expressions to `null` placeholders so the surrounding JS parses (acorn doesn't ship with full JSX). ESLint and prettier and many codemods walk this same tree.","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsAstViewerInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsAstViewerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"JavaScript AST Viewer (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsAstViewerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/js-minifier/run":{"post":{"summary":"JavaScript Minifier","description":"Minify JavaScript via Terser. Supports compress, mangle, keep-classnames, and ECMA target (2017/2020/2022). Returns the minified code with byte counts and percent saved.","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsMinifierInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsMinifierOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"JavaScript Minifier (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsMinifierOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/js-stack-parser/run":{"post":{"summary":"JS Stack Trace Parser","description":"Parse a JavaScript stack trace into a structured frame list. Supports V8 (`at Foo (file:line:col)`, including `async`/`new` and `eval at`) and Firefox (`Foo@file:line:col`) formats. Flags third-party frames (node_modules, node:, webpack vendor) so you can filter them.","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsStackParserInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsStackParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"JS Stack Trace Parser (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsStackParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/json-diff/run":{"post":{"summary":"JSON Diff","description":"Structural diff of two JSON values. Walks objects and arrays recursively, returning added/removed/changed ops with JSONPath-style paths. Optionally treats arrays as unordered sets for diffing tag-like lists.","tags":["json"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonDiffInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsonDiffOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"JSON Diff (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["json"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsonDiffOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/keyword-density/run":{"post":{"summary":"Keyword Density","description":"Compute keyword density for a block of text. Returns total/unique word counts plus top-N 1/2/3-grams. With `ignoreStopwords: true` (default), drops common English filler words.","tags":["marketing"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeywordDensityInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/KeywordDensityOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Keyword Density (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["marketing"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/KeywordDensityOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/json-formatter/run":{"post":{"summary":"JSON Formatter","description":"Pretty-print JSON with a configurable indent, or minify it to a single line. Throws on invalid JSON with the parser's error position.","tags":["json"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonFormatterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsonFormatterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"JSON Formatter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["json"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsonFormatterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/json-to-code/run":{"post":{"summary":"JSON → Code Literal","description":"Render a JSON value as a code literal in JavaScript/TypeScript, Python, PHP, Ruby, Go (map[string]any), Rust (serde-style), or Java (Map.of / Map.ofEntries). Pass `lang` for a single output, omit for all.","tags":["json"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonToCodeInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsonToCodeOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"JSON → Code Literal (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["json"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsonToCodeOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/json-to-schema/run":{"post":{"summary":"JSON → JSON Schema","description":"Infer a JSON Schema (Draft 2020-12) from sample data. Handles a single value, a single object, or an array of objects (merged into a shared schema). Detects common string formats (date, date-time, email, uri, uuid). Returns additionalProperties: false on objects.","tags":["json"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonToSchemaInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsonToSchemaOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"JSON → JSON Schema (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["json"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsonToSchemaOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/json-to-struct/run":{"post":{"summary":"JSON → Struct / Class","description":"Generate typed structs/classes from sample JSON in TypeScript, Python (@dataclass), PHP, Ruby (Struct), Go (json tags), Rust (serde), or Java (Jackson). Merges sibling object shapes across array elements. Pass `lang` for a single output, omit for all.","tags":["json"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonToStructInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsonToStructOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"JSON → Struct / Class (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["json"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsonToStructOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/json-to-ts/run":{"post":{"summary":"JSON → TypeScript","description":"Generate TypeScript interfaces (or `type` aliases) from sample JSON. Merges sibling object shapes, marks keys missing in some samples as `?`, names nested types by their key. Optional `readonly` modifier on all fields.","tags":["json"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonToTsInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsonToTsOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"JSON → TypeScript (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["json"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsonToTsOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/json-to-zod/run":{"post":{"summary":"JSON → Zod","description":"Generate a Zod schema (`z.object({…})`) and inferred TypeScript type from sample JSON. Sniffs string formats (uuid, email, url, datetime, date) and emits `.optional()` for keys not present in every sampled object.","tags":["json"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonToZodInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsonToZodOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"JSON → Zod (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["json"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsonToZodOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/jsonpath-tester/run":{"post":{"summary":"JSONPath Tester","description":"Query JSON data with a JSONPath expression. Supports `$`, `.name`/`['name']`, recursive `..`, wildcards `[*]`, indices `[i]`, slices `[a:b:s]`, and filter expressions `[?(@.prop > 5)]`. Filter expressions are evaluated with `@` as the current item using a sandboxed Function.","tags":["json"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonpathTesterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsonpathTesterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"JSONPath Tester (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["json"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JsonpathTesterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/jwt-builder/run":{"post":{"summary":"JWT Builder","description":"Build a JWT from a payload object. Supports HS256/HS384/HS512 (HMAC) signing and `none` for testing. Pass `iat`/`exp`/`nbf` claims yourself — the tool does not invent them. Header `alg` is always set from the chosen algorithm.","tags":["security"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JwtBuilderInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JwtBuilderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"JWT Builder (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["security"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JwtBuilderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/jwt-decoder/run":{"post":{"summary":"JWT Decoder","description":"Decode a JSON Web Token into its header, payload, and signature. Reports whether the exp claim is in the past. Does NOT verify the signature — never trust decoded claims for authorization without verifying.","tags":["auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JwtDecoderInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JwtDecoderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"JWT Decoder (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["auth"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JwtDecoderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/jwt-secret-strength/run":{"post":{"summary":"JWT Secret Strength","description":"Audit an HMAC JWT signing secret. Returns byte length, estimated bits of entropy, whether the secret appears in well-known-defaults lists, and a per-algorithm pass/fail against RFC 7518 minimum key sizes (HS256: 32B, HS384: 48B, HS512: 64B).","tags":["security"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JwtSecretStrengthInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JwtSecretStrengthOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"JWT Secret Strength (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["security"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/JwtSecretStrengthOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/license-picker/run":{"post":{"summary":"License Picker","description":"Generate a filled-in LICENSE file for common open-source licenses (MIT, Apache-2.0, GPL-3.0, BSD-2-Clause, BSD-3-Clause, ISC, MPL-2.0, Unlicense, etc.). Substitutes `{year}` and `{author}` placeholders. Returns the SPDX id, full body, and a summary of permissions/conditions.","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicensePickerInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/LicensePickerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"License Picker (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/LicensePickerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/line-endings/run":{"post":{"summary":"Line Endings","description":"Detect and convert line endings (LF / CRLF / CR). Returns counts of each style plus the dominant variant. Pass `target` to convert; omit to detect only.","tags":["text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LineEndingsInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/LineEndingsOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Line Endings (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["text"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/LineEndingsOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/line-sorter/run":{"post":{"summary":"Line Sorter","description":"Sort, deduplicate, and clean a list of lines. Orders: alphabetical, natural (1, 2, 10), length, reverse, shuffle. Options: case-insensitive compare, trim whitespace, drop blank lines, dedupe. Returns counts of input/output/duplicates removed.","tags":["text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LineSorterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/LineSorterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Line Sorter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["text"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/LineSorterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/list-cleaner/run":{"post":{"summary":"List Cleaner","description":"Parse a sloppy list (newlines / commas / semicolons / tabs, quoted or not), normalise case, optionally deduplicate and sort, then re-emit in newline / comma / semicolon / space / JSON / quoted-CSV form.","tags":["text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListCleanerInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/ListCleanerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"List Cleaner (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["text"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/ListCleanerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/loan-calculator/run":{"post":{"summary":"Loan Calculator","description":"Compute the monthly payment, total paid, and total interest for a fixed-rate amortising loan. Optionally returns the full month-by-month amortization schedule. Uses the standard PMT formula; final month sweeps up any rounding remainder.","tags":["finance"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoanCalculatorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/LoanCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Loan Calculator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["finance"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/LoanCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/log-parser/run":{"post":{"summary":"Access Log Parser","description":"Parse Apache/nginx Combined Log Format into structured rows (IP, timestamp, method/path/protocol, status, bytes, referer, UA) plus aggregates: total bytes, status-code distribution, top 5 requested paths.","tags":["devops"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogParserInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/LogParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Access Log Parser (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["devops"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/LogParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/lorem-ipsum/run":{"post":{"summary":"Lorem Ipsum Generator","description":"Generate placeholder text in paragraphs, sentences, or words. Optional `seed` makes the output deterministic (mulberry32 PRNG); without a seed, output is random. `startWithLorem` controls whether the first unit gets the canonical opener.","tags":["text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoremIpsumInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/LoremIpsumOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Lorem Ipsum Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["text"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/LoremIpsumOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/luhn-validator/run":{"post":{"summary":"Luhn / Card Validator","description":"Run the Luhn (mod-10) checksum on a digit sequence and identify the card brand by IIN (Visa, Mastercard, Amex, Discover, Diners Club, JCB, UnionPay, Maestro). Returns checksum validity, brand, and whether the digit count matches the brand's expected lengths.","tags":["security"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LuhnValidatorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/LuhnValidatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Luhn / Card Validator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["security"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/LuhnValidatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/mac-formatter/run":{"post":{"summary":"MAC Formatter","description":"Normalise a MAC address (any input form) to colon, hyphen, Cisco dot-quad, and bare formats. Reports the OUI (first 24 bits) and decodes the I/G (unicast/multicast) and U/L (universal/local) bits from the first byte.","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MacFormatterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/MacFormatterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"MAC Formatter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/MacFormatterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/markdown-html-converter/run":{"post":{"summary":"Markdown ↔ HTML Converter","description":"Convert Markdown to HTML (via marked, GFM enabled by default) or HTML to Markdown (via turndown). Note: the output of md2html is RAW HTML — sanitize before rendering in a browser context.","tags":["web"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownHtmlConverterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/MarkdownHtmlConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Markdown ↔ HTML Converter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["web"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/MarkdownHtmlConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/meta-length-checker/run":{"post":{"summary":"Meta Length Checker","description":"Check SEO title and meta-description against Google's character and pixel budgets (≈600px / 60 chars for title; ≈920px / 160 chars for description). Pixel widths are heuristic (canvas-free server-side approximation).","tags":["marketing"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaLengthCheckerInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/MetaLengthCheckerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Meta Length Checker (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["marketing"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/MetaLengthCheckerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/mime-types/run":{"post":{"summary":"MIME Types","description":"MIME type reference (text/application/image/audio/video/font/multipart). `byMime` returns the canonical entry; `byExtension` finds the first MIME for a file extension; `search` does substring matching across MIME/extension/description; `list` returns everything.","tags":["encoding"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MimeTypesInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/MimeTypesOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"MIME Types (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["encoding"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/MimeTypesOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/mortgage-calculator/run":{"post":{"summary":"Mortgage Calculator","description":"Compute the full monthly mortgage payment (PITI) — principal + interest from the loan, monthly property tax, monthly insurance, and PMI when LTV > 80%. Returns LTV, the breakdown, and total interest / total paid over the term.","tags":["finance"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MortgageCalculatorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/MortgageCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Mortgage Calculator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["finance"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/MortgageCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/nanoid-generator/run":{"post":{"summary":"NanoID Generator","description":"Generate NanoID-style random identifiers using a chosen alphabet. Presets: default (URL-safe 64), alphanumeric, lower/upper alphanumeric, digits, hex, no-lookalikes. Returns the bits of entropy per ID alongside the values.","tags":["id"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NanoidGeneratorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/NanoidGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"NanoID Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["id"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/NanoidGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/og-tag-generator/run":{"post":{"summary":"Open Graph Tag Generator","description":"Build a complete set of Open Graph + Twitter Card `<meta>` tags for social-media previews. Attribute values are HTML-escaped. Includes `og:title/description/type/url/image/site_name/locale` plus matching `twitter:card/title/description/image/site`.","tags":["marketing"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OgTagGeneratorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/OgTagGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Open Graph Tag Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["marketing"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/OgTagGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/package-json-validator/run":{"post":{"summary":"package.json Validator","description":"Validate an npm `package.json` against the spec: required `name` and `version`, SemVer format, allowed name characters, scripts shape, dependency ranges, SPDX license, engines ranges. Errors are spec violations; warnings flag non-standard but functional values.","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackageJsonValidatorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/PackageJsonValidatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"package.json Validator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/PackageJsonValidatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/password-generator/run":{"post":{"summary":"Password Generator","description":"Generate cryptographically random passwords using Web Crypto. Configurable length (4-256) and character classes (lowercase, uppercase, digits, symbols). Output always includes at least one of each enabled class. Returns each password with its estimated entropy.","tags":["security"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordGeneratorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/PasswordGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Password Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["security"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/PasswordGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/password-strength/run":{"post":{"summary":"Password Strength Checker","description":"Estimate password entropy and offline crack time. Detects common passwords, keyboard sequences, repeated runs, and `<word><number>` patterns. Returns bits of entropy, a verbal band (Very weak → Excellent), the estimated crack time at the assumed guesses/sec, and prescriptive suggestions.","tags":["security"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordStrengthInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/PasswordStrengthOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Password Strength Checker (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["security"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/PasswordStrengthOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/pem-formatter/run":{"post":{"summary":"PEM Formatter","description":"Parse one or more PEM blocks (CERTIFICATE, PUBLIC KEY, etc.), verify the base64 body decodes, and re-emit with canonical 64-column line wrapping. A raw base64 blob with no headers is reported back in `loose`.","tags":["security"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PemFormatterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/PemFormatterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"PEM Formatter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["security"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/PemFormatterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/percentage-tool/run":{"post":{"summary":"Percentage Toolkit","description":"Six percentage calculations in one tool: `pctOf` (X% of Y), `whatPct` (X is what % of Y), `pctChange` (X → Y % change), `markup` (cost → selling price), `margin` (cost + sell → margin), `ratio` (simplify A:B with GCD).","tags":["finance"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PercentageToolInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/PercentageToolOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Percentage Toolkit (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["finance"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/PercentageToolOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/php-serialize/run":{"post":{"summary":"PHP serialize() ↔ JSON","description":"Decode PHP's `serialize()` format to a JSON value, or encode a JSON value back. Handles N/b/i/d/s/a types; rejects O (objects) and r/R (references). PHP arrays with sequential integer keys decode as JS arrays; otherwise as objects.","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhpSerializeInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/PhpSerializeOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"PHP serialize() ↔ JSON (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/PhpSerializeOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/pyproject-toml-parser/run":{"post":{"summary":"pyproject.toml Parser","description":"Parse a Python `pyproject.toml` into structured `[project]`, `[build-system]`, dependency lists, optional-dependency groups, and `[tool.X]` settings (e.g. tool.ruff, tool.mypy). Lightweight TOML subset — handles inline tables, arrays, comments, continuation lines.","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PyprojectTomlParserInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/PyprojectTomlParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"pyproject.toml Parser (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/PyprojectTomlParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/python-string-escape/run":{"post":{"summary":"Python String Escape","description":"Escape / unescape Python string literals. Supports `\\n`, `\\t`, `\\x`, `\\u`, `\\U`, `\\N{NAME}` (preserved), octal escapes; `r`/`u`/`b` string prefixes on unescape. ASCII-only mode in escape converts non-ASCII to `\\u`/`\\U` escapes.","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PythonStringEscapeInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/PythonStringEscapeOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Python String Escape (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/PythonStringEscapeOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/python-traceback-parser/run":{"post":{"summary":"Python Traceback Parser","description":"Parse a Python traceback (including chained exceptions with `During handling` / `direct cause`) into structured blocks of frames + exception. Each frame is flagged as third-party when the file path lives in `/pythonX.Y/` or `/site-packages/`. Option `hideStdlib` filters those out.","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PythonTracebackParserInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/PythonTracebackParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Python Traceback Parser (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/PythonTracebackParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/qr-code/run":{"post":{"summary":"QR Code Generator","description":"Generate a QR code as a data URL, SVG string, or base64-encoded PNG. Configurable size (64-2048px), error correction level (L/M/Q/H), and quiet-zone margin. Useful for embedding URLs, Wi-Fi credentials, vCards, payment links.","tags":["image"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QrCodeInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/QrCodeOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"QR Code Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["image"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/QrCodeOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/query-param-manager/run":{"post":{"summary":"Query Param Manager","description":"Inspect and edit a URL's query string. Returns the parsed params, base URL, and hash; pass `ops` to remove keys, set/overwrite values, append duplicates, or sort alphabetically. Useful for normalising tracking URLs.","tags":["web"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryParamManagerInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/QueryParamManagerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Query Param Manager (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["web"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/QueryParamManagerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/random-number-generator/run":{"post":{"summary":"Random Number Generator","description":"Generate cryptographically uniform random integers in `[min, max]` (inclusive). Optional `unique: true` draws without replacement (cap at the range size); `sorted: true` returns in ascending order. Uses `crypto.getRandomValues` with rejection sampling.","tags":["math"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RandomNumberGeneratorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/RandomNumberGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Random Number Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["math"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/RandomNumberGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/readability-checker/run":{"post":{"summary":"Readability Checker","description":"Compute readability metrics for prose: Flesch Reading Ease (with named band), Flesch-Kincaid Grade Level, Automated Readability Index, Coleman-Liau, Gunning Fog. Includes word/sentence/syllable counts and complex-word count. Syllable counting is heuristic.","tags":["content"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadabilityCheckerInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/ReadabilityCheckerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Readability Checker (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["content"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/ReadabilityCheckerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/readme-skeleton/run":{"post":{"summary":"README Skeleton","description":"Generate a starter README.md with sensible defaults: title, badges (CI / npm / coverage / license), description, table of contents, install command, language-specific usage block (Node/Python/Ruby/Rust/Go/generic), API / Configuration / Contributing / License sections.","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadmeSkeletonInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/ReadmeSkeletonOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"README Skeleton (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/ReadmeSkeletonOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/regex-cheatsheet/run":{"post":{"summary":"Regex Cheatsheet","description":"Reference for JavaScript-flavoured regex tokens: character classes, anchors, quantifiers, groups, escapes, flags. Also returns common pre-built patterns (email, URL, IPv4, US phone, hex color, date). Use `search` to find tokens or labels matching a substring.","tags":["text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegexCheatsheetInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/RegexCheatsheetOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Regex Cheatsheet (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["text"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/RegexCheatsheetOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/regex-safety/run":{"post":{"summary":"Regex Safety / ReDoS","description":"Audit a regex for ReDoS (catastrophic backtracking) risks. Looks for nested quantifiers, overlapping alternation under quantifiers, multiple greedy `.+`/`.*`, excessive lookarounds. Also runs synthetic worst-case probes (`a+!` of varying length) to detect exponential slowdowns empirically.","tags":["text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegexSafetyInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/RegexSafetyOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Regex Safety / ReDoS (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["text"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/RegexSafetyOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/regex-tester/run":{"post":{"summary":"Regex Tester","description":"Test a JavaScript-flavoured regex against text. Returns every match with start/end offsets, captured text, and group values (named groups labelled). The `g` flag is added automatically so all matches enumerate. Safety cap: at most 5000 matches.","tags":["text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegexTesterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/RegexTesterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Regex Tester (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["text"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/RegexTesterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/requirements-txt-parser/run":{"post":{"summary":"requirements.txt Parser","description":"Parse a Python `requirements.txt` into typed entries: pinned requirements (with extras + specifier + environment marker), direct-URL installs (`name @ url`), editable installs (`-e`), `-r`/`-c` include/constraint lines, options, comments, blanks, and invalid lines. Also returns a normalised package-name list.","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequirementsTxtParserInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/RequirementsTxtParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"requirements.txt Parser (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/RequirementsTxtParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/robots-txt-generator/run":{"post":{"summary":"robots.txt Generator","description":"Generate a `robots.txt` file from per-user-agent rule blocks. Each block has its own Allow/Disallow lists and optional Crawl-delay. An empty block emits `Disallow:` (allow everything for that agent). Optional `Sitemap:` URL appended at the end.","tags":["marketing"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RobotsTxtGeneratorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/RobotsTxtGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"robots.txt Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["marketing"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/RobotsTxtGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/savings-goal/run":{"post":{"summary":"Savings Goal Calculator","description":"Two modes: `requiredMonthly` — how much to save monthly to reach a target in N years; `timeToGoal` — how long a given monthly contribution will take. Both compound monthly at the supplied annual rate. Returns null months if the goal is unreachable (e.g. zero contribution, zero rate, starting < target).","tags":["finance"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavingsGoalInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SavingsGoalOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Savings Goal Calculator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["finance"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SavingsGoalOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/schema-markup-generator/run":{"post":{"summary":"Schema.org Markup Generator","description":"Build schema.org JSON-LD blocks for FAQ pages, LocalBusiness listings, Articles, or Products. Returns both the parsed object and a ready-to-drop `<script type=\"application/ld+json\">` tag. Useful for SEO rich-results eligibility.","tags":["marketing"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchemaMarkupGeneratorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SchemaMarkupGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Schema.org Markup Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["marketing"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SchemaMarkupGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/schema-to-ts/run":{"post":{"summary":"JSON Schema → TypeScript","description":"Convert a JSON Schema (Draft 2020-12) into TypeScript type aliases. Handles `$ref` (local `#/$defs/...` only), `oneOf`/`anyOf`/`allOf`, `enum`/`const`, nullable type unions, `additionalProperties`, and named definitions under `$defs` or `definitions`.","tags":["json"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchemaToTsInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SchemaToTsOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"JSON Schema → TypeScript (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["json"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SchemaToTsOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/schema-validator/run":{"post":{"summary":"JSON Schema Validator","description":"Validate data against a JSON Schema (draft 2020-12 by default) using Ajv with `addFormats` enabled. Returns `valid` plus a structured list of errors (path, keyword, message, params). Pass `schema` as either a JSON string or a parsed object.","tags":["json"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchemaValidatorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SchemaValidatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"JSON Schema Validator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["json"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SchemaValidatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/semver-compare/run":{"post":{"summary":"SemVer Compare","description":"Compare two semantic versions (with or without leading `v`, with prerelease and build metadata). Returns the parsed components and a verdict: which version is newer (`up`/`down`/`equal`) and what kind of change separates them (major/minor/patch/prerelease/build).","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SemverCompareInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SemverCompareOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"SemVer Compare (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SemverCompareOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/serp-preview/run":{"post":{"summary":"SERP Preview","description":"Preview how a page's title, URL breadcrumb, and meta description appear in Google search results — desktop and mobile, with realistic truncation. Width estimates are heuristic (server-safe, no canvas).","tags":["marketing"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SerpPreviewInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SerpPreviewOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"SERP Preview (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["marketing"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SerpPreviewOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/slug-generator/run":{"post":{"summary":"Slug Generator","description":"Turn text into a URL-safe slug. Decomposes accents (NFKD), transliterates ß/æ/œ/ø, replaces runs of non-alphanumerics with the chosen separator, optionally lowercases, optionally strips English stop-words, and truncates cleanly at separator boundaries. Multi-line input produces one slug per non-empty line.","tags":["text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlugGeneratorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SlugGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Slug Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["text"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SlugGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/source-map-decoder/run":{"post":{"summary":"Source Map Decoder","description":"Given a JavaScript source map and a list of bundled-output positions, return the original `source:line:column:name` for each. Useful for un-minifying stack traces. Accepts the source map as either a JSON string or an already-parsed object.","tags":["code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceMapDecoderInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SourceMapDecoderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Source Map Decoder (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["code"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SourceMapDecoderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/sql-create-table-generator/run":{"post":{"summary":"SQL CREATE TABLE Generator","description":"Infer column types from sample CSV/TSV/JSON data and emit a `CREATE TABLE` statement for PostgreSQL, MySQL, SQLite, or SQL Server. Detects int/bigint/decimal/boolean/date/timestamp/varchar/text. Optional auto-increment primary key. Columns with no empty values get `NOT NULL`.","tags":["sql"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SqlCreateTableGeneratorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SqlCreateTableGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"SQL CREATE TABLE Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["sql"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SqlCreateTableGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/sql-diff/run":{"post":{"summary":"SQL Diff","description":"Canonicalize two SQL snippets to a common formatting (via sql-formatter) and produce a line-level LCS diff. Returns `same`/`add`/`del` ops plus add/remove counts. Useful for comparing query revisions without false-positives from formatting noise.","tags":["sql"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SqlDiffInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SqlDiffOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"SQL Diff (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["sql"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SqlDiffOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/sql-escape/run":{"post":{"summary":"SQL Escape / Unescape","description":"Escape raw text for embedding in a SQL string literal, or unescape a SQL literal back to raw text. ANSI is the cross-dialect default; MySQL adds backslash escapes; Postgres uses E'…' form when special characters are present.","tags":["sql"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SqlEscapeInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SqlEscapeOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"SQL Escape / Unescape (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["sql"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SqlEscapeOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/sql-formatter/run":{"post":{"summary":"SQL Formatter","description":"Pretty-print SQL with indentation, keyword case normalization, and per-dialect keyword recognition. Backed by sql-formatter.","tags":["sql"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SqlFormatterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SqlFormatterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"SQL Formatter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["sql"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SqlFormatterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/sql-insert-generator/run":{"post":{"summary":"SQL INSERT Generator","description":"Generate `INSERT INTO …` SQL from CSV/TSV/JSON sample data. Auto-detects CSV delimiter, supports JSON array-of-objects. Modes: `multi` (one INSERT with multi-row VALUES) or `single` (one INSERT per row). Empty cells become `NULL` by default.","tags":["sql"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SqlInsertGeneratorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SqlInsertGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"SQL INSERT Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["sql"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SqlInsertGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/sql-minifier/run":{"post":{"summary":"SQL Minifier","description":"Strip SQL comments and collapse whitespace while preserving string literals, quoted identifiers, and dollar-quoted blocks. Output is a single line of valid SQL.","tags":["sql"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SqlMinifierInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SqlMinifierOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"SQL Minifier (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["sql"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SqlMinifierOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/sql-parameterizer/run":{"post":{"summary":"SQL Parameterizer","description":"Replace inline SQL string and numeric literals with placeholders (?, $1, :p1) and return the extracted bind values. Use to convert ad-hoc SQL into prepared-statement form for review or to prevent injection.","tags":["sql"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SqlParameterizerInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SqlParameterizerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"SQL Parameterizer (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["sql"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SqlParameterizerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/svg-optimizer/run":{"post":{"summary":"SVG Optimizer","description":"Optimise SVG markup via SVGO (browser build) with the default plugin set. Configurable multipass, floating-point precision (0-8), and optional removal of width/height attributes. `removeViewBox` is exposed but usually shouldn't be enabled — it breaks responsive scaling.","tags":["image"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SvgOptimizerInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SvgOptimizerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"SVG Optimizer (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["image"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/SvgOptimizerOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/tabs-spaces/run":{"post":{"summary":"Tabs ↔ Spaces","description":"Convert between tab and space indentation. Default scope is `leading` (only touches indentation at the start of each line) — use `all` to replace every occurrence. Reports detected tab/space line counts so you can spot mixed indentation.","tags":["text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TabsSpacesInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/TabsSpacesOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Tabs ↔ Spaces (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["text"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/TabsSpacesOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/tcp-port-reference/run":{"post":{"summary":"TCP/UDP Port Reference","description":"Common TCP/UDP port assignments. `lookup` finds every service registered on a port (including the IANA tier); `search` matches substring against port/service/description/protocol; `list` returns everything.","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TcpPortReferenceInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/TcpPortReferenceOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"TCP/UDP Port Reference (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/TcpPortReferenceOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/time-duration/run":{"post":{"summary":"Time Duration","description":"Two modes: `between` computes the duration between two timestamps (ms, human-readable, breakdown, totals); `add` returns the timestamp resulting from adding days/hours/minutes/seconds to a start time.","tags":["datetime"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeDurationInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/TimeDurationOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Time Duration (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["datetime"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/TimeDurationOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/timestamp-converter/run":{"post":{"summary":"Timestamp Converter","description":"Convert between Unix timestamps (auto-detects seconds vs milliseconds), ISO 8601, and human-readable strings. Output is always in UTC.","tags":["time"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimestampConverterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/TimestampConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Timestamp Converter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["time"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/TimestampConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/tip-calculator/run":{"post":{"summary":"Tip Calculator","description":"Compute tip, tax, and total for a restaurant bill, split per person. Tip is on the pre-tax bill by default (US convention); pass `tipOnPreTax: false` to tip on the post-tax total instead.","tags":["finance"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TipCalculatorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/TipCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Tip Calculator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["finance"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/TipCalculatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/totp-generator/run":{"post":{"summary":"TOTP Generator","description":"Compute the current TOTP (RFC 6238) code for a Base32 secret or a full `otpauth://totp/…` URI. Returns the code, seconds remaining until rotation, and the underlying parameters (algorithm, digits, period). Pass `timestamp` to compute for a specific moment.","tags":["security"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotpGeneratorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/TotpGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"TOTP Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["security"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/TotpGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/ulid-generator/run":{"post":{"summary":"ULID Generator","description":"Generate or decode ULIDs (Universally Unique Lexicographically Sortable Identifier). 26-char Crockford Base32: 10 chars of millisecond timestamp + 16 chars of randomness. Sortable by creation time, URL-safe, case-insensitive.","tags":["id"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UlidGeneratorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UlidGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"ULID Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["id"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UlidGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/unicode-codepoint/run":{"post":{"summary":"Unicode Codepoint Inspector","description":"Inspect Unicode characters: codepoint (U+XXXX), decimal, UTF-8 hex + URL-encoded form, UTF-16, JS/Python/Rust escapes, HTML entities (decimal/hex/named when known). Mode `chars` walks each character of the input; mode `codepoint` parses a codepoint expression.","tags":["encoding"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnicodeCodepointInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UnicodeCodepointOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Unicode Codepoint Inspector (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["encoding"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UnicodeCodepointOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/unit-converter/run":{"post":{"summary":"Unit Converter","description":"Convert between units in 9 categories: length, mass, volume (US + UK + metric), area, speed, pressure, energy, angle, and temperature (C/F/K, non-linear). Pass `to` for a single conversion or omit it to get every unit in the category.","tags":["encoding"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnitConverterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UnitConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Unit Converter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["encoding"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UnitConverterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/url-encoder/run":{"post":{"summary":"URL Encoder / Decoder","description":"Percent-encode or decode text for use in URLs. 'component' scope is the right pick 95% of the time (query values, path segments). 'uri' scope is for transforming a whole URL where the structural characters need to survive.","tags":["url"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UrlEncoderInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UrlEncoderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"URL Encoder / Decoder (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["url"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UrlEncoderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/url-parser/run":{"post":{"summary":"URL Parser","description":"Parse a URL into its components per the WHATWG URL standard: protocol, host, port, pathname, search, hash, plus a flattened params array. Use instead of regex-parsing URLs.","tags":["url"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UrlParserInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UrlParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"URL Parser (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["url"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UrlParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/user-agent-parser/run":{"post":{"summary":"User-Agent Parser","description":"Parse a User-Agent header into browser/engine/OS/device/CPU components via ua-parser-js. Useful for analytics normalization and feature gating. Note: modern User-Agent strings are increasingly reduced — prefer Client Hints (Sec-CH-UA-*) for accurate UA data from real browsers.","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAgentParserInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UserAgentParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"User-Agent Parser (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UserAgentParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/utm-builder/run":{"post":{"summary":"UTM Builder","description":"Append Google Analytics-compatible UTM parameters (utm_source, utm_medium, utm_campaign, optional utm_term and utm_content) to a destination URL. Strips any existing utm_* params before appending so you can re-tag confidently.","tags":["marketing"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UtmBuilderInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UtmBuilderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"UTM Builder (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["marketing"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UtmBuilderOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/utm-parser/run":{"post":{"summary":"UTM Parser","description":"Parse a URL into its base, hash, UTM params, recognised vendor click IDs (gclid, fbclid, msclkid, mc_cid, etc.) annotated with the vendor, and any remaining query params. Useful for normalising tracking-laden URLs before storing them.","tags":["marketing"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UtmParserInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UtmParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"UTM Parser (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["marketing"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UtmParserOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/uuid-v3-v5/run":{"post":{"summary":"Namespace UUID (v3 / v5)","description":"Generate deterministic UUIDs by hashing a name under a namespace. v5 (SHA-1) is the modern choice; v3 (MD5) is legacy. Namespace can be a preset (`dns`, `url`, `oid`, `x500`) or any UUID. Same name + namespace always yields the same UUID.","tags":["id"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UuidV3V5Input"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UuidV3V5Output"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Namespace UUID (v3 / v5) (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["id"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UuidV3V5Output"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/uuid-validator/run":{"post":{"summary":"UUID Validator","description":"Validate a UUID and report its version, variant (NCS-compatible / RFC 4122 / Microsoft / Reserved / Nil), and embedded timestamp if the version carries one (v1, v7). Returns valid:false for malformed input rather than throwing.","tags":["id"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UuidValidatorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UuidValidatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"UUID Validator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["id"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UuidValidatorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/uuid-generator/run":{"post":{"summary":"UUID Generator","description":"Generate UUIDs. v4 is random (best for unguessable IDs, auth tokens). v7 is time-ordered (best for database primary keys — sortable by creation time). Up to 1000 at a time.","tags":["encoding"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UuidGeneratorInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UuidGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"UUID Generator (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["encoding"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/UuidGeneratorOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/wake-on-lan/run":{"post":{"summary":"Wake-on-LAN Packet","description":"Build a 102-byte Wake-on-LAN magic packet for a target MAC address (6 bytes of `0xFF` + 16 repetitions of the MAC). Returns continuous hex, byte-grouped hex, and base64. Send via UDP to port 9 (discard) or port 7 (echo) on the broadcast address.","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WakeOnLanInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/WakeOnLanOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Wake-on-LAN Packet (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/WakeOnLanOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/word-counter/run":{"post":{"summary":"Word Counter","description":"Count characters (with and without whitespace), words, sentences, paragraphs, and lines for a string. Also returns an estimated reading time in minutes. Sentence count is a heuristic (counts runs ending in `.!?`).","tags":["text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WordCounterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/WordCounterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"Word Counter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["text"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/WordCounterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/xml-formatter/run":{"post":{"summary":"XML Formatter & Minifier","description":"Pretty-print or minify XML. Uses a stream tokenizer rather than a DOM round-trip, so comments, processing instructions, and CDATA blocks are preserved. Does not validate structure — pass invalid XML and you'll get best-effort output.","tags":["web"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/XmlFormatterInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/XmlFormatterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"XML Formatter & Minifier (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["web"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/XmlFormatterOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/yaml-json/run":{"post":{"summary":"YAML ↔ JSON Converter","description":"Convert YAML to JSON or JSON to YAML. Multi-document YAML (separated by ---) is preserved as a JSON array.","tags":["yaml"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YamlJsonInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/YamlJsonOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"YAML ↔ JSON Converter (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["yaml"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/YamlJsonOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}},"/api/v1/tools/zip-code-lookup/run":{"post":{"summary":"US ZIP Code Lookup","description":"US ZIP code reference: city, state, county, lat/lon. Starter dataset — not exhaustive. `lookup` by 5-digit ZIP returns the first hit (a ZIP may serve multiple cities), `search` finds substring matches, `list` returns the full dataset.","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZipCodeLookupInput"}}}},"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/ZipCodeLookupOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/ToolError"},"504":{"$ref":"#/components/responses/Timeout"}}},"get":{"summary":"US ZIP Code Lookup (GET shorthand)","description":"Same as POST but takes `?input=<JSON>` for small, cache-friendly invocations.","tags":["network"],"parameters":[{"name":"input","in":"query","required":false,"description":"URL-encoded JSON. Falls back to a flat query-string object if omitted.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool ran successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok","result","version"],"properties":{"ok":{"type":"boolean","enum":[true]},"result":{"$ref":"#/components/schemas/ZipCodeLookupOutput"},"version":{"type":"string","example":"1.0.0"}}}}}},"400":{"$ref":"#/components/responses/InvalidInput"},"500":{"$ref":"#/components/responses/ToolError"}}}}},"components":{"schemas":{"AddressFormatterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"recipient":{"type":"string"},"organization":{"default":"","type":"string"},"line1":{"type":"string"},"line2":{"default":"","type":"string"},"city":{"type":"string"},"region":{"default":"","description":"State / province / prefecture / county.","type":"string"},"postcode":{"type":"string"},"country":{"type":"string","description":"ISO 3166-1 alpha-2. Unknown codes fall back to the generic format."}},"required":["recipient","organization","line1","line2","city","region","postcode","country"],"additionalProperties":false},"AddressFormatterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"lines":{"type":"array","items":{"type":"string"},"description":"Per-line mailing label (postal convention for the country)."},"label":{"type":"string","description":"Lines joined with newlines."},"oneLine":{"type":"string","description":"Lines joined with `, ` — suitable for forms and CSV."}},"required":["lines","label","oneLine"],"additionalProperties":false},"AesEncryptDecryptInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"mode":{"type":"string","enum":["encrypt","decrypt"],"description":"Direction. `encrypt` returns a base64 payload; `decrypt` reverses it."},"passphrase":{"type":"string","minLength":1,"description":"The shared passphrase. Used to derive a 256-bit AES key via PBKDF2-SHA-256 (600,000 iterations)."},"input":{"type":"string","description":"In encrypt mode: the plaintext to protect. In decrypt mode: the base64 payload previously produced by encrypt."}},"required":["mode","passphrase","input"],"additionalProperties":false},"AesEncryptDecryptOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"result":{"type":"string","description":"In encrypt mode: base64-encoded `salt(16) || iv(12) || ciphertext+tag`. In decrypt mode: the recovered plaintext."}},"required":["result"],"additionalProperties":false},"AgeCalculatorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"birth":{"type":"string","description":"Birthdate as `YYYY-MM-DD` (local time)."},"asOf":{"description":"Reference date as `YYYY-MM-DD`. Defaults to today (UTC).","type":"string"}},"required":["birth"],"additionalProperties":false},"AgeCalculatorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"years":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"months":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"totalDays":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"totalWeeks":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"totalHours":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"totalMinutes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dayOfBirth":{"type":"string","description":"Day of the week (English)."},"nextBirthday":{"type":"string","description":"ISO date of the next birthday (relative to asOf)."},"daysToNext":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"nextAge":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Age the person will turn on the next birthday."}},"required":["years","months","days","totalDays","totalWeeks","totalHours","totalMinutes","dayOfBirth","nextBirthday","daysToNext","nextAge"],"additionalProperties":false},"AnsiStripperInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"Text containing ANSI escape sequences."},"stripLiteral":{"default":true,"description":"Also strip text-encoded escapes like `\\e[31m`, `\\x1b[…`, `\\033[…` that appear in serialized logs.","type":"boolean"}},"required":["input","stripLiteral"],"additionalProperties":false},"AnsiStripperOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"result":{"type":"string","description":"The input with ANSI color/style sequences and a few stray control characters removed."},"removed":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of characters removed (input length − output length)."}},"required":["result","removed"],"additionalProperties":false},"AreaCodeLookupInput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"action":{"type":"string","const":"lookup"},"code":{"type":"string","description":"3-digit NANP area code, e.g. `415`."}},"required":["action","code"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"search"},"query":{"type":"string","description":"Substring matched against code/region/notes (case-insensitive)."}},"required":["action","query"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"list"}},"required":["action"],"additionalProperties":false}]},"AreaCodeLookupOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"code":{"type":"string"},"region":{"type":"string"},"notes":{"type":"string"}},"required":["code","region","notes"],"additionalProperties":false},{"type":"object","properties":{"matches":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"region":{"type":"string"},"notes":{"type":"string"}},"required":["code","region","notes"],"additionalProperties":false}}},"required":["matches"],"additionalProperties":false}]},"AspectRatioCalculatorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"ratioW":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Ratio numerator (e.g. 16)."},"ratioH":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Ratio denominator (e.g. 9)."},"width":{"description":"Known width — height is computed.","type":"number","exclusiveMinimum":0},"height":{"description":"Known height — width is computed. Either `width` or `height` is required.","type":"number","exclusiveMinimum":0}},"required":["ratioW","ratioH"],"additionalProperties":false},"AspectRatioCalculatorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"width":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"height":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ratio":{"type":"string","description":"`W:H` as given."},"simplified":{"type":"string","description":"`W:H` reduced by GCD."},"decimal":{"type":"number","description":"ratioW / ratioH as a decimal."}},"required":["width","height","ratio","simplified","decimal"],"additionalProperties":false},"Base64Input":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"mode":{"type":"string","enum":["encode","decode"],"description":"Whether to encode plain text to Base64 or decode Base64 back to text."},"input":{"type":"string","description":"Plain UTF-8 text when encoding, Base64 string when decoding."},"urlSafe":{"default":false,"description":"Encode mode only: use URL-safe Base64 (replace + with -, / with _, strip padding).","type":"boolean"}},"required":["mode","input","urlSafe"],"additionalProperties":false},"Base64Output":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"result":{"type":"string","description":"Encoded or decoded result."}},"required":["result"],"additionalProperties":false},"BaseConverterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"The number to convert, expressed in `fromBase`. Optional `-` sign. No prefix needed; `0x`/`0b`/`0o` are stripped."},"fromBase":{"type":"integer","minimum":2,"maximum":36,"description":"Base of the input, 2-36."},"toBase":{"description":"Single base to convert to. If omitted, response includes binary/octal/decimal/hex.","type":"integer","minimum":2,"maximum":36}},"required":["input","fromBase"],"additionalProperties":false},"BaseConverterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"result":{"type":"string"}},"required":["result"],"additionalProperties":false},{"type":"object","properties":{"binary":{"type":"string"},"octal":{"type":"string"},"decimal":{"type":"string"},"hex":{"type":"string"}},"required":["binary","octal","decimal","hex"],"additionalProperties":false}]},"BitwiseCalculatorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"op":{"type":"string","enum":["AND","OR","XOR","NOT","SHL","SHR"],"description":"Bitwise operation. `NOT` ignores `b`."},"a":{"type":"string","description":"Operand A. Accepts `0x`/`0b`/`0o` prefixes, plain decimal, raw binary, or raw hex."},"b":{"description":"Operand B (shift amount for SHL/SHR). Required for all ops except NOT.","type":"string"},"width":{"default":32,"description":"Bit width. Result is masked to this width; shifts wrap modulo it.","anyOf":[{"type":"number","const":8},{"type":"number","const":16},{"type":"number","const":32},{"type":"number","const":64}]}},"required":["op","a","width"],"additionalProperties":false},"BitwiseCalculatorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"result":{"type":"string","description":"Result as a decimal string (BigInt — may exceed 53 bits for 64-bit width)."},"hex":{"type":"string","description":"0x-prefixed uppercase hex, padded to the chosen width."},"binary":{"type":"string","description":"Padded binary, no separator."},"binaryGrouped":{"type":"string","description":"Same binary with spaces every 4 bits."}},"required":["result","hex","binary","binaryGrouped"],"additionalProperties":false},"BomToolInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["detect","add","remove"],"description":"`detect` returns presence info only; `add` ensures a BOM prefix; `remove` strips one if present."},"input":{"type":"string"}},"required":["action","input"],"additionalProperties":false},"BomToolOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"present":{"type":"boolean","description":"Whether the input started with a UTF-8 BOM (U+FEFF, EF BB BF)."},"result":{"type":"string","description":"The transformed input. For `detect` this equals `input`."}},"required":["present","result"],"additionalProperties":false},"BorderRadiusGeneratorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"tl":{"anyOf":[{"type":"number","description":"Single radius in px (circular)."},{"type":"array","items":[{"type":"number"},{"type":"number"}],"description":"[horizontal, vertical] radii in px (elliptical)."}],"description":"Top-left corner."},"tr":{"anyOf":[{"type":"number","description":"Single radius in px (circular)."},{"type":"array","items":[{"type":"number"},{"type":"number"}],"description":"[horizontal, vertical] radii in px (elliptical)."}],"description":"Top-right corner."},"br":{"anyOf":[{"type":"number","description":"Single radius in px (circular)."},{"type":"array","items":[{"type":"number"},{"type":"number"}],"description":"[horizontal, vertical] radii in px (elliptical)."}],"description":"Bottom-right corner."},"bl":{"anyOf":[{"type":"number","description":"Single radius in px (circular)."},{"type":"array","items":[{"type":"number"},{"type":"number"}],"description":"[horizontal, vertical] radii in px (elliptical)."}],"description":"Bottom-left corner."},"unit":{"default":"px","description":"Unit suffix on every value.","type":"string","enum":["px","%","rem"]}},"required":["tl","tr","br","bl","unit"],"additionalProperties":false},"BorderRadiusGeneratorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"value":{"type":"string","description":"Just the border-radius value, e.g. `16px 16px 16px 16px`."},"css":{"type":"string","description":"Full declaration, e.g. `border-radius: 16px 16px 16px 16px;`."}},"required":["value","css"],"additionalProperties":false},"BoxShadowGeneratorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"layers":{"minItems":1,"type":"array","items":{"type":"object","properties":{"inset":{"default":false,"description":"If true, renders as an inset (inner) shadow.","type":"boolean"},"x":{"type":"number","description":"Horizontal offset in px."},"y":{"type":"number","description":"Vertical offset in px."},"blur":{"type":"number","minimum":0,"description":"Blur radius in px (>= 0)."},"spread":{"type":"number","description":"Spread radius in px (can be negative)."},"color":{"type":"string","description":"Hex color (#rrggbb). Combined with `alpha` to produce rgba()."},"alpha":{"default":1,"description":"Opacity 0-1.","type":"number","minimum":0,"maximum":1}},"required":["inset","x","y","blur","spread","color","alpha"],"additionalProperties":false},"description":"One or more shadow layers, rendered in order."}},"required":["layers"],"additionalProperties":false},"BoxShadowGeneratorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"value":{"type":"string","description":"Just the box-shadow value (comma-separated layers)."},"css":{"type":"string","description":"Full declaration, e.g. `box-shadow: 0px 4px 12px -2px rgba(0,0,0,0.15);`."}},"required":["value","css"],"additionalProperties":false},"BusinessDaysCalculatorInput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"between"},"start":{"type":"string","description":"Start date `YYYY-MM-DD`."},"end":{"type":"string","description":"End date `YYYY-MM-DD`. Inclusive."},"region":{"default":"none","type":"string","enum":["none","us","uk"]}},"required":["mode","start","end","region"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"add"},"start":{"type":"string","description":"Start date `YYYY-MM-DD`."},"n":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of business days to add (negative = subtract)."},"region":{"default":"none","type":"string","enum":["none","us","uk"]}},"required":["mode","start","n","region"],"additionalProperties":false}]},"BusinessDaysCalculatorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"between"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Business days in range (weekends and holidays excluded)."},"totalDays":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Total inclusive calendar days."},"holidaysHit":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"date":{"type":"string"}},"required":["name","date"],"additionalProperties":false}}},"required":["mode","days","totalDays","holidaysHit"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"add"},"target":{"type":"string","description":"Resulting date `YYYY-MM-DD`."},"dayOfWeek":{"type":"string"}},"required":["mode","target","dayOfWeek"],"additionalProperties":false}]},"CacheControlBuilderInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"visibility":{"description":"`public` or `private` directive. Omit for unspecified.","type":"string","enum":["public","private"]},"maxAge":{"default":0,"description":"Browser max-age in seconds.","type":"integer","minimum":0,"maximum":9007199254740991},"sMaxAge":{"default":0,"description":"Shared/CDN s-maxage in seconds.","type":"integer","minimum":0,"maximum":9007199254740991},"immutable":{"default":false,"type":"boolean"},"noStore":{"default":false,"description":"If true, emits only `no-store` (overrides everything).","type":"boolean"},"noCache":{"default":false,"type":"boolean"},"mustRevalidate":{"default":false,"type":"boolean"},"noTransform":{"default":false,"type":"boolean"},"proxyRevalidate":{"default":false,"type":"boolean"},"swr":{"default":0,"description":"stale-while-revalidate in seconds.","type":"integer","minimum":0,"maximum":9007199254740991},"sie":{"default":0,"description":"stale-if-error in seconds.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["maxAge","sMaxAge","immutable","noStore","noCache","mustRevalidate","noTransform","proxyRevalidate","swr","sie"],"additionalProperties":false},"CacheControlBuilderOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"value":{"type":"string","description":"Just the Cache-Control directive list."},"header":{"type":"string","description":"`Cache-Control: <value>` ready to drop into an HTTP response."}},"required":["value","header"],"additionalProperties":false},"CargoTomlParserInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"Raw Cargo.toml content."}},"required":["input"],"additionalProperties":false},"CargoTomlParserOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"packageName":{"type":"string"},"version":{"type":"string"},"edition":{"type":"string"},"license":{"type":"string"},"description":{"type":"string"},"dependencies":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"features":{"type":"array","items":{"type":"string"}},"optional":{"type":"boolean"},"defaultFeatures":{"type":"boolean"},"source":{"type":"string","description":"`git:`/`path:`/`workspace`/`registry:` or empty for crates.io."}},"required":["name","version","features","optional","defaultFeatures","source"],"additionalProperties":false}},"devDependencies":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"features":{"type":"array","items":{"type":"string"}},"optional":{"type":"boolean"},"defaultFeatures":{"type":"boolean"},"source":{"type":"string","description":"`git:`/`path:`/`workspace`/`registry:` or empty for crates.io."}},"required":["name","version","features","optional","defaultFeatures","source"],"additionalProperties":false}},"buildDependencies":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"features":{"type":"array","items":{"type":"string"}},"optional":{"type":"boolean"},"defaultFeatures":{"type":"boolean"},"source":{"type":"string","description":"`git:`/`path:`/`workspace`/`registry:` or empty for crates.io."}},"required":["name","version","features","optional","defaultFeatures","source"],"additionalProperties":false}},"features":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"},{"type":"boolean"}]}},"workspaceMembers":{"type":"array","items":{"type":"string"}}},"required":["dependencies","devDependencies","buildDependencies","features","workspaceMembers"],"additionalProperties":false},"CaseConverterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"The text to convert."},"case":{"description":"Which case to convert to. If omitted, the response includes ALL conversions.","type":"string","enum":["upper","lower","title","sentence","camel","pascal","snake","constant","kebab","dot","path"]}},"required":["input"],"additionalProperties":false},"CaseConverterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"result":{"type":"string","description":"The converted string when a single `case` was requested."}},"required":["result"],"additionalProperties":false},{"type":"object","properties":{"upper":{"type":"string"},"lower":{"type":"string"},"title":{"type":"string"},"sentence":{"type":"string"},"camel":{"type":"string"},"pascal":{"type":"string"},"snake":{"type":"string"},"constant":{"type":"string"},"kebab":{"type":"string"},"dot":{"type":"string"},"path":{"type":"string"}},"required":["upper","lower","title","sentence","camel","pascal","snake","constant","kebab","dot","path"],"additionalProperties":false,"description":"All case variants when `case` was omitted."}]},"CertificateDecoderInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"pem":{"type":"string","minLength":1,"description":"A single PEM-encoded X.509 certificate. The `-----BEGIN CERTIFICATE-----` / `-----END CERTIFICATE-----` lines are required."}},"required":["pem"],"additionalProperties":false},"CertificateDecoderOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"subject":{"type":"string"},"issuer":{"type":"string"},"serial":{"type":"string"},"validFrom":{"type":"string","description":"ISO 8601 timestamp."},"validTo":{"type":"string","description":"ISO 8601 timestamp."},"daysRemaining":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Days until expiry; negative if already expired."},"signatureAlg":{"type":"string"},"publicKeyAlg":{"type":"string"},"publicKeyBits":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sans":{"type":"array","items":{"type":"string"},"description":"Subject Alternative Names, e.g. `DNS: example.com`."},"sha1":{"type":"string","description":"Colon-separated uppercase hex."},"sha256":{"type":"string","description":"Colon-separated uppercase hex."},"selfSigned":{"type":"boolean"},"extensions":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"}},"required":["name","value"],"additionalProperties":false},"description":"Extension OIDs in cert order; `value` is `critical` or empty."}},"required":["subject","issuer","serial","validFrom","validTo","daysRemaining","signatureAlg","publicKeyAlg","sans","sha1","sha256","selfSigned","extensions"],"additionalProperties":false},"ChmodCalculatorInput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"from-perms"},"user":{"type":"object","properties":{"r":{"type":"boolean","description":"Read."},"w":{"type":"boolean","description":"Write."},"x":{"type":"boolean","description":"Execute (or traverse on a directory)."}},"required":["r","w","x"],"additionalProperties":false},"group":{"type":"object","properties":{"r":{"type":"boolean","description":"Read."},"w":{"type":"boolean","description":"Write."},"x":{"type":"boolean","description":"Execute (or traverse on a directory)."}},"required":["r","w","x"],"additionalProperties":false},"other":{"type":"object","properties":{"r":{"type":"boolean","description":"Read."},"w":{"type":"boolean","description":"Write."},"x":{"type":"boolean","description":"Execute (or traverse on a directory)."}},"required":["r","w","x"],"additionalProperties":false},"setuid":{"default":false,"type":"boolean"},"setgid":{"default":false,"type":"boolean"},"sticky":{"default":false,"type":"boolean"}},"required":["mode","user","group","other","setuid","setgid","sticky"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"from-octal"},"octal":{"type":"string","description":"Three or four octal digits (e.g. `755`, `4750`, `1777`)."}},"required":["mode","octal"],"additionalProperties":false}]},"ChmodCalculatorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"octal":{"type":"string","description":"3-digit (or 4-digit if any special bits set) octal mode."},"symbolic":{"type":"string","description":"9-char rwx string (e.g. `rwxr-xr-x`). `s`/`S`/`t`/`T` reflect special bits."},"command":{"type":"string","description":"`chmod <octal> file` ready to copy."},"user":{"type":"object","properties":{"r":{"type":"boolean","description":"Read."},"w":{"type":"boolean","description":"Write."},"x":{"type":"boolean","description":"Execute (or traverse on a directory)."}},"required":["r","w","x"],"additionalProperties":false},"group":{"type":"object","properties":{"r":{"type":"boolean","description":"Read."},"w":{"type":"boolean","description":"Write."},"x":{"type":"boolean","description":"Execute (or traverse on a directory)."}},"required":["r","w","x"],"additionalProperties":false},"other":{"type":"object","properties":{"r":{"type":"boolean","description":"Read."},"w":{"type":"boolean","description":"Write."},"x":{"type":"boolean","description":"Execute (or traverse on a directory)."}},"required":["r","w","x"],"additionalProperties":false},"setuid":{"type":"boolean"},"setgid":{"type":"boolean"},"sticky":{"type":"boolean"}},"required":["octal","symbolic","command","user","group","other","setuid","setgid","sticky"],"additionalProperties":false},"CidrCalculatorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"cidr":{"type":"string","description":"IPv4 CIDR notation like `192.168.1.0/24`. Bare addresses default to `/32`."}},"required":["cidr"],"additionalProperties":false},"CidrCalculatorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"prefix":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"hostBits":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"network":{"type":"string"},"broadcast":{"type":"string"},"firstHost":{"type":"string"},"lastHost":{"type":"string"},"mask":{"type":"string"},"wildcard":{"type":"string"},"nextNetwork":{"type":"string"},"total":{"type":"string","description":"Total addresses in the block (decimal string for big subnets)."},"usable":{"type":"string","description":"Usable host count; for /32 = 1, /31 = 2, otherwise total − 2."},"class":{"type":"string"},"isPrivate":{"type":"boolean"},"isLoopback":{"type":"boolean"},"isMulticast":{"type":"boolean"}},"required":["prefix","hostBits","network","broadcast","firstHost","lastHost","mask","wildcard","nextNetwork","total","usable","class","isPrivate","isLoopback","isMulticast"],"additionalProperties":false},"ColorConverterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","minLength":1,"description":"A color in any of: `#hex` (3 or 6 digits), `rgb(r,g,b)`, `hsl(h,s%,l%)`, `hsv(h,s%,v%)`, `cmyk(c%,m%,y%,k%)`. Whitespace tolerated."}},"required":["input"],"additionalProperties":false},"ColorConverterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"hex":{"type":"string","description":"Uppercase 6-digit hex with leading #."},"rgb":{"type":"object","properties":{"r":{"type":"number"},"g":{"type":"number"},"b":{"type":"number"}},"required":["r","g","b"],"additionalProperties":false,"description":"0-255 integer RGB."},"hsl":{"type":"object","properties":{"h":{"type":"number"},"s":{"type":"number"},"l":{"type":"number"}},"required":["h","s","l"],"additionalProperties":false,"description":"Hue 0-360, saturation/lightness 0-100."},"hsv":{"type":"object","properties":{"h":{"type":"number"},"s":{"type":"number"},"v":{"type":"number"}},"required":["h","s","v"],"additionalProperties":false,"description":"Hue 0-360, saturation/value 0-100."},"cmyk":{"type":"object","properties":{"c":{"type":"number"},"m":{"type":"number"},"y":{"type":"number"},"k":{"type":"number"}},"required":["c","m","y","k"],"additionalProperties":false,"description":"CMYK percentages 0-100."},"cssRgb":{"type":"string"},"cssHsl":{"type":"string"}},"required":["hex","rgb","hsl","hsv","cmyk","cssRgb","cssHsl"],"additionalProperties":false},"CommentStyleConverterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"source":{"type":"string","description":"Source code containing comments."},"from":{"type":"string","enum":["slash-slash","hash","dash-dash","semicolon","percent","slash-star","html","haskell-block","ml-block"],"description":"Current comment style of the source. Non-matching lines are left alone."},"to":{"description":"Target style. Required unless `stripOnly` is true.","type":"string","enum":["slash-slash","hash","dash-dash","semicolon","percent","slash-star","html","haskell-block","ml-block"]},"stripOnly":{"default":false,"description":"If true, strip the comment markers and emit just the text (no rewrap).","type":"boolean"}},"required":["source","from","stripOnly"],"additionalProperties":false},"CommentStyleConverterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"result":{"type":"string"}},"required":["result"],"additionalProperties":false},"ComposerJsonValidatorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}],"description":"composer.json as a string or parsed object."}},"required":["input"],"additionalProperties":false},"ComposerJsonValidatorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"valid":{"type":"boolean"},"issues":{"type":"array","items":{"type":"object","properties":{"level":{"type":"string","enum":["error","warning"]},"path":{"type":"string"},"message":{"type":"string"}},"required":["level","path","message"],"additionalProperties":false}},"errors":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"warnings":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["valid","issues","errors","warnings"],"additionalProperties":false},"CompoundInterestInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"principal":{"type":"number","minimum":0,"description":"Starting principal."},"annualRatePct":{"type":"number","description":"Annual interest rate as a percent (e.g. 7 for 7%)."},"years":{"type":"number","exclusiveMinimum":0,"description":"Investment horizon in years (fractional allowed)."},"compounding":{"default":"monthly","type":"string","enum":["daily","weekly","monthly","quarterly","semiannual","annual"]},"contribution":{"default":0,"description":"Recurring contribution per period.","type":"number","minimum":0},"contributionFrequency":{"default":"monthly","type":"string","enum":["monthly","weekly","annual"]}},"required":["principal","annualRatePct","years","compounding","contribution","contributionFrequency"],"additionalProperties":false},"CompoundInterestOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"futureValue":{"type":"number"},"totalContributed":{"type":"number"},"interestEarned":{"type":"number"},"fvPrincipal":{"type":"number","description":"Future value of the starting principal alone."},"fvContributions":{"type":"number","description":"Future value of the recurring contributions alone."},"yearly":{"type":"array","items":{"type":"object","properties":{"year":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"contributed":{"type":"number"},"interest":{"type":"number"},"balance":{"type":"number"}},"required":["year","contributed","interest","balance"],"additionalProperties":false},"description":"Per-year breakdown (years rounded down)."}},"required":["futureValue","totalContributed","interestEarned","fvPrincipal","fvContributions","yearly"],"additionalProperties":false},"CookieBuilderInput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"action":{"type":"string","const":"build"},"name":{"type":"string","minLength":1,"description":"Cookie name."},"value":{"type":"string","description":"Cookie value. Spaces/commas/semicolons should be percent-encoded by the caller; tool only warns."},"domain":{"description":"Domain attribute.","type":"string"},"path":{"default":"/","type":"string"},"maxAge":{"description":"Max-Age in seconds.","type":"integer","minimum":0,"maximum":9007199254740991},"expires":{"description":"ISO date string or anything `new Date()` accepts; emitted as RFC 7231 UTC.","type":"string"},"secure":{"default":false,"type":"boolean"},"httpOnly":{"default":false,"type":"boolean"},"sameSite":{"type":"string","enum":["Strict","Lax","None"]}},"required":["action","name","value","path","secure","httpOnly"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"parse"},"input":{"type":"string","description":"Set-Cookie header value (with or without the `Set-Cookie:` prefix)."}},"required":["action","input"],"additionalProperties":false}]},"CookieBuilderOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"header":{"type":"string","description":"The Set-Cookie value (without the `Set-Cookie:` prefix)."},"warnings":{"type":"array","items":{"type":"string"},"description":"Sanity warnings (e.g. SameSite=None requires Secure)."}},"required":["header","warnings"],"additionalProperties":false},{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"},"attrs":{"type":"array","items":{"type":"object","properties":{"k":{"type":"string"},"v":{"type":"string"}},"required":["k","v"],"additionalProperties":false},"description":"Attributes in source order. Flags (HttpOnly, Secure) have empty `v`."}},"required":["name","value","attrs"],"additionalProperties":false}]},"CoordinatesToolInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"a":{"anyOf":[{"type":"string","description":"Coordinate as text. Supports decimal (\"37.7749, -122.4194\"), DMS (\"37°46'30\\\"N, 122°25'10\\\"W\"), or single-axis values."},{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"],"additionalProperties":false}]},"b":{"description":"If provided, distance + bearing from a → b are included.","anyOf":[{"type":"string","description":"Coordinate as text. Supports decimal (\"37.7749, -122.4194\"), DMS (\"37°46'30\\\"N, 122°25'10\\\"W\"), or single-axis values."},{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"],"additionalProperties":false}]}},"required":["a"],"additionalProperties":false},"CoordinatesToolOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"a":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"decimal":{"type":"string"},"dms":{"type":"string"},"mapsUrl":{"type":"string"}},"required":["lat","lon","decimal","dms","mapsUrl"],"additionalProperties":false},"b":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"decimal":{"type":"string"},"dms":{"type":"string"},"mapsUrl":{"type":"string"}},"required":["lat","lon","decimal","dms","mapsUrl"],"additionalProperties":false},"distance":{"type":"object","properties":{"km":{"type":"number"},"miles":{"type":"number"},"nauticalMiles":{"type":"number"},"bearingDeg":{"type":"number"},"compass":{"type":"string"}},"required":["km","miles","nauticalMiles","bearingDeg","compass"],"additionalProperties":false}},"required":["a"],"additionalProperties":false},"CountryCodeLookupInput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"action":{"type":"string","const":"lookup"},"field":{"type":"string","enum":["a2","a3","name"],"description":"Which field to match exactly."},"value":{"type":"string","description":"Value to match (case-insensitive)."}},"required":["action","field","value"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"search"},"query":{"type":"string","description":"Substring matched across name/a2/a3/phone/currency/tld."}},"required":["action","query"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"list"}},"required":["action"],"additionalProperties":false}]},"CountryCodeLookupOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"name":{"type":"string"},"a2":{"type":"string","description":"ISO 3166-1 alpha-2."},"a3":{"type":"string","description":"ISO 3166-1 alpha-3."},"phone":{"type":"string","description":"E.164 calling code with leading +."},"currency":{"type":"string","description":"ISO 4217 currency code."},"tld":{"type":"string","description":"Country-code top-level domain (with leading dot), or empty if none."}},"required":["name","a2","a3","phone","currency","tld"],"additionalProperties":false},{"type":"object","properties":{"matches":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"a2":{"type":"string","description":"ISO 3166-1 alpha-2."},"a3":{"type":"string","description":"ISO 3166-1 alpha-3."},"phone":{"type":"string","description":"E.164 calling code with leading +."},"currency":{"type":"string","description":"ISO 4217 currency code."},"tld":{"type":"string","description":"Country-code top-level domain (with leading dot), or empty if none."}},"required":["name","a2","a3","phone","currency","tld"],"additionalProperties":false}}},"required":["matches"],"additionalProperties":false}]},"CronExplainerInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"expression":{"type":"string","description":"A 5-field cron expression (`min hour dom month dow`). Standard syntax with `,` lists, `-` ranges, `/` steps, and `*`/`?` wildcards. Three-letter month/day names accepted."},"use24Hour":{"default":false,"type":"boolean"},"next":{"default":7,"description":"Number of upcoming run timestamps to compute (max 50).","type":"integer","minimum":0,"maximum":50}},"required":["expression","use24Hour","next"],"additionalProperties":false},"CronExplainerOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"english":{"type":"string","description":"Plain-English explanation via cronstrue."},"next":{"type":"array","items":{"type":"string"},"description":"ISO 8601 timestamps of the next runs, in the server timezone."}},"required":["english","next"],"additionalProperties":false},"CspBuilderInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"directives":{"type":"object","propertyNames":{"type":"string","enum":["default-src","script-src","style-src","img-src","font-src","connect-src","media-src","object-src","frame-src","frame-ancestors","form-action","base-uri","worker-src","manifest-src"]},"additionalProperties":{"type":"object","properties":{"keywords":{"default":[],"description":"CSP source keywords like `'self'`, `'unsafe-inline'`, `data:`, `https:`.","type":"array","items":{"type":"string"}},"hosts":{"default":[],"description":"Extra host sources, e.g. `https://cdn.example.com`.","type":"array","items":{"type":"string"}}},"required":["keywords","hosts"],"additionalProperties":false},"required":["default-src","script-src","style-src","img-src","font-src","connect-src","media-src","object-src","frame-src","frame-ancestors","form-action","base-uri","worker-src","manifest-src"],"description":"Per-directive source lists. Directives not present here are omitted from the output."},"upgradeInsecureRequests":{"default":false,"type":"boolean"},"blockAllMixedContent":{"default":false,"description":"Deprecated in modern browsers but still understood by some.","type":"boolean"},"reportUri":{"description":"Where browsers POST violation reports.","type":"string"}},"required":["directives","upgradeInsecureRequests","blockAllMixedContent"],"additionalProperties":false},"CspBuilderOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"value":{"type":"string","description":"Just the CSP directive string (no `Content-Security-Policy:` prefix)."},"header":{"type":"string","description":"`Content-Security-Policy: <value>` ready for an HTTP response."},"meta":{"type":"string","description":"Equivalent `<meta http-equiv>` tag (no `frame-ancestors`/`sandbox`/`report-uri` support in meta)."}},"required":["value","header","meta"],"additionalProperties":false},"CssSpecificityInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"selectors":{"anyOf":[{"type":"string","description":"Multi-line string. Comma-separated selectors on a line score independently."},{"type":"array","items":{"type":"string"},"description":"Array of individual selectors."}]}},"required":["selectors"],"additionalProperties":false},"CssSpecificityOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"selector":{"type":"string"},"score":{"type":"array","items":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}],"description":"[a, b, c] where a=IDs, b=classes/attrs/pseudo-classes, c=types/pseudo-elements."},"formatted":{"type":"string","description":"\"a, b, c\" for display."},"isHighest":{"type":"boolean"}},"required":["selector","score","formatted","isHighest"],"additionalProperties":false}},"winner":{"description":"The highest score across all rows.","type":"array","items":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}]}},"required":["rows"],"additionalProperties":false},"CssUnitConverterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"value":{"type":"number","description":"The numeric value to convert."},"from":{"type":"string","enum":["px","rem","em","pt","percent"],"description":"Unit of `value`. `percent` is read as a percentage of `container`."},"to":{"description":"Single unit to convert to. If omitted, the response includes all five units.","type":"string","enum":["px","rem","em","pt","percent"]},"base":{"default":16,"description":"Root font size in px (used for rem). Default 16.","type":"number","exclusiveMinimum":0},"parent":{"default":16,"description":"Parent font size in px (used for em). Default 16.","type":"number","exclusiveMinimum":0},"container":{"default":1280,"description":"Container size in px (used for %). Default 1280.","type":"number","exclusiveMinimum":0}},"required":["value","from","base","parent","container"],"additionalProperties":false},"CssUnitConverterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"result":{"type":"number"}},"required":["result"],"additionalProperties":false},{"type":"object","properties":{"px":{"type":"number"},"rem":{"type":"number"},"em":{"type":"number"},"pt":{"type":"number"},"percent":{"type":"number"}},"required":["px","rem","em","pt","percent"],"additionalProperties":false}]},"CsvJsonInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"direction":{"type":"string","enum":["csvToJson","jsonToCsv"],"description":"csvToJson parses CSV with a header row into JSON. jsonToCsv flattens a JSON array of objects into CSV."},"input":{"type":"string","description":"CSV when direction=csvToJson; JSON array of objects when direction=jsonToCsv."},"delim":{"default":",","description":"Field delimiter — usually \",\" but can be \";\", \"\\t\", or \"|\".","type":"string","minLength":1,"maxLength":1}},"required":["direction","input","delim"],"additionalProperties":false},"CsvJsonOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"result":{"type":"string","description":"JSON array text or CSV text, depending on direction."},"rowCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of data rows in the result (excludes header row for CSV output)."}},"required":["result","rowCount"],"additionalProperties":false},"CurlBuilderInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"method":{"default":"GET","type":"string","enum":["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"]},"url":{"type":"string","minLength":1,"description":"Target URL."},"headers":{"default":[],"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"},"enabled":{"default":true,"type":"boolean"}},"required":["key","value","enabled"],"additionalProperties":false}},"bodyKind":{"default":"none","description":"`raw` and `json` send the body as-is; `form` URL-encodes each non-empty line as a `--data-urlencode` pair.","type":"string","enum":["none","raw","json","form"]},"body":{"default":"","type":"string"},"bearer":{"default":"","description":"Bearer token → adds `Authorization: Bearer …`.","type":"string"},"basicUser":{"default":"","description":"Basic auth user → `-u user:pass`.","type":"string"},"basicPass":{"default":"","type":"string"},"followRedirects":{"default":false,"type":"boolean"},"insecure":{"default":false,"type":"boolean"},"verbose":{"default":false,"type":"boolean"},"multiline":{"default":true,"description":"If true, emit one flag pair per line with `\\` continuation.","type":"boolean"}},"required":["method","url","headers","bodyKind","body","bearer","basicUser","basicPass","followRedirects","insecure","verbose","multiline"],"additionalProperties":false},"CurlBuilderOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"command":{"type":"string","description":"The fully-quoted curl command."}},"required":["command"],"additionalProperties":false},"CurlConverterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"curl":{"type":"string","minLength":1,"description":"A curl command, including line continuations."},"lang":{"description":"Target language. If omitted, the response includes every language.","type":"string","enum":["fetch","node","python","ruby","go","powershell","httpie","wget"]}},"required":["curl"],"additionalProperties":false},"CurlConverterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"parsed":{"type":"object","properties":{"url":{"type":"string"},"method":{"type":"string"},"headers":{"type":"array","items":{"type":"array","items":[{"type":"string"},{"type":"string"}]}},"body":{"anyOf":[{"type":"string"},{"type":"null"}]},"user":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Basic auth `user:pass`."},"cookie":{"anyOf":[{"type":"string"},{"type":"null"}]},"insecure":{"type":"boolean"},"follow":{"type":"boolean"}},"required":["url","method","headers","body","user","cookie","insecure","follow"],"additionalProperties":false},"code":{"type":"string"},"lang":{"type":"string","enum":["fetch","node","python","ruby","go","powershell","httpie","wget"]}},"required":["parsed","code","lang"],"additionalProperties":false},{"type":"object","properties":{"parsed":{"type":"object","properties":{"url":{"type":"string"},"method":{"type":"string"},"headers":{"type":"array","items":{"type":"array","items":[{"type":"string"},{"type":"string"}]}},"body":{"anyOf":[{"type":"string"},{"type":"null"}]},"user":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Basic auth `user:pass`."},"cookie":{"anyOf":[{"type":"string"},{"type":"null"}]},"insecure":{"type":"boolean"},"follow":{"type":"boolean"}},"required":["url","method","headers","body","user","cookie","insecure","follow"],"additionalProperties":false},"code":{"type":"object","propertyNames":{"type":"string","enum":["fetch","node","python","ruby","go","powershell","httpie","wget"]},"additionalProperties":{"type":"string"},"required":["fetch","node","python","ruby","go","powershell","httpie","wget"]}},"required":["parsed","code"],"additionalProperties":false}]},"CsvCleanerInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"Raw CSV (or DSV)."},"delimiter":{"default":"auto","description":"Delimiter, or `auto` to detect from the first lines.","type":"string","enum":[",",";","\t","|","auto"]},"trimCells":{"default":true,"description":"Strip leading/trailing whitespace from each cell.","type":"boolean"},"collapseWhitespace":{"default":false,"description":"Collapse runs of whitespace inside each cell to a single space.","type":"boolean"},"dropEmptyRows":{"default":true,"type":"boolean"},"dedupeRows":{"default":true,"description":"Drop duplicate rows after the header (compared by joined cell text).","type":"boolean"},"lowercaseHeaders":{"default":false,"type":"boolean"}},"required":["input","delimiter","trimCells","collapseWhitespace","dropEmptyRows","dedupeRows","lowercaseHeaders"],"additionalProperties":false},"CsvCleanerOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"output":{"type":"string"},"inputRows":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"outputRows":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"columns":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"delimiter":{"type":"string","description":"Delimiter actually used (resolved if `auto`)."}},"required":["output","inputRows","outputRows","columns","delimiter"],"additionalProperties":false},"DataSizeConverterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"value":{"type":"number","description":"Numeric value to convert."},"from":{"type":"string","enum":["b","B","KB","MB","GB","TB","PB","KiB","MiB","GiB","TiB","PiB"],"description":"Unit of `value`. SI units (KB, MB, …) are 1000-based; binary units (KiB, MiB, …) are 1024-based."},"to":{"description":"Single target unit. If omitted, the response includes every unit.","type":"string","enum":["b","B","KB","MB","GB","TB","PB","KiB","MiB","GiB","TiB","PiB"]}},"required":["value","from"],"additionalProperties":false},"DataSizeConverterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"result":{"type":"number"},"unit":{"type":"string","enum":["b","B","KB","MB","GB","TB","PB","KiB","MiB","GiB","TiB","PiB"]}},"required":["result","unit"],"additionalProperties":false},{"type":"object","properties":{"bytes":{"type":"number"},"values":{"type":"object","propertyNames":{"type":"string","enum":["b","B","KB","MB","GB","TB","PB","KiB","MiB","GiB","TiB","PiB"]},"additionalProperties":{"type":"number"},"required":["b","B","KB","MB","GB","TB","PB","KiB","MiB","GiB","TiB","PiB"]}},"required":["bytes","values"],"additionalProperties":false}]},"DiffCheckerInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"left":{"type":"string","description":"The 'before' text."},"right":{"type":"string","description":"The 'after' text."},"ignoreCase":{"default":false,"type":"boolean"},"ignoreWhitespace":{"default":false,"description":"Collapse runs of whitespace and trim before comparing.","type":"boolean"}},"required":["left","right","ignoreCase","ignoreWhitespace"],"additionalProperties":false},"DiffCheckerOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"hunks":{"type":"array","items":{"type":"object","properties":{"op":{"type":"string","enum":["equal","add","remove"]},"leftNum":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"rightNum":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"leftText":{"type":"string"},"rightText":{"type":"string"}},"required":["op"],"additionalProperties":false}},"added":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"removed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"unified":{"type":"string","description":"Unified-diff-style representation suitable for terminals."}},"required":["hunks","added","removed","unified"],"additionalProperties":false},"DiscountCalculatorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"originalPrice":{"type":"number","minimum":0},"discounts":{"minItems":1,"type":"array","items":{"type":"number"},"description":"Discount percentages applied in order (e.g. [20, 10] = 20% then another 10% off the result)."},"taxPercent":{"default":0,"type":"number","minimum":0},"taxOnDiscounted":{"default":true,"description":"If true (default), tax is calculated on the post-discount price; if false, on the original.","type":"boolean"}},"required":["originalPrice","discounts","taxPercent","taxOnDiscounted"],"additionalProperties":false},"DiscountCalculatorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"discountedPrice":{"type":"number"},"tax":{"type":"number"},"total":{"type":"number"},"saved":{"type":"number"},"effectivePercent":{"type":"number","description":"Total discount as a percent of the original price."}},"required":["discountedPrice","tax","total","saved","effectivePercent"],"additionalProperties":false},"DnsRecordTypesInput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"action":{"type":"string","const":"lookup"},"type":{"type":"string","description":"DNS record type, e.g. `A`, `MX`, `TXT`. Case-insensitive."}},"required":["action","type"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"search"},"query":{"type":"string","description":"Substring matched across type/name/description/example (case-insensitive)."}},"required":["action","query"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"list"}},"required":["action"],"additionalProperties":false}]},"DnsRecordTypesOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"type":{"type":"string"},"name":{"type":"string"},"example":{"type":"string"},"desc":{"type":"string"}},"required":["type","name","example","desc"],"additionalProperties":false},{"type":"object","properties":{"matches":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"name":{"type":"string"},"example":{"type":"string"},"desc":{"type":"string"}},"required":["type","name","example","desc"],"additionalProperties":false}}},"required":["matches"],"additionalProperties":false}]},"DockerComposeValidatorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"Raw docker-compose YAML."}},"required":["input"],"additionalProperties":false},"DockerComposeValidatorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"valid":{"type":"boolean"},"issues":{"type":"array","items":{"type":"object","properties":{"level":{"type":"string","enum":["error","warn"]},"message":{"type":"string"},"path":{"type":"string"}},"required":["level","message"],"additionalProperties":false}}},"required":["valid","issues"],"additionalProperties":false},"DockerfileStarterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"template":{"type":"string","enum":["node-alpine","python-slim","php-fpm","go-static","ruby-rails","rust-musl","java-spring","static-nginx"],"description":"Template ID. Available: node-alpine, python-slim, php-fpm, go-static, ruby-rails, rust-musl, java-spring, static-nginx."},"workdir":{"default":"/app","description":"WORKDIR path inside the container.","type":"string"}},"required":["template","workdir"],"additionalProperties":false},"DockerfileStarterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"dockerfile":{"type":"string"},"dockerignore":{"type":"string"}},"required":["dockerfile","dockerignore"],"additionalProperties":false},"EmailAuthParserInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"An SPF, DKIM, or DMARC TXT record value. Detection is heuristic based on the `v=` prefix."}},"required":["input"],"additionalProperties":false},"EmailAuthParserOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"kind":{"type":"string","enum":["spf","dkim","dmarc","unknown"]},"rows":{"type":"array","items":{"type":"object","properties":{"token":{"type":"string"},"meaning":{"type":"string"},"warn":{"type":"string"}},"required":["token","meaning"],"additionalProperties":false}}},"required":["kind","rows"],"additionalProperties":false},"EmailListParserInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"Address list. Separated by `,`, `;`, or newlines. Quoted display names and `(comments)` are honoured."},"dedupe":{"default":true,"description":"Drop duplicate addresses (case-insensitive on the email part).","type":"boolean"}},"required":["input","dedupe"],"additionalProperties":false},"EmailListParserOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"all":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"valid":{"type":"boolean"}},"required":["name","email","valid"],"additionalProperties":false}},"valid":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"valid":{"type":"boolean"}},"required":["name","email","valid"],"additionalProperties":false}},"invalid":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"valid":{"type":"boolean"}},"required":["name","email","valid"],"additionalProperties":false}},"rfc5322":{"type":"string","description":"Comma-separated `Name <addr>` list of valid addresses."},"emailsOnly":{"type":"array","items":{"type":"string"}},"byDomain":{"type":"array","items":{"type":"array","items":[{"type":"string"},{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}]},"description":"Domain → count of valid addresses, sorted by count desc."}},"required":["all","valid","invalid","rfc5322","emailsOnly","byDomain"],"additionalProperties":false},"EnvParserInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"Raw `.env` file content."}},"required":["input"],"additionalProperties":false},"EnvParserOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"},"line":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"1-based line number where the entry started."},"quoted":{"type":"string","enum":["single","double","none"]}},"required":["key","value","line","quoted"],"additionalProperties":false}},"warnings":{"type":"array","items":{"type":"object","properties":{"line":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"message":{"type":"string"}},"required":["line","message"],"additionalProperties":false}},"asObject":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"`{ key: value }` map for direct programmatic use."}},"required":["entries","warnings","asObject"],"additionalProperties":false},"EscapeUnescapeInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"mode":{"type":"string","enum":["escape","unescape"],"description":"Direction."},"flavor":{"type":"string","enum":["json","js","html","xml","sql"],"description":"Which escape conventions to apply."},"input":{"type":"string","description":"The text to transform."}},"required":["mode","flavor","input"],"additionalProperties":false},"EscapeUnescapeOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"result":{"type":"string","description":"Escaped or unescaped text."}},"required":["result"],"additionalProperties":false},"ExifViewerInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"base64":{"type":"string","description":"Base64-encoded image bytes (JPEG, PNG, WebP, HEIC, TIFF). Strip any data: URL prefix first."}},"required":["base64"],"additionalProperties":false},"ExifViewerOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"tags":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"},"sensitive":{"type":"boolean","description":"True for GPS / camera identity / timestamp fields commonly stripped before publishing."}},"required":["name","value","sensitive"],"additionalProperties":false}},"sensitiveCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"hasGps":{"type":"boolean"}},"required":["tags","sensitiveCount","hasGps"],"additionalProperties":false},"FindReplaceInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"text":{"type":"string","description":"The source text."},"find":{"type":"string","minLength":1,"description":"Pattern to find. Treated as a literal string unless `regex` is true."},"replace":{"default":"","description":"Replacement string. Supports `$1`, `$2` etc. when `regex` is true.","type":"string"},"regex":{"default":false,"description":"Treat `find` as a JavaScript regex.","type":"boolean"},"caseInsensitive":{"default":false,"description":"Match case-insensitively (adds `i` flag).","type":"boolean"},"wholeWord":{"default":false,"description":"Match only at word boundaries (wraps pattern in `\\b…\\b`). Ignored if `regex` is true.","type":"boolean"},"multiline":{"default":false,"description":"Multi-line regex mode (adds `m` flag). Only meaningful when `regex` is true.","type":"boolean"}},"required":["text","find","replace","regex","caseInsensitive","wholeWord","multiline"],"additionalProperties":false},"FindReplaceOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"result":{"type":"string","description":"Text after replacement."},"count":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of matches replaced."}},"required":["result","count"],"additionalProperties":false},"GemfileParserInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"Raw Gemfile content."}},"required":["input"],"additionalProperties":false},"GemfileParserOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"sources":{"type":"array","items":{"type":"string"}},"ruby":{"anyOf":[{"type":"string"},{"type":"null"}]},"gems":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"requirement":{"type":"string"},"groups":{"type":"array","items":{"type":"string"}},"options":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"required":["name","requirement","groups","options"],"additionalProperties":false}}},"required":["sources","ruby","gems"],"additionalProperties":false},"GhActionsStarterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"template":{"type":"string","enum":["node-ci","python-pytest","go-test","rust-cargo","docker-build-push","pages-deploy"],"description":"Template ID. Available: node-ci, python-pytest, go-test, rust-cargo, docker-build-push, pages-deploy."},"branch":{"default":"main","description":"Trigger branch name.","type":"string"},"matrix":{"default":"","description":"Comma-separated matrix values (e.g. `20, 22` for Node versions). Template-dependent.","type":"string"}},"required":["template","branch","matrix"],"additionalProperties":false},"GhActionsStarterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"filename":{"type":"string","description":"Suggested path under `.github/workflows/`."},"yaml":{"type":"string"}},"required":["filename","yaml"],"additionalProperties":false},"GitignoreBuilderInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"templates":{"minItems":1,"type":"array","items":{"type":"string","enum":["node","python","php","ruby","go","rust","java","csharp","swift","dart","nextjs","react-vite","nuxt","rails","django","laravel","expo","docker","terraform","ansible","secrets","macos","windows","linux","vscode","jetbrains","vim"]},"description":"One or more template IDs to merge. Available: node, python, php, ruby, go, rust, java, csharp, swift, dart, nextjs, react-vite, nuxt, rails, django, laravel, expo, docker, terraform, ansible, secrets, macos, windows, linux, vscode, jetbrains, vim."}},"required":["templates"],"additionalProperties":false},"GitignoreBuilderOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"content":{"type":"string","description":"The merged .gitignore content."},"available":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"group":{"type":"string"}},"required":["id","label","group"],"additionalProperties":false},"description":"All template IDs known to this tool (for discovery)."}},"required":["content","available"],"additionalProperties":false},"GoModParserInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"Raw go.mod content."}},"required":["input"],"additionalProperties":false},"GoModParserOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"module":{"anyOf":[{"type":"string"},{"type":"null"}]},"go":{"anyOf":[{"type":"string"},{"type":"null"}]},"toolchain":{"anyOf":[{"type":"string"},{"type":"null"}]},"requires":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"version":{"type":"string"},"indirect":{"type":"boolean"}},"required":["path","version","indirect"],"additionalProperties":false}},"replaces":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string"},"fromVersion":{"anyOf":[{"type":"string"},{"type":"null"}]},"to":{"type":"string"},"toVersion":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["from","fromVersion","to","toVersion"],"additionalProperties":false}},"excludes":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"version":{"type":"string"}},"required":["path","version"],"additionalProperties":false}},"retracts":{"type":"array","items":{"type":"string"}}},"required":["module","go","toolchain","requires","replaces","excludes","retracts"],"additionalProperties":false},"GradientGeneratorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"kind":{"default":"linear","description":"Gradient type.","type":"string","enum":["linear","radial","conic"]},"angle":{"default":135,"description":"Angle in degrees. Used for linear (direction) and conic (starting angle). Ignored for radial.","type":"number"},"stops":{"minItems":2,"type":"array","items":{"type":"object","properties":{"color":{"type":"string","description":"CSS color (hex, rgb(), hsl(), or named)."},"pos":{"type":"number","minimum":0,"maximum":100,"description":"Stop position 0-100."}},"required":["color","pos"],"additionalProperties":false},"description":"Color stops. At least 2 required. Will be sorted by position."}},"required":["kind","angle","stops"],"additionalProperties":false},"GradientGeneratorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"value":{"type":"string","description":"Just the gradient function call, e.g. `linear-gradient(135deg, #ef4444 0%, #f59e0b 100%)`."},"css":{"type":"string","description":"Full CSS declaration, e.g. `background: linear-gradient(...);`."}},"required":["value","css"],"additionalProperties":false},"HashGeneratorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"The text to hash. UTF-8 encoded before hashing."},"encoding":{"default":"utf8","description":"How to interpret `input` before hashing. `utf8` (default) hashes the literal string bytes; `base64` decodes first so you can hash arbitrary binary content.","type":"string","enum":["utf8","base64"]}},"required":["input","encoding"],"additionalProperties":false},"HashGeneratorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"SHA-1":{"type":"string","description":"Hex-encoded SHA-1 digest (160 bits / 40 hex chars). Not cryptographically safe; OK for checksums."},"SHA-256":{"type":"string","description":"Hex-encoded SHA-256 digest (256 bits / 64 hex chars)."},"SHA-384":{"type":"string","description":"Hex-encoded SHA-384 digest (384 bits / 96 hex chars)."},"SHA-512":{"type":"string","description":"Hex-encoded SHA-512 digest (512 bits / 128 hex chars)."}},"required":["SHA-1","SHA-256","SHA-384","SHA-512"],"additionalProperties":false},"HashSnippetGeneratorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"algo":{"type":"string","enum":["md5","sha1","sha256","sha512","hmac-sha256"]},"message":{"type":"string"},"key":{"default":"","description":"HMAC secret. Only used when `algo` is `hmac-sha256`.","type":"string"},"lang":{"description":"Target language. If omitted, returns a snippet for every language.","type":"string","enum":["node","browser","python","php","ruby","go","rust","shell"]}},"required":["algo","message","key"],"additionalProperties":false},"HashSnippetGeneratorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"lang":{"type":"string","enum":["node","browser","python","php","ruby","go","rust","shell"]},"snippet":{"type":"string"}},"required":["lang","snippet"],"additionalProperties":false},{"type":"object","properties":{"snippets":{"type":"object","propertyNames":{"type":"string","enum":["node","browser","python","php","ruby","go","rust","shell"]},"additionalProperties":{"type":"string"},"required":["node","browser","python","php","ruby","go","rust","shell"]}},"required":["snippets"],"additionalProperties":false}]},"HeadlineAnalyzerInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"headline":{"type":"string","minLength":1,"description":"A single headline (one line)."}},"required":["headline"],"additionalProperties":false},"HeadlineAnalyzerOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"score":{"type":"integer","minimum":0,"maximum":100},"band":{"type":"string","enum":["Excellent","Strong","Decent","Needs work","Weak"]},"chars":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"wordCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"hasNumber":{"type":"boolean"},"type":{"type":"string","enum":["how-to","list","question","statement"]},"powerWords":{"type":"array","items":{"type":"string"}},"positiveWords":{"type":"array","items":{"type":"string"}},"negativeWords":{"type":"array","items":{"type":"string"}},"breakdown":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"value":{"type":"string"},"points":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["label","value","points","max"],"additionalProperties":false}}},"required":["score","band","chars","wordCount","hasNumber","type","powerWords","positiveWords","negativeWords","breakdown"],"additionalProperties":false},"HmacCalculatorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"secret":{"type":"string","minLength":1,"description":"The HMAC secret key (raw UTF-8 bytes)."},"message":{"type":"string","description":"The message to authenticate."},"algo":{"default":"SHA-256","description":"Hash algorithm. SHA-256 is the safe default; use SHA-1 only when verifying legacy systems.","type":"string","enum":["SHA-1","SHA-256","SHA-384","SHA-512"]}},"required":["secret","message","algo"],"additionalProperties":false},"HmacCalculatorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"hex":{"type":"string","description":"Lowercase hex-encoded HMAC digest."},"base64":{"type":"string","description":"Base64-encoded HMAC digest (standard, with padding)."}},"required":["hex","base64"],"additionalProperties":false},"HreflangGeneratorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"entries":{"minItems":1,"type":"array","items":{"type":"object","properties":{"lang":{"type":"string","description":"BCP 47 language tag (e.g. `en`, `en-US`) or `x-default`."},"url":{"type":"string","description":"Absolute URL for that language variant."}},"required":["lang","url"],"additionalProperties":false}}},"required":["entries"],"additionalProperties":false},"HreflangGeneratorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"tags":{"type":"string","description":"Newline-joined `<link rel=\"alternate\" hreflang=… href=… />` tags."},"tagList":{"type":"array","items":{"type":"string"},"description":"Individual tags, one per entry."}},"required":["tags","tagList"],"additionalProperties":false},"HtmlCssFormatterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"lang":{"type":"string","enum":["html","css"],"description":"Which language to format/minify."},"mode":{"type":"string","enum":["format","minify"],"description":"Format pretty-prints; minify strips whitespace and comments."},"input":{"type":"string","description":"HTML or CSS source."},"indent":{"default":2,"description":"Spaces per indent level (format mode only).","type":"integer","minimum":0,"maximum":8}},"required":["lang","mode","input","indent"],"additionalProperties":false},"HtmlCssFormatterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"result":{"type":"string"},"inputBytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"outputBytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["result","inputBytes","outputBytes"],"additionalProperties":false},"HtmlEntitiesInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"mode":{"type":"string","enum":["encode","decode"],"description":"encode: raw text → HTML entities. decode: entities → raw."},"input":{"type":"string"},"includeNonAscii":{"default":false,"description":"Encode mode only: also numeric-encode characters above 0x7E.","type":"boolean"}},"required":["mode","input","includeNonAscii"],"additionalProperties":false},"HtmlEntitiesOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"result":{"type":"string"}},"required":["result"],"additionalProperties":false},"HtmlTableGeneratorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"csv":{"type":"string","description":"CSV input with optional header row."},"delimiter":{"default":",","type":"string","enum":[",","\t",";"]},"hasHeader":{"default":true,"type":"boolean"},"style":{"default":"html","type":"string","enum":["html","tailwind","markdown"]},"indent":{"default":2,"type":"integer","minimum":0,"maximum":8}},"required":["csv","delimiter","hasHeader","style","indent"],"additionalProperties":false},"HtmlTableGeneratorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"output":{"type":"string"},"rows":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"columns":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["output","rows","columns"],"additionalProperties":false},"HttpMessageParserInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"mode":{"type":"string","enum":["headers","request","response"],"description":"Format of `input`. `headers` parses just a header block; `request`/`response` expects a full raw HTTP message with start line, headers, blank line, optional body."},"input":{"type":"string"}},"required":["mode","input"],"additionalProperties":false},"HttpMessageParserOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"kind":{"type":"string","const":"headers"},"headers":{"type":"array","items":{"type":"array","items":[{"type":"string"},{"type":"string"}]}}},"required":["kind","headers"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"request"},"method":{"type":"string"},"path":{"type":"string"},"version":{"type":"string"},"headers":{"type":"array","items":{"type":"array","items":[{"type":"string"},{"type":"string"}]}},"body":{"type":"string"}},"required":["kind","method","path","version","headers","body"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"response"},"version":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"reason":{"type":"string"},"headers":{"type":"array","items":{"type":"array","items":[{"type":"string"},{"type":"string"}]}},"body":{"type":"string"}},"required":["kind","version","status","reason","headers","body"],"additionalProperties":false}]},"HttpStatusCodesInput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"action":{"type":"string","const":"lookup"},"code":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"HTTP status code to look up."}},"required":["action","code"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"search"},"query":{"type":"string","description":"Substring to match against code/name/summary (case-insensitive)."}},"required":["action","query"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"list"},"class":{"description":"Restrict to a code class (1xx/2xx/3xx/4xx/5xx).","anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3},{"type":"number","const":4},{"type":"number","const":5}]}},"required":["action"],"additionalProperties":false}]},"HttpStatusCodesOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"code":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"summary":{"type":"string"}},"required":["code","name","summary"],"additionalProperties":false},{"type":"object","properties":{"matches":{"type":"array","items":{"type":"object","properties":{"code":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"summary":{"type":"string"}},"required":["code","name","summary"],"additionalProperties":false}}},"required":["matches"],"additionalProperties":false}]},"IpClassifierInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","minLength":1,"description":"An IPv4 or IPv6 address. Family auto-detected."}},"required":["input"],"additionalProperties":false},"IpClassifierOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"family":{"anyOf":[{"type":"number","const":4},{"type":"number","const":6}]},"category":{"type":"string","enum":["public","private","loopback","link-local","multicast","broadcast","documentation","benchmarking","cgnat","reserved","unspecified","shared","ula","unique-local"]},"label":{"type":"string"},"rfc":{"type":"string"},"notes":{"type":"string"}},"required":["family","category","label","rfc","notes"],"additionalProperties":false},"IpConverterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","minLength":1,"description":"An IPv4 address (dotted quad, decimal integer, or 0x-hex) OR any IPv6 notation (with or without `::` compression, optional zone suffix ignored)."}},"required":["input"],"additionalProperties":false},"IpConverterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"family":{"type":"string","const":"v4"},"dotted":{"type":"string"},"integer":{"type":"string","description":"Decimal as a string (fits in 32 bits but returned as string for symmetry with v6)."},"hex":{"type":"string","description":"0x-prefixed, 8-digit, uppercase."},"binary":{"type":"string","description":"Four 8-bit groups separated by dots."}},"required":["family","dotted","integer","hex","binary"],"additionalProperties":false},{"type":"object","properties":{"family":{"type":"string","const":"v6"},"expanded":{"type":"string","description":"Eight 4-digit hex groups."},"compressed":{"type":"string","description":"RFC 5952-style with the longest zero-run replaced by `::`."},"hex":{"type":"string","description":"0x-prefixed 32-digit uppercase."},"embeddedV4":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Dotted-quad if address is in ::ffff:0:0/96, else null."}},"required":["family","expanded","compressed","hex","embeddedV4"],"additionalProperties":false}]},"JsAstViewerInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"source":{"type":"string"},"jsx":{"default":false,"description":"If true, JSX expressions are stripped to `null` placeholders before parsing (acorn doesn't parse JSX natively).","type":"boolean"},"sourceType":{"default":"module","type":"string","enum":["module","script"]},"ecmaVersion":{"default":"latest","anyOf":[{"type":"number","const":2015},{"type":"number","const":2020},{"type":"number","const":2022},{"type":"number","const":2024},{"type":"string","const":"latest"}]}},"required":["source","jsx","sourceType","ecmaVersion"],"additionalProperties":false},"JsAstViewerOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"ast":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"note":{"type":"string"}},"required":["ast"],"additionalProperties":false},"JsMinifierInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"code":{"type":"string","description":"JavaScript or TypeScript-flavoured source code."},"compress":{"default":true,"description":"Terser compress pass.","type":"boolean"},"mangle":{"default":true,"description":"Mangle identifier names.","type":"boolean"},"keepClassnames":{"default":false,"type":"boolean"},"ecma":{"default":2020,"anyOf":[{"type":"number","const":2017},{"type":"number","const":2020},{"type":"number","const":2022}]}},"required":["code","compress","mangle","keepClassnames","ecma"],"additionalProperties":false},"JsMinifierOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"code":{"type":"string","description":"Minified output."},"originalBytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"minifiedBytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"savedPercent":{"type":"number","description":"Percentage reduction (0-100)."}},"required":["code","originalBytes","minifiedBytes","savedPercent"],"additionalProperties":false},"JsStackParserInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"stack":{"type":"string","description":"Raw stack trace text — V8 (`at Foo (file:line:col)`) or Firefox (`Foo@file:line:col`) style supported."},"hideThirdParty":{"default":false,"description":"Drop frames in `node_modules/`, `node:`, or webpack vendor paths.","type":"boolean"}},"required":["stack","hideThirdParty"],"additionalProperties":false},"JsStackParserOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"message":{"type":"string","description":"The first non-frame line — usually the error message."},"frames":{"type":"array","items":{"type":"object","properties":{"function":{"anyOf":[{"type":"string"},{"type":"null"}]},"file":{"type":"string"},"line":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"col":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"native":{"type":"boolean"},"async":{"type":"boolean"},"thirdParty":{"type":"boolean"}},"required":["function","file","line","col","native","async","thirdParty"],"additionalProperties":false}}},"required":["message","frames"],"additionalProperties":false},"JsonDiffInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"left":{"description":"The 'before' JSON value."},"right":{"description":"The 'after' JSON value."},"unorderedArrays":{"default":false,"description":"If true, arrays are compared as multisets (order-insensitive).","type":"boolean"}},"required":["left","right","unorderedArrays"],"additionalProperties":false},"JsonDiffOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"ops":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string","description":"JSONPath-style path to the change. `$` is the root."},"kind":{"type":"string","enum":["added","removed","changed"]},"left":{},"right":{}},"required":["path","kind"],"additionalProperties":false}},"counts":{"type":"object","properties":{"added":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"removed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"changed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["added","removed","changed"],"additionalProperties":false}},"required":["ops","counts"],"additionalProperties":false},"KeywordDensityInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"text":{"type":"string"},"ignoreStopwords":{"default":true,"type":"boolean"},"topN":{"default":30,"type":"integer","exclusiveMinimum":0,"maximum":200}},"required":["text","ignoreStopwords","topN"],"additionalProperties":false},"KeywordDensityOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"totalWords":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"uniqueWords":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"oneGrams":{"type":"array","items":{"type":"array","items":[{"type":"string"},{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}]},"description":"Top single words by count (descending)."},"twoGrams":{"type":"array","items":{"type":"array","items":[{"type":"string"},{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}]}},"threeGrams":{"type":"array","items":{"type":"array","items":[{"type":"string"},{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}]}}},"required":["totalWords","uniqueWords","oneGrams","twoGrams","threeGrams"],"additionalProperties":false},"JsonFormatterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"JSON text to format or minify. Whitespace around the value is ignored."},"mode":{"default":"pretty","description":"pretty inserts indentation. minify strips all whitespace.","type":"string","enum":["pretty","minify"]},"indent":{"default":2,"description":"Spaces per indent level when mode=pretty. 0 = tab. Ignored when mode=minify.","type":"integer","minimum":0,"maximum":8}},"required":["input","mode","indent"],"additionalProperties":false},"JsonFormatterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"result":{"type":"string","description":"Formatted JSON text."},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Byte length of the result."}},"required":["result","bytes"],"additionalProperties":false},"JsonToCodeInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"anyOf":[{"type":"string"},{}],"description":"JSON value (or stringified JSON)."},"lang":{"description":"Single target language; omit for all.","type":"string","enum":["js","ts","python","php","ruby","go","rust","java"]}},"required":["input"],"additionalProperties":false},"JsonToCodeOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"lang":{"type":"string","enum":["js","ts","python","php","ruby","go","rust","java"]},"code":{"type":"string"}},"required":["lang","code"],"additionalProperties":false},{"type":"object","properties":{"code":{"type":"object","propertyNames":{"type":"string","enum":["js","ts","python","php","ruby","go","rust","java"]},"additionalProperties":{"type":"string"},"required":["js","ts","python","php","ruby","go","rust","java"]}},"required":["code"],"additionalProperties":false}]},"JsonToSchemaInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"anyOf":[{"type":"string"},{}],"description":"Sample JSON data — a value, a single object, or an array of objects to infer a shared schema across."}},"required":["input"],"additionalProperties":false},"JsonToSchemaOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"JSON Schema Draft 2020-12."}},"required":["schema"],"additionalProperties":false},"JsonToStructInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"anyOf":[{"type":"string"},{}],"description":"Sample JSON. A single object or an array of objects (shapes merged)."},"lang":{"description":"Target language; omit for all.","type":"string","enum":["ts","python","php","ruby","go","rust","java"]},"rootName":{"default":"Root","type":"string"}},"required":["input","rootName"],"additionalProperties":false},"JsonToStructOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"lang":{"type":"string","enum":["ts","python","php","ruby","go","rust","java"]},"code":{"type":"string"}},"required":["lang","code"],"additionalProperties":false},{"type":"object","properties":{"code":{"type":"object","propertyNames":{"type":"string","enum":["ts","python","php","ruby","go","rust","java"]},"additionalProperties":{"type":"string"},"required":["ts","python","php","ruby","go","rust","java"]}},"required":["code"],"additionalProperties":false}]},"JsonToTsInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"anyOf":[{"type":"string"},{}]},"rootName":{"default":"Root","type":"string"},"useType":{"default":false,"description":"If true, emit `type` aliases instead of `interface`.","type":"boolean"},"readonly":{"default":false,"type":"boolean"}},"required":["input","rootName","useType","readonly"],"additionalProperties":false},"JsonToTsOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"code":{"type":"string"}},"required":["code"],"additionalProperties":false},"JsonToZodInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"anyOf":[{"type":"string"},{}],"description":"Sample JSON data."},"name":{"default":"Root","description":"Schema/type name prefix.","type":"string"}},"required":["input","name"],"additionalProperties":false},"JsonToZodOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"code":{"type":"string","description":"TypeScript module exporting a Zod schema and inferred type."}},"required":["code"],"additionalProperties":false},"JsonpathTesterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"json":{"anyOf":[{"type":"string"},{}],"description":"Data to query (or a JSON string)."},"path":{"type":"string","description":"JSONPath expression starting with `$`. Supports `.name`, `..` recursive, `[i]`, `[a:b:s]`, `[*]`, `[?(expr)]` filters using `@` for current item."}},"required":["json","path"],"additionalProperties":false},"JsonpathTesterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"results":{"type":"array","items":{}},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["results","count"],"additionalProperties":false},"JwtBuilderInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"alg":{"default":"HS256","type":"string","enum":["none","HS256","HS384","HS512"]},"header":{"description":"Custom header fields. `alg` and `typ` will be set automatically if missing.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"payload":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Claims object. Add `iat`/`exp`/`nbf` yourself if you want them."},"secret":{"description":"HMAC secret. Required when alg ≠ none.","type":"string"}},"required":["alg","payload"],"additionalProperties":false},"JwtBuilderOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"token":{"type":"string"},"header":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"warning":{"description":"Non-fatal advice (e.g. unsigned token).","type":"string"}},"required":["token","header"],"additionalProperties":false},"JwtDecoderInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"token":{"type":"string","minLength":1,"description":"A JWT in header.payload.signature form. A leading 'Bearer ' prefix is stripped automatically."}},"required":["token"],"additionalProperties":false},"JwtDecoderOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"header":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Decoded JWT header object."},"payload":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Decoded JWT payload (claims) object."},"signature":{"type":"string","description":"The raw signature segment, base64url-encoded. NOT verified."},"expired":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"True if the payload has an exp claim and it's in the past. Null if no exp claim."},"expiresInSeconds":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Seconds until exp. Negative if expired. Null if no exp claim."}},"required":["header","payload","signature","expired","expiresInSeconds"],"additionalProperties":false},"JwtSecretStrengthInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"secret":{"type":"string"}},"required":["secret"],"additionalProperties":false},"JwtSecretStrengthOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"bitsOfEntropy":{"type":"number"},"poolSize":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"isKnownWeak":{"type":"boolean"},"perAlgorithm":{"type":"array","items":{"type":"object","properties":{"algo":{"type":"string","enum":["HS256","HS384","HS512"]},"minBytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ok":{"type":"boolean"}},"required":["algo","minBytes","ok"],"additionalProperties":false}},"issues":{"type":"array","items":{"type":"string"}}},"required":["bytes","bitsOfEntropy","poolSize","isKnownWeak","perAlgorithm","issues"],"additionalProperties":false},"LicensePickerInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"license":{"type":"string","enum":["mit","apache-2","bsd-2","bsd-3","isc","mpl-2","gpl-3","unlicense","cc0"],"description":"License id. Available: mit, apache-2, bsd-2, bsd-3, isc, mpl-2, gpl-3, unlicense, cc0."},"year":{"description":"Copyright year. Defaults to the current year.","type":"string"},"author":{"default":"Your Name","description":"Copyright holder name.","type":"string"}},"required":["license","author"],"additionalProperties":false},"LicensePickerOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"spdx":{"type":"string"},"name":{"type":"string"},"body":{"type":"string","description":"Filled-in LICENSE file content."},"permissions":{"type":"array","items":{"type":"string"}},"conditions":{"type":"array","items":{"type":"string"}}},"required":["spdx","name","body","permissions","conditions"],"additionalProperties":false},"LineEndingsInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string"},"target":{"description":"Target line ending. Omit for detect-only.","type":"string","enum":["lf","crlf","cr"]}},"required":["input"],"additionalProperties":false},"LineEndingsOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"crlf":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"lf":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"cr":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dominant":{"type":"string"},"mixed":{"type":"boolean"},"output":{"type":"string"}},"required":["crlf","lf","cr","dominant","mixed"],"additionalProperties":false},"LineSorterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string"},"order":{"default":"asc","type":"string","enum":["none","asc","desc","asc-natural","desc-natural","asc-length","desc-length","reverse","shuffle"]},"caseInsensitive":{"default":true,"type":"boolean"},"dedupe":{"default":true,"type":"boolean"},"trim":{"default":true,"type":"boolean"},"removeBlank":{"default":true,"type":"boolean"}},"required":["input","order","caseInsensitive","dedupe","trim","removeBlank"],"additionalProperties":false},"LineSorterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"output":{"type":"string"},"inputCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"outputCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"duplicatesRemoved":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["output","inputCount","outputCount","duplicatesRemoved"],"additionalProperties":false},"ListCleanerInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"Any common separator works: newlines, commas, semicolons, tabs. Quotes around items are stripped."},"format":{"default":"comma","type":"string","enum":["newline","comma","semicolon","space","json","quoted"]},"case":{"default":"preserve","type":"string","enum":["preserve","lower","upper"]},"dedupe":{"default":true,"type":"boolean"},"sort":{"default":false,"type":"boolean"}},"required":["input","format","case","dedupe","sort"],"additionalProperties":false},"ListCleanerOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"output":{"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"items":{"type":"array","items":{"type":"string"}}},"required":["output","count","items"],"additionalProperties":false},"LoanCalculatorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"amount":{"type":"number","exclusiveMinimum":0,"description":"Loan principal."},"apr":{"type":"number","minimum":0,"description":"Annual percentage rate as a number (7.5 = 7.5%)."},"termYears":{"type":"number","exclusiveMinimum":0,"description":"Loan term in years."},"includeSchedule":{"default":false,"description":"Include the full month-by-month amortization table.","type":"boolean"}},"required":["amount","apr","termYears","includeSchedule"],"additionalProperties":false},"LoanCalculatorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"monthlyPayment":{"type":"number"},"totalPaid":{"type":"number"},"totalInterest":{"type":"number"},"months":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"schedule":{"type":"array","items":{"type":"object","properties":{"month":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"payment":{"type":"number"},"interest":{"type":"number"},"principal":{"type":"number"},"balance":{"type":"number"}},"required":["month","payment","interest","principal","balance"],"additionalProperties":false}}},"required":["monthlyPayment","totalPaid","totalInterest","months"],"additionalProperties":false},"LogParserInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"Apache/nginx Combined Log Format text."}},"required":["input"],"additionalProperties":false},"LogParserOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"ip":{"type":"string"},"ident":{"type":"string"},"user":{"type":"string"},"ts":{"type":"string"},"method":{"type":"string"},"path":{"type":"string"},"protocol":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"referer":{"type":"string"},"ua":{"type":"string"}},"required":["ip","ident","user","ts","method","path","protocol","status","bytes","referer","ua"],"additionalProperties":false}},"unparsed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of lines that didn't match the Combined Log Format."},"totalBytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"byStatus":{"type":"array","items":{"type":"array","items":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}]},"description":"[status, count] pairs sorted by status."},"topPaths":{"type":"array","items":{"type":"array","items":[{"type":"string"},{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}]},"description":"Top 5 most-requested paths, [path, count] desc."}},"required":["rows","unparsed","totalBytes","byStatus","topPaths"],"additionalProperties":false},"LoremIpsumInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"mode":{"default":"paragraphs","type":"string","enum":["paragraphs","sentences","words"]},"count":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Number of paragraphs/sentences/words."},"startWithLorem":{"default":true,"description":"If true, the first unit starts with the canonical 'Lorem ipsum…' opener.","type":"boolean"},"seed":{"description":"Optional seed for a deterministic mulberry32 PRNG. Omit for true randomness.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["mode","count","startWithLorem"],"additionalProperties":false},"LoremIpsumOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"text":{"type":"string"}},"required":["text"],"additionalProperties":false},"LuhnValidatorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"Card number or any digit sequence. Non-digit characters are stripped."}},"required":["input"],"additionalProperties":false},"LuhnValidatorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"valid":{"type":"boolean","description":"Whether the Luhn (mod-10) checksum passes."},"sum":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"digits":{"type":"string"},"formatted":{"type":"string","description":"Space-separated card-style grouping."},"brand":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Detected card brand by IIN, or null."},"expectedLengths":{"type":"array","items":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"lengthOk":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["valid","sum","digits","formatted","brand","lengthOk"],"additionalProperties":false},"MacFormatterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"MAC address in any common form. Non-hex characters are ignored."},"uppercase":{"default":true,"type":"boolean"}},"required":["input","uppercase"],"additionalProperties":false},"MacFormatterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"colon":{"type":"string","description":"`AA:BB:CC:DD:EE:FF`"},"hyphen":{"type":"string","description":"`AA-BB-CC-DD-EE-FF`"},"cisco":{"type":"string","description":"Three dot-separated 16-bit groups, e.g. `AABB.CCDD.EEFF`."},"bare":{"type":"string"},"oui":{"type":"string","description":"First 24 bits (vendor block) as colon-separated."},"unicast":{"type":"boolean"},"locallyAdministered":{"type":"boolean"}},"required":["colon","hyphen","cisco","bare","oui","unicast","locallyAdministered"],"additionalProperties":false},"MarkdownHtmlConverterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"direction":{"type":"string","enum":["md2html","html2md"],"description":"Conversion direction."},"input":{"type":"string"},"gfm":{"default":true,"description":"md2html only: enable GitHub Flavored Markdown (tables, strikethrough, task lists).","type":"boolean"},"breaks":{"default":false,"description":"md2html only: treat single newlines as <br>.","type":"boolean"}},"required":["direction","input","gfm","breaks"],"additionalProperties":false},"MarkdownHtmlConverterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"result":{"type":"string","description":"Converted output. Markdown → HTML returns raw HTML (no sanitization — sanitize before rendering)."}},"required":["result"],"additionalProperties":false},"MetaLengthCheckerInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"}},"additionalProperties":false},"MetaLengthCheckerOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"title":{"type":"object","properties":{"chars":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"charLimit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"charsOver":{"type":"boolean"},"pxApprox":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pxLimit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pxOver":{"type":"boolean"}},"required":["chars","charLimit","charsOver","pxApprox","pxLimit","pxOver"],"additionalProperties":false},"description":{"type":"object","properties":{"chars":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"charLimit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"charsOver":{"type":"boolean"},"pxApprox":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pxLimit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pxOver":{"type":"boolean"}},"required":["chars","charLimit","charsOver","pxApprox","pxLimit","pxOver"],"additionalProperties":false}},"additionalProperties":false},"MimeTypesInput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"action":{"type":"string","const":"byMime"},"mime":{"type":"string"}},"required":["action","mime"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"byExtension"},"ext":{"type":"string","description":"Extension without leading dot."}},"required":["action","ext"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"search"},"query":{"type":"string"}},"required":["action","query"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"list"}},"required":["action"],"additionalProperties":false}]},"MimeTypesOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"mime":{"type":"string"},"ext":{"type":"array","items":{"type":"string"}},"desc":{"type":"string"},"group":{"type":"string"}},"required":["mime","ext","desc","group"],"additionalProperties":false},{"type":"object","properties":{"matches":{"type":"array","items":{"type":"object","properties":{"mime":{"type":"string"},"ext":{"type":"array","items":{"type":"string"}},"desc":{"type":"string"},"group":{"type":"string"}},"required":["mime","ext","desc","group"],"additionalProperties":false}}},"required":["matches"],"additionalProperties":false}]},"MortgageCalculatorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"homePrice":{"type":"number","exclusiveMinimum":0},"downPayment":{"type":"number","minimum":0},"apr":{"type":"number","minimum":0},"termYears":{"type":"number","exclusiveMinimum":0},"annualPropertyTax":{"default":0,"type":"number","minimum":0},"annualInsurance":{"default":0,"type":"number","minimum":0},"pmiRatePercent":{"default":0,"description":"Annual PMI as a percent of the loan amount. Only applied when LTV > 80%.","type":"number","minimum":0}},"required":["homePrice","downPayment","apr","termYears","annualPropertyTax","annualInsurance","pmiRatePercent"],"additionalProperties":false},"MortgageCalculatorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"loanAmount":{"type":"number"},"ltv":{"type":"number","description":"Loan-to-value ratio as a percent."},"monthlyPI":{"type":"number","description":"Principal + interest only."},"monthlyTax":{"type":"number"},"monthlyInsurance":{"type":"number"},"monthlyPmi":{"type":"number"},"monthlyTotal":{"type":"number","description":"PITI + PMI."},"totalInterest":{"type":"number"},"totalPaid":{"type":"number","description":"Total P+I paid over the loan term."},"pmiApplies":{"type":"boolean"}},"required":["loanAmount","ltv","monthlyPI","monthlyTax","monthlyInsurance","monthlyPmi","monthlyTotal","totalInterest","totalPaid","pmiApplies"],"additionalProperties":false},"NanoidGeneratorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"alphabet":{"description":"Custom alphabet. Use this OR `preset`.","type":"string","minLength":2},"preset":{"default":"default","type":"string","enum":["default","alphanumeric","lowerAlphanumeric","upperAlphanumeric","digits","hex","noLookalikes"]},"length":{"default":21,"type":"integer","minimum":1,"maximum":256},"count":{"default":1,"type":"integer","exclusiveMinimum":0,"maximum":1000}},"required":["preset","length","count"],"additionalProperties":false},"NanoidGeneratorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"ids":{"type":"array","items":{"type":"string"}},"alphabet":{"type":"string"},"bits":{"type":"number","description":"Bits of entropy per ID (log2(alphabet) * length)."}},"required":["ids","alphabet","bits"],"additionalProperties":false},"OgTagGeneratorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"url":{"type":"string"},"image":{"description":"Absolute URL to the OG image.","type":"string"},"siteName":{"type":"string"},"ogType":{"default":"website","type":"string","enum":["website","article","video.other","music.song","book","profile"]},"twitterHandle":{"type":"string"},"twitterCard":{"default":"summary_large_image","type":"string","enum":["summary","summary_large_image","player","app"]},"locale":{"default":"en_US","type":"string"}},"required":["title","description","ogType","twitterCard","locale"],"additionalProperties":false},"OgTagGeneratorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"html":{"type":"string","description":"Newline-joined `<meta>` tags ready to drop into `<head>`."}},"required":["html"],"additionalProperties":false},"PackageJsonValidatorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}],"description":"package.json as a string or parsed object."}},"required":["input"],"additionalProperties":false},"PackageJsonValidatorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"valid":{"type":"boolean"},"issues":{"type":"array","items":{"type":"object","properties":{"level":{"type":"string","enum":["error","warning"]},"path":{"type":"string"},"message":{"type":"string"}},"required":["level","path","message"],"additionalProperties":false}},"errors":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"warnings":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["valid","issues","errors","warnings"],"additionalProperties":false},"PasswordGeneratorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"length":{"default":20,"type":"integer","minimum":4,"maximum":256},"useLower":{"default":true,"type":"boolean"},"useUpper":{"default":true,"type":"boolean"},"useDigits":{"default":true,"type":"boolean"},"useSymbols":{"default":true,"type":"boolean"},"count":{"default":1,"type":"integer","exclusiveMinimum":0,"maximum":100}},"required":["length","useLower","useUpper","useDigits","useSymbols","count"],"additionalProperties":false},"PasswordGeneratorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"passwords":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"bitsOfEntropy":{"type":"number"},"strength":{"type":"string","enum":["Weak","Fair","Strong","Very strong"]}},"required":["value","bitsOfEntropy","strength"],"additionalProperties":false}}},"required":["passwords"],"additionalProperties":false},"PasswordStrengthInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"password":{"type":"string"},"guessesPerSecond":{"default":100000000000,"description":"Attacker capability. Default 1e11/s is rough for an offline GPU rig.","type":"number","exclusiveMinimum":0}},"required":["password","guessesPerSecond"],"additionalProperties":false},"PasswordStrengthOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"length":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"poolSize":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"bitsOfEntropy":{"type":"number"},"band":{"type":"string","enum":["Very weak","Weak","Reasonable","Strong","Very strong","Excellent"]},"crackTimeSeconds":{"type":"number"},"crackTimeHuman":{"type":"string"},"isCommon":{"type":"boolean"},"issues":{"type":"array","items":{"type":"string"}}},"required":["length","poolSize","bitsOfEntropy","band","crackTimeSeconds","crackTimeHuman","isCommon","issues"],"additionalProperties":false},"PemFormatterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"One or more PEM blocks (possibly malformed). A bare base64 body with no markers is reported as `loose`."}},"required":["input"],"additionalProperties":false},"PemFormatterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"blocks":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","description":"e.g. `CERTIFICATE`, `PUBLIC KEY`, `RSA PRIVATE KEY`."},"body":{"type":"string","description":"Reformatted, 64-char-wrapped base64 body."},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ok":{"type":"boolean"},"error":{"type":"string"}},"required":["label","body","bytes","ok"],"additionalProperties":false}},"reformatted":{"type":"string"},"loose":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"If no BEGIN/END markers were found but the input looks like raw base64, the cleaned body is reported here."}},"required":["blocks","reformatted","loose"],"additionalProperties":false},"PercentageToolInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"mode":{"type":"string","enum":["pctOf","whatPct","pctChange","markup","margin","ratio"],"description":"`pctOf`: X% of Y. `whatPct`: X is what percent of Y. `pctChange`: change from X to Y. `markup`: cost X marked up Y%. `margin`: cost X sold at Y. `ratio`: simplify A:B."},"a":{"type":"number","description":"First operand — meaning depends on `mode`."},"b":{"type":"number","description":"Second operand — meaning depends on `mode`."}},"required":["mode","a","b"],"additionalProperties":false},"PercentageToolOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"value":{"anyOf":[{"type":"string"},{"type":"number"}]}},"required":["label","value"],"additionalProperties":false}}},"required":["rows"],"additionalProperties":false},"PhpSerializeInput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"decode"},"input":{"type":"string","description":"PHP serialize() output."}},"required":["mode","input"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"encode"},"input":{"description":"Any JSON-compatible value."}},"required":["mode","input"],"additionalProperties":false}]},"PhpSerializeOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"value":{}},"required":["value"],"additionalProperties":false},{"type":"object","properties":{"serialized":{"type":"string"}},"required":["serialized"],"additionalProperties":false}]},"PyprojectTomlParserInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"Raw pyproject.toml content."}},"required":["input"],"additionalProperties":false},"PyprojectTomlParserOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"project":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"buildSystem":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"dependencies":{"type":"array","items":{"type":"string"}},"optionalDependencies":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"array","items":{"type":"string"}}},"tools":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"description":"`[tool.X]` sections keyed by tool name."}},"required":["project","buildSystem","dependencies","optionalDependencies","tools"],"additionalProperties":false},"PythonStringEscapeInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"mode":{"type":"string","enum":["escape","unescape"]},"input":{"type":"string"},"quote":{"default":"single","description":"Quote style for escape mode.","type":"string","enum":["single","double"]},"asciiOnly":{"default":false,"description":"If true (escape mode), non-ASCII chars become \\uXXXX / \\UXXXXXXXX escapes.","type":"boolean"}},"required":["mode","input","quote","asciiOnly"],"additionalProperties":false},"PythonStringEscapeOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"result":{"type":"string"}},"required":["result"],"additionalProperties":false},"PythonTracebackParserInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string"},"hideStdlib":{"default":false,"description":"Filter out frames in `/pythonX.Y/` or `/site-packages/`.","type":"boolean"}},"required":["input","hideStdlib"],"additionalProperties":false},"PythonTracebackParserOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"blocks":{"type":"array","items":{"type":"object","properties":{"chain":{"anyOf":[{"type":"string","enum":["cause","context"]},{"type":"null"}],"description":"How this block relates to the previous one in a chained exception."},"frames":{"type":"array","items":{"type":"object","properties":{"file":{"type":"string"},"line":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"function":{"type":"string"},"source":{"anyOf":[{"type":"string"},{"type":"null"}]},"thirdParty":{"type":"boolean"}},"required":["file","line","function","source","thirdParty"],"additionalProperties":false}},"exception":{"anyOf":[{"type":"object","properties":{"type":{"type":"string"},"message":{"type":"string"}},"required":["type","message"],"additionalProperties":false},{"type":"null"}]}},"required":["chain","frames","exception"],"additionalProperties":false}}},"required":["blocks"],"additionalProperties":false},"QrCodeInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"text":{"type":"string","minLength":1},"size":{"default":320,"type":"integer","minimum":64,"maximum":2048},"errorCorrectionLevel":{"default":"M","description":"Increasing ECC raises the QR size but allows more damage tolerance.","type":"string","enum":["L","M","Q","H"]},"margin":{"default":2,"type":"integer","minimum":0,"maximum":20},"format":{"default":"dataUrl","type":"string","enum":["png","svg","dataUrl"]}},"required":["text","size","errorCorrectionLevel","margin","format"],"additionalProperties":false},"QrCodeOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"dataUrl":{"type":"string"}},"required":["dataUrl"],"additionalProperties":false},{"type":"object","properties":{"svg":{"type":"string"}},"required":["svg"],"additionalProperties":false},{"type":"object","properties":{"pngBase64":{"type":"string"}},"required":["pngBase64"],"additionalProperties":false}]},"QueryParamManagerInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"url":{"type":"string","format":"uri"},"ops":{"type":"object","properties":{"remove":{"description":"Parameter names to drop.","type":"array","items":{"type":"string"}},"set":{"description":"Parameters to set (overwriting any existing).","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"add":{"description":"Parameters to append (preserves existing duplicates).","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"sort":{"description":"Sort parameters alphabetically by key.","type":"boolean"}},"additionalProperties":false}},"required":["url"],"additionalProperties":false},"QueryParamManagerOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"url":{"type":"string","description":"Rebuilt URL after applying ops."},"base":{"type":"string"},"params":{"type":"array","items":{"type":"array","items":[{"type":"string"},{"type":"string"}]}},"hash":{"type":"string"}},"required":["url","base","params","hash"],"additionalProperties":false},"RandomNumberGeneratorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"min":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count":{"default":1,"type":"integer","exclusiveMinimum":0,"maximum":10000},"unique":{"default":false,"description":"If true, drawn without replacement (capped at the range size).","type":"boolean"},"sorted":{"default":false,"type":"boolean"}},"required":["min","max","count","unique","sorted"],"additionalProperties":false},"RandomNumberGeneratorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"numbers":{"type":"array","items":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"required":["numbers"],"additionalProperties":false},"ReadabilityCheckerInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"text":{"type":"string","minLength":1}},"required":["text"],"additionalProperties":false},"ReadabilityCheckerOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"wordCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sentences":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"syllables":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"chars":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"complexWords":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"avgSentenceLen":{"type":"number"},"fleschReadingEase":{"type":"number"},"fleschReadingEaseBand":{"type":"string"},"fleschKincaidGrade":{"type":"number"},"automatedReadabilityIndex":{"type":"number"},"colemanLiau":{"type":"number"},"gunningFog":{"type":"number"}},"required":["wordCount","sentences","syllables","chars","complexWords","avgSentenceLen","fleschReadingEase","fleschReadingEaseBand","fleschKincaidGrade","automatedReadabilityIndex","colemanLiau","gunningFog"],"additionalProperties":false},"ReadmeSkeletonInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string","minLength":1},"description":{"type":"string"},"lang":{"default":"node","type":"string","enum":["node","python","ruby","rust","go","generic"]},"license":{"default":"MIT","type":"string"},"author":{"default":"","type":"string"},"repo":{"description":"`owner/repo` form. Used for badge URLs.","type":"string"},"badges":{"type":"object","properties":{"ci":{"default":false,"type":"boolean"},"npm":{"default":false,"type":"boolean"},"coverage":{"default":false,"type":"boolean"},"license":{"default":true,"type":"boolean"}},"required":["ci","npm","coverage","license"],"additionalProperties":false}},"required":["name","description","lang","license","author"],"additionalProperties":false},"ReadmeSkeletonOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"markdown":{"type":"string"}},"required":["markdown"],"additionalProperties":false},"RegexCheatsheetInput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"action":{"type":"string","const":"groups"}},"required":["action"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"presets"}},"required":["action"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"search"},"query":{"type":"string"}},"required":["action","query"],"additionalProperties":false}]},"RegexCheatsheetOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"groups":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"tokens":{"type":"array","items":{"type":"object","properties":{"token":{"type":"string"},"label":{"type":"string"},"example":{"type":"string"}},"required":["token","label"],"additionalProperties":false}}},"required":["title","tokens"],"additionalProperties":false}}},"required":["groups"],"additionalProperties":false},{"type":"object","properties":{"presets":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"pattern":{"type":"string"}},"required":["label","pattern"],"additionalProperties":false}}},"required":["presets"],"additionalProperties":false},{"type":"object","properties":{"matches":{"type":"array","items":{"type":"object","properties":{"group":{"type":"string"},"token":{"type":"string"},"label":{"type":"string"},"example":{"type":"string"}},"required":["group","token","label"],"additionalProperties":false}}},"required":["matches"],"additionalProperties":false}]},"RegexSafetyInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"pattern":{"type":"string"}},"required":["pattern"],"additionalProperties":false},"RegexSafetyOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"findings":{"type":"array","items":{"type":"object","properties":{"level":{"type":"string","enum":["warn","danger","info"]},"title":{"type":"string"},"detail":{"type":"string"},"sample":{"type":"string"}},"required":["level","title","detail","sample"],"additionalProperties":false}},"verdict":{"type":"string","enum":["safe","worth checking","high risk"]},"worstSyntheticMs":{"type":"number","description":"Worst observed time on synthetic `a+!` worst-case probes (10/20/25/28 chars)."}},"required":["findings","verdict","worstSyntheticMs"],"additionalProperties":false},"RegexTesterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"pattern":{"type":"string"},"flags":{"default":"g","description":"`g` is added automatically if missing — needed to enumerate all matches.","type":"string"},"text":{"type":"string"}},"required":["pattern","flags","text"],"additionalProperties":false},"RegexTesterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"flags":{"type":"string"},"matches":{"type":"array","items":{"type":"object","properties":{"start":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"end":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"text":{"type":"string"},"groups":{"type":"array","items":{"type":"object","properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"value":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["name","value"],"additionalProperties":false}}},"required":["start","end","text","groups"],"additionalProperties":false}},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["flags","matches","count"],"additionalProperties":false},"RequirementsTxtParserInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"Raw requirements.txt content."}},"required":["input"],"additionalProperties":false},"RequirementsTxtParserOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"entries":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"req"},"raw":{"type":"string"},"name":{"type":"string"},"extras":{"type":"array","items":{"type":"string"}},"specifier":{"type":"string"},"marker":{"type":"string"},"comment":{"type":"string"}},"required":["kind","raw","name","extras","specifier","marker","comment"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"url"},"raw":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"comment":{"type":"string"}},"required":["kind","raw","name","url","comment"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"editable"},"raw":{"type":"string"},"target":{"type":"string"},"comment":{"type":"string"}},"required":["kind","raw","target","comment"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"include"},"raw":{"type":"string"},"path":{"type":"string"},"comment":{"type":"string"}},"required":["kind","raw","path","comment"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"constraint"},"raw":{"type":"string"},"path":{"type":"string"},"comment":{"type":"string"}},"required":["kind","raw","path","comment"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"option"},"raw":{"type":"string"},"flag":{"type":"string"},"value":{"type":"string"}},"required":["kind","raw","flag","value"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"comment"},"raw":{"type":"string"},"comment":{"type":"string"}},"required":["kind","raw","comment"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"blank"},"raw":{"type":"string"}},"required":["kind","raw"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"invalid"},"raw":{"type":"string"},"error":{"type":"string"}},"required":["kind","raw","error"],"additionalProperties":false}]}},"requirements":{"type":"array","items":{"type":"string"},"description":"Just the normalised package names (case-insensitive, `_`/`.` → `-`)."}},"required":["entries","requirements"],"additionalProperties":false},"RobotsTxtGeneratorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"blocks":{"minItems":1,"type":"array","items":{"type":"object","properties":{"agent":{"type":"string","description":"User-agent name. Use `*` for all."},"disallow":{"default":[],"type":"array","items":{"type":"string"}},"allow":{"default":[],"type":"array","items":{"type":"string"}},"crawlDelay":{"description":"Seconds between requests.","type":"number"}},"required":["agent","disallow","allow"],"additionalProperties":false}},"sitemap":{"type":"string"}},"required":["blocks"],"additionalProperties":false},"RobotsTxtGeneratorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"robotsTxt":{"type":"string"}},"required":["robotsTxt"],"additionalProperties":false},"SavingsGoalInput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"requiredMonthly"},"target":{"type":"number","exclusiveMinimum":0},"startingBalance":{"default":0,"type":"number","minimum":0},"annualRatePercent":{"default":0,"type":"number","minimum":0},"years":{"type":"number","exclusiveMinimum":0}},"required":["mode","target","startingBalance","annualRatePercent","years"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"timeToGoal"},"target":{"type":"number","exclusiveMinimum":0},"startingBalance":{"default":0,"type":"number","minimum":0},"annualRatePercent":{"default":0,"type":"number","minimum":0},"monthlyContribution":{"type":"number","minimum":0}},"required":["mode","target","startingBalance","annualRatePercent","monthlyContribution"],"additionalProperties":false}]},"SavingsGoalOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"requiredMonthly":{"type":"number"}},"required":["requiredMonthly"],"additionalProperties":false},{"type":"object","properties":{"months":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Total months to reach the goal. null if unreachable (e.g. zero contribution at zero rate)."},"years":{"anyOf":[{"type":"number"},{"type":"null"}]},"reachable":{"type":"boolean"}},"required":["months","years","reachable"],"additionalProperties":false}]},"SchemaMarkupGeneratorInput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"type":{"type":"string","const":"faq"},"items":{"minItems":1,"type":"array","items":{"type":"object","properties":{"question":{"type":"string"},"answer":{"type":"string"}},"required":["question","answer"],"additionalProperties":false}}},"required":["type","items"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"localBusiness"},"name":{"type":"string"},"businessType":{"default":"LocalBusiness","description":"schema.org type, e.g. `Restaurant`, `Store`, `CafeOrCoffeeShop`.","type":"string"},"telephone":{"type":"string"},"url":{"type":"string"},"image":{"type":"string"},"priceRange":{"type":"string"},"address":{"type":"object","properties":{"streetAddress":{"type":"string"},"addressLocality":{"type":"string"},"addressRegion":{"type":"string"},"postalCode":{"type":"string"},"addressCountry":{"type":"string"}},"required":["streetAddress","addressLocality","addressRegion","postalCode","addressCountry"],"additionalProperties":false},"openingHours":{"description":"Schema.org openingHours strings, e.g. `Mo-Fr 09:00-17:00`.","type":"array","items":{"type":"string"}}},"required":["type","name","businessType","address"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"article"},"headline":{"type":"string"},"url":{"type":"string"},"description":{"type":"string"},"authorName":{"type":"string"},"publisherName":{"type":"string"},"publisherLogoUrl":{"type":"string"},"imageUrl":{"type":"string"},"datePublished":{"type":"string","description":"ISO date or full datetime."},"dateModified":{"type":"string"}},"required":["type","headline","authorName","publisherName","datePublished"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"product"},"name":{"type":"string"},"sku":{"type":"string"},"brand":{"type":"string"},"imageUrl":{"type":"string"},"description":{"type":"string"},"price":{"type":"string"},"priceCurrency":{"type":"string","description":"ISO 4217 code, e.g. `USD`."},"availability":{"default":"https://schema.org/InStock","type":"string"},"ratingValue":{"type":"string"},"reviewCount":{"type":"string"}},"required":["type","name","price","priceCurrency","availability"],"additionalProperties":false}]},"SchemaMarkupGeneratorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"jsonLd":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Parsed JSON-LD object."},"scriptTag":{"type":"string","description":"`<script type=\"application/ld+json\">…</script>` ready to drop into the page."}},"required":["jsonLd","scriptTag"],"additionalProperties":false},"SchemaToTsInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"schema":{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}],"description":"JSON Schema (as a string or parsed object). Draft 2020-12 conventions."}},"required":["schema"],"additionalProperties":false},"SchemaToTsOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"code":{"type":"string"}},"required":["code"],"additionalProperties":false},"SchemaValidatorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"schema":{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}],"description":"A JSON Schema (draft 2020-12 by default). May be passed as a JSON string or as a parsed object."},"data":{"description":"The data to validate."}},"required":["schema","data"],"additionalProperties":false},"SchemaValidatorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"valid":{"type":"boolean"},"errors":{"type":"array","items":{"type":"object","properties":{"instancePath":{"type":"string"},"schemaPath":{"type":"string"},"keyword":{"type":"string"},"message":{"type":"string"},"params":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["instancePath","schemaPath","keyword"],"additionalProperties":false},"description":"Empty when valid."}},"required":["valid","errors"],"additionalProperties":false},"SemverCompareInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"a":{"type":"string"},"b":{"type":"string"}},"required":["a","b"],"additionalProperties":false},"SemverCompareOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"parsed":{"type":"object","properties":{"a":{"type":"object","properties":{"major":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"minor":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"patch":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"prerelease":{"type":"array","items":{"type":"string"}},"build":{"type":"array","items":{"type":"string"}}},"required":["major","minor","patch","prerelease","build"],"additionalProperties":false},"b":{"type":"object","properties":{"major":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"minor":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"patch":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"prerelease":{"type":"array","items":{"type":"string"}},"build":{"type":"array","items":{"type":"string"}}},"required":["major","minor","patch","prerelease","build"],"additionalProperties":false}},"required":["a","b"],"additionalProperties":false},"direction":{"type":"string","enum":["up","down","equal"],"description":"`up` = B is newer than A; `down` = A is newer; `equal` = same precedence (build metadata may still differ)."},"kind":{"type":"string","enum":["major","minor","patch","prerelease","build","none"]}},"required":["parsed","direction","kind"],"additionalProperties":false},"SerpPreviewInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"title":{"type":"string"},"url":{"type":"string"},"description":{"type":"string"},"showDate":{"default":false,"type":"boolean"}},"required":["title","url","description","showDate"],"additionalProperties":false},"SerpPreviewOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"desktop":{"type":"object","properties":{"title":{"type":"string"},"titleTruncated":{"type":"boolean"},"description":{"type":"string"},"descriptionTruncated":{"type":"boolean"}},"required":["title","titleTruncated","description","descriptionTruncated"],"additionalProperties":false},"mobile":{"type":"object","properties":{"title":{"type":"string"},"titleTruncated":{"type":"boolean"},"description":{"type":"string"},"descriptionTruncated":{"type":"boolean"}},"required":["title","titleTruncated","description","descriptionTruncated"],"additionalProperties":false},"host":{"type":"string"},"trail":{"type":"string","description":"Breadcrumb-style path segments separated by ' › '."}},"required":["desktop","mobile","host","trail"],"additionalProperties":false},"SlugGeneratorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"Text to slugify. Multi-line input produces one slug per non-empty line."},"separator":{"default":"-","type":"string","enum":["-","_","."]},"lowercase":{"default":true,"type":"boolean"},"maxLength":{"default":80,"description":"Hard cap; the slug is truncated at the last separator boundary that fits. 0 disables.","type":"integer","minimum":0,"maximum":500},"stripStopWords":{"default":false,"description":"Remove English stop-words like `a`, `an`, `the`, `and`.","type":"boolean"}},"required":["input","separator","lowercase","maxLength","stripStopWords"],"additionalProperties":false},"SlugGeneratorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"slug":{"type":"string","description":"Single slug (joined by newline if input was multi-line)."},"slugs":{"type":"array","items":{"type":"string"},"description":"Per-line slugs."}},"required":["slug","slugs"],"additionalProperties":false},"SourceMapDecoderInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"map":{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}],"description":"Source map (as JSON string or parsed object)."},"positions":{"type":"array","items":{"type":"object","properties":{"file":{"type":"string"},"line":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"column":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["file","line","column"],"additionalProperties":false},"description":"Bundled positions to resolve."}},"required":["map","positions"],"additionalProperties":false},"SourceMapDecoderOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"bundled":{"type":"object","properties":{"file":{"type":"string"},"line":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"column":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["file","line","column"],"additionalProperties":false},"source":{"anyOf":[{"type":"string"},{"type":"null"}]},"line":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"column":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"resolved":{"type":"boolean"}},"required":["bundled","source","line","column","name","resolved"],"additionalProperties":false}}},"required":["results"],"additionalProperties":false},"SqlCreateTableGeneratorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"CSV/TSV/JSON sample data — column types are inferred from values."},"tableName":{"type":"string","minLength":1},"dialect":{"default":"postgres","type":"string","enum":["postgres","mysql","sqlite","mssql"]},"primaryKey":{"description":"Column name to emit as auto-increment PK (matches the dialect).","type":"string"},"ifNotExists":{"default":true,"type":"boolean"}},"required":["input","tableName","dialect","ifNotExists"],"additionalProperties":false},"SqlCreateTableGeneratorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"sql":{"type":"string"},"columns":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"},"nullable":{"type":"boolean"}},"required":["name","type","nullable"],"additionalProperties":false}}},"required":["sql","columns"],"additionalProperties":false},"SqlDiffInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"left":{"type":"string"},"right":{"type":"string"},"dialect":{"default":"sql","type":"string","enum":["sql","postgresql","mysql","sqlite","transactsql"]}},"required":["left","right","dialect"],"additionalProperties":false},"SqlDiffOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"ops":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["same","add","del"]},"left":{"type":"string"},"right":{"type":"string"}},"required":["kind"],"additionalProperties":false}},"added":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"removed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["ops","added","removed"],"additionalProperties":false},"SqlEscapeInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"mode":{"type":"string","enum":["escape","unescape"],"description":"escape: raw text → SQL string literal. unescape: literal → raw."},"dialect":{"default":"ansi","description":"Which SQL dialect's escape rules to apply.","type":"string","enum":["ansi","mysql","postgres"]},"input":{"type":"string","description":"Raw text when escaping; a SQL string literal (with quotes) when unescaping."},"wrapInQuotes":{"default":true,"description":"Escape mode only, ANSI/MySQL only: wrap the result in single quotes. Postgres always wraps in 'foo' or E'foo' as appropriate.","type":"boolean"}},"required":["mode","dialect","input","wrapInQuotes"],"additionalProperties":false},"SqlEscapeOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"result":{"type":"string","description":"Escaped or unescaped string."}},"required":["result"],"additionalProperties":false},"SqlFormatterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"SQL text to format."},"dialect":{"default":"sql","description":"SQL dialect — drives keyword recognition. 'sql' is generic standard SQL.","type":"string","enum":["sql","postgresql","mysql","mariadb","sqlite","bigquery","redshift","snowflake","transactsql","db2","plsql","spark","hive","trino"]},"tabWidth":{"default":2,"description":"Spaces per indent level.","type":"integer","minimum":1,"maximum":8},"keywordCase":{"default":"upper","description":"Force SQL keywords (SELECT, FROM, etc.) to a specific case, or preserve the input as-is.","type":"string","enum":["preserve","upper","lower"]},"linesBetweenQueries":{"default":1,"description":"Blank lines between multi-statement scripts.","type":"integer","minimum":0,"maximum":5}},"required":["input","dialect","tabWidth","keywordCase","linesBetweenQueries"],"additionalProperties":false},"SqlFormatterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"result":{"type":"string","description":"Formatted SQL."}},"required":["result"],"additionalProperties":false},"SqlInsertGeneratorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"CSV/TSV/JSON sample. JSON may be a single object or an array of objects."},"tableName":{"type":"string","minLength":1},"style":{"default":"multi","description":"`multi`: one INSERT statement with multi-row VALUES. `single`: one INSERT per row.","type":"string","enum":["multi","single"]},"emptyAsNull":{"default":true,"type":"boolean"},"includeColumns":{"default":true,"type":"boolean"}},"required":["input","tableName","style","emptyAsNull","includeColumns"],"additionalProperties":false},"SqlInsertGeneratorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"sql":{"type":"string"},"rows":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"columns":{"type":"array","items":{"type":"string"}}},"required":["sql","rows","columns"],"additionalProperties":false},"SqlMinifierInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"SQL to minify."}},"required":["input"],"additionalProperties":false},"SqlMinifierOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"result":{"type":"string","description":"Single-line SQL with comments stripped and whitespace collapsed."},"inputLength":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"outputLength":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"bytesSavedPercent":{"type":"number","description":"Percent reduction in byte size (0-100)."}},"required":["result","inputLength","outputLength","bytesSavedPercent"],"additionalProperties":false},"SqlParameterizerInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"SQL containing inline literal values."},"style":{"default":"dollar","description":"Placeholder style. qmark: ? (MySQL/SQLite/JDBC). dollar: $1, $2 (PostgreSQL). named: :p1, :p2 (Oracle/named).","type":"string","enum":["qmark","dollar","named"]}},"required":["input","style"],"additionalProperties":false},"SqlParameterizerOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"rewritten":{"type":"string","description":"SQL with inline literals replaced by placeholders."},"params":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]},"description":"The extracted literal values in placeholder order. Pass these to the prepared statement."}},"required":["rewritten","params"],"additionalProperties":false},"SvgOptimizerInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"svg":{"type":"string","description":"Raw SVG source."},"multipass":{"default":true,"type":"boolean"},"floatPrecision":{"default":3,"type":"integer","minimum":0,"maximum":8},"removeDimensions":{"default":false,"description":"Drop width / height attributes; downstream sizing relies on viewBox.","type":"boolean"},"removeViewBox":{"default":false,"description":"Risky — usually NOT what you want.","type":"boolean"}},"required":["svg","multipass","floatPrecision","removeDimensions","removeViewBox"],"additionalProperties":false},"SvgOptimizerOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"svg":{"type":"string"},"originalBytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"optimizedBytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"savedPercent":{"type":"number"}},"required":["svg","originalBytes","optimizedBytes","savedPercent"],"additionalProperties":false},"TabsSpacesInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string"},"direction":{"type":"string","enum":["tabs-to-spaces","spaces-to-tabs"]},"scope":{"default":"leading","description":"`leading` only touches indentation; `all` replaces every occurrence.","type":"string","enum":["leading","all"]},"width":{"default":2,"type":"integer","minimum":1,"maximum":8}},"required":["input","direction","scope","width"],"additionalProperties":false},"TabsSpacesOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"output":{"type":"string"},"detected":{"type":"object","properties":{"tabLines":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"spaceLines":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"mixed":{"type":"boolean"}},"required":["tabLines","spaceLines","mixed"],"additionalProperties":false}},"required":["output","detected"],"additionalProperties":false},"TcpPortReferenceInput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"action":{"type":"string","const":"lookup"},"port":{"type":"integer","minimum":0,"maximum":65535}},"required":["action","port"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"search"},"query":{"type":"string"}},"required":["action","query"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"list"}},"required":["action"],"additionalProperties":false}]},"TcpPortReferenceOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"matches":{"type":"array","items":{"type":"object","properties":{"port":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"proto":{"type":"string","enum":["TCP","UDP","TCP/UDP"]},"service":{"type":"string"},"desc":{"type":"string"}},"required":["port","proto","service","desc"],"additionalProperties":false}}},"required":["matches"],"additionalProperties":false},{"type":"object","properties":{"matches":{"type":"array","items":{"type":"object","properties":{"port":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"proto":{"type":"string","enum":["TCP","UDP","TCP/UDP"]},"service":{"type":"string"},"desc":{"type":"string"}},"required":["port","proto","service","desc"],"additionalProperties":false}},"tier":{"type":"string"}},"required":["matches","tier"],"additionalProperties":false}]},"TimeDurationInput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"between"},"start":{"type":"string","description":"Anything `new Date()` accepts."},"end":{"type":"string"}},"required":["mode","start","end"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"add"},"start":{"type":"string"},"days":{"default":0,"type":"number"},"hours":{"default":0,"type":"number"},"minutes":{"default":0,"type":"number"},"seconds":{"default":0,"type":"number"}},"required":["mode","start","days","hours","minutes","seconds"],"additionalProperties":false}]},"TimeDurationOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"between"},"ms":{"type":"number"},"human":{"type":"string"},"breakdown":{"type":"object","properties":{"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"hours":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"minutes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"seconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sign":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["days","hours","minutes","seconds","sign"],"additionalProperties":false},"totals":{"type":"object","properties":{"seconds":{"type":"number"},"minutes":{"type":"number"},"hours":{"type":"number"},"days":{"type":"number"}},"required":["seconds","minutes","hours","days"],"additionalProperties":false}},"required":["mode","ms","human","breakdown","totals"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"add"},"resultIso":{"type":"string"},"addedMs":{"type":"number"}},"required":["mode","resultIso","addedMs"],"additionalProperties":false}]},"TimestampConverterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"Either a Unix timestamp (auto-detected as seconds when ≤10 digits, milliseconds when more) or any string parseable by JavaScript's Date constructor (ISO 8601, RFC 2822, etc.)."}},"required":["input"],"additionalProperties":false},"TimestampConverterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"unixSeconds":{"type":"number","description":"Unix timestamp in seconds since epoch."},"unixMs":{"type":"number","description":"Unix timestamp in milliseconds since epoch."},"iso":{"type":"string","description":"ISO 8601 representation in UTC."},"utc":{"type":"string","description":"RFC 7231 / GMT human-readable string."},"weekday":{"type":"string","description":"English weekday name (Sun/Mon/.../Sat)."}},"required":["unixSeconds","unixMs","iso","utc","weekday"],"additionalProperties":false},"TipCalculatorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"bill":{"type":"number","minimum":0},"tipPercent":{"type":"number","minimum":0,"description":"Tip rate (e.g. 18 for 18%)."},"taxPercent":{"default":0,"type":"number","minimum":0},"people":{"default":1,"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"tipOnPreTax":{"default":true,"description":"If true (polite default), the tip is calculated on the pre-tax bill.","type":"boolean"}},"required":["bill","tipPercent","taxPercent","people","tipOnPreTax"],"additionalProperties":false},"TipCalculatorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"bill":{"type":"number"},"tax":{"type":"number"},"tip":{"type":"number"},"total":{"type":"number"},"perPerson":{"type":"number"}},"required":["bill","tax","tip","total","perPerson"],"additionalProperties":false},"TotpGeneratorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"Either a Base32 secret (A-Z, 2-7) or a full `otpauth://totp/…` URI."},"timestamp":{"description":"Unix milliseconds. Defaults to current time.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["input"],"additionalProperties":false},"TotpGeneratorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"code":{"type":"string"},"remainingSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Seconds until the current code expires."},"period":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"digits":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"algorithm":{"type":"string"},"issuer":{"type":"string"},"label":{"type":"string"}},"required":["code","remainingSeconds","period","digits","algorithm"],"additionalProperties":false},"UlidGeneratorInput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"action":{"type":"string","const":"generate"},"count":{"default":1,"type":"integer","exclusiveMinimum":0,"maximum":1000},"timestamp":{"description":"Unix milliseconds. Defaults to current time.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["action","count"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"decode"},"ulid":{"type":"string","description":"26-char Crockford Base32 ULID."}},"required":["action","ulid"],"additionalProperties":false}]},"UlidGeneratorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"}}},"required":["ids"],"additionalProperties":false},{"type":"object","properties":{"timestamp":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"iso":{"type":"string"}},"required":["timestamp","iso"],"additionalProperties":false}]},"UnicodeCodepointInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"Either a string of characters (each is described) or a codepoint expression (U+XXXX, 0xXX, decimal, &#X;)."},"mode":{"default":"chars","type":"string","enum":["chars","codepoint"]}},"required":["input","mode"],"additionalProperties":false},"UnicodeCodepointOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"char":{"type":"string"},"decimal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"hex":{"type":"string"},"notation":{"type":"string","description":"`U+XXXX`"},"utf8Hex":{"type":"string"},"utf8Pct":{"type":"string","description":"URL-encoded form."},"utf16Hex":{"type":"string"},"jsEscape":{"type":"string"},"pyEscape":{"type":"string"},"rustEscape":{"type":"string"},"htmlDec":{"type":"string"},"htmlHex":{"type":"string"},"htmlNamed":{"anyOf":[{"type":"string"},{"type":"null"}]},"jsCharUnits":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"utf8Bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["char","decimal","hex","notation","utf8Hex","utf8Pct","utf16Hex","jsEscape","pyEscape","rustEscape","htmlDec","htmlHex","htmlNamed","jsCharUnits","utf8Bytes"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false},"UnitConverterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"category":{"type":"string","description":"Category id (length, mass, volume, area, speed, pressure, energy, angle, temperature)."},"value":{"type":"number"},"from":{"type":"string","description":"Source unit key. For temperature: C/F/K."},"to":{"description":"Single target unit. Omit to get every unit in the category.","type":"string"}},"required":["category","value","from"],"additionalProperties":false},"UnitConverterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"result":{"type":"number"},"unit":{"type":"string"}},"required":["result","unit"],"additionalProperties":false},{"type":"object","properties":{"values":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"}}},"required":["values"],"additionalProperties":false}]},"UrlEncoderInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"mode":{"type":"string","enum":["encode","decode"],"description":"encode percent-encodes the input; decode reverses it."},"scope":{"default":"component","description":"component uses encodeURIComponent / decodeURIComponent — for query values, path segments, fragment text. uri uses encodeURI / decodeURI — for a whole URL where reserved characters like : / ? should NOT be encoded.","type":"string","enum":["component","uri"]},"input":{"type":"string","description":"Plain text to encode, or percent-encoded text to decode."}},"required":["mode","scope","input"],"additionalProperties":false},"UrlEncoderOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"result":{"type":"string","description":"Encoded or decoded text."}},"required":["result"],"additionalProperties":false},"UrlParserInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"url":{"type":"string","minLength":1,"description":"A URL to parse. Must include the protocol (https://, mailto:, ssh://, etc.)."}},"required":["url"],"additionalProperties":false},"UrlParserOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"protocol":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"},"host":{"type":"string"},"hostname":{"type":"string"},"port":{"type":"string"},"pathname":{"type":"string"},"search":{"type":"string"},"hash":{"type":"string"},"origin":{"type":"string"},"decodedPath":{"type":"string","description":"pathname with percent-encoded characters decoded; equal to pathname when nothing was encoded."},"params":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}},"required":["key","value"],"additionalProperties":false},"description":"Flattened query parameters. Repeated keys appear multiple times."}},"required":["protocol","username","password","host","hostname","port","pathname","search","hash","origin","decodedPath","params"],"additionalProperties":false},"UserAgentParserInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"userAgent":{"type":"string","minLength":1,"description":"A User-Agent header value."}},"required":["userAgent"],"additionalProperties":false},"UserAgentParserOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"ua":{"type":"string"},"browser":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"}},"additionalProperties":false},"engine":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"}},"additionalProperties":false},"os":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"}},"additionalProperties":false},"device":{"type":"object","properties":{"vendor":{"type":"string"},"model":{"type":"string"},"type":{"type":"string"}},"additionalProperties":false},"cpu":{"type":"object","properties":{"architecture":{"type":"string"}},"additionalProperties":false}},"required":["ua","browser","engine","os","device","cpu"],"additionalProperties":false},"UtmBuilderInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"url":{"type":"string","format":"uri","description":"Destination URL (must include http/https scheme)."},"source":{"type":"string","minLength":1,"description":"utm_source — the referrer (newsletter, twitter, partner-x)."},"medium":{"type":"string","minLength":1,"description":"utm_medium — the channel (email, cpc, social, organic)."},"campaign":{"type":"string","minLength":1,"description":"utm_campaign — the campaign name or code."},"term":{"description":"utm_term — paid keyword (optional).","type":"string"},"content":{"description":"utm_content — variant / creative (optional).","type":"string"}},"required":["url","source","medium","campaign"],"additionalProperties":false},"UtmBuilderOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"url":{"type":"string","description":"Final URL with utm_* parameters set. Any existing utm_* params on the input URL are dropped first."}},"required":["url"],"additionalProperties":false},"UtmParserInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"url":{"type":"string","format":"uri","description":"Full URL including scheme. Anchors and unknown query params are preserved as separate buckets."}},"required":["url"],"additionalProperties":false},"UtmParserOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"base":{"type":"string","description":"origin + pathname (query and hash stripped)."},"hash":{"type":"string"},"utms":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}},"required":["key","value"],"additionalProperties":false}},"trackers":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"},"label":{"type":"string"}},"required":["key","value","label"],"additionalProperties":false},"description":"Recognised vendor click IDs (gclid, fbclid, etc.) annotated with the vendor."},"others":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}},"required":["key","value"],"additionalProperties":false},"description":"Remaining query params not categorised as utm or tracker."}},"required":["base","hash","utms","trackers","others"],"additionalProperties":false},"UuidV3V5Input":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"version":{"type":"string","enum":["v3","v5"],"description":"v5 uses SHA-1 (recommended); v3 uses MD5."},"namespace":{"type":"string","description":"Namespace UUID. Pass one of the RFC 4122 presets ('dns', 'url', 'oid', 'x500') or any valid UUID."},"names":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"One name or a list. Result is a single UUID for a string, or an array for a list."}},"required":["version","namespace","names"],"additionalProperties":false},"UuidV3V5Output":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"uuid":{"type":"string"}},"required":["uuid"],"additionalProperties":false},{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"uuid":{"type":"string"}},"required":["name","uuid"],"additionalProperties":false}}},"required":["results"],"additionalProperties":false}]},"UuidValidatorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"input":{"type":"string","description":"A UUID string. Surrounding `{}` or `<>` braces are stripped."}},"required":["input"],"additionalProperties":false},"UuidValidatorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"valid":{"type":"boolean"},"version":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"variant":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"`NCS-compatible (legacy)`, `RFC 4122 (standard)`, `Microsoft GUID`, `Reserved`, or `Nil UUID (all zeros)`."},"timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO timestamp embedded in v1 / v7 UUIDs; null otherwise."},"normalised":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["valid","version","variant","timestamp","normalised"],"additionalProperties":false},"UuidGeneratorInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"version":{"default":"v4","description":"UUID version. v4 is random (122 bits of entropy). v7 is time-ordered (48-bit Unix-ms prefix), best for database primary keys because inserts stay sequential.","type":"string","enum":["v4","v7"]},"count":{"default":1,"description":"How many UUIDs to generate (1-1000).","type":"integer","minimum":1,"maximum":1000},"uppercase":{"default":false,"description":"Uppercase the hex digits.","type":"boolean"}},"required":["version","count","uppercase"],"additionalProperties":false},"UuidGeneratorOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"uuids":{"type":"array","items":{"type":"string"},"description":"Array of generated UUIDs in canonical 8-4-4-4-12 form."}},"required":["uuids"],"additionalProperties":false},"WakeOnLanInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"mac":{"type":"string","description":"Target MAC address in any common form. Non-hex chars are ignored."}},"required":["mac"],"additionalProperties":false},"WakeOnLanOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"hex":{"type":"string","description":"102-byte magic packet as continuous uppercase hex."},"hexGrouped":{"type":"string","description":"Same hex with byte spacing and line breaks every 16 bytes."},"base64":{"type":"string","description":"Magic packet as base64."},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Always 102."}},"required":["hex","hexGrouped","base64","bytes"],"additionalProperties":false},"WordCounterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"text":{"type":"string","description":"The text to analyze."},"wpm":{"default":225,"description":"Words per minute for the reading-time estimate. Default 225 (typical adult prose pace).","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["text","wpm"],"additionalProperties":false},"WordCounterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"characters":{"type":"integer","minimum":0,"maximum":9007199254740991},"charsNoSpaces":{"type":"integer","minimum":0,"maximum":9007199254740991},"words":{"type":"integer","minimum":0,"maximum":9007199254740991},"sentences":{"type":"integer","minimum":0,"maximum":9007199254740991},"paragraphs":{"type":"integer","minimum":0,"maximum":9007199254740991},"lines":{"type":"integer","minimum":0,"maximum":9007199254740991},"readingMinutes":{"type":"number","minimum":0,"description":"Estimated reading time in minutes (words / wpm)."}},"required":["characters","charsNoSpaces","words","sentences","paragraphs","lines","readingMinutes"],"additionalProperties":false},"XmlFormatterInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"mode":{"type":"string","enum":["pretty","minify"],"description":"Format with indentation, or strip all between-tag whitespace."},"input":{"type":"string"},"indent":{"default":2,"description":"Spaces per indent level (pretty mode only).","type":"integer","minimum":0,"maximum":8}},"required":["mode","input","indent"],"additionalProperties":false},"XmlFormatterOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"result":{"type":"string"}},"required":["result"],"additionalProperties":false},"YamlJsonInput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"direction":{"type":"string","enum":["yamlToJson","jsonToYaml"],"description":"Which way to convert."},"input":{"type":"string","description":"YAML text or JSON text, depending on direction."},"indent":{"default":2,"description":"Spaces per indent level.","type":"integer","minimum":0,"maximum":8}},"required":["direction","input","indent"],"additionalProperties":false},"YamlJsonOutput":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"result":{"type":"string","description":"Converted text."}},"required":["result"],"additionalProperties":false},"ZipCodeLookupInput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"action":{"type":"string","const":"lookup"},"zip":{"type":"string","description":"5-digit US ZIP code."}},"required":["action","zip"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"search"},"query":{"type":"string","description":"Substring matched across zip/city/state/county."}},"required":["action","query"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"list"}},"required":["action"],"additionalProperties":false}]},"ZipCodeLookupOutput":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"zip":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"county":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"}},"required":["zip","city","state","county","lat","lon"],"additionalProperties":false},{"type":"object","properties":{"matches":{"type":"array","items":{"type":"object","properties":{"zip":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"county":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"}},"required":["zip","city","state","county","lat","lon"],"additionalProperties":false}}},"required":["matches"],"additionalProperties":false}]}},"responses":{"InvalidInput":{"description":"Request failed Zod validation.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"path":{"type":"string"}}}}}}}},"NotFound":{"description":"No tool registered with this slug."},"PayloadTooLarge":{"description":"Request body exceeded the per-request size cap (1 MB)."},"ToolError":{"description":"Tool threw at runtime."},"Timeout":{"description":"Tool exceeded the wallclock cap (10 s)."}}},"tags":[{"name":"meta","description":"Discovery + reference endpoints."},{"name":"auth"},{"name":"code"},{"name":"content"},{"name":"crypto"},{"name":"csv"},{"name":"data"},{"name":"datetime"},{"name":"design"},{"name":"devops"},{"name":"encoding"},{"name":"finance"},{"name":"id"},{"name":"image"},{"name":"json"},{"name":"marketing"},{"name":"math"},{"name":"network"},{"name":"security"},{"name":"sql"},{"name":"system"},{"name":"text"},{"name":"time"},{"name":"url"},{"name":"web"},{"name":"yaml"}]}