Skip to main content
Glama

convert_safe

Destructive

Converts a SAFE holder into preferred at the next priced round. Computes effectivePrice = min(price × (1-discount), cap / preMoneyShares) and sharesIssued = invested / effectivePrice. PURE by default: does not modify the schema. Pass persist=true to update the holder (securityType→preferred, shares ← sharesIssued). Pass roundId to attach the conversion to a round (set as securityRound, as the SAFE conversion built into simulate_round already does) — without it, the converted holder is counted forever in the pre-money base of every later round.

Input Schema

NameRequiredDescriptionDefault
safeIdYesID of the SAFE-type holder to convert.
persistNoIf true (default false), updates the SAFE holder: securityType→preferred and shares ← sharesIssued (+ securityRound ← roundId if provided). Otherwise: pure simulation.
roundIdNoID of the round to attach this conversion to — set as-is as kindMetadata.securityRound of the converted holder if persist=true, exactly what the automatic SAFE conversion built into simulate_round already does. OMITTED: the converted holder carries NO securityRound, and is then counted as part of the 'pre-money' base of EVERY later round (whatever the actual date of the conversion) — fill it in as soon as the round this conversion belongs to exists (or will exist) as a captable block.
expectedProjectIdNoUUID of the project targeted by THIS call. ACTUALLY targets this project instead of the session project. Refused without changing anything if access is not granted.
nextRoundPricePerShareYesPricePerShare of the next priced round (in the current currency).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedInput schema / properties / expectedProjectId / description
      Previous value: -"UUID du projet visé par CET appel. Cible RÉELLEMENT ce projet au lieu du projet de session. Refusé sans rien modifier si l'accès n'est pas accordé."New value: +"UUID of the project targeted by THIS call. ACTUALLY targets this project instead of the session project. Refused without changing anything if access is not granted."
    • changedInput schema / properties / nextRoundPricePerShare / description
      Previous value: -"PricePerShare du prochain priced round (en monnaie courante)."New value: +"PricePerShare of the next priced round (in the current currency)."
    • changedInput schema / properties / persist / description
      Previous value: -"Si true (défaut false), met à jour le holder SAFE: securityType→preferred et shares ← sharesIssued (+ securityRound ← roundId si fourni). Sinon: simulation pure."New value: +"If true (default false), updates the SAFE holder: securityType→preferred and shares ← sharesIssued (+ securityRound ← roundId if provided). Otherwise: pure simulation."
    • changedInput schema / properties / roundId / description
      Previous value: -"ID du round auquel rattacher cette conversion — posé tel quel comme kindMetadata.securityRound du holder converti si persist=true, exactement ce que fait déjà la conversion automatique d'un SAFE intégrée à simulate_round. OMIS: le holder converti ne porte AUCUN securityRound, et sera alors compté comme faisant partie de la base 'pré-money' de TOUT round ultérieur (quelle que soit la date réelle de la conversion) — il se renseigne dès que le round auquel cette conversion se rattache existe (ou existera) comme cellule captable."New value: +"ID of the round to attach this conversion to — set as-is as kindMetadata.securityRound of the converted holder if persist=true, exactly what the automatic SAFE conversion built into simulate_round already does. OMITTED: the converted holder carries NO securityRound, and is then counted as part of the 'pre-money' base of EVERY later round (whatever the actual date of the conversion) — fill it in as soon as the round this conversion belongs to exists (or will exist) as a captable block."
    • changedInput schema / properties / safeId / description
      Previous value: -"ID du holder de type SAFE à convertir."New value: +"ID of the SAFE-type holder to convert."
  2. Changed1 schema field changed
    • changedInput schema / properties / roundId / description
      Previous value: -"ID du round auquel rattacher cette conversion — posé tel quel comme kindMetadata.securityRound du holder converti si persist=true, exactement ce que fait déjà la conversion automatique d'un SAFE intégrée à simulate_round. OMIS: le holder converti ne porte AUCUN securityRound, et sera alors compté comme faisant partie de la base 'pré-money' de TOUT round ultérieur (quelle que soit la date réelle de la conversion) — fournis-le dès que le round auquel cette conversion se rattache existe (ou existera) comme cellule captable."New value: +"ID du round auquel rattacher cette conversion — posé tel quel comme kindMetadata.securityRound du holder converti si persist=true, exactement ce que fait déjà la conversion automatique d'un SAFE intégrée à simulate_round. OMIS: le holder converti ne porte AUCUN securityRound, et sera alors compté comme faisant partie de la base 'pré-money' de TOUT round ultérieur (quelle que soit la date réelle de la conversion) — il se renseigne dès que le round auquel cette conversion se rattache existe (ou existera) comme cellule captable."
  3. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only say readOnlyHint=false and destructiveHint=true; the description goes far beyond by disclosing that the call is pure by default, exactly which fields get mutated when persist=true (securityType→preferred, shares, securityRound), and the non-obvious downstream consequence of omitting roundId — the holder is counted forever in every later round's pre-money base.

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 with the operation and formula, then the default/mutation contract, then the roundId pitfall — a logical order. It is dense with nested parentheticals and dashes, but every sentence carries information an agent needs.

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?

No output schema exists, and the description compensates by naming the computed outputs (effectivePrice, sharesIssued) and the resulting holder state. For a five-parameter mutation tool with rich annotations, nothing an agent needs to call it correctly appears to be missing.

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 already 100%, so baseline is 3; the description adds value by explaining the computation that consumes safeId and nextRoundPricePerShare (effectivePrice = min(price × (1-discount), cap / preMoneyShares)) and by reinforcing why roundId matters. It stops short of describing expectedProjectId's session-project fallback in the prose, leaving that to the schema.

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 ('Converts a SAFE holder into preferred at the next priced round') and immediately gives the exact formulas used, so an agent knows precisely what the call computes. It also distinguishes itself from simulate_round by noting that the same conversion is built into round simulation.

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

Usage Guidelines4/5

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

Clearly states the default (pure simulation, no schema change) and the two conditions that change behavior (persist=true to mutate, roundId to attach to a round), plus expectedProjectId's access-check semantics. It references simulate_round's built-in conversion as the equivalent path but doesn't explicitly say when to prefer one over the other.

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.