{"serverId":"mcp-registry/com.apished/apished","tools":[{"name":"color_convert","fixed":{"name":"color_convert","description":"Converts a color between hex, rgb, hsl, and hsv. value's shape depends on from/to: a string for hex, an object ({r,g,b,a?} etc.) otherwise.","inputSchema":{"type":"object","required":["from","to","value"],"properties":{"to":{"type":"string","description":"hex, rgb, hsl, or hsv"},"from":{"type":"string","description":"hex, rgb, hsl, or hsv"},"value":{"description":"a hex string, or an {r,g,b,a?}/{h,s,l,a?}/{h,s,v,a?} object per from","type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"schema","detail":"Added \"type\":\"string\" to untyped parameters: value. Change to number/boolean/array where that's what you accept.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":142,"tokensAfter":146},{"name":"csv_stats","fixed":{"name":"csv_stats","description":"Parses CSV text (header row required) and reports per-column non-empty/empty value counts across the data rows. No numeric aggregation.","inputSchema":{"type":"object","required":["text"],"properties":{"text":{"type":"string"},"delimiter":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":90,"tokensAfter":90},{"name":"csv_validate","fixed":{"name":"csv_validate","description":"Reports whether CSV text is structurally well-formed: every row has the same field count as the first.","inputSchema":{"type":"object","required":["text"],"properties":{"text":{"type":"string"},"delimiter":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":82,"tokensAfter":82},{"name":"datemath_add","fixed":{"name":"datemath_add","description":"Adds years/months/days to date. years/months are applied together with end-of-month clamping — e.g. 2026-01-31 + 1 month = 2026-02-28, not an overflowed 2026-03-03. days is then applied as plain calendar-day arithmetic.","inputSchema":{"type":"object","required":["date"],"properties":{"date":{"type":"string","description":"YYYY-MM-DD"},"days":{"type":"integer"},"years":{"type":"integer"},"months":{"type":"integer"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":136,"tokensAfter":136},{"name":"ean_validate","fixed":{"name":"ean_validate","description":"Validates an 8-digit (EAN-8), 12-digit (UPC-A), 13-digit (EAN-13), or 14-digit (GTIN-14) barcode checksum: alternating weights 1 3 applied right-to-left, check digit is (10 - sum mod 10) mod 10.","inputSchema":{"type":"object","required":["value"],"properties":{"value":{"type":"string","description":"identifier or value to check"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":112,"tokensAfter":112},{"name":"email_validate","fixed":{"name":"email_validate","description":"Checks value is a single, bare RFC 5322 email address — syntax only, not a deliverability check. user@localhost is valid (no TLD required). \"Name <email>\" display syntax is rejected.","inputSchema":{"type":"object","required":["value"],"properties":{"value":{"type":"string","description":"identifier or value to check"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":110,"tokensAfter":110},{"name":"iban_validate","fixed":{"name":"iban_validate","description":"Validates an IBAN's length for its issuing country (per the SWIFT IBAN registry) and its mod-97 checksum. Does not decompose the BBAN into a bank code/account number or resolve a BIC.","inputSchema":{"type":"object","required":["value"],"properties":{"value":{"type":"string","description":"identifier or value to check"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":109,"tokensAfter":109},{"name":"isbn_validate","fixed":{"name":"isbn_validate","description":"Validates a 10- or 13-character ISBN. ISBN-10 uses weights 10..1 over 10 characters (last may be X, worth 10), sum mod 11 must be 0. ISBN-13 uses the same GTIN checksum as barcodes.","inputSchema":{"type":"object","required":["value"],"properties":{"value":{"type":"string","description":"identifier or value to check"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":109,"tokensAfter":109},{"name":"jsonschema_validate","fixed":{"name":"jsonschema_validate","description":"Validates document against schema (JSON Schema draft-07 or 2020-12). Reports one specific violation per call, not an aggregated list.","inputSchema":{"type":"object","required":["schema","document"],"properties":{"schema":{"description":"a JSON Schema (draft-07 or 2020-12)","type":"string"},"document":{"description":"the JSON value to validate against schema","type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"schema","detail":"Added \"type\":\"string\" to untyped parameters: schema, document. Change to number/boolean/array where that's what you accept.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":118,"tokensAfter":127},{"name":"luhn_validate","fixed":{"name":"luhn_validate","description":"Validates a numeric string against the Luhn (mod-10) checksum — payment card numbers, IMEI numbers, and similar identifiers.","inputSchema":{"type":"object","required":["value"],"properties":{"value":{"type":"string","description":"identifier or value to check"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":93,"tokensAfter":93},{"name":"network_cidr_info","fixed":{"name":"network_cidr_info","description":"Parses a CIDR block and reports its network address, address range, and address count. An address with host bits set (e.g. 10.14.32.17/21) is normalized to its network address in the result.","inputSchema":{"type":"object","required":["cidr"],"properties":{"cidr":{"type":"string","description":"an IPv4 or IPv6 CIDR block, e.g. 10.14.32.17/21"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":117,"tokensAfter":117},{"name":"nip_validate","fixed":{"name":"nip_validate","description":"Validates the checksum of a 10-digit Polish tax identification number (NIP). Checksum uses weights 6 5 7 2 3 4 5 6 7 over the first 9 digits; sum mod 11 must equal the 10th digit. A sum mod 11 of 10 is itself invalid.","inputSchema":{"type":"object","required":["value"],"properties":{"value":{"type":"string","description":"digits-only identifier to validate (no spaces or dashes)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":126,"tokensAfter":126},{"name":"pesel_validate","fixed":{"name":"pesel_validate","description":"Validates the checksum of an 11-digit Polish national identification number (PESEL). Checksum uses weights 1 3 7 9 1 3 7 9 1 3 over the first 10 digits; control digit is (10 - sum mod 10) mod 10. On success also decodes the date of birth and sex embedded in the number; a checksum-valid number with an impossible calendar date (e.g. Feb 30) is still reported invalid.","inputSchema":{"type":"object","required":["value"],"properties":{"value":{"type":"string","description":"digits-only identifier to validate (no spaces or dashes)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":169,"tokensAfter":169},{"name":"pipe_run","fixed":{"name":"pipe_run","description":"Runs a short ordered chain of existing apished operations in one call (same as POST /v1/pipe/run), passing one named field of each step's result into the next step's args. Stops at the first failing step.","inputSchema":{"type":"object","required":["steps"],"properties":{"steps":{"type":["null","array"],"items":{"type":"object","required":["path"],"properties":{"args":{"description":"that operation's normal JSON request body"},"from":{"type":["null","object"],"required":["field","as"],"properties":{"as":{"type":"string","description":"field name to set it as in this step's args"},"field":{"type":"string","description":"field name to read from the previous step's result"}},"description":"carries one field of the previous step's result into this step's args","additionalProperties":false},"path":{"type":"string","description":"canonical REST path of the operation, e.g. /v1/hash/digest"}},"additionalProperties":false}}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":277,"tokensAfter":277},{"name":"regon_validate","fixed":{"name":"regon_validate","description":"Validates the checksum of a 9- or 14-digit Polish business registry number (REGON). 9-digit: weights 8 9 2 3 4 5 6 7 over the first 8 digits, sum mod 11 (10 mapped to 0) must equal the 9th digit. 14-digit: the first 9 digits must themselves be a valid 9-digit REGON, and weights 2 4 8 5 0 9 7 3 6 1 2 4 8 over the first 13 digits (sum mod 11, 10 mapped to 0) must equal the 14th digit.","inputSchema":{"type":"object","required":["value"],"properties":{"value":{"type":"string","description":"digits-only identifier to validate (no spaces or dashes)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":174,"tokensAfter":174},{"name":"swiftbic_validate","fixed":{"name":"swiftbic_validate","description":"Structural format validation only for a SWIFT/BIC code: 8 or 11 characters (4 letters bank code + 2 letters country code + 2 alphanumeric location code + optional 3 alphanumeric branch code). The country code is not cross-checked against ISO 3166-1.","inputSchema":{"type":"object","required":["value"],"properties":{"value":{"type":"string","description":"identifier or value to check"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":129,"tokensAfter":129},{"name":"text_count","fixed":{"name":"text_count","description":"Counts non-overlapping occurrences of substring in text (rune-safe, not byte-based).","inputSchema":{"type":"object","required":["text","substring"],"properties":{"text":{"type":"string"},"substring":{"type":"string","description":"must be non-empty"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":89,"tokensAfter":89},{"name":"text_stats","fixed":{"name":"text_stats","description":"Descriptive statistics for text: rune/byte/word/line counts, a unique-rune count, a letters/digits/spaces/punctuation/other breakdown, an exact per-character frequency table, and word-length min/max/average plus the actual shortest/longest word (ties resolve to the first occurrence).","inputSchema":{"type":"object","required":["text"],"properties":{"text":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":124,"tokensAfter":124},{"name":"tokens_count","fixed":{"name":"tokens_count","description":"Counts tokens under an OpenAI-compatible (tiktoken) encoding. Provide exactly one of model (e.g. \"gpt-4o\") or encoding (\"o200k_base\" or \"cl100k_base\"). No Claude/Anthropic tokenizer.","inputSchema":{"type":"object","required":["text"],"properties":{"text":{"type":"string"},"model":{"type":"string","description":"e.g. gpt-4o; exactly one of model/encoding"},"encoding":{"type":"string","description":"o200k_base or cl100k_base; exactly one of model/encoding"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":149,"tokensAfter":149},{"name":"units_convert_datasize","fixed":{"name":"units_convert_datasize","description":"Converts a data-size value (decimal string) between bit, Kbit, Mbit, Gbit, Tbit (SI bits), B, KB, MB, GB, TB, PB (SI bytes), and KiB, MiB, GiB, TiB, PiB (IEC bytes). Always exact.","inputSchema":{"type":"object","required":["value","from","to"],"properties":{"to":{"type":"string"},"from":{"type":"string"},"value":{"type":"string","description":"decimal string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":124,"tokensAfter":124},{"name":"units_convert_temperature","fixed":{"name":"units_convert_temperature","description":"Converts a temperature value (decimal string) between C, F, and K. Offset-aware, not a bare multiplier.","inputSchema":{"type":"object","required":["value","from","to"],"properties":{"to":{"type":"string","description":"C, F, or K"},"from":{"type":"string","description":"C, F, or K"},"value":{"type":"string","description":"decimal string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":118,"tokensAfter":118},{"name":"url_validate","fixed":{"name":"url_validate","description":"Checks value is a well-formed absolute URL (has both a scheme and a host) — syntax only, not a reachability check.","inputSchema":{"type":"object","required":["value"],"properties":{"value":{"type":"string","description":"identifier or value to check"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":90,"tokensAfter":90},{"name":"uuid_validate","fixed":{"name":"uuid_validate","description":"Parses value as a UUID and reports its version/variant if well-formed.","inputSchema":{"type":"object","required":["value"],"properties":{"value":{"type":"string","description":"digits-only identifier to validate (no spaces or dashes)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":86,"tokensAfter":86},{"name":"vateu_validate","fixed":{"name":"vateu_validate","description":"Format validation only (no VIES lookup) for an EU VAT number: checks the 2-letter member-state prefix (EL for Greece, XI for Northern Ireland) against that country's digit/letter pattern. A format-valid result does not mean the number is actually registered.","inputSchema":{"type":"object","required":["value"],"properties":{"value":{"type":"string","description":"identifier or value to check"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":130,"tokensAfter":130}],"toolsChanged":24,"tokensSaved":0,"todo":[{"tool":"color_contrast","params":["colorA","colorB"]},{"tool":"csv_from_json","params":["columns","records","delimiter"]},{"tool":"csv_parse","params":["text"]},{"tool":"csv_stats","params":["text","delimiter"]},{"tool":"csv_to_json","params":["text","delimiter"]},{"tool":"csv_validate","params":["text","delimiter"]},{"tool":"datemath_add","params":["days","years","months"]},{"tool":"datemath_leapyear","params":["year"]},{"tool":"network_cidr_contains","params":["cidr","address"]},{"tool":"network_cidr_overlaps","params":["cidrA","cidrB"]},{"tool":"pipe_run","params":["steps"]},{"tool":"regex_extract","params":["input"]},{"tool":"regex_match","params":["input"]},{"tool":"regex_replace","params":["input","pattern","replacement"]},{"tool":"regex_split","params":["input","limit","pattern"]},{"tool":"text_charat","params":["text"]},{"tool":"text_count","params":["text"]},{"tool":"text_palindrome","params":["text","ignoreCase","ignoreNonAlnum"]},{"tool":"text_reverse","params":["text"]},{"tool":"text_sort","params":["text"]},{"tool":"text_stats","params":["text"]},{"tool":"text_wordcount","params":["text"]},{"tool":"tokens_count","params":["text"]},{"tool":"units_convert_datasize","params":["to","from"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}