https://splitforms.com/api/mcp, bearer-token auth, free on every plan. Best hosted builders with first-party servers: Tally (free), Typeform, Jotform. Airtable and Notion cover the destination side; Zapier and n8n reach everything else.Point any HTML form at one endpoint. 500 free submissions — no card, no time limit — and unlimited forms.
Create free accountWhat "MCP server for forms" means
An MCP server for forms is an HTTP (or local stdio) endpoint that speaks the Model Context Protocol and exposes a form product's operations as tools with JSON schemas: create_form, list_submissions, create_webhook, and so on. The AI host — Claude Code, Cursor, Claude Desktop, Windsurf, ChatGPT — reads the schemas once and then calls tools like local functions, with your credentials living in a config file the model never quotes back.
The category splits in two. Form builders (Tally, Typeform, Jotform) give the agent a hosted form or embed to hand you. Form backends (splitforms) give the agent an access key and a POST endpoint so it can write the form markup itself into your React, Next.js, Astro, or plain HTML project. If an agent is already editing your codebase, the second kind is the one that fits — see AI agent form backend for the longer argument.
What an agent can actually do with one
With the splitforms server connected, an agent can call 12 tools; every one is scoped to the account that owns the token, and all of them work on the Free plan. The table is taken from the server's live tool catalog.
| Tool | What the agent can do with it | Plan |
|---|---|---|
get_access_key | Returns the account's public form access_key and the submit endpoint, so generated HTML posts to the right account. | Paid |
generate_form | Renders ready-to-paste code for a template (contact, newsletter, waitlist, feedback, quote, bug, booking, job, event-rsvp, lead-magnet) in html, javascript, react, php, or curl, with the access_key pre-filled. | Paid |
create_form | Creates a real form in the account with the exact fields you specify (text, email, tel, url, number, date, textarea, select, file) and returns its access_key, a WordPress shortcode, and paste-anywhere HTML. | Paid |
list_templates | Lists every template id, title, description, category, and field list, for when the agent is unsure what to build. | Paid |
list_submissions | Returns the most recent submissions (default 10, max 50) with id, timestamp, unread flag, data, and referrer. | Paid |
get_submission | Returns one submission by UUID: every field, IP, user agent, referrer, spam flag, and timestamp. | Paid |
create_webhook | Saves an outbound webhook to a public HTTPS URL, account-wide or scoped to one form. The signing secret is never returned to the agent. | Paid |
list_forms | Lists every form with id, name, access_key, active state, company label, and creation date. | Paid |
get_form | Returns one form's saved field schema, notification subject template, auto-responder state, and email-notification mode. | Paid |
update_form | Renames a form, sets the subject template, toggles the auto-responder and its copy, switches notifications on/off/fallback, or pauses/resumes it. Recipient addresses are dashboard-only. | Paid |
get_usage | Reports the plan, this month's submission count against the monthly limit, and file-storage use against the cap. | Paid |
test_webhook | Fires a sample submission at a saved webhook and returns the destination's HTTP status. | Paid |
Four bundled prompts sit on top of the tools: build_form (describe a form, get it created and paste-ready), add_form_to_site (detect the framework and insert the form), triage_inbox (summarize and rank recent submissions), and connect_webhook (wire submissions to Slack, Discord, a CRM, or Make/Zapier/n8n, then test delivery). In Claude Code they appear as /mcp__splitforms__build_form and so on. The full tool reference is on the MCP page and in the docs.
The ranking: 9 MCP servers for forms
Ranked by how much of the form job the agent can finish without you leaving the editor. Every entry below splitforms was checked against the vendor's own site or the community repository on September 6, 2026; the kind label says whether the server is first-party, community-built, or a generic automation layer that happens to reach form tools.
splitforms
Native vendor serverThe only entry here that is a form backend rather than a form builder: the agent creates a form, gets an access_key, and writes a plain <form> or fetch() that POSTs to https://splitforms.com/api/submit — no vendor embed, no iframe. Twelve tools cover create, read, update, usage, and webhooks; four bundled prompts (build_form, add_form_to_site, triage_inbox, connect_webhook) script the common flows. Deletes are deliberately not exposed.
- Endpoint
- https://splitforms.com/api/mcp (streamable HTTP, JSON-RPC 2.0)
- Auth
- Bearer token (starts with lim_) generated at Dashboard → MCP; revocable
- Best for
- Agents that write the front-end themselves (Claude Code, Cursor, Windsurf, Continue) and need a POST endpoint, spam filtering, email, and webhooks behind it.
- Caveat
- The MCP server is available on every plan, including Free — generate a token at Dashboard → MCP and connect. Plan limits still apply to what the tools touch: Free covers 500 submissions total with unlimited forms; Pro at $5/month raises that to 5,000 a month and adds signed webhooks; Annual is $49/year for 15,000 a month.
Tally
Native vendor serverTally's own server, free on every Tally plan, with 20+ tools for creating and editing forms, managing workspaces, and pulling submissions. Tally documents a guardrail that stops the agent deleting forms or submissions.
- Endpoint
- https://api.tally.so/mcp (HTTP)
- Auth
- OAuth on first connect; Claude Code: claude mcp add tally --transport http https://api.tally.so/mcp
- Best for
- Teams that want a hosted, no-code form UI the agent can build and edit, and are happy to embed Tally rather than own the markup.
- Caveat
- You get a Tally form (hosted page or embed), not a POST endpoint for your own HTML.
Typeform
Native vendor serverExposes form and automation building, contact management, and response analytics over MCP. Available as a connector in the Claude and ChatGPT directories or as a custom URL in any MCP client.
- Endpoint
- https://api.typeform.com/mcp (streamable HTTP)
- Auth
- OAuth 2.0, prompted on first connect
- Best for
- Conversational, one-question-at-a-time surveys and marketing forms where the Typeform experience is the point.
- Caveat
- Typeform is a builder with its own pricing; check the plan page for response caps before wiring an agent to it.
Jotform
Native vendor serverOfficial, vendor-maintained server documented with tools for form_list, create_form, edit_form, create_submission, and get_submissions. Jotform states the server is available at no additional charge.
- Endpoint
- https://mcp.jotform.com
- Auth
- OAuth 2.0; clients managed at Account → Connected Apps → Jotform MCP
- Best for
- Long, multi-page forms with payments, PDFs, or approval flows already living in Jotform.
- Caveat
- Same trade-off as Tally and Typeform: the output is a Jotform-hosted form or embed, not your own markup.
Airtable
Native vendor serverAirtable's official hosted server lets an agent scaffold bases, create and update records, and build interfaces and automations. An Airtable form is a view on a table, so the agent can stand up the destination and the form in one go.
- Endpoint
- https://mcp.airtable.com/mcp
- Auth
- Vendor-managed connection; included with the existing Airtable plan, counts against API rate limits
- Best for
- When the submissions need to land in a relational base the rest of the team already works in.
- Caveat
- Not a form backend for your own HTML — to post from a custom site you still need an endpoint (or a splitforms webhook into Airtable).
Notion
Native vendor serverNotion's official server exposes search, fetch, create-pages, update-page, create-database, and comment tools. It is a destination for form data rather than a form tool, but agents use it to build the intake database the form feeds.
- Endpoint
- https://mcp.notion.com (hosted); open-source local server on GitHub
- Auth
- OAuth
- Best for
- Teams whose CRM or intake tracker is a Notion database.
- Caveat
- No submit endpoint of its own; pair with a form backend that can webhook into Notion.
Zapier MCP
Generic automation MCPNot a form product, but Zapier publishes app-specific MCP pages for Google Forms, Gravity Forms, Formidable, Fillout, Zoho Forms, and Cognito Forms, so an agent can reach those tools' actions through one server.
- Endpoint
- Per-user Zapier MCP server URL; tools are chosen per client
- Auth
- Zapier account; each connected app authorizes separately
- Best for
- Reaching a form tool that has no native MCP server, or chaining form events into 30,000+ other actions.
- Caveat
- Actions run through Zapier's task metering, and the agent sees Zapier's abstraction of each app rather than the vendor's full API.
n8n (MCP Server Trigger node)
Self-hostedn8n's MCP Server Trigger turns any workflow into an MCP tool. A webhook-driven form workflow — receive, validate, store, notify — becomes something an agent can call or inspect.
- Endpoint
- Test and production URLs generated by the node; SSE and streamable HTTP
- Auth
- Bearer or header auth configured on the node
- Best for
- Teams already running n8n who want the agent to drive their own form pipeline instead of a vendor's.
- Caveat
- You build and host the tools yourself; nothing about forms is provided out of the box.
Google Forms and Fillout (community servers)
Community / third-party serverNeither Google nor Fillout publishes a first-party MCP server that we could find. Community servers exist for both — matteoantoci/google-forms-mcp and KamaruSama's Google Forms server (19 tools), danielma-tic/fillout-mcp-server for Fillout — plus hosted wrappers from Zapier, Pipedream, and Composio.
- Endpoint
- Local stdio servers from GitHub; also via Zapier, Pipedream, Activepieces, Composio
- Auth
- Google OAuth refresh token (Google Forms); Fillout API key or OAuth depending on the server
- Best for
- Existing Google Forms or Fillout estates where switching tools is not on the table.
- Caveat
- Unofficial: maintenance, scopes, and security are on you. Read the code before handing it a token.
When not to use splitforms: if you need a visual builder, conditional logic between questions, payments inside the form, or a hosted form page you never embed, pick Tally, Typeform, or Jotform. splitforms is for forms whose markup you or your agent own.
Checked and left out
Two candidates were searched and omitted because we could not find a first-party MCP server. Formspree publishes agent instructions at formspree.io/ai — the agent fetches a page and follows a claim-URL flow — which is useful but is not MCP. Fillout is reachable only through community and third-party servers (danielma-tic on GitHub, Zapier, Pipedream, Composio), so it is folded into entry #9 rather than ranked on its own. If either ships a native server, this list will be updated.
Setup: connect the splitforms MCP server
The server lives at https://splitforms.com/api/mcp and authenticates with Authorization: Bearer <mcp_token>. Generate the token at Dashboard → MCP (it starts with lim_ and is shown once); the dashboard renders the same snippets below with your token filled in. The token is a secret — unlike the public form access_key — so keep it in the MCP config, never in app code.
Claude Code
claude mcp add --scope user --transport http splitforms \
"https://splitforms.com/api/mcp" --header "Authorization: Bearer YOUR_MCP_TOKEN"Restart Claude Code and run /mcp to confirm splitforms is connected.
Cursor
Save as ~/.cursor/mcp.json (or ./.cursor/mcp.json per project), then restart Cursor and check Settings → MCP.
{
"mcpServers": {
"splitforms": {
"url": "https://splitforms.com/api/mcp",
"headers": {
"Authorization": "Bearer YOUR_MCP_TOKEN"
}
}
}
}Windsurf
Save as ~/.codeium/windsurf/mcp_config.json. Note the key is serverUrl, not url.
{
"mcpServers": {
"splitforms": {
"serverUrl": "https://splitforms.com/api/mcp",
"headers": {
"Authorization": "Bearer YOUR_MCP_TOKEN"
}
}
}
}Claude Desktop
Claude Desktop's claude_desktop_config.json launches local stdio servers, so bridge to the HTTP endpoint with the community mcp-remote package. The dashboard does not ship a Claude Desktop tab yet; this is the standard pattern for any remote server that uses a bearer header.
{
"mcpServers": {
"splitforms": {
"command": "npx",
"args": [
"-y", "mcp-remote",
"https://splitforms.com/api/mcp",
"--header", "Authorization: Bearer ${SPLITFORMS_MCP_TOKEN}"
],
"env": { "SPLITFORMS_MCP_TOKEN": "YOUR_MCP_TOKEN" }
}
}
}Continue.dev is also documented in the dashboard. Any other client that supports streamable HTTP with custom headers works the same way. The endpoint is a single JSON-RPC 2.0 route: initialize, tools/list, tools/call, prompts/list, prompts/get, ping; batches of up to 25 requests are accepted.
Worked example: build_form → create_form → create_webhook → list_submissions
The whole flow is four tool calls, and the agent runs it from one prompt. Start with the bundled prompt (in Claude Code it is a slash command; in Cursor it appears in the prompt picker):
/mcp__splitforms__build_form
description: "quote request form for a landscaping company: name, email,
phone, service (lawn care / hardscaping / tree removal), project details"The prompt compiles to instructions telling the agent to call list_templates first and use generate_form if a template matches, otherwise create_form with the exact fields. A quote form with a select does not match a template, so the agent sends this tools/call:
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "create_form",
"arguments": {
"name": "Quote request",
"fields": [
{ "label": "Full name", "type": "text", "required": true },
{ "label": "Email", "type": "email", "required": true },
{ "label": "Phone", "type": "tel" },
{ "label": "Service", "type": "select",
"options": ["Lawn care", "Hardscaping", "Tree removal"], "required": true },
{ "label": "Project details", "type": "textarea", "required": true }
]
}
}
}name on each field is optional — the server derives full_name from "Full name" — and type defaults to text. The server inserts the form, then returns a text result the agent can paste straight into your project:
Created form "Quote request" with 5 fields — it's live in the splitforms.com dashboard.
access_key: 1f3c9e2a-…
WordPress shortcode (with the splitforms plugin):
[splitforms access_key="1f3c9e2a-…"]
Paste-anywhere HTML:
<form method="POST" action="https://splitforms.com/api/submit">
<input type="hidden" name="access_key" value="1f3c9e2a-…">
<input type="checkbox" name="botcheck" style="display:none" tabindex="-1">
<label for="full_name">Full name *</label>
<input id="full_name" type="text" name="full_name" required>
<label for="email">Email *</label>
<input id="email" type="email" name="email" required>
<label for="phone">Phone</label>
<input id="phone" type="tel" name="phone">
<label for="service">Service *</label>
<select id="service" name="service" required><option value="">Choose…</option><option>Lawn care</option><option>Hardscaping</option><option>Tree removal</option></select>
<label for="project_details">Project details *</label>
<textarea id="project_details" name="project_details" rows="4" required></textarea>
<button type="submit">Send</button>
</form>The botcheck checkbox is the honeypot the submit endpoint checks on every plan; the agent will usually adapt the markup to your stack (a fetch() handler in React or Next.js) while keeping the field names. Next, route submissions somewhere. create_webhook needs a public HTTPS URL and optionally a form_id from list_forms; Slack and Discord incoming-webhook URLs are auto-detected and formatted for those apps:
// create_webhook — scoped to the new form
{ "name": "create_webhook",
"arguments": { "url": "https://hooks.slack.com/services/T000/B000/xxxx",
"label": "Slack #leads", "form_id": "<id from list_forms>" } }
// → result
{ "ok": true,
"webhook": { "id": "wh_…", "label": "Slack #leads", "flavor": "slack",
"scope": { "type": "form", "form_id": "…" }, "is_active": true } }
// test_webhook
{ "name": "test_webhook", "arguments": { "id": "wh_…" } }
// → { "ok": true, "webhook_id": "wh_…", "status": 200 }Finally, after a real visitor submits, the agent (or the triage_inbox prompt) reads the inbox:
{ "name": "list_submissions", "arguments": { "limit": 5 } }
// → result
Showing 2 most recent submissions:
[
{
"id": "6b1e…",
"when": "2026-09-06T14:02:11.000Z",
"unread": true,
"data": { "full_name": "Dana R.", "email": "[email protected]",
"service": "Hardscaping", "project_details": "Patio, ~400 sq ft" },
"from": "https://example-landscaping.com/quote"
},
{ "id": "5a90…", "when": "2026-09-06T09:41:50.000Z", "unread": false, "data": { … }, "from": "Direct" }
]get_submission with one of those ids adds the IP, user agent, and spam flag. Webhook payload details — including the files[] array with signed download URLs — are on the form-to-webhook page and in the API reference.
FAQ
What is an MCP server for forms?
An MCP server for forms is a Model Context Protocol endpoint that exposes a form product's operations — create a form, read submissions, add a webhook — as typed tools an AI agent can call. Instead of pasting API docs into a chat, the agent reads the tool schemas and calls them directly. splitforms, Tally, Typeform, Jotform, Airtable, and Notion all publish first-party servers as of September 2026.
Which MCP server should I use if the agent writes my HTML?
splitforms. It is the only server in this list that returns a POST endpoint (https://splitforms.com/api/submit) plus an access_key for your own markup; the others return a hosted form or embed. The create_form tool hands back paste-anywhere HTML, and generate_form renders react, javascript, php, or curl variants.
Is the splitforms MCP server free?
Yes. The MCP server works on the Free plan — 500 submissions total, unlimited forms, no card. Pro is $5/month for 5,000 submissions a month and adds signed webhooks; Annual is $49/year for 15,000 a month. Nothing about connecting an agent requires upgrading.
Which MCP server for forms is free?
Tally's server is free on every Tally plan, and Jotform says its server carries no additional charge on top of a Jotform account. Airtable includes MCP with the existing plan. Community Google Forms servers are free to run but unofficial. splitforms MCP is included on every plan, including Free.
Can Claude Code or Cursor create a contact form through MCP?
Yes. With the splitforms server connected, the build_form prompt walks the agent through list_templates or create_form, and add_form_to_site has it detect your framework and insert a form that POSTs to https://splitforms.com/api/submit with the access_key and a botcheck honeypot. Tally, Typeform, and Jotform servers can also create forms, but the result lives on their hosted pages.
Does Formspree have an MCP server?
Not that we could find as of September 2026. Formspree publishes agent instructions at formspree.io/ai that a coding agent fetches and follows, which is a different mechanism from MCP. If your agent needs typed form tools, use one of the servers above.
What can't an agent do through the splitforms MCP server?
Delete forms or submissions, change notification recipient addresses, or touch billing. Those stay in the dashboard on purpose. Webhook signing secrets are never returned to the agent either — test_webhook verifies delivery without exposing them.
When should I not use splitforms for agent-built forms?
When you need a visual drag-and-drop builder, conditional logic between questions, payments inside the form, or a hosted form page you never embed. Tally, Typeform, and Jotform cover those. splitforms is for forms whose markup you (or your agent) own.
Next steps
Have the agent add the form to a specific stack: Next.js, React, or Astro. Site built by an AI tool with a form that does nothing on submit? Read how to add a contact form to a site built with Claude, Cursor, Lovable, v0, or Bolt. Per-tool walkthroughs: Claude Code, Cursor. Not on an MCP host? The ChatGPT form backend and AI form generator cover the same endpoint without a protocol, and the contact form API page documents the POST itself.