SignWell
Model Context Protocol server that orchestrates SignWell's e-signature workflows — create, send, track, and manage documents and templates.
What it can do
- File Store: 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 NO
- File 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
- Document Create: 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
What data it sees
Do you need an account
No: the server works without sign-in
Model Context Protocol server that orchestrates SignWell's e-signature workflows — create, send, track, and manage documents and templates.
How to connect
How to connect SignWell to Claude
The server address to paste into Claude settings:
https://signwell-mcp--signwell.run.tools
- Open Claude (claude.ai or the desktop app).
- Go to Settings → Connectors.
- Click Add custom connector.
- Paste the server address copied below into Remote MCP server URL and click Add.
- In a chat, click + → Connectors and switch the new connector on.
Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.
Authorization
After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.
How to connect SignWell to ChatGPT
The server address to paste into ChatGPT settings:
https://signwell-mcp--signwell.run.tools
- Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
- Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
- Open Settings → Connectors and click Create.
- Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
- Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
- In a new chat open + → Apps/Connectors and enable the connector.
OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.
Authorization
On first use ChatGPT opens the service's sign-in window. Sign in and approve access.
How to connect SignWell to Cursor
The server address to paste into Cursor settings:
https://signwell-mcp--signwell.run.tools
Fastest: click Open in Cursor below and confirm the prompt.
Manually:
- In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
- Paste the JSON copied below into
~/.cursor/mcp.json(per project:.cursor/mcp.jsonin the repo root). - Save the file. The server appears in the MCP list; authorize it there if asked.
Authorization
If the service needs sign-in, an authorize button appears next to the server in the MCP list.
Server tool list (14)
Raw names from tools/list. Only developers need these.
| file_store | 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. |
| file_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}}. 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 |
| document_create | 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": "client@example.com"}], "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" 3. files: Array with at least one file object containing: - "name": Filename (e.g., "contract.docx") - One content source (in order of preference): * "content_text": Plain text or Markdown to auto-convert to DOCX (RECOMMENDED for Claude-generated content) * "file_token": Token from file_store (recommended for user files) * "file_url": Public URL to the file * "file_base64": Base64-encoded file content * "resource_uri": MCP resource URI EXAMPLE (docx via file_token — most common): { "name": "NDA Agreement", "recipients": [{"id": "1", "email": "signer@example.com"}], "files": [{"name": "nda.docx", "file_token": "<token from file_store>"}] } EXAMPLE (pdf with text tags): { "name": "Contract", "text_tags": true, "recipients": [{"id": "1", "email": "signer@example.com"}], "files": [{"name": "contract.pdf", "file_token": "<token from file_store>"}] } TEXT TAGS (optional): Set text_tags: true only if the document already contains signature placeholders like {{signature:1:y}}. The recipient "id" MUST match the number in text tags (id:"1" matches {{signature:1:y}}). |
| document_list | List SignWell documents with optional filtering (status, archived, search). |
| document_get | Fetch the latest status for a SignWell document. |
| document_send_draft | Send a previously created draft document (requires confirm_send). |
| document_send_reminder | Send a reminder email for a document (optionally to a specific recipient). |
| document_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. |
| template_create | 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" - {{text:1:y:Label}} - Text field with label - {{initial:1:y}} - Initials field The number in the tag (1, 2, etc.) MUST match a placeholder "id" in your request. CRITICAL: Text tags must be SELECTABLE/SEARCHABLE text in the PDF, not rendered as images or graphics. When generating PDFs programmatically, use text drawing methods (e.g., drawString) with standard fonts. To verify: open the PDF and try to select/copy the tag text with your mouse. If you can't select it, SignWell can't parse it. MULTI-SIGNER EXAMPLE: { "name": "Contract", "files": [{"name": "contract.pdf", "file_base64": "JVBERi0xLjQK...actual base64 here..."}], "placeholders": [ {"id": "1", "name": "Client"}, {"id": "2", "name": "Vendor"} ], "text_tags": true } For this example, the PDF should contain: {{signature:1:y}} for Client and {{signature:2:y}} for Vendor. COMMON ERRORS: - Empty arguments {} = You forgot to include files and placeholders arrays - "fields": [] in response = PDF doesn't contain valid text tags, or text_tags wasn't set to true |
| template_update | Update an existing SignWell template. Only provide fields you want to change. |
| template_get | Fetch an individual SignWell template by ID. |
| template_list | List SignWell templates with pagination. |
| template_delete | Delete a SignWell template. |
| template_create_document | 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": "client@example.com", "name": "John Doe" }] } |