Skip to main content
Glama

Send a document for signature

send_for_signature
Destructive

Get a document signed by one person, or by up to five people in a set order (signers), and optionally by the user first. When only the user signs, pass sender_signs: true and leave out signer and signers. Give the document as markdown text you wrote (use {{signature:signer}} where the signature goes, or leave it out and Portant adds a signature block), a PDF (upload_id from get_upload_url for a PDF file, including one you made with a file skill; pdf_url; or pdf_base64 for a small PDF), or a Google Doc link shared with "anyone with the link". Portant emails the signer a private link; the signer signs in their browser. This tool never signs for anyone. When the user wants to check the document or sign it first, call this tool at once with review: true or sender_signs: true, not after showing the document as text: Portant shows the finished PDF on a card, and nothing reaches the signer until the user clicks Send or signs. Before a send without review or sender_signs, confirm each signer's name and email, and the signing order, with the user. With signers, Portant emails each person after the one before has signed, and everyone gets the signed PDF by email at the end. Returns request_id, request_token (keep it to download the signed PDF or send a reminder) and next_step (tell it to the user). With review: true, nothing goes to the signer until the user opens review_link, checks the document and clicks Send. Limits: five signers, PDFs up to 5 MB and 50 pages, links expire after 14 days. Simple electronic signature.

Input Schema

NameRequiredDescriptionDefault
titleNoThe document title. Required with markdown; it is the heading and the email subject.
fieldsNoOnly for PDF or Google Doc input, when you know where the fields go. Positions are fractions of the page from the top-left corner. Without fields, Portant looks for where the PDF asks for signatures (a signature form field, "Signature: ____", or a line over the word Signature) and puts the boxes there when it can tell whose line is whose; otherwise it adds a signature page. So leave fields out unless the user gives the places.
reviewNoTrue to let the user see the finished document before anything goes to the signer. You get review_link for the user, and Portant also emails it to them. Use it when the user wants to check the document first, for example a document you wrote. Not needed when sender_signs is true (the user sees the document when signing) or when Portant is connected without sign-in (Portant then asks the user to confirm by email).
senderNoThe user who is sending. Required only when Portant is connected without sign-in; Portant then emails the user to confirm before anything reaches the signer.
signerNoThe person who signs. Give signer or signers, not both. Leave both out when only the user signs (sender_signs: true).
messageNoA short plain-text note to the signer, up to 500 characters. Links are removed.
signersNoTwo to five people who sign one after another, in this order. Use it instead of signer only when the user names more than one signer.
deliveryNoemail (default): Portant emails the signer. link: no email; you get the signing link to share.
documentYesExactly one of these, except that template_id can come with values and markdown.
languageNoLanguage of the emails and the signing page. Default en.
certificateNoAppend a signing certificate page. Default true.
sender_signsNoTrue when the user signs too. The user signs first, then the signer. With no signer and no signers, only the user signs: the user signs on the card or at sender_link, the request is then complete, and Portant emails the user the signed PDF. That needs Portant connected with sign-in.
template_nameNoA short name for the saved template, with no signer name in it, for example "Mutual NDA". A later send from the template uses it as the title. Default: the title.
signature_pageNoPDF or Google Doc input with no fields: true to skip looking for signature lines in the document and add Portant's signature page instead. Use it only when the user asks for a separate signature page.
save_as_templateNoTrue to also save this document as a template the user can send again from any chat. Use it only when the user asks to send the document now and also keep it. To save a template without sending anything, use save_template instead. Portant saves it before any names go in. A Google Doc is saved as its link, so each later send uses the Doc as it is then.
allow_placeholdersNoPortant refuses markdown that still has text to fill in, such as [Plan name] or {{var:Plan}}. Pass true only when the user confirms the square brackets are meant to be in the document.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / sender_signs / description
      Previous value: -"True when the user signs too. The user signs first, then the signer."New value: +"True when the user signs too. The user signs first, then the signer. With no signer and no signers, only the user signs: the user signs on the card or at sender_link, the request is then complete, and Portant emails the user the signed PDF. That needs Portant connected with sign-in."
    • changedInput schema / properties / signer / description
      Previous value: -"The person who signs. Give signer or signers, not both."New value: +"The person who signs. Give signer or signers, not both. Leave both out when only the user signs (sender_signs: true)."
  2. Changed2 schema fields changed
    • changedInput schema / properties / document / properties / markdown / description
      Previous value: -"The document as markdown. Put {{signature:signer}}, {{date:signer}}, {{text:signer:Label}}, {{signature:sender}} or {{date:sender}} where each field goes, or leave them out and Portant adds a signature block at the end. With several signers, signer is the first and signer2 to signer5 the next ones, for example {{signature:signer2}}. With template_id: the template text after you changed it for this send (get it with get_template, put the values in, change only what the user asked for); the request then waits for the user to review the changes. Text still to fill in, such as [Plan name] or {{var:Plan}}, is refused."New value: +"The document as markdown. Put {{signature:signer}}, {{name:signer}}, {{date:signer}}, {{text:signer:Label}}, {{signature:sender}}, {{name:sender}} or {{date:sender}} where each field goes, or leave them out and Portant adds a signature block at the end. When you place the fields yourself, give each person a {{name:...}} beside their signature: Portant fills it with the full name the person types when they sign, as it fills the date, so do not add a text field for the name. With several signers, signer is the first and signer2 to signer5 the next ones, for example {{signature:signer2}}. With template_id: the template text after you changed it for this send (get it with get_template, put the values in, change only what the user asked for); the request then waits for the user to review the changes. Text still to fill in, such as [Plan name] or {{var:Plan}}, is refused."
    • changedInput schema / properties / fields / items / properties / kind / enum
      Previous value: -[
      -  "signature",
      -  "date",
      -  "text"
      -]New value: +[
      +  "signature",
      +  "date",
      +  "text",
      +  "name"
      +]
  3. Changed3 schema fields changed
    • changedInput schema / properties / document / properties / values / description
      Previous value: -"With template_id: a value for each named field of the template ({{var:Name}} in its text; get_template lists them in named_fields), for example {\"Plan\": \"Team\", \"Deal amount\": \"$12,000\"}. Names match without regard to case, spaces or underscores. Each value is put in as plain text."New value: +"With template_id: a value for each named field of the template ({{var:Name}} or [Name] in its text; get_template lists them in named_fields), for example {\"Plan\": \"Team\", \"Deal amount\": \"$12,000\"}. Names match without regard to case, spaces or underscores. Each value is put in as plain text."
    • changedInput schema / properties / fields / description
      Previous value: -"Only for PDF or Google Doc input, when you know where the fields go. Positions are fractions of the page from the top-left corner."New value: +"Only for PDF or Google Doc input, when you know where the fields go. Positions are fractions of the page from the top-left corner. Without fields, Portant looks for where the PDF asks for signatures (a signature form field, \"Signature: ____\", or a line over the word Signature) and puts the boxes there when it can tell whose line is whose; otherwise it adds a signature page. So leave fields out unless the user gives the places."
    • addedInput schema / properties / signature_page
      Added value: +{
      +  "description": "PDF or Google Doc input with no fields: true to skip looking for signature lines in the document and add Portant's signature page instead. Use it only when the user asks for a separate signature page.",
      +  "type": "boolean"
      +}
  4. Changed1 schema field changed
    • changedInput schema / properties / document / properties / pdf_base64 / description
      Previous value: -"A PDF as base64. Prefer upload_id or pdf_url for files over 1 MB."New value: +"A small PDF as base64. For a PDF file, including one you made with a file skill, or any PDF over 1 MB, use upload_id (get_upload_url) or pdf_url."
  5. Changed5 schema fields changed
    • addedInput schema / properties / allow_placeholders
      Added value: +{
      +  "description": "Portant refuses markdown that still has text to fill in, such as [Plan name] or {{var:Plan}}. Pass true only when the user confirms the square brackets are meant to be in the document.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / document / description
      Previous value: -"Exactly one of these."New value: +"Exactly one of these, except that template_id can come with values and markdown."
    • changedInput schema / properties / document / properties / markdown / description
      Previous value: -"The document as markdown. Put {{signature:signer}}, {{date:signer}}, {{text:signer:Label}}, {{signature:sender}} or {{date:sender}} where each field goes, or leave them out and Portant adds a signature block at the end. With several signers, signer is the first and signer2 to signer5 the next ones, for example {{signature:signer2}}."New value: +"The document as markdown. Put {{signature:signer}}, {{date:signer}}, {{text:signer:Label}}, {{signature:sender}} or {{date:sender}} where each field goes, or leave them out and Portant adds a signature block at the end. With several signers, signer is the first and signer2 to signer5 the next ones, for example {{signature:signer2}}. With template_id: the template text after you changed it for this send (get it with get_template, put the values in, change only what the user asked for); the request then waits for the user to review the changes. Text still to fill in, such as [Plan name] or {{var:Plan}}, is refused."
    • addedInput schema / properties / document / properties / values
      Added value: +{
      +  "additionalProperties": {
      +    "type": "string"
      +  },
      +  "description": "With template_id: a value for each named field of the template ({{var:Name}} in its text; get_template lists them in named_fields), for example {\"Plan\": \"Team\", \"Deal amount\": \"$12,000\"}. Names match without regard to case, spaces or underscores. Each value is put in as plain text.",
      +  "type": "object"
      +}
    • changedInput schema / properties / save_as_template / description
      Previous value: -"True to also save this document as a template the user can send again from any chat. Use it only when the user asks to save or reuse the document. Portant saves it before any names go in. A Google Doc is saved as its link, so each later send uses the Doc as it is then."New value: +"True to also save this document as a template the user can send again from any chat. Use it only when the user asks to send the document now and also keep it. To save a template without sending anything, use save_template instead. Portant saves it before any names go in. A Google Doc is saved as its link, so each later send uses the Doc as it is then."
  6. Changed10 schema fields changed
    • changedInput schema / properties / document / properties / markdown / description
      Previous value: -"The document as markdown. Put {{signature:signer}}, {{date:signer}}, {{text:signer:Label}}, {{signature:sender}} or {{date:sender}} where each field goes, or leave them out and Portant adds a signature block at the end."New value: +"The document as markdown. Put {{signature:signer}}, {{date:signer}}, {{text:signer:Label}}, {{signature:sender}} or {{date:sender}} where each field goes, or leave them out and Portant adds a signature block at the end. With several signers, signer is the first and signer2 to signer5 the next ones, for example {{signature:signer2}}."
    • addedInput schema / properties / document / properties / template_id
      Added value: +{
      +  "description": "A saved template, from list_templates. Portant adds the new signer's name to its signature block.",
      +  "type": "string"
      +}
    • addedInput schema / properties / fields / items / properties / party / description
      Added value: +"Default signer, the first signer. signer2 to signer5 are the next signers in signers."
    • changedInput schema / properties / fields / items / properties / party / enum
      Previous value: -[
      -  "signer",
      -  "sender"
      -]New value: +[
      +  "signer",
      +  "signer2",
      +  "signer3",
      +  "signer4",
      +  "signer5",
      +  "sender"
      +]
    • addedInput schema / properties / review
      Added value: +{
      +  "description": "True to let the user see the finished document before anything goes to the signer. You get review_link for the user, and Portant also emails it to them. Use it when the user wants to check the document first, for example a document you wrote. Not needed when sender_signs is true (the user sees the document when signing) or when Portant is connected without sign-in (Portant then asks the user to confirm by email).",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / save_as_template
      Added value: +{
      +  "description": "True to also save this document as a template the user can send again from any chat. Use it only when the user asks to save or reuse the document. Portant saves it before any names go in. A Google Doc is saved as its link, so each later send uses the Doc as it is then.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / signer / description
      Added value: +"The person who signs. Give signer or signers, not both."
    • addedInput schema / properties / signers
      Added value: +{
      +  "description": "Two to five people who sign one after another, in this order. Use it instead of signer only when the user names more than one signer.",
      +  "items": {
      +    "properties": {
      +      "email": {
      +        "description": "The signer's email address.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "The signer's full name.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "email"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 5,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / template_name
      Added value: +{
      +  "description": "A short name for the saved template, with no signer name in it, for example \"Mutual NDA\". A later send from the template uses it as the title. Default: the title.",
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "document",
      -  "signer"
      -]New value: +[
      +  "document"
      +]
  7. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations flag the mutation and open-world nature (destructiveHint true, openWorldHint true), but the description adds substantial behavior: Portant emails the signer a private link, nothing reaches the signer until Send is clicked, sequential signer emails, final signed PDF to everyone, request_id/request_token/next_step return values, and explicit limits (five signers, 5 MB, 50 pages, 14-day expiry). It also states the tool never signs for anyone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose and document input options are front-loaded, and nearly every sentence carries operational value (routing, limits, return values). It is dense and lacks paragraph breaks, making it harder to scan than an ideal definition, but there is little redundant wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 16-parameter, nested, destructive, open-world tool with no output schema, the description supplies what is missing: workflow ordering, confirmation requirements, limits, return fields, and edge cases like review vs. sender_signs vs. no sign-in. Nothing critical to calling it correctly appears absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it explains the three document input routes (markdown, PDF via upload_id/pdf_url/pdf_base64, Google Doc), how {{signature:signer}} placement works and that Portant adds a block by default, and the interplay between sender_signs, signer/signers, and review. It stops short of re-explaining every enum or nested field, which the schema already covers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — get a document signed — and immediately scopes it: one person, or up to five in set order, optionally with the sender signing first. It also names the sibling save_template as the alternative when the user wants to keep a template without sending, so an agent can distinguish it without opening other schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use review: true or sender_signs: true (when the user wants to check or sign first, call immediately, not after showing text), when not to (no review needed when sender_signs is true, or when Portant is connected without sign-in), and requires confirming signer names, emails, and order before a plain send. Alternatives and exclusions are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources