Typeform MCP
Vendor MCP63 toolsOAuth 2.1/DCRProductivityMarketingAnalyticsConnect to Typeform MCP to create and manage forms, read responses, and manage workspaces, contacts, and webhooks directly from your AI workflows.
Typeform MCP connector
-
Install the SDK
Section titled “Install the SDK”Terminal window npm install @scalekit-sdk/nodeTerminal window pip install scalekit -
Set your credentials
Section titled “Set your credentials”Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret> -
Authorize and make your first call
Section titled “Authorize and make your first call”quickstart.ts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENV_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'typeformmcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Typeform MCP:', link)process.stdout.write('Press Enter after authorizing...')await new Promise(r => process.stdin.once('data', r))// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'typeformmcp_contacts_public_delete_contacts_list',toolInput: { account_id: 'YOUR_ACCOUNT_ID', list_id: 'YOUR_LIST_ID' },})console.log(result)quickstart.py import osfrom scalekit.client import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENV_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "typeformmcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Typeform MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={"account_id":"YOUR_ACCOUNT_ID","list_id":"YOUR_LIST_ID"},tool_name="typeformmcp_contacts_public_delete_contacts_list",connection_name=connection_name,identifier=identifier,)print(result)
What you can do
Section titled “What you can do”Connect this agent connector to let your agent:
- Feedback submit — Call this any time a task cannot be completed as literally requested — missing feature, false premise, permission error, API failure, etc
- Toplist insights public — ## What this tool does Ranks groups of rows by a measure — e.g
- Timeseries insights public — ## What this tool does Computes measures bucketed over time for a single field or an entire dataset
- Aggregate insights public — ## What this tool does Computes aggregate measures (counts, averages, sums, NPS scores, and more) for a single field or an entire dataset
- Patch forms public validate — Validate a batch of patch operations against a form draft without persisting anything
- Update forms public, automations public — Update the form title
Tool list
Section titled “Tool list”Use the exact tool names from the Tool list below when you call execute_tool. If you’re not sure which name to use, list the tools available for the current user first.
typeformmcp_accounts_list_accounts#Lists all accounts the authenticated user is a member of.0 params
Lists all accounts the authenticated user is a member of.
typeformmcp_automations_public_add_delay_step#Add a delay step to an existing automation (workflow/flow).
A delay step pauses the automation for a fixed duration before the following step runs.
## Prerequisites
- `account_id` — obtain via `accounts-list_accounts`.
- `automation_id` — obtain via `public_list_automations`.
- `after_step_id` — obtain via `public_get_automation` (`workflow.steps[].id`).
## Positioning
- position: "entrypoint" (insert at start; new step becomes entrypoint, pointing at the old one) |
"tail" (append after the last step; no lookup needed) | "after" (insert after after_step_id).
- after_step_id: required only for "after". Id of the step to follow. null for "entrypoint"/"tail".
- No "before" position: to insert before step X, use "entrypoint" if X is the entrypoint, else
"after" with after_step_id set to the step whose next_ids contains X.
5 params
Add a delay step to an existing automation (workflow/flow). A delay step pauses the automation for a fixed duration before the following step runs. ## Prerequisites - `account_id` — obtain via `accounts-list_accounts`. - `automation_id` — obtain via `public_list_automations`. - `after_step_id` — obtain via `public_get_automation` (`workflow.steps[].id`). ## Positioning - position: "entrypoint" (insert at start; new step becomes entrypoint, pointing at the old one) | "tail" (append after the last step; no lookup needed) | "after" (insert after after_step_id). - after_step_id: required only for "after". Id of the step to follow. null for "entrypoint"/"tail". - No "before" position: to insert before step X, use "entrypoint" if X is the entrypoint, else "after" with after_step_id set to the step whose next_ids contains X.
account_idstringrequiredThe ID of the Organization.after_step_idstringrequiredStep id to insert after; only used when position is "after". See tool description.automation_idstringrequiredThe automation's ULID (e.g., '01H3JY5FWFM3YXBCPF2BQ9JYZ2')durationstringrequiredGo duration string (e.g. "30m", "24h"). Must be between 10 minutes (10m) and 30 days (720h).positionstringrequiredWhere to insert the step. See tool description for positioning rules.typeformmcp_automations_public_add_email_step#Add an email step to an existing automation (workflow/flow).
## Prerequisites
- `account_id` — obtain via `accounts-list_accounts`.
- `automation_id` — obtain via `public_list_automations`.
- `after_step_id` — obtain via `public_get_automation` (`workflow.steps[].id`).
- Field refs used in `to`/`subject`/`body` (`{{field:<REF>}}`) — obtain via `public_list_referenceable_fields`.
## Parameters notes
- subject: The email subject line. See "Field refs" below for dynamic content.
- body: The email body HTML. See "Body HTML structure" below.
- to: Recipient email addresses or field refs, if scope="respondent" "{{field:<EMAIL_FIELD_REF>}}".
When scope="respondent" and "to" is empty, it defaults to the automation's first email field ("{{field:<EMAIL_FIELD_REF>}}").
- scope: "self" (sends to fixed addresses in "to") or "respondent" (sends to the email field refs in "to" - "{{field:<EMAIL_FIELD_REF>}}").
## Positioning
- position: "entrypoint" (insert at start; new step becomes entrypoint, pointing at the old one) |
"tail" (append after the last step; no lookup needed) | "after" (insert after after_step_id).
- after_step_id: required only for "after". Id of the step to follow. null for "entrypoint"/"tail".
- No "before" position: to insert before step X, use "entrypoint" if X is the entrypoint, else
"after" with after_step_id set to the step whose next_ids contains X.
## Sender
- sender / reply_to: Optional. If both null, the tool auto-fills them from the account's first authorized email domain
## Field refs (dynamic content)
CRITICAL: Use the field's 'ref' property (from list_referenceable_fields)
Mustache syntax `{{field:<FIELD_REF>}}` works in three placements:
- Subject: plain mustache, e.g. `"Welcome {{field:01KH3G1C7Z5SVWQ3ZATVHEDAWE}}"`
- "to" array entries: plain mustache (the respondent's email field, for "respondent" scope)
- Body HTML: must be wrapped in a span (see below)
## Body HTML structure
These are strict rules, not general guidelines. Always follow these:
All body content MUST be wrapped in `<div id="email-builder">...</div>` — the email renderer requires this.
### Field reference span (body only)
```html
<span data-ref="FIELD_REF" data-title="FIELD_NAME" data-variable-type="field">{{field:FIELD_REF}}</span>
```
- `data-ref`: field ref (not id)
- `data-title`: human-readable field name (e.g., "Email", "Name")
- `data-variable-type`: must be `"field"`
- Inner text: `{{field:FIELD_REF}}`
### CTA buttons
When the user requests a button, CTA, call to action, action link, or similar, use this exact
structure inside the body:
```html
<p data-id="UUID" class="email-cta-wrapper"><a href="URL" target="_blank" rel="noopener noreferrer nofollow" class="email-cta" >LABEL</a></p>
```
- `data-id`: unique UUID v4 on the `<p>`
- `class="email-cta-wrapper"` on the `<p>` (required)
- `href`: destination URL on the `<a>`
- `target="_blank" rel="noopener noreferrer nofollow"` on the `<a>` (required)
- `class="email-cta"` on the `<a>` (required)
- Inner text of `<a>`: button label
### Plain links
For a plain inline hyperlink (no button styling), use this structure inside the body:
```html
<p data-id="UUID" class=""><a href="URL" target="_blank" rel="noopener noreferrer nofollow">LINK_TEXT</a></p>
```
- `data-id`: unique UUID v4 on the `<p>`
- `href`: destination URL on the `<a>`
- `target="_blank" rel="noopener noreferrer nofollow"` on the `<a>` (required)
- No `class` on the `<a>` (distinguishes link from CTA button)
- Inner text of `<a>`: link label (often the URL itself)
Use plain links for inline references; use the CTA structure above when the user asks for a button
or prominent call-to-action.
## "self" scope validation
When scope is "self", the "to" array MUST contain at least one real, valid email address.
Do NOT use placeholders like `<EMAIL_ADDRESS>`, `TODO`, or template strings. Ask the user if you
don't know the address.
12 params
Add an email step to an existing automation (workflow/flow). ## Prerequisites - `account_id` — obtain via `accounts-list_accounts`. - `automation_id` — obtain via `public_list_automations`. - `after_step_id` — obtain via `public_get_automation` (`workflow.steps[].id`). - Field refs used in `to`/`subject`/`body` (`{{field:<REF>}}`) — obtain via `public_list_referenceable_fields`. ## Parameters notes - subject: The email subject line. See "Field refs" below for dynamic content. - body: The email body HTML. See "Body HTML structure" below. - to: Recipient email addresses or field refs, if scope="respondent" "{{field:<EMAIL_FIELD_REF>}}". When scope="respondent" and "to" is empty, it defaults to the automation's first email field ("{{field:<EMAIL_FIELD_REF>}}"). - scope: "self" (sends to fixed addresses in "to") or "respondent" (sends to the email field refs in "to" - "{{field:<EMAIL_FIELD_REF>}}"). ## Positioning - position: "entrypoint" (insert at start; new step becomes entrypoint, pointing at the old one) | "tail" (append after the last step; no lookup needed) | "after" (insert after after_step_id). - after_step_id: required only for "after". Id of the step to follow. null for "entrypoint"/"tail". - No "before" position: to insert before step X, use "entrypoint" if X is the entrypoint, else "after" with after_step_id set to the step whose next_ids contains X. ## Sender - sender / reply_to: Optional. If both null, the tool auto-fills them from the account's first authorized email domain ## Field refs (dynamic content) CRITICAL: Use the field's 'ref' property (from list_referenceable_fields) Mustache syntax `{{field:<FIELD_REF>}}` works in three placements: - Subject: plain mustache, e.g. `"Welcome {{field:01KH3G1C7Z5SVWQ3ZATVHEDAWE}}"` - "to" array entries: plain mustache (the respondent's email field, for "respondent" scope) - Body HTML: must be wrapped in a span (see below) ## Body HTML structure These are strict rules, not general guidelines. Always follow these: All body content MUST be wrapped in `<div id="email-builder">...</div>` — the email renderer requires this. ### Field reference span (body only) ```html <span data-ref="FIELD_REF" data-title="FIELD_NAME" data-variable-type="field">{{field:FIELD_REF}}</span> ``` - `data-ref`: field ref (not id) - `data-title`: human-readable field name (e.g., "Email", "Name") - `data-variable-type`: must be `"field"` - Inner text: `{{field:FIELD_REF}}` ### CTA buttons When the user requests a button, CTA, call to action, action link, or similar, use this exact structure inside the body: ```html <p data-id="UUID" class="email-cta-wrapper"><a href="URL" target="_blank" rel="noopener noreferrer nofollow" class="email-cta" >LABEL</a></p> ``` - `data-id`: unique UUID v4 on the `<p>` - `class="email-cta-wrapper"` on the `<p>` (required) - `href`: destination URL on the `<a>` - `target="_blank" rel="noopener noreferrer nofollow"` on the `<a>` (required) - `class="email-cta"` on the `<a>` (required) - Inner text of `<a>`: button label ### Plain links For a plain inline hyperlink (no button styling), use this structure inside the body: ```html <p data-id="UUID" class=""><a href="URL" target="_blank" rel="noopener noreferrer nofollow">LINK_TEXT</a></p> ``` - `data-id`: unique UUID v4 on the `<p>` - `href`: destination URL on the `<a>` - `target="_blank" rel="noopener noreferrer nofollow"` on the `<a>` (required) - No `class` on the `<a>` (distinguishes link from CTA button) - Inner text of `<a>`: link label (often the URL itself) Use plain links for inline references; use the CTA structure above when the user asks for a button or prominent call-to-action. ## "self" scope validation When scope is "self", the "to" array MUST contain at least one real, valid email address. Do NOT use placeholders like `<EMAIL_ADDRESS>`, `TODO`, or template strings. Ask the user if you don't know the address.
account_idstringrequiredThe ID of the Organization.after_step_idstringrequiredStep id to insert after; only used when position is "after". See tool description.automation_idstringrequiredThe automation's ULID (e.g., '01H3JY5FWFM3YXBCPF2BQ9JYZ2')bodystringrequiredThe email body HTML, wrapped in <div id="email-builder">...</div>. Always follow the formatting rules found in the tool description.persiststringrequiredLifecycle event on which to persist a copy of the dispatched email. Empty string or null means never persist.positionstringrequiredWhere to insert the step. See tool description for positioning rules.reply_toarrayrequiredReply-to addresses. Null or empty auto-fills from the account's first authorized email domain when sender is also empty.scopestringrequired"self" sends to the fixed addresses in "to"; "respondent" sends to the form respondent.senderstringrequiredSender email address. Null or empty auto-fills from the account's first authorized email domain when reply_to is also empty.subjectstringrequiredThe email subject line.theme_idstringrequiredOptional theme id for the email notification.toarrayrequiredList of recipient email addresses. Can either be an email address or a reference to available email fields.typeformmcp_automations_public_add_integration_step#Adds a placeholder send-to-integration step to an automation (workflow/flow).
Use this whenever the user wants to send data to ANY third-party app (e.g., Slack, HubSpot, Google Sheets, Zapier, Microsoft Teams, Airtable, Excel, Mailchimp).
Important: This tool does NOT configure, select, or authorize the integration. Afterward, instruct the user to open the Typeform UI to select their destination app
and complete the setup.
## Prerequisites
- `account_id` — obtain via `accounts-list_accounts`.
- `automation_id` — obtain via `public_list_automations`.
- `after_step_id` — obtain via `public_get_automation` (`workflow.steps[].id`).
## Positioning
- position: "entrypoint" (insert at start; new step becomes entrypoint, pointing at the old one) |
"tail" (append after the last step; no lookup needed) | "after" (insert after after_step_id).
- after_step_id: required only for "after". Id of the step to follow. null for "entrypoint"/"tail".
- No "before" position: to insert before step X, use "entrypoint" if X is the entrypoint, else
"after" with after_step_id set to the step whose next_ids contains X.
4 params
Adds a placeholder send-to-integration step to an automation (workflow/flow). Use this whenever the user wants to send data to ANY third-party app (e.g., Slack, HubSpot, Google Sheets, Zapier, Microsoft Teams, Airtable, Excel, Mailchimp). Important: This tool does NOT configure, select, or authorize the integration. Afterward, instruct the user to open the Typeform UI to select their destination app and complete the setup. ## Prerequisites - `account_id` — obtain via `accounts-list_accounts`. - `automation_id` — obtain via `public_list_automations`. - `after_step_id` — obtain via `public_get_automation` (`workflow.steps[].id`). ## Positioning - position: "entrypoint" (insert at start; new step becomes entrypoint, pointing at the old one) | "tail" (append after the last step; no lookup needed) | "after" (insert after after_step_id). - after_step_id: required only for "after". Id of the step to follow. null for "entrypoint"/"tail". - No "before" position: to insert before step X, use "entrypoint" if X is the entrypoint, else "after" with after_step_id set to the step whose next_ids contains X.
account_idstringrequiredThe ID of the Organization.after_step_idstringrequiredStep id to insert after; only used when position is "after". See tool description.automation_idstringrequiredThe automation's ULID (e.g., '01H3JY5FWFM3YXBCPF2BQ9JYZ2')positionstringrequiredWhere to insert the step. See tool description for positioning rules.typeformmcp_automations_public_add_webhook_step#Add a webhook step to an existing automation (workflow/flow).
## Prerequisites
- `account_id` — obtain via `accounts-list_accounts`.
- `automation_id` — obtain via `public_list_automations`.
- `after_step_id` — obtain via `public_get_automation` (`workflow.steps[].id`).
## Positioning
- position: "entrypoint" (insert at start; new step becomes entrypoint, pointing at the old one) |
"tail" (append after the last step; no lookup needed) | "after" (insert after after_step_id).
- after_step_id: required only for "after". Id of the step to follow. null for "entrypoint"/"tail".
- No "before" position: to insert before step X, use "entrypoint" if X is the entrypoint, else
"after" with after_step_id set to the step whose next_ids contains X.
7 params
Add a webhook step to an existing automation (workflow/flow). ## Prerequisites - `account_id` — obtain via `accounts-list_accounts`. - `automation_id` — obtain via `public_list_automations`. - `after_step_id` — obtain via `public_get_automation` (`workflow.steps[].id`). ## Positioning - position: "entrypoint" (insert at start; new step becomes entrypoint, pointing at the old one) | "tail" (append after the last step; no lookup needed) | "after" (insert after after_step_id). - after_step_id: required only for "after". Id of the step to follow. null for "entrypoint"/"tail". - No "before" position: to insert before step X, use "entrypoint" if X is the entrypoint, else "after" with after_step_id set to the step whose next_ids contains X.
account_idstringrequiredThe ID of the Organization.after_step_idstringrequiredStep id to insert after; only used when position is "after". See tool description.automation_idstringrequiredThe automation's ULID (e.g., '01H3JY5FWFM3YXBCPF2BQ9JYZ2')positionstringrequiredWhere to insert the step. See tool description for positioning rules.secretstringrequiredShared secret used to sign webhook deliveries. Pass null to leave unset.urlstringrequiredThe HTTPS endpoint that will receive webhook deliveries.verify_sslbooleanrequiredWhether to verify the destination's SSL certificate.typeformmcp_automations_public_create_automation#Create a new Automation (also called "workflows") with an associated trigger.
Creates empty automation (no steps, no condition). Use add_<step_type>_step tools to add steps to it, and patch_trigger to set a trigger condition.
See the input schema's field descriptions for per-trigger_type semantics of trigger_form_id, filter_contact_list_ids, filter_partial_submit_refs and filter_ending_refs.
## Prerequisites
- `account_id` — obtain via `accounts-list_accounts`.
- `trigger_form_id` — obtain via `forms-public_list_forms`.
- `filter_contact_list_ids` — obtain via `contacts-public_list_contacts_lists`.
## Responding
On success, always include this link in your response. Substitute {account_id} with the account_id input value and {automation_id} with the id field from the tool output:
"👉 Open in Typeform: https://admin.typeform.com/accounts/{account_id}/workflows/{automation_id}"
7 params
Create a new Automation (also called "workflows") with an associated trigger. Creates empty automation (no steps, no condition). Use add_<step_type>_step tools to add steps to it, and patch_trigger to set a trigger condition. See the input schema's field descriptions for per-trigger_type semantics of trigger_form_id, filter_contact_list_ids, filter_partial_submit_refs and filter_ending_refs. ## Prerequisites - `account_id` — obtain via `accounts-list_accounts`. - `trigger_form_id` — obtain via `forms-public_list_forms`. - `filter_contact_list_ids` — obtain via `contacts-public_list_contacts_lists`. ## Responding On success, always include this link in your response. Substitute {account_id} with the account_id input value and {automation_id} with the id field from the tool output: "👉 Open in Typeform: https://admin.typeform.com/accounts/{account_id}/workflows/{automation_id}"
account_idstringrequiredThe ID of the Organization.filter_contact_list_idsarrayrequiredContact list IDs that scope the trigger. Semantics depend on trigger_type:
- CONTACT_ADDED_TO_LIST / CONTACT_REMOVED_FROM_LIST: REQUIRED. The list(s) whose add/remove events fire the trigger. Always set to the target list IDs; never null for these trigger types.
- CONTACT_CREATED / CONTACT_PROPERTY_UPDATED: optional. Restricts firing to contacts that belong to ALL listed lists (AND). Use null for no restriction.
- FORM_SUBMITTED: use null.
filter_ending_refsarrayrequiredForm thankyou_screen refs to filter by ending field. Only applies to FORM_SUBMITTED triggers. Use null for no filter or for contact triggers.filter_partial_submit_refsarrayrequiredField refs (that exist in a form milestones) to filter by partial submission. Only applies to FORM_SUBMITTED triggers. Use null for no filter or for contact triggers.namestringrequiredName of the automation.trigger_form_idstringrequiredForm ID for FORM_SUBMITTED trigger type. Required when trigger_type is FORM_SUBMITTED, must be null for contact triggers.trigger_typestringrequiredType of trigger event for an automation (contact or form).typeformmcp_automations_public_get_authorized_email_domains#Get authorized email domains for the current account, typically used as senders in
an automation (workflow/flow) email step.
## Prerequisites
- `account_id` — obtain via `accounts-list_accounts`.
1 param
Get authorized email domains for the current account, typically used as senders in an automation (workflow/flow) email step. ## Prerequisites - `account_id` — obtain via `accounts-list_accounts`.
account_idstringrequiredThe account whose authorized email domains to list.typeformmcp_automations_public_get_automation#Get automation (workflow/flow) by its ID. Returns the working state (published baseline + any pending draft operations).
## Prerequisites
- `account_id` — obtain via `accounts-list_accounts`.
- `automation_id` — obtain via `public_list_automations`.
## Output
- workflow:
- id
- name
- status: DRAFT | ACTIVE | PAUSED
- entrypoint_id: ID of the first step to execute
- steps: Array of step objects
- id
- type: DELAY | SEND_EMAIL | SEND_WEBHOOK | SEND_TO_INTEGRATION | TERMINATE
- next_ids: Downstream step IDs
- triggers: Trigger associations (id, type, enabled)
- triggered: Total run count
- last_patch_id: Pass as last_patch_id on the next patch2 params
Get automation (workflow/flow) by its ID. Returns the working state (published baseline + any pending draft operations). ## Prerequisites - `account_id` — obtain via `accounts-list_accounts`. - `automation_id` — obtain via `public_list_automations`. ## Output - workflow: - id - name - status: DRAFT | ACTIVE | PAUSED - entrypoint_id: ID of the first step to execute - steps: Array of step objects - id - type: DELAY | SEND_EMAIL | SEND_WEBHOOK | SEND_TO_INTEGRATION | TERMINATE - next_ids: Downstream step IDs - triggers: Trigger associations (id, type, enabled) - triggered: Total run count - last_patch_id: Pass as last_patch_id on the next patch
account_idstringrequiredThe ID of the Organization.automation_idstringrequiredThe automation's ULID (e.g., '01H3JY5FWFM3YXBCPF2BQ9JYZ2')typeformmcp_automations_public_get_email_notification#Get the working state of an email notification template (used by an automation/workflow/flow email step).
## Prerequisites
- `account_id` — obtain via `accounts-list_accounts`.
- `headless_form_id` and `template_id` — obtain via `public_get_automation` (the email step's `email_notifications` map: key is the headless form id, value has `template_id`).
## Use cases
- Retrieve the current email notification content before making updates
- Inspect pending changes that haven't been published yet
- Review edit history of modifications
3 params
Get the working state of an email notification template (used by an automation/workflow/flow email step). ## Prerequisites - `account_id` — obtain via `accounts-list_accounts`. - `headless_form_id` and `template_id` — obtain via `public_get_automation` (the email step's `email_notifications` map: key is the headless form id, value has `template_id`). ## Use cases - Retrieve the current email notification content before making updates - Inspect pending changes that haven't been published yet - Review edit history of modifications
account_idstringrequiredThe ID of the Organization.headless_form_idstringrequiredThe ID of the headless form associated with the email notification.template_idstringrequiredThe ID of the email notification template to retrieve.typeformmcp_automations_public_get_trigger#Get a trigger of an automation (workflow/flow) by its ID. Returns the working state (published baseline + any pending draft operations). The trigger_type determines which kind of trigger to fetch.
## Prerequisites
- `account_id` — obtain via `accounts-list_accounts`.
- `trigger_id` and `trigger_type` — obtain via `public_list_automations` (each automation's `triggers[].id`/`.type`) or from the `public_create_automation` output.
3 params
Get a trigger of an automation (workflow/flow) by its ID. Returns the working state (published baseline + any pending draft operations). The trigger_type determines which kind of trigger to fetch. ## Prerequisites - `account_id` — obtain via `accounts-list_accounts`. - `trigger_id` and `trigger_type` — obtain via `public_list_automations` (each automation's `triggers[].id`/`.type`) or from the `public_create_automation` output.
account_idstringrequiredThe ID of the Organization.trigger_idstringrequiredThe triggers's ULID (e.g., '01H3JY5FWFM3YXBCPF2BQ9JYZ2')trigger_typestringrequiredThe type of the trigger.typeformmcp_automations_public_list_automations#List all automations (workflows/flows) for the authenticated account.
## Prerequisites
- `account_id` — obtain via `accounts-list_accounts`.
## Use cases
- Find an automation by name before inspecting or updating it
- Discover which automations exist for the account
- Get automation IDs needed by other tools (get_automation, publish_automation, pause_automation)
1 param
List all automations (workflows/flows) for the authenticated account. ## Prerequisites - `account_id` — obtain via `accounts-list_accounts`. ## Use cases - Find an automation by name before inspecting or updating it - Discover which automations exist for the account - Get automation IDs needed by other tools (get_automation, publish_automation, pause_automation)
account_idstringrequiredThe account that owns the automations.typeformmcp_automations_public_list_referenceable_fields#List the fields available to reference for a given automation (workflow/flow).
## Prerequisites
- `account_id` — obtain via `accounts-list_accounts`.
- `automation_id` — obtain via `public_list_automations`.
## Use cases
- Discover the fields (and their refs) usable in the automation. Useful in email notifications, automation conditions, etc.
## Important notes
- When referencing a field, use its 'ref' property.
- For choice-typed fields, reference a specific option by the choice's 'ref'.
2 params
List the fields available to reference for a given automation (workflow/flow). ## Prerequisites - `account_id` — obtain via `accounts-list_accounts`. - `automation_id` — obtain via `public_list_automations`. ## Use cases - Discover the fields (and their refs) usable in the automation. Useful in email notifications, automation conditions, etc. ## Important notes - When referencing a field, use its 'ref' property. - For choice-typed fields, reference a specific option by the choice's 'ref'.
account_idstringrequiredThe ID of the Organization.automation_idstringrequiredThe automation's ULID (e.g., '01H3JY5FWFM3YXBCPF2BQ9JYZ2')typeformmcp_automations_public_patch_trigger#Patch a trigger of an automation (workflow/flow) via JSON Patch operations (add/replace/remove). See the input schema for the "value"
field's rules and for concrete examples. Prefer add/remove over replace — they're safer and more precise.
## Prerequisites
- `account_id` — obtain via `accounts-list_accounts`.
- `trigger_id` and `trigger_type` — obtain via `public_list_automations` (each automation's `triggers[].id`/`.type`) or from the `public_create_automation` output.
- `last_patch_id` — obtain via `public_get_trigger`.
### Contact trigger paths
- /type, /condition
- /list_ids — only for CONTACT_ADDED_TO_LIST / CONTACT_REMOVED_FROM_LIST
- /filter_list_ids — only for CONTACT_CREATED / CONTACT_PROPERTY_UPDATED (optional AND-filter)
Switching /type requires removing the old type's fields (e.g. ADDED_TO_LIST → CREATED removes /list_ids).
### Form trigger paths
/workspace_id, /form_id, /condition, /filter_ending_refs, /filter_partial_submit_refs
## Condition two-slot layout (CRITICAL)
The condition root is either null or {"op": "and", "vars": [slot0, slot1]} with exactly 2 vars.
- slot0 (path /condition/vars/0): reserved for "becomes"/"changed" conditions. Use {"op": "always"} as a placeholder when unused.
- slot1 (path /condition/vars/1): reserved for every other condition type (is, is_not, equal, not_equal,
begins_with, ends_with, contains, not_contains, is_any_of). Use {"op": "always"} as a placeholder when unused.
- Never put becomes/changed in slot1, never put other types in slot0, never patch /condition/vars directly.
- Nest multiple conditions within a slot under "and"/"or".
- If condition is null, "replace" /condition with the full root (both slots). To clear all conditions, "remove" /condition.
## Operators
- Comparison ops take exactly 2 vars: [field_var, value_var].
- "changed": value_var is {"type": "constant", "value": ""}.
- "is_any_of": value_var must be a JSON array, e.g. {"type": "choice", "value": ["subscribed", "unsubscribed"]}.
- The field var value is always the field "ref" (from the form or headless form), never the field "id".
- "becomes" and "changed" are only valid for CONTACT_PROPERTY_UPDATED triggers.
- Numeric comparisons (lower_than, lower_equal_than, greater_than, greater_equal_than):
value_var must be a JSON number, e.g. {"type": "constant", "value": 3} — never the string "3".
### Ops by property type
- multiple_choice: value_var uses {"type": "choice", ...} (not "constant"). Supported: is, is_not, becomes, changed, is_any_of.
- number: equal, not_equal, lower_than, lower_equal_than, greater_than, greater_equal_than, is_any_of
(plus becomes, changed for CONTACT_PROPERTY_UPDATED). Range comparisons take a JSON number operand.
- text (default): equal, not_equal, begins_with, ends_with, contains, not_contains, is_any_of (plus becomes, changed for CONTACT_PROPERTY_UPDATED).
Compose filters via is_any_of/and/or before treating something as unsupported.
5 params
Patch a trigger of an automation (workflow/flow) via JSON Patch operations (add/replace/remove). See the input schema for the "value" field's rules and for concrete examples. Prefer add/remove over replace — they're safer and more precise. ## Prerequisites - `account_id` — obtain via `accounts-list_accounts`. - `trigger_id` and `trigger_type` — obtain via `public_list_automations` (each automation's `triggers[].id`/`.type`) or from the `public_create_automation` output. - `last_patch_id` — obtain via `public_get_trigger`. ### Contact trigger paths - /type, /condition - /list_ids — only for CONTACT_ADDED_TO_LIST / CONTACT_REMOVED_FROM_LIST - /filter_list_ids — only for CONTACT_CREATED / CONTACT_PROPERTY_UPDATED (optional AND-filter) Switching /type requires removing the old type's fields (e.g. ADDED_TO_LIST → CREATED removes /list_ids). ### Form trigger paths /workspace_id, /form_id, /condition, /filter_ending_refs, /filter_partial_submit_refs ## Condition two-slot layout (CRITICAL) The condition root is either null or {"op": "and", "vars": [slot0, slot1]} with exactly 2 vars. - slot0 (path /condition/vars/0): reserved for "becomes"/"changed" conditions. Use {"op": "always"} as a placeholder when unused. - slot1 (path /condition/vars/1): reserved for every other condition type (is, is_not, equal, not_equal, begins_with, ends_with, contains, not_contains, is_any_of). Use {"op": "always"} as a placeholder when unused. - Never put becomes/changed in slot1, never put other types in slot0, never patch /condition/vars directly. - Nest multiple conditions within a slot under "and"/"or". - If condition is null, "replace" /condition with the full root (both slots). To clear all conditions, "remove" /condition. ## Operators - Comparison ops take exactly 2 vars: [field_var, value_var]. - "changed": value_var is {"type": "constant", "value": ""}. - "is_any_of": value_var must be a JSON array, e.g. {"type": "choice", "value": ["subscribed", "unsubscribed"]}. - The field var value is always the field "ref" (from the form or headless form), never the field "id". - "becomes" and "changed" are only valid for CONTACT_PROPERTY_UPDATED triggers. - Numeric comparisons (lower_than, lower_equal_than, greater_than, greater_equal_than): value_var must be a JSON number, e.g. {"type": "constant", "value": 3} — never the string "3". ### Ops by property type - multiple_choice: value_var uses {"type": "choice", ...} (not "constant"). Supported: is, is_not, becomes, changed, is_any_of. - number: equal, not_equal, lower_than, lower_equal_than, greater_than, greater_equal_than, is_any_of (plus becomes, changed for CONTACT_PROPERTY_UPDATED). Range comparisons take a JSON number operand. - text (default): equal, not_equal, begins_with, ends_with, contains, not_contains, is_any_of (plus becomes, changed for CONTACT_PROPERTY_UPDATED). Compose filters via is_any_of/and/or before treating something as unsupported.
account_idstringrequiredThe ID of the Organization.last_patch_idstringrequiredPass as last_patch_id on next patch.patchesarrayrequiredArray of JSON Patch operations to apply to the trigger draft.trigger_idstringrequiredUnique identifier of the trigger (ULID format).trigger_typestringrequiredThe type of the trigger.typeformmcp_automations_public_pause_automation#Pause an automation (workflow/flow) by disabling its trigger and, optionally, its current runs.
## Prerequisites
- `account_id` — obtain via `accounts-list_accounts`.
- `automation_id` — obtain via `public_list_automations`.
3 params
Pause an automation (workflow/flow) by disabling its trigger and, optionally, its current runs. ## Prerequisites - `account_id` — obtain via `accounts-list_accounts`. - `automation_id` — obtain via `public_list_automations`.
account_idstringrequiredThe ID of the Organization.automation_idstringrequiredThe automation's ULID (e.g., '01H3JY5FWFM3YXBCPF2BQ9JYZ2')stop_existing_runsbooleanrequiredDESTRUCTIVE AND IRREVERSIBLE. When true, all currently running workflow executions will be permanently stopped and cannot be resumed. When false, only the trigger is disabled (no new executions will start), but existing runs continue to completion. Has no safe default — always ask the user before setting it.typeformmcp_automations_public_publish_automation#Publish an automation (workflow/flow) by enabling its trigger and publishing all drafts.
IMPORTANT: Only call this tool when the user has explicitly asked to publish, deploy, go live, enable, or activate this automation.
If the user asks to create an automation without explicitly requesting one of the above, use create_automation instead.
## Prerequisites
- `account_id` — obtain via `accounts-list_accounts`.
- `automation_id` — obtain via `public_list_automations`.
2 params
Publish an automation (workflow/flow) by enabling its trigger and publishing all drafts. IMPORTANT: Only call this tool when the user has explicitly asked to publish, deploy, go live, enable, or activate this automation. If the user asks to create an automation without explicitly requesting one of the above, use create_automation instead. ## Prerequisites - `account_id` — obtain via `accounts-list_accounts`. - `automation_id` — obtain via `public_list_automations`.
account_idstringrequiredThe ID of the Organization.automation_idstringrequiredThe automation's ULID (e.g., '01H3JY5FWFM3YXBCPF2BQ9JYZ2')typeformmcp_automations_public_remove_steps#Remove one or more steps from an existing automation (workflow/flow)
## Prerequisites
- `account_id` — obtain via `accounts-list_accounts`.
- `automation_id` — obtain via `public_list_automations`.
- `step_ids` — obtain via `public_get_automation` (`workflow.steps[].id`).
3 params
Remove one or more steps from an existing automation (workflow/flow) ## Prerequisites - `account_id` — obtain via `accounts-list_accounts`. - `automation_id` — obtain via `public_list_automations`. - `step_ids` — obtain via `public_get_automation` (`workflow.steps[].id`).
account_idstringrequiredThe ID of the Organization.automation_idstringrequiredThe automation's ULID (e.g., '01H3JY5FWFM3YXBCPF2BQ9JYZ2')step_idsarrayrequiredThe ids of the steps to remove. All must exist in the automation;typeformmcp_automations_public_reorder_step#Move an existing step to a new position in an automation (workflow/flow) in one call.
The step is relocated, not recreated: its id and full configuration are preserved.
## Prerequisites
- `account_id` — obtain via `accounts-list_accounts`.
- `automation_id` — obtain via `public_list_automations`.
- `step_id` and `after_step_id` — obtain via `public_get_automation` (`workflow.steps[].id`).
## Positioning
- position: "entrypoint" (step becomes first; previous entrypoint becomes its successor) | "tail"
(step becomes last) | "after" (placed immediately after after_step_id).
- after_step_id: required only for "after". Id of the step to follow; must not equal step_id. null for "entrypoint"/"tail".
- No "before" position: to move before step X, use "entrypoint" if X is the entrypoint, else
"after" with after_step_id set to the step whose next_ids contains X.
5 params
Move an existing step to a new position in an automation (workflow/flow) in one call. The step is relocated, not recreated: its id and full configuration are preserved. ## Prerequisites - `account_id` — obtain via `accounts-list_accounts`. - `automation_id` — obtain via `public_list_automations`. - `step_id` and `after_step_id` — obtain via `public_get_automation` (`workflow.steps[].id`). ## Positioning - position: "entrypoint" (step becomes first; previous entrypoint becomes its successor) | "tail" (step becomes last) | "after" (placed immediately after after_step_id). - after_step_id: required only for "after". Id of the step to follow; must not equal step_id. null for "entrypoint"/"tail". - No "before" position: to move before step X, use "entrypoint" if X is the entrypoint, else "after" with after_step_id set to the step whose next_ids contains X.
account_idstringrequiredThe ID of the Organization.after_step_idstringrequiredStep id to move after; only used when position is "after". Must not equal step_id. See tool description.automation_idstringrequiredThe automation's ULID (e.g., '01H3JY5FWFM3YXBCPF2BQ9JYZ2')positionstringrequiredWhere to move the step. See tool description for positioning rules.step_idstringrequiredThe id of the existing step to move. Must exist in the automation.typeformmcp_automations_public_update_delay_step#Update an existing delay step's duration (in an automation/workflow/flow).
## Prerequisites
- `account_id` — obtain via `accounts-list_accounts`.
- `automation_id` — obtain via `public_list_automations`.
- `step_id` — obtain via `public_get_automation` (`workflow.steps[].id`).
4 params
Update an existing delay step's duration (in an automation/workflow/flow). ## Prerequisites - `account_id` — obtain via `accounts-list_accounts`. - `automation_id` — obtain via `public_list_automations`. - `step_id` — obtain via `public_get_automation` (`workflow.steps[].id`).
account_idstringrequiredThe ID of the Organization.automation_idstringrequiredThe automation's ULID (e.g., '01H3JY5FWFM3YXBCPF2BQ9JYZ2')durationstringrequiredGo duration string (e.g. "30m", "24h"). Must be between 10 minutes (10m) and 30 days (720h).step_idstringrequiredThe id of the DELAY step to update.typeformmcp_automations_public_update_email_step#Update an existing email step (in an automation/workflow/flow) and content.
## Prerequisites
- `account_id` — obtain via `accounts-list_accounts`.
- `automation_id` — obtain via `public_list_automations`.
- `step_id` — obtain via `public_get_automation` (`workflow.steps[].id`).
## Editable fields (only the ones you set are changed)
- subject: New subject line. Null leaves it unchanged. See "Field refs" below for dynamic content.
- body: New body HTML. See "Body HTML structure" below. Updating this value will rewrite the entire existing email body. Null leaves it unchanged.
- to: New recipient list. Email addresses for "self" scope, or "{{field:<EMAIL_FIELD_REF>}}" refs for "respondent" scope.
Null leaves it unchanged. Defaults to first email field if to=null and scope=respondent
- scope: "self" (fixed addresses in "to") or "respondent" (email field refs in "to"). Null leaves it unchanged.
- reply_to: Reply-to addresses. Three-state: null = unchanged; {"value": ["a@b.com"]} = set; {"value": null} = clear.
- theme_id: Theme id. Three-state: null = unchanged; {"value": "x"} = set; {"value": null} = clear.
- sender: Sender email — who the email is FROM (not reply_to). Three-state: null = unchanged;
{"value": "from@acme.com"} = set a custom sender; {"value": null} = reset to the default sender
## Field refs (dynamic content)
CRITICAL: Use the field's 'ref' property (from list_referenceable_fields)
Mustache syntax `{{field:<FIELD_REF>}}` works in three placements:
- Subject: plain mustache, e.g. `"Welcome {{field:01KH3G1C7Z5SVWQ3ZATVHEDAWE}}"`
- "to" array entries: plain mustache (the respondent's email field, for "respondent" scope)
- Body HTML: must be wrapped in a span (see below)
## Body HTML structure
These are strict rules, not general guidelines. Always follow these:
All body content MUST be wrapped in `<div id="email-builder">...</div>` — the email renderer requires this.
### Field reference span (body only)
```html
<span data-ref="FIELD_REF" data-title="FIELD_NAME" data-variable-type="field">{{field:FIELD_REF}}</span>
```
- `data-ref`: field ref (not id)
- `data-title`: human-readable field name (e.g., "Email", "Name")
- `data-variable-type`: must be `"field"`
- Inner text: `{{field:FIELD_REF}}`
### CTA buttons
When the user requests a button, CTA, call to action, action link, or similar, use this exact
structure inside the body:
```html
<p data-id="UUID" class="email-cta-wrapper"><a href="URL" target="_blank" rel="noopener noreferrer nofollow" class="email-cta" >LABEL</a></p>
```
- `data-id`: unique UUID v4 on the `<p>`
- `class="email-cta-wrapper"` on the `<p>` (required)
- `href`: destination URL on the `<a>`
- `target="_blank" rel="noopener noreferrer nofollow"` on the `<a>` (required)
- `class="email-cta"` on the `<a>` (required)
- Inner text of `<a>`: button label
### Plain links
For a plain inline hyperlink (no button styling), use this structure inside the body:
```html
<p data-id="UUID" class=""><a href="URL" target="_blank" rel="noopener noreferrer nofollow">LINK_TEXT</a></p>
```
- `data-id`: unique UUID v4 on the `<p>`
- `href`: destination URL on the `<a>`
- `target="_blank" rel="noopener noreferrer nofollow"` on the `<a>` (required)
- No `class` on the `<a>` (distinguishes link from CTA button)
- Inner text of `<a>`: link label (often the URL itself)
Use plain links for inline references; use the CTA structure above when the user asks for a button
or prominent call-to-action.
11 params
Update an existing email step (in an automation/workflow/flow) and content. ## Prerequisites - `account_id` — obtain via `accounts-list_accounts`. - `automation_id` — obtain via `public_list_automations`. - `step_id` — obtain via `public_get_automation` (`workflow.steps[].id`). ## Editable fields (only the ones you set are changed) - subject: New subject line. Null leaves it unchanged. See "Field refs" below for dynamic content. - body: New body HTML. See "Body HTML structure" below. Updating this value will rewrite the entire existing email body. Null leaves it unchanged. - to: New recipient list. Email addresses for "self" scope, or "{{field:<EMAIL_FIELD_REF>}}" refs for "respondent" scope. Null leaves it unchanged. Defaults to first email field if to=null and scope=respondent - scope: "self" (fixed addresses in "to") or "respondent" (email field refs in "to"). Null leaves it unchanged. - reply_to: Reply-to addresses. Three-state: null = unchanged; {"value": ["a@b.com"]} = set; {"value": null} = clear. - theme_id: Theme id. Three-state: null = unchanged; {"value": "x"} = set; {"value": null} = clear. - sender: Sender email — who the email is FROM (not reply_to). Three-state: null = unchanged; {"value": "from@acme.com"} = set a custom sender; {"value": null} = reset to the default sender ## Field refs (dynamic content) CRITICAL: Use the field's 'ref' property (from list_referenceable_fields) Mustache syntax `{{field:<FIELD_REF>}}` works in three placements: - Subject: plain mustache, e.g. `"Welcome {{field:01KH3G1C7Z5SVWQ3ZATVHEDAWE}}"` - "to" array entries: plain mustache (the respondent's email field, for "respondent" scope) - Body HTML: must be wrapped in a span (see below) ## Body HTML structure These are strict rules, not general guidelines. Always follow these: All body content MUST be wrapped in `<div id="email-builder">...</div>` — the email renderer requires this. ### Field reference span (body only) ```html <span data-ref="FIELD_REF" data-title="FIELD_NAME" data-variable-type="field">{{field:FIELD_REF}}</span> ``` - `data-ref`: field ref (not id) - `data-title`: human-readable field name (e.g., "Email", "Name") - `data-variable-type`: must be `"field"` - Inner text: `{{field:FIELD_REF}}` ### CTA buttons When the user requests a button, CTA, call to action, action link, or similar, use this exact structure inside the body: ```html <p data-id="UUID" class="email-cta-wrapper"><a href="URL" target="_blank" rel="noopener noreferrer nofollow" class="email-cta" >LABEL</a></p> ``` - `data-id`: unique UUID v4 on the `<p>` - `class="email-cta-wrapper"` on the `<p>` (required) - `href`: destination URL on the `<a>` - `target="_blank" rel="noopener noreferrer nofollow"` on the `<a>` (required) - `class="email-cta"` on the `<a>` (required) - Inner text of `<a>`: button label ### Plain links For a plain inline hyperlink (no button styling), use this structure inside the body: ```html <p data-id="UUID" class=""><a href="URL" target="_blank" rel="noopener noreferrer nofollow">LINK_TEXT</a></p> ``` - `data-id`: unique UUID v4 on the `<p>` - `href`: destination URL on the `<a>` - `target="_blank" rel="noopener noreferrer nofollow"` on the `<a>` (required) - No `class` on the `<a>` (distinguishes link from CTA button) - Inner text of `<a>`: link label (often the URL itself) Use plain links for inline references; use the CTA structure above when the user asks for a button or prominent call-to-action.
account_idstringrequiredThe ID of the Organization.automation_idstringrequiredThe automation's ULID (e.g., '01H3JY5FWFM3YXBCPF2BQ9JYZ2')bodystringrequiredNew email body HTML, wrapped in <div id="email-builder">...</div>. Always follow the formatting rules found in the tool description. Null leaves it unchanged.persiststringrequiredLifecycle event on which to persist a copy of the dispatched email. Null leaves it unchanged; empty string disables persistence.reply_tostringrequiredThree-state field edit. null = leave untouched; {"value": [...]} = set; {"value": null} = clear.scopestringrequired"self" sends to the fixed addresses in "to"; "respondent" sends to the email field refs in "to". Null leaves it unchanged.senderstringrequiredThree-state field edit. null = leave untouched; {"value": "x"} = set to x; {"value": null} = clear.step_idstringrequiredThe id of the SEND_EMAIL step to update.subjectstringrequiredNew email subject line. Null leaves it unchanged.theme_idstringrequiredThree-state field edit. null = leave untouched; {"value": "x"} = set to x; {"value": null} = clear.toarrayrequiredNew recipient list (email addresses, or "{{field:<EMAIL_FIELD_ID>}}" refs for respondent scope). Null leaves it unchanged. Defaults to first email field if to=null and scope=respondenttypeformmcp_automations_public_update_webhook_step#Update an existing webhook (SEND_WEBHOOK) step's configuration (in an automation/workflow/flow) in one call, without delete + re-add.
## Prerequisites
- `account_id` — obtain via `accounts-list_accounts`.
- `automation_id` — obtain via `public_list_automations`.
- `step_id` — obtain via `public_get_automation` (`workflow.steps[].id`).
## Required parameters
- automation_id: The ID of the automation containing the step.
- step_id: The id of the SEND_WEBHOOK step to update.
## Editable fields
- url: New HTTPS endpoint for deliveries. Pass null to leave it unchanged.
- verify_ssl: Whether to verify the destination's SSL certificate. Pass null to leave it unchanged.
- secret: Shared secret used to sign deliveries. This is a three-state field:
- null: leave the secret unchanged.
- {"value": "my-secret"}: set the secret.
- {"value": null}: clear the secret.
The secret is write-only and is never returned in the output.
At least one of url, verify_ssl, or secret must change. Errors if step_id is unknown or is not a webhook step.
6 params
Update an existing webhook (SEND_WEBHOOK) step's configuration (in an automation/workflow/flow) in one call, without delete + re-add. ## Prerequisites - `account_id` — obtain via `accounts-list_accounts`. - `automation_id` — obtain via `public_list_automations`. - `step_id` — obtain via `public_get_automation` (`workflow.steps[].id`). ## Required parameters - automation_id: The ID of the automation containing the step. - step_id: The id of the SEND_WEBHOOK step to update. ## Editable fields - url: New HTTPS endpoint for deliveries. Pass null to leave it unchanged. - verify_ssl: Whether to verify the destination's SSL certificate. Pass null to leave it unchanged. - secret: Shared secret used to sign deliveries. This is a three-state field: - null: leave the secret unchanged. - {"value": "my-secret"}: set the secret. - {"value": null}: clear the secret. The secret is write-only and is never returned in the output. At least one of url, verify_ssl, or secret must change. Errors if step_id is unknown or is not a webhook step.
account_idstringrequiredThe ID of the Organization.automation_idstringrequiredThe automation's ULID (e.g., '01H3JY5FWFM3YXBCPF2BQ9JYZ2')secretstringrequiredThree-state field edit. null = leave untouched; {"value": "x"} = set to x; {"value": null} = clear.step_idstringrequiredThe id of the SEND_WEBHOOK step to update.urlstringrequiredNew HTTPS endpoint for webhook deliveries. Null leaves it unchanged.verify_sslbooleanrequiredWhether to verify the destination's SSL certificate. Null leaves it unchanged.typeformmcp_contacts_public_bulk_create_contacts_lists#Create one or more contacts lists (segments) in the Contacts database in a single call.
Always use this tool to create contacts lists, even when creating just one — pass a single-element `lists` array.
## Use cases
- Create one or several segments to organize contacts
- Create lists with custom filter, sort, or table column settings
## Inputs
- lists (required): An array of list definitions. Each item contains:
- name (required): The list's name (max 255 characters)
- settings (required, nullable): Filter, sort, and table column configuration. Pass null for a list with no filters.
- Maximum 100 lists per call.
## Output format
Confirm the created lists to the user, including each list's name and ID.
2 params
Create one or more contacts lists (segments) in the Contacts database in a single call. Always use this tool to create contacts lists, even when creating just one — pass a single-element `lists` array. ## Use cases - Create one or several segments to organize contacts - Create lists with custom filter, sort, or table column settings ## Inputs - lists (required): An array of list definitions. Each item contains: - name (required): The list's name (max 255 characters) - settings (required, nullable): Filter, sort, and table column configuration. Pass null for a list with no filters. - Maximum 100 lists per call. ## Output format Confirm the created lists to the user, including each list's name and ID.
account_idstringrequiredThe ID of the OrganizationlistsarrayrequiredArray of list definitions to create. Always pass an array, even for a single list.typeformmcp_contacts_public_bulk_create_custom_contacts_database_properties#Create multiple custom properties on the user's Contacts database schema in a single operation.
Use this tool when you need to create several custom fields at once, for example when setting up form-to-contact mappings that require multiple new properties.
## What this tool does
- Creates multiple new custom properties in one call, available on all contacts.
## What this tool cannot do
- Create standard Typeform contact properties (Bio, Company, Job Title, etc.).
To activate disabled standard properties, use the
enable_standard_contacts_database_properties tool instead.
## Inputs
- properties: An array of property definitions, each containing:
- name: The name for the new property (must be unique).
- type: The property type. The type is permanent and cannot be changed after creation.
- long_text: General text (default)
- email: Email addresses
- number: Numeric values
- phone_number: Phone numbers
- timestamp: Date values
- text_list: Multiple choice options (configure with constraints)
- constraints: Optional. Used with text_list to define choices and selection limits.
- choices: Array of {label, value} objects.
- min_selected: Minimum selections required.
- max_selected: Maximum selections allowed. Set to 1 for single choice.
## Output
- The list of created properties.
2 params
Create multiple custom properties on the user's Contacts database schema in a single operation. Use this tool when you need to create several custom fields at once, for example when setting up form-to-contact mappings that require multiple new properties. ## What this tool does - Creates multiple new custom properties in one call, available on all contacts. ## What this tool cannot do - Create standard Typeform contact properties (Bio, Company, Job Title, etc.). To activate disabled standard properties, use the enable_standard_contacts_database_properties tool instead. ## Inputs - properties: An array of property definitions, each containing: - name: The name for the new property (must be unique). - type: The property type. The type is permanent and cannot be changed after creation. - long_text: General text (default) - email: Email addresses - number: Numeric values - phone_number: Phone numbers - timestamp: Date values - text_list: Multiple choice options (configure with constraints) - constraints: Optional. Used with text_list to define choices and selection limits. - choices: Array of {label, value} objects. - min_selected: Minimum selections required. - max_selected: Maximum selections allowed. Set to 1 for single choice. ## Output - The list of created properties.
account_idstringrequiredThe ID of the OrganizationpropertiesarrayrequiredArray of property definitions to createtypeformmcp_contacts_public_bulk_upsert_contacts#Create or update multiple contacts in the user's Contacts database in a single operation.
Use this tool when the user wants to add, create, update, or import several contacts at once.
## What this tool does
- For each contact, if a contact with the same identifier (e.g. email) already exists, it updates that contact's properties. Otherwise, it creates a new contact.
- Processes contacts in batches for efficiency.
- Deduplicates contacts within the same call by identifier, merging properties forward.
## Inputs
- contacts: An array of contact definitions, each containing:
- properties: Contact field values as property ID and value pairs.
- At least one identifying property (e.g. email) is required per contact.
- Maximum 1000 contacts per call.
## Output
- The list of created or updated contacts. Each contact includes its id, identifier (value that uniquely identifies the contact) and an array of associated contact properties.
## Property Value Formats
When providing property values, use the following formats based on property type:
- Text (email, short_text, long_text, phone_number, code): {"type": "text", "text": "value"}
- Number: {"type": "number", "number": 42.0}
- Timestamp: {"type": "timestamp", "timestamp": "2024-01-15T00:00:00Z"}
- Select (single_select, multi_select, text_list): {"type": "text_list", "text_list": ["option1"]}
2 params
Create or update multiple contacts in the user's Contacts database in a single operation. Use this tool when the user wants to add, create, update, or import several contacts at once. ## What this tool does - For each contact, if a contact with the same identifier (e.g. email) already exists, it updates that contact's properties. Otherwise, it creates a new contact. - Processes contacts in batches for efficiency. - Deduplicates contacts within the same call by identifier, merging properties forward. ## Inputs - contacts: An array of contact definitions, each containing: - properties: Contact field values as property ID and value pairs. - At least one identifying property (e.g. email) is required per contact. - Maximum 1000 contacts per call. ## Output - The list of created or updated contacts. Each contact includes its id, identifier (value that uniquely identifies the contact) and an array of associated contact properties. ## Property Value Formats When providing property values, use the following formats based on property type: - Text (email, short_text, long_text, phone_number, code): {"type": "text", "text": "value"} - Number: {"type": "number", "number": 42.0} - Timestamp: {"type": "timestamp", "timestamp": "2024-01-15T00:00:00Z"} - Select (single_select, multi_select, text_list): {"type": "text_list", "text_list": ["option1"]}
account_idstringrequiredThe ID of the OrganizationcontactsarrayrequiredArray of contact definitions to create or updatetypeformmcp_contacts_public_create_contact#Create a new contact in the user's Contacts database.
Use this tool when the user wants to add, create, or register a new contact.
## What this tool does
- Creates a single contact with the provided properties.
## Inputs
- properties: Contact field values as property ID and value pairs.
- At least one identifying property (e.g. email) is required.
## Output
- The created contact. Includes its id, identifier (value that uniquely identifies the contact) and an array of associated contact properties.
## Property Value Formats
When providing property values, use the following formats based on property type:
- Text (email, short_text, long_text, phone_number, code): {"type": "text", "text": "value"}
- Number: {"type": "number", "number": 42.0}
- Timestamp: {"type": "timestamp", "timestamp": "2024-01-15T00:00:00Z"}
- Select (single_select, multi_select, text_list): {"type": "text_list", "text_list": ["option1"]}
2 params
Create a new contact in the user's Contacts database. Use this tool when the user wants to add, create, or register a new contact. ## What this tool does - Creates a single contact with the provided properties. ## Inputs - properties: Contact field values as property ID and value pairs. - At least one identifying property (e.g. email) is required. ## Output - The created contact. Includes its id, identifier (value that uniquely identifies the contact) and an array of associated contact properties. ## Property Value Formats When providing property values, use the following formats based on property type: - Text (email, short_text, long_text, phone_number, code): {"type": "text", "text": "value"} - Number: {"type": "number", "number": 42.0} - Timestamp: {"type": "timestamp", "timestamp": "2024-01-15T00:00:00Z"} - Select (single_select, multi_select, text_list): {"type": "text_list", "text_list": ["option1"]}
account_idstringrequiredThe ID of the OrganizationpropertiesarrayrequiredArray of property ID and value pairstypeformmcp_contacts_public_create_contacts_list#Create a new contacts list (segment) in the Contacts database.
## Use cases
- Create a new segment to organize contacts
- Create a list with custom filter and sort settings
## Input
- name (required): The name for the new contacts list (max 255 characters)
- settings (required, nullable): Filter, sort, and table column configuration. Pass null for a list with no filters.
## Output format
Confirm the created list to the user, including its name and ID.
3 params
Create a new contacts list (segment) in the Contacts database. ## Use cases - Create a new segment to organize contacts - Create a list with custom filter and sort settings ## Input - name (required): The name for the new contacts list (max 255 characters) - settings (required, nullable): Filter, sort, and table column configuration. Pass null for a list with no filters. ## Output format Confirm the created list to the user, including its name and ID.
account_idstringrequiredThe ID of the OrganizationnamestringrequiredThe name for the new contacts listsettingsstringrequiredNo description.typeformmcp_contacts_public_create_form_property_mappings#Create a form property mapping (sync config) to connect a form to contact properties.
## Use cases
- Map form fields and variables to contact properties
## Prerequisites
Before using this tool, call get_form_property_compatibility with the form_id to get:
- Available form fields and variables with their IDs
- Compatible contact properties for each form field/variable
- Available choices for each field (in the choices array)
## Mapping to subscription status
When mapping a field to the subscription status property
(template_id: "contacts.subscription_status"), you MUST include
value_maps to translate form answers to subscription status values.
### For checkbox fields (choice-based — use choice_id):
Checkbox fields produce choice answers, NOT boolean. Use source.type "choice_id" with the choice ID from the field's choices array.
A single-choice checkbox (e.g. marketing consent) maps the checked choice to "subscribed":
value_maps: [
{source: {type: "choice_id", choice_id: "<consent-choice-id>"}, target: {type: "text_list", text_list: ["subscribed"]}}
]
### For multiple_choice / picture_choice fields (choice-based — use choice_id):
Use source.type "choice_id" with the choice ID from the field's choices array:
value_maps: [
{source: {type: "choice_id", choice_id: "<yes-choice-id>"}, target: {type: "text_list", text_list: ["subscribed"]}},
{source: {type: "choice_id", choice_id: "<no-choice-id>"}, target: {type: "text_list", text_list: ["never_subscribed"]}}
]
### For yes_no / legal fields (boolean answer type — use boolean):
These are the only truly boolean fields. Use source.type "boolean":
value_maps: [
{source: {type: "boolean", boolean: true}, target: {type: "text_list", text_list: ["subscribed"]}},
{source: {type: "boolean", boolean: false}, target: {type: "text_list", text_list: ["never_subscribed"]}}
]
## Output format
Present the created form property mapping to the user.
3 params
Create a form property mapping (sync config) to connect a form to contact properties. ## Use cases - Map form fields and variables to contact properties ## Prerequisites Before using this tool, call get_form_property_compatibility with the form_id to get: - Available form fields and variables with their IDs - Compatible contact properties for each form field/variable - Available choices for each field (in the choices array) ## Mapping to subscription status When mapping a field to the subscription status property (template_id: "contacts.subscription_status"), you MUST include value_maps to translate form answers to subscription status values. ### For checkbox fields (choice-based — use choice_id): Checkbox fields produce choice answers, NOT boolean. Use source.type "choice_id" with the choice ID from the field's choices array. A single-choice checkbox (e.g. marketing consent) maps the checked choice to "subscribed": value_maps: [ {source: {type: "choice_id", choice_id: "<consent-choice-id>"}, target: {type: "text_list", text_list: ["subscribed"]}} ] ### For multiple_choice / picture_choice fields (choice-based — use choice_id): Use source.type "choice_id" with the choice ID from the field's choices array: value_maps: [ {source: {type: "choice_id", choice_id: "<yes-choice-id>"}, target: {type: "text_list", text_list: ["subscribed"]}}, {source: {type: "choice_id", choice_id: "<no-choice-id>"}, target: {type: "text_list", text_list: ["never_subscribed"]}} ] ### For yes_no / legal fields (boolean answer type — use boolean): These are the only truly boolean fields. Use source.type "boolean": value_maps: [ {source: {type: "boolean", boolean: true}, target: {type: "text_list", text_list: ["subscribed"]}}, {source: {type: "boolean", boolean: false}, target: {type: "text_list", text_list: ["never_subscribed"]}} ] ## Output format Present the created form property mapping to the user.
account_idstringrequiredThe ID of the Organizationform_idstringrequiredThe ID of the form to connectmappingarrayrequiredArray of property ID to mapping configuration pairstypeformmcp_contacts_public_delete_contact#Delete a contact from the Contacts database.
## Prerequisites
- Call list_contacts first to find the contact ID you want to delete.
## Input
- contact_id (required): The ID of the contact to delete
## Output format
Confirm the deletion was successful.
2 params
Delete a contact from the Contacts database. ## Prerequisites - Call list_contacts first to find the contact ID you want to delete. ## Input - contact_id (required): The ID of the contact to delete ## Output format Confirm the deletion was successful.
account_idstringrequiredThe ID of the Organizationcontact_idstringrequiredThe ID of the contact to deletetypeformmcp_contacts_public_delete_contacts_database_properties#Delete multiple properties from the Contacts database schema in a single operation.
WARNING: This action is irreversible. Either all properties are deleted successfully, or none are deleted (all-or-nothing).
## Use cases
- Remove multiple properties that are no longer needed in one operation
- Clean up unused properties efficiently
- Batch deletion when reorganizing contact schema
## Restrictions (same as single delete)
- Properties with prevent_delete: true cannot be deleted (e.g. Subscription Status)
- The identifier property cannot be deleted (at least one identifier must remain)
- All-or-nothing: If ANY property fails validation, NO properties are deleted
## Side effects (same as single delete)
- Lists/segments: Deletion will fail if any list references ANY of these properties in its filters, sort orders, or visible columns — those lists must be updated first
- Contact data: Existing values for deleted properties are not removed from contacts, but become inaccessible
- Form mappings: Any form sync mappings targeting deleted properties will silently stop populating them
- Enrichment: Enrichment configurations referencing deleted properties stop being applied
## Input
- property_ids (required): Array of property IDs to delete (use list_contacts_database_properties to find IDs). Must contain at least one property ID.
## Output format
Confirm all properties were successfully deleted with the count of deleted properties.
2 params
Delete multiple properties from the Contacts database schema in a single operation. WARNING: This action is irreversible. Either all properties are deleted successfully, or none are deleted (all-or-nothing). ## Use cases - Remove multiple properties that are no longer needed in one operation - Clean up unused properties efficiently - Batch deletion when reorganizing contact schema ## Restrictions (same as single delete) - Properties with prevent_delete: true cannot be deleted (e.g. Subscription Status) - The identifier property cannot be deleted (at least one identifier must remain) - All-or-nothing: If ANY property fails validation, NO properties are deleted ## Side effects (same as single delete) - Lists/segments: Deletion will fail if any list references ANY of these properties in its filters, sort orders, or visible columns — those lists must be updated first - Contact data: Existing values for deleted properties are not removed from contacts, but become inaccessible - Form mappings: Any form sync mappings targeting deleted properties will silently stop populating them - Enrichment: Enrichment configurations referencing deleted properties stop being applied ## Input - property_ids (required): Array of property IDs to delete (use list_contacts_database_properties to find IDs). Must contain at least one property ID. ## Output format Confirm all properties were successfully deleted with the count of deleted properties.
account_idstringrequiredThe ID of the Organizationproperty_idsarrayrequiredArray of property IDs to deletetypeformmcp_contacts_public_delete_contacts_database_property#Delete a property from the Contacts database schema.
WARNING: This action is irreversible.
## Use cases
- Remove a property that is no longer needed
- Clean up unused properties from the contacts schema
## Restrictions
- Properties with prevent_delete: true cannot be deleted (e.g. Subscription Status)
- The identifier property cannot be deleted
## Side effects
- Lists/segments: Deletion will fail if any list references this property in its filters, sort orders, or visible columns — those lists must be updated first
- Contact data: Existing values for the deleted property are not removed from contacts, but become inaccessible
- Form mappings: Any form sync mappings targeting this property will silently stop populating it
- Enrichment: Enrichment configurations referencing this property stop being applied
## Input
- property_id (required): The ID of the property to delete (use list_contacts_database_properties to find IDs)
## Output format
Confirm the deletion was successful.
2 params
Delete a property from the Contacts database schema. WARNING: This action is irreversible. ## Use cases - Remove a property that is no longer needed - Clean up unused properties from the contacts schema ## Restrictions - Properties with prevent_delete: true cannot be deleted (e.g. Subscription Status) - The identifier property cannot be deleted ## Side effects - Lists/segments: Deletion will fail if any list references this property in its filters, sort orders, or visible columns — those lists must be updated first - Contact data: Existing values for the deleted property are not removed from contacts, but become inaccessible - Form mappings: Any form sync mappings targeting this property will silently stop populating it - Enrichment: Enrichment configurations referencing this property stop being applied ## Input - property_id (required): The ID of the property to delete (use list_contacts_database_properties to find IDs) ## Output format Confirm the deletion was successful.
account_idstringrequiredThe ID of the Organizationproperty_idstringrequiredThe ID of the property to deletetypeformmcp_contacts_public_delete_contacts_list#Delete a contacts list (segment) from the Contacts database.
## Use cases
- Remove a segment that is no longer needed
- Clean up unused lists
## Input
- list_id (required): The ID of the contacts list to delete
## Output format
Confirm the deletion was successful.
2 params
Delete a contacts list (segment) from the Contacts database. ## Use cases - Remove a segment that is no longer needed - Clean up unused lists ## Input - list_id (required): The ID of the contacts list to delete ## Output format Confirm the deletion was successful.
account_idstringrequiredThe ID of the Organizationlist_idstringrequiredThe ID of the contacts list to deletetypeformmcp_contacts_public_delete_form_property_mappings#Delete a form property mapping (sync config) by its ID.
## Use cases
- Remove form property mappings that are no longer needed
## Input
- sync_config_id (required): The ID of the sync config to delete
## Output format
Confirms the deletion was successful.
2 params
Delete a form property mapping (sync config) by its ID. ## Use cases - Remove form property mappings that are no longer needed ## Input - sync_config_id (required): The ID of the sync config to delete ## Output format Confirms the deletion was successful.
account_idstringrequiredThe ID of the Organizationsync_config_idstringrequiredThe ID of the sync config to deletetypeformmcp_contacts_public_enable_standard_contacts_database_properties#Activate disabled standard properties on the user's Contacts database.
Use this tool when you need to enable standard (built-in) properties
that are currently disabled, for example before creating a
form-to-contact mapping that references them.
## What this tool does
- Activates one or more disabled standard properties so they become
visible and usable.
- Only works on standard properties (those with a template_id).
- Properties that are already enabled are returned unchanged.
## Inputs
- property_ids: An array of property IDs to enable.
## Output
- The list of enabled properties.
2 params
Activate disabled standard properties on the user's Contacts database. Use this tool when you need to enable standard (built-in) properties that are currently disabled, for example before creating a form-to-contact mapping that references them. ## What this tool does - Activates one or more disabled standard properties so they become visible and usable. - Only works on standard properties (those with a template_id). - Properties that are already enabled are returned unchanged. ## Inputs - property_ids: An array of property IDs to enable. ## Output - The list of enabled properties.
account_idstringrequiredThe ID of the Organizationproperty_idsarrayrequiredAn array of property IDs to enabletypeformmcp_contacts_public_get_contact#Get a single contact by ID with property metadata included.
Use this tool when you need to fetch a specific contact and want property names/types without a separate API call.
## What this tool does
- Returns a single contact with all its properties
- Property metadata (name, type, template_id) is automatically included
- No need to call list_contacts_database_properties separately
## Inputs
- contact_id: The UUID of the contact to fetch
## Output
- id: Contact UUID
- identifier: Primary identifier value (e.g., email address)
- properties: Array of properties, each with:
- property_id: The property UUID
- value: The property value
- name: Human-readable property name (e.g., "Email", "Name")
- type: Property type (e.g., "email", "short_text", "number")
- template_id: Standard property template ID (null for custom properties)
2 params
Get a single contact by ID with property metadata included. Use this tool when you need to fetch a specific contact and want property names/types without a separate API call. ## What this tool does - Returns a single contact with all its properties - Property metadata (name, type, template_id) is automatically included - No need to call list_contacts_database_properties separately ## Inputs - contact_id: The UUID of the contact to fetch ## Output - id: Contact UUID - identifier: Primary identifier value (e.g., email address) - properties: Array of properties, each with: - property_id: The property UUID - value: The property value - name: Human-readable property name (e.g., "Email", "Name") - type: Property type (e.g., "email", "short_text", "number") - template_id: Standard property template ID (null for custom properties)
account_idstringrequiredThe ID of the Organizationcontact_idstringrequiredThe UUID of the contact to fetchtypeformmcp_contacts_public_get_contacts_database_properties#Get specific contact properties by their IDs.
Use this tool when you need information about specific properties, particularly for validation before performing operations like deletion.
## Use cases
- Fetch property names to show users what will be affected by an operation
- Validate that property IDs exist before performing actions
- Get detailed information about specific properties without fetching all properties
## Input
- property_ids (required): Array of property IDs to retrieve. Use list_contacts_database_properties to discover available property IDs.
## Output
- Returns an array of properties that were found. Properties that don't exist are silently omitted.
- Each property includes: id, name, type, icon, identifier flag, template_id, constraints, default value, and other metadata.
## Important notes
- If a property ID doesn't exist, it won't appear in the results (no error is returned)
- Duplicate property IDs in the input are automatically deduplicated
- To check if all requested properties exist, compare the number of results with the number of requested IDs
2 params
Get specific contact properties by their IDs. Use this tool when you need information about specific properties, particularly for validation before performing operations like deletion. ## Use cases - Fetch property names to show users what will be affected by an operation - Validate that property IDs exist before performing actions - Get detailed information about specific properties without fetching all properties ## Input - property_ids (required): Array of property IDs to retrieve. Use list_contacts_database_properties to discover available property IDs. ## Output - Returns an array of properties that were found. Properties that don't exist are silently omitted. - Each property includes: id, name, type, icon, identifier flag, template_id, constraints, default value, and other metadata. ## Important notes - If a property ID doesn't exist, it won't appear in the results (no error is returned) - Duplicate property IDs in the input are automatically deduplicated - To check if all requested properties exist, compare the number of results with the number of requested IDs
account_idstringrequiredThe ID of the Organizationproperty_idsarrayrequiredArray of property IDs to retrievetypeformmcp_contacts_public_get_contacts_list#Get detailed properties of a specific contacts list (segment).
Use this tool to inspect a list before performing operations like deletion, or to understand the list's configuration.
## What this tool does
- Retrieves a list's metadata (ID, name, timestamps)
## Input
- list_id (required): The ID of the contacts list to retrieve
## Output
- id: The list's unique identifier
- name: The list's human-readable name
- created_at: When the list was created (ISO 8601 timestamp)
- updated_at: When the list was last modified (ISO 8601 timestamp)
## Common Use Cases
- Confirm list details before deletion: "Show me details for list abc-123 before I delete it"
- Review list metadata: "What is the name of list xyz-456?"
2 params
Get detailed properties of a specific contacts list (segment). Use this tool to inspect a list before performing operations like deletion, or to understand the list's configuration. ## What this tool does - Retrieves a list's metadata (ID, name, timestamps) ## Input - list_id (required): The ID of the contacts list to retrieve ## Output - id: The list's unique identifier - name: The list's human-readable name - created_at: When the list was created (ISO 8601 timestamp) - updated_at: When the list was last modified (ISO 8601 timestamp) ## Common Use Cases - Confirm list details before deletion: "Show me details for list abc-123 before I delete it" - Review list metadata: "What is the name of list xyz-456?"
account_idstringrequiredThe ID of the Organizationlist_idstringrequiredThe ID of the contacts list to retrievetypeformmcp_contacts_public_get_form_property_compatibility#Get compatible property mappings for a form.
## Use cases
- Preparing to create a mapping between a form and contact properties
## Input format
Provide the form_id of the form you want to map to contact properties.
## Output format
Returns compatible properties for each form field and variable:
1. **field_compatibilities**: For each form field, the field and list of contact properties it can be mapped to
2. **variable_compatibilities**: For each form variable, the variable and list of contact properties it can be mapped to
Each field includes a **choices** array:
- For **multiple_choice**, **picture_choice**, **dropdown**, **ranking** fields: contains the actual choice options with their IDs and labels from the form definition.
- For **checkbox** fields: contains the actual choice options from the form (checkbox is choice-based, NOT boolean).
- For **yes_no** and **legal** fields: contains synthesized boolean choices [{id:"true", label:"Yes"}, {id:"false", label:"No"}].
- For other field types: empty array.
Use these choice IDs when constructing value_maps for the create_form_property_mappings tool.
The compatible_properties lists may include disabled standard
properties (disabled: true, template_id is set). These are inactive
built-in properties. To activate them, use the
enable_standard_contacts_database_properties tool with their
property IDs. Always prefer standard properties over creating
new custom ones.
Use these to determine valid mappings when creating a sync config.
2 params
Get compatible property mappings for a form. ## Use cases - Preparing to create a mapping between a form and contact properties ## Input format Provide the form_id of the form you want to map to contact properties. ## Output format Returns compatible properties for each form field and variable: 1. **field_compatibilities**: For each form field, the field and list of contact properties it can be mapped to 2. **variable_compatibilities**: For each form variable, the variable and list of contact properties it can be mapped to Each field includes a **choices** array: - For **multiple_choice**, **picture_choice**, **dropdown**, **ranking** fields: contains the actual choice options with their IDs and labels from the form definition. - For **checkbox** fields: contains the actual choice options from the form (checkbox is choice-based, NOT boolean). - For **yes_no** and **legal** fields: contains synthesized boolean choices [{id:"true", label:"Yes"}, {id:"false", label:"No"}]. - For other field types: empty array. Use these choice IDs when constructing value_maps for the create_form_property_mappings tool. The compatible_properties lists may include disabled standard properties (disabled: true, template_id is set). These are inactive built-in properties. To activate them, use the enable_standard_contacts_database_properties tool with their property IDs. Always prefer standard properties over creating new custom ones. Use these to determine valid mappings when creating a sync config.
account_idstringrequiredThe ID of the Organizationform_idstringrequiredThe ID of the form to get property mappings fortypeformmcp_contacts_public_get_form_property_mappings#Get the property mappings (sync config) for a specific form.
## Use cases
- View how a form's fields are mapped to contact properties
- Check if a form has an existing mapping configured
## Input format
Provide the form_id of the form you want to get mappings for.
## Output format
Returns the sync config for the form
2 params
Get the property mappings (sync config) for a specific form. ## Use cases - View how a form's fields are mapped to contact properties - Check if a form has an existing mapping configured ## Input format Provide the form_id of the form you want to get mappings for. ## Output format Returns the sync config for the form
account_idstringrequiredThe ID of the Organizationform_idstringrequiredThe ID of the form to get property mappings fortypeformmcp_contacts_public_get_form_property_mappings_by_id#Get form property mapping details by sync config ID.
Use this tool to inspect a form property mapping before performing operations like deletion.
## What this tool does
- Retrieves sync config metadata (ID, form ID, type, active status, timestamps)
- Lists all form field to property mappings
## Input
- sync_config_id (required): The ID of the form property mapping to retrieve
## Output
- id: The sync config's unique identifier
- form_id: The form/smart form ID this mapping is associated with
- form_name: The name/title of the form (empty if form no longer exists or for CSV type)
- type: The sync config type (form, smart_form, or csv)
- active: Whether the mapping is currently active
- created_at: When the mapping was created (ISO 8601 timestamp)
- updated_at: When the mapping was last modified (ISO 8601 timestamp)
- mappings: Array of field mappings showing which form fields map to which properties
## Common Use Cases
- Confirm mapping details before deletion: "Show me details for sync config abc-123 before I delete it"
- Verify which form a mapping belongs to: "Which form does sync config xyz-456 map to?"
- See what fields are mapped: "What mappings exist in sync config xyz-456?"
2 params
Get form property mapping details by sync config ID. Use this tool to inspect a form property mapping before performing operations like deletion. ## What this tool does - Retrieves sync config metadata (ID, form ID, type, active status, timestamps) - Lists all form field to property mappings ## Input - sync_config_id (required): The ID of the form property mapping to retrieve ## Output - id: The sync config's unique identifier - form_id: The form/smart form ID this mapping is associated with - form_name: The name/title of the form (empty if form no longer exists or for CSV type) - type: The sync config type (form, smart_form, or csv) - active: Whether the mapping is currently active - created_at: When the mapping was created (ISO 8601 timestamp) - updated_at: When the mapping was last modified (ISO 8601 timestamp) - mappings: Array of field mappings showing which form fields map to which properties ## Common Use Cases - Confirm mapping details before deletion: "Show me details for sync config abc-123 before I delete it" - Verify which form a mapping belongs to: "Which form does sync config xyz-456 map to?" - See what fields are mapped: "What mappings exist in sync config xyz-456?"
account_idstringrequiredThe ID of the Organizationsync_config_idstringrequiredThe ID of the form property mapping to retrievetypeformmcp_contacts_public_import_form_responses_by_mapping#Schedule an import of form responses into contacts using an existing form property mapping (sync config).
## Use cases
- Import form responses into contacts after a form property mapping has been created or updated
- Re-import form responses to pick up new submissions
## Input
- account_id (required): The ID of the Organization
- sync_config_id (required): The ID of the form property mapping (sync config) to use for the import. Use list_form_property_mappings to find existing sync configs.
## Output format
Confirms the import has been scheduled successfully.
2 params
Schedule an import of form responses into contacts using an existing form property mapping (sync config). ## Use cases - Import form responses into contacts after a form property mapping has been created or updated - Re-import form responses to pick up new submissions ## Input - account_id (required): The ID of the Organization - sync_config_id (required): The ID of the form property mapping (sync config) to use for the import. Use list_form_property_mappings to find existing sync configs. ## Output format Confirms the import has been scheduled successfully.
account_idstringrequiredThe ID of the Organizationsync_config_idstringrequiredThe ID of the form property mapping (sync config) to use for the importtypeformmcp_contacts_public_list_contacts#List contacts from the user's Contacts database.
Use this tool when the user wants to see, search, or find contacts.
## What this tool does
- Returns contacts matching the specified criteria with pagination.
## Inputs
- segment_id: a saved list ID, or null. If provided, uses the list's filters and sort.
- filters: filter criteria, or null for no filtering. Only used when segment_id is null.
- sort: sort order, or null for newest first. Only used when segment_id is null.
- page: page number, starting at 1.
- page_size: results per page.
## Output
- total_count: Total contacts matching the criteria.
- items: An array of contacts matching the criteria. Each includes its id, identifier (value that uniquely identifies the contact) and an array of associated contact properties.
## Default pagination
- page=1, page_size=25.
## Understanding Filters
### Structure
- Filters use a two-level group structure:
- Root: operator (and/or) + filter_groups array
- Each filter_group: operator (and/or) + filters array
- Each filter: property_id, operator, value, negate
### Semantics:
- Root operator=and: contact must match ALL groups
- Root operator=or: contact must match ANY group
- Group operator=and: ALL filters in the group must match
- Group operator=or: ANY filter in the group must match
### Filter operators by property type
- Text (email, short_text, long_text, phone_number, code): equals, starts_with, ends_with, contains, empty, any_of
- Number: equals, greater_than, less_than, empty
- Timestamp: equals, greater_than, less_than, empty
- Select (single_select, multi_select, text_list): equals, contains, empty
6 params
List contacts from the user's Contacts database. Use this tool when the user wants to see, search, or find contacts. ## What this tool does - Returns contacts matching the specified criteria with pagination. ## Inputs - segment_id: a saved list ID, or null. If provided, uses the list's filters and sort. - filters: filter criteria, or null for no filtering. Only used when segment_id is null. - sort: sort order, or null for newest first. Only used when segment_id is null. - page: page number, starting at 1. - page_size: results per page. ## Output - total_count: Total contacts matching the criteria. - items: An array of contacts matching the criteria. Each includes its id, identifier (value that uniquely identifies the contact) and an array of associated contact properties. ## Default pagination - page=1, page_size=25. ## Understanding Filters ### Structure - Filters use a two-level group structure: - Root: operator (and/or) + filter_groups array - Each filter_group: operator (and/or) + filters array - Each filter: property_id, operator, value, negate ### Semantics: - Root operator=and: contact must match ALL groups - Root operator=or: contact must match ANY group - Group operator=and: ALL filters in the group must match - Group operator=or: ANY filter in the group must match ### Filter operators by property type - Text (email, short_text, long_text, phone_number, code): equals, starts_with, ends_with, contains, empty, any_of - Number: equals, greater_than, less_than, empty - Timestamp: equals, greater_than, less_than, empty - Select (single_select, multi_select, text_list): equals, contains, empty
account_idstringrequiredThe ID of the OrganizationfiltersstringrequiredOptional filters to apply when listing contactspageintegerrequiredPage number for pagination (default is 1)page_sizeintegerrequiredNumber of contacts per page (max 100; useful to set to 0 to get only the total count)segment_idstringrequiredThe ID of the segment to list contacts fromsortarrayrequiredOptional sort orders to apply when listing contacts; default is created_at desctypeformmcp_contacts_public_list_contacts_database_properties#List all contact properties in the user's Contacts database.
Use this tool when the user asks about their contact properties/fields or schema.
## What this tool does
- Returns all properties defined for contacts.
## Output
- An array of contact properties. Each includes its id, name, type, and flags for how it can be used.
## Understanding Contact Property Fields
- identifier: true → Indicates this is a primary identifier field (e.g., email). It is required when creating a contact.
- template_id has a value → Indicates the property is a standard (built-in) Typeform property rather than a custom property.
- immutable: true → Means the property definition itself cannot be modified (e.g., its name or type).
- disabled: true → Indicates the property is inactive or hidden.
Ignore disabled properties when displaying to the user. To activate
a disabled standard property, use the
enable_standard_contacts_database_properties tool.
- prevent_delete: true → Indicates the property cannot be deleted.
- default → The default value assigned to the property. Informational.
- constraints.choices → For select-type properties, defines the available options.
- valid_filter_operators → The comparison operators valid for filtering by this property. Always use one of these operators to avoid errors.
1 param
List all contact properties in the user's Contacts database. Use this tool when the user asks about their contact properties/fields or schema. ## What this tool does - Returns all properties defined for contacts. ## Output - An array of contact properties. Each includes its id, name, type, and flags for how it can be used. ## Understanding Contact Property Fields - identifier: true → Indicates this is a primary identifier field (e.g., email). It is required when creating a contact. - template_id has a value → Indicates the property is a standard (built-in) Typeform property rather than a custom property. - immutable: true → Means the property definition itself cannot be modified (e.g., its name or type). - disabled: true → Indicates the property is inactive or hidden. Ignore disabled properties when displaying to the user. To activate a disabled standard property, use the enable_standard_contacts_database_properties tool. - prevent_delete: true → Indicates the property cannot be deleted. - default → The default value assigned to the property. Informational. - constraints.choices → For select-type properties, defines the available options. - valid_filter_operators → The comparison operators valid for filtering by this property. Always use one of these operators to avoid errors.
account_idstringrequiredThe ID of the Organizationtypeformmcp_contacts_public_list_contacts_lists#List all saved contact lists in the user's Contacts database.
Use this tool when the user wants to see their saved contact lists.
## What this tool does
- Returns all saved lists with their names and filter settings.
## Output
- An array of lists. Each includes its id, name, and settings.
## Understanding Filters
### Structure
- Filters use a two-level group structure:
- Root: operator (and/or) + filter_groups array
- Each filter_group: operator (and/or) + filters array
- Each filter: property_id, operator, value, negate
### Semantics:
- Root operator=and: contact must match ALL groups
- Root operator=or: contact must match ANY group
- Group operator=and: ALL filters in the group must match
- Group operator=or: ANY filter in the group must match
### Filter operators by property type
- Text (email, short_text, long_text, phone_number, code): equals, starts_with, ends_with, contains, empty, any_of
- Number: equals, greater_than, less_than, empty
- Timestamp: equals, greater_than, less_than, empty
- Select (single_select, multi_select, text_list): equals, contains, empty
1 param
List all saved contact lists in the user's Contacts database. Use this tool when the user wants to see their saved contact lists. ## What this tool does - Returns all saved lists with their names and filter settings. ## Output - An array of lists. Each includes its id, name, and settings. ## Understanding Filters ### Structure - Filters use a two-level group structure: - Root: operator (and/or) + filter_groups array - Each filter_group: operator (and/or) + filters array - Each filter: property_id, operator, value, negate ### Semantics: - Root operator=and: contact must match ALL groups - Root operator=or: contact must match ANY group - Group operator=and: ALL filters in the group must match - Group operator=or: ANY filter in the group must match ### Filter operators by property type - Text (email, short_text, long_text, phone_number, code): equals, starts_with, ends_with, contains, empty, any_of - Number: equals, greater_than, less_than, empty - Timestamp: equals, greater_than, less_than, empty - Select (single_select, multi_select, text_list): equals, contains, empty
account_idstringrequiredThe ID of the Organizationtypeformmcp_contacts_public_list_form_property_mappings#List all form property mappings (sync configs) for the Contacts database.
## Use cases
- View all configured form-to-contact property mappings
## Output format
Present the list of form property mappings to the user.
1 param
List all form property mappings (sync configs) for the Contacts database. ## Use cases - View all configured form-to-contact property mappings ## Output format Present the list of form property mappings to the user.
account_idstringrequiredThe ID of the Organizationtypeformmcp_contacts_public_update_contact#Update an existing contact in the user's Contacts database.
Use this tool when the user wants to modify, change, or update a contact's information.
## What this tool does
- Updates the contact with only the properties provided; others remain unchanged.
## Inputs
- contact_id: The ID of the contact to update.
- properties: Contact field values as property ID and value pairs. Only include fields to change.
## Output
- The updated contact.
## Property Value Formats
When providing property values, use the following formats based on property type:
- Text (email, short_text, long_text, phone_number, code): {"type": "text", "text": "value"}
- Number: {"type": "number", "number": 42.0}
- Timestamp: {"type": "timestamp", "timestamp": "2024-01-15T00:00:00Z"}
- Select (single_select, multi_select, text_list): {"type": "text_list", "text_list": ["option1"]}
3 params
Update an existing contact in the user's Contacts database. Use this tool when the user wants to modify, change, or update a contact's information. ## What this tool does - Updates the contact with only the properties provided; others remain unchanged. ## Inputs - contact_id: The ID of the contact to update. - properties: Contact field values as property ID and value pairs. Only include fields to change. ## Output - The updated contact. ## Property Value Formats When providing property values, use the following formats based on property type: - Text (email, short_text, long_text, phone_number, code): {"type": "text", "text": "value"} - Number: {"type": "number", "number": 42.0} - Timestamp: {"type": "timestamp", "timestamp": "2024-01-15T00:00:00Z"} - Select (single_select, multi_select, text_list): {"type": "text_list", "text_list": ["option1"]}
account_idstringrequiredThe ID of the Organizationcontact_idstringrequiredThe ID of the contact to update. Use list_contacts to find contact IDs.propertiesarrayrequiredArray of property ID and value pairstypeformmcp_contacts_public_update_contacts_list#Update an existing contacts list (segment) in the Contacts database.
## Use cases
- Rename a segment
- Update a segment's filter, sort, or table column settings
## Input
- list_id (required): The ID of the contacts list to update
- name (required): The name for the contacts list (can be unchanged)
- settings (required, nullable): Filter, sort, and table column configuration. Pass null to keep existing settings unchanged.
## Output format
Confirm the updated list to the user, including its new name and settings.
4 params
Update an existing contacts list (segment) in the Contacts database. ## Use cases - Rename a segment - Update a segment's filter, sort, or table column settings ## Input - list_id (required): The ID of the contacts list to update - name (required): The name for the contacts list (can be unchanged) - settings (required, nullable): Filter, sort, and table column configuration. Pass null to keep existing settings unchanged. ## Output format Confirm the updated list to the user, including its new name and settings.
account_idstringrequiredThe ID of the Organizationlist_idstringrequiredThe ID of the contacts list to updatenamestringrequiredThe name for the contacts listsettingsstringrequiredNo description.typeformmcp_contacts_public_update_form_property_mappings#Update an existing form property mapping (sync config).
## Use cases
- Add new field/variable mappings to an existing form connection
- Change which contact properties form fields/variables map to
- Remove mappings by excluding them from the update
## Prerequisites
- Use list_form_property_mappings or get_form_property_mappings to get the sync_config_id
- IMPORTANT: Use get_form_property_compatibility with the form_id to discover which form fields and variables can map to which contact properties
## Important
The mapping provided replaces the existing mapping entirely.
To preserve existing mappings while adding new ones, include all desired mappings in the request.
## Output format
Present the updated form property mapping to the user.
3 params
Update an existing form property mapping (sync config). ## Use cases - Add new field/variable mappings to an existing form connection - Change which contact properties form fields/variables map to - Remove mappings by excluding them from the update ## Prerequisites - Use list_form_property_mappings or get_form_property_mappings to get the sync_config_id - IMPORTANT: Use get_form_property_compatibility with the form_id to discover which form fields and variables can map to which contact properties ## Important The mapping provided replaces the existing mapping entirely. To preserve existing mappings while adding new ones, include all desired mappings in the request. ## Output format Present the updated form property mapping to the user.
account_idstringrequiredThe ID of the OrganizationmappingarrayrequiredArray of property ID to mapping configuration pairssync_config_idstringrequiredThe ID of the sync config to updatetypeformmcp_forms_public_create_form#Create a new Typeform form.
## Use cases
- Create a blank form to start building a survey or quiz
- Create a form in a specific workspace
## Parameters
- account_id: Account ID (required)
- title: The title of the form (required)
- workspace: Workspace href URL, e.g. "https://api.typeform.com/workspaces/abc123" (required)
## Output
Returns the created form with its ID, title, workspace, theme, and other metadata.
The form is created as unpublished (empty, no content).
## After creating a form
After calling this tool, respond with this conversational format:
Done — I've created a blank Typeform titled "{title}" in your workspace.
One thing to flag: the current version of the Typeform connector can create the form, but
it can't add questions or content to it yet — so right now it's empty. To add content,
open it in the builder:
👉 Open in the builder: https://admin.typeform.com/form/{form_id}/create
The fastest way to build it out is with Typeform AI, right inside the builder. Once you're
in, start with Typeform AI and paste this prompt:
{Generate a detailed prompt here as a separate paragraph based on what the user described:
form type, purpose, key fields. Keep it clear and actionable.}
That'll generate the questions, logic, and screens in a few seconds. Want me to tailor
the prompt to a specific audience or adjust the fields first?
Do NOT provide the public form URL (the form is empty and unpublished).
Do NOT suggest adding fields via subsequent API calls — that capability does not exist yet.3 params
Create a new Typeform form. ## Use cases - Create a blank form to start building a survey or quiz - Create a form in a specific workspace ## Parameters - account_id: Account ID (required) - title: The title of the form (required) - workspace: Workspace href URL, e.g. "https://api.typeform.com/workspaces/abc123" (required) ## Output Returns the created form with its ID, title, workspace, theme, and other metadata. The form is created as unpublished (empty, no content). ## After creating a form After calling this tool, respond with this conversational format: Done — I've created a blank Typeform titled "{title}" in your workspace. One thing to flag: the current version of the Typeform connector can create the form, but it can't add questions or content to it yet — so right now it's empty. To add content, open it in the builder: 👉 Open in the builder: https://admin.typeform.com/form/{form_id}/create The fastest way to build it out is with Typeform AI, right inside the builder. Once you're in, start with Typeform AI and paste this prompt: {Generate a detailed prompt here as a separate paragraph based on what the user described: form type, purpose, key fields. Keep it clear and actionable.} That'll generate the questions, logic, and screens in a few seconds. Want me to tailor the prompt to a specific audience or adjust the fields first? Do NOT provide the public form URL (the form is empty and unpublished). Do NOT suggest adding fields via subsequent API calls — that capability does not exist yet.
account_idstringrequiredAccount ID (required)titlestringrequiredForm title (required)workspacestringrequiredWorkspace href URL, e.g. https://api.typeform.com/workspaces/abc123 (required)typeformmcp_forms_public_delete_form#Delete/remove a form based on its ID.
## Use cases
- Remove a form that is no longer needed
- Clean up test forms
## Parameters
- id: The form ID to delete (required)
## Output
Returns empty response on success.2 params
Delete/remove a form based on its ID. ## Use cases - Remove a form that is no longer needed - Clean up test forms ## Parameters - id: The form ID to delete (required) ## Output Returns empty response on success.
account_idstringrequiredAccount ID (required)idstringrequiredForm ID to delete (required)typeformmcp_forms_public_duplicate_form#Duplicate an existing Typeform form.
Creates a new form that is a copy of the source form. The new form is unpublished
regardless of the source form's published state.
## Prerequisites
- form_id: Required. Call forms-public_list_forms to find it, or use the id returned by forms-public_create_form.
- account_id: Required. Call accounts-list_accounts to obtain this value if not already known.
## What is preserved
- All fields, logic, variables, hidden fields
- Theme, settings, welcome/thank-you/consent screens, outcome, CUI settings
- Attachments, layouts, and media (re-referenced to the new form)
- Knowledge entries (duplicated with remapped IDs)
- Translations/messages (best-effort; may be absent if copying fails)
## What is reset
- New form ID and timestamps (CreatedAt, UpdatedAt)
- PayPal merchant_id and Google Calendar calendar_id are cleared
- Email consent notification config reset to account default
- Form is always created as unpublished (IsPublic = false)
## Parameters
- account_id: Account ID (required)
- form_id: ID of the source form to duplicate (required)
- title: Title for the new form. Omit to inherit the source form's title.
- workspace_id: Workspace for the new form. Always ask the user which workspace to duplicate
into before calling this tool.4 params
Duplicate an existing Typeform form. Creates a new form that is a copy of the source form. The new form is unpublished regardless of the source form's published state. ## Prerequisites - form_id: Required. Call forms-public_list_forms to find it, or use the id returned by forms-public_create_form. - account_id: Required. Call accounts-list_accounts to obtain this value if not already known. ## What is preserved - All fields, logic, variables, hidden fields - Theme, settings, welcome/thank-you/consent screens, outcome, CUI settings - Attachments, layouts, and media (re-referenced to the new form) - Knowledge entries (duplicated with remapped IDs) - Translations/messages (best-effort; may be absent if copying fails) ## What is reset - New form ID and timestamps (CreatedAt, UpdatedAt) - PayPal merchant_id and Google Calendar calendar_id are cleared - Email consent notification config reset to account default - Form is always created as unpublished (IsPublic = false) ## Parameters - account_id: Account ID (required) - form_id: ID of the source form to duplicate (required) - title: Title for the new form. Omit to inherit the source form's title. - workspace_id: Workspace for the new form. Always ask the user which workspace to duplicate into before calling this tool.
account_idstringrequiredAccount ID (required)form_idstringrequiredID of the form to duplicate (required)titlestringrequiredTitle for the new form. Omit or null to inherit the source form's title.workspace_idstringrequiredWorkspace ID for the new form. Required — always ask the user which workspace to duplicate into.typeformmcp_forms_public_get_capabilities#Return the capability matrix for the Typeform form editing tools.
Call once before authoring any ops, and use the response instead of guessing field types, op names, or validation keys.
### Response fields
- supported_types: field types accepted by forms-public_patch_form
- container_types: types that accept nested fields. Containers have no settable property keys
and do not appear in property_keys_by_type. Their children are managed via add_field (set
parent_ref to the container's ref), move_field (move an existing field into the container via
parent_ref, or reorder within it via before_ref), and delete_field — not through a properties bag.
- choice_bearing_types / choices_required_on_add: types that carry or require choices
- validation_keys_by_type: accepted validation keys per field type
- property_keys_by_type: accepted property keys per field type
- patch_ops: op verbs grouped by domain (field / logic)
- condition_ops_by_type: valid ops per field type. Use this to author logic rules.
- logic_actions: accepted action types for logic rules
- error_codes / side_effect_codes / concurrency_codes: with recovery hints0 params
Return the capability matrix for the Typeform form editing tools. Call once before authoring any ops, and use the response instead of guessing field types, op names, or validation keys. ### Response fields - supported_types: field types accepted by forms-public_patch_form - container_types: types that accept nested fields. Containers have no settable property keys and do not appear in property_keys_by_type. Their children are managed via add_field (set parent_ref to the container's ref), move_field (move an existing field into the container via parent_ref, or reorder within it via before_ref), and delete_field — not through a properties bag. - choice_bearing_types / choices_required_on_add: types that carry or require choices - validation_keys_by_type: accepted validation keys per field type - property_keys_by_type: accepted property keys per field type - patch_ops: op verbs grouped by domain (field / logic) - condition_ops_by_type: valid ops per field type. Use this to author logic rules. - logic_actions: accepted action types for logic rules - error_codes / side_effect_codes / concurrency_codes: with recovery hints
typeformmcp_forms_public_get_form#Retrieve a form.
Always call get_form before patch_form so you are working from the current state.
## Parameters
- id: The form ID (required)
- view: one of
- "skeleton" — id, title, field refs+types+titles, thankyou_screens, and welcome_screen.
Container fields include their nested children inline under "fields", so the agent sees
nested refs without drilling. Cheapest read.
- "fields" — drill-down into specific fields. Requires "refs" (list of field refs, max 50).
Looks up refs at any depth. Returns the same per-field shape as "full" but only for the
requested refs, plus a "missing" array for refs not found.
- "full" (default) — the complete form including settings, theme, logic. Use sparingly; this is the most expensive read.
- refs: list of field refs (only used when view="fields"). Max 50 per call.
Typical workflow: skeleton to find the field, fields to read its details, then patch_form to edit it.4 params
Retrieve a form. Always call get_form before patch_form so you are working from the current state. ## Parameters - id: The form ID (required) - view: one of - "skeleton" — id, title, field refs+types+titles, thankyou_screens, and welcome_screen. Container fields include their nested children inline under "fields", so the agent sees nested refs without drilling. Cheapest read. - "fields" — drill-down into specific fields. Requires "refs" (list of field refs, max 50). Looks up refs at any depth. Returns the same per-field shape as "full" but only for the requested refs, plus a "missing" array for refs not found. - "full" (default) — the complete form including settings, theme, logic. Use sparingly; this is the most expensive read. - refs: list of field refs (only used when view="fields"). Max 50 per call. Typical workflow: skeleton to find the field, fields to read its details, then patch_form to edit it.
account_idstringrequiredAccount ID (required)idstringrequiredForm ID (required)refsarrayrequiredField refs to drill into (used only when view=fields). Max 50 per call.viewstringrequiredskeleton: compact map of the form — id, title, and each field's ref/type/title/required/choice_count/rule_count. Container fields include their nested children inline under `fields`, so the agent sees nested refs without drilling. rule_count shows how many logic rules are triggered by that field (omitted when 0). Drops property bags, choice labels, theme, settings, and layout.
fields: drill-down. Requires `refs`. Returns the same per-field shape as `full` but only for the requested refs, plus a `missing` array for refs not found.
full (default): complete form including settings, theme, logic.
typeformmcp_forms_public_list_forms#List forms owned by your user.
## Use cases
- Browse all forms in your account
- Search for forms by title
- Filter forms by workspace
- Paginate through large form collections
## Parameters
- search: Filter forms by title (partial match, optional)
- page: Page number starting from 1 (default: 1)
- page_size: Number of forms per page (default: 10, max: 200)
- sort_by: Sort field - "created_at", "title", or "last_updated_at" (default: "created_at")
- order_by: Sort order - "asc" or "desc" (default: "desc")
- workspace_id: Filter by workspace ID (optional)
## Output
Returns paginated list of forms with total count and form metadata.7 params
List forms owned by your user. ## Use cases - Browse all forms in your account - Search for forms by title - Filter forms by workspace - Paginate through large form collections ## Parameters - search: Filter forms by title (partial match, optional) - page: Page number starting from 1 (default: 1) - page_size: Number of forms per page (default: 10, max: 200) - sort_by: Sort field - "created_at", "title", or "last_updated_at" (default: "created_at") - order_by: Sort order - "asc" or "desc" (default: "desc") - workspace_id: Filter by workspace ID (optional) ## Output Returns paginated list of forms with total count and form metadata.
account_idstringrequiredAccount ID (required)order_bystringrequiredSort order: asc or descpageintegerrequiredPage number (default: 1)page_sizeintegerrequiredItems per page (default: 10, max: 200)searchstringrequiredFilter by title (partial match)sort_bystringrequiredSort field: created_at, title, or last_updated_atworkspace_idstringrequiredFilter by workspace IDtypeformmcp_forms_public_patch_form#Commit a validated batch of patch operations to a form draft.
Must be preceded by forms-public_validate_patch; pass the same ops plus its validation_token. If this call fails, re-validate for a fresh token.
On CONCURRENT_REQUESTS_CONFLICT: discard the token, re-read with forms-public_get_form, re-validate, and retry.
Changes land on the draft only; a published form needs forms-public_publish_form for them to go live.
When reporting success to the user, describe what changed rather than quoting patch IDs or version numbers unless they ask.
## Prerequisites
- form_id: Required. Call forms-public_list_forms to find it, or use the id returned by forms-public_create_form.
- account_id: Required. Call accounts-list_accounts to obtain this value if not already known.
### Parameters
- account_id: Account ID (required)
- form_id: The form ID (required)
- ops: The same ops passed to forms-public_validate_patch (required)
- validation_token: The token returned by forms-public_validate_patch (required)4 params
Commit a validated batch of patch operations to a form draft. Must be preceded by forms-public_validate_patch; pass the same ops plus its validation_token. If this call fails, re-validate for a fresh token. On CONCURRENT_REQUESTS_CONFLICT: discard the token, re-read with forms-public_get_form, re-validate, and retry. Changes land on the draft only; a published form needs forms-public_publish_form for them to go live. When reporting success to the user, describe what changed rather than quoting patch IDs or version numbers unless they ask. ## Prerequisites - form_id: Required. Call forms-public_list_forms to find it, or use the id returned by forms-public_create_form. - account_id: Required. Call accounts-list_accounts to obtain this value if not already known. ### Parameters - account_id: Account ID (required) - form_id: The form ID (required) - ops: The same ops passed to forms-public_validate_patch (required) - validation_token: The token returned by forms-public_validate_patch (required)
account_idstringrequiredAccount ID (required)form_idstringrequiredForm ID (required)opsarrayrequiredSame ops array passed to validate_patch. Required.validation_tokenstringrequiredToken returned by validate_patch. Required.typeformmcp_forms_public_publish_form#Make the form live and publicly accessible. Each call promotes the draft and snapshots a new version,
so only call when the user explicitly wants to go live; never to re-confirm. Drafts save automatically,
so this is not a save. Resolve form names to IDs with forms-public_list_forms.
## Prerequisites
- form_id: Required. Call forms-public_list_forms to find it, or use the id returned by forms-public_create_form.
- account_id: Required. Call accounts-list_accounts to obtain this value if not already known.
### Parameters
- account_id: Account ID (required)
- form_id: Form ID to publish (required)
### Errors
- PAYMENT_REQUIRED: plan-gated features are blocking. Tell the user which, in plain language, and suggest upgrading or removing them.
### Output
form_id, version, share_url. An empty share_url still means success; fetch the URL via forms-public_get_form.2 params
Make the form live and publicly accessible. Each call promotes the draft and snapshots a new version, so only call when the user explicitly wants to go live; never to re-confirm. Drafts save automatically, so this is not a save. Resolve form names to IDs with forms-public_list_forms. ## Prerequisites - form_id: Required. Call forms-public_list_forms to find it, or use the id returned by forms-public_create_form. - account_id: Required. Call accounts-list_accounts to obtain this value if not already known. ### Parameters - account_id: Account ID (required) - form_id: Form ID to publish (required) ### Errors - PAYMENT_REQUIRED: plan-gated features are blocking. Tell the user which, in plain language, and suggest upgrading or removing them. ### Output form_id, version, share_url. An empty share_url still means success; fetch the URL via forms-public_get_form.
account_idstringrequiredAccount ID (required)form_idstringrequiredForm ID to publish (required)typeformmcp_forms_public_update_form_metadata#Update the form title. Takes effect immediately on the live form - no publish needed.
## Prerequisites
- form_id: Required. Call forms-public_list_forms to find it, or use the id returned by forms-public_create_form.
- account_id: Required. Call accounts-list_accounts to obtain this value if not already known.
3 params
Update the form title. Takes effect immediately on the live form - no publish needed. ## Prerequisites - form_id: Required. Call forms-public_list_forms to find it, or use the id returned by forms-public_create_form. - account_id: Required. Call accounts-list_accounts to obtain this value if not already known.
account_idstringrequiredAccount ID (required)form_idstringrequiredForm ID to update (required)titlestringrequiredNew form title. Omit or null to leave unchanged. Must be non-empty if provided.typeformmcp_forms_public_validate_patch#Validate a batch of patch operations against a form draft without persisting anything.
IMPORTANT: This does not save. You MUST call forms-public_patch_form with the returned validation_token immediately after to persist.
If side_effects is non-empty, explain them to the user in plain language and warn them before committing.
Ops run sequentially in memory, so order add_field / add_ending before any add_logic ops that reference them;
anything not committed and not earlier in the batch does not exist yet. First failure stops validation and returns no token.
## Prerequisites
- form_id: Required. Call forms-public_list_forms to find it, or use the id returned by forms-public_create_form.
- account_id: Required. Call accounts-list_accounts to obtain this value if not already known.
### Parameters
- account_id: Account ID (required)
- form_id: The form ID (required)
- ops: The batch of patch operations to validate (required)
### Common mistakes
- Choice conditions: condition.value must be a choice REF, not a label. Read refs via forms-public_get_form(view=fields) first.
- add_ending: set screen_ref explicitly if add_logic in the same batch references it; omit for an auto-generated ref.
Call forms-public_get_capabilities for supported types, validation keys, and error codes.3 params
Validate a batch of patch operations against a form draft without persisting anything. IMPORTANT: This does not save. You MUST call forms-public_patch_form with the returned validation_token immediately after to persist. If side_effects is non-empty, explain them to the user in plain language and warn them before committing. Ops run sequentially in memory, so order add_field / add_ending before any add_logic ops that reference them; anything not committed and not earlier in the batch does not exist yet. First failure stops validation and returns no token. ## Prerequisites - form_id: Required. Call forms-public_list_forms to find it, or use the id returned by forms-public_create_form. - account_id: Required. Call accounts-list_accounts to obtain this value if not already known. ### Parameters - account_id: Account ID (required) - form_id: The form ID (required) - ops: The batch of patch operations to validate (required) ### Common mistakes - Choice conditions: condition.value must be a choice REF, not a label. Read refs via forms-public_get_form(view=fields) first. - add_ending: set screen_ref explicitly if add_logic in the same batch references it; omit for an auto-generated ref. Call forms-public_get_capabilities for supported types, validation keys, and error codes.
account_idstringrequiredAccount ID (required)form_idstringrequiredForm ID (required)opsarrayrequiredOperations to validate in sequence.typeformmcp_insights_public_aggregate### What this tool does
Computes aggregate measures (counts, averages, sums, NPS scores, and more) for a single field or an entire dataset.
Call insights-public_discover first to resolve form_id / audience_id / field_id / property_id and to
learn each field's filter_type, filter_operators, and filter_values before filtering.
## Use when
- User asks for summary statistics, totals, averages, counts, or scores
- User wants aggregated data rather than individual rows
- User asks about NPS score, response count, average rating, or similar rolled-up metrics
## Also known as
summary statistics, totals, counts, averages, sums, NPS scores, aggregate analytics, rolled-up metrics
## Constraints
- Provide exactly one of form_id or audience_id — never both, never neither.
- Every optional parameter must be sent as null when unset.
## Supported field types
- forms dataset: text, number, scale, boolean, choices, dropdown, nps, date, multi_format, transcript, payment, matrix, ranking.
- contacts dataset: text, text_list, number.
8 params
## What this tool does Computes aggregate measures (counts, averages, sums, NPS scores, and more) for a single field or an entire dataset. Call insights-public_discover first to resolve form_id / audience_id / field_id / property_id and to learn each field's filter_type, filter_operators, and filter_values before filtering. ## Use when - User asks for summary statistics, totals, averages, counts, or scores - User wants aggregated data rather than individual rows - User asks about NPS score, response count, average rating, or similar rolled-up metrics ## Also known as summary statistics, totals, counts, averages, sums, NPS scores, aggregate analytics, rolled-up metrics ## Constraints - Provide exactly one of form_id or audience_id — never both, never neither. - Every optional parameter must be sent as null when unset. ## Supported field types - forms dataset: text, number, scale, boolean, choices, dropdown, nps, date, multi_format, transcript, payment, matrix, ranking. - contacts dataset: text, text_list, number.
account_idstringrequiredAccount identifier. Always required.audience_idstringrequiredAudience ID selecting the "contacts" dataset. Value when scoping to contacts (combined with account_id); null when form_id is set instead. Mutually exclusive with form_id.field_idstringrequiredField ID to aggregate. "forms" dataset only. Value when aggregating a specific field; null for dataset-level totals or contacts dataset.filtersstringrequiredCross-field filter conditions. Null for no filtering.form_idstringrequiredForm ID selecting the "forms" dataset. Value when scoping to a form; null when audience_id is set instead. Mutually exclusive with audience_id.measuresarrayrequiredMeasure names to compute (e.g. "count", "average", "sum", "nps_score"). Call insights-public_discover first to learn which measures each field supports.property_idstringrequiredProperty ID to aggregate. Required together with audience_id for the "contacts" dataset; null for the "forms" dataset.time_rangestringrequiredTime window for the query as unix seconds. Interval is closed (both bounds inclusive). Null when no time filtering is provided. If provided, any missing bound is filled with its default (start=1, end=current unix time).typeformmcp_insights_public_discover#Return the schema of analytics data available for a given scope.
Call this BEFORE any analytics query (insights-public_aggregate/timeseries/toplist/list) to learn which datasets exist,
which fields are queryable, what measures and dimensions each field supports, and which filters apply.
## Inputs
- account_id: required.
- form_id XOR audience_id: form_id for form response data, audience_id for contact data. Provide exactly one.
## Output
- datasets: array of datasets, each with fields. Each field lists answer_type, measures, dimensions, supported_query_types, and filter operators.
## Resolving a form by name
If the user refers to a form by topic/name/description rather than ID, first call forms-public_list_forms with the search
parameter set to keywords from the user's message; it returns forms with titles and IDs.
If multiple match, ask the user which form they mean before proceeding.
3 params
Return the schema of analytics data available for a given scope. Call this BEFORE any analytics query (insights-public_aggregate/timeseries/toplist/list) to learn which datasets exist, which fields are queryable, what measures and dimensions each field supports, and which filters apply. ## Inputs - account_id: required. - form_id XOR audience_id: form_id for form response data, audience_id for contact data. Provide exactly one. ## Output - datasets: array of datasets, each with fields. Each field lists answer_type, measures, dimensions, supported_query_types, and filter operators. ## Resolving a form by name If the user refers to a form by topic/name/description rather than ID, first call forms-public_list_forms with the search parameter set to keywords from the user's message; it returns forms with titles and IDs. If multiple match, ask the user which form they mean before proceeding.
account_idstringrequiredAccount ID. Always required.audience_idstringrequiredAudience ID for contact data. Mutually exclusive with form_id.form_idstringrequiredForm ID for form response data. Mutually exclusive with audience_id.typeformmcp_insights_public_list#Return paginated row-level data for a single field in a dataset.
Use this tool when the user wants to see individual records (text responses, numeric ratings, true/false answers, etc.) rather than aggregated numbers.
## What this tool does
- Returns one row per response for the specified field, with cursor-based pagination.
## Inputs
- account_id: required.
- form_id XOR audience_id: form_id for the "forms" dataset, audience_id for the "contacts" dataset. Exactly one.
- field_id: form field to list values for. Works in "forms" dataset only.
- property_id: property to list values for. Required together with audience_id in the "contacts" dataset.
- time_range: { start, end } as unix seconds. Required.
- pagination:
- page_size: Required. Max 100.
- cursor: opaque token from a previous response to fetch the next page. Null for first page.
- search: free-text ILIKE filter on values. Null for no filter.
- filters: cross-field filter conditions. Null for no filtering.
- sort: sort order. Null for default (newest first).
## Output
- data: array of rows, each with { row_id, timestamp, text }.
- summary: { total_count, match_count } — total rows in scope and rows matching search/filters.
- pagination: { page_size, cursor, is_last_page }. Pass cursor back to fetch the next page.
## Supported field types
- text, number, boolean, choices, dropdown, nps, date, multi_format, transcript.
## Joining answers per respondent
- row_id is consistent across fields for the same form.
- To reconstruct one respondent's full set of answers: call this tool once per field, then join the resulting rows on row_id.
10 params
Return paginated row-level data for a single field in a dataset. Use this tool when the user wants to see individual records (text responses, numeric ratings, true/false answers, etc.) rather than aggregated numbers. ## What this tool does - Returns one row per response for the specified field, with cursor-based pagination. ## Inputs - account_id: required. - form_id XOR audience_id: form_id for the "forms" dataset, audience_id for the "contacts" dataset. Exactly one. - field_id: form field to list values for. Works in "forms" dataset only. - property_id: property to list values for. Required together with audience_id in the "contacts" dataset. - time_range: { start, end } as unix seconds. Required. - pagination: - page_size: Required. Max 100. - cursor: opaque token from a previous response to fetch the next page. Null for first page. - search: free-text ILIKE filter on values. Null for no filter. - filters: cross-field filter conditions. Null for no filtering. - sort: sort order. Null for default (newest first). ## Output - data: array of rows, each with { row_id, timestamp, text }. - summary: { total_count, match_count } — total rows in scope and rows matching search/filters. - pagination: { page_size, cursor, is_last_page }. Pass cursor back to fetch the next page. ## Supported field types - text, number, boolean, choices, dropdown, nps, date, multi_format, transcript. ## Joining answers per respondent - row_id is consistent across fields for the same form. - To reconstruct one respondent's full set of answers: call this tool once per field, then join the resulting rows on row_id.
account_idstringrequiredAccount ID. Always required.paginationobjectrequiredPagination parameters.time_rangeobjectrequiredTime window for the query.audience_idstringoptionalAudience ID for the 'contacts' dataset. Mutually exclusive with form_id.field_idstringoptionalField ID to list values for. 'forms' dataset only.filtersstringoptionalCross-field filter conditions.form_idstringoptionalForm ID for the 'forms' dataset. Mutually exclusive with audience_id.property_idstringoptionalProperty ID to list values for. Required for the 'contacts' dataset together with audience_id.searchstringoptionalText search filter applied to values (ILIKE match).sortstringoptionalSort order for results.typeformmcp_insights_public_timeseries### What this tool does
Computes measures bucketed over time for a single field or an entire dataset.
Call insights-public_discover first to resolve form_id / audience_id / field_id / property_id and to
learn each field's filter_type, filter_operators, and filter_values before filtering.
## Use when
- User asks how responses, counts, scores, or averages changed over time
- User wants a trend, chart, or time series of any metric
- User asks about monthly/weekly/daily breakdowns of responses or scores
## Also known as
trend, time series, time-series, over time, by month, by week, by day, timeline, chart data, historical data
## Constraints
- Provide exactly one of form_id or audience_id — never both, never neither.
- Every optional parameter must be sent as null when unset.
## Supported field types
- forms dataset: text, number, scale, boolean, choices, dropdown, nps, date, multi_format, transcript, payment, matrix, ranking.
- contacts dataset: text, text_list, number.
11 params
## What this tool does Computes measures bucketed over time for a single field or an entire dataset. Call insights-public_discover first to resolve form_id / audience_id / field_id / property_id and to learn each field's filter_type, filter_operators, and filter_values before filtering. ## Use when - User asks how responses, counts, scores, or averages changed over time - User wants a trend, chart, or time series of any metric - User asks about monthly/weekly/daily breakdowns of responses or scores ## Also known as trend, time series, time-series, over time, by month, by week, by day, timeline, chart data, historical data ## Constraints - Provide exactly one of form_id or audience_id — never both, never neither. - Every optional parameter must be sent as null when unset. ## Supported field types - forms dataset: text, number, scale, boolean, choices, dropdown, nps, date, multi_format, transcript, payment, matrix, ranking. - contacts dataset: text, text_list, number.
account_idstringrequiredAccount identifier. Always required.audience_idstringrequiredAudience ID selecting the "contacts" dataset. Value when scoping to contacts; null when form_id is set instead. Mutually exclusive with form_id - provide exactly one, never both, never neither.dimensionsarrayrequiredOptional list of dimensions to break down each time bucket by (max 2). Null for no breakdown when no dimensions are provided. Call insights-public_discover to learn which dimensions each field supports.field_idstringrequiredField ID to compute timeseries for. Value when form_id is set; null otherwise.filtersstringrequiredCross-field filter conditions. Null for no filtering.form_idstringrequiredForm ID selecting the "forms" dataset. Value when scoping to a form; null when audience_id is set instead. Mutually exclusive with audience_id - provide exactly one, never both, never neither.granularitystringrequiredTime bucket size. One of: hour, day, week, month, quarter, year.measuresarrayrequiredMeasure names to compute (e.g. "count", "average", "nps_score"). Call insights-public_discover first to learn which measures each field supports.property_idstringrequiredProperty ID to compute timeseries for. Value when audience_id is set; null otherwise.time_rangestringrequiredTime window for the query as unix seconds. Interval is closed (both bounds inclusive). Null when no time filtering is provided. If provided, any missing bound is filled with its default (start=1, end=current unix time).timezone_offsetintegerrequiredTimezone offset in seconds to apply when bucketing by day/week/month/quarter/year. Null for UTC (offset=0). Example: 3600 for UTC+1, -18000 for UTC-5.typeformmcp_insights_public_toplist### What this tool does
Ranks groups of rows by a measure — e.g. "top 5 lead sources by contact count" or "which NPS category has the most responses."
Call insights-public_discover first to resolve form_id / audience_id / field_id / property_id and to
learn each field's dimensions, measures, filter_type, filter_operators, and filter_values before filtering.
## Use when
- User asks for a ranking, "top N", breakdown by category, or "most/least common" answer
- User wants rows grouped by one or two dimensions and sorted by a measure
- User wants to compare groups/choices/values against each other, not a single rolled-up number
## Also known as
top N, ranking, leaderboard, breakdown by category, grouped counts, most common, least common
## Constraints
- Provide exactly one of form_id or audience_id — never both, never neither.
- dimensions: 1-2 entries. Each name must be a dimension the selected field supports (see insights-public_discover).
- Every optional parameter must be sent as null when unset.
## Supported field types
- forms dataset: number, nps, scale, boolean, choices, text_list, payment, dropdown, multi_format, matrix, transcript, ranking.
- contacts dataset: text_list.
11 params
## What this tool does Ranks groups of rows by a measure — e.g. "top 5 lead sources by contact count" or "which NPS category has the most responses." Call insights-public_discover first to resolve form_id / audience_id / field_id / property_id and to learn each field's dimensions, measures, filter_type, filter_operators, and filter_values before filtering. ## Use when - User asks for a ranking, "top N", breakdown by category, or "most/least common" answer - User wants rows grouped by one or two dimensions and sorted by a measure - User wants to compare groups/choices/values against each other, not a single rolled-up number ## Also known as top N, ranking, leaderboard, breakdown by category, grouped counts, most common, least common ## Constraints - Provide exactly one of form_id or audience_id — never both, never neither. - dimensions: 1-2 entries. Each name must be a dimension the selected field supports (see insights-public_discover). - Every optional parameter must be sent as null when unset. ## Supported field types - forms dataset: number, nps, scale, boolean, choices, text_list, payment, dropdown, multi_format, matrix, transcript, ranking. - contacts dataset: text_list.
account_idstringrequiredAccount identifier. Always required.audience_idstringrequiredAudience ID selecting the "contacts" dataset. Value when scoping to contacts (combined with account_id); null when form_id is set instead. Mutually exclusive with form_id.dimensionsarrayrequired1-2 dimensions to group rows by, in order. Each name must be a dimension the selected field supports — call insights-public_discover first to learn which.field_idstringrequiredField ID to rank. "forms" dataset only. Value when form_id is set; null for the contacts dataset.filtersstringrequiredCross-field filter conditions. Null for no filtering.form_idstringrequiredForm ID selecting the "forms" dataset. Value when scoping to a form; null when audience_id is set instead. Mutually exclusive with audience_id.limitintegerrequiredMaximum number of ranked rows to return. Integer between 1 and 100.measuresarrayrequiredMeasure names to compute per group (e.g. "count", "average", "nps_score"). Call insights-public_discover first to learn which measures each field supports.property_idstringrequiredProperty ID to rank. Required together with audience_id for the "contacts" dataset; null for the "forms" dataset.sortstringrequiredSort order applied to the ranked groups. Null for no explicit order (rows come back in unspecified group order).time_rangestringrequiredTime window for the query as unix seconds. Interval is closed (both bounds inclusive). Null when no time filtering is provided. If provided, any missing bound is filled with its default (start=1, end=current unix time).typeformmcp_submit_feedback#Call this any time a task cannot be completed as literally requested — missing feature, false
premise, permission error, API failure, etc.
ALWAYS call when blocked: if the user's literal request could not be fulfilled by
available tools, you MUST call this — even if you explained the limitation or
proposed a workaround. A workaround or explanation is not a substitute for logging
the gap; call this in addition to it, not instead of it. Set blocker_category to the reason:
- Missing Tool (a capability you needed did not exist),
- API Error (a backend call failed),
- Lack of Context (you were missing information you needed),
- Policy Restriction (an action was disallowed), or
- Other (any other blocker).
OPTIONAL when not blocked: if you completed the task, calling this is encouraged.
Set blocker_category to "Not Blocked" and share observations, suggestions, or
anything that could improve the tools.
The feedback is used to improve the available tools and the agent experience, so be
specific and concrete.5 params
Call this any time a task cannot be completed as literally requested — missing feature, false premise, permission error, API failure, etc. ALWAYS call when blocked: if the user's literal request could not be fulfilled by available tools, you MUST call this — even if you explained the limitation or proposed a workaround. A workaround or explanation is not a substitute for logging the gap; call this in addition to it, not instead of it. Set blocker_category to the reason: - Missing Tool (a capability you needed did not exist), - API Error (a backend call failed), - Lack of Context (you were missing information you needed), - Policy Restriction (an action was disallowed), or - Other (any other blocker). OPTIONAL when not blocked: if you completed the task, calling this is encouraged. Set blocker_category to "Not Blocked" and share observations, suggestions, or anything that could improve the tools. The feedback is used to improve the available tools and the agent experience, so be specific and concrete.
attempted_actionsstringrequiredWhat steps or tools were tried?blocker_categorystringrequiredWhat high-level issue prevented task completion? Select Not Blocked if nothing blocked you but you still have feedback to share.feedback_specificsstringrequiredProvide the exact name of the tool you wished you had, the specific context you were missing, or the name of the failing API. If you were not blocked, describe your observation or suggestion.user_goalstringrequiredWhat was the user ultimately trying to achieve?technical_logsstringoptionalAny relevant error messages, logs, or system output. Leave empty if not applicable.typeformmcp_workspaces_list_workspaces#List the workspaces the caller can see, with id, name, form_count, type (private/shared/custom), and account_id. Pair with forms-list_forms to discover forms in a specific workspace. Supports search by name and pagination.3 params
List the workspaces the caller can see, with id, name, form_count, type (private/shared/custom), and account_id. Pair with forms-list_forms to discover forms in a specific workspace. Supports search by name and pagination.
pageintegerrequired1-indexed page number. Null uses default (1).page_sizeintegerrequiredItems per page. Null uses default (10).searchstringrequiredFilter workspaces by name (partial match, case-insensitive). Null returns all workspaces.