Skip to main content
Glama

Lovie Company Formation

Extract SAFE Terms

formation_extract_safe_terms

Reads a SAFE PDF and returns its terms WITHOUT saving anything. Always call this before ImportSAFE and show the result to the user for confirmation — never import a SAFE the user has not seen. Present one block per document, largest investment first, with exactly these fields in this order: investor name, investment amount, valuation cap, discount, post-money or pre-money, date, and which existing stakeholder it will be matched to (or that a new one will be created). Then state the effect on the cap table as three figures — stakeholders, SAFEs and SAFE capital now, what this import adds, and the totals after — and ask the user to confirm. Report the confidence score and every warning verbatim in plain language rather than as codes. Two things block the import until the user resolves them: a missing date (ask for it; a SAFE is never imported without one) and a company name on the document that differs from the company being imported into (say both names and ask the user to confirm it belongs here). This is the same review the web upload screen performs, so keep the wording and order identical.

Input Schema

NameRequiredDescriptionDefault
formationIdYesUUID value wrapper.
sourceS3UriNo

Output Schema

NameRequiredDescriptionDefault
warningsNo
safeTermsNo
companyNameNo
formationIdNo
sourceS3UriNo
investorNameNo
ocrConfidenceNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / safeTerms / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "discountPercentage": {
      -        "type": "string"
      -      },
      -      "investmentAmountCents": {
      -        "type": "string"
      -      },
      -      "postMoney": {
      -        "type": "boolean"
      -      },
      -      "safeIssueDate": {
      -        "anyOf": [
      -          {
      -            "format": "date-time",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "signedByName": {
      -        "type": "string"
      -      },
      -      "signedByTitle": {
      -        "type": "string"
      -      },
      -      "valuationCapCents": {
      -        "type": "string"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "discountPercentage": {
      +        "type": "string"
      +      },
      +      "investmentAmountCents": {
      +        "type": "string"
      +      },
      +      "postMoney": {
      +        "type": "boolean"
      +      },
      +      "postMoneyStated": {
      +        "type": "boolean"
      +      },
      +      "safeIssueDate": {
      +        "anyOf": [
      +          {
      +            "format": "date-time",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "signedByName": {
      +        "type": "string"
      +      },
      +      "signedByTitle": {
      +        "type": "string"
      +      },
      +      "valuationCapCents": {
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  2. Changed7 schema fields changed
    • addedOutput schema / properties / formationId / anyOf
      Added value: +[
      +  {
      +    "description": "UUID value wrapper.",
      +    "properties": {
      +      "value": {
      +        "format": "uuid",
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / formationId / description
      Removed value: -"UUID value wrapper."
    • removedOutput schema / properties / formationId / properties
      Removed value: -{
      -  "value": {
      -    "format": "uuid",
      -    "type": "string"
      -  }
      -}
    • removedOutput schema / properties / formationId / type
      Removed value: -"object"
    • addedOutput schema / properties / safeTerms / anyOf
      Added value: +[
      +  {
      +    "properties": {
      +      "discountPercentage": {
      +        "type": "string"
      +      },
      +      "investmentAmountCents": {
      +        "type": "string"
      +      },
      +      "postMoney": {
      +        "type": "boolean"
      +      },
      +      "safeIssueDate": {
      +        "anyOf": [
      +          {
      +            "format": "date-time",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "signedByName": {
      +        "type": "string"
      +      },
      +      "signedByTitle": {
      +        "type": "string"
      +      },
      +      "valuationCapCents": {
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / safeTerms / properties
      Removed value: -{
      -  "discountPercentage": {
      -    "type": "string"
      -  },
      -  "investmentAmountCents": {
      -    "type": "string"
      -  },
      -  "postMoney": {
      -    "type": "boolean"
      -  },
      -  "safeIssueDate": {
      -    "format": "date-time",
      -    "type": "string"
      -  },
      -  "signedByName": {
      -    "type": "string"
      -  },
      -  "signedByTitle": {
      -    "type": "string"
      -  },
      -  "valuationCapCents": {
      -    "type": "string"
      -  }
      -}
    • removedOutput schema / properties / safeTerms / type
      Removed value: -"object"
  3. First observed

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only supply openWorldHint=false and destructiveHint=false; the description goes well beyond that by confirming nothing is persisted, enumerating two hard import blockers (missing date, mismatched company name), and specifying that confidence scores and warnings must be surfaced verbatim in plain language. That is real behavioral context an agent cannot infer from structured fields.

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?

Front-loaded correctly: the no-write guarantee and the pre-import sequencing come first, before the presentation and blocking-condition details. It is long and prescriptive about output layout, but each block (field order, cap-table figures, blockers, web-parity note) maps to a distinct decision the agent must make, so little is pure padding.

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

Completeness4/5

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

An output schema exists, so return values need no explanation, and the description still covers workflow, confirmation, blockers and reporting obligations. The one residual gap is how the document reaches the tool, which matters for a two-parameter tool with an undocumented required formationId.

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

Parameters3/5

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

Schema coverage is 50% and neither parameter carries a description in the schema, so the description carries partial burden. 'Reads a SAFE PDF' loosely implies sourceS3Uri is the document location, but formationId and the relationship between the two inputs (is the PDF already attached to the formation, or supplied as a URI?) are never clarified. Baseline 3 is appropriate given the description only marginally compensates.

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 (reads a SAFE PDF, returns its terms) and immediately scopes it with 'WITHOUT saving anything', which cleanly separates it from the mutating sibling cap_table_import_safe. An agent can tell what this does and what it does not do without opening the schema.

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?

Gives explicit sequencing ('Always call this before ImportSAFE'), an explicit prohibition ('never import a SAFE the user has not seen'), and the human-confirmation requirement. It also names the alternative flow (the web upload screen) whose wording and order should be matched, so the agent knows both when to call it and what the surrounding workflow expects.

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.