Appearance
Tools
The MCP server has 14 tools. A client sees only the tools its key's permissions allow, and each tool is the same command as a REST operation, with the same checks. Every input schema below is what tools/list returns.
| Tool | Permission | Kind | Approval |
|---|---|---|---|
get_workspace | read | Read | — |
list_templates | read | Read | — |
get_template | read | Read | — |
get_document | read | Read | — |
list_signing_requests | read | Read | — |
get_signing_request | read | Read | — |
get_intake_request | read | Read | — |
get_approval | read | Read | — |
create_template | documents | Write | None: at once |
start_document | documents | Write | None: at once |
create_signing_request | send | Sensitive write | Waits for a person |
send_signing_request | send | Sensitive write | Waits for a person |
void_signing_request | send | Sensitive write | None: at once |
create_intake_request | send | Sensitive write | Waits for a person |
Kind is how connector platforms class a tool: a read changes nothing; a write changes something only inside the workspace; a sensitive write reaches other people. There is no tool that signs, accepts or declines for anyone, and no tool returns a recipient's signing link.
Instructions the server gives every client
text
JustDocs prepares documents and sends them for e-signature for a person or a team.
- Every tool works in the one workspace this key belongs to; get_workspace says which, and whether your sends wait for approval.
- Start documents from the workspace's templates (list_templates, get_template, start_document).
- With no suitable template, create one (create_template) from text or a library entry.
- Signing requests and intake links you create are held until an owner or admin of the workspace approves them; check with get_approval.
- You can never sign, accept or decline for anyone: recipients sign from the link JustDocs emails them, and no tool returns that link.
- Pass the same idempotency_key when you retry a create or send, so it happens once.Reading
Tools a key with the read permission sees. None of them change anything.
get_workspace
Read permission: read
Get the workspace. The workspace this key works in, its plan and saved templates, and what the key may do: its permissions, whether its sends wait for approval, and where it may send.
None.
Annotations readOnlyHint: true · destructiveHint: false · openWorldHint: false
Same as GET /workspace
Input schema
json
{
"type": "object",
"properties": {},
"$schema": "http://json-schema.org/draft-07/schema#"
}list_templates
Read permission: read
List templates. The workspace's templates you can start documents from, 100 at a time, newest first.
| Input | Type | Required | Description |
|---|---|---|---|
cursor | string | No | next_cursor from the previous page. Up to 512 characters. |
Annotations readOnlyHint: true · destructiveHint: false · openWorldHint: false
Same as GET /templates
Input schema
json
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"maxLength": 512,
"description": "next_cursor from the previous page"
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}get_template
Read permission: read
Get a template. A template with its fill-ins and the questions that answer them.
| Input | Type | Required | Description |
|---|---|---|---|
template_id | string (uuid) | Yes | The template's id. |
Annotations readOnlyHint: true · destructiveHint: false · openWorldHint: false
Same as GET /templates/{id}
Input schema
json
{
"type": "object",
"properties": {
"template_id": {
"type": "string",
"format": "uuid",
"description": "The template's id"
}
},
"required": [
"template_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}get_document
Read permission: read
Get a document. A document's status, revision and fill-in values.
| Input | Type | Required | Description |
|---|---|---|---|
document_id | string (uuid) | Yes | The document's id. |
Annotations readOnlyHint: true · destructiveHint: false · openWorldHint: false
Same as GET /documents/{id}
Input schema
json
{
"type": "object",
"properties": {
"document_id": {
"type": "string",
"format": "uuid",
"description": "The document's id"
}
},
"required": [
"document_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}list_signing_requests
Read permission: read
List signing requests. The workspace's signing requests you can see, newest first.
| Input | Type | Required | Description |
|---|---|---|---|
cursor | string (uuid) | No | next_cursor from the previous page. |
Annotations readOnlyHint: true · destructiveHint: false · openWorldHint: false
Same as GET /signing-requests
Input schema
json
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"format": "uuid",
"description": "next_cursor from the previous page"
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}get_signing_request
Read permission: read
Get a signing request. A signing request's status, recipients and approval. It never includes signing links.
| Input | Type | Required | Description |
|---|---|---|---|
signing_request_id | string (uuid) | Yes | The signing request's id. |
Annotations readOnlyHint: true · destructiveHint: false · openWorldHint: false
Same as GET /signing-requests/{id}
Input schema
json
{
"type": "object",
"properties": {
"signing_request_id": {
"type": "string",
"format": "uuid",
"description": "The signing request's id"
}
},
"required": [
"signing_request_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}get_intake_request
Read permission: read
Get an intake link. Where an intake link stands.
| Input | Type | Required | Description |
|---|---|---|---|
intake_request_id | string (uuid) | Yes | The intake link's id. |
Annotations readOnlyHint: true · destructiveHint: false · openWorldHint: false
Same as GET /intake-requests/{id}
Input schema
json
{
"type": "object",
"properties": {
"intake_request_id": {
"type": "string",
"format": "uuid",
"description": "The intake link's id"
}
},
"required": [
"intake_request_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}get_approval
Read permission: read
Get an approval. Whether an owner or admin of the workspace has approved, declined or not yet decided something you asked to send.
| Input | Type | Required | Description |
|---|---|---|---|
approval_id | string (uuid) | Yes | The approval's id. |
Annotations readOnlyHint: true · destructiveHint: false · openWorldHint: false
Same as GET /approvals/{id}
Input schema
json
{
"type": "object",
"properties": {
"approval_id": {
"type": "string",
"format": "uuid",
"description": "The approval's id"
}
},
"required": [
"approval_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Documents
With the documents permission: create templates and start documents from them. Neither emails anyone, so neither waits for approval.
create_template
Write permission: documents
Create a template. Saves a template in the workspace, from text you write with its fill-ins and signing fields, or copied from a library entry. It emails no one; sending a document started from it waits for approval as usual.
| Input | Type | Required | Description |
|---|---|---|---|
title | string | No | The template's name: needed with content, and a library entry's own name by default. 1–255 characters. |
content | string | No | The template's text, in blocks separated by a blank line: # Heading (## and ### for smaller ones), a list whose every line starts with "- " or "1. ", --- for a rule, and anything else a paragraph. Inside text: **bold** for bold; {{key}} or {{key|Label}} for a fill-in completed for each document (key: lowercase letters, numbers and _, starting with a letter); [[type:role]] for a signing field and [[type:role?]] for an optional one, either with |Label to name it (type: signature, initials, date_signed, text, checkbox, full_name; role: lowercase letters, numbers and -). Up to 500,000 characters. |
fill_ins | array of objects | No | Labels for fill-ins in the text. Without one, a fill-in takes its first written label, or one made from its key. Up to 200 items. |
fill_ins[].key | string | Yes | Matches ^[a-z][a-z0-9_]{0,39}$. |
fill_ins[].label | string | Yes | 1–100 characters. |
roles | array of string | No | Who signs, by role. A listed role with no field in the text gets a Signature, Name and Date block at the end. By default, the roles of the text's fields. 1–20 items. |
library_entry | string | No | A library entry to copy instead of writing content, by slug: mutual-nda, consulting-agreement, service-agreement, client-proposal, founder-agreement, offer-letter, business-acknowledgment, master-services-agreement, w9-request, vendor-information-form, property-agreement, commission-agreement, consent-form, activity-waiver, approval-form, event-registration, internal-acknowledgment. 1–100 characters. |
idempotency_key | string | No | Retrying with the same key returns the first result instead of doing it again. Matches ^[A-Za-z0-9_-]{8,100}$. |
Annotations readOnlyHint: false · destructiveHint: false · openWorldHint: false
Same as POST /templates
Input schema
json
{
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "The template's name: needed with content, and a library entry's own name by default."
},
"content": {
"type": "string",
"maxLength": 500000,
"description": "The template's text, in blocks separated by a blank line: # Heading (## and ### for smaller ones), a list whose every line starts with \"- \" or \"1. \", --- for a rule, and anything else a paragraph. Inside text: `**bold**` for bold; {{key}} or {{key|Label}} for a fill-in completed for each document (key: lowercase letters, numbers and _, starting with a letter); [[type:role]] for a signing field and [[type:role?]] for an optional one, either with |Label to name it (type: signature, initials, date_signed, text, checkbox, full_name; role: lowercase letters, numbers and -)."
},
"fill_ins": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string",
"pattern": "^[a-z][a-z0-9_]{0,39}$"
},
"label": {
"type": "string",
"minLength": 1,
"maxLength": 100
}
},
"required": [
"key",
"label"
],
"additionalProperties": false
},
"maxItems": 200,
"description": "Labels for fill-ins in the text. Without one, a fill-in takes its first written label, or one made from its key."
},
"roles": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{0,39}$"
},
"minItems": 1,
"maxItems": 20,
"description": "Who signs, by role. A listed role with no field in the text gets a Signature, Name and Date block at the end. By default, the roles of the text's fields."
},
"library_entry": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "A library entry to copy instead of writing content, by slug: mutual-nda, consulting-agreement, service-agreement, client-proposal, founder-agreement, offer-letter, business-acknowledgment, master-services-agreement, w9-request, vendor-information-form, property-agreement, commission-agreement, consent-form, activity-waiver, approval-form, event-registration, internal-acknowledgment."
},
"idempotency_key": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{8,100}$",
"description": "Retrying with the same key returns the first result instead of doing it again."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}start_document
Write permission: documents
Start a document. Starts a document from a template, with fill-in values or answers to its questions.
| Input | Type | Required | Description |
|---|---|---|---|
template_id | string (uuid) | Yes | — |
title | string | No | 1–255 characters. |
merge_values | object of string | No | — |
answers | object of any | No | — |
idempotency_key | string | No | Retrying with the same key returns the first result instead of doing it again. Matches ^[A-Za-z0-9_-]{8,100}$. |
Annotations readOnlyHint: false · destructiveHint: false · openWorldHint: false
Same as POST /documents
Input schema
json
{
"type": "object",
"properties": {
"template_id": {
"type": "string",
"format": "uuid"
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 255
},
"merge_values": {
"type": "object",
"additionalProperties": {
"type": "string",
"maxLength": 2000
}
},
"answers": {
"type": "object",
"additionalProperties": {
"anyOf": [
{
"type": "string",
"maxLength": 5000
},
{
"type": "number"
},
{
"type": "boolean"
}
]
},
"propertyNames": {
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$"
}
},
"idempotency_key": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{8,100}$",
"description": "Retrying with the same key returns the first result instead of doing it again."
}
},
"required": [
"template_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Sending
With the send permission. Anything that would email someone waits for an owner or admin of the workspace to approve it.
create_signing_request
Sensitive write permission: send needs approval
Create a signing request. Creates a signing request for documents and recipients. With send: true it asks the workspace to approve sending it; nothing is emailed until an owner or admin approves.
| Input | Type | Required | Description |
|---|---|---|---|
title | string | No | 1–255 characters. |
message | string | No | Up to 2,000 characters. |
routing | sequential or parallel | No | Default sequential. |
expires_in_days | integer | No | 1–365. Default 30. |
documents | array of objects | Yes | 1–10 items. |
documents[].document_id | string (uuid) | Yes | — |
documents[].draft_revision | integer | No | At least 1. |
recipients | array of objects | Yes | 1–20 items. |
recipients[].role_key | string | Yes | Matches ^[a-z0-9][a-z0-9-]{0,39}$. |
recipients[].name | string | Yes | 1–200 characters. |
recipients[].email | string (email) | Yes | Up to 255 characters. |
recipients[].routing_order | integer | No | 1–20. |
send | boolean | No | Default false. |
idempotency_key | string | No | Retrying with the same key returns the first result instead of doing it again. Matches ^[A-Za-z0-9_-]{8,100}$. |
Annotations readOnlyHint: false · destructiveHint: true · openWorldHint: true
Same as POST /signing-requests
Input schema
json
{
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 1,
"maxLength": 255
},
"message": {
"type": "string",
"maxLength": 2000
},
"routing": {
"type": "string",
"enum": [
"sequential",
"parallel"
],
"default": "sequential"
},
"expires_in_days": {
"type": "integer",
"minimum": 1,
"maximum": 365,
"default": 30
},
"documents": {
"type": "array",
"items": {
"type": "object",
"properties": {
"document_id": {
"type": "string",
"format": "uuid"
},
"draft_revision": {
"type": "integer",
"exclusiveMinimum": 0
}
},
"required": [
"document_id"
],
"additionalProperties": false
},
"minItems": 1,
"maxItems": 10
},
"recipients": {
"type": "array",
"items": {
"type": "object",
"properties": {
"role_key": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{0,39}$"
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"email": {
"type": "string",
"format": "email",
"maxLength": 255
},
"routing_order": {
"type": "integer",
"minimum": 1,
"maximum": 20
}
},
"required": [
"role_key",
"name",
"email"
],
"additionalProperties": false
},
"minItems": 1,
"maxItems": 20
},
"send": {
"type": "boolean",
"default": false
},
"idempotency_key": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{8,100}$",
"description": "Retrying with the same key returns the first result instead of doing it again."
}
},
"required": [
"documents",
"recipients"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}send_signing_request
Sensitive write permission: send needs approval
Ask to send a signing request. Asks the workspace to approve sending a draft signing request. Nothing is emailed until an owner or admin approves.
| Input | Type | Required | Description |
|---|---|---|---|
signing_request_id | string (uuid) | Yes | The signing request's id. |
idempotency_key | string | No | Retrying with the same key returns the first result instead of doing it again. Matches ^[A-Za-z0-9_-]{8,100}$. |
Annotations readOnlyHint: false · destructiveHint: true · openWorldHint: true
Same as POST /signing-requests/{id}/send
Input schema
json
{
"type": "object",
"properties": {
"signing_request_id": {
"type": "string",
"format": "uuid",
"description": "The signing request's id"
},
"idempotency_key": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{8,100}$",
"description": "Retrying with the same key returns the first result instead of doing it again."
}
},
"required": [
"signing_request_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}void_signing_request
Sensitive write permission: send
Void a signing request. Cancels a sent signing request that hasn't been completed. It takes effect at once, without approval, and recipients who were invited are told.
| Input | Type | Required | Description |
|---|---|---|---|
signing_request_id | string (uuid) | Yes | The signing request's id. |
reason | string | No | Up to 500 characters. |
Annotations readOnlyHint: false · destructiveHint: true · idempotentHint: true · openWorldHint: true
Same as POST /signing-requests/{id}/void
Input schema
json
{
"type": "object",
"properties": {
"signing_request_id": {
"type": "string",
"format": "uuid",
"description": "The signing request's id"
},
"reason": {
"type": "string",
"maxLength": 500
}
},
"required": [
"signing_request_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}create_intake_request
Sensitive write permission: send needs approval
Ask someone to fill in documents. Asks the workspace to approve emailing someone a form whose answers fill the documents' blanks. Nothing is created or emailed until an owner or admin approves.
| Input | Type | Required | Description |
|---|---|---|---|
title | string | No | 1–255 characters. |
message | string | No | Up to 2,000 characters. |
documents | array of objects | Yes | 1–10 items. |
documents[].document_id | string (uuid) | Yes | — |
documents[].draft_revision | integer | Yes | At least 1. |
respondent | object | Yes | — |
respondent.name | string | Yes | 1–200 characters. |
respondent.email | string (email) | Yes | Up to 255 characters. |
expires_in_days | integer | No | 1–60. Default 14. |
after | review or sign | No | Default review. |
signing | object | No | — |
signing.respondent_role | string | Yes | Matches ^[a-z0-9][a-z0-9-]{0,39}$. |
signing.recipients | array of objects | No | Up to 19 items. Default []. |
signing.recipients[].role_key | string | Yes | Matches ^[a-z0-9][a-z0-9-]{0,39}$. |
signing.recipients[].name | string | Yes | 1–200 characters. |
signing.recipients[].email | string (email) | Yes | Up to 255 characters. |
signing.routing | sequential or parallel | No | Default sequential. |
signing.expires_in_days | integer | No | 1–365. Default 30. |
idempotency_key | string | No | Retrying with the same key returns the first result instead of doing it again. Matches ^[A-Za-z0-9_-]{8,100}$. |
Annotations readOnlyHint: false · destructiveHint: true · openWorldHint: true
Same as POST /intake-requests
Input schema
json
{
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 1,
"maxLength": 255
},
"message": {
"type": "string",
"maxLength": 2000
},
"documents": {
"type": "array",
"items": {
"type": "object",
"properties": {
"document_id": {
"type": "string",
"format": "uuid"
},
"draft_revision": {
"type": "integer",
"exclusiveMinimum": 0
}
},
"required": [
"document_id",
"draft_revision"
],
"additionalProperties": false
},
"minItems": 1,
"maxItems": 10
},
"respondent": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"email": {
"type": "string",
"format": "email",
"maxLength": 255
}
},
"required": [
"name",
"email"
],
"additionalProperties": false
},
"expires_in_days": {
"type": "integer",
"minimum": 1,
"maximum": 60,
"default": 14
},
"after": {
"type": "string",
"enum": [
"review",
"sign"
],
"default": "review"
},
"signing": {
"type": "object",
"properties": {
"respondent_role": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{0,39}$"
},
"recipients": {
"type": "array",
"items": {
"type": "object",
"properties": {
"role_key": {
"$ref": "#/properties/signing/properties/respondent_role"
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"email": {
"type": "string",
"format": "email",
"maxLength": 255
}
},
"required": [
"role_key",
"name",
"email"
],
"additionalProperties": false
},
"maxItems": 19,
"default": []
},
"routing": {
"type": "string",
"enum": [
"sequential",
"parallel"
],
"default": "sequential"
},
"expires_in_days": {
"type": "integer",
"minimum": 1,
"maximum": 365,
"default": 30
}
},
"required": [
"respondent_role"
],
"additionalProperties": false
},
"idempotency_key": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{8,100}$",
"description": "Retrying with the same key returns the first result instead of doing it again."
}
},
"required": [
"documents",
"respondent"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}