{
  "name": "FluentEDI",
  "version": "1.0.0",
  "description": "A public HTTP API of deterministic tools for the work a language model cannot do reliably by reasoning: knowing the current time in any timezone and whether an instant falls inside a window, exact arithmetic, hashing and signature verification, canonicalizing and content-addressing JSON, repairing malformed JSON and pinpointing where it broke, querying and diffing structured data, parsing CSV correctly, converting units and colours, testing regular expressions, resolving DNS, and checking whether a URL is still live. Every tool is one stateless GET or POST returning JSON, and the same tools are exposed over the Model Context Protocol at /mcp. Coverage runs deepest in retail EDI — X12 850, 856, 810, 855 and 997 parsing and validation, and GS1 check digits — which no other free, unauthenticated service offers agents.",
  "authentication": "none",
  "endpoints": {
    "call_tool": "https://fluentedi.com/v1/{tool}",
    "batch": "https://fluentedi.com/v1/batch",
    "tool_registry": "https://fluentedi.com/v1/tools",
    "tool_reference": "https://fluentedi.com/v1/tools/{tool}",
    "mcp": "https://fluentedi.com/mcp",
    "openapi": "https://fluentedi.com/openapi.json",
    "llms_txt": "https://fluentedi.com/llms.txt",
    "llms_full_txt": "https://fluentedi.com/llms-full.txt"
  },
  "usage": {
    "get": "https://fluentedi.com/v1/time/now?timezone=Asia/Tokyo",
    "post": {
      "url": "https://fluentedi.com/v1/time/now",
      "body": {
        "timezone": "Asia/Tokyo"
      }
    },
    "batch": {
      "url": "https://fluentedi.com/v1/batch",
      "body": {
        "calls": [
          {
            "tool": "time.now",
            "args": {}
          },
          {
            "tool": "math.eval",
            "args": {
              "expression": "2^10"
            }
          }
        ]
      }
    },
    "response_shape": {
      "ok": true,
      "tool": "time.now",
      "result": "{ tool-specific fields }"
    },
    "error_shape": {
      "ok": false,
      "error": {
        "code": "invalid_input",
        "message": "…"
      },
      "schema": "{ parameters }",
      "examples": "[ working calls ]"
    }
  },
  "tool_count": 42,
  "tools": [
    {
      "name": "time.now",
      "group": "time",
      "summary": "Current date and time in any IANA timezone.",
      "url": "https://fluentedi.com/v1/time/now",
      "required": []
    },
    {
      "name": "time.convert",
      "group": "time",
      "summary": "Convert a timestamp between timezones.",
      "url": "https://fluentedi.com/v1/time/convert",
      "required": [
        "to"
      ]
    },
    {
      "name": "time.add",
      "group": "time",
      "summary": "Add or subtract a duration from a date, calendar-aware.",
      "url": "https://fluentedi.com/v1/time/add",
      "required": []
    },
    {
      "name": "time.diff",
      "group": "time",
      "summary": "Duration between two dates, in every unit.",
      "url": "https://fluentedi.com/v1/time/diff",
      "required": []
    },
    {
      "name": "time.window",
      "group": "time",
      "summary": "Test whether an instant falls inside a time window, and by how much it misses.",
      "url": "https://fluentedi.com/v1/time/window",
      "required": [
        "start"
      ]
    },
    {
      "name": "time.zones",
      "group": "time",
      "summary": "List or search IANA timezone identifiers with current offsets.",
      "url": "https://fluentedi.com/v1/time/zones",
      "required": []
    },
    {
      "name": "cron.next",
      "group": "schedule",
      "summary": "Validate a cron expression, explain it in English, and list its next run times.",
      "url": "https://fluentedi.com/v1/cron/next",
      "required": [
        "expression"
      ]
    },
    {
      "name": "json.query",
      "group": "data",
      "summary": "Extract values from a JSON document with a JSONPath expression.",
      "url": "https://fluentedi.com/v1/json/query",
      "required": [
        "json",
        "path"
      ]
    },
    {
      "name": "json.repair",
      "group": "data",
      "summary": "Repair malformed JSON and pinpoint the exact line and column when it cannot be repaired.",
      "url": "https://fluentedi.com/v1/json/repair",
      "required": [
        "input"
      ]
    },
    {
      "name": "json.canonical",
      "group": "data",
      "summary": "Canonicalize JSON (RFC 8785) and content-address it with SHA-256 and a CIDv1.",
      "url": "https://fluentedi.com/v1/json/canonical",
      "required": [
        "json"
      ]
    },
    {
      "name": "json.diff",
      "group": "data",
      "summary": "Structural difference between two JSON documents, as RFC 6902-style operations.",
      "url": "https://fluentedi.com/v1/json/diff",
      "required": [
        "a",
        "b"
      ]
    },
    {
      "name": "json.schema",
      "group": "data",
      "summary": "Infer a JSON Schema from an example document.",
      "url": "https://fluentedi.com/v1/json/schema",
      "required": [
        "json"
      ]
    },
    {
      "name": "api.diff",
      "group": "data",
      "summary": "Diff an API's declared contract against payloads it actually returned; classify the drift.",
      "url": "https://fluentedi.com/v1/api/diff",
      "required": [
        "observed"
      ]
    },
    {
      "name": "csv.convert",
      "group": "data",
      "summary": "Convert between CSV and JSON with correct quote handling.",
      "url": "https://fluentedi.com/v1/csv/convert",
      "required": [
        "input"
      ]
    },
    {
      "name": "text.stats",
      "group": "text",
      "summary": "Count characters, words, bytes, sentences and estimated tokens; score readability.",
      "url": "https://fluentedi.com/v1/text/stats",
      "required": [
        "text"
      ]
    },
    {
      "name": "text.case",
      "group": "text",
      "summary": "Convert a string to camelCase, snake_case, kebab-case, Title Case, a URL slug and more.",
      "url": "https://fluentedi.com/v1/text/case",
      "required": [
        "text"
      ]
    },
    {
      "name": "text.diff",
      "group": "text",
      "summary": "Unified diff between two texts, with change statistics and a similarity score.",
      "url": "https://fluentedi.com/v1/text/diff",
      "required": [
        "a",
        "b"
      ]
    },
    {
      "name": "regex.test",
      "group": "text",
      "summary": "Test a regular expression against text and inspect every match and capture group.",
      "url": "https://fluentedi.com/v1/regex/test",
      "required": [
        "pattern",
        "text"
      ]
    },
    {
      "name": "hash",
      "group": "crypto",
      "summary": "Hash or HMAC-sign text with MD5, SHA-1, SHA-256/384/512 or CRC32.",
      "url": "https://fluentedi.com/v1/hash",
      "required": [
        "input"
      ]
    },
    {
      "name": "crypto.verify",
      "group": "crypto",
      "summary": "Verify an Ed25519, ECDSA, RSA or HMAC signature against a message and public key.",
      "url": "https://fluentedi.com/v1/crypto/verify",
      "required": [
        "message",
        "signature",
        "public_key"
      ]
    },
    {
      "name": "jwt.decode",
      "group": "crypto",
      "summary": "Decode a JWT and check its expiry, optionally verifying an HMAC signature.",
      "url": "https://fluentedi.com/v1/jwt/decode",
      "required": [
        "token"
      ]
    },
    {
      "name": "encode",
      "group": "crypto",
      "summary": "Convert text between base64, base64url, hex, URL and HTML encodings.",
      "url": "https://fluentedi.com/v1/encode",
      "required": [
        "input"
      ]
    },
    {
      "name": "id.generate",
      "group": "crypto",
      "summary": "Generate UUIDv4, UUIDv7, ULID, nanoid or short random IDs.",
      "url": "https://fluentedi.com/v1/id/generate",
      "required": []
    },
    {
      "name": "math.eval",
      "group": "compute",
      "summary": "Evaluate a mathematical expression exactly.",
      "url": "https://fluentedi.com/v1/math/eval",
      "required": [
        "expression"
      ]
    },
    {
      "name": "unit.convert",
      "group": "compute",
      "summary": "Convert between units of length, mass, temperature, data, time, speed, area, volume, pressure, energy and angle.",
      "url": "https://fluentedi.com/v1/unit/convert",
      "required": []
    },
    {
      "name": "color.convert",
      "group": "compute",
      "summary": "Convert a colour between hex, RGB, HSL and OKLCh, and check WCAG contrast.",
      "url": "https://fluentedi.com/v1/color/convert",
      "required": [
        "color"
      ]
    },
    {
      "name": "url.parse",
      "group": "web",
      "summary": "Parse, normalise or resolve a URL and break out its query parameters.",
      "url": "https://fluentedi.com/v1/url/parse",
      "required": [
        "url"
      ]
    },
    {
      "name": "url.scan",
      "group": "web",
      "summary": "Detect credentials, tokens and personal data leaking in a URL, and return a redacted version.",
      "url": "https://fluentedi.com/v1/url/scan",
      "required": [
        "url"
      ]
    },
    {
      "name": "secret.scan",
      "group": "web",
      "summary": "Find credentials and personal data in text, and return a redacted copy safe to share.",
      "url": "https://fluentedi.com/v1/secret/scan",
      "required": [
        "text"
      ]
    },
    {
      "name": "http.check",
      "group": "web",
      "summary": "Check whether a URL is still live: status, redirect chain, and whether a citation still says what it said.",
      "url": "https://fluentedi.com/v1/http/check",
      "required": [
        "url"
      ]
    },
    {
      "name": "http.assert",
      "group": "web",
      "summary": "Verify a URL actually returns what you expected — status, headers, JSON values — and return a pass/fail proof.",
      "url": "https://fluentedi.com/v1/http/assert",
      "required": [
        "url"
      ]
    },
    {
      "name": "dns.lookup",
      "group": "web",
      "summary": "Resolve DNS records (A, AAAA, MX, TXT, NS, CNAME, SOA, CAA and more).",
      "url": "https://fluentedi.com/v1/dns/lookup",
      "required": [
        "name"
      ]
    },
    {
      "name": "net.inspect",
      "group": "web",
      "summary": "Report the caller's IP, geolocation, network and TLS details as seen from the edge.",
      "url": "https://fluentedi.com/v1/net/inspect",
      "required": []
    },
    {
      "name": "edi.parse",
      "group": "edi",
      "summary": "Parse an X12 EDI document (850, 856, 810, 855, 997 and others) into structured JSON.",
      "url": "https://fluentedi.com/v1/edi/parse",
      "required": [
        "input"
      ]
    },
    {
      "name": "edi.validate",
      "group": "edi",
      "summary": "Check an X12 document's envelope integrity and 856 HL hierarchy for the errors that cause rejections.",
      "url": "https://fluentedi.com/v1/edi/validate",
      "required": [
        "input"
      ]
    },
    {
      "name": "edi.build",
      "group": "edi",
      "summary": "Generate a valid X12 856 ASN or 850 purchase order from JSON, with correct HL pointers and envelope counts.",
      "url": "https://fluentedi.com/v1/edi/build",
      "required": [
        "data"
      ]
    },
    {
      "name": "edi.acknowledge",
      "group": "edi",
      "summary": "Read a 997 or 999 acknowledgment and say which documents were accepted, which were rejected, and why.",
      "url": "https://fluentedi.com/v1/edi/acknowledge",
      "required": [
        "input"
      ]
    },
    {
      "name": "gs1.checkdigit",
      "group": "edi",
      "summary": "Calculate or validate a GS1 mod-10 check digit for SSCC-18, GTIN-14/13/12/8 and UPC.",
      "url": "https://fluentedi.com/v1/gs1/checkdigit",
      "required": [
        "code"
      ]
    },
    {
      "name": "id.validate",
      "group": "edi",
      "summary": "Validate an identifier's checksum: IBAN, card, ISBN, ISSN, ISIN, CUSIP, LEI, routing number, IMEI, ORCID, GTIN, VIN, GSTIN and more.",
      "url": "https://fluentedi.com/v1/id/validate",
      "required": [
        "value"
      ]
    },
    {
      "name": "tool.search",
      "group": "meta",
      "summary": "Find the right tool for a task by describing it in plain language.",
      "url": "https://fluentedi.com/v1/tool/search",
      "required": [
        "q"
      ]
    },
    {
      "name": "tool.describe",
      "group": "meta",
      "summary": "Get the full parameter schema and worked examples for one tool.",
      "url": "https://fluentedi.com/v1/tool/describe",
      "required": [
        "name"
      ]
    },
    {
      "name": "tool.call",
      "group": "meta",
      "summary": "Invoke any tool by name, including ones not in the default listing.",
      "url": "https://fluentedi.com/v1/tool/call",
      "required": [
        "tool"
      ]
    }
  ]
}