← The evidence ledger
Evidence row 728472
Observed , by probe.mcp/1.
- Kind
- mcp.tools
- About
- endpoint 574dabaf-a59e-48d1-8aa0-603ab05e6b92
- Recorded
- Previous row
- #294427
- Body SHA-256
- 446ed99d41ce911343153927029351214130ebd0745d1ad7951eb2d580e60c99
- Leaf
- 0xe72a293710e1c7494c7861592c4436a08b7acb3a7d8a388d466b14defc12ed3a
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\nEnd screen ('end'): title + description, an optional button (buttonEnabled false hides it; buttonText, buttonLink, buttonOpenNewTab) and an optional automatic redirect after submit: autoRedirect true + autoRedirectUrl (absolute http/https URL; the form link's query params such as utm_* are passed along and {{param}} tokens are filled from them) + autoRedirectDelay (seconds 0-10, default 3). The response is recorded before the redirect; respondents see a \"Redirecting in N s\" line with a \"Go now\" link.\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\nEnd screen ('end'): title + description, an optional button (buttonEnabled false hides it; buttonText, buttonLink, buttonOpenNewTab) and an optional automatic redirect after submit: autoRedirect true + autoRedirectUrl (absolute http/https URL; the form link's query params such as utm_* are passed along and {{param}} tokens are filled from them) + autoRedirectDelay (seconds 0-10, default 3). The response is recorded before the redirect; respondents see a \"Redirecting in N s\" line with a \"Go now\" link.\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\nEnd screen ('end'): title + description, an optional button (buttonEnabled false hides it; buttonText, buttonLink, buttonOpenNewTab) and an optional automatic redirect after submit: autoRedirect true + autoRedirectUrl (absolute http/https URL; the form link's query params such as utm_* are passed along and {{param}} tokens are filled from them) + autoRedirectDelay (seconds 0-10, default 3). The response is recorded before the redirect; respondents see a \"Redirecting in N s\" line with a \"Go now\" link.\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":"446ed99d41ce911343153927029351214130ebd0745d1ad7951eb2d580e60c99","id":728472,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793152491847631,"prev":294427,"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 (231336 rows).
- 0xe729efa2e733017bc10357bdf927cd436deebf8bc80db86f60678db79e0fbe99
- 0x04077a99dfe58d4d29c58c3bcc0854b384fa2aef7e6f6ac3cd40d358357d4663
- 0x47580fd4fe1c5290c9e9f4fb52b5fa12b25481f73fea48f2545b5978d0cba0ce
- 0x1ccffb38886b488dffac40a246d55cb09f8b6ba3915bde1f8216a90469e4b3bc
- 0xd3cbb645ab342c35ac6bdb02e82ca05745f50ffd7e2253c31bfcf8117e731326
- 0x8311c5d440439e00439c50784c5c66f847446d35d664e673f0465575a5e70000
- 0x623dc817e1a4209af78e6af121c4df2abde9953926c0e045f53685087ad291ab
- 0x9f1e05e6be4cefe54a36ffce08da199747c3a6b9b2f3bf36972f55f8d74e86c3
- 0xa2322dbc52544d4f3adbd655e2cb93079316b8122fecf0f410ad375f792b7756
- 0xbeb49dbdd123e82f5db34e2c166638390f09e1798c9765353c9e97e062dfd902
- 0xcbc415f50cb028e9d09a1f61af079607196be1b4c5603ac50b55bc14f694a9d5
- 0x1c566b2bc731a0bbe4bcefbee95c46c4142e9813b9c3e17150688fd4e40b858a
- 0x8e202856b78332619dae3c6afb7bc5d31594bfb3354dfda266c48b48219b0601
- 0xf43a767076988041f743c8dc00db52511a090e0e09c248c9cac00d7742dbc563
- 0x334629b51e7dfb2339fa4fd14202e288d70dbaccb3e5b04d2d5fb8f0d489ce5e
- 0xef2ebd45f2cfd41dc3eb213cc4cc144c46b7e9ead2de0b9f627463bad16e3ec8
- 0x67e9ff3e48c515135fcf3df2675aa4996d35d4a328ce41588ee1a7d93347c823
- 0xe6cfe00ae4e02bc12327e45b5f3334ea5850ba3bcc8e3101d30a8189856a95af
- Day root
- 0x2c19037464cc4c493624565f01775d6446fc78eaa118fc6865bfe2bfca9ff78e
- Chained
- 0xd1d7dee8322ceff8f4c8d83aa1fe4a4466825c2af1c97dbde3d35db61234f7be
- Published
- On Arc Testnet, block 69584042: 0x8bae2b1d097834c8b458513862d70d29ee807e98dc2e863b27250131c15b35ae