Build and manage web forms through conversation. Describe a form to Claude, get a live shareable link, read submissions back β all without leaving your AI chat.
Add MCP Forms to Claude.ai as a custom connector (no install needed):
https://mcp-forms-production-cdf7.up.railway.app/mcp
Settings β Connectors β Add custom connector β paste the URL above. Works in Claude.ai, ChatGPT, Cursor, Windsurf, and any MCP-compatible client.
Create forms from plain English:
Create a job application form. Ask for full name, email, and experience level
(Junior / Mid / Senior). If they select Senior, show a field asking about
their leadership experience.
Supported field types: text, email, number, textarea, dropdown (select), radio buttons, checkboxes, and date. Describe what you need in plain English β Claude picks the right type automatically.
Fill it out β conditional logic included:
Read submissions and export:
Create a contact form with name, email, and a message field
Create a feedback form using the dark theme, notify me at you@example.com on every submission
Every form has a light/dark toggle button built in β respondents can switch at any time, and you can set the default theme when creating the form.
Create a support ticket form β if they select Billing, show an account number field
Add a phone number field to the form above
List my forms
Show me submissions for form abc12345
Export submissions for form abc12345 as CSV
| Tool | What it does |
|---|---|
create_form |
Generates a form from plain English, returns a shareable URL |
publish_form |
Makes a draft form live |
unpublish_form |
Reverts a live form back to draft |
list_forms |
Lists all forms with status and submission count |
get_form |
Returns full schema, fields, conditional rules |
get_submissions |
Returns all submissions for a form |
export_submissions_csv |
Exports submissions as CSV |
update_form |
Edits an existing form β fields, labels, theme, webhook, email, redirect |
get_embed_code |
Returns an iframe snippet to embed the form on any page |
delete_form |
Deletes a form and all its submissions (asks for confirmation) |
| Parameter | Required | Description |
|---|---|---|
description |
β | Plain English description of the form |
webhook_url |
β | POST submissions as JSON to this URL (Slack, Zapier, n8n, Make, etc.) |
notify_email |
β | Email this address on every submission |
theme |
β | form (default, light) or dark β respondents can toggle either way |
success_url |
β | Redirect respondents here after submitting |
show_progress_bar |
β | Show a progress bar on multi-section forms (default: true) |
Claude Desktop / Claude.ai / Cursor / any MCP client
β
β MCP (stdio or streamable-http)
βΌ
Python MCP Server (server.py)
β
β HTTP
βΌ
ASP.NET 9 API (hosted on Railway)
β
βββ Calls Anthropic API to generate JSON form schema
βββ Stores forms + submissions in SQLite
βββ Renders forms as HTML at /forms/{id}/view
MCP Forms formats submissions natively for Slack β just paste your Slack webhook URL and submissions appear as readable messages in any channel. No Zapier needed.
Create a contact form with name, email, and message.
Send submissions to Slack at https://hooks.slack.com/services/YOUR/WEBHOOK/URL
What it looks like in Slack:
New submission: Contact Form
β’ name: Jane Smith
β’ email: jane@example.com
β’ message: Interested in your services!
_Submitted at 2026-01-15T10:32:00Z_
Use a Zapier or Make webhook as the webhook_url. Both can receive the JSON payload and push rows into a Google Sheet with no code.
Payload shape:
{
"formId": "abc12345",
"formTitle": "Contact Form",
"submittedAt": "2026-01-15T10:32:00Z",
"data": {
"name": "Jane Smith",
"email": "jane@example.com",
"message": "Interested in your services!"
}
}Create api/McpForms.Api/appsettings.json (never commit this β it's in .gitignore):
{
"ConnectionStrings": {
"Default": "Data Source=mcpforms.db"
},
"Anthropic": {
"ApiKey": "sk-ant-..."
},
"BaseUrl": "http://localhost:5000",
"McpApiKey": "your-secret-key-here",
"ResendApiKey": "re_...",
"ResendFromEmail": "onboarding@resend.dev",
"Urls": "http://localhost:5000"
}| Key | Description |
|---|---|
Anthropic.ApiKey |
Your Anthropic API key β used to generate form schemas |
McpApiKey |
A secret you choose; the MCP server sends this on every request |
ResendApiKey |
From resend.com (free tier: 100 emails/day) |
ResendFromEmail |
Use onboarding@resend.dev for local testing |
cd api/McpForms.Api
dotnet restore
dotnet run
# Runs at http://localhost:5000Requires uv:
cd mcp-server
uv syncAdd to your Claude Desktop config (%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json):
{
"mcpServers": {
"mcp-forms": {
"command": "uv",
"args": ["--directory", "C:\\full\\path\\to\\mcp-forms\\mcp-server", "run", "server.py"],
"env": {
"MCP_API_BASE": "http://localhost:5000",
"MCP_API_KEY": "your-secret-key-here"
}
}
}
}| Variable | Value |
|---|---|
Anthropic__ApiKey |
Your Anthropic API key |
McpApiKey |
Your chosen API secret |
BaseUrl |
https://your-app.up.railway.app |
ResendApiKey |
Your Resend API key |
ResendFromEmail |
A verified sender on your Resend account |
ConnectionStrings__Default |
Data Source=/data/mcpforms.db |
ASPNETCORE_ENVIRONMENT |
Production |
mcp-forms/
βββ mcp-server/
β βββ server.py # MCP tools β what Claude sees
βββ api/
βββ McpForms.Api/
βββ Program.cs # Service wiring
βββ Modules/
β βββ FormsModule.cs # MCP-facing endpoints (API key protected)
β βββ PublicModule.cs # Form view + submit (public)
βββ FormSchemaGenerator.cs # Calls Claude to generate JSON schema
βββ FormRenderer.cs # Renders schema as HTML via Scriban
βββ SubmissionValidator.cs # Server-side validation mirroring schema rules
βββ Templates/
β βββ form.html # Single template β light/dark via Tailwind toggle
βββ appsettings.json # Config (never commit)
- Notion β submissions land directly in a Notion database
- More themes β minimal, branded
- Regex validation β custom error messages per field


