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_..." }
    }
  }
}

OAuth works too — leave the header off and the client will open a sign-in. Tokens are minted in the dashboard (Settings → Tokens; the secret is shown exactly once) — or by the agent itself (see cold-start below).

Stdio, for clients that need it

@furrowforms/mcp bridges stdio to the hosted server — same 26 tools, one command. Claude Desktop, older Cursor builds, Zed, and Codex CLI use this path.

claude mcp add
[ stdio ]
claude mcp add furrow-forms -e FURROW_TOKEN=frw_... -- npx -y @furrowforms/mcp
mcp.json · claude_desktop_config.json
[ stdio ]
{
  "mcpServers": {
    "furrow-forms": {
      "command": "npx",
      "args": ["-y", "@furrowforms/mcp"],
      "env": { "FURROW_TOKEN": "frw_..." }
    }
  }
}

Also listed in the official MCP Registry as com.furrowforms/furrow-forms, and available as a one-click Claude Desktop extension. Source, examples for 33 stacks, and the agent skill live at github.com/useburrow/furrow-forms.

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.