{
  "name": "Jithox",
  "description": "Jithox wants to be the independent gate between an AI agent and a payment. Today it offers free, read-only checks an agent can run before it pays or sends an invoice: a changed supplier bank account, an IBAN, Peppol readiness and VAT number formats. Each skill below is an MCP tool on https://jithox.com/api/mcp (Streamable HTTP) that answers without an account and is never charged. Jithox does not speak an A2A binding: call the tools over MCP. Nothing here sends, posts or pays. A result is evidence for one question, not legal or tax approval.",
  "supportedInterfaces": [
    {
      "url": "https://jithox.com/api/mcp",
      "protocolBinding": "https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#streamable-http",
      "protocolVersion": "1.0"
    }
  ],
  "provider": {
    "organization": "Jithox (Victor-Emmanuel Charlier, KBO 1039.898.594)",
    "url": "https://jithox.com/about"
  },
  "version": "1.0.0",
  "documentationUrl": "https://jithox.com/llms.txt",
  "capabilities": {
    "streaming": false,
    "pushNotifications": false,
    "extendedAgentCard": false,
    "extensions": [
      {
        "uri": "https://jithox.com/.well-known/agent-card.json#links-v1",
        "description": "Where to go next. mcp: the endpoint; openapi: the paid VAT check over plain HTTP; llms: the plain-text index of every public source; about: who runs Jithox; securityTxt: how to report a vulnerability (info.jithox@gmail.com).",
        "required": false,
        "params": {
          "mcp": "https://jithox.com/api/mcp",
          "openapi": "https://jithox.com/openapi.json",
          "llms": "https://jithox.com/llms.txt",
          "about": "https://jithox.com/about",
          "securityTxt": "https://jithox.com/.well-known/security.txt",
          "mcpServerCard": "https://jithox.com/.well-known/mcp/server-card.json"
        }
      }
    ]
  },
  "defaultInputModes": [
    "application/json"
  ],
  "defaultOutputModes": [
    "application/json"
  ],
  "skills": [
    {
      "id": "verify_iban",
      "name": "Check an IBAN",
      "description": "Check a payment account number (IBAN) before paying or before sending an invoice: ISO 13616 structure and ISO 7064 check digits, for 70+ countries, offline and free. Catches the single mistyped character a format check cannot. Optionally reports whether the account is issued in the country of the party being paid — as an observation, not a fraud verdict. It never claims the account exists or who owns it.",
      "tags": [
        "payment",
        "iban"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "check_peppol_ready",
      "name": "Check an e-invoice against Peppol rules",
      "description": "Before you send an e-invoice: will the Peppol network accept it? Checks the invoice against 21 published Peppol BIS Billing 3.0 rules — the ones that actually fail in practice: a missing buyer or order reference, a missing electronic address for either party, an address stated under a scheme code that does not exist, totals that do not add up, a date in the wrong format. Every finding names the official rule (PEPPOL-EN16931-R003, BR-CO-15 …), quotes its text and says what to change. Offline and free. It checks a listed subset of a much larger rule set and is not the official validator: a clean result means nothing among these rules is wrong, never that the network will accept the document.",
      "tags": [
        "e-invoice",
        "peppol"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "lookup_peppol_participant",
      "name": "Can this company receive a Peppol e-invoice?",
      "description": "Can this customer receive an e-invoice over Peppol today — and if the send still fails, is it his problem, yours, or your software's? Asks the live Peppol registers about a THIRD PARTY: the public directory, the lookup the network uses today, and the lookup Peppol retired. Returns whether he is reachable, which document types his access point accepts, and — the part nobody else answers — who to call when it still does not work. A customer found by the current lookup but not by the retired one is reachable, and software reporting him as absent is asking the question Peppol retired: a message for the software vendor, not for the customer. Free, read-only, nothing stored. Do not confuse it with check_peppol_ready, which checks YOUR OWN invoice against the rules offline. It is never a promise that an invoice will arrive, be accepted or be paid — every answer says so.",
      "tags": [
        "e-invoice",
        "peppol",
        "registry"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "check_payment_change",
      "name": "Check a changed supplier bank account",
      "description": "A supplier says their bank details changed: check the request before the vendor record is touched. Validates the new IBAN (structure and check digits, 70+ countries), compares it with the account on file, and flags an account that moved to another country or sits outside the supplier's country. Returns no_change, verify_first, stop or invalid_new_account, with the call-back steps a person must still take. Offline and free. It never says an account is safe, and never claims who owns it.",
      "tags": [
        "payment",
        "iban",
        "fraud",
        "accounts-payable"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "file_to_data_inspect",
      "name": "Read a business file and propose a mapping",
      "description": "Step 1 of turning a business file into data: hand in a supplier price list, a customer import or an order file (CSV or other delimited text, XLSX, JSON, NDJSON; at most 3 MiB, 50,000 rows, 200 columns). Returns the recognised columns and types, a PROPOSED mapping to a built-in target schema (supplier_price_list, customer_import, order_lines) or to your own, each line with a confidence and a reason, the issues found so far, and the limits with how much the file used. The proposal is deterministic arithmetic over headers (EN/NL/FR/DE/ES) and column types — no AI — and nothing is carried out until you send it to file_to_data_transform. Free, no account, nothing is stored; formulas and macros are never executed.",
      "tags": [
        "data",
        "csv",
        "xlsx"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "file_to_data_transform",
      "name": "Turn a business file into rows",
      "description": "Step 2: carry out EXACTLY the mapping you send (normally the proposal of file_to_data_inspect, corrected). Returns the rows as JSON, the same as CSV text, an error report per row (JSON and CSV), counts, and fileSha256, mappingSha256 and resultSha256 — the same file and mapping always give the same result, so a lost call is simply repeated and compared. It never corrects silently: leading zeros and long ids stay as written, a number is read only under the mapping's decimal mark, an ambiguous date stays unconverted with an issue, a missing value stays null. Large results are paged (offset / limit / page.nextOffset). Free, no account, nothing is stored; over a limit is a refusal that names the limit, never a partial result.",
      "tags": [
        "data",
        "csv",
        "xlsx"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "check_vat_list_format",
      "name": "Check the format of a list of EU VAT numbers",
      "description": "The FREE half of check_vat_list: normalise and check up to 20 VAT numbers locally — no register, no network, no account, no cost. Says per row whether the number is empty, malformed for its member state (the published VIES shape per country; the Belgian check digit is verified), a duplicate of an earlier row, or not covered by VIES (GB, CH, NO … are `not_covered`, never `invalid`). `register` is always `not_run`: a well-formed number is NOT a registered one. Use it to clean a list first, then send the well-formed rows to check_vat_list.",
      "tags": [
        "vat",
        "eu"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    }
  ],
  "iconUrl": "https://jithox.com/icon.png"
}