---
schema: "interfacedelta-service-md/1"
target_key: "sha256:6bb564a1bd3e1c47cf12ad6ff1a44bc4e53538ad7a79a609df4be525678718fa"
origin: "https://apished.com"
protocols: ["mcp"]
observed_at: "2026-11-12T20:05:15.429Z"
generated_at: "2026-11-13T02:04:20.339Z"
record_url: "https://interfacedelta.com/atlas/sha256:6bb564a1bd3e1c47cf12ad6ff1a44bc4e53538ad7a79a609df4be525678718fa"
record_api: "https://interfacedelta.com/api/v1/record/services/sha256:6bb564a1bd3e1c47cf12ad6ff1a44bc4e53538ad7a79a609df4be525678718fa"
source: "InterfaceDelta atlas"
license_note: "Use of this record is governed by https://interfacedelta.com/terms."
---

# Service record: https://apished.com

## Identity
- Origin: https://apished.com
- Endpoints: https://apished.com/mcp
- Protocols: mcp
- Registry names: com.apished/apished
- First retained observation: 2026-11-12T20:05:15.429Z
- Latest observation: 2026-11-12T20:05:15.429Z

## Tools
- Tool 1: color\_contrast (mcp); inputs: colorA, colorB; inputs omitted: 0; annotations: {}
- Tool 2: color\_convert (mcp); inputs: from, to, value; inputs omitted: 0; annotations: {}
- Tool 3: csv\_from\_json (mcp); inputs: columns, delimiter, records; inputs omitted: 0; annotations: {}
- Tool 4: csv\_parse (mcp); inputs: delimiter, text; inputs omitted: 0; annotations: {}
- Tool 5: csv\_stats (mcp); inputs: delimiter, text; inputs omitted: 0; annotations: {}
- Tool 6: csv\_to\_json (mcp); inputs: delimiter, header, text; inputs omitted: 0; annotations: {}
- Tool 7: csv\_validate (mcp); inputs: delimiter, text; inputs omitted: 0; annotations: {}
- Tool 8: datemath\_add (mcp); inputs: date, days, months, years; inputs omitted: 0; annotations: {}
- Tool 9: datemath\_age (mcp); inputs: asOf, birthDate; inputs omitted: 0; annotations: {}
- Tool 10: datemath\_businessdays (mcp); inputs: from, holidays, to, weekdays; inputs omitted: 0; annotations: {}
- Tool 11: datemath\_dayofweek (mcp); inputs: date; inputs omitted: 0; annotations: {}
- Tool 12: datemath\_diff (mcp); inputs: from, to; inputs omitted: 0; annotations: {}
- Tool 13: datemath\_leapyear (mcp); inputs: year; inputs omitted: 0; annotations: {}
- Tool 14: datetime\_now (mcp); inputs: format, timezone; inputs omitted: 0; annotations: {}
- Tool 15: ean\_validate (mcp); inputs: value; inputs omitted: 0; annotations: {}
- Tool 16: email\_validate (mcp); inputs: value; inputs omitted: 0; annotations: {}
- Tool 17: encode\_decode (mcp); inputs: format, input; inputs omitted: 0; annotations: {}
- Tool 18: encode\_encode (mcp); inputs: format, input; inputs omitted: 0; annotations: {}
- Tool 19: hash\_digest (mcp); inputs: algo, encoding, input; inputs omitted: 0; annotations: {}
- Tool 20: hash\_hmac (mcp); inputs: algo, encoding, input, key; inputs omitted: 0; annotations: {}
- Tool 21: iban\_validate (mcp); inputs: value; inputs omitted: 0; annotations: {}
- Tool 22: isbn\_validate (mcp); inputs: value; inputs omitted: 0; annotations: {}
- Tool 23: jsonschema\_validate (mcp); inputs: document, schema; inputs omitted: 0; annotations: {}
- Tool 24: luhn\_validate (mcp); inputs: value; inputs omitted: 0; annotations: {}
- Tool 25: network\_cidr\_contains (mcp); inputs: address, cidr; inputs omitted: 0; annotations: {}
- Tool 26: network\_cidr\_info (mcp); inputs: cidr; inputs omitted: 0; annotations: {}
- Tool 27: network\_cidr\_overlaps (mcp); inputs: cidrA, cidrB; inputs omitted: 0; annotations: {}
- Tool 28: nip\_validate (mcp); inputs: value; inputs omitted: 0; annotations: {}
- Tool 29: pesel\_validate (mcp); inputs: value; inputs omitted: 0; annotations: {}
- Tool 30: pipe\_run (mcp); inputs: steps; inputs omitted: 0; annotations: {}
- Tool 31: random\_int (mcp); inputs: count, max, min; inputs omitted: 0; annotations: {}
- Tool 32: regex\_extract (mcp); inputs: input, maxMatches, pattern; inputs omitted: 0; annotations: {}
- Tool 33: regex\_match (mcp); inputs: input, pattern; inputs omitted: 0; annotations: {}
- Tool 34: regex\_replace (mcp); inputs: input, pattern, replacement; inputs omitted: 0; annotations: {}
- Tool 35: regex\_split (mcp); inputs: input, limit, pattern; inputs omitted: 0; annotations: {}
- Tool 36: regon\_validate (mcp); inputs: value; inputs omitted: 0; annotations: {}
- Tool 37: rpncalc\_eval (mcp); inputs: expr; inputs omitted: 0; annotations: {}
- Tool 38: swiftbic\_validate (mcp); inputs: value; inputs omitted: 0; annotations: {}
- Tool 39: text\_charat (mcp); inputs: index, text; inputs omitted: 0; annotations: {}
- Tool 40: text\_count (mcp); inputs: substring, text; inputs omitted: 0; annotations: {}
- Tool 41: text\_palindrome (mcp); inputs: ignoreCase, ignoreNonAlnum, text; inputs omitted: 0; annotations: {}
- Tool 42: text\_reverse (mcp); inputs: text; inputs omitted: 0; annotations: {}
- Tool 43: text\_sort (mcp); inputs: by, text; inputs omitted: 0; annotations: {}
- Tool 44: text\_stats (mcp); inputs: text; inputs omitted: 0; annotations: {}
- Tool 45: text\_wordcount (mcp); inputs: text; inputs omitted: 0; annotations: {}
- Tool 46: tokens\_count (mcp); inputs: encoding, model, text; inputs omitted: 0; annotations: {}
- Tool 47: units\_convert\_datasize (mcp); inputs: from, to, value; inputs omitted: 0; annotations: {}
- Tool 48: units\_convert\_temperature (mcp); inputs: from, to, value; inputs omitted: 0; annotations: {}
- Tool 49: url\_validate (mcp); inputs: value; inputs omitted: 0; annotations: {}
- Tool 50: uuid\_generate (mcp); inputs: count; inputs omitted: 0; annotations: {}
- Tool 51: uuid\_validate (mcp); inputs: value; inputs omitted: 0; annotations: {}
- Tool 52: vateu\_validate (mcp); inputs: value; inputs omitted: 0; annotations: {}
Tools omitted: 0.

## Effect readings (AI)
- Tool 1 (color\_contrast): ◇ AI reading; state: counted; none (confidence 0.92); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 1 purpose: ◇ AI reading; Returns a luminance-based readability ratio for two hex colors, blending any transparency onto white first.; lens: tool-purpose-v1; model: not recorded.
- Tool 2 (color\_convert): ◇ AI reading; state: counted; none (confidence 0.93); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 2 purpose: ◇ AI reading; Converts colors among hex, RGB, HSL and HSV formats, returning the same color in the requested format.; lens: tool-purpose-v1; model: not recorded.
- Tool 3 (csv\_from\_json): ◇ AI reading; state: counted; none (confidence 0.925); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 3 purpose: ◇ AI reading; Converts an array of JSON objects into CSV text, using an explicitly ordered column list for the header row.; lens: tool-purpose-v1; model: not recorded.
- Tool 4 (csv\_parse): ◇ AI reading; state: counted; none (confidence 0.955); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 4 purpose: ◇ AI reading; Converts CSV text into rows of plain string cells, with an optional custom delimiter and no type inference.; lens: tool-purpose-v1; model: not recorded.
- Tool 5 (csv\_stats): ◇ AI reading; state: counted; none (confidence 0.93); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 5 purpose: ◇ AI reading; Reports how many filled and blank cells each column has in CSV text that includes a header row.; lens: tool-purpose-v1; model: not recorded.
- Tool 6 (csv\_to\_json): ◇ AI reading; state: counted; none (confidence 0.92); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 6 purpose: ◇ AI reading; Converts pasted CSV text into JSON, either as objects keyed by header names or as raw row arrays, with all values as strings.; lens: tool-purpose-v1; model: not recorded.
- Tool 7 (csv\_validate): ◇ AI reading; state: counted; none (confidence 0.93); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 7 purpose: ◇ AI reading; Checks whether supplied CSV text has consistent column counts, with each row matching the field count of the first row.; lens: tool-purpose-v1; model: not recorded.
- Tool 8 (datemath\_add): ◇ AI reading; state: counted; none (confidence 0.93); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 8 purpose: ◇ AI reading; Returns a date shifted by given year, month and day amounts, clamping to month-end when needed.; lens: tool-purpose-v1; model: not recorded.
- Tool 9 (datemath\_age): ◇ AI reading; state: counted; none (confidence 0.9); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 9 purpose: ◇ AI reading; Returns the completed years between a birth date and a chosen date, defaulting to today's UTC date.; lens: tool-purpose-v1; model: not recorded.
- Tool 10 (datemath\_businessdays): ◇ AI reading; state: counted; none (confidence 0.88); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 10 purpose: ◇ AI reading; Returns the number of working days between two dates, skipping weekends by default and any listed holiday dates.; lens: tool-purpose-v1; model: not recorded.
- Tool 11 (datemath\_dayofweek): ◇ AI reading; state: counted; none (confidence 0.84); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 11 purpose: ◇ AI reading; Returns the day name and ISO 8601 number (1 for Monday through 7 for Sunday) of a given date.; lens: tool-purpose-v1; model: not recorded.
- Tool 12 (datemath\_diff): ◇ AI reading; state: counted; none (confidence 0.9); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 12 purpose: ◇ AI reading; Returns the count of whole days separating two YYYY-MM-DD dates, negative when the second comes first.; lens: tool-purpose-v1; model: not recorded.
- Tool 13 (datemath\_leapyear): ◇ AI reading; state: counted; none (confidence 0.91); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 13 purpose: ◇ AI reading; Verifies whether an integer year qualifies as a leap year using Gregorian calendar rules.; lens: tool-purpose-v1; model: not recorded.
- Tool 14 (datetime\_now): ◇ AI reading; state: counted; none (confidence 0.853); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 14 purpose: ◇ AI reading; Returns the present date and time, optionally formatted and localized to a chosen timezone.; lens: tool-purpose-v1; model: not recorded.
- Tool 15 (ean\_validate): ◇ AI reading; state: counted; none (confidence 0.9); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 15 purpose: ◇ AI reading; Validates the check digit of a barcode number in EAN-8, UPC-A, EAN-13 or GTIN-14 format.; lens: tool-purpose-v1; model: not recorded.
- Tool 16 (email\_validate): ◇ AI reading; state: counted; none (confidence 0.9); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 17 (encode\_decode): ◇ AI reading; state: counted; none (confidence 0.92); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 17 purpose: ◇ AI reading; Converts encoded text such as base64, hex, rot13 or HTML entities back to its original form.; lens: tool-purpose-v1; model: not recorded.
- Tool 18 (encode\_encode): ◇ AI reading; state: counted; none (confidence 0.94); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 18 purpose: ◇ AI reading; Converts plain text into rot13, base64, hex, URL, form or HTML-escaped ASCII output.; lens: tool-purpose-v1; model: not recorded.
- Tool 19 (hash\_digest): ◇ AI reading; state: counted; none (confidence 0.88); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 19 purpose: ◇ AI reading; Converts input text, base64 or hex into a checksum via MD5, SHA-1, SHA-256, SHA-512 or CRC32, shown as lowercase hex.; lens: tool-purpose-v1; model: not recorded.
- Tool 20 (hash\_hmac): ◇ AI reading; state: counted; none (confidence 0.9); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 20 purpose: ◇ AI reading; Returns a keyed hash (HMAC) of given text using md5, sha1, sha256 or sha512, as lowercase hex.; lens: tool-purpose-v1; model: not recorded.
- Tool 21 (iban\_validate): ◇ AI reading; state: counted; none (confidence 0.895); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 21 purpose: ◇ AI reading; Validates an IBAN by checking its country-specific length and mod-97 checksum, without parsing bank details.; lens: tool-purpose-v1; model: not recorded.
- Tool 22 (isbn\_validate): ◇ AI reading; state: counted; none (confidence 0.93); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 22 purpose: ◇ AI reading; Validates whether a given string is a correctly formed ISBN-10 or ISBN-13 by checking its checksum.; lens: tool-purpose-v1; model: not recorded.
- Tool 23 (jsonschema\_validate): ◇ AI reading; state: counted; none (confidence 0.91); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 23 purpose: ◇ AI reading; Checks a JSON document against a JSON Schema and reports one violation per call, if any.; lens: tool-purpose-v1; model: not recorded.
- Tool 24 (luhn\_validate): ◇ AI reading; state: counted; none (confidence 0.932); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 24 purpose: ◇ AI reading; Validates a digit string with the Luhn mod-10 check, as used for card and IMEI numbers.; lens: tool-purpose-v1; model: not recorded.
- Tool 25 (network\_cidr\_contains): ◇ AI reading; state: counted; none (confidence 0.95); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 25 purpose: ◇ AI reading; Checks whether an IP address falls inside a given CIDR network range, never matching across IPv4 and IPv6.; lens: tool-purpose-v1; model: not recorded.
- Tool 26 (network\_cidr\_info): ◇ AI reading; state: counted; none (confidence 0.88); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 26 purpose: ◇ AI reading; Returns the normalized network base, first-to-last address span, and size of a given CIDR range.; lens: tool-purpose-v1; model: not recorded.
- Tool 27 (network\_cidr\_overlaps): ◇ AI reading; state: counted; none (confidence 0.9); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 27 purpose: ◇ AI reading; Checks whether two IP address ranges in CIDR notation have any addresses in common.; lens: tool-purpose-v1; model: not recorded.
- Tool 28 (nip\_validate): ◇ AI reading; state: counted; none (confidence 0.9); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 28 purpose: ◇ AI reading; Validates whether a ten-digit Polish taxpayer number (NIP) passes its check-digit test, without changing any data.; lens: tool-purpose-v1; model: not recorded.
- Tool 29 (pesel\_validate): ◇ AI reading; state: counted; none (confidence 0.87); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 29 purpose: ◇ AI reading; Validates a Polish PESEL number's check digit and, if it passes, reports the embedded birth date and sex.; lens: tool-purpose-v1; model: not recorded.
- Tool 30 purpose: ◇ AI reading; Runs a chain of existing API operations in order, passing one result field into the next step and stopping at the first failure.; lens: tool-purpose-v1; model: not recorded.
- Tool 31 (random\_int): ◇ AI reading; state: counted; none (confidence 0.88); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 32 (regex\_extract): ◇ AI reading; state: counted; none (confidence 0.93); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 32 purpose: ◇ AI reading; Returns up to a set number of pattern matches found in a text input, with named capture groups listed separately.; lens: tool-purpose-v1; model: not recorded.
- Tool 33 (regex\_match): ◇ AI reading; state: counted; none (confidence 0.94); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 33 purpose: ◇ AI reading; Checks whether an input string matches a regular expression and reports the matched text and its capture groups.; lens: tool-purpose-v1; model: not recorded.
- Tool 34 (regex\_replace): ◇ AI reading; state: counted; none (confidence 0.88); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 34 purpose: ◇ AI reading; Converts input text by substituting every regex match of a pattern with a replacement that can use capture groups.; lens: tool-purpose-v1; model: not recorded.
- Tool 35 (regex\_split): ◇ AI reading; state: counted; none (confidence 0.93); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 35 purpose: ◇ AI reading; Returns the pieces of a text cut at each match of a regex, with an optional cap on how many pieces come back.; lens: tool-purpose-v1; model: not recorded.
- Tool 36 (regon\_validate): ◇ AI reading; state: counted; none (confidence 0.88); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 37 (rpncalc\_eval): ◇ AI reading; state: counted; none (confidence 0.88); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 37 purpose: ◇ AI reading; Returns the decimal result of a postfix math expression, covering arithmetic, roots, trig, logarithms and bitwise operations.; lens: tool-purpose-v1; model: not recorded.
- Tool 38 (swiftbic\_validate): ◇ AI reading; state: counted; none (confidence 0.9); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 38 purpose: ◇ AI reading; Validates whether a text string has the structural layout of a SWIFT/BIC bank code, without checking the country code against ISO.; lens: tool-purpose-v1; model: not recorded.
- Tool 39 (text\_charat): ◇ AI reading; state: counted; none (confidence 0.93); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 39 purpose: ◇ AI reading; Returns the single rune located at a given zero-based position within a supplied string.; lens: tool-purpose-v1; model: not recorded.
- Tool 40 (text\_count): ◇ AI reading; state: counted; none (confidence 0.94); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 40 purpose: ◇ AI reading; Returns the count of non-overlapping matches of a given substring within a text, counting characters rather than bytes.; lens: tool-purpose-v1; model: not recorded.
- Tool 41 (text\_palindrome): ◇ AI reading; state: counted; none (confidence 0.89); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 41 purpose: ◇ AI reading; Checks if a string is a palindrome, with optional case-folding and removal of non-alphanumeric characters.; lens: tool-purpose-v1; model: not recorded.
- Tool 42 (text\_reverse): ◇ AI reading; state: counted; none (confidence 0.9); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 42 purpose: ◇ AI reading; Converts a supplied string into its reverse, flipping characters by Unicode code point rather than by grapheme cluster.; lens: tool-purpose-v1; model: not recorded.
- Tool 43 (text\_sort): ◇ AI reading; state: counted; none (confidence 0.89); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 43 purpose: ◇ AI reading; Converts a given string by reordering its characters or words alphabetically, with words rejoined by single spaces.; lens: tool-purpose-v1; model: not recorded.
- Tool 44 (text\_stats): ◇ AI reading; state: counted; none (confidence 0.92); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 44 purpose: ◇ AI reading; Reports character, word and line counts, letter/digit/punctuation breakdowns, and word-length stats for a given text.; lens: tool-purpose-v1; model: not recorded.
- Tool 45 (text\_wordcount): ◇ AI reading; state: counted; none (confidence 0.93); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 45 purpose: ◇ AI reading; Returns a word total for submitted text, splitting words on whitespace.; lens: tool-purpose-v1; model: not recorded.
- Tool 46 (tokens\_count): ◇ AI reading; state: counted; none (confidence 0.93); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 46 purpose: ◇ AI reading; Returns the token count of a given text using an OpenAI tiktoken encoding, chosen by model or encoding name.; lens: tool-purpose-v1; model: not recorded.
- Tool 47 (units\_convert\_datasize): ◇ AI reading; state: counted; none (confidence 0.95); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 47 purpose: ◇ AI reading; Converts a decimal data-size value between bit, byte, SI and IEC units such as MB to MiB, with exact results.; lens: tool-purpose-v1; model: not recorded.
- Tool 48 (units\_convert\_temperature): ◇ AI reading; state: counted; none (confidence 0.88); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 48 purpose: ◇ AI reading; Converts a decimal temperature from one scale (C, F, or K) to another, accounting for their different zero points.; lens: tool-purpose-v1; model: not recorded.
- Tool 49 (url\_validate): ◇ AI reading; state: counted; none (confidence 0.91); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 49 purpose: ◇ AI reading; Validates whether a supplied text string is a correctly formed absolute web address with a scheme and host, without contacting it.; lens: tool-purpose-v1; model: not recorded.
- Tool 50 (uuid\_generate): ◇ AI reading; state: counted; none (confidence 0.89); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 51 (uuid\_validate): ◇ AI reading; state: counted; none (confidence 0.92); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 51 purpose: ◇ AI reading; Checks whether a text string is a valid UUID and states its version and variant.; lens: tool-purpose-v1; model: not recorded.
- Tool 52 (vateu\_validate): ◇ AI reading; state: counted; none (confidence 0.9); lens: side-effects@1; model: claude-haiku-5.5.
- Tool 52 purpose: ◇ AI reading; Validates the format of an EU VAT number against each country's pattern, without confirming it is actually registered.; lens: tool-purpose-v1; model: not recorded.

## Change history
No changes recorded in the retained history.

## Payment rails
- Protocols observed: none.
- HTTP 402 seen in retained observations: false.

## Not covered
- We don't call tools.
- We don't rate or certify.
- We don't publish prices.
- We cover only what was observed.

## Evidence
- Identity: observed / declared; observation time: 2026-11-12T20:05:15.429Z.
- Tools: declared; observation time: 2026-11-12T20:05:15.429Z.
- Effect readings (AI): AI reading; observation time: 2026-11-12T20:05:15.429Z.
- Change history: observed; observation time: 2026-11-12T20:05:15.429Z; change observation times: none.
- Payment rails: observed; observation time: 2026-11-12T20:05:15.429Z.

```json
{
  "schema": "interfacedelta-service-md/1",
  "target_key": "sha256:6bb564a1bd3e1c47cf12ad6ff1a44bc4e53538ad7a79a609df4be525678718fa",
  "origin": "https://apished.com",
  "protocols": [
    "mcp"
  ],
  "observed_at": "2026-11-12T20:05:15.429Z",
  "generated_at": "2026-11-13T02:04:20.339Z",
  "record_url": "https://interfacedelta.com/atlas/sha256:6bb564a1bd3e1c47cf12ad6ff1a44bc4e53538ad7a79a609df4be525678718fa",
  "record_api": "https://interfacedelta.com/api/v1/record/services/sha256:6bb564a1bd3e1c47cf12ad6ff1a44bc4e53538ad7a79a609df4be525678718fa",
  "source": "InterfaceDelta atlas",
  "license_note": "Use of this record is governed by https://interfacedelta.com/terms.",
  "identity": {
    "origin": "https://apished.com",
    "endpoints": [
      "https://apished.com/mcp"
    ],
    "protocols": [
      "mcp"
    ],
    "registry_names": [
      "com.apished/apished"
    ],
    "first_retained_observation": "2026-11-12T20:05:15.429Z",
    "latest_observation": "2026-11-12T20:05:15.429Z"
  },
  "tools": [
    {
      "name": "color_contrast",
      "protocol": "mcp",
      "inputs": [
        "colorA",
        "colorB"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.92
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Returns a luminance-based readability ratio for two hex colors, blending any transparency onto white first.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "color_convert",
      "protocol": "mcp",
      "inputs": [
        "from",
        "to",
        "value"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.93
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Converts colors among hex, RGB, HSL and HSV formats, returning the same color in the requested format.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "csv_from_json",
      "protocol": "mcp",
      "inputs": [
        "columns",
        "delimiter",
        "records"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.925
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Converts an array of JSON objects into CSV text, using an explicitly ordered column list for the header row.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "csv_parse",
      "protocol": "mcp",
      "inputs": [
        "delimiter",
        "text"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.955
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Converts CSV text into rows of plain string cells, with an optional custom delimiter and no type inference.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "csv_stats",
      "protocol": "mcp",
      "inputs": [
        "delimiter",
        "text"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.93
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Reports how many filled and blank cells each column has in CSV text that includes a header row.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "csv_to_json",
      "protocol": "mcp",
      "inputs": [
        "delimiter",
        "header",
        "text"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.92
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Converts pasted CSV text into JSON, either as objects keyed by header names or as raw row arrays, with all values as strings.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "csv_validate",
      "protocol": "mcp",
      "inputs": [
        "delimiter",
        "text"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.93
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Checks whether supplied CSV text has consistent column counts, with each row matching the field count of the first row.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "datemath_add",
      "protocol": "mcp",
      "inputs": [
        "date",
        "days",
        "months",
        "years"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.93
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Returns a date shifted by given year, month and day amounts, clamping to month-end when needed.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "datemath_age",
      "protocol": "mcp",
      "inputs": [
        "asOf",
        "birthDate"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.9
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Returns the completed years between a birth date and a chosen date, defaulting to today's UTC date.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "datemath_businessdays",
      "protocol": "mcp",
      "inputs": [
        "from",
        "holidays",
        "to",
        "weekdays"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.88
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Returns the number of working days between two dates, skipping weekends by default and any listed holiday dates.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "datemath_dayofweek",
      "protocol": "mcp",
      "inputs": [
        "date"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.84
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Returns the day name and ISO 8601 number (1 for Monday through 7 for Sunday) of a given date.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "datemath_diff",
      "protocol": "mcp",
      "inputs": [
        "from",
        "to"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.9
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Returns the count of whole days separating two YYYY-MM-DD dates, negative when the second comes first.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "datemath_leapyear",
      "protocol": "mcp",
      "inputs": [
        "year"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.91
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Verifies whether an integer year qualifies as a leap year using Gregorian calendar rules.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "datetime_now",
      "protocol": "mcp",
      "inputs": [
        "format",
        "timezone"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.853
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Returns the present date and time, optionally formatted and localized to a chosen timezone.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "ean_validate",
      "protocol": "mcp",
      "inputs": [
        "value"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.9
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Validates the check digit of a barcode number in EAN-8, UPC-A, EAN-13 or GTIN-14 format.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "email_validate",
      "protocol": "mcp",
      "inputs": [
        "value"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.9
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      }
    },
    {
      "name": "encode_decode",
      "protocol": "mcp",
      "inputs": [
        "format",
        "input"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.92
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Converts encoded text such as base64, hex, rot13 or HTML entities back to its original form.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "encode_encode",
      "protocol": "mcp",
      "inputs": [
        "format",
        "input"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.94
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Converts plain text into rot13, base64, hex, URL, form or HTML-escaped ASCII output.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "hash_digest",
      "protocol": "mcp",
      "inputs": [
        "algo",
        "encoding",
        "input"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.88
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Converts input text, base64 or hex into a checksum via MD5, SHA-1, SHA-256, SHA-512 or CRC32, shown as lowercase hex.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "hash_hmac",
      "protocol": "mcp",
      "inputs": [
        "algo",
        "encoding",
        "input",
        "key"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.9
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Returns a keyed hash (HMAC) of given text using md5, sha1, sha256 or sha512, as lowercase hex.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "iban_validate",
      "protocol": "mcp",
      "inputs": [
        "value"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.895
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Validates an IBAN by checking its country-specific length and mod-97 checksum, without parsing bank details.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "isbn_validate",
      "protocol": "mcp",
      "inputs": [
        "value"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.93
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Validates whether a given string is a correctly formed ISBN-10 or ISBN-13 by checking its checksum.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "jsonschema_validate",
      "protocol": "mcp",
      "inputs": [
        "document",
        "schema"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.91
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Checks a JSON document against a JSON Schema and reports one violation per call, if any.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "luhn_validate",
      "protocol": "mcp",
      "inputs": [
        "value"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.932
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Validates a digit string with the Luhn mod-10 check, as used for card and IMEI numbers.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "network_cidr_contains",
      "protocol": "mcp",
      "inputs": [
        "address",
        "cidr"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.95
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Checks whether an IP address falls inside a given CIDR network range, never matching across IPv4 and IPv6.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "network_cidr_info",
      "protocol": "mcp",
      "inputs": [
        "cidr"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.88
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Returns the normalized network base, first-to-last address span, and size of a given CIDR range.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "network_cidr_overlaps",
      "protocol": "mcp",
      "inputs": [
        "cidrA",
        "cidrB"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.9
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Checks whether two IP address ranges in CIDR notation have any addresses in common.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "nip_validate",
      "protocol": "mcp",
      "inputs": [
        "value"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.9
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Validates whether a ten-digit Polish taxpayer number (NIP) passes its check-digit test, without changing any data.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "pesel_validate",
      "protocol": "mcp",
      "inputs": [
        "value"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.87
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Validates a Polish PESEL number's check digit and, if it passes, reports the embedded birth date and sex.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "pipe_run",
      "protocol": "mcp",
      "inputs": [
        "steps"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": null,
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Runs a chain of existing API operations in order, passing one result field into the next step and stopping at the first failure.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "random_int",
      "protocol": "mcp",
      "inputs": [
        "count",
        "max",
        "min"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.88
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      }
    },
    {
      "name": "regex_extract",
      "protocol": "mcp",
      "inputs": [
        "input",
        "maxMatches",
        "pattern"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.93
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Returns up to a set number of pattern matches found in a text input, with named capture groups listed separately.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "regex_match",
      "protocol": "mcp",
      "inputs": [
        "input",
        "pattern"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.94
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Checks whether an input string matches a regular expression and reports the matched text and its capture groups.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "regex_replace",
      "protocol": "mcp",
      "inputs": [
        "input",
        "pattern",
        "replacement"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.88
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Converts input text by substituting every regex match of a pattern with a replacement that can use capture groups.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "regex_split",
      "protocol": "mcp",
      "inputs": [
        "input",
        "limit",
        "pattern"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.93
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Returns the pieces of a text cut at each match of a regex, with an optional cap on how many pieces come back.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "regon_validate",
      "protocol": "mcp",
      "inputs": [
        "value"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.88
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      }
    },
    {
      "name": "rpncalc_eval",
      "protocol": "mcp",
      "inputs": [
        "expr"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.88
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Returns the decimal result of a postfix math expression, covering arithmetic, roots, trig, logarithms and bitwise operations.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "swiftbic_validate",
      "protocol": "mcp",
      "inputs": [
        "value"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.9
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Validates whether a text string has the structural layout of a SWIFT/BIC bank code, without checking the country code against ISO.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "text_charat",
      "protocol": "mcp",
      "inputs": [
        "index",
        "text"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.93
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Returns the single rune located at a given zero-based position within a supplied string.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "text_count",
      "protocol": "mcp",
      "inputs": [
        "substring",
        "text"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.94
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Returns the count of non-overlapping matches of a given substring within a text, counting characters rather than bytes.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "text_palindrome",
      "protocol": "mcp",
      "inputs": [
        "ignoreCase",
        "ignoreNonAlnum",
        "text"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.89
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Checks if a string is a palindrome, with optional case-folding and removal of non-alphanumeric characters.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "text_reverse",
      "protocol": "mcp",
      "inputs": [
        "text"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.9
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Converts a supplied string into its reverse, flipping characters by Unicode code point rather than by grapheme cluster.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "text_sort",
      "protocol": "mcp",
      "inputs": [
        "by",
        "text"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.89
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Converts a given string by reordering its characters or words alphabetically, with words rejoined by single spaces.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "text_stats",
      "protocol": "mcp",
      "inputs": [
        "text"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.92
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Reports character, word and line counts, letter/digit/punctuation breakdowns, and word-length stats for a given text.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "text_wordcount",
      "protocol": "mcp",
      "inputs": [
        "text"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.93
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Returns a word total for submitted text, splitting words on whitespace.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "tokens_count",
      "protocol": "mcp",
      "inputs": [
        "encoding",
        "model",
        "text"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.93
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Returns the token count of a given text using an OpenAI tiktoken encoding, chosen by model or encoding name.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "units_convert_datasize",
      "protocol": "mcp",
      "inputs": [
        "from",
        "to",
        "value"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.95
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Converts a decimal data-size value between bit, byte, SI and IEC units such as MB to MiB, with exact results.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "units_convert_temperature",
      "protocol": "mcp",
      "inputs": [
        "from",
        "to",
        "value"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.88
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Converts a decimal temperature from one scale (C, F, or K) to another, accounting for their different zero points.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "url_validate",
      "protocol": "mcp",
      "inputs": [
        "value"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.91
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Validates whether a supplied text string is a correctly formed absolute web address with a scheme and host, without contacting it.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "uuid_generate",
      "protocol": "mcp",
      "inputs": [
        "count"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.89
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      }
    },
    {
      "name": "uuid_validate",
      "protocol": "mcp",
      "inputs": [
        "value"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.92
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Checks whether a text string is a valid UUID and states its version and variant.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    },
    {
      "name": "vateu_validate",
      "protocol": "mcp",
      "inputs": [
        "value"
      ],
      "inputs_omitted": 0,
      "annotations": {},
      "effects": {
        "marker": "◇ AI reading",
        "state": "counted",
        "classes": [
          {
            "class": "none",
            "confidence": 0.9
          }
        ],
        "lens": "side-effects@1",
        "model": "claude-haiku-5.5"
      },
      "purpose": {
        "marker": "◇ AI reading",
        "text": "Validates the format of an EU VAT number against each country's pattern, without confirming it is actually registered.",
        "lens": "tool-purpose-v1",
        "model": null
      }
    }
  ],
  "tools_omitted": 0,
  "tools_state": "recorded",
  "changes": [],
  "payment_rails": {
    "protocols": [],
    "http_402_seen": false
  },
  "not_covered": [
    "We don't call tools.",
    "We don't rate or certify.",
    "We don't publish prices.",
    "We cover only what was observed."
  ],
  "evidence": [
    {
      "section": "Identity",
      "classes": [
        "observed",
        "declared"
      ],
      "observed_at": "2026-11-12T20:05:15.429Z"
    },
    {
      "section": "Tools",
      "classes": [
        "declared"
      ],
      "observed_at": "2026-11-12T20:05:15.429Z"
    },
    {
      "section": "Effect readings (AI)",
      "classes": [
        "AI reading"
      ],
      "observed_at": "2026-11-12T20:05:15.429Z"
    },
    {
      "section": "Change history",
      "classes": [
        "observed"
      ],
      "observed_at": "2026-11-12T20:05:15.429Z",
      "observation_times": []
    },
    {
      "section": "Payment rails",
      "classes": [
        "observed"
      ],
      "observed_at": "2026-11-12T20:05:15.429Z"
    }
  ]
}
```
