addrbookFor publishers
← The evidence ledger

Evidence row 301457

Observed , by probe.mcp/1.

Kind
mcp.tools
About
endpoint 37744c3b-545c-48c9-8155-cca2c278c4cb
Recorded
Previous row
None: the first of its kind about this subject
Body SHA-256
ba695b0b1bac5b085fd2a60f94b186ed83463315adb6fe41aa40a55d14714efd
Leaf
0xa386c4264ffd9a7c4af5e9a1d6fe22061e8570a05e6c26ebdf4972dba5ee6c41

What was observed

{
  "count": 26,
  "tools": [
    {
      "description": "WRITE: create a customer in the store. Store-account balance, credit limit and loyalty points cannot be set here. Needs a Read/Write API key. Retrying creates a duplicate (check phppos_list_customers first). The store's 'new customer' webhook, if configured, fires. POST /customers.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "account_number": {
            "description": "Customer account number.",
            "maxLength": 60,
            "type": "string"
          },
          "address_1": {
            "description": "Address line 1.",
            "maxLength": 200,
            "type": "string"
          },
          "address_2": {
            "description": "Address line 2.",
            "maxLength": 200,
            "type": "string"
          },
          "city": {
            "description": "City.",
            "maxLength": 100,
            "type": "string"
          },
          "comments": {
            "description": "Comments.",
            "maxLength": 2000,
            "type": "string"
          },
          "company_name": {
            "description": "Company name.",
            "maxLength": 200,
            "type": "string"
          },
          "country": {
            "description": "Country.",
            "maxLength": 100,
            "type": "string"
          },
          "email": {
            "description": "Email address.",
            "format": "email",
            "maxLength": 254,
            "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
            "type": "string"
          },
          "first_name": {
            "description": "First name (required by PHP Point of Sale).",
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "internal_notes": {
            "description": "Internal notes (not shown to the customer).",
            "maxLength": 4000,
            "type": "string"
          },
          "last_name": {
            "description": "Last name.",
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "phone_number": {
            "description": "Phone number.",
            "maxLength": 40,
            "minLength": 1,
            "type": "string"
          },
          "state": {
            "description": "State or region.",
            "maxLength": 100,
            "type": "string"
          },
          "taxable": {
            "description": "Whether sales to this customer are taxed.",
            "type": "boolean"
          },
          "zip": {
            "description": "Postal code.",
            "maxLength": 30,
            "type": "string"
          }
        },
        "required": [
          "first_name"
        ],
        "type": "object"
      },
      "name": "phppos_create_customer"
    },
    {
      "description": "WRITE: record an expense in the store's books (description, amount and date). It affects expense and profit-and-loss reports. Needs a Read/Write API key. Retrying records it twice (check phppos_list_expenses first). POST /expenses.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "category_id": {
            "description": "Expense category id.",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          },
          "expense_amount": {
            "description": "Amount, in the store's currency, before tax.",
            "maximum": 10000000000,
            "minimum": 0,
            "type": "number"
          },
          "expense_date": {
            "description": "When it was incurred (yyyy-mm-dd or yyyy-mm-dd hh:mm:ss); defaults to now in the store.",
            "type": "string"
          },
          "expense_description": {
            "description": "What the expense was for.",
            "maxLength": 500,
            "minLength": 1,
            "type": "string"
          },
          "expense_note": {
            "description": "Note.",
            "maxLength": 1000,
            "type": "string"
          },
          "expense_payment_type": {
            "description": "Payment type, for example Cash.",
            "maxLength": 60,
            "type": "string"
          },
          "expense_reason": {
            "description": "Reason.",
            "maxLength": 500,
            "type": "string"
          },
          "expense_tax": {
            "description": "Tax amount.",
            "maximum": 10000000000,
            "minimum": 0,
            "type": "number"
          },
          "expense_type": {
            "description": "Expense type, for example Utilities.",
            "maxLength": 100,
            "type": "string"
          },
          "location_id": {
            "description": "Location id - see phppos_list_locations.",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "expense_description",
          "expense_amount"
        ],
        "type": "object"
      },
      "name": "phppos_create_expense"
    },
    {
      "description": "WRITE: create an inventory item (name required). Stock quantities are not set here. Needs a Read/Write API key. Retrying creates a duplicate (search with phppos_list_items first). The store's item webhooks, if configured, fire. POST /items.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "category_id": {
            "description": "Category id - see phppos_list_categories.",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          },
          "cost_price": {
            "description": "Cost price.",
            "maximum": 10000000000,
            "minimum": 0,
            "type": "number"
          },
          "description": {
            "description": "Short description.",
            "maxLength": 1000,
            "type": "string"
          },
          "is_service": {
            "description": "True for a service (no stock tracking).",
            "type": "boolean"
          },
          "item_inactive": {
            "description": "True to deactivate the item (it can no longer be sold).",
            "type": "boolean"
          },
          "item_number": {
            "description": "Barcode / item number (UPC).",
            "maxLength": 100,
            "type": "string"
          },
          "name": {
            "description": "Item name.",
            "maxLength": 255,
            "minLength": 1,
            "type": "string"
          },
          "product_id": {
            "description": "Product id / SKU.",
            "maxLength": 100,
            "type": "string"
          },
          "promo_price": {
            "description": "Promotional price.",
            "maximum": 10000000000,
            "minimum": 0,
            "type": "number"
          },
          "reorder_level": {
            "description": "Stock level at which the item shows as low.",
            "maximum": 1000000000,
            "minimum": 0,
            "type": "number"
          },
          "size": {
            "description": "Size.",
            "maxLength": 100,
            "type": "string"
          },
          "supplier_id": {
            "description": "Supplier person id - see phppos_list_suppliers.",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          },
          "tags": {
            "description": "Tag names.",
            "items": {
              "maxLength": 60,
              "minLength": 1,
              "type": "string"
            },
            "maxItems": 20,
            "type": "array"
          },
          "unit_price": {
            "description": "Selling price.",
            "maximum": 10000000000,
            "minimum": 0,
            "type": "number"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "name": "phppos_create_item"
    },
    {
      "description": "One customer by person id: contact details, tier, tax settings, balance, credit limit, points, notes and custom fields. GET /customers/{person_id}.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "person_id": {
            "description": "Customer person id (find it with phppos_list_customers).",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "person_id"
        ],
        "type": "object"
      },
      "name": "phppos_get_customer"
    },
    {
      "description": "One gift card by its card number (or id): remaining value, customer and status. GET /giftcards/{giftcard_number}.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "giftcard_number": {
            "description": "Gift card number or id.",
            "maxLength": 60,
            "minLength": 1,
            "pattern": "^[A-Za-z0-9_-]+$",
            "type": "string"
          }
        },
        "required": [
          "giftcard_number"
        ],
        "type": "object"
      },
      "name": "phppos_get_gift_card"
    },
    {
      "description": "One inventory item by id: prices, tax settings, category, supplier, tags, attributes, variations, tier pricing and per-location settings. GET /items/{id}.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "item_id": {
            "description": "PHP Point of Sale item id (find it with phppos_list_items).",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "item_id"
        ],
        "type": "object"
      },
      "name": "phppos_get_item"
    },
    {
      "description": "One receiving by id: supplier, items, quantities, costs and payments. GET /receivings/{id}.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "receiving_id": {
            "description": "Receiving id (find it with phppos_list_receivings).",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "receiving_id"
        ],
        "type": "object"
      },
      "name": "phppos_get_receiving"
    },
    {
      "description": "One sale by id with line items, payments, taxes, customer and employee (verbosity full by default). GET /sales/{id}.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "sale_id": {
            "description": "PHP Point of Sale sale id (the number on the receipt; find it with phppos_list_sales).",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          },
          "verbosity": {
            "description": "minimal, medium or full (default).",
            "enum": [
              "minimal",
              "medium",
              "full"
            ],
            "type": "string"
          }
        },
        "required": [
          "sale_id"
        ],
        "type": "object"
      },
      "name": "phppos_get_sale"
    },
    {
      "description": "One supplier by person id. GET /suppliers/{person_id}.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "person_id": {
            "description": "Supplier person id (find it with phppos_list_suppliers).",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "person_id"
        ],
        "type": "object"
      },
      "name": "phppos_get_supplier"
    },
    {
      "description": "List appointments (bookings) with customer, employee, service, start and end time, optionally within a time window. GET /appointments.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "end_time": {
            "description": "Only appointments ending on or before this date or date-time.",
            "type": "string"
          },
          "limit": {
            "description": "Rows per page, 1-100 (default 20).",
            "exclusiveMinimum": 0,
            "maximum": 100,
            "type": "integer"
          },
          "offset": {
            "description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report).",
            "maximum": 1000000,
            "minimum": 0,
            "type": "integer"
          },
          "search": {
            "description": "Free-text search.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "start_time": {
            "description": "Only appointments starting on or after this date or date-time.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "phppos_list_appointments"
    },
    {
      "description": "List item categories with their ids. Use the ids to filter items or to file a new item. GET /categories.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "limit": {
            "description": "Rows per page, 1-100 (default 20).",
            "exclusiveMinimum": 0,
            "maximum": 100,
            "type": "integer"
          },
          "offset": {
            "description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report).",
            "maximum": 1000000,
            "minimum": 0,
            "type": "integer"
          },
          "search": {
            "description": "Free-text search.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "phppos_list_categories"
    },
    {
      "description": "List or search customers with contact details, tier, store-account balance, credit limit and loyalty points. Search by text or by one field (email, phone_number, first_name, last_name, account_number). GET /customers.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "limit": {
            "description": "Rows per page, 1-100 (default 20).",
            "exclusiveMinimum": 0,
            "maximum": 100,
            "type": "integer"
          },
          "location_id": {
            "description": "Only customers at this location id.",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          },
          "offset": {
            "description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report).",
            "maximum": 1000000,
            "minimum": 0,
            "type": "integer"
          },
          "search": {
            "description": "Free-text search.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "search_field": {
            "description": "Limit the search to one field.",
            "enum": [
              "first_name",
              "last_name",
              "email",
              "phone_number",
              "account_number"
            ],
            "type": "string"
          },
          "sort_col": {
            "description": "Column to sort by (a field name of the rows).",
            "pattern": "^[a-z][a-z0-9_]{0,60}$",
            "type": "string"
          },
          "sort_dir": {
            "description": "Sort direction.",
            "enum": [
              "asc",
              "desc"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "phppos_list_customers"
    },
    {
      "description": "List employees with name, contact details, username, hire date, manager, commission and pay rate settings and assigned locations. Passwords and the permission maps are never returned. GET /employees.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "limit": {
            "description": "Rows per page, 1-100 (default 20).",
            "exclusiveMinimum": 0,
            "maximum": 100,
            "type": "integer"
          },
          "location_id": {
            "description": "Only employees at this location id.",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          },
          "offset": {
            "description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report).",
            "maximum": 1000000,
            "minimum": 0,
            "type": "integer"
          },
          "search": {
            "description": "Free-text search.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "phppos_list_employees"
    },
    {
      "description": "List recorded expenses with type, description, date, amount, tax, payment type, category and location. GET /expenses.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "limit": {
            "description": "Rows per page, 1-100 (default 20).",
            "exclusiveMinimum": 0,
            "maximum": 100,
            "type": "integer"
          },
          "location_id": {
            "description": "Only expenses at this location id.",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          },
          "offset": {
            "description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report).",
            "maximum": 1000000,
            "minimum": 0,
            "type": "integer"
          },
          "search": {
            "description": "Free-text search.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "sort_col": {
            "description": "Column to sort by (a field name of the rows).",
            "pattern": "^[a-z][a-z0-9_]{0,60}$",
            "type": "string"
          },
          "sort_dir": {
            "description": "Sort direction.",
            "enum": [
              "asc",
              "desc"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "phppos_list_expenses"
    },
    {
      "description": "List gift cards with number, description, remaining value, customer and whether inactive. GET /giftcards.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "limit": {
            "description": "Rows per page, 1-100 (default 20).",
            "exclusiveMinimum": 0,
            "maximum": 100,
            "type": "integer"
          },
          "offset": {
            "description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report).",
            "maximum": 1000000,
            "minimum": 0,
            "type": "integer"
          },
          "search": {
            "description": "Free-text search.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "phppos_list_gift_cards"
    },
    {
      "description": "List customer invoices (money customers owe) or supplier invoices (money the store owes) with date, due date, status and amount. GET /invoices/customer or /invoices/supplier.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "limit": {
            "description": "Rows per page, 1-100 (default 20).",
            "exclusiveMinimum": 0,
            "maximum": 100,
            "type": "integer"
          },
          "offset": {
            "description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report).",
            "maximum": 1000000,
            "minimum": 0,
            "type": "integer"
          },
          "search": {
            "description": "Free-text search.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "sort_col": {
            "description": "Column to sort by (a field name of the rows).",
            "pattern": "^[a-z][a-z0-9_]{0,60}$",
            "type": "string"
          },
          "sort_dir": {
            "description": "Sort direction.",
            "enum": [
              "asc",
              "desc"
            ],
            "type": "string"
          },
          "type": {
            "description": "customer = invoices to customers; supplier = invoices from suppliers.",
            "enum": [
              "customer",
              "supplier"
            ],
            "type": "string"
          }
        },
        "required": [
          "type"
        ],
        "type": "object"
      },
      "name": "phppos_list_invoices"
    },
    {
      "description": "List item kits (bundles of items sold together) with their prices. GET /item_kits.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "category_id": {
            "description": "Only kits in this category id.",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          },
          "limit": {
            "description": "Rows per page, 1-100 (default 20).",
            "exclusiveMinimum": 0,
            "maximum": 100,
            "type": "integer"
          },
          "offset": {
            "description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report).",
            "maximum": 1000000,
            "minimum": 0,
            "type": "integer"
          },
          "search": {
            "description": "Free-text search.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "phppos_list_item_kits"
    },
    {
      "description": "List or search inventory items with name, item number, category, supplier, prices and reorder level. Search by text, or by one field (name, item_number, product_id, supplier, tag_name...). GET /items.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "category_id": {
            "description": "Only items in this category id - see phppos_list_categories.",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          },
          "limit": {
            "description": "Rows per page, 1-1000 (default 20).",
            "exclusiveMinimum": 0,
            "maximum": 1000,
            "type": "integer"
          },
          "offset": {
            "description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report).",
            "maximum": 1000000,
            "minimum": 0,
            "type": "integer"
          },
          "search": {
            "description": "Free-text search.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "search_field": {
            "description": "Limit the search to one field.",
            "enum": [
              "item_id",
              "item_number",
              "product_id",
              "name",
              "description",
              "size",
              "cost_price",
              "unit_price",
              "promo_price",
              "reorder_level",
              "supplier",
              "manufacturer_name",
              "tag_name",
              "ecommerce_product_id"
            ],
            "type": "string"
          },
          "sort_col": {
            "description": "Column to sort by (a field name of the rows).",
            "pattern": "^[a-z][a-z0-9_]{0,60}$",
            "type": "string"
          },
          "sort_dir": {
            "description": "Sort direction.",
            "enum": [
              "asc",
              "desc"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "phppos_list_items"
    },
    {
      "description": "List the store's locations (shops/warehouses) with name, address, phone, email, time zone and default tax rates, plus each location's registers (id and name). Use the location ids to filter sales, expenses, customers and reports. Payment-processor credentials and device settings are never returned. GET /locations.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "limit": {
            "description": "Rows per page, 1-100 (default 20).",
            "exclusiveMinimum": 0,
            "maximum": 100,
            "type": "integer"
          },
          "offset": {
            "description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report).",
            "maximum": 1000000,
            "minimum": 0,
            "type": "integer"
          },
          "search": {
            "description": "Free-text search.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "phppos_list_locations"
    },
    {
      "description": "List receivings (stock received from suppliers, purchase orders, transfers) with supplier, totals and items, by date range. GET /receivings.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "end_date": {
            "description": "Only receivings on or before this date or date-time.",
            "type": "string"
          },
          "limit": {
            "description": "Rows per page, 1-1000 (default 25).",
            "exclusiveMinimum": 0,
            "maximum": 1000,
            "type": "integer"
          },
          "offset": {
            "description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report).",
            "maximum": 1000000,
            "minimum": 0,
            "type": "integer"
          },
          "start_date": {
            "description": "Only receivings on or after this date or date-time.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "phppos_list_receivings"
    },
    {
      "description": "The catalog of the store's reports (138 of them: sales summaries, top sellers, inventory low/aging/summary, profit and loss, taxes, payments, employee, customer, supplier and store-account reports) with the inputs each accepts. Without `search` only the report keys are returned; with `search` (for example 'inventory' or 'profit') the matching reports are returned with their inputs. GET /reports.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "search": {
            "description": "Only reports whose key, description or inputs contain this text.",
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "phppos_list_reports"
    },
    {
      "description": "List or search completed sales, by date range, customer (id or email) or location. verbosity: minimal (headline fields), medium (adds customer, totals, profit, location - the default here) or full (every line item, payment and tax). Suspended sales (layaways, estimates) are fetched with suspended_type. GET /sales.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "customer_id": {
            "description": "Only this customer's sales.",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          },
          "email_address": {
            "description": "Look the customer up by email address and return their sales.",
            "format": "email",
            "maxLength": 254,
            "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
            "type": "string"
          },
          "end_date": {
            "description": "Only sales on or before this date or date-time.",
            "type": "string"
          },
          "limit": {
            "description": "Rows per page, 1-1000 (default 25).",
            "exclusiveMinimum": 0,
            "maximum": 1000,
            "type": "integer"
          },
          "location_id": {
            "description": "Only sales at this location id - see phppos_list_locations.",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          },
          "offset": {
            "description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report).",
            "maximum": 1000000,
            "minimum": 0,
            "type": "integer"
          },
          "start_date": {
            "description": "Only sales on or after this date or date-time (yyyy-mm-dd or yyyy-mm-dd hh:mm:ss).",
            "type": "string"
          },
          "suspended_type": {
            "description": "Fetch suspended sales instead of completed ones: a comma-separated list of layaway, estimate or a sale type name.",
            "pattern": "^[A-Za-z0-9 _.-]{1,60}(,[A-Za-z0-9 _.-]{1,60}){0,4}$",
            "type": "string"
          },
          "verbosity": {
            "description": "minimal, medium (default) or full.",
            "enum": [
              "minimal",
              "medium",
              "full"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "phppos_list_sales"
    },
    {
      "description": "List or search suppliers with contact details, company, account number and balance. GET /suppliers.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "limit": {
            "description": "Rows per page, 1-100 (default 20).",
            "exclusiveMinimum": 0,
            "maximum": 100,
            "type": "integer"
          },
          "offset": {
            "description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report).",
            "maximum": 1000000,
            "minimum": 0,
            "type": "integer"
          },
          "search": {
            "description": "Free-text search.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "search_field": {
            "description": "Limit the search to one field.",
            "enum": [
              "first_name",
              "last_name",
              "email",
              "phone_number",
              "company_name",
              "account_number"
            ],
            "type": "string"
          },
          "sort_col": {
            "description": "Column to sort by (a field name of the rows).",
            "pattern": "^[a-z][a-z0-9_]{0,60}$",
            "type": "string"
          },
          "sort_dir": {
            "description": "Sort direction.",
            "enum": [
              "asc",
              "desc"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "phppos_list_suppliers"
    },
    {
      "description": "Run one of the store's reports and return it (title, summary, detail rows); `paging.next_offset` is set when more detail rows remain. Report keys and their inputs come from phppos_list_reports (for example summary_sales, top_sellers, inventory_low, summary_profit_and_loss, summary_taxes, closeout). Typical inputs go in `params`: start_date, end_date, sale_type, location_ids (array), category_id, supplier_id, customer_id, employee_id. A scoped key needs the Reports module plus that report's view permission. GET /reports/{report_key}.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "limit": {
            "description": "Rows per page, 1-500 (default 100).",
            "exclusiveMinimum": 0,
            "maximum": 500,
            "type": "integer"
          },
          "offset": {
            "description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report).",
            "maximum": 1000000,
            "minimum": 0,
            "type": "integer"
          },
          "params": {
            "additionalProperties": {
              "anyOf": [
                {
                  "maxLength": 300,
                  "type": "string"
                },
                {
                  "type": "number"
                },
                {
                  "type": "boolean"
                },
                {
                  "items": {
                    "anyOf": [
                      {
                        "maxLength": 300,
                        "type": "string"
                      },
                      {
                        "type": "number"
                      }
                    ]
                  },
                  "maxItems": 50,
                  "type": "array"
                }
              ]
            },
            "description": "The report's inputs as listed by phppos_list_reports, e.g. {\"start_date\":\"2026-10-01\",\"end_date\":\"2026-10-31\",\"location_ids\":[1]}. Do not put limit/offset here.",
            "propertyNames": {
              "type": "string"
            },
            "type": "object"
          },
          "report_key": {
            "description": "Report key from phppos_list_reports (for example summary_sales or inventory_low).",
            "pattern": "^[a-z][a-z0-9_]{0,80}$",
            "type": "string"
          }
        },
        "required": [
          "report_key"
        ],
        "type": "object"
      },
      "name": "phppos_run_report"
    },
    {
      "description": "WRITE: change fields of an existing customer; only the fields you pass are sent. Overwrites the current values. Needs a Read/Write API key. The store's 'edit customer' webhook, if configured, fires. POST /customers/{person_id}.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "account_number": {
            "description": "Customer account number.",
            "maxLength": 60,
            "type": "string"
          },
          "address_1": {
            "description": "Address line 1.",
            "maxLength": 200,
            "type": "string"
          },
          "address_2": {
            "description": "Address line 2.",
            "maxLength": 200,
            "type": "string"
          },
          "city": {
            "description": "City.",
            "maxLength": 100,
            "type": "string"
          },
          "comments": {
            "description": "Comments.",
            "maxLength": 2000,
            "type": "string"
          },
          "company_name": {
            "description": "Company name.",
            "maxLength": 200,
            "type": "string"
          },
          "country": {
            "description": "Country.",
            "maxLength": 100,
            "type": "string"
          },
          "email": {
            "description": "Email address.",
            "format": "email",
            "maxLength": 254,
            "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
            "type": "string"
          },
          "first_name": {
            "description": "First name.",
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "internal_notes": {
            "description": "Internal notes (not shown to the customer).",
            "maxLength": 4000,
            "type": "string"
          },
          "last_name": {
            "description": "Last name.",
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "person_id": {
            "description": "Customer person id (find it with phppos_list_customers).",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          },
          "phone_number": {
            "description": "Phone number.",
            "maxLength": 40,
            "minLength": 1,
            "type": "string"
          },
          "state": {
            "description": "State or region.",
            "maxLength": 100,
            "type": "string"
          },
          "taxable": {
            "description": "Whether sales to this customer are taxed.",
            "type": "boolean"
          },
          "zip": {
            "description": "Postal code.",
            "maxLength": 30,
            "type": "string"
          }
        },
        "required": [
          "person_id"
        ],
        "type": "object"
      },
      "name": "phppos_update_customer"
    },
    {
      "description": "WRITE: change fields of an existing item (for example its price, category or active state); only the fields you pass are sent. Overwrites the current values, and a price change applies to the next sale. Needs a Read/Write API key. The store's 'edit item' webhook, if configured, fires. POST /items/{item_id}.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "category_id": {
            "description": "Category id - see phppos_list_categories.",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          },
          "cost_price": {
            "description": "Cost price.",
            "maximum": 10000000000,
            "minimum": 0,
            "type": "number"
          },
          "description": {
            "description": "Short description.",
            "maxLength": 1000,
            "type": "string"
          },
          "is_service": {
            "description": "True for a service (no stock tracking).",
            "type": "boolean"
          },
          "item_id": {
            "description": "Item id (find it with phppos_list_items).",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          },
          "item_inactive": {
            "description": "True to deactivate the item (it can no longer be sold).",
            "type": "boolean"
          },
          "item_number": {
            "description": "Barcode / item number (UPC).",
            "maxLength": 100,
            "type": "string"
          },
          "name": {
            "description": "Item name.",
            "maxLength": 255,
            "minLength": 1,
            "type": "string"
          },
          "product_id": {
            "description": "Product id / SKU.",
            "maxLength": 100,
            "type": "string"
          },
          "promo_price": {
            "description": "Promotional price.",
            "maximum": 10000000000,
            "minimum": 0,
            "type": "number"
          },
          "reorder_level": {
            "description": "Stock level at which the item shows as low.",
            "maximum": 1000000000,
            "minimum": 0,
            "type": "number"
          },
          "size": {
            "description": "Size.",
            "maxLength": 100,
            "type": "string"
          },
          "supplier_id": {
            "description": "Supplier person id - see phppos_list_suppliers.",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          },
          "tags": {
            "description": "Tag names.",
            "items": {
              "maxLength": 60,
              "minLength": 1,
              "type": "string"
            },
            "maxItems": 20,
            "type": "array"
          },
          "unit_price": {
            "description": "Selling price.",
            "maximum": 10000000000,
            "minimum": 0,
            "type": "number"
          }
        },
        "required": [
          "item_id"
        ],
        "type": "object"
      },
      "name": "phppos_update_item"
    }
  ]
}

What the leaf hashes

{"body":"ba695b0b1bac5b085fd2a60f94b186ed83463315adb6fe41aa40a55d14714efd","id":301457,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793054082279185,"prev":null,"subject":"37744c3b-545c-48c9-8155-cca2c278c4cb","subject_kind":"endpoint"}

Proof

Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (296695 rows).

  1. 0xa385eb4f68591c084c236ea4e7fb91ac44fdce1a39bd6f722444151b3a7445aa
  2. 0xadc62bdba538873a41fb8a433056bf291d20467662be2f650063be98982a1b16
  3. 0x67b7f2d5e7d46820d6a0c1e2433fe36bbcb344d4d79c51bf0968b46fd16e6bc2
  4. 0xce740f3f164f37dc1c761d92b57d45747597ede2edcc5a71a28a2f6aa46fb260
  5. 0x494e385df373d1a13192a7e4ae6c488e733152d1791c623e9f8d40c7f1144eca
  6. 0x1a2840e695d291c2ff2a32e678caf88345e3749075c5d99541ff6b6746c8880c
  7. 0xc773931e4b2e393a56853f26c86044b6dcdc2a015715e319a9c03575cdfa82d5
  8. 0x4a2dca25f350e7dda310d606117ef4a4378aa511406e32a7c75d9e4ac5fb4282
  9. 0x7669bf7267794b47cf2b8311fbdc9ed0b8e4d496ed021df4f3e43f25125a5e13
  10. 0xbf9e8e8193260b284eff6ae5de9bd74a29a95af639484d57bcbf0408a7dd8030
  11. 0xf02ec0f13d875e636ca9d24097cc2a185cdb09429c8c4ade598b8089f42bb140
  12. 0x19537c574979327583a539261287714af2eee831125de819abab0f155acd3a75
  13. 0xc34c13c58ba9c342ea1b833ac1882a4aea22777c4fd1092b2f83d3bac6b9f845
  14. 0x428106f4ae4ec142f17aebf6fa50935242f8d3f1c211cf95d6351d03d11da2b7
  15. 0x62a900133713919f4eed33d8336876b7a6d538233b8a4f3ed03b29aa44f5bad0
  16. 0x1ac20d30773e1f4f2f811540e9a99b5cca9177c9e2e029acc0d80cf3f1d11f0f
  17. 0xd21942ae3214eff88e08ab04884fd4b11958b51af9a0741b7668e2d07a2c56c9
  18. 0x9a9024edb5069d88a324facb310a5ce8e495214bbaa968f077bede437390194f
  19. 0x9b9ce5b74b9bab5121612ef6b64920a8d453cbf311096a423eef9702747e868a
Day root
0xf43e8dcc3d451a4788b26be904c55e8c4c0fa75c9666796c51db38d37e2c0df8
Chained
0x702d5ac508f08b0d1accf36af25822d8e5660367494edd17a642fb61e158a57a
Published
On Arc Testnet, block 69251483: 0x495162f8936e19f0039918feebe6c307f327cd6bf8c37219620b1970041fa9ae

How to check it · This row as JSON