Formwire

io.github.CloudCorpRecords由 GitHub 账号 CloudCorpRecords 发布v0.1.0更新于 Nov 7, 2026

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

已验证STDIO仅桌面开发者工具商业与电商

概览

AI 生成的概览

连接 Formpaste 的本地桥接服务,让助手创建联系表单、获取框架代码片段、查看表单配置并读取提交记录。

可以做什么
  • 创建表单并返回访问密钥与已接好的代码片段
  • 为 html、react、nextjs、astro、vue 或 svelte 生成可直接粘贴的表单片段
  • 列出并读取账户中的表单,核对收件地址、验证状态、允许域名与通知设置
  • 按表单列出提交记录,含数量与元数据,可选择包含留言正文
  • 写入一条带标记的测试提交,用于确认表单已上线
适用场景
适合在建站时让助手搭建联系表单、用正确的访问密钥嵌入页面,并在对话中核对配置或查看收到的提交。
运行要求
通过 npx 或 Docker 以 stdio 在本地运行,需要能访问上游 Formpaste 端点。可选设置 FORMPASTE_MCP_URL 覆盖端点,设置 FORMPASTE_API_KEY 以发送 bearer 令牌;未设置时不发送认证头。表单属于你自己的 Formpaste 账户,新的收件地址需先在控制台完成验证才会发送邮件。
安装前请注意
API 密钥会作为 bearer 令牌转发给上游服务,工具调用与参数也会发送过去。list_submissions 开启 includeContent 会返回第三方个人信息,且需要完全访问权限的令牌。创建表单会触发新地址的验证流程,create_form 可能返回 upgrade_required。该桥接本身不存储数据。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Formwire,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

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.

来源:README.md,提交 f41dc73

工具

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.

输入参数name必填frameworkdestinationEmail必填

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.

输入参数formIdframework必填

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.

输入参数limitfolderformId必填includeContent

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.

无需输入参数。

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.

输入参数formId必填

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.

输入参数fieldsformId必填

版本历史

1
  1. v0.1.0最新Nov 4, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分