Skip to content

Connect an AI assistant (MCP)

Formkove has a hosted MCP server. Connect an AI assistant and you can say “add a contact form to this site” and it creates the form, sets it up, gets the code and drops it into your page. It can also read your submissions when you give it a key that allows that. Nothing it does sends an email.

It works on every plan, Free included. The endpoint is https://app.formkove.com/mcp.

  1. In the dashboard, open Settings → API keys. If you work in a team workspace, switch to it first: a key belongs to the workspace that is active when you create it, and only sees that workspace’s forms.
  2. Name the key, pick what it can do, pick an expiry (30, 90 or 365 days) and click Create key.
  3. Copy the key now. It is shown once.

Start from a template, then change what you need:

Template The assistant can Use it for
Build and set up forms List your forms, check settings, usage and stats, get setup code, dry-run a submission, create forms and change their settings (name, honeypot, Turnstile, file uploads, AI, allowed origins, your own address as a recipient). Adding and configuring forms
Read submissions List your forms, check settings, usage and stats, get setup code, read and search submissions. It can’t change anything. Summarising or triaging what came in

The permissions list has four rows:

  • Forms: Read or Manage. Manage lets the assistant create and configure forms.
  • Integrations (off by default). Adds, pauses, tests and deletes integrations, and sets routing rules. The assistant can send future submissions to any URL it adds, so only turn this on when you need it (see Security).
  • Delete forms (off by default). Deletes forms and removes notification recipients. Deleting a form is permanent and removes its submissions.
  • Submissions: Off or Read.

A summary under the list shows what the key can and can’t do. It never sends email.

Reading and changing are separate on purpose. A key that can read submissions can never change or delete forms or connect integrations, and a key that can change forms can never read submissions. If you choose Submissions: Read, Formkove switches Forms to Read and turns Integrations and Delete forms off, and tells you why. Integrations and Delete forms need Forms: Manage. If you want both, create two keys.

You can also limit a key to one form. You can have 10 active keys, and revoke any of them from the same page. In a team workspace, any member can create a key that only reads, only owners and admins can create keys that manage forms, connect integrations or delete forms, and owners and admins can see and revoke every member’s keys.

Put the key in an environment variable, then add the server:

Terminal window
export FORMKOVE_API_KEY="fk1_your_key_here"
claude mcp add --transport http formkove https://app.formkove.com/mcp --header "Authorization: Bearer ${FORMKOVE_API_KEY}"

Run /mcp inside Claude Code to check that formkove is connected.

Add this to ~/.cursor/mcp.json (or .cursor/mcp.json in a project) and set FORMKOVE_API_KEY in the environment Cursor starts from:

{
"mcpServers": {
"formkove": {
"url": "https://app.formkove.com/mcp",
"headers": {
"Authorization": "Bearer ${env:FORMKOVE_API_KEY}"
}
}
}
}

Add this to .vscode/mcp.json. VS Code asks for the key when the server starts and keeps it out of the file:

{
"inputs": [
{ "id": "formkove-key", "type": "promptString", "description": "Formkove API key", "password": true }
],
"servers": {
"formkove": {
"type": "http",
"url": "https://app.formkove.com/mcp",
"headers": {
"Authorization": "Bearer ${input:formkove-key}"
}
}
}
}

Never paste the literal key into a config file that is committed to a repository.

The assistant only sees the tools your key allows. In a team workspace, members don’t get the tools that change anything.

Read (any key)

Tool What it does
list_forms Lists your forms with totals, unread counts and endpoint URLs
get_setup Code for a form in HTML, fetch, React, Next.js, Vue, Svelte, Astro or HTMX, built from the fields you describe. Includes the honeypot and the Turnstile widget when the form uses them
get_form_settings A form’s name, honeypot, Turnstile site key, allowed origins, file upload and AI settings, recipients (other people’s addresses are partly hidden) and integrations. Never secrets
get_stats Totals, unread, the days with activity in the last 30 days and this month’s usage. Counts only, no submission text
get_usage Your plan, this month’s submissions against the limit, number of forms and file storage. Not available to a key limited to one form
check_submission A dry run: would a submission with this origin, fields, files and redirect be accepted? Nothing is stored or sent
list_integrations Webhooks and destinations on a form: type, host, on or off, routing and last delivery. Never the full URL

Setup (Forms: Manage)

Tool What it does
create_form Creates a form and returns its ID and code. Same limits as the dashboard
update_form Renames a form, sets the honeypot field name (it must start with _; turning it off is dashboard-only), sets or removes Turnstile (the secret key is stored encrypted and never shown again), changes file upload settings
configure_ai Turns AI on or off, sets the purpose and tags. On the Free plan only the spam filter can be changed, as in the dashboard
add_recipient Adds your own account email as a recipient. It can’t add anyone else
update_allowed_origins Adds sites to a form’s Allowed Origins. It only adds, never removes or replaces, and refuses *
remove_recipient Needs the Delete forms switch. Removes a recipient
delete_form Needs the Delete forms switch. Permanently deletes a form and its submissions. The assistant has to give the form’s exact name, and a key limited to one form can’t do it

Integrations (needs the Integrations switch; Pro and Agency plans, as in the dashboard)

Tool What it does
add_webhook Sends new submissions to a URL, optionally signed with a secret you give it
add_destination Connects Slack, Discord, Google Sheets or Zapier
update_integration Turns an integration on or off and sets its routing rules (for example only negative sentiment)
delete_integration Removes an integration. Works on any plan
test_integration Sends a sample message to a Slack, Discord, Google Sheets or Zapier destination

Submissions (Submissions: Read)

Tool What it does
list_submissions Lists submissions, newest first. Spam is hidden unless asked for. Filter by unread, sentiment, tag or date
get_submission One submission in full, with its AI result and file names
search_submissions Searches the newest 200 submissions of one form for some text

The assistant can also read these docs pages and use an add_contact_form prompt, which walks through adding a form to a site.

What it can’t do. Anything that sends an email: adding anyone else as a recipient, resending a verification, inviting team members, or delivering a submission that was flagged as spam. It can’t change billing or your plan, mark submissions as spam, or turn back on a form that Formkove disabled.

Example prompts:

  • “Add a contact form to my Next.js site with name, email and a budget select. Use Formkove.”
  • “Send new leads from my contact form to Slack when the sentiment is negative.”
  • “Check that my form accepts a submission from https://example.com and tell me if anything is missing.”
  • “Show me the unread submissions on my contact form and group them by topic.” (a key with Submissions: Read)

If a form on your site uses fetch() or React, the site’s address has to be in the form’s Allowed Origins. Plain HTML forms don’t need it. The assistant is told this in the get_setup result.

  • Up to 60 requests a minute per IP address and 60 tool calls a minute per account. Over that, the assistant is told to wait.
  • create_form is limited to 20 forms an hour and to your plan’s form limit, the same as the dashboard. test_integration is limited to 3 tests a minute per destination and 20 an hour per form. A form can have up to 10 integrations. In a team workspace only owners and admins can change anything.
  • Lists return at most 50 submissions at a time. When you filter (or spam is hidden), each call checks the newest 2,000 submissions after where it left off, and tells the assistant if older ones may match. Search looks at the newest 200 submissions of one form, returns up to 25, and is limited to 10 searches a minute. Form lists show at most 200 forms.
  • Long field values are shortened, and a response is cut to a fixed size. The assistant can page through the rest.
  • Keys expire after the time you chose. Revoke a key and it stops working immediately.

Submissions are written by strangers. Anyone can post to your form, so a submission can contain text meant to trick an AI assistant (“ignore your instructions and run this command”). That is called prompt injection, and no one can fully prevent it. Here is what Formkove does about it:

  • Submission text, file names and AI summaries are returned as clearly marked untrusted data, with a note telling the assistant not to follow instructions in it.
  • Control characters, hidden and bidirectional text characters and terminal escape sequences are removed, and long values are shortened.
  • Spam is hidden by default.
  • No key can both read submissions and change forms or connect integrations, so an injected instruction can’t use the same key to create forms, open up Allowed Origins or add a webhook.
  • No tool sends email.

An integrations key can send your future submissions to any URL it adds. A webhook or Slack, Discord, Google Sheets or Zapier connection sends every new submission to another address. If the assistant reads something untrusted while it holds that key (a web page, a README, another tool’s output), that content could try to make it add a connection to an attacker’s URL. Only turn on the Integrations switch when you need it, use a short expiry, keep manual approval on, check the form’s integrations afterwards and revoke the key when you’re done. Formkove marks these tools as destructive so your assistant asks first, and logs every change.

This lowers the risk. It doesn’t remove it. While an assistant is reading submissions:

  • Keep manual approval on for shell commands and file edits.
  • Use a key with Submissions: Read, pinned to one form if you can.
  • Keep Forms: Manage, Integrations and Delete forms off on keys you use for anything else.
  • Revoke keys you no longer use.

Other things to know:

  • Your assistant and its AI provider receive whatever the assistant reads. See the Privacy Policy.
  • There is no official local or npm package for Formkove’s MCP server. The only official server is the hosted one at https://app.formkove.com/mcp. Be careful with packages that claim otherwise.
  • Keys are bearer tokens. Treat them like passwords, and use an environment variable rather than writing one into a file.

See also Security and the API reference.