FoxForm

Build, publish and read scored forms, quizzes and calculators.

От сообщества: Добавлен пользователем или импортирован; проверьте владельца перед подключениемРаботаетНужен API-ключГлобальныйБесплатноМожет изменять данные

Что умеет

  • Foxform List Forms: List the forms owned by the authenticated FoxForm account, newest first. Args: - page (number): 1-based page number (default 1) - limit (number): page size, 1-100 (default 20) - re
  • Foxform Get Form: Fetch a single form by ID, including its full question list, per-screen conditional logic and settings. Args: - form_id (string): the form's ID (from foxform_list_forms) - response_f
  • Foxform List Responses: List submitted responses for a form, newest first. Args: - form_id (string): the form's ID - page (number): 1-based page (default 1) - limit (number): page size, 1-100 (default

Какие данные видит

Нужен ли аккаунт

Нужен API-ключ из настроек сервиса

Build, publish and read scored forms, quizzes and calculators. Every answer carries points into a score, and the score decides which screen comes next and which result the person sees at the end. Includes per-screen drop-off analytics.

Список инструментов сервера (10)

Технические названия из tools/list. Нужны только разработчикам.

foxform_list_formsList the forms owned by the authenticated FoxForm account, newest first. Args: - page (number): 1-based page number (default 1) - limit (number): page size, 1-100 (default 20) - response_format ('markdown' | 'json'): output format (default markdown) Returns: { total, page, limit, count, forms: [{ id, title, status, slug, questions_count, updated_at }] } Use this first to discover form IDs, then call foxform_get_form / foxform_get_form_analytics.
foxform_get_formFetch a single form by ID, including its full question list, per-screen conditional logic and settings. Args: - form_id (string): the form's ID (from foxform_list_forms) - response_format ('markdown' | 'json') Returns the full form object (id, title, description, slug, status, theme, questions[], thank_you_message, timestamps). Each 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). CONDITIONAL LOGIC (branching), per screen — stored in `questions[].logic`: logic.conditionalNavigationV2 = { enabled: true, groups: [ // groups are OR-joined; FIRST matching group wins { id: "grp-1", conditions: [ // conditions inside a group are AND-joined { id: "cond-1", left: "{{quer_testar}}", operator: "equal_to", right: "Ainda não" } ], then: { type: "specific_screen", targetScreenId: "s-motivos" } } ] } - `then.type`: 'next_screen' | 'previous_screen' | 'specific_screen' (needs targetScreenId = another screen's `id`) | 'end_form'. Add `then.url` (+ optional `openNewTab`) to redirect to an external URL instead. - `operator`: 'equal_to' | 'not_equal_to' | 'greater_than' | 'greater_or_equal_than' | 'less_than' | 'less_or_equal_than' | 'contains'. - `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)))"). - Comparing an ANSWER: use `left: "{{<variableName of the deciding screen>}}"` and `right` = the option's `label` OR its `value` (both match). - `{{score}}` is the running sum of `points` on the options picked so far (`choices[].points`, `images[].points`) — that is how score-based branching works. - A navigation group with no conditions NEVER matches. `enabled: false` stores the rules but disables them. - Screen-level conditional display uses the same group shape: `logic.display = { enabled: true, groups: [...], showAfterSeconds?: n }` (`then` is ignored — THEN means "show"). - Other logic keys: `logic.autoAdvance = { enabled, delaySeconds? }`, `logic.navigationBehavior = { onButtonClick?, onAutoAdvance?, targetScreenId? }`. - `logic.conditionalNavigation` (legacy, pre-DEVF-161) is still read and migrated on load — don't author new rules with it. Unknown 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.
foxform_list_responsesList submitted responses for a form, newest first. Args: - form_id (string): the form's ID - page (number): 1-based page (default 1) - limit (number): page size, 1-100 (default 20) - response_format ('markdown' | 'json') Returns: { total, page, limit, count, responses: [{ id, submitted_at, answers }] }. For aggregate metrics use foxform_get_form_analytics; for a full dump use foxform_export_responses.
foxform_get_responseFetch one response by its ID (from foxform_list_responses). Args: - response_id (string) - response_format ('markdown' | 'json') Returns the full response object (id, form_id, answers, submitted_at, metadata).
foxform_get_form_analyticsAggregated analytics for a form: overview KPIs (total responses, form views, response rate, avg response time), the responses-over-time timeline, and per-question stats. Args: - form_id (string) - response_format ('markdown' | 'json') Returns: { overview, timeline: [{date,count}], questions: [...], response_time_distribution?, views_timeline? }. Note: form_views / response_rate are null until the form has tracked views (forward-only).
foxform_export_responsesExport 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. Args: - form_id (string) Returns: raw CSV text.
foxform_create_formCreate a new form, including per-screen conditional logic. Requires a WRITE-scoped API key. Args: - title (string): form title (required) - description (string, optional) - theme (string, optional): one of midnight|ocean|sunset|forest|lavender|minimal (default sunset = Ember) - questions (array, optional): array of screen objects ({ id, type, title, required, variableName?, choices?, logic?, ... }); omit to start empty - thank_you_message (string, optional) Returns: { form } with the created form (including its id and slug). The form starts as a draft — call foxform_publish_form to make it live. Screen 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. CONDITIONAL LOGIC (branching), per screen — stored in `questions[].logic`: logic.conditionalNavigationV2 = { enabled: true, groups: [ // groups are OR-joined; FIRST matching group wins { id: "grp-1", conditions: [ // conditions inside a group are AND-joined { id: "cond-1", left: "{{quer_testar}}", operator: "equal_to", right: "Ainda não" } ], then: { type: "specific_screen", targetScreenId: "s-motivos" } } ] } - `then.type`: 'next_screen' | 'previous_screen' | 'specific_screen' (needs targetScreenId = another screen's `id`) | 'end_form'. Add `then.url` (+ optional `openNewTab`) to redirect to an external URL instead. - `operator`: 'equal_to' | 'not_equal_to' | 'greater_than' | 'greater_or_equal_than' | 'less_than' | 'less_or_equal_than' | 'contains'. - `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)))"). - Comparing an ANSWER: use `left: "{{<variableName of the deciding screen>}}"` and `right` = the option's `label` OR its `value` (both match). - `{{score}}` is the running sum of `points` on the options picked so far (`choices[].points`, `images[].points`) — that is how score-based branching works. - A navigation group with no conditions NEVER matches. `enabled: false` stores the rules but disables them. - Screen-level conditional display uses the same group shape: `logic.display = { enabled: true, groups: [...], showAfterSeconds?: n }` (`then` is ignored — THEN means "show"). - Other logic keys: `logic.autoAdvance = { enabled, delaySeconds? }`, `logic.navigationBehavior = { onButtonClick?, onAutoAdvance?, targetScreenId? }`. - `logic.conditionalNavigation` (legacy, pre-DEVF-161) is still read and migrated on load — don't author new rules with it. Unknown 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.
foxform_update_formUpdate 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. Args: - form_id (string): the form to update (required) - title (string, optional) - description (string, optional) - theme (string, optional) - 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. - thank_you_message (string, optional) Returns: { form } with the updated form. Screen 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. CONDITIONAL LOGIC (branching), per screen — stored in `questions[].logic`: logic.conditionalNavigationV2 = { enabled: true, groups: [ // groups are OR-joined; FIRST matching group wins { id: "grp-1", conditions: [ // conditions inside a group are AND-joined { id: "cond-1", left: "{{quer_testar}}", operator: "equal_to", right: "Ainda não" } ], then: { type: "specific_screen", targetScreenId: "s-motivos" } } ] } - `then.type`: 'next_screen' | 'previous_screen' | 'specific_screen' (needs targetScreenId = another screen's `id`) | 'end_form'. Add `then.url` (+ optional `openNewTab`) to redirect to an external URL instead. - `operator`: 'equal_to' | 'not_equal_to' | 'greater_than' | 'greater_or_equal_than' | 'less_than' | 'less_or_equal_than' | 'contains'. - `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)))"). - Comparing an ANSWER: use `left: "{{<variableName of the deciding screen>}}"` and `right` = the option's `label` OR its `value` (both match). - `{{score}}` is the running sum of `points` on the options picked so far (`choices[].points`, `images[].points`) — that is how score-based branching works. - A navigation group with no conditions NEVER matches. `enabled: false` stores the rules but disables them. - Screen-level conditional display uses the same group shape: `logic.display = { enabled: true, groups: [...], showAfterSeconds?: n }` (`then` is ignored — THEN means "show"). - Other logic keys: `logic.autoAdvance = { enabled, delaySeconds? }`, `logic.navigationBehavior = { onButtonClick?, onAutoAdvance?, targetScreenId? }`. - `logic.conditionalNavigation` (legacy, pre-DEVF-161) is still read and migrated on load — don't author new rules with it. Unknown 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.
foxform_publish_formPublish a form so it's live at its public URL and can accept responses. Requires a WRITE-scoped API key. Args: - form_id (string) Returns: { form } with status 'published'. (May fail with a plan-limit error on Free accounts.)
foxform_unpublish_formUnpublish a form (takes it offline; stops accepting responses). Requires a WRITE-scoped API key. Args: - form_id (string) Returns: a confirmation message.