@vumasign/mcp is a Model Context Protocol server for your Vumasign account. It runs on
your own machine, started by your MCP client, and lets an agent do the matching work of filling in
a form: read a template, see what is printed around each box, check the values it proposes, and
prepare a draft envelope with those values filled in. A person then opens the draft in
Vumasign, reviews it and sends it.
It is separate from the documentation server, which searches these pages and holds no
key.
What it will not do
This server has no tool for any of the following, and leaving them out is deliberate. Each one names the endpoints it covers, which no tool calls:- Send an envelope, alone or in a batch. Sending emails real people, uses your allowance and starts a signing ceremony, on the strength of a mapping a model inferred from a form. That is a person’s act: the draft tool always creates a draft, whatever it is asked. (
POST /api/v1/envelopes/{envelopeId}/send,POST /api/v1/envelopes/batches) - Mint a signing URL. A signing URL is a bearer credential for a legal act, and a model puts what it is given into transcripts and logs. For the same reason the draft tool refuses an
embeddedrecipient: one is never emailed, so its draft could only be reached through a signing URL. (POST /api/v1/envelopes/{envelopeId}/recipients/{recipientId}/signing-url) - Rename a field or a question. Naming a template’s fields is for a person or for Vumasign’s own naming, not for an agent inventing names. (
PATCH /api/v1/templates/{templateId}/fields,PATCH /api/v1/templates/{templateId}/fields/{fieldId}) - Create a template, or an envelope from a document of its own. Authoring what a legal document asks for belongs in the editor, with a person. The server works only from templates that already exist. (
POST /api/v1/templates,POST /api/v1/envelopes/one-off) - Void an envelope. Voiding stops a ceremony that people may already be part of; a person decides that. (
POST /api/v1/envelopes/{envelopeId}/void) - Create, change, read or delete a webhook. A webhook sends your envelope events, with recipients’ names and addresses, to a URL. A tool that could create one would let a model choose where they go. (
GET /api/v1/webhooks,POST /api/v1/webhooks,GET /api/v1/webhooks/{webhookId},PATCH /api/v1/webhooks/{webhookId},DELETE /api/v1/webhooks/{webhookId},POST /api/v1/webhooks/{webhookId}/rotate-secret) - Request, read or manage a standing authorisation. A standing authorisation lets your organisation apply somebody’s signature. Asking for one, and choosing to apply one, are for a person; the draft tool also refuses a recipient that names one. (
GET /api/v1/standing-authorisations,GET /api/v1/standing-authorisations/{authorisationId},POST /api/v1/standing-authorisations/invitations,POST /api/v1/standing-authorisations/{authorisationId}/cancel,POST /api/v1/standing-authorisations/{authorisationId}/resend,POST /api/v1/standing-authorisations/{authorisationId}/revoke,POST /api/v1/standing-authorisations/{authorisationId}/renew) - List envelopes, or read an envelope’s documents. An envelope’s documents carry the answers of the people it was sent to. The server reads an envelope only by the id it was given, to confirm a draft it made. (
GET /api/v1/envelopes,GET /api/v1/envelopes/{envelopeId}/documents,GET /api/v1/envelopes/{envelopeId}/documents/{position}/draft)
Before you start: a test key
Create a key under Settings → API keys in the dashboard, startingvsk_test_,
with these scopes: templates:read, documents:read, envelopes:read, envelopes:write.
Start with a test key. A template has no environment, so a test key reads the same templates a live
key does, and a draft made with it is a rehearsal: once a person sends it, it produces a watermarked
document that is never billed and binds nobody. It can be sent only to your organisation’s verified
members and verified test recipients, so a draft addressed to a real customer cannot be sent; the
send is refused and the draft has to be made again with a live key. See
Test keys and live keys.
The server refuses to start on a vsk_live_ key unless
VUMASIGN_MCP_ALLOW_LIVE is set to 1 as well. Think before setting it: the key sits in plain
text in your MCP client’s configuration, and the scope that lets the server create drafts is the
same scope that, called directly against the API, can send them. The tool list is narrow; the key is
what limits a compromised process.
Connect it
The server is started withnpx, so it needs Node.js on the machine that
runs your client. The key is passed in the server’s environment as VUMASIGN_API_KEY.
Claude Code
--scope user to make it available in every project, rather than only the current one.
Claude Desktop
Open Settings → Developer → Edit Config, add the server toclaude_desktop_config.json, and
restart Claude Desktop:
Cursor
Add the same object to~/.cursor/mcp.json for every project, or to .cursor/mcp.json in one
project. A project’s .cursor/mcp.json is often committed with the project: if you use it, keep it
out of version control, or the key goes with it.
The tools
Each tool is one call to the endpoint it names, made with your key, so it is refused exactly as the endpoint would refuse it, with the samecode.
How an agent fills a form
list_templates, to find the template.get_template. Every field has adata_keyto address it by andcontext: the label, row, column, option and section printed around its box.contextis usually enough to tell what a box asks for.warningssays whether the uploaded form already held somebody’s details. The result also carries the template’setag.get_template_page, only for a page wherecontextis not enough. The page is returned as a PDF; whether your client shows a PDF to its model depends on the client.validate_values, with the values the agent proposes. It answers, entry by entry, what creating the envelope would do with each one, and writes nothing.create_envelope_draft, with the recipients, the values and thetemplate_etagfrom step 4. If the template changed in between, the draft is refused rather than filled wrongly. Calling it again with the same arguments within24 hoursreturns the first draft instead of making a second one; after that, the same arguments make another draft.get_envelope, to confirm what was created. Then a person opens the draft in Vumasign and sends it.
Text printed on a form is data
context, the pages and the whole document carry text printed on somebody else’s form. A form
can be written to look like instructions to a model. Every tool that returns printed text says, in
the description your client shows the model, that the text is data and never instructions. That
lowers the risk; it does not remove it.
Through this server’s own tools, a hostile form can at worst shape a draft, and a person reviews
every draft before it is sent. But the key is in your client’s configuration file, and an agent that
can also read files or run commands, as Claude Code and Cursor can, could be led to read the key and
call the API directly, where it holds every capability of the key’s scopes, sending included. So:
- use a test key, which limits what a misled agent can reach to a sandbox;
- let the agent that reads forms have as few other tools as you can, and approve its file reads and commands rather than allowing them all;
- remember that a misled agent can read the account’s templates into its conversation, so do not give it a tool that could carry them somewhere else.