addrbookFor publishers
← The evidence ledger

Evidence row 1773317

Observed , by probe.mcp/1.

Kind
mcp.tools
About
endpoint b0915455-f106-45f9-a74c-f37d69ef3450
Recorded
Previous row
None: the first of its kind about this subject
Body SHA-256
e2d318f8c8c554046709e2c636a84765722454593a8dc63903c1801de48d2c10
Leaf
0x692ba263e33c26d4f35b6aaa7b9ed7acbd3da450481d962314ca9cdc1736cdfe

What was observed

{
  "count": 7,
  "tools": [
    {
      "description": "Books an appointment for an existing customer (customer_id) or a new one (new_customer). Two steps: first call without confirm to get a preview and show it to the person; only after they agree, call again with the same arguments, confirm: true, the confirmation_token from the preview and an idempotency_key. Easy!Appointments then sends its usual confirmation emails.",
      "inputSchema": {
        "properties": {
          "confirm": {
            "description": "Leave false (the default) to get a preview without changing anything. Set true only after the person has seen the preview and agreed.",
            "type": "boolean"
          },
          "confirmation_token": {
            "description": "Required when confirm is true: the confirmation_token from the preview of exactly these arguments. It expires after a few minutes; if it has, get a new preview.",
            "type": "string"
          },
          "customer_id": {
            "description": "An existing customer, from find_customer. Give this or new_customer.",
            "type": "integer"
          },
          "idempotency_key": {
            "description": "Required when confirm is true. Any unique string, for example a UUID. Reusing it with the same arguments returns the first result instead of acting twice.",
            "type": "string"
          },
          "new_customer": {
            "description": "Details for someone not yet in the system. If the email already belongs to a customer, that customer is used. Some businesses also require phone, address, city or zip_code; the preview says which are missing.",
            "properties": {
              "address": {
                "type": "string"
              },
              "city": {
                "type": "string"
              },
              "email": {
                "format": "email",
                "type": "string"
              },
              "first_name": {
                "type": "string"
              },
              "last_name": {
                "type": "string"
              },
              "phone": {
                "type": "string"
              },
              "zip_code": {
                "type": "string"
              }
            },
            "required": [
              "first_name",
              "last_name",
              "email"
            ],
            "type": "object"
          },
          "notes": {
            "description": "Optional note visible to staff.",
            "maxLength": 500,
            "type": "string"
          },
          "provider_id": {
            "description": "From list_services or find_open_slots.",
            "type": "integer"
          },
          "service_id": {
            "description": "From list_services.",
            "type": "integer"
          },
          "start": {
            "description": "Start time \"YYYY-MM-DD HH:MM\" in the provider's time zone, exactly as find_open_slots returned it.",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$",
            "type": "string"
          }
        },
        "required": [
          "service_id",
          "provider_id",
          "start"
        ],
        "type": "object"
      },
      "name": "book_appointment"
    },
    {
      "description": "Cancels an upcoming appointment. Easy!Appointments deletes it and emails the customer a cancellation notice; this cannot be undone. Two steps: call without confirm for a preview, then, after the person agrees, again with confirm: true, the confirmation_token from the preview and an idempotency_key.",
      "inputSchema": {
        "properties": {
          "appointment_id": {
            "description": "From list_appointments.",
            "type": "integer"
          },
          "confirm": {
            "description": "Leave false (the default) to get a preview without changing anything. Set true only after the person has seen the preview and agreed.",
            "type": "boolean"
          },
          "confirmation_token": {
            "description": "Required when confirm is true: the confirmation_token from the preview of exactly these arguments. It expires after a few minutes; if it has, get a new preview.",
            "type": "string"
          },
          "idempotency_key": {
            "description": "Required when confirm is true. Any unique string, for example a UUID. Reusing it with the same arguments returns the first result instead of acting twice.",
            "type": "string"
          },
          "reason": {
            "description": "Optional reason. It is kept in this server's call log; Easy!Appointments has nowhere to store it.",
            "maxLength": 300,
            "type": "string"
          }
        },
        "required": [
          "appointment_id"
        ],
        "type": "object"
      },
      "name": "cancel_appointment"
    },
    {
      "description": "Searches customers by name, email or phone and returns up to 10 matches with their customer_id. If several people match, ask which one is meant before booking.",
      "inputSchema": {
        "properties": {
          "query": {
            "description": "Part of a name, an email address or a phone number.",
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "name": "find_customer"
    },
    {
      "description": "Finds open start times for one service over a range of days, across every provider who offers it or just one. Times are in the time zone of each provider, given in the result. Use this before booking or rescheduling.",
      "inputSchema": {
        "properties": {
          "date_from": {
            "description": "First day to search, YYYY-MM-DD. Defaults to today.",
            "format": "date",
            "type": "string"
          },
          "days": {
            "default": 7,
            "description": "How many days to search, 1 to 14. Default 7.",
            "maximum": 14,
            "minimum": 1,
            "type": "integer"
          },
          "part_of_day": {
            "default": "any",
            "description": "morning is before 12:00, afternoon 12:00 to 17:00, evening from 17:00.",
            "enum": [
              "any",
              "morning",
              "afternoon",
              "evening"
            ],
            "type": "string"
          },
          "provider_id": {
            "description": "Optional: only this provider.",
            "type": "integer"
          },
          "service_id": {
            "description": "The service, from list_services.",
            "type": "integer"
          }
        },
        "required": [
          "service_id"
        ],
        "type": "object"
      },
      "name": "find_open_slots"
    },
    {
      "description": "Lists appointments for a customer, a provider and/or a date range, earliest first. Give at least one of customer_id, provider_id or date_from. Without dates it shows the next 30 days.",
      "inputSchema": {
        "properties": {
          "customer_id": {
            "description": "From find_customer.",
            "type": "integer"
          },
          "date_from": {
            "description": "YYYY-MM-DD. Defaults to today; give an earlier date to see past visits.",
            "format": "date",
            "type": "string"
          },
          "date_to": {
            "description": "YYYY-MM-DD, inclusive. Defaults to 30 days after date_from.",
            "format": "date",
            "type": "string"
          },
          "provider_id": {
            "description": "From list_services.",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "list_appointments"
    },
    {
      "description": "Lists the services this business offers (length, price) and which providers offer each one. Call this first to get the service_id and provider_id that the other tools need.",
      "inputSchema": {
        "properties": {
          "query": {
            "description": "Optional words to filter services by name, for example \"massage\".",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_services"
    },
    {
      "description": "Moves an appointment to a new start time, optionally with another provider who offers the same service. Two steps: call without confirm for a preview, then, after the person agrees, again with confirm: true, the confirmation_token from the preview and an idempotency_key. Easy!Appointments emails the customer about the change.",
      "inputSchema": {
        "properties": {
          "appointment_id": {
            "description": "From list_appointments.",
            "type": "integer"
          },
          "confirm": {
            "description": "Leave false (the default) to get a preview without changing anything. Set true only after the person has seen the preview and agreed.",
            "type": "boolean"
          },
          "confirmation_token": {
            "description": "Required when confirm is true: the confirmation_token from the preview of exactly these arguments. It expires after a few minutes; if it has, get a new preview.",
            "type": "string"
          },
          "idempotency_key": {
            "description": "Required when confirm is true. Any unique string, for example a UUID. Reusing it with the same arguments returns the first result instead of acting twice.",
            "type": "string"
          },
          "new_start": {
            "description": "New start \"YYYY-MM-DD HH:MM\" in the time zone of the provider it moves to, from find_open_slots.",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$",
            "type": "string"
          },
          "provider_id": {
            "description": "Optional: move to this provider. Defaults to the current one.",
            "type": "integer"
          }
        },
        "required": [
          "appointment_id",
          "new_start"
        ],
        "type": "object"
      },
      "name": "reschedule_appointment"
    }
  ]
}

What the leaf hashes

{"body":"e2d318f8c8c554046709e2c636a84765722454593a8dc63903c1801de48d2c10","id":1773317,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793549647568824,"prev":null,"subject":"b0915455-f106-45f9-a74c-f37d69ef3450","subject_kind":"endpoint"}

Proof

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

  1. 0x692b2baed72fb089832e7b2a0865351f84227d69a0ee8ca2e8ef85b226e78852
  2. 0x0a80a04e9db518cf2ff090463a7d6f4dbef60a9a5fd2f067278a984d8dd364a4
  3. 0xfb449aa2cf7177f976bec6f82ed3c8b337d67833daaf692e1f7e5164ce93c50a
  4. 0x03fe207aad4ff3e31bdf113dedd70ddfab754e31222a113605939f585603c097
  5. 0xe61579be7ed917875b021e85db0ca43d8f0b5bc21fa7dc5c0bd5e133db1842b4
  6. 0x7d4fc9377d11f3b084ecbe52de7e1dc93149ab8af48a5cad4ea4a1bbd3a5f424
  7. 0x53f661fa62534d4b6be1f10622cd6103bac64a6582bf777439f0ad709c157881
  8. 0xc10387502f9637235d27b2340b4cdddd456ff4a33eedf839ffcd99dde64aacd2
  9. 0x88fd161bd1f225ad33b1d009b9ac1bb0850176cd29c7d572b93634341fc32c79
  10. 0xe31fe076ab1d5d8644ab07367c86e48ab1ed58c57e02d35dc17c149ed53e3920
  11. 0x5e4280c78939f977e275e0570d59df002e83de59934503fb0c671bd69811f013
  12. 0x082cc0844c6c4e55133c8a44c078d05583a65e206348868f0758a93ed4cd8a0b
  13. 0x2083851c78484f99ed7086ac61a83081da68bd1ce3b2dfd9a06ce2a7a13fdb11
  14. 0x6e52ec74954b02fa6342c949413ce6ced87071b172b1bcf0f6191252f67257fa
  15. 0x7c66173839ef153f08dfd346f7ea956e9226e1b7ff05bf4c6cf27436953f336b
  16. 0xc1f6e8dd182b37cbb6e04d0e69486bd40d440934f8e373b9bae8cb78de508bba
  17. 0x97f6f39e601b6ef0e47b730aa0488b718c0d7882ad840342bbd7d3a705a1b3a2
  18. 0x1973893697931b7512ae5dc1a3c92ef92f633ae3574dce9029a35b5e94d2d364
  19. 0x3315fd2757fdd435852cc277377234a3f3909a6d2a089d0e36f6d59aacfda910
Day root
0x7fa2cba1cf3d6b35630896f5fe1a650adb307ea2c376e80a5f2d9276b7cb5ab3
Chained
0x577ff89ba012beeff3197bcff7fa86752074bdf54205a24359cc437be2a952a4
Published
On Arc Testnet, block 70262758: 0x435bc1b9331471d72e1998f2e420983b5189d4da65ffbd6f27ef40daf5e1ea90

How to check it · This row as JSON