Designing Forms an AI Agent Can Actually Submit FORMLOVA, a chat-first form service, has redesigned its forms to be reliably submittable by AI agents, not just humans. The company identified five key requirements for agent-friendly forms, including stable semantic field identifiers and validation rules accessible before submission. FORMLOVA exposes these properties through both tool calls and rendered pages, ensuring compatibility with desktop clients, MCP-aware agents, and browser automation tools. Most form codebases I have read were designed against one mental model of the submitter. A person. A person who reads each label. A person who watches the screen between submit and the confirmation banner. A person whose retries look like fast double clicks, not like a queued workflow that came back online. A person whose definition of bot is "obviously not a person." That mental model is still correct for a lot of traffic. It is becoming less correct over time. Increasingly, the entity submitting a form is an AI agent acting on behalf of a person. Desktop clients with tool calling, MCP-aware agents, browser automation agents, and computer-use models all submit forms on someone's behalf. The form on the other side rarely knows. This article is about what to change in your form so an agent can submit it reliably, without you having to ship an API just for them. I will use FORMLOVA https://formlova.com/en as the working example, because that is the codebase I work in. FORMLOVA is a chat-first form service whose primary surface is an MCP server 129 tools across 25 categories and whose secondary surface is a hosted form page. Operators and respondents can both reach it via chat or page; in both cases, at least one side of the interaction can be an agent. The patterns themselves are not FORMLOVA-specific. Before talking about code, it helps to fix the requirements. An agent submitting on behalf of a user typically needs five things from your form: 1. A way to identify each field by meaning, not by pixel position. 2. A way to learn the validation rules before sending values. 3. A way to submit safely if the network blinks or the user retries. 4. A way to read the confirmation result without depending on a toast. 5. A way to prove it is legitimate without solving an "are you a human" puzzle. If any of those five are missing, the agent will either fail silently or burn user trust with retries. Neither is a good outcome for your conversion rate. The interesting product question is not "should we have these properties." It is "which of these can we expose as a tool call, and which has to live in the rendered page so that browser agents can still operate the form from outside our walls." In FORMLOVA, the answer is hybrid: each property is exposed both ways. The tool surface is the canonical contract. The rendered page mirrors it. The first thing to fix is the field identity. A field name like field 3 or q short answer 12 works for a renderer. It does not work for an agent. The agent needs a stable, semantic identifier that survives layout redesigns. type FieldDescriptor = { // Stable across the life of the response. Never recycled. stableId: string; // Semantic name reused across forms. e.g. "email", "company", "consent marketing". semanticName: string; // Position-only id used for current rendering. renderId: string; label: { default: string; locales?: Record