Formwire

io.github.CloudCorpRecordsPublished by GitHub account CloudCorpRecordsv0.1.0Updated Nov 7, 2026

Create and wire up contact forms from your agent: snippets, forms, and submissions.

VerifiedSTDIODesktop onlyDeveloper ToolsBusiness & Commerce

Overview

AI-generated overview

Local bridge to Formpaste that lets an assistant create contact forms, get framework snippets, inspect form settings and read submissions.

What you can do
  • Create forms and get back an access key plus a wired snippet
  • Generate copy-paste form snippets for html, react, nextjs, astro, vue or svelte
  • List and read your forms to check destination, verification, allowed domains and notification settings
  • List submissions per form with counts and metadata, optionally including message bodies
  • Store a marked test submission to prove a form is live
When to use it
Useful when you are building a site and want the assistant to scaffold a contact form, embed it with the right access key, and then check configuration or incoming submissions without leaving the chat.
Requirements
Runs locally via npx or Docker over stdio; needs network access to the upstream Formpaste endpoint. Optionally set FORMPASTE_MCP_URL to override the endpoint and FORMPASTE_API_KEY to send a bearer token; without the key no auth header is sent. Forms belong to your own Formpaste account, and a new destination address must be verified in the dashboard before submissions are emailed.
Before you install
The API key is forwarded as a bearer token to the upstream service, and tool calls and arguments are sent there. list_submissions with includeContent returns third-party PII from message bodies and requires a full-access token. Creating a form triggers destination verification for a new address, and create_form can fail with upgrade_required. The bridge stores nothing itself.

Installation

In SourceWeft

  1. Open Formwire in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

formwire

formwire is a small local bridge to Formpaste's hosted MCP server, which wires up contact forms for a site: create a form, get a copy-paste snippet for your framework with the form's access key already filled in, check how a form is configured, and read the submissions that land in its inbox.

The bridge stores nothing itself. It serves the upstream server's tool list locally, exactly as captured from the live endpoint, and forwards each tool call upstream, returning the result untouched. Forms belong to the caller's own Formpaste account: a form's destination address is the owner's own notification address, set once when the form is created, and the test-submission tool only stores a marked test row on the caller's own form - it sends no email.

Tools

  • create_form - create a form and get back its access key plus a wired snippet. Required: name (a human-readable label) and destinationEmail (where submissions are emailed; a new address must be verified in the dashboard before delivery starts). Optional: framework (html, react, nextjs, astro, vue or svelte; defaults to html) choosing the snippet's shape.
  • get_snippet - a copy-paste form snippet for a framework. Required: framework. Optional: formId fills in a real access key; without it a placeholder is used.
  • list_submissions - submissions for one of your forms, as counts plus per-submission metadata. Required: formId. Optional: folder (inbox or spam), limit, and includeContent to include full message bodies.
  • list_forms - every form on your account, each with its id, name, access key and inbox/spam counts. Takes no arguments. Use it to discover form ids.
  • get_form - read one form back to check its wiring: access key, destination and whether that destination is verified yet, allowed domains, and notification, autoresponder and webhook settings. Required: formId. The webhook signing secret is never returned.
  • send_test_submission - store a test submission on your own form to prove it is live. Required: formId. Optional: fields, a flat string map of sample values; omit it for a default payload. Test rows appear in the inbox with a Test badge, send no email, and never count toward quota.

Configuration

  • FORMPASTE_MCP_URL (optional) - override the upstream endpoint. Defaults to https://api.formpaste.com/mcp. (The override hook is this rebuild's own labelled reconstruction.)
  • FORMPASTE_API_KEY (optional) - when set, every upstream request carries an Authorization: Bearer <key> header with a token minted in the Formpaste dashboard. When it is not set, no auth header is sent. (This forwarding is also a labelled reconstruction; the original surface was captured keyless.)

Forwarding mechanics

On the first tool call the client opens a streamable HTTP session with the upstream: a JSON-RPC initialize request (protocolVersion 2025-03-26, clientInfo name formwire), then a notifications/initialized notification, then the tools/call request carrying the caller's arguments unchanged. When the upstream answers initialize with an Mcp-Session-Id header, that value rides on every later request of the session, which is reused for the life of the process. Replies may arrive as plain JSON or as server-sent events; both are read.

Successful upstream results pass through verbatim, including any isError flag the upstream sets. Failures - a JSON-RPC error, a non-2xx status, an unreadable response, or a request that cannot be completed - come back as an isError result whose text starts with formwire error: (this rendering is this rebuild's own labelled reconstruction).

CLI

Each tool is also a subcommand taking one JSON argument string (omit it for tools that take none):

bash
npx @reneturcios/formwire create_form '{"name":"Contact form","destinationEmail":"[email protected]"}'npx @reneturcios/formwire get_snippet '{"framework":"react","formId":"frm_123"}'npx @reneturcios/formwire list_formsnpx @reneturcios/formwire get_form '{"formId":"frm_123"}'npx @reneturcios/formwire list_submissions '{"formId":"frm_123","folder":"inbox"}'npx @reneturcios/formwire --version

Exit codes: 0 on success, 1 on an isError result, 2 on a usage error.

MCP server

bash
npx -y @reneturcios/formwire mcp

MCP client config:

json
{  "mcpServers": {    "formwire": {      "command": "npx",      "args": ["-y", "@reneturcios/formwire", "mcp"]    }  }}

Docker

bash
docker run -i ghcr.io/cloudcorprecords/formwiredocker run --rm ghcr.io/cloudcorprecords/formwire --version

The container's default command is mcp, so the first form is a stdio MCP server; any other arguments reach the CLI normally.

Development

bash
npm installnpm run buildnpm testnpm run dev

The test suite runs entirely against a stubbed JSON-RPC upstream - no live network calls.

License

MIT - see LICENSE.

Source: README.md at commit f41dc73

Tools

6

create_form

Create a Formpaste form and return its access key + a wired snippet. Triggers destination verification for a new address (the owner completes it in the dashboard); an already-verified destination delivers immediately. Errors with: unauthorized, upgrade_required.

ParametersnamerequiredframeworkdestinationEmailrequired

get_snippet

Return a copy-paste form snippet for a framework (html, react, nextjs, astro, vue, svelte). Pass formId to fill in a real access key; otherwise a placeholder is used. Errors with: unauthorized, invalid_framework.

ParametersformIdframeworkrequired

list_submissions

List submissions for one of your forms. Returns counts + per-submission metadata by default; set includeContent to include message bodies (third-party PII). Errors with: unauthorized, not_found, forbidden. Requires a full-access token.

ParameterslimitfolderformIdrequiredincludeContent

list_forms

List all forms on your account, each with its id, name, access_key, and inbox/spam counts. Use this to discover form ids or confirm a form you just created exists. Errors with: unauthorized.

Takes no parameters.

get_form

Read one of your forms to verify it is wired correctly: returns its access_key, destination_email, destination_verified (whether submissions will be emailed yet), allowed_domains, and notification/autoresponder/webhook config. Never returns the webhook signing secret. Errors with: unauthorized, not_found.

ParametersformIdrequired

send_test_submission

Store a TEST submission so you can prove a form is live and receiving. Stored only: it appears in the owner's Inbox with a Test badge but sends NO email, runs NO spam scoring, and never counts toward quota. Optionally pass sample fields; omit to use a default payload. Capped at the 5 newest test rows per form. Errors with: unauthorized, not_found, invalid_input, too_many_fields, field_too_large.

ParametersfieldsformIdrequired

Version history

1
  1. v0.1.0LatestNov 4, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts