Jithox EU business checks

EU business checks: VAT/VIES, IBAN, Peppol, KBO lookup. 16 of 19 tools need no token.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
97%
Naming quality
93%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~10,745Tokens (tool definitions)
~4.7 KBTypical response size
Significant attention impact (8.39% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "jithox": {
      "url": "https://jithox.com/api/mcp"
    }
  }
}

Remote endpoints

https://jithox.com/api/mcpstreamable-http

What it can do

Tool inventory

Tools (19)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢format_peppol_invoice(invoiceNumber, issueDate, dueDate, currency, buyerReference, ...)

Generate a compliant UBL 2.1 / Peppol BIS Billing 3.0 e-invoice XML from structured invoice fields (supplier, customer, line items, VAT).

Input Schema

{
  "type": "object",
  "properties": {
    "invoiceNumber": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80,
      "description": "Human-readable invoice number, e.g. \"INV-2026-0001\"."
    },
    "issueDate": {
      "type": "string",
      "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
      "description": "Issue date (YYYY-MM-DD)."
    },
    "dueDate": {
      "description": "Optional payment due date (YYYY-MM-DD).",
      "type": "string",
      "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$"
    },
    "currency": {
      "default": "EUR",
      "description": "ISO 4217 currency code (uppercase). Defaults to EUR.",
      "type": "string",
      "enum": [
        "EUR",
        "USD",
        "GBP",
        "CHF",
        "DKK",
        "SEK",
        "NOK",
        "PLN",
        "CZK",
        "HUF",
        "RON",
        "BGN",
        "ISK",
        "JPY",
        "CNY",
        "INR",
        "CAD",
        "AUD",
        "NZD",
        "BRL",
        "MXN",
        "ZAR",
        "AED",
        "SAR",
        "SGD",
        "HKD",
        "KRW",
        "TRY",
        "ILS",
        "KWD",
        "BHD",
        "OMR"
      ]
    },
    "buyerReference": {
      "description": "Buyer reference (BT-10), e.g. a PO or cost-centre code.",
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "orderReference": {
      "description": "Purchase order reference (BT-13). Peppol requires this OR a buyer reference.",
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "note": {
      "description": "Free-text invoice note.",
      "type": "string",
      "minLength": 1,
      "maxLength": 1000
    },
    "supplier": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 200,
          "description": "Trading / display name of the party."
        },
        "countryCode": {
          "type": "string",
          "enum": [
            "AT",
            "BE",
            "BG",
            "HR",
            "CY",
            "CZ",
            "DK",
            "EE",
            "FI",
            "FR",
            "DE",
            "GR",
            "HU",
            "IE",
            "IT",
            "LV",
            "LT",
            "LU",
            "MT",
            "NL",
            "PL",
            "PT",
            "RO",
            "SK",
            "SI",
            "ES",
            "SE",
            "IS",
            "LI",
            "NO",
            "GB",
            "CH",
            "US",
            "CA",
            "MX",
            "BR",
            "AU",
            "NZ",
            "JP",
            "CN",
            "IN",
            "KR",
            "SG",
            "HK",
            "AE",
            "SA",
            "ZA",
            "TR",
            "IL",
            "UA",
            "RS"
          ],
          "description": "ISO 3166-1 alpha-2 country code (uppercase), e.g. BE."
        },
        "vatId": {
          "description": "Legal / VAT registration id, e.g. \"BE0123456789\".",
          "type": "string",
          "minLength": 1,
          "maxLength": 60
        },
        "registrationName": {
          "description": "Legal registration name. Defaults to the trading name.",
          "type": "string",
          "minLength": 1,
          "maxLength": 200
        },
        "endpointId": {
          "description": "Peppol participant endpoint identifier, e.g. a GLN.",
          "type": "string",
          "minLength": 1,
          "maxLength": 60
        },
        "endpointScheme": {
          "description": "Endpoint scheme id (EAS code). Defaults to \"0088\" (GLN).",
          "type": "string",
          "minLength": 1,
          "maxLength": 10
        },
        "street": {
          "description": "Street name and number.",
          "type": "string",
          "minLength": 1,
          "maxLength": 200
        },
        "city": {
          "description": "City / town name.",
          "type": "string",
          "minLength": 1,
          "maxLength": 100
        },
        "postalZone": {
          "description": "Postal / ZIP code.",
          "type": "string",
          "minLength": 1,
          "maxLength": 20
        }
      },
      "required": [
        "name",
        "countryCode"
      ],
      "description": "Seller / accounting supplier party."
    },
    "customer": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 200,
          "description": "Trading / display name of the party."
        },
        "countryCode": {
          "type": "string",
          "enum": [
            "AT",
            "BE",
            "BG",
            "HR",
            "CY",
            "CZ",
            "DK",
            "EE",
            "FI",
            "FR",
            "DE",
            "GR",
            "HU",
            "IE",
            "IT",
            "LV",
            "LT",
            "LU",
            "MT",
            "NL",
            "PL",
            "PT",
            "RO",
            "SK",
            "SI",
            "ES",
            "SE",
            "IS",
            "LI",
            "NO",
            "GB",
            "CH",
            "US",
            "CA",
            "MX",
            "BR",
            "AU",
            "NZ",
            "JP",
            "CN",
            "IN",
            "KR",
            "SG",
            "HK",
            "AE",
            "SA",
            "ZA",
            "TR",
            "IL",
            "UA",
            "RS"
          ],
          "description": "ISO 3166-1 alpha-2 country code (uppercase), e.g. BE."
        },
        "vatId": {
          "description": "Legal / VAT registration id, e.g. \"BE0123456789\".",
          "type": "string",
          "minLength": 1,
          "maxLength": 60
        },
        "registrationName": {
          "description": "Legal registration name. Defaults to the trading name.",
          "type": "string",
          "minLength": 1,
          "maxLength": 200
        },
        "endpointId": {
          "description": "Peppol participant endpoint identifier, e.g. a GLN.",
          "type": "string",
          "minLength": 1,
          "maxLength": 60
        },
        "endpointScheme": {
          "description": "Endpoint scheme id (EAS code). Defaults to \"0088\" (GLN).",
          "type": "string",
          "minLength": 1,
          "maxLength": 10
        },
        "street": {
          "description": "Street name and number.",
          "type": "string",
          "minLength": 1,
          "maxLength": 200
        },
        "city": {
          "description": "City / town name.",
          "type": "string",
          "minLength": 1,
          "maxLength": 100
        },
        "postalZone": {
          "description": "Postal / ZIP code.",
          "type": "string",
          "minLength": 1,
          "maxLength": 20
        }
      },
      "required": [
        "name",
        "countryCode"
      ],
      "description": "Buyer / accounting customer party."
    },
    "lines": {
      "minItems": 1,
      "maxItems": 500,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500,
            "description": "Description of the goods or service for this line."
          },
          "quantity": {
            "type": "number",
            "exclusiveMinimum": 0,
            "maximum": 1000000,
            "description": "Quantity invoiced for this line."
          },
          "unitPrice": {
            "type": "number",
            "minimum": 0,
            "maximum": 100000000,
            "description": "Price per unit, excluding VAT."
          },
          "vatPercent": {
            "default": 0,
            "description": "VAT rate as a percentage (0–100). Defaults to 0 (zero-rated).",
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "unitCode": {
            "default": "EA",
            "description": "UN/ECE Rec 20 unit code. Defaults to \"EA\" (each).",
            "type": "string",
            "minLength": 1,
            "maxLength": 10
          },
          "taxCategory": {
            "description": "Override the derived UNCL5305 VAT category. Omit to derive S (rated) or Z (zero-rated) automatically from vatPercent.",
            "type": "string",
            "enum": [
              "S",
              "Z",
              "E",
              "AE",
              "K",
              "G",
              "O",
              "L",
              "M"
            ]
          }
        },
        "required": [
          "description",
          "quantity",
          "unitPrice"
        ]
      },
      "description": "Invoice lines. Totals are computed from these."
    }
  },
  "required": [
    "invoiceNumber",
    "issueDate",
    "supplier",
    "customer",
    "lines"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢kbo_company_search(vatNumber, countryCode)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "vatNumber": {
      "type": "string",
      "minLength": 1,
      "maxLength": 40,
      "description": "EU VAT number, with or without its country prefix — e.g. \"BE0123456789\", \"NL855876323B01\", \"DE811569869\" or the bare Belgian enterprise number \"0123456789\"."
    },
    "countryCode": {
      "default": "BE",
      "description": "ISO 3166-1 alpha-2 country code of the issuing EU member state (uppercase), e.g. BE, NL, DE, FR. Defaults to BE; inferred from the VAT prefix when present.",
      "type": "string",
      "enum": [
        "AT",
        "BE",
        "BG",
        "HR",
        "CY",
        "CZ",
        "DK",
        "EE",
        "FI",
        "FR",
        "DE",
        "GR",
        "HU",
        "IE",
        "IT",
        "LV",
        "LT",
        "LU",
        "MT",
        "NL",
        "PL",
        "PT",
        "RO",
        "SK",
        "SI",
        "ES",
        "SE",
        "IS",
        "LI",
        "NO",
        "GB",
        "CH",
        "US",
        "CA",
        "MX",
        "BR",
        "AU",
        "NZ",
        "JP",
        "CN",
        "IN",
        "KR",
        "SG",
        "HK",
        "AE",
        "SA",
        "ZA",
        "TR",
        "IL",
        "UA",
        "RS"
      ]
    }
  },
  "required": [
    "vatNumber"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢review_invoice(invoiceNumber, issueDate, dueDate, currency, buyerReference, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "invoiceNumber": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80,
      "description": "Human-readable invoice number, e.g. \"INV-2026-0001\"."
    },
    "issueDate": {
      "type": "string",
      "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
      "description": "Issue date (YYYY-MM-DD)."
    },
    "dueDate": {
      "description": "Optional payment due date (YYYY-MM-DD).",
      "type": "string",
      "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$"
    },
    "currency": {
      "default": "EUR",
      "description": "ISO 4217 currency code (uppercase). Defaults to EUR.",
      "type": "string",
      "enum": [
        "EUR",
        "USD",
        "GBP",
        "CHF",
        "DKK",
        "SEK",
        "NOK",
        "PLN",
        "CZK",
        "HUF",
        "RON",
        "BGN",
        "ISK",
        "JPY",
        "CNY",
        "INR",
        "CAD",
        "AUD",
        "NZD",
        "BRL",
        "MXN",
        "ZAR",
        "AED",
        "SAR",
        "SGD",
        "HKD",
        "KRW",
        "TRY",
        "ILS",
        "KWD",
        "BHD",
        "OMR"
      ]
    },
    "buyerReference": {
      "description": "Buyer reference (BT-10), e.g. a PO or cost-centre code.",
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "orderReference": {
      "description": "Purchase order reference (BT-13). Peppol requires this OR a buyer reference.",
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "note": {
      "description": "Free-text invoice note.",
      "type": "string",
      "minLength": 1,
      "maxLength": 1000
    },
    "supplier": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 200,
          "description": "Trading / display name of the party."
        },
        "countryCode": {
          "type": "string",
          "enum": [
            "AT",
            "BE",
            "BG",
            "HR",
            "CY",
            "CZ",
            "DK",
            "EE",
            "FI",
            "FR",
            "DE",
            "GR",
            "HU",
            "IE",
            "IT",
            "LV",
            "LT",
            "LU",
            "MT",
            "NL",
            "PL",
            "PT",
            "RO",
            "SK",
            "SI",
            "ES",
            "SE",
            "IS",
            "LI",
            "NO",
            "GB",
            "CH",
            "US",
            "CA",
            "MX",
            "BR",
            "AU",
            "NZ",
            "JP",
            "CN",
            "IN",
            "KR",
            "SG",
            "HK",
            "AE",
            "SA",
            "ZA",
            "TR",
            "IL",
            "UA",
            "RS"
          ],
          "description": "ISO 3166-1 alpha-2 country code (uppercase), e.g. BE."
        },
        "vatId": {
          "description": "Legal / VAT registration id, e.g. \"BE0123456789\".",
          "type": "string",
          "minLength": 1,
          "maxLength": 60
        },
        "registrationName": {
          "description": "Legal registration name. Defaults to the trading name.",
          "type": "string",
          "minLength": 1,
          "maxLength": 200
        },
        "endpointId": {
          "description": "Peppol participant endpoint identifier, e.g. a GLN.",
          "type": "string",
          "minLength": 1,
          "maxLength": 60
        },
        "endpointScheme": {
          "description": "Endpoint scheme id (EAS code). Defaults to \"0088\" (GLN).",
          "type": "string",
          "minLength": 1,
          "maxLength": 10
        },
        "street": {
          "description": "Street name and number.",
          "type": "string",
          "minLength": 1,
          "maxLength": 200
        },
        "city": {
          "description": "City / town name.",
          "type": "string",
          "minLength": 1,
          "maxLength": 100
        },
        "postalZone": {
          "description": "Postal / ZIP code.",
          "type": "string",
          "minLength": 1,
          "maxLength": 20
        }
      },
      "required": [
        "name",
        "countryCode"
      ],
      "description": "Seller / accounting supplier party."
    },
    "customer": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 200,
          "description": "Trading / display name of the party."
        },
        "countryCode": {
          "type": "string",
          "enum": [
            "AT",
            "BE",
            "BG",
            "HR",
            "CY",
            "CZ",
            "DK",
            "EE",
            "FI",
            "FR",
            "DE",
            "GR",
            "HU",
            "IE",
            "IT",
            "LV",
            "LT",
            "LU",
            "MT",
            "NL",
            "PL",
            "PT",
            "RO",
            "SK",
            "SI",
            "ES",
            "SE",
            "IS",
            "LI",
            "NO",
            "GB",
            "CH",
            "US",
            "CA",
            "MX",
            "BR",
            "AU",
            "NZ",
            "JP",
            "CN",
            "IN",
            "KR",
            "SG",
            "HK",
            "AE",
            "SA",
            "ZA",
            "TR",
            "IL",
            "UA",
            "RS"
          ],
          "description": "ISO 3166-1 alpha-2 country code (uppercase), e.g. BE."
        },
        "vatId": {
          "description": "Legal / VAT registration id, e.g. \"BE0123456789\".",
          "type": "string",
          "minLength": 1,
          "maxLength": 60
        },
        "registrationName": {
          "description": "Legal registration name. Defaults to the trading name.",
          "type": "string",
          "minLength": 1,
          "maxLength": 200
        },
        "endpointId": {
          "description": "Peppol participant endpoint identifier, e.g. a GLN.",
          "type": "string",
          "minLength": 1,
          "maxLength": 60
        },
        "endpointScheme": {
          "description": "Endpoint scheme id (EAS code). Defaults to \"0088\" (GLN).",
          "type": "string",
          "minLength": 1,
          "maxLength": 10
        },
        "street": {
          "description": "Street name and number.",
          "type": "string",
          "minLength": 1,
          "maxLength": 200
        },
        "city": {
          "description": "City / town name.",
          "type": "string",
          "minLength": 1,
          "maxLength": 100
        },
        "postalZone": {
          "description": "Postal / ZIP code.",
          "type": "string",
          "minLength": 1,
          "maxLength": 20
        }
      },
      "required": [
        "name",
        "countryCode"
      ],
      "description": "Buyer / accounting customer party."
    },
    "lines": {
      "minItems": 1,
      "maxItems": 500,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500,
            "description": "Description of the goods or service for this line."
          },
          "quantity": {
            "type": "number",
            "exclusiveMinimum": 0,
            "maximum": 1000000,
            "description": "Quantity invoiced for this line."
          },
          "unitPrice": {
            "type": "number",
            "minimum": 0,
            "maximum": 100000000,
            "description": "Price per unit, excluding VAT."
          },
          "vatPercent": {
            "default": 0,
            "description": "VAT rate as a percentage (0–100). Defaults to 0 (zero-rated).",
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "unitCode": {
            "default": "EA",
            "description": "UN/ECE Rec 20 unit code. Defaults to \"EA\" (each).",
            "type": "string",
            "minLength": 1,
            "maxLength": 10
          },
          "taxCategory": {
            "description": "Override the derived UNCL5305 VAT category. Omit to derive S (rated) or Z (zero-rated) automatically from vatPercent.",
            "type": "string",
            "enum": [
              "S",
              "Z",
              "E",
              "AE",
              "K",
              "G",
              "O",
              "L",
              "M"
            ]
          }
        },
        "required": [
          "description",
          "quantity",
          "unitPrice"
        ]
      },
      "description": "Invoice lines. Totals are computed from these."
    }
  },
  "required": [
    "invoiceNumber",
    "issueDate",
    "supplier",
    "customer",
    "lines"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢generate_pdf_invoice(invoiceNumber, issueDate, dueDate, currency, supplier, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "invoiceNumber": {
      "type": "string",
      "minLength": 1,
      "maxLength": 60,
      "description": "Invoice number, e.g. \"INV-2026-0001\"."
    },
    "issueDate": {
      "type": "string",
      "minLength": 1,
      "maxLength": 40,
      "description": "Issue date (ISO 8601), e.g. 2026-06-06."
    },
    "dueDate": {
      "description": "Optional due date (ISO 8601).",
      "type": "string",
      "minLength": 1,
      "maxLength": 40
    },
    "currency": {
      "default": "EUR",
      "description": "ISO 4217 currency code (uppercase). Defaults to EUR.",
      "type": "string",
      "enum": [
        "EUR",
        "USD",
        "GBP",
        "CHF",
        "DKK",
        "SEK",
        "NOK",
        "PLN",
        "CZK",
        "HUF",
        "RON",
        "BGN",
        "ISK",
        "JPY",
        "CNY",
        "INR",
        "CAD",
        "AUD",
        "NZD",
        "BRL",
        "MXN",
        "ZAR",
        "AED",
        "SAR",
        "SGD",
        "HKD",
        "KRW",
        "TRY",
        "ILS",
        "KWD",
        "BHD",
        "OMR"
      ]
    },
    "supplier": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 200,
          "description": "Legal / display name."
        },
        "address": {
          "description": "Postal address (free text; newlines allowed).",
          "type": "string",
          "maxLength": 400
        },
        "vatId": {
          "description": "VAT / registration id, e.g. BE0123456789.",
          "type": "string",
          "maxLength": 60
        },
        "registrationNumber": {
          "description": "Company registration number (KBO/BCE for Belgium).",
          "type": "string",
          "maxLength": 60
        },
        "email": {
          "description": "Contact email.",
          "type": "string",
          "maxLength": 200
        },
        "phone": {
          "description": "Contact phone.",
          "type": "string",
          "maxLength": 40
        }
      },
      "required": [
        "name"
      ],
      "description": "The company ISSUING the invoice (you / your business)."
    },
    "customer": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 200,
          "description": "Legal / display name."
        },
        "address": {
          "description": "Postal address (free text; newlines allowed).",
          "type": "string",
          "maxLength": 400
        },
        "vatId": {
          "description": "VAT / registration id, e.g. BE0123456789.",
          "type": "string",
          "maxLength": 60
        },
        "registrationNumber": {
          "description": "Company registration number (KBO/BCE for Belgium).",
          "type": "string",
          "maxLength": 60
        },
        "email": {
          "description": "Contact email.",
          "type": "string",
          "maxLength": 200
        },
        "phone": {
          "description": "Contact phone.",
          "type": "string",
          "maxLength": 40
        }
      },
      "required": [
        "name"
      ],
      "description": "The company being BILLED."
    },
    "lines": {
      "minItems": 1,
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300,
            "description": "Line item description."
          },
          "quantity": {
            "type": "number",
            "minimum": 0,
            "description": "Quantity."
          },
          "unitPrice": {
            "type": "number",
            "description": "Unit price, excluding VAT."
          },
          "vatPercent": {
            "default": 0,
            "description": "VAT rate as a percentage, e.g. 21.",
            "type": "number",
            "minimum": 0,
            "maximum": 100
          }
        },
        "required": [
          "description",
          "quantity",
          "unitPrice"
        ]
      },
      "description": "One or more invoice line items."
    },
    "notes": {
      "description": "Optional footer notes / payment terms.",
      "type": "string",
      "maxLength": 1000
    }
  },
  "required": [
    "invoiceNumber",
    "issueDate",
    "supplier",
    "customer",
    "lines"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢core_condition(left, operator, right, label)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "left": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 2000
        },
        {
          "type": "number"
        }
      ],
      "description": "Left-hand value — a literal or a value from a previous step."
    },
    "operator": {
      "type": "string",
      "enum": [
        ">",
        ">=",
        "<",
        "<=",
        "equals",
        "not_equals",
        "contains"
      ],
      "description": "How to compare, e.g. \">\" for \"Invoice amount > 1000\"."
    },
    "right": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 2000
        },
        {
          "type": "number"
        }
      ],
      "description": "Right-hand value to compare against."
    },
    "label": {
      "description": "Optional human label, e.g. \"High-value invoice?\".",
      "type": "string",
      "maxLength": 120
    }
  },
  "required": [
    "left",
    "operator",
    "right"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢verify_iban(iban, expectedCountry)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "iban": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "The account number to check, as written — spaces and dashes are fine, e.g. \"BE68 5390 0754 7034\"."
    },
    "expectedCountry": {
      "description": "Optional ISO 3166-1 alpha-2 country of the party being paid. When given, the answer reports whether the account is issued in that country — as an observation with both countries named, never as a fraud verdict.",
      "type": "string",
      "minLength": 2,
      "maxLength": 2
    }
  },
  "required": [
    "iban"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢check_peppol_ready(invoiceNumber, issueDate, currency, buyerReference, orderReference, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "invoiceNumber": {
      "description": "The invoice number (BT-1).",
      "type": "string",
      "maxLength": 120
    },
    "issueDate": {
      "description": "The issue date (BT-2). Peppol requires YYYY-MM-DD.",
      "type": "string",
      "maxLength": 40
    },
    "currency": {
      "description": "Three-letter currency code (BT-5), e.g. EUR.",
      "type": "string",
      "maxLength": 8
    },
    "buyerReference": {
      "description": "The reference the customer asked you to put on the invoice (BT-10). Peppol requires this OR an order reference.",
      "type": "string",
      "maxLength": 200
    },
    "orderReference": {
      "description": "The purchase order number (BT-13). The alternative to a buyer reference.",
      "type": "string",
      "maxLength": 200
    },
    "supplier": {
      "description": "You, the sender.",
      "type": "object",
      "properties": {
        "name": {
          "description": "The party's name as it appears on the invoice.",
          "type": "string",
          "maxLength": 200
        },
        "countryCode": {
          "description": "ISO 3166-1 alpha-2 country code, e.g. BE.",
          "type": "string",
          "maxLength": 2
        },
        "endpointId": {
          "description": "The party's Peppol address — the identifier the network delivers to, e.g. a Belgian enterprise number.",
          "type": "string",
          "maxLength": 60
        },
        "endpointScheme": {
          "description": "The four-digit EAS code the address is stated under, e.g. \"0208\" for a Belgian enterprise number.",
          "type": "string",
          "maxLength": 10
        }
      }
    },
    "customer": {
      "description": "The customer, the receiver.",
      "type": "object",
      "properties": {
        "name": {
          "description": "The party's name as it appears on the invoice.",
          "type": "string",
          "maxLength": 200
        },
        "countryCode": {
          "description": "ISO 3166-1 alpha-2 country code, e.g. BE.",
          "type": "string",
          "maxLength": 2
        },
        "endpointId": {
          "description": "The party's Peppol address — the identifier the network delivers to, e.g. a Belgian enterprise number.",
          "type": "string",
          "maxLength": 60
        },
        "endpointScheme": {
          "description": "The four-digit EAS code the address is stated under, e.g. \"0208\" for a Belgian enterprise number.",
          "type": "string",
          "maxLength": 10
        }
      }
    },
    "lines": {
      "description": "The invoice lines.",
      "maxItems": 1000,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "maxLength": 400
          },
          "quantity": {
            "type": "number"
          },
          "unitPrice": {
            "type": "number"
          },
          "vatPercent": {
            "description": "The VAT rate on this line, as a percentage, e.g. 21.",
            "type": "number"
          },
          "lineNetAmount": {
            "description": "The line total excluding VAT, when you already computed it.",
            "type": "number"
          }
        }
      }
    },
    "totalWithoutVat": {
      "description": "Invoice total excluding VAT (BT-109). Supply it and the arithmetic rules are checked.",
      "type": "number"
    },
    "totalVat": {
      "description": "Total VAT (BT-110).",
      "type": "number"
    },
    "totalWithVat": {
      "description": "Invoice total including VAT (BT-112).",
      "type": "number"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢lookup_peppol_participant(identifier, scheme)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "identifier": {
      "type": "string",
      "minLength": 1,
      "maxLength": 60,
      "description": "The customer's enterprise or VAT number, as written on the invoice — \"BE 0403.170.701\", \"0403170701\" and \"BE0403170701\" are all accepted."
    },
    "scheme": {
      "description": "The four-digit Peppol scheme the number is registered under, when you know it: \"0208\" for a Belgian enterprise number (the mandatory primary scheme for Belgian businesses), \"9925\" for a Belgian VAT number, \"0192\" for a Norwegian organisation number. Left out, a Belgian enterprise number is assumed.",
      "type": "string",
      "maxLength": 10
    }
  },
  "required": [
    "identifier"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢check_payment_change(newIban, ibanOnFile, supplierCountry)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "newIban": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "The account number in the change request, as written — spaces and dashes are fine, e.g. \"DE89 3704 0044 0532 0130 00\"."
    },
    "ibanOnFile": {
      "description": "The account currently on the vendor record. Leave it out for a first registration; the answer then says nothing could be compared.",
      "type": "string",
      "maxLength": 64
    },
    "supplierCountry": {
      "description": "ISO 3166-1 alpha-2 country where the supplier is established, e.g. BE. When given, an account issued elsewhere is a red flag.",
      "type": "string",
      "minLength": 2,
      "maxLength": 2
    }
  },
  "required": [
    "newIban"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢file_to_data_inspect(fileName, content, contentBase64, targetSchemaId, targetSchema, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "fileName": {
      "description": "The file's name, e.g. \"prices.csv\". Only its extension is used (.csv .tsv .txt .xlsx .xlsm .json .ndjson); it is never stored or logged.",
      "type": "string",
      "maxLength": 255
    },
    "content": {
      "description": "The file's TEXT, for CSV / delimited text / JSON / NDJSON. Give this OR contentBase64. At most 3 MiB.",
      "type": "string",
      "maxLength": 3145728
    },
    "contentBase64": {
      "description": "The file's BYTES, base64-encoded — required for .xlsx, fine for any format. Give this OR content. At most 3 MiB of file.",
      "type": "string",
      "maxLength": 4259840
    },
    "targetSchemaId": {
      "description": "A built-in target schema: supplier_price_list, customer_import or order_lines. Give this OR targetSchema.",
      "type": "string",
      "maxLength": 64
    },
    "targetSchema": {
      "description": "Your own target schema: { \"id\"?, \"title\"?, \"fields\": [{ \"name\", \"type\", \"required\"?, \"description\"?, \"synonyms\"? }] } with type one of string, identifier, integer, decimal, date, boolean, email.",
      "type": "object",
      "properties": {},
      "additionalProperties": {}
    },
    "sheet": {
      "description": "XLSX only: the sheet's name exactly as written, or its position starting at 0. Default: the first sheet.",
      "anyOf": [
        {
          "type": "string",
          "maxLength": 255
        },
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 999
        }
      ]
    },
    "headerRow": {
      "description": "The row number of the header row, counted from 1. Default: the first row that holds anything.",
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢file_to_data_transform(fileName, content, contentBase64, targetSchemaId, targetSchema, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "fileName": {
      "description": "The file's name, e.g. \"prices.csv\". Only its extension is used (.csv .tsv .txt .xlsx .xlsm .json .ndjson); it is never stored or logged.",
      "type": "string",
      "maxLength": 255
    },
    "content": {
      "description": "The file's TEXT, for CSV / delimited text / JSON / NDJSON. Give this OR contentBase64. At most 3 MiB.",
      "type": "string",
      "maxLength": 3145728
    },
    "contentBase64": {
      "description": "The file's BYTES, base64-encoded — required for .xlsx, fine for any format. Give this OR content. At most 3 MiB of file.",
      "type": "string",
      "maxLength": 4259840
    },
    "targetSchemaId": {
      "description": "A built-in target schema: supplier_price_list, customer_import or order_lines. Give this OR targetSchema.",
      "type": "string",
      "maxLength": 64
    },
    "targetSchema": {
      "description": "Your own target schema: { \"id\"?, \"title\"?, \"fields\": [{ \"name\", \"type\", \"required\"?, \"description\"?, \"synonyms\"? }] } with type one of string, identifier, integer, decimal, date, boolean, email.",
      "type": "object",
      "properties": {},
      "additionalProperties": {}
    },
    "sheet": {
      "description": "XLSX only: the sheet's name exactly as written, or its position starting at 0. Default: the first sheet.",
      "anyOf": [
        {
          "type": "string",
          "maxLength": 255
        },
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 999
        }
      ]
    },
    "headerRow": {
      "description": "The row number of the header row, counted from 1. Default: the first row that holds anything.",
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    },
    "mapping": {
      "type": "object",
      "properties": {},
      "additionalProperties": {},
      "description": "THE EXPLICIT MAPPING to carry out — normally `proposedMapping` from file_to_data_inspect, corrected where needed: { \"targetSchemaId\" | \"targetSchema\", \"fields\": [{ \"target\", \"source\", \"sourceIndex\"?, \"decimalMark\"?: \".\" | \",\", \"dateFormat\"?: \"YMD\" | \"DMY\" | \"MDY\" | \"excel_serial\" }] }. A number is read ONLY under decimalMark, a date ONLY under dateFormat."
    },
    "offset": {
      "description": "First row of the page, starting at 0. Use page.nextOffset of the previous answer.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "description": "Rows in this page. Default 100; an answer never carries more than about 400 kB of rows, so a page may be shorter than asked.",
      "type": "integer",
      "minimum": 1,
      "maximum": 50000
    }
  },
  "required": [
    "mapping"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢check_vat_list(rows, requesterVatId)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "rows": {
      "minItems": 1,
      "maxItems": 200,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "reference": {
            "description": "Your own label for the row — a customer number, a name. Optional, at most 80 characters. It is echoed back, never interpreted.",
            "type": "string",
            "maxLength": 200
          },
          "vatId": {
            "type": "string",
            "maxLength": 200,
            "description": "The VAT number as written, WITH its two-letter country prefix, e.g. \"BE0400378485\" or \"NL 8558.76.323.B01\". Spaces, dots and dashes are fine."
          }
        },
        "required": [
          "vatId"
        ]
      },
      "description": "The list: 1 to 20 rows per call. A longer list is refused with the limit named — send it in parts of 20."
    },
    "requesterVatId": {
      "description": "Your OWN EU VAT number with country prefix (e.g. BE0403170701). When given, the European Commission issues a consultation number per answered row, registered to you. Optional. Never stored.",
      "type": "string",
      "maxLength": 20
    }
  },
  "required": [
    "rows"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢check_vat_list_format(rows)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "rows": {
      "minItems": 1,
      "maxItems": 200,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "reference": {
            "description": "Your own label for the row — a customer number, a name. Optional, at most 80 characters. It is echoed back, never interpreted.",
            "type": "string",
            "maxLength": 200
          },
          "vatId": {
            "type": "string",
            "maxLength": 200,
            "description": "The VAT number as written, WITH its two-letter country prefix, e.g. \"BE0400378485\" or \"NL 8558.76.323.B01\". Spaces, dots and dashes are fine."
          }
        },
        "required": [
          "vatId"
        ]
      },
      "description": "The list: 1 to 20 rows per call. A longer list is refused with the limit named — send it in parts of 20."
    }
  },
  "required": [
    "rows"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢fetch_web_markdown(url, maxChars)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "maxLength": 2000,
      "format": "uri",
      "description": "The public https page to read."
    },
    "maxChars": {
      "description": "Max Markdown characters to return (default 8000, hard cap 12000).",
      "type": "integer",
      "minimum": 500,
      "maximum": 12000
    }
  },
  "required": [
    "url"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢transcribe_and_slice_audio(audioUrl, audioBase64, language)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "audioUrl": {
      "description": "Public https URL of the audio file (mp3/m4a/wav). One source required.",
      "type": "string",
      "maxLength": 2000,
      "format": "uri"
    },
    "audioBase64": {
      "description": "Base64 audio payload (with or without a data: prefix). One source required.",
      "type": "string",
      "maxLength": 34000000
    },
    "language": {
      "description": "Optional ISO-639-1 hint (e.g. \"nl\", \"en\", \"fr\").",
      "type": "string",
      "minLength": 2,
      "maxLength": 12
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢analyze_kbo_financials(vatNumber)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "vatNumber": {
      "type": "string",
      "minLength": 1,
      "maxLength": 32,
      "description": "Belgian VAT or KBO/BCE enterprise number, e.g. BE0403170701 or 0403.170.701."
    }
  },
  "required": [
    "vatNumber"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢parse_receipt_vision(imageUrl, imageBase64, currencyHint)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "imageUrl": {
      "description": "Public https URL of the receipt/invoice image. One source required.",
      "type": "string",
      "maxLength": 2000,
      "format": "uri"
    },
    "imageBase64": {
      "description": "Base64 image payload (with or without a data: prefix). One source required.",
      "type": "string",
      "maxLength": 7000000
    },
    "currencyHint": {
      "description": "Optional ISO-4217 hint (e.g. \"EUR\") when the receipt is ambiguous.",
      "type": "string",
      "minLength": 3,
      "maxLength": 3
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢draft_social_content(topic, context, platform, tone, facts, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "topic": {
      "type": "string",
      "minLength": 3,
      "maxLength": 500,
      "description": "What the posts should be about, in one or two sentences."
    },
    "context": {
      "description": "Optional research to ground the drafts (e.g. the Markdown from fetch_web_markdown).",
      "type": "string",
      "maxLength": 12000
    },
    "platform": {
      "description": "The platform the drafts should be written for (default general).",
      "type": "string",
      "enum": [
        "linkedin",
        "x",
        "instagram",
        "facebook",
        "general"
      ]
    },
    "tone": {
      "description": "Voice of the drafts, free-form (e.g. \"direct, warm, no buzzwords\").",
      "type": "string",
      "minLength": 2,
      "maxLength": 80
    },
    "facts": {
      "description": "The ONLY approved product/business claims (from the Brand Profile).",
      "type": "string",
      "maxLength": 600
    },
    "bannedClaims": {
      "description": "Claims that must never appear — enforced in-prompt AND post-generation.",
      "maxItems": 8,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      }
    },
    "language": {
      "description": "Language of the drafts (default en).",
      "type": "string",
      "enum": [
        "en",
        "nl"
      ]
    },
    "count": {
      "description": "How many drafts to produce (default 3, max 5).",
      "type": "integer",
      "minimum": 1,
      "maximum": 5
    },
    "signals": {
      "description": "Recent signals from the tenant's APPROVED sources, with trust tiers. Posts that use one must cite its ref in their sources array.",
      "maxItems": 6,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "ref": {
            "type": "string",
            "minLength": 1,
            "maxLength": 8
          },
          "label": {
            "type": "string",
            "maxLength": 60
          },
          "tier": {
            "type": "string",
            "enum": [
              "approved_fact",
              "user_material",
              "observed_external"
            ]
          },
          "date": {
            "type": "string",
            "maxLength": 12
          },
          "title": {
            "type": "string",
            "maxLength": 120
          },
          "summary": {
            "type": "string",
            "maxLength": 240
          }
        },
        "required": [
          "ref",
          "label",
          "tier",
          "date",
          "title",
          "summary"
        ]
      }
    },
    "avoidSignatures": {
      "description": "Compact signatures of this agent's recent posts — the deterministic anti-repetition gate drops any draft too similar to one of these.",
      "maxItems": 24,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "sig": {
            "maxItems": 40,
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 12
            }
          },
          "excerpt": {
            "type": "string",
            "maxLength": 200
          },
          "at": {
            "type": "string",
            "maxLength": 40
          }
        },
        "required": [
          "sig",
          "excerpt",
          "at"
        ]
      }
    },
    "recentNote": {
      "description": "Prompt note listing recent posts the model must not repeat.",
      "type": "string",
      "maxLength": 1200
    },
    "learnings": {
      "description": "Real recorded outcomes (never invented) to improve on.",
      "type": "string",
      "maxLength": 800
    },
    "pillar": {
      "description": "Today's editorial pillar for these drafts.",
      "type": "string",
      "maxLength": 60
    },
    "format": {
      "description": "The post shape to write in (e.g. how-to, story, question).",
      "type": "string",
      "maxLength": 24
    },
    "campaign": {
      "description": "Active campaign goal + CTA policy, when one is running.",
      "type": "string",
      "maxLength": 200
    },
    "contract": {
      "description": "The agent's JOB CONTRACT (purpose/audience/outcome/done).",
      "type": "string",
      "maxLength": 700
    },
    "ownerUpdate": {
      "description": "The owner's own news ('we shipped X') — the post's core material when present.",
      "type": "string",
      "maxLength": 600
    },
    "feedbackNote": {
      "description": "Real recorded owner behaviour on this agent's recent work.",
      "type": "string",
      "maxLength": 600
    },
    "minAnchors": {
      "description": "Concrete-detail floor per post (escalates on owner feedback).",
      "type": "integer",
      "minimum": 1,
      "maximum": 2
    },
    "requireFreshBasis": {
      "description": "Currency-dependent agents: refuse (honestly, before any model spend) when no fresh signals exist to work from.",
      "type": "boolean"
    }
  },
  "required": [
    "topic"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢monitor_sources(maxSources)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "maxSources": {
      "description": "How many due sources to check this run (default 5, max 5).",
      "type": "integer",
      "minimum": 1,
      "maximum": 5
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded19 tools