Create and wire up contact forms from your coding agent. Forms, snippets, and submissions.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer fpat_ token minted in the Formpaste dashboard under Settings -> API & MCP.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Create a Formpaste form and return its access key + a wired snippet. Triggers destination verification for a new address (the owner completes it in the dashboard); an already-verified destination delivers immediately. Errors with: unauthorized, upgrade_required.
A human-readable name for the form, e.g. "Contact form".
Where submissions are emailed. Must be verified before delivery starts.
Target framework for the returned snippet. Defaults to html.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Create a Formpaste form and return its access key + a wired snippet. Triggers destination verification for a new address (the owner completes it in the dashboard); an already-verified destination delivers immediately. Errors with: unauthorized, upgrade_required.
| Argument | Type | Description |
|---|---|---|
| name* | string | A human-readable name for the form, e.g. "Contact form". |
| framework | string | Target framework for the returned snippet. Defaults to html. |
| destinationEmail* | string | Where submissions are emailed. Must be verified before delivery starts. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"destinationEmail"
],
"properties": {
"name": {
"type": "string",
"description": "A human-readable name for the form, e.g. \"Contact form\"."
},
"framework": {
"enum": [
"html",
"react",
"nextjs",
"astro",
"vue",
"svelte"
],
"type": "string",
"description": "Target framework for the returned snippet. Defaults to html."
},
"destinationEmail": {
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "Where submissions are emailed. Must be verified before delivery starts."
}
}
}Read one of your forms to verify it is wired correctly: returns its access_key, destination_email, destination_verified (whether submissions will be emailed yet), allowed_domains, and notification/autoresponder/webhook config. Never returns the webhook signing secret. Errors with: unauthorized, not_found.
| Argument | Type | Description |
|---|---|---|
| formId* | string | A form id from create_form or list_forms, e.g. frm_... |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"formId"
],
"properties": {
"formId": {
"type": "string",
"description": "A form id from create_form or list_forms, e.g. frm_..."
}
}
}Return a copy-paste form snippet for a framework (html, react, nextjs, astro, vue, svelte). Pass formId to fill in a real access key; otherwise a placeholder is used. Errors with: unauthorized, invalid_framework.
| Argument | Type | Description |
|---|---|---|
| formId | string | An owned form id to fill in the real access key; omit for a placeholder. |
| framework* | string | Target framework for the snippet. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"framework"
],
"properties": {
"formId": {
"type": "string",
"description": "An owned form id to fill in the real access key; omit for a placeholder."
},
"framework": {
"enum": [
"html",
"react",
"nextjs",
"astro",
"vue",
"svelte"
],
"type": "string",
"description": "Target framework for the snippet."
}
}
}List all forms on your account, each with its id, name, access_key, and inbox/spam counts. Use this to discover form ids or confirm a form you just created exists. Errors with: unauthorized.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}List submissions for one of your forms. Returns counts + per-submission metadata by default; set includeContent to include message bodies (third-party PII). Errors with: unauthorized, not_found, forbidden. Requires a full-access token.
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of submissions to return. |
| folder | string | Which folder to list. Defaults to inbox. |
| formId* | string | A form id from create_form or list_forms, e.g. frm_... |
| includeContent | boolean | Include full submission message bodies (third-party PII). Defaults to false. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"formId"
],
"properties": {
"limit": {
"type": "number",
"description": "Maximum number of submissions to return."
},
"folder": {
"enum": [
"inbox",
"spam"
],
"type": "string",
"description": "Which folder to list. Defaults to inbox."
},
"formId": {
"type": "string",
"description": "A form id from create_form or list_forms, e.g. frm_..."
},
"includeContent": {
"type": "boolean",
"description": "Include full submission message bodies (third-party PII). Defaults to false."
}
}
}Store a TEST submission so you can prove a form is live and receiving. Stored only: it appears in the owner's Inbox with a Test badge but sends NO email, runs NO spam scoring, and never counts toward quota. Optionally pass sample fields; omit to use a default payload. Capped at the 5 newest test rows per form. Errors with: unauthorized, not_found, invalid_input, too_many_fields, field_too_large.
| Argument | Type | Description |
|---|---|---|
| fields | object | Optional sample form fields as a flat string map, e.g. { name, email, message }. Omit to use a default test payload. |
| formId* | string | A form id from create_form or list_forms, e.g. frm_... |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"formId"
],
"properties": {
"fields": {
"type": "object",
"description": "Optional sample form fields as a flat string map, e.g. { name, email, message }. Omit to use a default test payload.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"formId": {
"type": "string",
"description": "A form id from create_form or list_forms, e.g. frm_..."
}
}
}