> ## Documentation Index
> Fetch the complete documentation index at: https://formcarry.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Lovable

> Lovable builds a form that sends its submissions to formcarry, and one prompt in its chat does the setup.

The prompt goes into Build mode, standing rules go into the project's Knowledge, and the app posts from the browser because the endpoint needs no key.

## Connect over MCP

<Card title="Connect over MCP" icon="plug" href="/docs/connect" horizontal cta="See how to connect">
  Formcarry's MCP does everything you would do in the dashboard for your forms and submissions: create a form, set its recipients, spam blocker and webhooks, list and search submissions, mark spam, and read where each submission was delivered. Lovable connects to it as a chat connector, so it manages the form it built instead of only writing the front end.
</Card>

## Prerequisites

Before you start, you need:

* A formcarry account. [Sign up](https://app.formcarry.com/register) is free.
* A form in the [dashboard](https://app.formcarry.com). Its endpoint is on the form's Setup page. The examples use `https://formcarry.com/s/AbC123xyz`; put yours in its place.
* The form's name and id from its page in the dashboard, for the prompt.

## 1. Provide the instructions

In Build mode (the default), paste this into the chat field at the bottom of the panel on the left:

```text theme={null}
Read https://formcarry.com/llms.txt for how the front end setup works, then connect my formcarry form "<form name>" (id <form_id>) to the form in this project, send a test submission and tell me what you changed.
```

Build mode fetches outside documentation when asked.

Lovable reads the project's Knowledge with every message. To set a rule that holds for every later prompt, open **Project settings** > **Knowledge** and add it:

```text theme={null}
Post to formcarry from the browser, never from an edge function or a server. Send Accept: application/json with the request. Give every field a name, and name the visitor's address field email.
```

## 2. Check what it changed

Lovable's reply says what changed, and **Details** lists every step and file change.

For a diff, open **History** in the top bar and click **View code changes**. The **Code** tab shows every file; on the free plan it is read only. With GitHub connected under **Project settings** > **Git**, the change is also a commit.

In the diff, check five things:

* The endpoint in the form's `action` or `fetch` URL matches the form's Setup page, otherwise formcarry answers `401`.
* `method="POST"` on the form, or `method: "POST"` in the `fetch` call, otherwise the browser sends a GET and formcarry answers with a page that says GET is not allowed.
* A `name` on every field, otherwise the browser leaves it out of the request and it never reaches formcarry.
* `email` on the visitor's address field, otherwise replying to the notification email goes nowhere and the auto response is not sent.
* `Accept: application/json` when it posts from JavaScript, otherwise the answer is the thank you page's HTML.

## 3. Send a test submission

Submit the form once in the preview on the right, or type "test this" in the chat. Browser testing then fills the form in the preview, submits it and reads the network requests.

The submission is on the form's page in the dashboard, and the notification email arrives at your account's address. Wait 15 seconds before a second test rather than sending it at once, otherwise the same IP address gets a `429` for that form.

**Publish** (top right) deploys a snapshot, so a change made after publishing goes live on the next publish.

## Where the request runs

Lovable writes edge functions for work it decides cannot happen in the browser, such as calling other services, and for any API with a key. The formcarry endpoint needs no key, so the app calls it directly, with no edge function.

If the request lands in an edge function or on a server anyway, ask Lovable to move it into the browser rather than accepting the edge function, otherwise no spam blocker token can be sent:

```text theme={null}
Move the formcarry request out of the edge function and into the browser: post to https://formcarry.com/s/AbC123xyz with fetch and Accept: application/json, then send a test submission and tell me what you changed.
```

## What's next

* [What every form needs](/docs/what-every-form-needs): field names, hidden inputs, limits and the answers.
* [Spam protection](/docs/features/spam-protection): add a challenge once the form is live.
* [Connect over MCP](/docs/connect): let the tool manage the form, not only write it.

Stuck? Write to [help@formcarry.com](mailto:help@formcarry.com). Include the form id.


## Related topics

- [Build with AI](/docs/ai/overview.md)
- [Introduction](/docs/introduction.md)
