{
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json",
  "name": "be.jithox/engine",
  "title": "Jithox Engine",
  "description": "Read-only business tools for the agentic web: EU VIES / KBO company verification, invoice formatting and PDF generation, web reading, transcription and drafting blocks — metered per call. Nothing on this endpoint sends, posts, pays or delivers. No compliance outcome is guaranteed: results are technical evidence.",
  "version": "1.0.0",
  "websiteUrl": "https://jithox.com",
  "documentationUrl": "https://jithox.com/ai-systems",
  "remotes": [
    {
      "type": "streamable-http",
      "url": "https://jithox.com/api/mcp"
    }
  ],
  "authentication": {
    "type": "bearer",
    "description": "Send `Authorization: Bearer <token>`. Machine clients obtain a token via OAuth 2.0 client_credentials at /api/oauth/token; signed-in humans may use their session token. tools/list is open; tools/call without a valid bearer fails closed per tool.",
    "tokenUrl": "https://jithox.com/api/oauth/token"
  },
  "tools": [
    {
      "name": "format_peppol_invoice",
      "description": "Generate a compliant UBL 2.1 / Peppol BIS Billing 3.0 e-invoice XML from structured invoice fields (supplier, customer, line items, VAT).",
      "sideEffecting": false,
      "pricing": "€0.05 per successful call"
    },
    {
      "name": "kbo_company_search",
      "description": "Look up an official European company by VAT or enterprise number via the free EU VIES register — any EU member state, including the Belgian KBO/BCE. Returns its registered name, VAT id, address, and status. Read-only; pairs with format_peppol_invoice to resolve a buyer.",
      "sideEffecting": false,
      "pricing": "€0.02 per successful call"
    },
    {
      "name": "review_invoice",
      "description": "Review one structured invoice end to end and say whether it can be sent as an e-invoice. Checks the Peppol field contract, recomputes every line total and the document total, verifies the supplier and customer VAT numbers against the free EU VIES register, and builds the UBL 2.1 / Peppol BIS Billing 3.0 document. Returns findings with a concrete fix for each, plus a draft e-mail and the XML export. Reads structured invoice data only — no OCR, so PDFs and scans are refused rather than guessed at. Read-only: it never sends, files, pays or signs, and a VAT check that cannot reach the register is reported as `unknown`, never as a pass or a failure.",
      "sideEffecting": false,
      "pricing": "€0.08 per review the VAT register answered"
    },
    {
      "name": "generate_pdf_invoice",
      "description": "Generate a polished, human-readable PDF invoice from structured invoice data (supplier, customer, line items, totals) and return it as a base64-encoded document. Local rendering; pairs with send_email_resend to email the PDF as invoice.pdf.",
      "sideEffecting": false,
      "pricing": "€0.02 per successful call"
    },
    {
      "name": "core_condition",
      "description": "Router / IF-ELSE block: compare two values (e.g. invoice amount > 1000) and route the workflow down a True or False branch. Local, free, side-effect-free — the building block for conditional automations.",
      "sideEffecting": false,
      "pricing": "included"
    },
    {
      "name": "verify_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.",
      "sideEffecting": false,
      "pricing": "included"
    },
    {
      "name": "check_peppol_ready",
      "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.",
      "sideEffecting": false,
      "pricing": "included"
    },
    {
      "name": "lookup_peppol_participant",
      "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.",
      "sideEffecting": false,
      "pricing": "included"
    },
    {
      "name": "check_payment_change",
      "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.",
      "sideEffecting": false,
      "pricing": "included"
    },
    {
      "name": "file_to_data_inspect",
      "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.",
      "sideEffecting": false,
      "pricing": "included"
    },
    {
      "name": "file_to_data_transform",
      "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.",
      "sideEffecting": false,
      "pricing": "included"
    },
    {
      "name": "check_vat_list",
      "description": "Check a whole LIST of EU VAT numbers against the EU VIES register in one call — up to 20 rows of { reference?, vatId }, answered row for row in the same order. Two tiers. FREE, always: each number is normalised and checked locally — empty, malformed for its member state, a duplicate of an earlier row, or not covered (GB, CH, NO and every non-EU prefix are `not_covered`, never `invalid`). METERED: each well-formed, unique row is looked up live in VIES and comes back `valid` (with the registered name when the member state shares it), `invalid`, or `unknown`. PRICE: 1 credits (EUR 0.01) PER ROW THE REGISTER ANSWERED (valid or invalid), charged once after the call. The most a call can cost is that price times its rows (20 credits for a full call), and the balance must cover that before it runs. UNKNOWN COSTS NOTHING: a member state that is down, a rate limit or a row the 40-second time budget did not reach is `unknown` with the reason — never `invalid`. To retry, send ONLY the rows listed in `retry.indexes`; rows that already have an answer do not need to be sent again. The same payload re-sent within ten minutes is charged once. Coverage: the 27 EU member states (Greece as EL or GR); Northern Ireland (XI) numbers are checked for shape only. Optional requesterVatId, your own EU VAT number with its country prefix: each answered row then carries the European Commission's consultation number, registered to you, and a requester VIES refuses costs nothing (those rows come back `unknown`, never `invalid`). Read-only; nothing is stored. A valid number today says nothing about tomorrow, and this is not a tax opinion.",
      "sideEffecting": false,
      "pricing": "€0.01 per answered row"
    },
    {
      "name": "check_vat_list_format",
      "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.",
      "sideEffecting": false,
      "pricing": "included"
    },
    {
      "name": "fetch_web_markdown",
      "description": "Read a public web page and return its text as clean Markdown for an agent to reason over — no HTML/scripts/styles. Bounded: 5s timeout, byte-capped fetch, truncated output. Read-only; runs without approval.",
      "sideEffecting": false,
      "pricing": "€0.02 per successful call"
    },
    {
      "name": "transcribe_and_slice_audio",
      "description": "Voice-to-action: download or accept an audio recording, split it into frame-aligned MP3 chunks, and transcribe it to text via an AI speech endpoint — so a user can dictate a task instead of typing. Bounded: 5s download timeout, 25MB cap, chunk-capped. Read-only; runs without approval.",
      "sideEffecting": false,
      "pricing": "€0.05 per successful call"
    },
    {
      "name": "analyze_kbo_financials",
      "description": "From a Belgian VAT / KBO number, read a CONNECTED company-financials register and return what it holds: founding year, active status, balance-sheet health, a risk score, solvency and liquidity ratios. It answers only from that register — with none connected, or one that cannot be reached, it returns 503 and charges nothing rather than an estimate. It never derives a credit profile from the number itself, and it is not a credit decision.",
      "sideEffecting": false,
      "pricing": "€0.03 per successful call"
    },
    {
      "name": "parse_receipt_vision",
      "description": "Multi-modal receipt/invoice parser: from a photo (URL or base64), use a vision LLM to extract merchant, total, VAT, date, currency and line items as clean JSON. Bounded: 5MB image cap, 5s download timeout. Read-only.",
      "sideEffecting": false,
      "pricing": "€0.04 per successful call"
    },
    {
      "name": "draft_social_content",
      "description": "Turn a topic + research into ready-to-review social post drafts (LinkedIn, X, Instagram, Facebook, or general). Text only — it never posts or sends; publishing stays a separate, approval-gated step.",
      "sideEffecting": false,
      "pricing": "€0.02 per successful call"
    },
    {
      "name": "monitor_sources",
      "description": "Watch the tenant's APPROVED sources (own changelog, notes, RSS feeds, GitHub releases, approved pages) for real changes and store grounded signal records for drafting. Reads only registered https sources (SSRF-guarded); writes only this tenant's Memory Vault. Never posts.",
      "sideEffecting": false,
      "pricing": "€0.02 per successful call"
    }
  ],
  "x-jithox": {
    "agentContext": "https://jithox.com/api/agent-context/v1",
    "gatewayBootstrap": "https://jithox.com/api/agent-bootstrap/v2",
    "currency": "EUR",
    "billing": "Prepaid Agent Credits (1 credit = €0.01), deducted once per successful execution; idempotent per run.",
    "dryRun": "Every tool ships a faithful simulator — preview without side effects or cost through the Jithox workspace.",
    "canonicalPublicProduct": {
      "name": "Jithox E-Invoice",
      "productPage": "https://jithox.com/mcp",
      "endpoint": "https://mcp.jithox.com/mcp",
      "documentation": "https://mcp.jithox.com",
      "note": "Jithox E-Invoice is the flagship public Jithox MCP product for EU B2B e-invoicing readiness: a separate remote MCP server with exactly five read-only tools. It is one of the servers listed in `publicPortfolio`; this engine endpoint is not one of them."
    },
    "connectionGateway": {
      "endpoint": "https://jithox.com/api/agent-connection/v1/mcp",
      "transport": "streamable-http",
      "protectedResourceMetadata": "https://jithox.com/.well-known/oauth-protected-resource/api/agent-connection/v1/mcp",
      "toolsList": "POST tools/list to this endpoint. It is free and needs no credential. The `tools` array in this file is NOT that list.",
      "note": "The tools of the live per-product servers in `publicPortfolio` and the Jithox Labs actions are called through this gateway. Of the `tools` in this file, only `lookup_peppol_participant` is also served here; every other one runs only on `remotes[0]`. tools/call on this gateway needs a Jithox connection credential. A signed-in person creates that connection on the account page and chooses its scopes and budget; every paid call is checked against them first. An agent cannot create a connection on its own.",
      "createConnection": "https://jithox.com/mcp/account#connection"
    },
    "firstCallMeaning": {
      "discoveryVsExecution": "initialize and tools/list are discovery: free, no credential, and they execute nothing. Only tools/call runs a tool; a green handshake proves reachability, not a result.",
      "authenticationVsPayment": "tools/call needs a credential your MCP client obtains through the server's OAuth consent screen (or a connection you created once on your account page). Authentication is not payment: a call is charged from your prepaid balance only when it returns an accepted result; the first 25 accepted calls per workspace are free for 14 days.",
      "formatVsRegistry": "A format check (validate_vat_number, check_registration_number_format) that answers valid or FORMAT_VALID proves only that the identifier is well-formed — not that it exists or is active; an invalid or needs_review answer proves the opposite or nothing. A registry check (verify_vat_vies, verify_company_registration) asks the official source and can answer unavailable when that source does not.",
      "nextStep": "Add the server URL to your MCP client, let it complete the consent screen, then make one call from your client. If your client cannot open a browser, create a connection on your account page and send it as a bearer header — the same scopes, revocable there.",
      "whatAnErrorProves": "401 means no valid credential reached the server — not that the tool is missing or that anything ran. A JSON-RPC error carries a stable code and a recovery.next_step; under the published pricing contract only accepted results are charged, so an error is not an accepted result — your account page lists every charge. A transport failure or 5xx after tools/call was sent means the outcome is UNKNOWN: check before you retry, never retry blindly."
    },
    "publicPortfolio": {
      "note": "Each entry is its own remote MCP server with its own OAuth authorization server: register against the endpoint you intend to call. `available: false` means not on sale right now, not absent. Prices live in the pricing contract, never here.",
      "pricingContract": "https://jithox.com/api/pricing/v1",
      "capabilities": "https://jithox.com/api/capabilities/v1",
      "servers": [
        {
          "productId": "einvoice",
          "name": "Jithox E-Invoice",
          "productPage": "https://jithox.com/mcp/einvoice",
          "endpoint": "https://mcp.jithox.com/mcp",
          "available": true,
          "tools": [
            "validate_invoice",
            "validate_vat_number",
            "verify_vat_vies",
            "lookup_peppol_participant",
            "get_einvoice_readiness"
          ],
          "task": "Check whether a counterparty and an invoice are ready for European e-invoicing before anything is sent.",
          "transport": "streamable-http",
          "authentication": "OAuth 2.1 with PKCE (S256). The server is its own OAuth resource.",
          "oauthProtectedResourceMetadata": "https://mcp.jithox.com/.well-known/oauth-protected-resource",
          "clientServerName": "jithox-einvoice",
          "clientConfig": "{\n  \"servers\": {\n    \"jithox-einvoice\": {\n      \"type\": \"http\",\n      \"url\": \"https://mcp.jithox.com/mcp\"\n    }\n  }\n}",
          "firstCall": {
            "tool": "validate_invoice",
            "arguments": "{ \"invoice\": { \"id\": \"INV-1\", \"issueDate\": \"2026-08-03\",\n              \"supplier\": { \"vatNumber\": \"BE0403170701\" } } }"
          }
        },
        {
          "productId": "eu-import-preflight",
          "name": "EU Import Preflight",
          "productPage": "https://jithox.com/mcp/import",
          "endpoint": "https://import.mcp.jithox.com/mcp",
          "available": true,
          "tools": [
            "validate_eori",
            "search_taric_codes",
            "check_eu_import_measures",
            "estimate_low_value_import_cost",
            "prepare_import_preflight_receipt"
          ],
          "task": "Preflight an EU import before it happens: identity, classification candidates, applicable measures and landed cost.",
          "transport": "streamable-http",
          "authentication": "OAuth 2.1 with PKCE (S256). Its own OAuth resource — an E-Invoice token is refused here.",
          "oauthProtectedResourceMetadata": "https://import.mcp.jithox.com/.well-known/oauth-protected-resource",
          "clientServerName": "jithox-import",
          "clientConfig": "{\n  \"servers\": {\n    \"jithox-import\": {\n      \"type\": \"http\",\n      \"url\": \"https://import.mcp.jithox.com/mcp\"\n    }\n  }\n}",
          "firstCall": {
            "tool": "validate_eori",
            "arguments": "{ \"eori\": \"BE0403170701\" }"
          }
        },
        {
          "productId": "eu-energy-label-preflight",
          "name": "EU Energy Label Preflight",
          "productPage": "https://jithox.com/mcp/energy",
          "endpoint": "https://energy.mcp.jithox.com/mcp",
          "available": true,
          "tools": [
            "search_eprel_products",
            "get_eprel_product_record",
            "get_eprel_energy_label_data",
            "compare_eprel_product_metrics",
            "prepare_energy_label_preflight_receipt"
          ],
          "task": "Look up supplier-declared EPREL records and energy-label data before a product claim is made.",
          "transport": "streamable-http",
          "authentication": "OAuth 2.1 with PKCE (S256). Its own OAuth resource.",
          "oauthProtectedResourceMetadata": "https://energy.mcp.jithox.com/.well-known/oauth-protected-resource",
          "clientServerName": "jithox-energy",
          "clientConfig": "{\n  \"servers\": {\n    \"jithox-energy\": {\n      \"type\": \"http\",\n      \"url\": \"https://energy.mcp.jithox.com/mcp\"\n    }\n  }\n}",
          "firstCall": {
            "tool": "search_eprel_products",
            "arguments": "{ \"modelIdentifier\": \"WM14N201NL\", \"productGroup\": \"washingmachines2019\" }"
          }
        },
        {
          "productId": "be-commerce-preflight",
          "name": "Commerce Preflight",
          "productPage": "https://jithox.com/mcp/commerce",
          "endpoint": "https://commerce.mcp.jithox.com/mcp",
          "available": false,
          "tools": [
            "search_retail_products",
            "get_product_offer",
            "compare_product_offers",
            "build_affiliate_buy_link",
            "get_commerce_readiness"
          ],
          "task": "Search retail products, read current offers in integer cents, compare them as a value table, and hand a human an official buy link — before anyone spends anything. Searching and comparing are market-agnostic; only the connected source is local, and every answer declares the markets it covers.",
          "transport": "streamable-http",
          "authentication": "OAuth 2.1 with PKCE (S256). Its own OAuth resource.",
          "oauthProtectedResourceMetadata": "https://commerce.mcp.jithox.com/.well-known/oauth-protected-resource",
          "clientServerName": "jithox-commerce",
          "clientConfig": "{\n  \"servers\": {\n    \"jithox-commerce\": {\n      \"type\": \"http\",\n      \"url\": \"https://commerce.mcp.jithox.com/mcp\"\n    }\n  }\n}",
          "firstCall": {
            "tool": "search_retail_products",
            "arguments": "{ \"query\": \"espresso machine\" }"
          }
        },
        {
          "productId": "eu-sanctions-preflight",
          "name": "EU Counterparty Sanctions Preflight",
          "productPage": "https://jithox.com/mcp/sanctions",
          "endpoint": "https://sanctions.mcp.jithox.com/mcp",
          "available": true,
          "tools": [
            "screen_sanctioned_name",
            "screen_sanctioned_identifier",
            "get_sanctions_listing",
            "list_sanctions_regimes",
            "prepare_screening_receipt"
          ],
          "task": "Screen a counterparty against the EU consolidated financial sanctions list, with a vocabulary that never turns a no-match into clearance.",
          "transport": "streamable-http",
          "authentication": "OAuth 2.1 with PKCE (S256). Its own OAuth resource.",
          "oauthProtectedResourceMetadata": "https://sanctions.mcp.jithox.com/.well-known/oauth-protected-resource",
          "clientServerName": "jithox-sanctions",
          "clientConfig": "{\n  \"servers\": {\n    \"jithox-sanctions\": {\n      \"type\": \"http\",\n      \"url\": \"https://sanctions.mcp.jithox.com/mcp\"\n    }\n  }\n}",
          "firstCall": {
            "tool": "screen_sanctioned_name",
            "arguments": "{ \"name\": \"Example Trading FZE\" }"
          }
        }
      ]
    }
  }
}