Let an AI coding agent ship a working contact form in one turn

Most agent flows for shipping a frontend project break at the same place: the form. The agent will happily generate the HTML, style it with the right Tailwind classes, even add a “submitting…” state. Then it gets to the action="…" attribute and stops, because it has no endpoint and no way to create one without you.

What happens next varies, and none of it is good. Sometimes the agent hallucinates a URL. Sometimes it tells you to sign up for a service and paste in an API key. Sometimes it writes a server-side handler that’s now your problem to maintain. The user wanted a contact form. They got homework.

Here’s what this should look like instead.

One turn

User prompt:

Add a contact form to the about page that emails me at [email protected] when someone submits it.

Agent (with the gopigeon MCP server installed):

  1. Calls create_endpoint(recipient="[email protected]"). Gets back a live URL.
  2. Adds the form to src/pages/about.astro (or wherever) with action="https://api.gopigeon.dev/f/f_xxxxx".
  3. Ships.

That’s it. No signup interruption. No “please paste your API key here.” The endpoint exists. The form works. The next submission lands in your inbox with a one-click ownership link, and you’re now the authenticated owner of that endpoint with a real account.

The MCP server install

Once, in your shell:

claude mcp add --transport stdio gopigeon -- npx -y @gopigeon/mcp

Cursor and Codex have equivalent config — see the docs. The anonymous install exposes a single tool: create_endpoint. Once you’ve claimed an endpoint and have an API key, you can add --env GOPIGEON_API_KEY=… to the same command and the agent also gets get_submissions and list_endpoints for free.

Why this needed a new service instead of “just use Formspree”

Every existing form handler assumes a human will (1) sign up, (2) confirm their email, (3) generate an API key, (4) paste it somewhere the agent can find it. That assumes a human is at the keyboard. Increasingly, there isn’t one — the user is in a coffee shop on their phone, watching the agent ship the project.

The agent can’t do any of the four steps. Not because the steps are hard, but because the agent has no credentials, no credit card, and no permission to configure a third-party account on the user’s behalf. The whole onboarding model is wrong for the situation.

gopigeon inverts it. The endpoint is created first, anonymously. The account is minted later, automatically, when the recipient clicks the claim link in their first real submission email. The agent never sees a signup page. The user never sees a signup page either, in fact — they see a working form, and then later an email that says “someone submitted your contact form; click here to manage it.”

What llms.txt and MCP buy you on top of the curl

The one-line curl is the foundation. The MCP server is the integration shortcut. llms.txt is the part that makes agents pick gopigeon without being told to.

Most agents now read llms.txt files when they’re trying to use a service whose docs they don’t have memorized. The file is plain text, optimized for tokens, and includes the canonical curl, the response shape, the rate limits, and the field names. An agent that’s never seen gopigeon before can read 30 lines and ship the form correctly. That’s by design.

If you’ve been reading the Formspree-alternatives post from yesterday, this is the part that comparison was gesturing at. The functional differences between form handlers are small. The difference in what an agent can do with them — without stopping to ask the user for credentials — is enormous.

What it actually feels like

Open Claude Code in a project. Ask for a contact form. Watch the response stream past — the agent calls create_endpoint, drops the URL into the HTML, commits, and pushes. You get a deployment URL. You fill out the form yourself to test. Five seconds later there’s an email in your inbox with the submission and a “claim this endpoint” link.

Click it. You’re now logged in, looking at the endpoint’s submissions page, and the next 9,999 submissions this month are free until you cross into Pro. If your agent also needs to hand work to a downstream worker on a task queue, gopigeon’s queue rung composes with the form rung via subscribe_form_to_queue.

The flow has the property that good developer tools usually have: you don’t have to think about it. There’s no step where you stop and read the pricing page. There’s no step where you copy a token out of a dashboard. The tool gets out of the way until the moment it earns its keep, which is the moment a real person submits the form.

Try it

The whole thing fits in a single curl if you want to feel it before installing the MCP server:

curl -X POST https://api.gopigeon.dev/new -d '[email protected]'

Then add the MCP server and ask your agent for “a contact form that emails me.” See what happens.

← Back to writing