# Build forms with an AI assistant

> How AI assistants create, edit and publish trulyform forms over MCP: the server address, sign-in, the tools, and the form definition they edit.

trulyform is a form builder. Its MCP server lets an AI assistant work in a person's own trulyform account: create forms, edit their questions, logic and design, publish them, and read the responses.

## What you need to know

- **Server:** `https://trulyform.com/mcp`, remote MCP over HTTP. Setup steps are in [Connect](https://trulyform.com/docs/connect.md).
- **Sign-in:** the person signs in to trulyform in a browser and approves access. There are no API keys.
- **A form is one JSON document**, the [form definition](https://trulyform.com/docs/form-definition.md). Read it with `get_form`, edit it, and save the whole document with `save_form_draft`.
- **Saving never publishes.** Publishing is a separate call, made only when the person asks for it.
- **Start with [Build a form, step by step](https://trulyform.com/docs/building-a-form.md).** Look up details in [Question types](https://trulyform.com/docs/question-types.md) and [Limits and errors](https://trulyform.com/docs/validation.md).

## The tools

The server offers 10 tools.

| Tool | What it does |
| --- | --- |
| [`read_docs`](https://trulyform.com/docs/tools.md#read_docs) | Read trulyform’s docs for building forms, as Markdown. |
| [`list_forms`](https://trulyform.com/docs/tools.md#list_forms) | List forms in your organization, newest IDs first. |
| [`get_form`](https://trulyform.com/docs/tools.md#get_form) | Read the complete current draft definition, revision, validation issues, and publication information. |
| [`list_field_types`](https://trulyform.com/docs/tools.md#list_field_types) | List every question kind with its settings, logic operators, answer shape and a ready-to-edit template, plus the rich-text shape and definition limits. |
| [`create_form`](https://trulyform.com/docs/tools.md#create_form) | Create an unpublished form in your organization and return its full initial draft. |
| [`save_form_draft`](https://trulyform.com/docs/tools.md#save_form_draft) | Replace a form’s entire draft definition and name, preserving draft history. |
| [`publish_form`](https://trulyform.com/docs/tools.md#publish_form) | Publish the exact reviewed draft revision for new respondents. |
| [`list_responses`](https://trulyform.com/docs/tools.md#list_responses) | List response IDs, status, version, and timestamps for a form, newest IDs first. |
| [`get_response`](https://trulyform.com/docs/tools.md#get_response) | Read one private response with resolved question labels, display answers, active-path indicators, calculations, and file names/sizes. |
| [`form_stats`](https://trulyform.com/docs/tools.md#form_stats) | Count currently stored completed responses and, when your plan permits partial responses, started responses. |

## What a form can contain

- A welcome screen, up to 200 questions shown one at a time, and an ending screen.
- 17 question types, from short text and email to ratings, rankings, matrices and file uploads.
- Logic rules that show, hide, require or skip questions based on earlier answers.
- Calculations that turn answers into numbers, such as a quote or a score.
- Piped answers: an earlier answer or a calculation shown inside a later question or the ending.
- A theme: colors, font, corner radius and spacing.

A form has no pages or sections, exactly one ending, and no redirect after submission.

## For agents

- Connected over MCP? Call `read_docs` to read any of these pages, or a single section such as `question-types#file_upload`. The pages are also MCP resources at `trulyform://docs/{page}`.
- Every page has a Markdown version at the same address plus `.md`, for example https://trulyform.com/docs/question-types.md.
- https://trulyform.com/llms.txt lists every page, and https://trulyform.com/llms-full.txt contains all of them in one file.


---

Next: [Connect](https://trulyform.com/docs/connect.md)

All pages: https://trulyform.com/llms.txt. Connected over MCP? Call read_docs with a page name instead.
