A TypeScript implementation of a simple MCP server that exposes datetime information to agentic systems and chat REPLs
Formfurrow is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Run a form backend end to end: teams, clients, projects, forms, submissions, snippets, webhooks.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user formfurrow-mcp '--' npx -y @reneturcios/formfurrow mcp
# 2 — ask your agent for something these tools do
# list_teams, update_team, get_account and 22 more
Formfurrow costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. This one runs on your machine: your client starts Formfurrow as a process under your own user, with your files and your network, so the tool surface below is what it can do to your computer rather than to a server somewhere else. Its scan result is on the Security tab — read the surface before you approve it.
This is a public server: you run it yourself and this marketplace is not in the path. You need Node.js — the current LTS (24) is the safe choice; npx comes with it. Claude Code registers it in one command; --scope user makes it available in every project. The '--' is in quotes so that PowerShell passes it on.
claude mcp add --scope user formfurrow-mcp '--' npx -y @reneturcios/formfurrow mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry your client uses to start the process locally. A local server runs with your file system and your network, which is why it is priced without metering.
25 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Read from its source code. A server that builds its tool list when it starts can list more tools than this.
Use to see workspaces this token can act on. A team-scoped frw_ token returns that team only. An operator token or an MCP OAuth login returns every team you belong to — pass team_id on list_clients, create_client, and bootstrap_site. Creating another workspace is dashboard-only after signing in…
No parameter schema on file.
Use to rename a team. Operator tokens (all workspaces) must pass team_id from list_teams. Team-scoped tokens may omit team_id and cannot target another workspace. Do not use this to create another workspace — that is dashboard-only and requires yearly. For plan, usage, retention, and branding,…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | New team (workspace) display name. |
| team_id | string | no | Team id from list_teams. Required for operator tokens and OAuth logins; team-scoped frw_ tokens may omit it. |
Use to read the team's plan, usage this month, limits, expansion_packs, retention_days, branding, and AI spam filter (ai.typesafe_key_set, ai.notify_suspected_spam). The TypeSafe key itself is never returned. Plans are capacity, not a feature ladder. Free: one workspace, 100 clean…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| team_id | string | no | Team id from list_teams. Required for operator tokens and OAuth logins; team-scoped frw_ tokens may omit it. |
Use to rename the workspace, set branding, or configure the AI spam filter. Pass ai.typesafe_api_key to save this team's TypeSafe key (null clears it; the key is write-only). ai.notify_suspected_spam (default true) emails notify addresses with a Potential spam label when Jev flags a submission; no…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | no | New workspace display name. |
| branding | object | no | Account-wide branding for notification emails and hosted pages. |
| ai | object | no | AI spam filter. Off until this team saves its own TypeSafe key. One Jev call per heuristics-clean submission. |
| team_id | string | no | Team id from list_teams. Required for operator tokens and OAuth logins; team-scoped frw_ tokens may omit it. |
Use to browse clients (companies). Operator tokens (all workspaces) must pass team_id from list_teams. Team-scoped tokens may omit team_id and cannot target another workspace. Do not use to list websites — call list_projects with client_id. Archived clients are hidden unless status=all or archived.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Page size, max 100. |
| cursor | string | no | Opaque cursor from the previous page's next_cursor. |
| status | string | no | Filter by archive state. Defaults to active. |
| team_id | string | no | Team id from list_teams. Required for operator tokens and OAuth logins; team-scoped frw_ tokens may omit it. |
Use to inspect one client. Do not use to list that client's sites — call list_projects with client_id.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| client_id | string | yes | Client id from list_clients or create_client. |
Use to add a client (company) by slug. Idempotent on slug unless strict is true. Operator tokens (all workspaces) must pass team_id from list_teams. Team-scoped tokens may omit team_id and cannot target another workspace. Prefer bootstrap_site when also creating a website and forms. Do not put…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Client (company) display name. |
| slug | string | yes | Lowercase hyphenated identifier, unique per team. Used for idempotent re-runs. |
| strict | boolean | no | When true, fail if the slug already exists instead of returning the existing record. |
| team_id | string | no | Team id from list_teams. Required for operator tokens and OAuth logins; team-scoped frw_ tokens may omit it. |
Use to rename a client. Do not use this to change domains, Turnstile, or webhooks — call update_project.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | no | New client display name. |
| client_id | string | yes | Client id from list_clients or create_client. |
Use to archive a client. Do not use this as a hard delete. There is no unarchive tool in v1.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| client_id | string | yes | Client id from list_clients or create_client. |
Use to browse websites. Pass client_id to list one client's sites (team is inferred). Without client_id, Operator tokens (all workspaces) must pass team_id from list_teams. Team-scoped tokens may omit team_id and cannot target another workspace. Do not use to read one project's settings — call…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Page size, max 100. |
| cursor | string | no | Opaque cursor from the previous page's next_cursor. |
| status | string | no | Filter by archive state. Defaults to active. |
| client_id | string | no | Only projects under this client. |
| team_id | string | no | Team id from list_teams. Required for operator tokens and OAuth logins; team-scoped frw_ tokens may omit it. |
Use to inspect one website's settings, domains, webhook URL, email templates, upload policy, plan, usage this month, limits, retention_days, and branding. Returns stored values plus resolved.email. Secrets are never returned. Plans are capacity, not a feature ladder. Free: one workspace, 100 clean…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project (website) id from list_projects, create_project, or bootstrap_site. |
Use to list forms. Pass project_id for one website or client_id for one company (team is inferred). Otherwise Operator tokens (all workspaces) must pass team_id from list_teams. Team-scoped tokens may omit team_id and cannot target another workspace. Do not use to read resolved inheritance — call…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Page size, max 100. |
| cursor | string | no | Opaque cursor from the previous page's next_cursor. |
| status | string | no | Filter by archive state. Defaults to active. |
| project_id | string | no | Only forms in this project. |
| client_id | string | no | Only forms under this client's projects. |
| team_id | string | no | Team id from list_teams. Required for operator tokens and OAuth logins; team-scoped frw_ tokens may omit it. |
Use to read a form plus resolved and inherited settings, including resolved.email and resolved.uploads. files_url is the private inbox folder for this form under the project inbox (do not put it in a public snippet). Turnstile always inherits from the project (inherited.turnstile is true). Form…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| form_id | string | yes | Form id from list_forms, create_form, or bootstrap_site. |
Use to inspect recent posts. Available on free and yearly. Pass project_id or form_id to infer the team; omit both and Operator tokens (all workspaces) must pass team_id from list_teams. Team-scoped tokens may omit team_id and cannot target another workspace. Free teams prune submissions after 30…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Only submissions in this project. |
| form_id | string | no | Only submissions to this form. |
| spam | string | no | Which submissions to return. Defaults to clean. |
| since | string | no | ISO 8601 timestamp; only submissions created after this instant. |
| limit | integer | no | Page size, max 100. |
| cursor | string | no | Opaque cursor from the previous page's next_cursor. |
| team_id | string | no | Team id from list_teams. Required for operator tokens and OAuth logins; team-scoped frw_ tokens may omit it. |
Use to read one stored submission by id, including file metadata and files_url (the form inbox). Do not use this for live submit tests — POST to /s/:publicKey instead. Do not expect signed bucket URLs — download from the inbox.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| submission_id | string | yes | Submission id from list_submissions or a webhook payload. |
Use after the form exists to get copy-paste html, astro, or next code that posts to /s/:publicKey. Do not invent a submit URL — this tool returns it. Snippets are single-value inputs; write checkbox groups and multi-selects yourself. Checkbox groups, select multiple, and other multi-value HTML…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| form_id | string | yes | Form id from list_forms, create_form, or bootstrap_site. |
| framework | string | yes | Snippet flavor: html (plain form), astro (component), or next (React client component). |
Use to add one website under an existing client_id. Idempotent on slug unless strict is true. Free accounts are limited to 3 active (non-archived) projects; yearly is unlimited. If create_project returns plan_limit, call create_upgrade_link and hand the human the Stripe URL. Prefer bootstrap_site…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Project (website) display name. |
| slug | string | yes | Lowercase hyphenated identifier, unique per client. Used for idempotent re-runs. |
| allowed_domains | array | no | Hostnames allowed to post to this project's forms (example.com, www.example.com). Empty accepts any origin. |
| turnstile_site_key | no | Cloudflare Turnstile site key for the frontend widget. Null removes it. | |
| turnstile_secret | no | Cloudflare Turnstile secret used to verify tokens server-side. Null removes it. | |
| notify_emails | array | no | Addresses that receive each clean submission (max 10). Inherited by every form. |
| from_name | no | Legacy From display name. Prefer email.from_name. | |
| object | no | Notification email template for the project: subject, from_name, intro, footer_mode, include_meta. | |
| webhook_url | no | Public https endpoint that receives a signed JSON POST per clean submission. Null disables it. | |
| webhook_secret | no | HMAC-SHA256 secret for the X-Furrow-Signature header. Omit to have one generated and returned. | |
| honeypot_field | string | no | Name of the hidden honeypot input the snippet emits. Defaults to _gotcha. |
| require_turnstile | boolean | no | Reject submissions that lack a valid Turnstile token. |
| rate_limit_per_ip | integer | no | Max submissions per IP within rate_limit_window_s. |
| rate_limit_window_s | integer | no | Rate-limit window in seconds (max 86400). |
| default_redirect_url | no | Where classic HTML posts redirect after success. Null returns JSON/inline success instead. | |
| uploads_enabled | boolean | no | Accept multipart file fields on this project's forms. |
| upload_allowed_types | array | no | Allowed upload MIME types, e.g. application/pdf or image/*. |
| upload_max_files | integer | no | Max files per submission (up to 20). |
| upload_max_file_bytes | integer | no | Max bytes per file (up to 25 MB). |
| upload_max_total_bytes | integer | no | Max total upload bytes per submission (up to 50 MB). |
Use to patch website settings. Nested email sets notification templates: email.subject, email.from_name, email.intro, email.footer_mode (furrow | minimal | off), email.include_meta. Optional branding updates the team (mode furrow | off | agency on yearly only; ignored on free except furrow). Set…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | no | New project display name. |
| allowed_domains | array | no | Replace the allowed hostnames. Empty array accepts any origin. |
| turnstile_site_key | no | Cloudflare Turnstile site key for the frontend widget. Null removes it. | |
| turnstile_secret | no | Cloudflare Turnstile secret used to verify tokens server-side. Null removes it. | |
| notify_emails | array | no | Replace the notification recipients (max 10). |
| from_name | no | Legacy From display name. Prefer email.from_name. | |
| object | no | Notification email template for the project: subject, from_name, intro, footer_mode, include_meta. | |
| webhook_url | no | Public https endpoint that receives a signed JSON POST per clean submission. Null disables it. | |
| webhook_secret | no | HMAC-SHA256 secret for the X-Furrow-Signature header. Omit to have one generated and returned. | |
| honeypot_field | string | no | Name of the hidden honeypot input the snippet emits. Defaults to _gotcha. |
| require_turnstile | boolean | no | Reject submissions that lack a valid Turnstile token. |
| rate_limit_per_ip | integer | no | Max submissions per IP within rate_limit_window_s. |
| rate_limit_window_s | integer | no | Rate-limit window in seconds (max 86400). |
| default_redirect_url | no | Where classic HTML posts redirect after success. Null returns JSON/inline success instead. | |
| branding | object | no | Per-project branding override for notification emails and hosted pages. |
| uploads_enabled | boolean | no | Accept multipart file fields on this project's forms. |
| upload_allowed_types | array | no | Allowed upload MIME types, e.g. application/pdf or image/*. |
| upload_max_files | integer | no | Max files per submission (up to 20). |
| upload_max_file_bytes | integer | no | Max bytes per file (up to 25 MB). |
| upload_max_total_bytes | integer | no | Max total upload bytes per submission (up to 50 MB). |
Use when a project's private inbox URL may have leaked. Issues a new inbox key; every previously shared inbox link stops working immediately. get_project returns the new files_url.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project (website) id from list_projects, create_project, or bootstrap_site. |
Use to archive a website. Archived projects reject public submit. Do not use this as a hard delete. There is no unarchive tool in v1.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project (website) id from list_projects, create_project, or bootstrap_site. |
Use to add a form under an existing project_id. Idempotent on slug unless strict is true. Overrides are nullable; omit them to inherit project notify emails, webhook, redirect, require_turnstile, and email templates. Pass email.subject / email.intro to override notification copy for this form…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Form display name, e.g. Contact or Quote request. |
| slug | string | yes | Lowercase hyphenated identifier, unique per project. Used for idempotent re-runs. |
| notify_emails_override | no | Recipients for this form only. Null inherits the project's notify_emails. | |
| webhook_url_override | no | Webhook endpoint for this form only. Null inherits the project webhook. | |
| webhook_secret_override | no | HMAC secret for this form's webhook. Null inherits the project secret. | |
| redirect_url_override | no | Success redirect for this form only. Null inherits default_redirect_url. | |
| require_turnstile_override | no | Force Turnstile on or off for this form. Null inherits the project setting. | |
| object | no | Per-form subject and intro overrides for the notification email. | |
| field_contract | no | Declared fields (name, type, label, report). Drives get_snippet and the email layout. Null clears it. | |
| strict | boolean | no | When true, fail if the slug already exists instead of returning the existing record. |
| project_id | string | yes | Project (website) id from list_projects, create_project, or bootstrap_site. |
Use to patch form overrides. Pass null on an override to inherit again. Set email.subject or email.intro to override project notification copy for this form only; from_name, footer_mode, and include_meta stay on the project. Email templates support {{project.name}}, {{project.slug}},…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | no | New form display name. |
| notify_emails_override | no | Recipients for this form only. Null inherits the project's notify_emails. | |
| webhook_url_override | no | Webhook endpoint for this form only. Null inherits the project webhook. | |
| webhook_secret_override | no | HMAC secret for this form's webhook. Null inherits the project secret. | |
| redirect_url_override | no | Success redirect for this form only. Null inherits default_redirect_url. | |
| require_turnstile_override | no | Force Turnstile on or off for this form. Null inherits the project setting. | |
| object | no | Per-form subject and intro overrides for the notification email. | |
| field_contract | no | Declared fields (name, type, label, report). Drives get_snippet and the email layout. Null clears it. | |
| form_id | string | yes | Form id from list_forms, create_form, or bootstrap_site. |
Use to archive a form so public submit returns 404. Do not use this as a hard delete.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| form_id | string | yes | Form id from list_forms, create_form, or bootstrap_site. |
Use to set or replace the project webhook URL. Available on free and yearly. A signing secret is generated once if the project has none. Forms inherit this unless webhook_url_override is set. Do not use this for a one-off delivery — call test_webhook.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| webhook_url | yes | Public https endpoint that receives a signed JSON POST per clean submission. Null disables it. | |
| webhook_secret | no | HMAC-SHA256 secret for X-Furrow-Signature. Omit to have one generated and returned. | |
| project_id | string | yes | Project (website) id from list_projects, create_project, or bootstrap_site. |
Use to POST a signed webhook.test event to the project's webhook URL. Available on free and yearly. Do not use this to inspect past deliveries — that is REST GET /api/projects/:id/webhook-deliveries. Fails if no webhook URL and secret are set.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project (website) id from list_projects, create_project, or bootstrap_site. |
- Every tool, no call limit
- No card, and mcprush charges nothing for it
- Source published under MIT
- Runs on your machine — nothing of it reaches our gateway
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Formfurrow or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | minimal | capability blast radius (minimal) — client exposure if the model is manipulated | −0 |
| verification-discount | repo | publisher verification (public source) — no provenance, but the source is public and inspectable | −1 |
| coverage-honesty | source | inspection depth (source) — how much of the target the scan could see | −0 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
No tools were enumerated, so prompt-injection, capability and toxic-flow analysis had no tool surface to inspect. To grade a package’s real runtime tools, scan the running server: --command "npx -y <package>".
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. minimal is the level these add up to.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| No per-tool rows for this release — see the note below. | ||
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
The public result for this release does not print the flow graph, so there is nothing to show here. That is not the same as "no paths were found": what the scan did read is above, under coverage.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
Always latest — the install command names no version, so it installs the newest release when it runs; the current release on file is 0.1.0. Pin a release below and the command asks for exactly that one.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Formfurrow can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.