Signwell Mcp

io.github.Bidsketch由 GitHub 账号 Bidsketch 发布v0.3.8更新于 Oct 29, 2026

Send documents for e-signature, track signing, and manage templates in SignWell from any MCP client.

已验证STDIO仅桌面效率与工作流商业与电商

概览

AI 生成的概览

SignWell 电子签名服务器:可在 MCP 客户端中创建、发送、跟踪和管理签署文件与模板。

可以做什么
  • 存储并校验文件:暂存用户已有文件、获取文件令牌,并在使用前检查 PDF 文本标签
  • 创建与查询文件:带收件人和附件生成草稿,按条件筛选并获取签署状态
  • 发送与管理签署:发送草稿、更正收件人信息、发送提醒、删除以撤回请求
  • 获取已完成的 PDF:返回可分享链接或 base64 内容
  • 管理模板:创建、更新、查询、列出和删除可复用模板,并用模板发送文件
适用场景
适合让助手准备并发送待签署文件、催办签署人、查看签署进度,或在聊天客户端内复用模板的场景。
运行要求
以 stdio 方式在本机运行,需要 Node.js v18 或更高版本,可通过 npm 包或 npx 启动。需要具备文件访问权限的 SignWell API 密钥,放在 SIGNWELL_API_KEY 中。可选 SIGNWELL_API_BASE_URL 与 SIGNWELL_API_TIMEOUT_MS 覆盖项。需能访问 SignWell 的 API。
安装前请注意
该 API 密钥可访问 SignWell 文件;安装向导会把它写入本地 env 文件并修改客户端配置文件。发送、更正收件人、删除文件和发送提醒会改变真实签署状态,需确认参数;template_create_document 默认立即发送,除非设置 draft。未使用 test_mode 时发送可能产生 API 计费。上传的文件会在内存中保留 60 分钟并转发给 SignWell。

安装

在 SourceWeft 中

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

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

其他 MCP 客户端

参照 仓库 中的启动说明。

README

SignWell MCP Server

Model Context Protocol server that orchestrates SignWell's e-signature workflows.

Prerequisites

  • Node.js v18 or newer.
  • A SignWell API key with document access (SIGNWELL_API_KEY environment variable).
  • Optional overrides:
    • SIGNWELL_API_BASE_URL for non-production endpoints.
    • SIGNWELL_API_TIMEOUT_MS to tweak HTTP client timeouts (default 90000 ms; CLI flag --timeout on setup skips env prompts and writes this override).

Setup

Interactive Wizard (recommended)

  1. Install dependencies if you have not already:

    bash
    npm install
  2. Bundle the CLI so MCP clients point at the build output:

    bash
    npm run build
  3. Run the wizard and follow the prompts:

    bash
    node build/index.js setup
    • Stores your SignWell secrets in ~/.config/signwell-mcp/env on Linux, ~/Library/Application Support/SignWell/MCP/env on macOS, or %APPDATA%/SignWell/MCP/env on Windows with 0700/0600 permissions.
    • Automatically updates Claude Desktop, Claude Code, Cursor, and OpenCode configuration files (backups are captured before each write) so you do not have to hunt for platform paths.
    • Client targets:
      • Claude Code: ~/.claude.json at mcpServers.signwell
      • Claude Desktop: claude_desktop_config.json at mcpServers.signwell
      • Cursor: ~/.cursor/mcp.json at mcpServers.signwell
      • OpenCode: ~/.config/opencode/opencode.json at mcp.signwell (Windows: %USERPROFILE%\.config\opencode\opencode.json)
    • Uses each client's documented JSON wrapper and STDIO/local server shape so the server is visible after the client restarts.
    • If a previous Claude Code install wrote the stale ~/.claude/mcp.json servers.signwell entry, rerunning setup backs up that legacy file and removes only the stale SignWell entry after writing the correct ~/.claude.json config.
    • Use --print (or -p) to preview outputs without writing to disk, and --yes --api-key=... for non-interactive runs (CI, devcontainers, etc.).
    • Pass --clients=claude-desktop,cursor to limit which MCP clients the wizard configures; omit for "all". Use --timeout=<ms> only if you need a non-default HTTP timeout.
    • After bundling (npm run build) and publishing the package, end users can invoke the same wizard with npx @signwell/mcp setup. Installing globally also enables invoking signwell-mcp setup directly.

Manual exports

Prefer to manage env vars yourself? Export the required values before running the server:

bash
export SIGNWELL_API_KEY="your_api_key"# export SIGNWELL_API_BASE_URL="https://www.signwell.com/api/v1"   # optional

Installation (npm)

Once the package is published to npm (GitHub: Bidsketch/signwell-mcp):

  • Run the setup wizard without installing anything globally:

    bash
    npx @signwell/mcp setup
  • Install globally if you prefer a persistent binary:

    bash
    npm install -g @signwell/mcpsignwell-mcp setup

After configuration, start the MCP server via signwell-mcp (requires Node.js v18+).

The signwell-mcp.mcpb file is a separate Claude Desktop extension artifact. It uses the root manifest.json and should be rebuilt for releases after running npm run build.

Local Development Workflow

  1. Install dependencies: npm install

  2. Bundle the CLI entrypoint (required for MCP client configs): npm run build

  3. Configure credentials: node build/index.js setup (or npx @signwell/mcp setup once published)

  4. Start the MCP server locally: npm start (runs node build/index.js)

  5. Open another terminal to run tests and linters before committing:

    bash
    npm testnpm run typechecknpm run lint
  6. When using MCP inspector or other clients, point them at npm start (stdio).

Running the Server

  • Development entrypoint (stdio transport):

    bash
    SIGNWELL_API_KEY="$SIGNWELL_API_KEY" npm start# or run directly:SIGNWELL_API_KEY="$SIGNWELL_API_KEY" node build/index.js
  • CLI helpers:

    • node build/index.js --help prints usage and env expectations.
    • node build/index.js --version prints the current build.
    • node build/index.js setup launches the setup wizard described above when working from source.
    • Once the package is bundled/published, npx @signwell/mcp setup runs the wizard and SIGNWELL_API_KEY=... npx @signwell/mcp starts the server via the packaged binary (global installs can call signwell-mcp ... directly).

MCP Inspector

Use the MCP inspector to exercise tools locally:

bash
npx @modelcontextprotocol/inspector node build/index.js

Tests

Run the quality gates in order:

bash
npm testnpm run typechecknpm run lintnpm run format

Demo

Sample MCP inspector session (sanitized IDs):

  1. Create Draft

    json
    Tool: document_createInput: {  "name": "Sales Agreement",  "recipients": [{ "id": "1", "name": "Alice Example", "email": "[email protected]" }],  "files": [{ "name": "agreement.pdf", "file_url": "https://files.example.com/agreement.pdf" }]}Output:{  "ok": true,  "type": "document_create",  "message": "Document draft created.",  "data": {    "id": "doc_123",    "status": "draft"  }}
  2. Send Draft

    json
    Tool: document_send_draftInput: { "document_id": "doc_123", "confirm_send": true }Output:{  "ok": true,  "type": "document_send_draft",  "message": "Send request accepted.",  "data": { "id": "doc_123", "status": "Sent" },  "warnings": ["Status may update asynchronously. If this response still shows Draft, call document_get after a few seconds; do not send again. Recipient send_email is an embedded-signing setting, not an email-delivery receipt."]}
  3. Check Status

    json
    Tool: document_getInput: { "document_id": "doc_123" }Output:{  "ok": true,  "type": "document_get",  "message": "Fetched document status.",  "data": {    "id": "doc_123",    "status": "completed",    "recipients": [{ "email": "[email protected]", "status": "signed" }]  }}
  4. Completed PDF

    json
    Tool: document_completed_pdfInput: { "document_id": "doc_123" }Output:{  "ok": true,  "type": "document_completed_pdf",  "data": {    "pdf_url": "https://signwell-downloads.example.com/doc_123.pdf"  }}

Privacy Policy

This section describes the data practices of the SignWell MCP Server.

Data Collection

  • The MCP server itself does not collect, transmit, or store any personal data or usage analytics.
  • Your SignWell API key is stored locally on your machine with restrictive file permissions (0600) in platform-specific secure locations:
    • macOS: ~/Library/Application Support/SignWell/MCP/env
    • Linux: ~/.config/signwell-mcp/env
    • Windows: %APPDATA%/SignWell/MCP/env

Usage & Storage

  • Files provided via file_store are held temporarily in memory with a 60-minute TTL and are cleared automatically.
  • All in-memory file data is also cleared on server restart.
  • No persistent data storage exists beyond the credential file created during setup.

Third-Party Sharing

  • The MCP server does not share data with any third parties.
  • All API communication goes directly between your machine and SignWell's servers (https://www.signwell.com/api/v1).

Telemetry & Analytics

  • The server does not collect, transmit, or store usage analytics or telemetry of any kind.

Data Retention

  • In-memory file storage is cleared on server restart or after the 60-minute TTL expires.
  • No persistent data is retained beyond the local credential configuration file.

Contact

For privacy inquiries, contact [email protected] or open an issue at github.com/Bidsketch/signwell-mcp/issues.

See also the hosted privacy policy at https://www.signwell.com/privacy/.

Resources

  • MCP resources: document://{id} and template://{id} expose read-only JSON snapshots that reuse the same normalization logic as the tools, so inspectors or other MCP clients can browse previously created assets quickly.

Attaching Files & Draft Safety

  • document_create and template_create_document always set draft: true, ensuring nothing is emailed until you intentionally call document_send_draft.
  • Supply files via the files array using either file_url (public URL or the link your MCP client provides when you @-attach a file in UIs like Claude Desktop), file_base64, or resource_uri. When a resource_uri is provided the MCP server automatically calls resources/read to pull the attachment bytes and forwards them to SignWell's /api/v1/documents/ endpoint.

Document Corrections and Signing Dates

  • Recipient names: pass name in each document_create recipient. Legacy first_name and last_name are combined when name is omitted. Set test_mode: true to create a non-binding test document without API billing.
  • Draft settings: document_send_draft accepts optional updates such as name, subject, message, expires_in, and reminders alongside confirm_send: true. Omitted settings are preserved. It cannot edit recipients, files, or fields, or save changes without sending.
  • Sent recipients: call document_get for recipient IDs, then document_update_recipients with document_id, confirm_update: true, and recipients: [{ "id": "<returned recipient ID>", "name": "Correct Name", "email": "[email protected]" }]. Include both name and email, keeping the unchanged value. Only recipients who have not started signing on sent/viewed/pending/bounced documents can be changed. Non-embedded recipients receive a new notification email; embedded recipients follow their existing send_email setting.
  • Withdraw a document: document_delete with document_id and confirm_delete: true deletes the document and cancels signing in progress. Delete an incorrect request before creating a replacement to avoid two live requests.
  • Send status: a successful send returns “Send request accepted” and attempts one status refresh. If the refresh fails, the accepted send remains successful. Status may still lag; use document_get after a few seconds instead of resending. send_email is an embedded-signing option, not a delivery receipt.

For an automatically populated, locked signing date, use these existing SignWell text tags with text_tags: true:

text
{{signature:1:y}} {{autofill_date_signed:1:y}}{{signature:2:y}} {{date:2:y::::::y}}

Both date forms lock the signing date. Plain {{date:1:y}} remains editable for dates the signer should choose. Text-tag parsing is asynchronous: inspect fields with document_get after processing. See SignWell's text-tag options, recipient updates, and update-and-send limitations.

Available Scripts

ScriptPurpose
npm startExecute the MCP server entrypoint over stdio (after npm run build).
npm testRun the test suite.
npm run typecheckType-check the project with tsc --noEmit.
npm run lintLint source and tests using Biome.
npm run formatApply repository formatting conventions via Biome.
npm run buildProduce an ESM bundle at build/index.js using esbuild.

Directory Layout

.├── src/                # MCP server source (entrypoint + domain modules)│   └── setup/          # Interactive setup wizard for MCP client configuration├── test/               # Test suites├── build/              # Bundled output (ignored in releases)├── biome.json          # Biome lint/format configuration└── tsconfig.json       # TypeScript compiler configuration

来源:README.md,提交 5998785

工具

16

file_store

Store File

Store a user's existing file for upcoming SignWell requests. Returns a file_token you can pass to document/template tools. IMPORTANT: This tool is for the USER'S EXISTING FILES only. Do NOT read, parse, or convert the file — upload it as-is. HOW TO PROVIDE THE FILE (in order of preference): 1. No arguments — Opens a native OS file picker dialog. USE THIS BY DEFAULT. Simply call file_store with no arguments and the user will select the file themselves. 2. file_path — Only if the user explicitly provides a local path on their computer (e.g. ~/Documents/contract.docx). 3. file_url — A publicly accessible URL to the file. CHAT ATTACHMENTS: When a user uploads/attaches a file in the chat, DO NOT use resource_uri — those are sandboxed and inaccessible. Instead, call file_store with NO arguments to open the native file picker. CLAUDE-GENERATED FILES: If YOU created the file content (e.g. generated a PDF), do NOT use file_store. Pass file_base64 directly to document_create instead.

输入参数namefile_urlfile_pathresource_uri

file_validate_text_tags

Validate Text Tags

Validate text tags in a PDF before creating a template or document. RECOMMENDED WORKFLOW: file_store → file_validate_text_tags → template_create/document_create Accepts a PDF via file_token (from file_store), file_base64, file_url, or resource_uri. Set use_picker: true to open a native file picker when no file input is provided. Extracts text from the PDF and checks for valid SignWell text tags like {{signature:1:y}}. For locked signing dates, use {{autofill_date_signed:1:y}} or {{date:1:y::::::y}}. Plain {{date:1:y}} is editable. Returns: - Whether text is extractable from the PDF - List of valid tags found - List of malformed tags (if any) - Signer numbers referenced - Recommendations for fixing issues

输入参数file_urlfile_tokenuse_pickerfile_base64resource_uri

document_create

Create Document

Create a SignWell document (always created as a draft). CRITICAL RULES: - Do NOT read, parse, extract, or verify file contents before uploading. The user already knows what is in the file. - Do NOT convert files between formats (e.g. do NOT convert .docx to .pdf). SignWell handles conversion automatically. - The user will place signature fields in the SignWell editor. Just upload the file and return the editor link. SUPPORTED FILE TYPES: .pdf, .doc, .docx, .pages, .ppt, .pptx, .key, .xls, .xlsx, .numbers, .jpg, .jpeg, .png, .tiff, .tif, .webp, .html, .htm WORKFLOW FOR USER'S EXISTING FILES: 1. file_store (call with NO arguments to open native file picker) → returns file_token 2. document_create (pass file_token in files array) → creates draft, returns editor_url WORKFLOW FOR CLAUDE-GENERATED FILES: 1. document_create with content_text directly (RECOMMENDED) → MCP server converts to DOCX automatically Pass plain text or Markdown as content_text. The server generates a DOCX file without base64 overhead. 2. document_create with file_base64 directly (skip file_store) → creates draft, returns editor_url Do NOT write the file to disk and pass a file_path — sandbox paths are inaccessible. Use file_base64. Example using content_text: { "name": "Service Agreement", "recipients": [{"id": "1", "email": "[email protected]", "name": "Jane Doe"}], "files": [{"name": "agreement.docx", "content_text": "# Service Agreement\n\nThis agreement between..."}] } FILE ACCESS: Chat attachments and sandbox paths (/home/claude, /mnt/user-data) are inaccessible to the MCP server. Do NOT use resource_uri or sandbox file_path values. For existing files, call file_store with no arguments to open the native file picker. REQUIRED PARAMETERS: 1. name: Document name 2. recipients: Array with at least one object containing "id" and "email". Always pass the signer's full name in "name" (or "first_name" and "last_name", which are joined into "name"); a recipi

输入参数name必填files必填messagesubjectmetadatareminderstest_modetext_tagsexpires_inrecipients必填redirect_urlallow_decline另有 9 个

document_list

List Documents

List SignWell documents with optional filtering (status, archived, search).

输入参数pagesearchstatusarchivedper_pageupdated_afterupdated_before

document_get

Get Document

Fetch the latest status for a SignWell document.

输入参数document_id必填

document_send_draft

Send Draft

Update optional document settings and send a previously created draft (requires confirm_send). Omitted settings are preserved. This endpoint cannot update recipients, files, or fields. Returns a best-effort status refresh; status can still lag. An accepted send must not be retried just because status is Draft: use document_get. Recipient send_email is an embedded-signing setting, not an email-delivery receipt.

输入参数namemessagesubjectmetadatareminderstest_modeexpires_indocument_id必填confirm_sendredirect_urlallow_declineallow_reassign另有 7 个

document_update_recipients

Update Document Recipients

Correct names or emails on a sent document (requires confirm_update). First call document_get and use its recipient IDs. Allowed document statuses: sent, viewed, pending, bounced; only recipients who have not started signing can be updated. Include each recipient's name and email, retaining any value you are not changing. Updated recipients on non-embedded documents receive a new notification email; embedded documents follow their existing send_email setting. Drafts and completed documents are not supported.

输入参数recipients必填document_id必填confirm_update

document_delete

Delete Document

Delete a document and cancel signing if in progress (requires confirm_delete). Use this to withdraw an incorrect request before creating a replacement. This deletes the document; it does not archive it.

输入参数document_id必填confirm_delete

document_send_reminder

Send Reminder

Send a reminder email for a document (optionally to a specific recipient).

输入参数messagedocument_id必填recipient_email

document_completed_pdf

Completed PDF

Fetch the completed PDF. Use mode: 'base64' to get content for displaying in an artifact or chat (embed as data:application/pdf;base64,{pdf_base64}). Default 'url' mode returns a shareable link.

输入参数modedocument_id必填file_formatsave_to_pathinclude_audit_page

template_create

Create Template

Create a SignWell template for reusable signature documents. RECOMMENDED WORKFLOW: 1. file_store (provide file_path, file_url, or resource_uri) → returns file_token 2. file_validate_text_tags (pass file_token) → validates tags are extractable 3. template_create (pass file_token in files array) → creates the template REQUIRED PARAMETERS (both are mandatory): - files: Array with at least one file object containing: * "name": Filename (e.g., "template.docx") * One content source (in order of preference): - "content_text": Plain text/Markdown to auto-convert to DOCX (RECOMMENDED for generated content) - "file_token": Token from file_store (recommended for uploaded files) - "file_base64": Base64-encoded file content - "file_url": Public URL to the file - "resource_uri": MCP resource URI - placeholders: Array with at least one placeholder object containing "id" and "name" STEP-BY-STEP EXAMPLE (using file_token): 1. Call file_store with {"file_path": "/path/to/doc.pdf"} → get file_token 2. Call file_validate_text_tags with {"file_token": "..."} → confirm tags are valid 3. Call this tool with: { "name": "My Template", "files": [{"name": "doc.pdf", "file_token": "<token from file_store>"}], "placeholders": [{"id": "1", "name": "Signer"}], "text_tags": true } ALTERNATIVE (inline base64): { "name": "My Template", "files": [{"name": "doc.pdf", "file_base64": "JVBERi0xLjQK..."}], "placeholders": [{"id": "1", "name": "Signer"}], "text_tags": true } TEXT TAGS (when text_tags: true): Your PDF must contain these literal text strings as SELECTABLE TEXT (not images): - {{signature:1:y}} - Signature field for placeholder id "1" - {{date:1:y}} - Date field for placeholder id "1" - {{autofill_date_signed:1:y}} or {{date:1:y::::::y}} - Automatically populated, locked signing date (plain date fields are editable) - {{text:1:y:Label}} - Text field with label - {{initial:1:y}} - Initials field The number in the tag (1, 2, etc.) MUST match a place

输入参数namedraftfiles必填fieldslabelsmessagesubjectlanguagemetadatareminderstext_tagsexpires_in另有 10 个

template_update

Update Template

Update an existing SignWell template. Only provide fields you want to change.

输入参数namedraftfilesfieldslabelsmessagesubjectlanguagemetadatareminderstext_tagsexpires_in另有 11 个

template_get

Get Template

Fetch an individual SignWell template by ID.

输入参数template_id必填

template_list

List Templates

List SignWell templates with pagination.

输入参数pageper_page

template_delete

Delete Template

Delete a SignWell template.

输入参数template_id必填

template_create_document

Send from Template

Create and send a document from a template. Templates are pre-configured and ready to send, so this tool sends the document for signing by default. IMPORTANT: When a user asks to "send a template" or "send a document from a template", the document will be sent immediately for signing. Set draft: true ONLY if the user explicitly asks to create a draft or review before sending. REQUIRED: - template_id: The template ID to create the document from - recipients: Array of recipient objects, each with: - id: Unique identifier for this recipient (e.g., "recipient_1") - placeholder_name: Name of the template placeholder to assign (must match exactly) - email: Recipient's email address - name: (optional) Recipient's display name Example: { "template_id": "abc123", "recipients": [{ "id": "recipient_1", "placeholder_name": "Client", "email": "[email protected]", "name": "John Doe" }] }

输入参数namedraftfilesmessagesubjectmetadatatext_tagsexpires_inrecipients必填template_id必填redirect_urlcopied_contacts另有 6 个

版本历史

2
  1. v0.3.8最新Oct 22, 2026
  2. v0.3.7Sep 29, 2026

评分

已满足适用检查项的 90%

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

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

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

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