@innerkore/formproxy-mcp
v1.0.4
Published
MCP skill for FormProxy — lets AI agents create and manage form endpoints natively
Readme
FormProxy MCP
An MCP (Model Context Protocol) server that lets Claude, Cursor, Windsurf, and any MCP-compatible AI create and manage FormProxy form endpoints natively during code generation.
What it does
Whenever an AI generates an HTML page with a <form> element, it can call create_form to get a real backend endpoint URL and wire it directly into the HTML — no placeholder action="#" needed.
<!-- Without FormProxy MCP -->
<form method="POST" action="#"> <!-- broken — goes nowhere -->
<!-- With FormProxy MCP -->
<form method="POST" action="https://api.formproxy.com/f/xK9mP2qRt"> <!-- real, working backend -->Installation
Claude Code / Cursor / Windsurf
Add to your MCP config (e.g. ~/.claude/settings.json or .cursor/mcp.json):
{
"mcpServers": {
"formproxy": {
"command": "npx",
"args": ["@innerkore/formproxy-mcp"],
"env": {
"FORMPROXY_API_KEY": "fp_live_your_key_here"
}
}
}
}Get your API key at app.formproxy.com/settings → API Keys tab.
Note: API keys start with
fp_live_. The server won't authenticate without this prefix.
Environment variables
| Variable | Required | Default | Description |
|---|---|---|---|
| FORMPROXY_API_KEY | Yes | — | Your fp_live_* API key |
| FORMPROXY_API_URL | No | https://api.formproxy.com | Override for self-hosted or staging |
Tools
create_form
Creates a new form and returns its endpoint URL and an embed snippet.
create_form({
name: "Early Access Signup",
fields: [
{ name: "email", type: "email", required: true, label: "Work email" },
{ name: "company", type: "text", label: "Company" }
],
settings: {
notify_email: "[email protected]",
success_title: "You're on the list!",
success_description: "We'll be in touch soon."
}
})Response:
{
"form_uid": "xK9mP2qRt",
"endpoint_url": "https://api.formproxy.com/f/xK9mP2qRt",
"embed_snippet": "<form method=\"POST\" action=\"https://api.formproxy.com/f/xK9mP2qRt\">..."
}Field types: text, email, phone/tel, number, date, url, file, textarea, checkbox, hidden
Settings:
| Key | Description |
|---|---|
| notify_email | Email address to notify on each new submission |
| redirect_url | URL to redirect to after submission (use ?format=redirect on the form) |
| honeypot_field | Field name for spam honeypot (bots fill it, humans don't) |
| success_title | Title shown on the HTML success page (?format=html) |
| success_description | Body text shown on the HTML success page |
| success_icon | Icon for success page: check-circle-2, heart, sparkles, rocket, etc. |
get_form
Retrieves full details for an existing form by UID.
get_form({ uid: "xK9mP2qRt" })list_forms
Lists all forms in the workspace.
list_forms({ limit: 20, offset: 0 })Returns { items, total, limit, offset } — use offset to paginate.
get_submissions
Fetches raw submission data for a form.
get_submissions({
form_uid: "xK9mP2qRt",
limit: 50,
status: "unread", // "unread" | "read" | "starred" | "spam"
cursor: "..." // from next_cursor in a previous response
})Returns { items, next_cursor, columns }. Each item has id, data, status, created_at, file_keys.
summarize_submissions
Fetches up to 200 submissions and aggregates them locally — no external AI call.
summarize_submissions({
form_uid: "xK9mP2qRt",
period: "this_week" // "today" | "this_week" | "this_month" | "all"
})Returns total count, status breakdown (read/unread/starred), top field-value frequencies, date range, and starred entries.
add_integration
Attaches an integration to an existing form.
add_integration({
form_uid: "xK9mP2qRt",
type: "slack",
config: { webhook_url: "https://hooks.slack.com/services/..." }
})Integration types and required config:
| Type | Required config keys |
|---|---|
| webhook | url; optional: secret |
| slack | webhook_url |
| smtp | to; optional: subject |
| google_sheets | spreadsheet_id; optional: sheet_name |
| zapier | webhook_url |
| airtable | base_id, table_name, api_key |
generate_form_html
Generates styled HTML markup for a form without making an API call. Use after create_form.
generate_form_html({
form_uid: "xK9mP2qRt",
style: "tailwind", // "plain" | "tailwind" | "minimal"
fields: [
{ name: "email", type: "email", required: true, label: "Email" },
{ name: "message", type: "textarea", label: "Message" }
],
submit_label: "Send message",
redirect_url: "https://example.com/thanks"
})| Style | Description |
|---|---|
| plain | Inline CSS styles, no dependencies |
| tailwind | Tailwind CSS utility classes |
| minimal | Bare HTML, no styles |
Resources
The server also exposes two MCP resources:
formproxy://workspace/current/forms— all forms in the workspace as JSONformproxy://form/{uid}/schema— full schema + endpoint URL for a specific form
Submission endpoint
The submission endpoint that HTML forms post to is:
POST https://api.formproxy.com/f/{uid}Supported content types:
application/x-www-form-urlencoded(standard HTML form)multipart/form-data(file uploads)application/json
Query parameters:
?format=json(default) — returns{ ok: true, id: "..." }?format=html— returns a branded success page?format=redirect— redirects to the form'sredirect_urlsetting
Development
# Install dependencies
npm install
# Build
npm run build
# Watch mode
npm run dev
# Run built server
npm startThe server communicates over stdio (standard MCP transport). It has no HTTP port.
License
MIT — © Innerkore Technologies Private Limited
