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
{
"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.
GET https://api.furrowforms.com/api/registerreturns the machine-readable flow. - 2.
POST /api/registerwithemail,name, and optionalteam_name. - 3.A 6-digit code lands in the user's email — the agent asks them for it.
- 4.
POST /api/register/verifywithemailandcodereturns thefrw_token — shown exactly once. - 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.
{
"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.
| Provisioning [ one call ] | |
|---|---|
| bootstrap_site | Client + website + every form in one idempotent call — the preferred way to set up a site |
| Clients [ crud ] | |
| create_client | Add a company to the roster |
| get_client | Read one client |
| list_clients | The whole roster |
| update_client | Rename, edit details |
| archive_client | Offboard without losing history |
| Projects (websites) [ the cascade ] | |
| create_project | A website under a client — owns Turnstile keys, domains, recipients, limits |
| get_project | Read one project and its settings |
| list_projects | All websites, per client or roster-wide |
| update_project | Change settings once — every form inherits |
| upsert_project_webhook | Set or rotate the signed webhook + secret |
| archive_project | Retire a site cleanly |
| Forms [ crud ] | |
| create_form | A form under a project — inherits everything, overrides opt-in |
| get_form | Read one form, its field contract and overrides |
| list_forms | Every form on a site |
| update_form | Adjust fields or overrides |
| archive_form | Retire a form, keep its submissions |
| Submissions [ operations ] | |
| list_submissions | Read the inbox: filter by project, form, spam status, date — cursor-paginated |
| get_submission | One submission, full payload |
| Snippets & delivery [ verify ] | |
| get_snippet | Generated frontend code for HTML, Astro, or Next.js — honeypot, timing field, and Turnstile included |
| test_webhook | Fire a signed test delivery and confirm 200 OK |
| Account & teams [ admin ] | |
| get_account | Who am I, what plan, what limits |
| update_account | Profile and preferences |
| list_teams | Workspaces under this login |
| update_team | Rename, adjust a workspace |
| Billing [ stripe ] | |
| create_upgrade_link | Returns 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.