MCP App Store
by KeenEthics

Overview

Create, edit, and analyze free forms directly inside ChatGPT, with the Tally plugin. Simply describe what you need, and Tally builds a complete form with the right questions, structure, logic, and design: surveys, quizzes, registration and application forms, contact forms, event signups, and more. Pull form submissions into ChatGPT to summarize responses, analyze feedback, spot trends, and generate actionable insights from your form data. Example prompts: 1. Create "Create a workshop registration form with name, email, a dropdown to pick a session, and a dietary requirements field." 2. Edit "Add a file upload field to my job application form, make the email question required, and restyle it to match my brand colors." 3. Analyze "Summarize this week's responses to my customer feedback form: top 3 recurring themes and the average rating."

Tools

apply_logic

ChatGPT
Create, update or delete logic rules. Create/update use DSL syntax: WHEN <condition> THEN <action>. <deleting_rules> To delete an existing rule, send {operation: 'delete', blockUuid: <logicRule_blockUuid>} — no dsl needed. Copy the uuid from the ledger's Logic rules table. This is the only way to remove a rule; never target a rule's condition or action uuids with other tools. </deleting_rules> <uuid_references> All UUIDs come from the ledger. Use the correct column: - Condition LHS → questionUuid column - Condition RHS for choice fields (Dropdown, MultipleChoice, Checkboxes) → optionBlockUuid (NOT the option text) - Condition LHS for Matrix → row blockUuid (MATRIX_ROW) - Condition RHS for Matrix → matrix column blockUuid (NOT the option text) - SHOW/HIDE a full question → questionUuid column - SHOW/HIDE a single block (e.g. one option) → blockUuid column - REQUIRE → questionUuid column - JUMP TO PAGE → page number column </uuid_references> <conditions> Each condition compares a field to a value, e.g. <priceUuid> > 100. Don't apply math to the field, and don't compare two fields to each other (for choice fields, the comparison value can still be an optionBlockUuid). To check a calculated value (like price × qty > 100), store the result as a calc field first and use that: - Choice fields (Dropdown, MultipleChoice): <questionUuid> IS <optionBlockUuid> / IS NOT <optionBlockUuid> - Text/Email/Link/Phone fields: <questionUuid> IS "literal text" / IS NOT "literal text" - Empty check (any input field, never a calculated field): <questionUuid> IS EMPTY / IS NOT EMPTY - Number/Rating/LinearScale: <questionUuid> > 5 (any of > >= < <= = !=) - Text matching: <questionUuid> CONTAINS "text" / DOES NOT CONTAIN "text" - Text matching: <questionUuid> STARTS WITH "text" / ENDS WITH "text" - Text matching: <questionUuid> DOES NOT START WITH "text" / DOES NOT END WITH "text" - Checkboxes/MultiSelect (arrays): <questionUuid> IS ANY OF (<blockUuid>,<blockUuid>) / IS NOT ANY OF / IS EVERY OF - Checkboxes/MultiSelect: do NOT use IS/IS NOT — use CONTAINS or IS ANY OF instead - Matrix: <matrixRowBlockUuid> IS <matrixColumnBlockUuid>; use CONTAINS / IS ANY OF when multiple selection is enabled - Date fields: <questionUuid> IS BEFORE "2024-01-01" / IS AFTER "2024-01-01" - Combine: <cond1> AND <cond2> or <cond1> OR <cond2> (parentheses required when mixing) </conditions> <actions> - SHOW <questionUuid> / HIDE <questionUuid> (comma-separate for multiple) - SHOW <blockUuid> / HIDE <blockUuid> to target a single block within a question - REQUIRE <questionUuid> - JUMP TO PAGE <pageNumber> — jump to a specific page (use the page number from the ledger's page column). Check the Page flow section for current page order. - JUMP TO END — end the form early (jump to the default thank you page). If a custom thank you page exists, it will target that page instead. - CALCULATE <calcFieldUuid> = <expression> — assign a formula expression to a calculated field. See <calculated_fields> below. - DISABLE SUBMISSION — hide the submit button so the form can't be submitted while the condition holds (eligibility gate). Takes no target. - Multiple actions: SHOW <questionUuid>, REQUIRE <questionUuid> </actions> <calculated_fields> Group calc field writes that share a condition into one rule's THEN clause; only split into separate rules when the conditions differ (e.g., per-event accumulators). - Target (left of =): the UUID of a calculated field from a CALCULATED_FIELDS block. The ledger lists them in the properties column as <calcFieldUuid>=<name>(<TYPE>) — use the UUID. Create the block via create_blocks before writing CALCULATE rules. - Expression (right of =): + - * / for NUMBER, + only for TEXT concat. Parens for precedence. Number and string literals allowed. Field refs are bare uuids – questionUuid for inputs, the calc field's own uuid (properties column) for cross-calc / self-reference. No blockUuid, no {{ }}, no functions. - Choice fields: a…

configure_blocks

ChatGPT
Configure block's properties. Use the current form ledger to find blocks and their properties. IMPORTANT: - Those are partial (incremental) updates - only properties you include will be changed - Set a property to null to unset it - To change the type of a question, use the change_type operation once on ONLY 1 option block in the group. This will change the entire group to that type. - To hide entire question, update the TITLE block and all question blocks will be hidden automatically - For hidden_fields_settings: provide the complete list of hidden fields (add new, remove by exclusion, rename by keeping UUID and changing name) - For calculated_fields_settings: provide the complete list of calculated fields (add/remove/rename/change-value/retype). Keep an existing field's UUID to update it (rename, change type, change value), omit UUID for new entries, exclude an entry to remove it. CALCULATE rules referencing a removed field are auto-cleaned. To remove a single calc field while keeping others, remove_blocks works too — pass that field's UUID directly.

create_blocks

ChatGPT
Creates new blocks in the form. Blocks default structure with examples: - Name question: [TITLE, INPUT_TEXT] (short text) - Message question: [TITLE, TEXTAREA] (long text) - Country question: [TITLE, DROPDOWN_OPTION, DROPDOWN_OPTION, ...] (compact single-select) - Interests question: [TITLE, CHECKBOX, CHECKBOX, ...] (multi-select checklist) - Satisfaction question: [TITLE, LINEAR_SCALE] (numeric scale with labels) - Quality rating: [TITLE, RATING] (star rating) - Payment collection: [TITLE, PAYMENT] (collect payment with Stripe) - Yes/No question: [TITLE, MULTIPLE_CHOICE_OPTION, MULTIPLE_CHOICE_OPTION] (radio buttons) - Skills multi-select: [TITLE, MULTI_SELECT_OPTION, MULTI_SELECT_OPTION, ...] (dropdown multi-select) - Priorities ranking: [TITLE, RANKING_OPTION, RANKING_OPTION, ...] (drag to reorder) - Matrix table: [TITLE, MATRIX, MATRIX_COLUMN, MATRIX_COLUMN, ..., MATRIX_ROW, MATRIX_ROW, ...] (columns first, then rows) - Bot protection: [CAPTCHA] (no TITLE needed) - Location detection: [RESPONDENT_COUNTRY] (auto-detects from IP, no TITLE needed) - URL tracking: [HIDDEN_FIELDS] (captures query params like ?utm_source=email&campaign=summer, no TITLE needed) - Calculated fields: [CALCULATED_FIELDS] (named targets for CALCULATE logic rules, no TITLE needed) - New page: [PAGE_BREAK, ...content] (creates a new page with content) - New section: [HEADING_2, TEXT, ...content] (creates a new section with content) PAGE BREAK SEMANTICS: - PAGE_BREAK starts a new page - All blocks on a page share the same page number in the ledger IMPORTANT: - To append after the last block outside a Thank You page (most common), omit insertAfterBlockUuid entirely. Layout-only content can extend a trailing Thank You page. - Groups with the same insertAfterBlockUuid = auto-chain groups (only first group uses it, rest chain). - All questions are REQUIRED by default. The user sees a required indicator automatically in the UI. If you need to make a question optional, use configure_blocks tool after creating the question. Examples with ledger: | text | blockUuid | type | questionUuid | page | insertAfterBlockUuid_BEFORE | notes PAGE 1 ─────────────────────────────────────────────────────────────────────────────────────────────────────── 1 | Contact | aaa | FORM_TITLE | - | 1 | - | Form start 2 | Name | bbb | TITLE | xxx | 1 | aaa | Name question starts 3 | | ccc | INPUT_TEXT | xxx | 1 | bbb | Name question ends 4 | Country | ddd | TITLE | yyy | 1 | ccc | Country question starts 5 | US | eee | DROPDOWN_OPTION | yyy | 1 | ddd | Country question 6 | UK | fff | DROPDOWN_OPTION | yyy | 1 | eee | Country question ends PAGE 2 ─────────────────────────────────────────────────────────────────────────────────────────────────────── 7 | | ggg | PAGE_BREAK | - | 2 | fff | Page break (creates new page) 8 | Email | hhh | TITLE | zzz | 2 | ggg | Email question starts 9 | | iii | INPUT_EMAIL | zzz | 2 | hhh | Email question ends Add a question at the end of the form: // APPEND: omit insertAfterBlockUuid entirely — no need to reference any ledger UUID {"groups":[{"blocks":[{"type":"TITLE","html":"Email"},{"type":"INPUT_EMAIL"}]}]} Add phone after name: // AFTER a question: copy the row's "blockUuid" you want to insert after (last block of the question) {"groups":[{"blocks":[{"type":"TITLE","html":"Phone"},{"type":"INPUT_PHONE_NUMBER"}],"insertAfterBlockUuid":"ccc"}]} Add company before country: // CRITICAL: BEFORE a question means DIRECTLY BEFORE the question. Use the row immediately preceding the question; there should be NO other rows between! // Find "Country" in the current form ledger and copy its "insertAfterBlockUuid_BEFORE" into insertAfterBlockUuid {"groups":[{"blocks":[{"type":"TITLE","html":"Company"},{"type":"INPUT_TEXT"}],"insertAfterBlockUuid":"ccc"}]} Add subtitles/descriptions/hints to each question: // WITHIN a question: use question's TITLE blockUuid // Execute in one atomic tool call: a group per subtitle. {"groups":[{"blocks":[{"type":"TEXT","html":"Your full legal name"}],"insertAfterBlockUuid":"bbb"},{"blocks":[{"type":"TEXT","html":"Select your …

create_new_form

ChatGPT
Create a new draft form with the specified title and optional styling, and return its formId. Every call creates another form, so call it once per new form; to start over, keep editing that form.

extract_brand

ChatGPT
Extract colors, fonts, and images from a website URL. Use when users want to match their website, copy brand colors, or style forms like an existing site. Automatically extracts primary/accent colors, button styling, and fonts for use with update_styling tool.

fetch_insights

ChatGPT
Fetch form analytics and performance insights. Returns metrics (views, completions, conversion rate), visitor time-series, submission time-series, traffic dimensions (sources, browsers, countries), and question drop-off data. Use the include parameter to request only specific sections.

fetch_submissions

ChatGPT
Fetch submissions for a form. Returns paginated results with question labels and response data. Use the page parameter to navigate through results when hasMore is true.

inspect_custom_css

ChatGPT
Return Tally's CSS selector reference and this form's current custom CSS. Call before writing a value for update_custom_css so you can merge with existing rules instead of overwriting them.

list_blocks

ChatGPT
Retrieve the current form state as a ledger. The ledger shows all blocks with their UUIDs, types, positions, and properties, followed by the form settings and the styling.

list_forms

ChatGPT
List forms the user has access to. Returns paginated results with form metadata including name, status, submission count, and timestamps. Use the page parameter to navigate through results when hasMore is true. Optionally filter by workspace IDs.

list_workspaces

ChatGPT
List all workspaces the user can access. Use before creating a new form to select the target workspace. Selection rules: if only one workspace → use it; if multiple → ask the user which to use; if a personal workspace exists ('My workspace') you may auto-select it. When presenting the list of workspaces, use a numbered list for easy selection.

load_form

ChatGPT
Load existing form for editing

move_blocks

ChatGPT
Move individual blocks to a new position. Use the current form ledger to find blocks. IMPORTANT: - FORM_TITLE block cannot be moved (must stay at top) - To move or swap entire questions, use reposition_questions tool instead - To move, swap or reorder entire pages, use reposition_pages tool instead

publish_form

ChatGPT
Make the form's saved changes live for respondents and return the public form URL. Edits are already saved as unpublished changes, so only call this when the user wants the form live. Always share the returned URL with the user.

remove_blocks

ChatGPT
Remove specific blocks from the form. Use the current form ledger to find blocks. Also accepts the uuid of an individual calculated field or hidden field — in that case only that entry is removed, and the parent block stays unless it becomes empty. IMPORTANT: - Never remove blocks unless the user explicitly asked you to - To remove entire questions, use remove_questions tool instead - To remove entire pages, use remove_pages tool instead

remove_pages

ChatGPT
Remove entire pages from the form. Use the current form ledger to find page numbers. IMPORTANT: - Never remove pages unless the user explicitly asked you to - Removes all blocks on the page including the PAGE_BREAK - To remove individual blocks (TEXT, DIVIDER, etc.), use remove_blocks tool instead

remove_questions

ChatGPT
Remove entire questions from the form. Use the current form ledger to find questions by their questionUuid. IMPORTANT: - Never remove questions unless the user explicitly asked you to - Removes all blocks that belong to the question (TITLE + input/options) - To remove individual blocks (TEXT, DIVIDER, etc.), use remove_blocks tool instead

reposition_pages

ChatGPT
Move, swap, or reorder pages (1-based). Commands: "move", "swap", "reorder". Use move for relocating a single page, swap for exchanging two pages, and reorder for setting the exact final sequence. IMPORTANT: Check the ledger first to see how many pages exist. The form may have only 1 page if no PAGE_BREAK blocks have been added yet. IMPORTANT: - To create new pages, use create_blocks tool instead

reposition_questions

ChatGPT
Move or swap entire questions (including their title and all inputs/options together). IMPORTANT: - This tool moves or swaps COMPLETE questions as a unit (title + all associated inputs/options) - To move individual blocks within a question (e.g., move options or reorder options), use move_blocks tool instead - To move, swap or reorder entire pages, use reposition_pages tool instead

search_documentation

ChatGPT
Answer-only search of the Tally Help Center for explicit documentation or product-knowledge questions: how Tally works, whether a capability exists, supported features, limits, or docs links. Never search for an assumed UI location. Search for the underlying task instead. For example, rewrite "Where is the webhook tab?" as "how to configure webhooks". Never use as a preflight for form edits. Never use for commands that change the current form, including adding or creating blocks, configuring fields, setting defaults, updating settings, adding calculated fields, styling, moving, removing, formatting, or applying logic.

set_column_layout

ChatGPT
Organize blocks into side-by-side columns. Use "create_column_list" to create a new column layout with 2+ columns. Use "create_column" to add a NEW separate column to an existing layout. Use "add_to_column" to add more blocks within the SAME existing column (vertically stacked, not side-by-side). Use "detach_from_column" to remove blocks from their column layout. Use "set_column_ratio" to adjust column widths.

set_form_title

ChatGPT
Set or update the form title (always appears at the top of the form, position can not be changed)

update_custom_css

ChatGPT
LAST-RESORT custom CSS for effects with no structured equivalent in update_styling: pseudo-states (:hover, :focus, :active), animations, hiding elements, ::placeholder. ALWAYS try update_styling first for colors, fonts, sizes, alignment, borders, padding, and width — those have structured properties. When the form already has custom CSS, call inspect_custom_css first to read and preserve it.

update_settings

ChatGPT
Update form settings and configuration. IMPORTANT: - selfEmailSubject and respondentEmailSubject support mentions - selfEmailBody and respondentEmailBody support rich HTML formatting (bold, italic, underline, colors) and mentions LINK PREVIEW METADATA: The metaSiteName, metaSiteFaviconUrl, metaTitle, metaDescription, and metaImageUrl fields customize the preview card shown when a form URL is shared in apps like Slack, Discord, iMessage, and social platforms. They do not change the visible form content. FIELD REFERENCES (Mentions): Use {{questionUuid}} or {{Field Title}} to display a field's answer dynamically. Example: "Hello {{2c1674f6-843d-4fca-bddd-6598f0040ca7}}! Thanks for your feedback." Special email mentions: Use {{allAnswers}} in selfEmailBody, respondentEmailBody to include all submitted question titles and answers. Example: "A new response was submitted. {{allAnswers}}" Use {{id}}, {{respondentId}}, or {{formName}} to include submission metadata in the subject or body. Example: "New submission {{id}} for {{formName}}."

update_styling

ChatGPT
Update form styling. Batch ALL desired changes (appearance, advanced) into a single call — do not split per property or call repeatedly across turns. For pseudo-states (:hover, :focus), animations, hiding elements, ::placeholder, or any effect without a structured equivalent here, use the separate update_custom_css tool instead.

update_text

ChatGPT
Update text/HTML content for blocks in the form. Use the current form ledger to find blocks. Supports: form title, question titles, text blocks, headings (H1-H3), input placeholders (text/email/phone/date/time/link/number/textarea), and option text (dropdown/multiple choice/checkboxes/multi-select/ranking). Batch updates: Can update multiple blocks atomically in a single operation. IMPORTANT: - Text blocks (TITLE, TEXT, HEADING) support rich HTML formatting (bold, italic, underline, colors) and mentions - Input placeholders and option text automatically strip HTML to plain text (no mentions) - Use the "blockUuid" from the ledger to identify which blocks to update - "html" replaces the entire block. Preserve all unrequested wording, line breaks, formatting, mentions, and links exactly as shown in the current form ledger FIELD REFERENCES IN TEXT (Mentions): Use {{questionUuid}} or {{Field Title}} in TEXT, TITLE, or HEADING html to display a field's answer dynamically. Example: "Hello {{2c1674f6-843d-4fca-bddd-6598f0040ca7}}! Thanks for your feedback." This is NOT for default answers — use configure_blocks with defaultAnswer for that.

apply_logic

Claude

configure_blocks

Claude

create_blocks

Claude

create_new_form

Claude

extract_brand

Claude

fetch_insights

Claude

fetch_submissions

Claude

inspect_custom_css

Claude

list_blocks

Claude

list_forms

Claude

list_workspaces

Claude

load_form

Claude

move_blocks

Claude

publish_form

Claude

remove_blocks

Claude

remove_pages

Claude

remove_questions

Claude

reposition_pages

Claude

reposition_questions

Claude

save_form

Claude

search_documentation

Claude

send_feedback

Claude

set_column_layout

Claude

set_form_title

Claude

update_custom_css

Claude

update_settings

Claude

update_styling

Claude

update_text

Claude

Capabilities

Writes

Example Prompts

Click any prompt to copy it.

Similar Apps