Furrow Forms

MCP server

The entire product is operable through MCP — 26 tools covering the full lifecycle, from registering the account to reading the submissions that come in, and even generating a Stripe checkout link. MCP and REST share the same domain logic, so there's no drift between what agents and humans can do.

Connect

mcp config
[ streamable http ]
{
  "mcpServers": {
    "furrow-forms": {
      "url": "https://api.furrowforms.com/mcp",
      "headers": { "Authorization": "Bearer frw_..." }
    }
  }
}

Local stdio is also supported. Tokens are minted in the dashboard (Settings → Tokens; the secret is shown exactly once) — or by the agent itself:

Cold-start: no token, no dashboard

  1. 1.GET https://api.furrowforms.com/api/register returns the machine-readable flow.
  2. 2.POST /api/register with email,name, and optional team_name.
  3. 3.A 6-digit code lands in the user's email — the agent asks them for it.
  4. 4.POST /api/register/verify with email and code returns the frw_ token — shown exactly once.
  5. 5.Connect MCP and call bootstrap_site.

bootstrap_site

One call creates the client, the project (domains, Turnstile keys, notification emails, webhook), and all forms. Idempotent by slug — safe to re-run, retries never duplicate.

bootstrap_site · arguments
[ idempotent ]
{
  "client": { "name": "Acme Roofing" },
  "project": {
    "domain": "acmeroofing.com",
    "turnstile": { "site_key": "0x4AAA…", "secret": "•••" },
    "notify": ["leads@acmeroofing.com"],
    "webhook": { "url": "https://crm.example.com/hooks/furrow" }
  },
  "forms": [
    { "slug": "contact", "fields": ["name", "email", "message"] },
    { "slug": "quote",   "fields": ["name", "email", "sqft", "zip"] }
  ]
}

Not just setup — operations

Most agent surfaces in this category stop at creating a form. Furrow's control plane keeps going: an agent can read the submissions coming in — filter by project, form, or spam status — and act on them: triage this week's leads, draft replies, pipe a payload into another system, or check whether the campaign form actually converted. Setup is day one; list_submissions is every day after.

All 26 tools

Built-in MCP resources document the preferred workflow and reserved fields so agents self-orient. Every create is idempotent by slug.

All 26 Furrow Forms MCP tools, grouped
Provisioning [ one call ]
bootstrap_siteClient + website + every form in one idempotent call — the preferred way to set up a site
Clients [ crud ]
create_clientAdd a company to the roster
get_clientRead one client
list_clientsThe whole roster
update_clientRename, edit details
archive_clientOffboard without losing history
Projects (websites) [ the cascade ]
create_projectA website under a client — owns Turnstile keys, domains, recipients, limits
get_projectRead one project and its settings
list_projectsAll websites, per client or roster-wide
update_projectChange settings once — every form inherits
upsert_project_webhookSet or rotate the signed webhook + secret
archive_projectRetire a site cleanly
Forms [ crud ]
create_formA form under a project — inherits everything, overrides opt-in
get_formRead one form, its field contract and overrides
list_formsEvery form on a site
update_formAdjust fields or overrides
archive_formRetire a form, keep its submissions
Submissions [ operations ]
list_submissionsRead the inbox: filter by project, form, spam status, date — cursor-paginated
get_submissionOne submission, full payload
Snippets & delivery [ verify ]
get_snippetGenerated frontend code for HTML, Astro, or Next.js — honeypot, timing field, and Turnstile included
test_webhookFire a signed test delivery and confirm 200 OK
Account & teams [ admin ]
get_accountWho am I, what plan, what limits
update_accountProfile and preferences
list_teamsWorkspaces under this login
update_teamRename, adjust a workspace
Billing [ stripe ]
create_upgrade_linkReturns a Stripe Checkout URL for the yearly plan (or the Customer Portal if already subscribed) to hand to the human

Agents can also just fetch furrowforms.com/ai — it serves these instructions as markdown to any agent user-agent.