addrbookFor publishers
← The evidence ledger

Evidence row 294427

Observed , by probe.mcp/1.

Kind
mcp.tools
About
endpoint 574dabaf-a59e-48d1-8aa0-603ab05e6b92
Recorded
Previous row
None: the first of its kind about this subject
Body SHA-256
9538d2da95670e4653793f4aabf6341139cc644cfca18d8d446c0657a888638d
Leaf
0x5962fce85412b839cc2fb0ae71c8b25d6e8b42f32fe93902ac9af70c0065aa8d

What was observed

{
  "count": 10,
  "tools": [
    {
      "description": "Create a new form, including per-screen conditional logic. Requires a WRITE-scoped API key.\n\nArgs:\n  - title (string): form title (required)\n  - description (string, optional)\n  - theme (string, optional): one of amber|base|midnight|ocean|sunset|forest|lavender|minimal (default amber, the copper-to-amber FoxForm theme)\n  - questions (array, optional): array of screen objects ({ id, type, title, required, variableName?, choices?, logic?, ... }); omit to start empty\n  - thank_you_message (string, optional)\n  - format ('single_question' | 'single_page' | 'chatbot', optional): how the form is presented (see below)\n  - sections (array, optional): single_page page groups, [{ id }]\n  - chatbot_skin ('instagram' | 'whatsapp', optional): chatbot chrome\n  - chatbot_profile (object, optional): chatbot header profile ({ name, handle, followers_text, phone, status, verified, avatar_url })\n\nReturns: { form } with the created form (including its id and slug). The form starts as a draft — call foxform_publish_form to make it live.\n\nScreen fields are validated: unknown fields are REJECTED instead of being stored and ignored, and branching rules are cross-checked against the screen ids in the same payload.\n\nForm format (DEVF-296 / DEVF-322): pass `format` to choose how the form is presented.\n- 'single_question' (default): one screen at a time (classic).\n- 'single_page': every screen on one scrollable page. Optionally group screens into pages with `sections`: `[{ id }]` in order (the 'Section N' label comes from position; no editable title).\n- 'chatbot': an Instagram/WhatsApp DM-style conversation. Set `chatbot_skin` ('instagram' | 'whatsapp', default instagram) and `chatbot_profile` (all fields optional, each with a fallback). The question/branching engine is unchanged — only the presentation differs.\nThese fields require the account's form-format feature to be enabled (live in production); when off the API ignores them and the form stays single_question.\n\nCONDITIONAL LOGIC (branching), per screen — stored in `questions[].logic`:\n\n  logic.conditionalNavigationV2 = {\n    enabled: true,\n    groups: [                       // groups are OR-joined; FIRST matching group wins\n      {\n        id: \"grp-1\",\n        conditions: [               // conditions inside a group are AND-joined\n          { id: \"cond-1\", left: \"{{quer_testar}}\", operator: \"equal_to\", right: \"Ainda não\" }\n        ],\n        then: { type: \"specific_screen\", targetScreenId: \"s-motivos\" }\n      }\n    ]\n  }\n\n- `then.type`: 'next_screen' | 'previous_screen' | 'specific_screen' (needs targetScreenId = another screen's `id`) | 'end_form'.\n  Add `then.url` (+ optional `openNewTab`) to redirect to an external URL instead.\n- `operator`: 'equal_to' | 'not_equal_to' | 'greater_than' | 'greater_or_equal_than' | 'less_than' | 'less_or_equal_than' | 'contains'.\n- `left`/`right` are EXPRESSION strings: a literal (\"10\", \"Ainda não\"), a variable (\"{{score}}\", \"{{minha_var}}\" = the screen's `variableName`), or arithmetic (\"calc({{peso}}/(({{altura}}/100)*({{altura}}/100)))\").\n- Comparing an ANSWER: use `left: \"{{<variableName of the deciding screen>}}\"` and `right` = the option's `label` OR its `value` (both match).\n- `{{score}}` is the running sum of `points` on the options picked so far (`choices[].points`, `images[].points`) — that is how score-based branching works.\n- A navigation group with no conditions NEVER matches. `enabled: false` stores the rules but disables them.\n- Screen-level conditional display uses the same group shape: `logic.display = { enabled: true, groups: [...], showAfterSeconds?: n }` (`then` is ignored — THEN means \"show\").\n- Other logic keys: `logic.autoAdvance = { enabled, delaySeconds? }`, `logic.navigationBehavior = { onButtonClick?, onAutoAdvance?, targetScreenId? }`.\n- `logic.conditionalNavigation` (legacy, pre-DEVF-161) is still read and migrated on load — don't author new rules with it.\n\nUnknown fields are REJECTED (they used to be stored and silently ignored): `logic` as an array, or `rules`/`branching`/`conditions`/`goto`/`jump`/`nextScreen` anywhere, are not read by any renderer.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "chatbot_profile": {
            "additionalProperties": false,
            "description": "chatbot only: the profile shown in the chat header.",
            "properties": {
              "avatar_url": {
                "description": "Avatar image URL; falls back to the name's initials.",
                "type": "string"
              },
              "followers_text": {
                "description": "Free text under the name, e.g. followers/posts (Instagram only).",
                "type": "string"
              },
              "handle": {
                "description": "Instagram @handle (Instagram skin only).",
                "type": "string"
              },
              "name": {
                "description": "Display name in the chat header (both skins; default 'Sua Marca').",
                "type": "string"
              },
              "phone": {
                "description": "Shown phone number (WhatsApp skin only).",
                "type": "string"
              },
              "status": {
                "description": "Header status line (both skins; empty on WhatsApp shows the phone).",
                "type": "string"
              },
              "verified": {
                "description": "Blue verified badge (Instagram only; default true).",
                "type": "boolean"
              }
            },
            "type": "object"
          },
          "chatbot_skin": {
            "description": "chatbot only: chat chrome to imitate — 'instagram' (default) or 'whatsapp'.",
            "enum": [
              "instagram",
              "whatsapp"
            ],
            "type": "string"
          },
          "description": {
            "description": "Optional description",
            "maxLength": 2000,
            "type": "string"
          },
          "format": {
            "description": "Form format: 'single_question' (default — one screen at a time), 'single_page' (all screens on one scrollable page, grouped by `sections`), or 'chatbot' (an Instagram/WhatsApp DM-style conversation; set `chatbot_skin` + `chatbot_profile`).",
            "enum": [
              "single_question",
              "single_page",
              "chatbot"
            ],
            "type": "string"
          },
          "questions": {
            "description": "Screen objects; omit for an empty form. Conditional logic goes in each screen's `logic` (see the tool description).",
            "items": {
              "additionalProperties": {},
              "type": "object"
            },
            "type": "array"
          },
          "sections": {
            "description": "single_page only: the page groups as `[{ id }]`, in order. The 'Section N' label is derived from position; sections have no editable title.",
            "items": {
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "thank_you_message": {
            "maxLength": 2000,
            "type": "string"
          },
          "theme": {
            "description": "Theme key: amber|base|midnight|ocean|sunset|forest|lavender|minimal (default amber)",
            "type": "string"
          },
          "title": {
            "description": "Form title",
            "maxLength": 255,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "title"
        ],
        "type": "object"
      },
      "name": "foxform_create_form"
    },
    {
      "description": "Export all responses for a form as CSV text (one row per response, columns = questions). Large exports are truncated — use foxform_list_responses with pagination for very large datasets.\n\nArgs:\n  - form_id (string)\n\nReturns: raw CSV text.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "form_id": {
            "description": "Form ID",
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "form_id"
        ],
        "type": "object"
      },
      "name": "foxform_export_responses"
    },
    {
      "description": "Fetch a single form by ID, including its full question list, per-screen conditional logic and settings.\n\nArgs:\n  - form_id (string): the form's ID (from foxform_list_forms)\n  - response_format ('markdown' | 'json')\n\nReturns { form, public_url }: the full form object (id, title, description, slug, status, theme, questions[], thank_you_message, timestamps, plus `format` and — when set — `sections`, `chatbot_skin`, `chatbot_profile`) plus `public_url` — the public link (`https://forms.foxform.app/<slug>`), which is live only when status is 'published'. Use `public_url` verbatim; never build the URL yourself (the public domain is forms.foxform.app, not foxform.app).\nEach screen in `questions[]` carries its own `logic` (branching / conditional display) and, for choice screens, `choices[]`/`images[]` with their `points` and `value`. The markdown output summarises every rule; use response_format 'json' to get the exact stored objects (that's the shape foxform_update_form expects back).\n\nForm format (DEVF-296 / DEVF-322): pass `format` to choose how the form is presented.\n- 'single_question' (default): one screen at a time (classic).\n- 'single_page': every screen on one scrollable page. Optionally group screens into pages with `sections`: `[{ id }]` in order (the 'Section N' label comes from position; no editable title).\n- 'chatbot': an Instagram/WhatsApp DM-style conversation. Set `chatbot_skin` ('instagram' | 'whatsapp', default instagram) and `chatbot_profile` (all fields optional, each with a fallback). The question/branching engine is unchanged — only the presentation differs.\nThese fields require the account's form-format feature to be enabled (live in production); when off the API ignores them and the form stays single_question.\n\nCONDITIONAL LOGIC (branching), per screen — stored in `questions[].logic`:\n\n  logic.conditionalNavigationV2 = {\n    enabled: true,\n    groups: [                       // groups are OR-joined; FIRST matching group wins\n      {\n        id: \"grp-1\",\n        conditions: [               // conditions inside a group are AND-joined\n          { id: \"cond-1\", left: \"{{quer_testar}}\", operator: \"equal_to\", right: \"Ainda não\" }\n        ],\n        then: { type: \"specific_screen\", targetScreenId: \"s-motivos\" }\n      }\n    ]\n  }\n\n- `then.type`: 'next_screen' | 'previous_screen' | 'specific_screen' (needs targetScreenId = another screen's `id`) | 'end_form'.\n  Add `then.url` (+ optional `openNewTab`) to redirect to an external URL instead.\n- `operator`: 'equal_to' | 'not_equal_to' | 'greater_than' | 'greater_or_equal_than' | 'less_than' | 'less_or_equal_than' | 'contains'.\n- `left`/`right` are EXPRESSION strings: a literal (\"10\", \"Ainda não\"), a variable (\"{{score}}\", \"{{minha_var}}\" = the screen's `variableName`), or arithmetic (\"calc({{peso}}/(({{altura}}/100)*({{altura}}/100)))\").\n- Comparing an ANSWER: use `left: \"{{<variableName of the deciding screen>}}\"` and `right` = the option's `label` OR its `value` (both match).\n- `{{score}}` is the running sum of `points` on the options picked so far (`choices[].points`, `images[].points`) — that is how score-based branching works.\n- A navigation group with no conditions NEVER matches. `enabled: false` stores the rules but disables them.\n- Screen-level conditional display uses the same group shape: `logic.display = { enabled: true, groups: [...], showAfterSeconds?: n }` (`then` is ignored — THEN means \"show\").\n- Other logic keys: `logic.autoAdvance = { enabled, delaySeconds? }`, `logic.navigationBehavior = { onButtonClick?, onAutoAdvance?, targetScreenId? }`.\n- `logic.conditionalNavigation` (legacy, pre-DEVF-161) is still read and migrated on load — don't author new rules with it.\n\nUnknown fields are REJECTED (they used to be stored and silently ignored): `logic` as an array, or `rules`/`branching`/`conditions`/`goto`/`jump`/`nextScreen` anywhere, are not read by any renderer.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "form_id": {
            "description": "Form ID",
            "minLength": 1,
            "type": "string"
          },
          "response_format": {
            "default": "markdown",
            "description": "Output format: 'markdown' (human-readable) or 'json' (machine-readable)",
            "enum": [
              "markdown",
              "json"
            ],
            "type": "string"
          }
        },
        "required": [
          "form_id"
        ],
        "type": "object"
      },
      "name": "foxform_get_form"
    },
    {
      "description": "Aggregated analytics for a form: overview KPIs (total responses, form views, response rate, avg response time), the responses-over-time timeline, and per-question stats.\n\nArgs:\n  - form_id (string)\n  - response_format ('markdown' | 'json')\n\nReturns: { overview, timeline: [{date,count}], questions: [...], response_time_distribution?, views_timeline? }.\nNote: form_views / response_rate are null until the form has tracked views (forward-only).",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "form_id": {
            "description": "Form ID",
            "minLength": 1,
            "type": "string"
          },
          "response_format": {
            "default": "markdown",
            "description": "Output format: 'markdown' (human-readable) or 'json' (machine-readable)",
            "enum": [
              "markdown",
              "json"
            ],
            "type": "string"
          }
        },
        "required": [
          "form_id"
        ],
        "type": "object"
      },
      "name": "foxform_get_form_analytics"
    },
    {
      "description": "Fetch one response by its ID (from foxform_list_responses).\n\nArgs:\n  - response_id (string)\n  - response_format ('markdown' | 'json')\n\nReturns the full response object (id, form_id, answers, submitted_at, metadata).",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "response_format": {
            "default": "markdown",
            "description": "Output format: 'markdown' (human-readable) or 'json' (machine-readable)",
            "enum": [
              "markdown",
              "json"
            ],
            "type": "string"
          },
          "response_id": {
            "description": "Response ID",
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "response_id"
        ],
        "type": "object"
      },
      "name": "foxform_get_response"
    },
    {
      "description": "List the forms owned by the authenticated FoxForm account, newest first.\n\nArgs:\n  - page (number): 1-based page number (default 1)\n  - limit (number): page size, 1-100 (default 20)\n  - response_format ('markdown' | 'json'): output format (default markdown)\n\nReturns: { total, page, limit, count, forms: [{ id, title, status, slug, public_url, questions_count, updated_at }] }\nThe public link of a form is `public_url` (`https://forms.foxform.app/<slug>`) — always use this exact value, do NOT build the URL yourself (the public domain is forms.foxform.app, not foxform.app). `public_url` is only live when `status` is 'published'.\nUse this first to discover form IDs, then call foxform_get_form / foxform_get_form_analytics.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "limit": {
            "default": 20,
            "description": "Page size (1-100)",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "page": {
            "default": 1,
            "description": "1-based page number",
            "minimum": 1,
            "type": "integer"
          },
          "response_format": {
            "default": "markdown",
            "description": "Output format: 'markdown' (human-readable) or 'json' (machine-readable)",
            "enum": [
              "markdown",
              "json"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "foxform_list_forms"
    },
    {
      "description": "List submitted responses for a form, newest first.\n\nArgs:\n  - form_id (string): the form's ID\n  - page (number): 1-based page (default 1)\n  - limit (number): page size, 1-100 (default 20)\n  - response_format ('markdown' | 'json')\n\nReturns: { total, page, limit, count, responses: [{ id, submitted_at, answers }] }.\nFor aggregate metrics use foxform_get_form_analytics; for a full dump use foxform_export_responses.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "form_id": {
            "description": "Form ID",
            "minLength": 1,
            "type": "string"
          },
          "limit": {
            "default": 20,
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "page": {
            "default": 1,
            "minimum": 1,
            "type": "integer"
          },
          "response_format": {
            "default": "markdown",
            "description": "Output format: 'markdown' (human-readable) or 'json' (machine-readable)",
            "enum": [
              "markdown",
              "json"
            ],
            "type": "string"
          }
        },
        "required": [
          "form_id"
        ],
        "type": "object"
      },
      "name": "foxform_list_responses"
    },
    {
      "description": "Publish a form so it's live at its public URL and can accept responses. Requires a WRITE-scoped API key.\n\nArgs:\n  - form_id (string)\n\nReturns: { form, public_url } — the published form (status 'published') and its live public link `https://forms.foxform.app/<slug>`. When sharing the link with the user, use `public_url` EXACTLY as returned; do NOT build the URL yourself (the public domain is forms.foxform.app, NOT foxform.app or the API/app domain). (May fail with a plan-limit error on Free accounts.)",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "form_id": {
            "description": "Form ID",
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "form_id"
        ],
        "type": "object"
      },
      "name": "foxform_publish_form"
    },
    {
      "description": "Unpublish a form (takes it offline; stops accepting responses). Requires a WRITE-scoped API key.\n\nArgs:\n  - form_id (string)\n\nReturns: a confirmation message.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "form_id": {
            "description": "Form ID",
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "form_id"
        ],
        "type": "object"
      },
      "name": "foxform_unpublish_form"
    },
    {
      "description": "Update an existing form's fields, including each screen's conditional logic (branching). Requires a WRITE-scoped API key. Only the fields you pass are changed.\n\nArgs:\n  - form_id (string): the form to update (required)\n  - title (string, optional)\n  - description (string, optional)\n  - theme (string, optional): one of amber|base|midnight|ocean|sunset|forest|lavender|minimal\n  - questions (array, optional): replaces the FULL screen list — there is no per-screen patch. To add logic to one screen: call foxform_get_form with response_format 'json', edit that screen's `logic`, and send the whole array back.\n  - thank_you_message (string, optional)\n  - format ('single_question' | 'single_page' | 'chatbot', optional)\n  - sections (array, optional): single_page page groups, [{ id }]\n  - chatbot_skin ('instagram' | 'whatsapp', optional)\n  - chatbot_profile (object, optional): chatbot header profile ({ name, handle, followers_text, phone, status, verified, avatar_url })\n\nReturns: { form } with the updated form.\n\nScreen fields are validated: unknown fields are REJECTED instead of being stored and ignored (the API accepts arbitrary keys but no renderer reads them), `then.targetScreenId` must be the id of a screen in the same payload, and `{{variables}}` that no screen exposes come back as warnings.\n\nForm format (DEVF-296 / DEVF-322): pass `format` to choose how the form is presented.\n- 'single_question' (default): one screen at a time (classic).\n- 'single_page': every screen on one scrollable page. Optionally group screens into pages with `sections`: `[{ id }]` in order (the 'Section N' label comes from position; no editable title).\n- 'chatbot': an Instagram/WhatsApp DM-style conversation. Set `chatbot_skin` ('instagram' | 'whatsapp', default instagram) and `chatbot_profile` (all fields optional, each with a fallback). The question/branching engine is unchanged — only the presentation differs.\nThese fields require the account's form-format feature to be enabled (live in production); when off the API ignores them and the form stays single_question.\n\nCONDITIONAL LOGIC (branching), per screen — stored in `questions[].logic`:\n\n  logic.conditionalNavigationV2 = {\n    enabled: true,\n    groups: [                       // groups are OR-joined; FIRST matching group wins\n      {\n        id: \"grp-1\",\n        conditions: [               // conditions inside a group are AND-joined\n          { id: \"cond-1\", left: \"{{quer_testar}}\", operator: \"equal_to\", right: \"Ainda não\" }\n        ],\n        then: { type: \"specific_screen\", targetScreenId: \"s-motivos\" }\n      }\n    ]\n  }\n\n- `then.type`: 'next_screen' | 'previous_screen' | 'specific_screen' (needs targetScreenId = another screen's `id`) | 'end_form'.\n  Add `then.url` (+ optional `openNewTab`) to redirect to an external URL instead.\n- `operator`: 'equal_to' | 'not_equal_to' | 'greater_than' | 'greater_or_equal_than' | 'less_than' | 'less_or_equal_than' | 'contains'.\n- `left`/`right` are EXPRESSION strings: a literal (\"10\", \"Ainda não\"), a variable (\"{{score}}\", \"{{minha_var}}\" = the screen's `variableName`), or arithmetic (\"calc({{peso}}/(({{altura}}/100)*({{altura}}/100)))\").\n- Comparing an ANSWER: use `left: \"{{<variableName of the deciding screen>}}\"` and `right` = the option's `label` OR its `value` (both match).\n- `{{score}}` is the running sum of `points` on the options picked so far (`choices[].points`, `images[].points`) — that is how score-based branching works.\n- A navigation group with no conditions NEVER matches. `enabled: false` stores the rules but disables them.\n- Screen-level conditional display uses the same group shape: `logic.display = { enabled: true, groups: [...], showAfterSeconds?: n }` (`then` is ignored — THEN means \"show\").\n- Other logic keys: `logic.autoAdvance = { enabled, delaySeconds? }`, `logic.navigationBehavior = { onButtonClick?, onAutoAdvance?, targetScreenId? }`.\n- `logic.conditionalNavigation` (legacy, pre-DEVF-161) is still read and migrated on load — don't author new rules with it.\n\nUnknown fields are REJECTED (they used to be stored and silently ignored): `logic` as an array, or `rules`/`branching`/`conditions`/`goto`/`jump`/`nextScreen` anywhere, are not read by any renderer.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "chatbot_profile": {
            "additionalProperties": false,
            "description": "chatbot only: the profile shown in the chat header.",
            "properties": {
              "avatar_url": {
                "description": "Avatar image URL; falls back to the name's initials.",
                "type": "string"
              },
              "followers_text": {
                "description": "Free text under the name, e.g. followers/posts (Instagram only).",
                "type": "string"
              },
              "handle": {
                "description": "Instagram @handle (Instagram skin only).",
                "type": "string"
              },
              "name": {
                "description": "Display name in the chat header (both skins; default 'Sua Marca').",
                "type": "string"
              },
              "phone": {
                "description": "Shown phone number (WhatsApp skin only).",
                "type": "string"
              },
              "status": {
                "description": "Header status line (both skins; empty on WhatsApp shows the phone).",
                "type": "string"
              },
              "verified": {
                "description": "Blue verified badge (Instagram only; default true).",
                "type": "boolean"
              }
            },
            "type": "object"
          },
          "chatbot_skin": {
            "description": "chatbot only: chat chrome to imitate — 'instagram' (default) or 'whatsapp'.",
            "enum": [
              "instagram",
              "whatsapp"
            ],
            "type": "string"
          },
          "description": {
            "maxLength": 2000,
            "type": "string"
          },
          "form_id": {
            "description": "Form ID",
            "minLength": 1,
            "type": "string"
          },
          "format": {
            "description": "Form format: 'single_question' (default — one screen at a time), 'single_page' (all screens on one scrollable page, grouped by `sections`), or 'chatbot' (an Instagram/WhatsApp DM-style conversation; set `chatbot_skin` + `chatbot_profile`).",
            "enum": [
              "single_question",
              "single_page",
              "chatbot"
            ],
            "type": "string"
          },
          "questions": {
            "description": "Replaces the full screen list. Conditional logic goes in each screen's `logic` (see the tool description).",
            "items": {
              "additionalProperties": {},
              "type": "object"
            },
            "type": "array"
          },
          "sections": {
            "description": "single_page only: the page groups as `[{ id }]`, in order. The 'Section N' label is derived from position; sections have no editable title.",
            "items": {
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "thank_you_message": {
            "maxLength": 2000,
            "type": "string"
          },
          "theme": {
            "type": "string"
          },
          "title": {
            "maxLength": 255,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "form_id"
        ],
        "type": "object"
      },
      "name": "foxform_update_form"
    }
  ]
}

What the leaf hashes

{"body":"9538d2da95670e4653793f4aabf6341139cc644cfca18d8d446c0657a888638d","id":294427,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793050092035407,"prev":null,"subject":"574dabaf-a59e-48d1-8aa0-603ab05e6b92","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. 0x5962f378f297cf872216a917ddbe535df7cde54094ec2608f199adb92d3e7528
  2. 0x4c5b8c6ace94045dd50ff818d699a3b13ba99634cf65b1582086805acd25abe8
  3. 0x7eea6b7d9f7790671373ef879886d4d1c1b88e97e30328951e5483339eceab03
  4. 0xc12c0c01f360089f6ba49d14dea75598427a42e124849fc6800e6e5f068b2af6
  5. 0x9f2dda1c3b8a0d7c76d2f94c82a84dc300cf6e1b10d4d0f30d4447e35f362936
  6. 0xa74d4e39311434097c2fbea7320ae5af66ea359adb8b30a4e208680ce5923ac7
  7. 0xe249846ae0ae926d123da8382a381c943d70d2f2de398982c2b0d16322f36977
  8. 0x78c1f51d17069ab2bf1e103f354764072a0fcd40889e5ff2ff1d7ace8d03301d
  9. 0xfdaeadfd0b78d1ac12d116ee248f3f75d0a4d7ff2ddc336ccbfdf93e36df3cb6
  10. 0x299a3ff4761c07d1cb4987908783634f7b9e00f8f10a005c2d99c16a74924a4f
  11. 0x049f39c56b6b9cf95e0d9ebf2081f54ac35b4d69ec211e8498958f47d088b46c
  12. 0xf522fa92d4115c2b18b96aa43119f8df9b4e96c92f5d6449d0fe96dcd4bf324c
  13. 0xc8abb13c711b67d9f1ef145286ed450a0f5566f054a4b290ea3d711873bcbe20
  14. 0x5cdeb4648502e0633d01cc4f3379d48cccb9d4f528565b2868eb93db0df9e829
  15. 0x7726154b91b2ad65b13849ef6cb6443b1f0ff113a3089c9bd5f2bcfc16be099d
  16. 0x47b89901b0f07938a6b9a66ddf35683903f79d756a7c7763665fd632758b08d0
  17. 0x9a83be955a206deb65b995adfd92c58fa31c95fbbf926bd199d300e70b08b26d
  18. 0x20704208aa6923d6b2450ef74ede87a6e0265d46447926038fe9506e9e154b2d
  19. 0x9b9ce5b74b9bab5121612ef6b64920a8d453cbf311096a423eef9702747e868a
Day root
0xf43e8dcc3d451a4788b26be904c55e8c4c0fa75c9666796c51db38d37e2c0df8
Chained
0x702d5ac508f08b0d1accf36af25822d8e5660367494edd17a642fb61e158a57a
Published
On Arc Testnet, block 69251483: 0x495162f8936e19f0039918feebe6c307f327cd6bf8c37219620b1970041fa9ae

How to check it · This row as JSON